From fb191067d7537be6eea7185f746267e63380ec2a Mon Sep 17 00:00:00 2001 From: Hugh Sanderson Date: Sun, 15 Sep 2024 22:39:03 +0800 Subject: [PATCH] Get metal backend working better on SDL3 --- project/ToolkitBuild.xml | 2 +- project/src/metal/MetalContext.mm | 41 +++++++++++++++++-------------- project/src/sdl2/SDL2Stage.cpp | 9 ++++--- samples/BunnyMark/Source/Main.hx | 6 ----- 4 files changed, 28 insertions(+), 30 deletions(-) diff --git a/project/ToolkitBuild.xml b/project/ToolkitBuild.xml index 6427386ca..9e8b81f1b 100644 --- a/project/ToolkitBuild.xml +++ b/project/ToolkitBuild.xml @@ -29,6 +29,7 @@ + @@ -274,7 +275,6 @@ - diff --git a/project/src/metal/MetalContext.mm b/project/src/metal/MetalContext.mm index 0f4190b3d..3e0f049f3 100644 --- a/project/src/metal/MetalContext.mm +++ b/project/src/metal/MetalContext.mm @@ -31,19 +31,6 @@ { -#ifdef NME_SDL3 -void *GetMetalLayerFromRenderer(SDL_Renderer *renderer) -{ - const CAMetalLayer *swapchain = (__bridge CAMetalLayer *)SDL_GetRenderMetalLayer(renderer); - return (void *)swapchain; -} -#elif defined(NME_SDL2) -void *GetMetalLayerFromRenderer(SDL_Renderer *renderer) -{ - const CAMetalLayer *swapchain = (__bridge CAMetalLayer *)SDL_RenderGetMetalLayer(renderer); - return (void *)swapchain; -} -#endif static const double one_on_256 = 1.0/256.0; @@ -498,7 +485,6 @@ void Dirty(const Rect &inRect) shader += shaderTail; - // printf("SHADER: %x whole=%d\n%s\n\n",progId, wholeTexture, shader.c_str() ); __autoreleasing NSError *error = nil; @@ -506,6 +492,7 @@ void Dirty(const Rect &inRect) id lib = [device newLibraryWithSource:librarySrc options:nil error:&error]; if(!lib) { + printf("Shader compile failed: %x whole=%d\n%s\n\n",progId, wholeTexture, shader.c_str() ); [NSException raise:@"Failed to compile shaders" format:@"%@", [error localizedDescription]]; } @@ -677,13 +664,16 @@ void bindUniforms(id renderEncoder) }; - +static size_t totalBuffer = 0; struct MetalBuffer { id buffer; + int size; MetalBuffer(id device, const void *pointer, NSUInteger length) { + size = (int)length; + totalBuffer += length; buffer = [device newBufferWithBytes:pointer length:(NSUInteger)length options:MTLResourceCPUCacheModeWriteCombined ]; @@ -691,7 +681,12 @@ void bindUniforms(id renderEncoder) ~MetalBuffer() { + #ifndef OBJC_ARC + [buffer release]; + #endif + buffer = nil; + totalBuffer -= size; } }; @@ -740,7 +735,7 @@ void bindUniforms(id renderEncoder) public: - MetalContext(void *inCAMetalLayer) : + MetalContext(CAMetalLayer *inCAMetalLayer) : swapchain(0), _device(nil), queue(nil), @@ -749,7 +744,7 @@ void bindUniforms(id renderEncoder) surface(nullptr) { frame = 0; - swapchain = (__bridge CAMetalLayer *)inCAMetalLayer; + swapchain = inCAMetalLayer; _device = swapchain.device; queue = [_device newCommandQueue]; width = height = 0; @@ -977,9 +972,17 @@ void EndDirectRender() { } }; -HardwareRenderer *HardwareRenderer::CreateMetal(void *inLayer) +HardwareRenderer *HardwareRenderer::CreateMetal(void *inRenderer) { - HardwareRenderer *ctx = new MetalContext(inLayer); + SDL_Renderer *renderer = (SDL_Renderer *)renderer; + + #ifdef NME_SDL3 + CAMetalLayer *metalLayer = (__bridge CAMetalLayer *)SDL_GetRenderMetalLayer(renderer); + #elif defined(NME_SDL2) + CAMetalLayer *metalLayer = (__bridge CAMetalLayer *)SDL_RenderGetMetalLayer(renderer); + #endif + + HardwareRenderer *ctx = new MetalContext( metalLayer ); return ctx; } diff --git a/project/src/sdl2/SDL2Stage.cpp b/project/src/sdl2/SDL2Stage.cpp index b995597d7..ec177157f 100644 --- a/project/src/sdl2/SDL2Stage.cpp +++ b/project/src/sdl2/SDL2Stage.cpp @@ -89,6 +89,9 @@ int InitSDL() SDL_SetHint(SDL_HINT_RENDER_DRIVER, "metal"); else SDL_SetHint(SDL_HINT_RENDER_DRIVER, "opengl"); + #ifdef NME_SDL3 + SDL_SetHint(SDL_HINT_RENDER_METAL_PREFER_LOW_POWER_DEVICE, "0"); + #endif #endif #ifdef NME_DYNAMIC_ANGLE @@ -419,16 +422,14 @@ class SDLStage : public Stage } else { - void *swapchain = GetMetalLayerFromRenderer(mSDLRenderer); - mHardwareRenderer = HardwareRenderer::CreateMetal(swapchain); + mHardwareRenderer = HardwareRenderer::CreateMetal(mSDLRenderer); } #elif defined(NME_OGL) mHardwareRenderer = HardwareRenderer::CreateOpenGL(0, 0, sgIsOGL2); #elif defined(NME_METAL) - void *swapchain = GetMetalLayerFromRenderer(mSDLRenderer); - mHardwareRenderer = HardwareRenderer::CreateMetal(swapchain); + mHardwareRenderer = HardwareRenderer::CreateMetal(mSDLRenderer); #else #error "No valid HardwareRenderer" diff --git a/samples/BunnyMark/Source/Main.hx b/samples/BunnyMark/Source/Main.hx index 74cae2e92..3576d5ece 100644 --- a/samples/BunnyMark/Source/Main.hx +++ b/samples/BunnyMark/Source/Main.hx @@ -39,12 +39,6 @@ class Main extends Sprite { super(); - trace("--"); - for(ext in nme.gl.GL.getSupportedExtensions()) - if (ext.indexOf("draw_buffer")>=0 || ext.indexOf("frame")>=0) - trace(" " + ext); - trace("--"); - bunnies = new Array(); minX = 0; maxX = 800;