diff --git a/renderdoc/driver/metal/metal_helpers_bridge.h b/renderdoc/driver/metal/metal_helpers_bridge.h index 2c73859c0..3818d17f0 100644 --- a/renderdoc/driver/metal/metal_helpers_bridge.h +++ b/renderdoc/driver/metal/metal_helpers_bridge.h @@ -29,4 +29,12 @@ namespace ObjC { void Get_defaultLibraryData(bytebuf &buffer); +MTL::Texture *Get_Texture(MTL::Drawable *drawable); +CA::MetalLayer *Get_Layer(MTL::Drawable *drawable); +void CALayer_GetSize(void *layerHandle, int &width, int &height); +void CAMetalLayer_Set_drawableSize(void *layerHandle, int w, int h); +void CAMetalLayer_Set_device(void *layerHandle, MTL::Device *device); +void CAMetalLayer_Set_framebufferOnly(void *layerHandle, bool enable); +void CAMetalLayer_Set_pixelFormat(void *layerHandle, MTL::PixelFormat format); +CA::MetalDrawable *CAMetalLayer_nextDrawable(void *layerHandle); }; diff --git a/renderdoc/driver/metal/metal_helpers_bridge.mm b/renderdoc/driver/metal/metal_helpers_bridge.mm index 2c46e6550..dd6b8620b 100644 --- a/renderdoc/driver/metal/metal_helpers_bridge.mm +++ b/renderdoc/driver/metal/metal_helpers_bridge.mm @@ -25,6 +25,7 @@ #include "metal_helpers_bridge.h" #import #import +#import void ObjC::Get_defaultLibraryData(bytebuf &buffer) { @@ -38,3 +39,69 @@ void ObjC::Get_defaultLibraryData(bytebuf &buffer) memcpy(buffer.data(), nsData.bytes, buffer.size()); dispatch_release(data); } + +MTL::Texture *ObjC::Get_Texture(MTL::Drawable *drawableHandle) +{ + id drawable = id(drawableHandle); + return (MTL::Texture *)drawable.texture; +} + +CA::MetalLayer *ObjC::Get_Layer(MTL::Drawable *drawableHandle) +{ + id drawable = id(drawableHandle); + return (CA::MetalLayer *)drawable.layer; +} + +void ObjC::CALayer_GetSize(void *layerHandle, int &width, int &height) +{ + CALayer *layer = (CALayer *)layerHandle; + RDCASSERT([layer isKindOfClass:[CALayer class]]); + + const CGFloat scaleFactor = layer.contentsScale; + width = layer.bounds.size.width * scaleFactor; + height = layer.bounds.size.height * scaleFactor; +} + +void ObjC::CAMetalLayer_Set_drawableSize(void *layerHandle, int w, int h) +{ + CAMetalLayer *metalLayer = (CAMetalLayer *)layerHandle; + RDCASSERT([metalLayer isKindOfClass:[CAMetalLayer class]]); + + CGSize cgSize; + cgSize.width = w; + cgSize.height = h; + metalLayer.drawableSize = cgSize; +} + +void ObjC::CAMetalLayer_Set_device(void *layerHandle, MTL::Device *device) +{ + CAMetalLayer *metalLayer = (CAMetalLayer *)layerHandle; + RDCASSERT([metalLayer isKindOfClass:[CAMetalLayer class]]); + + metalLayer.device = id(device); +} + +void ObjC::CAMetalLayer_Set_framebufferOnly(void *layerHandle, bool enable) +{ + CAMetalLayer *metalLayer = (CAMetalLayer *)layerHandle; + RDCASSERT([metalLayer isKindOfClass:[CAMetalLayer class]]); + + metalLayer.framebufferOnly = enable ? YES : NO; +} + +void ObjC::CAMetalLayer_Set_pixelFormat(void *layerHandle, MTL::PixelFormat format) +{ + CAMetalLayer *metalLayer = (CAMetalLayer *)layerHandle; + RDCASSERT([metalLayer isKindOfClass:[CAMetalLayer class]]); + + metalLayer.pixelFormat = (MTLPixelFormat)format; +} + +CA::MetalDrawable *ObjC::CAMetalLayer_nextDrawable(void *layerHandle) +{ + CAMetalLayer *metalLayer = (CAMetalLayer *)layerHandle; + RDCASSERT([metalLayer isKindOfClass:[CAMetalLayer class]]); + + CA::MetalDrawable *drawable = (__bridge CA::MetalDrawable *)[metalLayer nextDrawable]; + return drawable; +}