diff --git a/src/renderer_mtl.mm b/src/renderer_mtl.mm index 66ef8c5e4..7674a8cf1 100644 --- a/src/renderer_mtl.mm +++ b/src/renderer_mtl.mm @@ -450,16 +450,17 @@ namespace bgfx { namespace mtl if (NULL != lib) { m_screenshotBlitProgramVsh.m_function = lib.newFunctionWithName(SHADER_FUNCTION_NAME); + release(lib); } lib = m_device.newLibraryWithSource(fshSource); if (NULL != lib) { m_screenshotBlitProgramFsh.m_function = lib.newFunctionWithName(SHADER_FUNCTION_NAME); + release(lib); } m_screenshotBlitProgram.create(&m_screenshotBlitProgramVsh, &m_screenshotBlitProgramFsh); - release(lib); reset(m_renderPipelineDescriptor); m_renderPipelineDescriptor.colorAttachments[0].pixelFormat = m_mainFrameBuffer.m_swapChain->m_metalLayer.pixelFormat; @@ -665,6 +666,9 @@ namespace bgfx { namespace mtl m_pipelineStateCache.invalidate(); m_pipelineProgram.clear(); + m_depthStencilStateCache.invalidate(); + m_samplerStateCache.invalidate(); + for (uint32_t ii = 0; ii < BX_COUNTOF(m_shaders); ++ii) { m_shaders[ii].destroy(); @@ -784,7 +788,7 @@ namespace bgfx { namespace mtl void createProgram(ProgramHandle _handle, ShaderHandle _vsh, ShaderHandle _fsh) override { - m_program[_handle.idx].create(&m_shaders[_vsh.idx], &m_shaders[_fsh.idx]); + m_program[_handle.idx].create(&m_shaders[_vsh.idx], isValid(_fsh) ? &m_shaders[_fsh.idx] : NULL); } void destroyProgram(ProgramHandle _handle) override @@ -4611,6 +4615,8 @@ namespace bgfx { namespace mtl rce = m_commandBuffer.renderCommandEncoderWithDescriptor(renderPassDescriptor); + MTL_RELEASE(renderPassDescriptor); + rce.setCullMode(MTLCullModeNone); rce.setRenderPipelineState(m_screenshotBlitRenderPipelineState);