diff --git a/filament/backend/src/metal/MetalExternalImage.h b/filament/backend/src/metal/MetalExternalImage.h index f5ad259999..618da6efcc 100644 --- a/filament/backend/src/metal/MetalExternalImage.h +++ b/filament/backend/src/metal/MetalExternalImage.h @@ -100,6 +100,7 @@ private: CVMetalTextureRef createTextureFromImage(CVPixelBufferRef image, MTLPixelFormat format, size_t plane); id createRgbTexture(size_t width, size_t height); + id createSwizzledTextureView(id texture) const; id createSwizzledTextureView(CVMetalTextureRef texture) const; void ensureComputePipelineState(); id encodeColorConversionPass(id inYPlane, id @@ -125,7 +126,7 @@ private: struct { TextureSwizzle r, g, b, a; - } swizzle; + } mSwizzle; }; } // namespace metal diff --git a/filament/backend/src/metal/MetalExternalImage.mm b/filament/backend/src/metal/MetalExternalImage.mm index 8f2ac737c1..8cb539bd71 100644 --- a/filament/backend/src/metal/MetalExternalImage.mm +++ b/filament/backend/src/metal/MetalExternalImage.mm @@ -72,7 +72,7 @@ ycbcrToRgb(texture2d inYTexture [[texture(0)]], )"; MetalExternalImage::MetalExternalImage(MetalContext& context, TextureSwizzle r, TextureSwizzle g, - TextureSwizzle b, TextureSwizzle a) noexcept : mContext(context), swizzle{r, g, b ,a} { } + TextureSwizzle b, TextureSwizzle a) noexcept : mContext(context), mSwizzle{r, g, b, a} { } bool MetalExternalImage::isValid() const noexcept { return mRgbTexture != nil || mImage != nullptr; @@ -113,13 +113,12 @@ void MetalExternalImage::set(CVPixelBufferRef image) noexcept { mHeight = CVPixelBufferGetHeightOfPlane(image, Y_PLANE); id rgbTexture = createRgbTexture(mWidth, mHeight); - id commandBuffer = encodeColorConversionPass( + id commandBuffer = encodeColorConversionPass( CVMetalTextureGetTexture(yPlane), CVMetalTextureGetTexture(cbcrPlane), rgbTexture); - mRgbTexture = createTextureViewWithSwizzle(rgbTexture, - getSwizzleChannels(swizzle.r, swizzle.g, swizzle.b, swizzle.a)); + mRgbTexture = createSwizzledTextureView(rgbTexture); [commandBuffer addCompletedHandler:^(id o) { CVBufferRelease(yPlane); @@ -230,24 +229,28 @@ id MetalExternalImage::createRgbTexture(size_t width, size_t height) return [mContext.device newTextureWithDescriptor:descriptor]; } -id MetalExternalImage::createSwizzledTextureView(CVMetalTextureRef ref) const { - id texture = CVMetalTextureGetTexture(ref); +id MetalExternalImage::createSwizzledTextureView(id texture) const { const bool isDefaultSwizzle = - swizzle.r == TextureSwizzle::CHANNEL_0 && - swizzle.g == TextureSwizzle::CHANNEL_1 && - swizzle.b == TextureSwizzle::CHANNEL_2 && - swizzle.a == TextureSwizzle::CHANNEL_3; + mSwizzle.r == TextureSwizzle::CHANNEL_0 && + mSwizzle.g == TextureSwizzle::CHANNEL_1 && + mSwizzle.b == TextureSwizzle::CHANNEL_2 && + mSwizzle.a == TextureSwizzle::CHANNEL_3; if (!isDefaultSwizzle && mContext.supportsTextureSwizzling) { // Even though we've already checked supportsTextureSwizzling, we still need to guard these // calls with @availability, otherwise the API usage will generate compiler warnings. if (@available(iOS 13, *)) { texture = createTextureViewWithSwizzle(texture, - getSwizzleChannels(swizzle.r, swizzle.g, swizzle.b, swizzle.a)); + getSwizzleChannels(mSwizzle.r, mSwizzle.g, mSwizzle.b, mSwizzle.a)); } } return texture; } +id MetalExternalImage::createSwizzledTextureView(CVMetalTextureRef ref) const { + id texture = CVMetalTextureGetTexture(ref); + return createSwizzledTextureView(texture); +} + void MetalExternalImage::ensureComputePipelineState() { if (mContext.externalImageComputePipelineState != nil) { return;