CVTextureCache.mm 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. #include "CVTextureCache.h"
  2. #include "DisplayManager.h"
  3. #include "UnityMetalSupport.h"
  4. #include <CoreVideo/CVMetalTextureCache.h>
  5. void* CreateCVTextureCache()
  6. {
  7. void* ret = 0;
  8. CVReturn err = 0;
  9. if (UnitySelectedRenderingAPI() == apiMetal)
  10. err = CVMetalTextureCacheCreate(kCFAllocatorDefault, 0, UnityGetMetalDevice(), 0, (CVMetalTextureCacheRef*)&ret);
  11. if (err)
  12. {
  13. ::printf("Error at CVMetalTextureCacheCreate: %d", err);
  14. ret = 0;
  15. }
  16. return ret;
  17. }
  18. void FlushCVTextureCache(void* cache)
  19. {
  20. if (UnitySelectedRenderingAPI() == apiMetal)
  21. CVMetalTextureCacheFlush((CVMetalTextureCacheRef)cache, 0);
  22. }
  23. void* CreateTextureFromCVTextureCache2(void* cache, void* image, size_t w, size_t h, uint64_t metalFormat)
  24. {
  25. void* texture = 0;
  26. CVReturn err = 0;
  27. if (UnitySelectedRenderingAPI() == apiMetal)
  28. {
  29. err = CVMetalTextureCacheCreateTextureFromImage(
  30. kCFAllocatorDefault, (CVMetalTextureCacheRef)cache, (CVImageBufferRef)image, 0,
  31. (MTLPixelFormat)metalFormat, w, h, 0, (CVMetalTextureRef*)&texture
  32. );
  33. }
  34. if (err)
  35. {
  36. ::printf("Error at CVMetalTextureCacheCreateTextureFromImage: %d\n", err);
  37. texture = 0;
  38. }
  39. return texture;
  40. }
  41. id<MTLTexture> GetMetalTextureFromCVTextureCache(void* texture)
  42. {
  43. assert(UnitySelectedRenderingAPI() == apiMetal);
  44. return CVMetalTextureGetTexture((CVMetalTextureRef)texture);
  45. }
  46. uintptr_t GetTextureFromCVTextureCache(void* texture)
  47. {
  48. if (UnitySelectedRenderingAPI() == apiMetal)
  49. return (uintptr_t)(__bridge void*)GetMetalTextureFromCVTextureCache(texture);
  50. return 0;
  51. }
  52. void* CreatePixelBufferForCVTextureCache2(size_t w, size_t h, uint32_t cvFormat)
  53. {
  54. CVPixelBufferRef pb = 0;
  55. NSDictionary* options = @{ (__bridge NSString*)kCVPixelBufferPixelFormatTypeKey: @(cvFormat),
  56. (__bridge NSString*)kCVPixelBufferWidthKey: @(w),
  57. (__bridge NSString*)kCVPixelBufferHeightKey: @(h),
  58. (__bridge NSString*)kCVPixelBufferMetalCompatibilityKey: @(YES),
  59. (__bridge NSString*)kCVPixelBufferIOSurfacePropertiesKey: @{}};
  60. CVPixelBufferCreate(kCFAllocatorDefault, w, h, cvFormat, (__bridge CFDictionaryRef)options, &pb);
  61. return pb;
  62. }
  63. void* CreateReadableRTFromCVTextureCache2(void* cache, size_t w, size_t h, uint32_t cvFormat, uint64_t metalFormat, void** pb)
  64. {
  65. *pb = CreatePixelBufferForCVTextureCache2(w, h, cvFormat);
  66. return CreateTextureFromCVTextureCache2(cache, *pb, w, h, metalFormat);
  67. }
  68. int IsCVTextureFlipped(void* texture)
  69. {
  70. if (UnitySelectedRenderingAPI() == apiMetal)
  71. return CVMetalTextureIsFlipped((CVMetalTextureRef)texture);
  72. return 0;
  73. }
  74. //
  75. // deprecated
  76. //
  77. void* CreatePixelBufferForCVTextureCache(size_t w, size_t h)
  78. {
  79. return CreatePixelBufferForCVTextureCache2(w, h, kCVPixelFormatType_32BGRA);
  80. }
  81. void* CreateReadableRTFromCVTextureCache(void* cache, size_t w, size_t h, void** pb)
  82. {
  83. *pb = CreatePixelBufferForCVTextureCache2(w, h, kCVPixelFormatType_32BGRA);
  84. return CreateBGRA32TextureFromCVTextureCache(cache, *pb, w, h);
  85. }
  86. void* CreateBGRA32TextureFromCVTextureCache(void* cache, void* image, size_t w, size_t h)
  87. {
  88. void* texture = 0;
  89. CVReturn err = 0;
  90. if (UnitySelectedRenderingAPI() == apiMetal)
  91. {
  92. err = CVMetalTextureCacheCreateTextureFromImage(
  93. kCFAllocatorDefault, (CVMetalTextureCacheRef)cache, (CVImageBufferRef)image, 0,
  94. (MTLPixelFormat)((UnityDisplaySurfaceMTL*)GetMainDisplaySurface())->colorFormat, w, h, 0, (CVMetalTextureRef*)&texture
  95. );
  96. }
  97. if (err)
  98. {
  99. ::printf("Error at CVMetalTextureCacheCreateTextureFromImage: %d\n", err);
  100. texture = 0;
  101. }
  102. return texture;
  103. }
  104. void* CreateHalfFloatTextureFromCVTextureCache(void* cache, void* image, size_t w, size_t h)
  105. {
  106. void* texture = 0;
  107. CVReturn err = 0;
  108. if (UnitySelectedRenderingAPI() == apiMetal)
  109. {
  110. err = CVMetalTextureCacheCreateTextureFromImage(
  111. kCFAllocatorDefault, (CVMetalTextureCacheRef)cache, (CVImageBufferRef)image, 0,
  112. MTLPixelFormatR16Float, w, h, 0, (CVMetalTextureRef*)&texture
  113. );
  114. }
  115. if (err)
  116. {
  117. ::printf("Error at CVMetalTextureCacheCreateTextureFromImage: %d\n", err);
  118. texture = 0;
  119. }
  120. return texture;
  121. }