ObjC helpers MTL::Drawable, CALayer, CAMetalLayer

Get_Texture(MTL::Drawable *drawable);
Get_Layer(MTL::Drawable *drawable);
CALayer_GetSize(void *layerHandle, int &width, int &height);
CAMetalLayer_Set_drawableSize(void *layerHandle, int w, int h);
CAMetalLayer_Set_device(void *layerHandle, MTL::Device *device);
CAMetalLayer_Set_framebufferOnly(void *layerHandle, bool enable);
CAMetalLayer_Set_pixelFormat(void *layerHandle, MTL::PixelFormat format);
CA::MetalDrawable *CAMetalLayer_nextDrawable(void *layerHandle);
This commit is contained in:
Jake Turner
2022-06-20 18:24:25 +01:00
committed by Baldur Karlsson
parent 0499c2af96
commit 1f6b2abc12
2 changed files with 75 additions and 0 deletions
@@ -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);
};
@@ -25,6 +25,7 @@
#include "metal_helpers_bridge.h"
#import <AppKit/AppKit.h>
#import <Foundation/NSStream.h>
#import <QuartzCore/CAMetalLayer.h>
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<CAMetalDrawable> drawable = id<CAMetalDrawable>(drawableHandle);
return (MTL::Texture *)drawable.texture;
}
CA::MetalLayer *ObjC::Get_Layer(MTL::Drawable *drawableHandle)
{
id<CAMetalDrawable> drawable = id<CAMetalDrawable>(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<MTLDevice>(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;
}