diff --git a/src/renderer_mtl.mm b/src/renderer_mtl.mm index 9a078e565..518663f4d 100644 --- a/src/renderer_mtl.mm +++ b/src/renderer_mtl.mm @@ -134,7 +134,7 @@ namespace bgfx { namespace mtl { MTLVertexFormatUChar2, MTLVertexFormatUChar2Normalized }, { MTLVertexFormatUChar2, MTLVertexFormatUChar2Normalized }, { MTLVertexFormatUChar3, MTLVertexFormatUChar3Normalized }, - { MTLVertexFormatUChar4, MTLVertexFormatUChar4Normalized } + { MTLVertexFormatUChar4, MTLVertexFormatUChar4Normalized }, }, //Uint10 @@ -143,7 +143,7 @@ namespace bgfx { namespace mtl { MTLVertexFormatUInt1010102Normalized, MTLVertexFormatUInt1010102Normalized }, { MTLVertexFormatUInt1010102Normalized, MTLVertexFormatUInt1010102Normalized }, { MTLVertexFormatUInt1010102Normalized, MTLVertexFormatUInt1010102Normalized }, - { MTLVertexFormatUInt1010102Normalized, MTLVertexFormatUInt1010102Normalized } + { MTLVertexFormatUInt1010102Normalized, MTLVertexFormatUInt1010102Normalized }, }, //Int16 @@ -151,7 +151,7 @@ namespace bgfx { namespace mtl { MTLVertexFormatShort2, MTLVertexFormatShort2Normalized }, { MTLVertexFormatShort2, MTLVertexFormatShort2Normalized }, { MTLVertexFormatShort3, MTLVertexFormatShort3Normalized }, - { MTLVertexFormatShort4, MTLVertexFormatShort4Normalized } + { MTLVertexFormatShort4, MTLVertexFormatShort4Normalized }, }, //Half @@ -159,7 +159,7 @@ namespace bgfx { namespace mtl { MTLVertexFormatHalf2, MTLVertexFormatHalf2 }, { MTLVertexFormatHalf2, MTLVertexFormatHalf2 }, { MTLVertexFormatHalf3, MTLVertexFormatHalf3 }, - { MTLVertexFormatHalf4, MTLVertexFormatHalf4 } + { MTLVertexFormatHalf4, MTLVertexFormatHalf4 }, }, //Float @@ -167,7 +167,7 @@ namespace bgfx { namespace mtl { MTLVertexFormatFloat, MTLVertexFormatFloat }, { MTLVertexFormatFloat2, MTLVertexFormatFloat2 }, { MTLVertexFormatFloat3, MTLVertexFormatFloat3 }, - { MTLVertexFormatFloat4, MTLVertexFormatFloat4 } + { MTLVertexFormatFloat4, MTLVertexFormatFloat4 }, }, }; BX_STATIC_ASSERT(AttribType::Count == BX_COUNTOF(s_attribType) ); @@ -217,7 +217,7 @@ namespace bgfx { namespace mtl MTLCompareFunctionGreater, MTLCompareFunctionNotEqual, MTLCompareFunctionNever, - MTLCompareFunctionAlways + MTLCompareFunctionAlways, }; static const MTLStencilOperation s_stencilOp[] = @@ -229,7 +229,7 @@ namespace bgfx { namespace mtl MTLStencilOperationIncrementClamp, MTLStencilOperationDecrementWrap, MTLStencilOperationDecrementClamp, - MTLStencilOperationInvert + MTLStencilOperationInvert, }; static const MTLSamplerAddressMode s_textureAddress[] = @@ -342,8 +342,8 @@ namespace bgfx { namespace mtl int s_msaa[5] = { 1,2,4,8,16 }; - #define SHADER_FUNCTION_NAME ("xlatMtlMain") - #define SHADER_UNIFORM_NAME ("_mtl_u") +#define SHADER_FUNCTION_NAME ("xlatMtlMain") +#define SHADER_UNIFORM_NAME ("_mtl_u") struct RendererContextMtl : public RendererContextI { @@ -447,28 +447,35 @@ namespace bgfx { namespace mtl "struct xlatMtlShaderOutput { float4 gl_Position [[position]]; float2 v_texcoord0; }; \n" "vertex xlatMtlShaderOutput xlatMtlMain (uint v_id [[ vertex_id ]]) \n" "{\n" - " xlatMtlShaderOutput _mtl_o;\n" + " xlatMtlShaderOutput _mtl_o;\n" " if (v_id==0) { _mtl_o.gl_Position = float4(-1.0,-1.0,0.0,1.0); _mtl_o.v_texcoord0 = float2(0.0,1.0); } \n" " else if (v_id==1) { _mtl_o.gl_Position = float4(3.0,-1.0,0.0,1.0); _mtl_o.v_texcoord0 = float2(2.0,1.0); } \n" " else { _mtl_o.gl_Position = float4(-1.0,3.0,0.0,1.0); _mtl_o.v_texcoord0 = float2(0.0,-1.0); }\n" " return _mtl_o;\n" - "}\n"; + "}\n" + ; - const char* fshSource = "using namespace metal; \n" - " struct xlatMtlShaderInput { float2 v_texcoord0; }; \n" - " fragment half4 xlatMtlMain (xlatMtlShaderInput _mtl_i[[stage_in]], texture2d s_texColor [[texture(0)]], sampler _mtlsmp_s_texColor [[sampler(0)]] ) \n" - " { return half4(s_texColor.sample(_mtlsmp_s_texColor, _mtl_i.v_texcoord0) ); } \n"; + const char* fshSource = + "using namespace metal;\n" + "struct xlatMtlShaderInput { float2 v_texcoord0; };\n" + "fragment half4 xlatMtlMain (xlatMtlShaderInput _mtl_i[[stage_in]], texture2d s_texColor [[texture(0)]], sampler _mtlsmp_s_texColor [[sampler(0)]] )\n" + "{\n" + " return half4(s_texColor.sample(_mtlsmp_s_texColor, _mtl_i.v_texcoord0) );\n" + "}\n" + ; Library lib = m_device.newLibraryWithSource(vshSource); if (NULL != lib) { m_screenshotBlitProgramVsh.m_function = lib.newFunctionWithName(SHADER_FUNCTION_NAME); } + lib = m_device.newLibraryWithSource(fshSource); if (NULL != lib) { m_screenshotBlitProgramFsh.m_function = lib.newFunctionWithName(SHADER_FUNCTION_NAME); } + m_screenshotBlitProgram.create(&m_screenshotBlitProgramVsh, &m_screenshotBlitProgramFsh); reset(m_renderPipelineDescriptor); @@ -478,7 +485,7 @@ namespace bgfx { namespace mtl m_screenshotBlitRenderPipelineState = m_device.newRenderPipelineStateWithDescriptor(m_renderPipelineDescriptor); g_caps.supported |= (0 - | BGFX_CAPS_TEXTURE_COMPARE_LEQUAL //NOTE: on IOS Gpu Family 1/2 have to set compare in shader + | BGFX_CAPS_TEXTURE_COMPARE_LEQUAL | BGFX_CAPS_TEXTURE_COMPARE_ALL | BGFX_CAPS_TEXTURE_3D | BGFX_CAPS_VERTEX_ATTRIB_HALF @@ -491,7 +498,7 @@ namespace bgfx { namespace mtl | BGFX_CAPS_TEXTURE_READ_BACK | BGFX_CAPS_OCCLUSION_QUERY | BGFX_CAPS_ALPHA_TO_COVERAGE - | BGFX_CAPS_TEXTURE_2D_ARRAY // supported on all platforms + | BGFX_CAPS_TEXTURE_2D_ARRAY ); if (BX_ENABLED(BX_PLATFORM_IOS) ) @@ -516,7 +523,7 @@ namespace bgfx { namespace mtl //todo: vendor id, device id, gpu enum - m_hasPixelFormatDepth32Float_Stencil8 = false + m_hasPixelFormatDepth32Float_Stencil8 = false || BX_ENABLED(BX_PLATFORM_OSX) || (BX_ENABLED(BX_PLATFORM_IOS) && iOSVersionEqualOrGreater("9.0.0") ) ; @@ -531,7 +538,7 @@ namespace bgfx { namespace mtl if (BX_ENABLED(BX_PLATFORM_OSX) ) { - s_textureFormat[TextureFormat::R8].m_fmtSrgb = MTLPixelFormatInvalid; + s_textureFormat[TextureFormat::R8].m_fmtSrgb = MTLPixelFormatInvalid; s_textureFormat[TextureFormat::RG8].m_fmtSrgb = MTLPixelFormatInvalid; } @@ -566,34 +573,34 @@ namespace bgfx { namespace mtl g_caps.formats[ii] = support; } - g_caps.formats[TextureFormat::A8] &= ~(BGFX_CAPS_FORMAT_TEXTURE_FRAMEBUFFER | BGFX_CAPS_FORMAT_TEXTURE_FRAMEBUFFER_MSAA); - g_caps.formats[TextureFormat::RG32I] &= ~(BGFX_CAPS_FORMAT_TEXTURE_FRAMEBUFFER_MSAA); - g_caps.formats[TextureFormat::RG32U] &= ~(BGFX_CAPS_FORMAT_TEXTURE_FRAMEBUFFER_MSAA); + g_caps.formats[TextureFormat::A8 ] &= ~(BGFX_CAPS_FORMAT_TEXTURE_FRAMEBUFFER | BGFX_CAPS_FORMAT_TEXTURE_FRAMEBUFFER_MSAA); + g_caps.formats[TextureFormat::RG32I ] &= ~(BGFX_CAPS_FORMAT_TEXTURE_FRAMEBUFFER_MSAA); + g_caps.formats[TextureFormat::RG32U ] &= ~(BGFX_CAPS_FORMAT_TEXTURE_FRAMEBUFFER_MSAA); g_caps.formats[TextureFormat::RGBA32I] &= ~(BGFX_CAPS_FORMAT_TEXTURE_FRAMEBUFFER_MSAA); g_caps.formats[TextureFormat::RGBA32U] &= ~(BGFX_CAPS_FORMAT_TEXTURE_FRAMEBUFFER_MSAA); - if (BX_ENABLED(BX_PLATFORM_IOS) ) { s_textureFormat[TextureFormat::D24S8].m_fmt = MTLPixelFormatDepth32Float; - g_caps.formats[TextureFormat::BC1] = - g_caps.formats[TextureFormat::BC2] = - g_caps.formats[TextureFormat::BC3] = - g_caps.formats[TextureFormat::BC4] = - g_caps.formats[TextureFormat::BC5] = + g_caps.formats[TextureFormat::BC1 ] = + g_caps.formats[TextureFormat::BC2 ] = + g_caps.formats[TextureFormat::BC3 ] = + g_caps.formats[TextureFormat::BC4 ] = + g_caps.formats[TextureFormat::BC5 ] = g_caps.formats[TextureFormat::BC6H] = - g_caps.formats[TextureFormat::BC7] = BGFX_CAPS_FORMAT_TEXTURE_NONE; + g_caps.formats[TextureFormat::BC7 ] = BGFX_CAPS_FORMAT_TEXTURE_NONE; - g_caps.formats[TextureFormat::RG32F] &= ~(BGFX_CAPS_FORMAT_TEXTURE_FRAMEBUFFER_MSAA); + g_caps.formats[TextureFormat::RG32F ] &= ~(BGFX_CAPS_FORMAT_TEXTURE_FRAMEBUFFER_MSAA); g_caps.formats[TextureFormat::RGBA32F] &= ~(BGFX_CAPS_FORMAT_TEXTURE_FRAMEBUFFER_MSAA); } if (BX_ENABLED(BX_PLATFORM_OSX) ) { - s_textureFormat[TextureFormat::D24S8].m_fmt = (MTLPixelFormat)(m_device.depth24Stencil8PixelFormatSupported() ? - 255 /* Depth24Unorm_Stencil8 */ : - MTLPixelFormatDepth32Float_Stencil8); + s_textureFormat[TextureFormat::D24S8].m_fmt = (MTLPixelFormat)(m_device.depth24Stencil8PixelFormatSupported() + ? 255 /* Depth24Unorm_Stencil8 */ + : MTLPixelFormatDepth32Float_Stencil8) + ; g_caps.formats[TextureFormat::ETC2 ] = g_caps.formats[TextureFormat::ETC2A ] = @@ -618,7 +625,7 @@ namespace bgfx { namespace mtl } } - for(uint32_t ii=1; ii<5; ++ii) + for (uint32_t ii=1; ii<5; ++ii) { if (!m_device.supportsTextureSampleCount(s_msaa[ii]) ) { @@ -626,7 +633,6 @@ namespace bgfx { namespace mtl } } - // Init reserved part of view name. for (uint32_t ii = 0; ii < BGFX_CONFIG_MAX_VIEWS; ++ii) { @@ -990,9 +996,10 @@ namespace bgfx { namespace mtl FrameBufferHandle fbh = BGFX_INVALID_HANDLE; - if ( NULL == rce || m_renderCommandEncoderFrameBufferHandle.idx != invalidHandle ) + if (NULL == rce + || m_renderCommandEncoderFrameBufferHandle.idx != invalidHandle) { - if ( m_renderCommandEncoder ) + if (m_renderCommandEncoder ) m_renderCommandEncoder.endEncoding(); RenderPassDescriptor renderPassDescriptor = newRenderPassDescriptor(); @@ -1081,7 +1088,7 @@ namespace bgfx { namespace mtl } // Present and commit the command buffer - if ( NULL != m_drawable) + if (NULL != m_drawable) { m_commandBuffer.presentDrawable(m_drawable); MTL_RELEASE(m_drawable); @@ -1135,7 +1142,8 @@ namespace bgfx { namespace mtl m_textureDescriptor.mipmapLevelCount = 1; m_textureDescriptor.sampleCount = sampleCount; m_textureDescriptor.arrayLength = 1; - if ( m_iOS9Runtime || m_macOS11Runtime ) + if (m_iOS9Runtime + || m_macOS11Runtime) { m_textureDescriptor.cpuCacheMode = MTLCPUCacheModeDefaultCache; m_textureDescriptor.storageMode = MTLStorageModePrivate; @@ -1148,16 +1156,17 @@ namespace bgfx { namespace mtl } m_backBufferDepth = m_device.newTextureWithDescriptor(m_textureDescriptor); - if (m_hasPixelFormatDepth32Float_Stencil8) + { m_backBufferStencil = m_backBufferDepth; + } else { m_textureDescriptor.pixelFormat = MTLPixelFormatStencil8; m_backBufferStencil = m_device.newTextureWithDescriptor(m_textureDescriptor); } - if ( sampleCount > 1 ) + if (sampleCount > 1) { if (NULL != m_backBufferColorMSAA) { @@ -1186,7 +1195,7 @@ namespace bgfx { namespace mtl m_textVideoMem.resize(false, _resolution.m_width, _resolution.m_height); m_textVideoMem.clear(); - if ( prevMetalLayerPixelFormat != m_metalLayer.pixelFormat) + if (prevMetalLayerPixelFormat != m_metalLayer.pixelFormat) { MTL_RELEASE(m_screenshotBlitRenderPipelineState) reset(m_renderPipelineDescriptor); @@ -1682,8 +1691,8 @@ namespace bgfx { namespace mtl m_samplerDescriptor.normalizedCoordinates = TRUE; m_samplerDescriptor.maxAnisotropy = (0 != (_flags & (BGFX_TEXTURE_MIN_ANISOTROPIC|BGFX_TEXTURE_MAG_ANISOTROPIC) ) ) ? m_maxAnisotropy : 1; - //NOTE: Comparison function can be specified in shader on all metal hw. - if ( m_macOS11Runtime || [m_device supportsFeatureSet:(MTLFeatureSet)4/*MTLFeatureSet_iOS_GPUFamily3_v1*/]) + if (m_macOS11Runtime + || [m_device supportsFeatureSet:(MTLFeatureSet)4 /*MTLFeatureSet_iOS_GPUFamily3_v1*/]) { const uint32_t cmpFunc = (_flags&BGFX_TEXTURE_COMPARE_MASK)>>BGFX_TEXTURE_COMPARE_SHIFT; m_samplerDescriptor.compareFunction = 0 == cmpFunc ? MTLCompareFunctionNever : s_cmpFunc[cmpFunc]; @@ -1704,9 +1713,9 @@ namespace bgfx { namespace mtl BlitCommandEncoder getBlitCommandEncoder() { - if ( m_blitCommandEncoder == NULL) + if (m_blitCommandEncoder == NULL) { - if ( m_commandBuffer == NULL ) + if (m_commandBuffer == NULL) { m_commandBuffer = m_cmd.alloc(); } @@ -2070,7 +2079,7 @@ namespace bgfx { namespace mtl } else { - if ( texture.m_textureFormat == TextureFormat::D24S8) + if (texture.m_textureFormat == TextureFormat::D24S8) { pd.stencilAttachmentPixelFormat = texture.m_ptr.m_obj.pixelFormat; } @@ -2353,12 +2362,15 @@ namespace bgfx { namespace mtl m_bufferIndex = (m_bufferIndex + 1) % MTL_MAX_FRAMES_IN_FLIGHT; bx::memCopy( (uint8_t*)getBuffer().contents() + _offset, _data, _size); } - else if ( NULL != s_renderMtl->m_renderCommandEncoder ) + else if (NULL != s_renderMtl->m_renderCommandEncoder) { s_renderMtl->m_cmd.release(m_buffers[m_bufferIndex]); - if (_offset == 0 && _size == m_size) + if (_offset == 0 + && _size == m_size) + { m_buffers[m_bufferIndex] = s_renderMtl->m_device.newBufferWithBytes(_data, _size, 0); + } else { const void* oldContent = m_buffers[m_bufferIndex].contents(); @@ -2521,12 +2533,15 @@ namespace bgfx { namespace mtl m_ptr = s_renderMtl->m_device.newTextureWithDescriptor(desc); - if ( sampleCount > 1) + if (sampleCount > 1) { desc.textureType = MTLTextureType2DMultisample; desc.sampleCount = sampleCount; - if (s_renderMtl->m_iOS9Runtime || s_renderMtl->m_macOS11Runtime) + if (s_renderMtl->m_iOS9Runtime + || s_renderMtl->m_macOS11Runtime) + { desc.storageMode = (MTLStorageMode)( 2 /*MTLStorageModePrivate*/); + } m_ptrMSAA = s_renderMtl->m_device.newTextureWithDescriptor(desc); } @@ -2645,13 +2660,13 @@ namespace bgfx { namespace mtl data = temp; } - if ( NULL != s_renderMtl->m_renderCommandEncoder ) + if (NULL != s_renderMtl->m_renderCommandEncoder) { s_renderMtl->m_cmd.finish(true); MTLRegion region = { - { _rect.m_x, _rect.m_y, z }, + { _rect.m_x, _rect.m_y, z }, { _rect.m_width, _rect.m_height, _depth }, }; @@ -2727,7 +2742,7 @@ namespace bgfx { namespace mtl { const TextureMtl& texture = s_renderMtl->m_textures[handle.idx]; - if ( 0 == m_width ) + if (0 == m_width) { m_width = texture.m_width; m_height = texture.m_height; @@ -2814,34 +2829,42 @@ namespace bgfx { namespace mtl static void commandBufferFinishedCallback(void* _data) { CommandQueueMtl* queue = (CommandQueueMtl*)_data; - if ( queue ) + if (queue) + { queue->m_framesSemaphore.post(); + } } void CommandQueueMtl::kick(bool _endFrame, bool _waitForFinish) { - if ( m_activeCommandBuffer ) + if (m_activeCommandBuffer) { - if ( _endFrame ) + if (_endFrame) { m_releaseWriteIndex = (m_releaseWriteIndex + 1) % MTL_MAX_FRAMES_IN_FLIGHT; m_activeCommandBuffer.addCompletedHandler(commandBufferFinishedCallback, this); } m_activeCommandBuffer.commit(); - if ( _waitForFinish ) + if (_waitForFinish) + { m_activeCommandBuffer.waitUntilCompleted(); + } + MTL_RELEASE(m_activeCommandBuffer); } } void CommandQueueMtl::finish(bool _finishAll) { - if ( _finishAll) + if (_finishAll) { - int count = m_activeCommandBuffer != NULL ? 2 : 3; + uint32_t count = m_activeCommandBuffer != NULL + ? 2 + : 3 + ; - for( int i=0; i< count; ++i) + for (uint32_t ii = 0; ii < count; ++ii) { consume(); } @@ -3009,7 +3032,7 @@ namespace bgfx { namespace mtl bool readBack = !!(dst.m_flags & BGFX_TEXTURE_READ_BACK); #endif // BX_PLATFORM_OSX - if ( MTLTextureType3D == src.m_ptr.textureType() ) + if (MTLTextureType3D == src.m_ptr.textureType() ) { m_blitCommandEncoder.copyFromTexture( src.m_ptr @@ -3104,14 +3127,20 @@ namespace bgfx { namespace mtl m_textureDescriptor.mipmapLevelCount = 1; m_textureDescriptor.sampleCount = 1; m_textureDescriptor.arrayLength = 1; - if ( m_iOS9Runtime || m_macOS11Runtime ) + + if (m_iOS9Runtime + || m_macOS11Runtime) { m_textureDescriptor.cpuCacheMode = MTLCPUCacheModeDefaultCache; - m_textureDescriptor.storageMode = (MTLStorageMode)(BX_ENABLED(BX_PLATFORM_IOS) - ? 0 /* MTLStorageModeShared */ - : 1 /*MTLStorageModeManaged*/ - ); - m_textureDescriptor.usage = MTLTextureUsageRenderTarget | MTLTextureUsageShaderRead; + m_textureDescriptor.storageMode = BX_ENABLED(BX_PLATFORM_IOS) + ? (MTLStorageMode)0 // MTLStorageModeShared + : (MTLStorageMode)1 // MTLStorageModeManaged + ; + + m_textureDescriptor.usage = 0 + | MTLTextureUsageRenderTarget + | MTLTextureUsageShaderRead + ; } m_screenshotTarget = m_device.newTextureWithDescriptor(m_textureDescriptor); @@ -3263,7 +3292,8 @@ namespace bgfx { namespace mtl Rect viewRect = viewState.m_rect; bool clearWithRenderPass = false; - if ( NULL == m_renderCommandEncoder || fbh.idx != _render->m_fb[view].idx ) + if (NULL == m_renderCommandEncoder + || fbh.idx != _render->m_fb[view].idx) { if (0 != m_renderCommandEncoder) { @@ -3278,10 +3308,10 @@ namespace bgfx { namespace mtl uint32_t width = m_resolution.m_width; uint32_t height = m_resolution.m_height; - if ( isValid(fbh) ) + if (isValid(fbh) ) { FrameBufferMtl& frameBuffer = m_frameBuffers[fbh.idx]; - width = frameBuffer.m_width; + width = frameBuffer.m_width; height = frameBuffer.m_height; } @@ -3293,14 +3323,13 @@ namespace bgfx { namespace mtl setFrameBuffer(renderPassDescriptor, fbh); - if ( clearWithRenderPass ) + if (clearWithRenderPass) { - - for(uint32_t ii = 0; ii < g_caps.limits.maxFBAttachments; ++ii) + for (uint32_t ii = 0; ii < g_caps.limits.maxFBAttachments; ++ii) { MTLRenderPassColorAttachmentDescriptor* desc = renderPassDescriptor.colorAttachments[ii]; - if ( desc.texture != NULL) + if (desc.texture != NULL) { if (0 != (BGFX_CLEAR_COLOR & clr.m_flags) ) { @@ -3338,10 +3367,13 @@ namespace bgfx { namespace mtl { depthAttachment.clearDepth = clr.m_depth; depthAttachment.loadAction = 0 != (BGFX_CLEAR_DEPTH & clr.m_flags) - ? MTLLoadActionClear - : MTLLoadActionLoad - ; - depthAttachment.storeAction = NULL != m_backBufferColorMSAA ? MTLStoreActionDontCare : MTLStoreActionStore; + ? MTLLoadActionClear + : MTLLoadActionLoad + ; + depthAttachment.storeAction = NULL != m_backBufferColorMSAA + ? MTLStoreActionDontCare + : MTLStoreActionStore + ; } RenderPassStencilAttachmentDescriptor stencilAttachment = renderPassDescriptor.stencilAttachment; @@ -3349,19 +3381,24 @@ namespace bgfx { namespace mtl { stencilAttachment.clearStencil = clr.m_stencil; stencilAttachment.loadAction = 0 != (BGFX_CLEAR_STENCIL & clr.m_flags) - ? MTLLoadActionClear - : MTLLoadActionLoad - ; - stencilAttachment.storeAction = NULL != m_backBufferColorMSAA ? MTLStoreActionDontCare : MTLStoreActionStore; + ? MTLLoadActionClear + : MTLLoadActionLoad + ; + stencilAttachment.storeAction = NULL != m_backBufferColorMSAA + ? MTLStoreActionDontCare + : MTLStoreActionStore + ; } } else { - for(uint32_t ii = 0; ii < g_caps.limits.maxFBAttachments; ++ii) + for (uint32_t ii = 0; ii < g_caps.limits.maxFBAttachments; ++ii) { MTLRenderPassColorAttachmentDescriptor* desc = renderPassDescriptor.colorAttachments[ii]; - if ( desc.texture != NULL) + if (desc.texture != NULL) + { desc.loadAction = MTLLoadActionLoad; + } } RenderPassDepthAttachmentDescriptor depthAttachment = renderPassDescriptor.depthAttachment; @@ -3493,6 +3530,7 @@ namespace bgfx { namespace mtl { Rect scissorRect; scissorRect.setIntersect(viewScissorRect, _render->m_rectCache.m_cache[scissor]); + if (scissorRect.isZeroArea() ) { continue; @@ -3953,8 +3991,7 @@ namespace bgfx { namespace mtl m_renderCommandEncoder = 0; m_renderCommandEncoderFrameBufferHandle.idx = invalidHandle; - - if ( m_screenshotTarget ) + if (m_screenshotTarget) { RenderPassDescriptor renderPassDescriptor = newRenderPassDescriptor(); renderPassDescriptor.colorAttachments[0].texture = currentDrawable().texture; @@ -3972,7 +4009,7 @@ namespace bgfx { namespace mtl rce.drawPrimitives(MTLPrimitiveTypeTriangle, 0, 3, 1); rce.endEncoding(); - } + } } } /* namespace mtl */ } // namespace bgfx