From f63a15160b863aa8651f9e127b0d2dbec1037bbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D1=80=D0=B0=D0=BD=D0=B8=D0=BC=D0=B8=D1=80=20=D0=9A?= =?UTF-8?q?=D0=B0=D1=80=D0=B0=D1=9F=D0=B8=D1=9B?= Date: Mon, 24 Dec 2018 22:54:08 -0800 Subject: [PATCH] Cleanup. --- src/renderer_mtl.h | 50 +++++++++++++---- src/renderer_mtl.mm | 133 +++++++++++++++++--------------------------- 2 files changed, 90 insertions(+), 93 deletions(-) diff --git a/src/renderer_mtl.h b/src/renderer_mtl.h index ddc688328..548f390a4 100644 --- a/src/renderer_mtl.h +++ b/src/renderer_mtl.h @@ -683,7 +683,7 @@ namespace bgfx { namespace mtl typename HashMap::iterator it = m_hashMap.find(_id); if (it != m_hashMap.end() ) { - MTL_RELEASE(it->second); + release(it->second); m_hashMap.erase(it); } } @@ -790,15 +790,6 @@ namespace bgfx { namespace mtl ProgramMtl() : m_vsh(NULL) , m_fsh(NULL) - , m_vshConstantBuffer(NULL) - , m_fshConstantBuffer(NULL) - , m_vshConstantBufferSize(0) - , m_vshConstantBufferAlignmentMask(0) - , m_fshConstantBufferSize(0) - , m_fshConstantBufferAlignmentMask(0) - , m_samplerCount(0) - , m_numPredefined(0) - , m_processedUniforms(false) { } @@ -811,6 +802,37 @@ namespace bgfx { namespace mtl const ShaderMtl* m_vsh; const ShaderMtl* m_fsh; + }; + + struct PipelineStateMtl + { + PipelineStateMtl() + : m_vshConstantBuffer(NULL) + , m_fshConstantBuffer(NULL) + , m_vshConstantBufferSize(0) + , m_vshConstantBufferAlignmentMask(0) + , m_fshConstantBufferSize(0) + , m_fshConstantBufferAlignmentMask(0) + , m_samplerCount(0) + , m_numPredefined(0) + { + } + + ~PipelineStateMtl() + { + if (NULL != m_vshConstantBuffer) + { + UniformBuffer::destroy(m_vshConstantBuffer); + m_vshConstantBuffer = NULL; + } + + if (NULL != m_fshConstantBuffer) + { + UniformBuffer::destroy(m_fshConstantBuffer); + m_fshConstantBuffer = NULL; + } + } + UniformBuffer* m_vshConstantBuffer; UniformBuffer* m_fshConstantBuffer; @@ -824,9 +846,15 @@ namespace bgfx { namespace mtl PredefinedUniform m_predefined[PredefinedUniform::Count*2]; uint8_t m_numPredefined; - bool m_processedUniforms; + + RenderPipelineState m_rps; }; + void release(PipelineStateMtl* _ptr) + { + BX_DELETE(g_allocator, _ptr); + } + struct TextureMtl { enum Enum diff --git a/src/renderer_mtl.mm b/src/renderer_mtl.mm index e2c1a3ad9..505c6f312 100644 --- a/src/renderer_mtl.mm +++ b/src/renderer_mtl.mm @@ -1067,7 +1067,7 @@ namespace bgfx { namespace mtl setDepthStencilState(state); - RenderPipelineState pso = getPipelineState( + PipelineStateMtl* pso = getPipelineState( state , 0 , fbh @@ -1075,29 +1075,28 @@ namespace bgfx { namespace mtl , _blitter.m_program , 0 ); - rce.setRenderPipelineState(pso); + rce.setRenderPipelineState(pso->m_rps); - ProgramMtl& program = m_program[_blitter.m_program.idx]; - uint32_t vertexUniformBufferSize = program.m_vshConstantBufferSize; - uint32_t fragmentUniformBufferSize = program.m_fshConstantBufferSize; + const uint32_t vertexUniformBufferSize = pso->m_vshConstantBufferSize; + const uint32_t fragmentUniformBufferSize = pso->m_fshConstantBufferSize; - if (vertexUniformBufferSize ) + if (vertexUniformBufferSize) { - m_uniformBufferVertexOffset = BX_ALIGN_MASK(m_uniformBufferVertexOffset, program.m_vshConstantBufferAlignmentMask); + m_uniformBufferVertexOffset = BX_ALIGN_MASK(m_uniformBufferVertexOffset, pso->m_vshConstantBufferAlignmentMask); rce.setVertexBuffer(m_uniformBuffer, m_uniformBufferVertexOffset, 0); } m_uniformBufferFragmentOffset = m_uniformBufferVertexOffset + vertexUniformBufferSize; - if (fragmentUniformBufferSize ) + if (fragmentUniformBufferSize) { - m_uniformBufferFragmentOffset = BX_ALIGN_MASK(m_uniformBufferFragmentOffset, program.m_fshConstantBufferAlignmentMask); + m_uniformBufferFragmentOffset = BX_ALIGN_MASK(m_uniformBufferFragmentOffset, pso->m_fshConstantBufferAlignmentMask); rce.setFragmentBuffer(m_uniformBuffer, m_uniformBufferFragmentOffset, 0); } float proj[16]; bx::mtxOrtho(proj, 0.0f, (float)width, (float)height, 0.0f, 0.0f, 1000.0f, 0.0f, false); - PredefinedUniform& predefined = program.m_predefined[0]; + PredefinedUniform& predefined = pso->m_predefined[0]; uint8_t flags = predefined.m_type; setShaderUniform(flags, predefined.m_loc, proj, 4); @@ -1433,8 +1432,7 @@ namespace bgfx { namespace mtl numMrt = bx::uint32_max(1, fb.m_num); } - const ProgramMtl& program = m_program[_clearQuad.m_program[numMrt-1].idx]; - RenderPipelineState pso = getPipelineState( + const PipelineStateMtl* pso = getPipelineState( state , 0 , fbh @@ -1442,14 +1440,14 @@ namespace bgfx { namespace mtl , _clearQuad.m_program[numMrt-1] , 0 ); - m_renderCommandEncoder.setRenderPipelineState(pso); + m_renderCommandEncoder.setRenderPipelineState(pso->m_rps); - uint32_t fragmentUniformBufferSize = program.m_fshConstantBufferSize; + uint32_t fragmentUniformBufferSize = pso->m_fshConstantBufferSize; m_uniformBufferFragmentOffset = m_uniformBufferVertexOffset; if (fragmentUniformBufferSize) { - m_uniformBufferFragmentOffset = BX_ALIGN_MASK(m_uniformBufferFragmentOffset, program.m_fshConstantBufferAlignmentMask); + m_uniformBufferFragmentOffset = BX_ALIGN_MASK(m_uniformBufferFragmentOffset, pso->m_fshConstantBufferAlignmentMask); m_renderCommandEncoder.setFragmentBuffer(m_uniformBuffer, m_uniformBufferFragmentOffset, 0); } @@ -1674,7 +1672,7 @@ namespace bgfx { namespace mtl m_renderCommandEncoder.setStencilReferenceValue(ref); } - RenderPipelineState getPipelineState( + PipelineStateMtl* getPipelineState( uint64_t _state , uint32_t _rgba , FrameBufferHandle _fbh @@ -1695,7 +1693,7 @@ namespace bgfx { namespace mtl ); const bool independentBlendEnable = !!(BGFX_STATE_BLEND_INDEPENDENT & _state); - ProgramMtl& program = m_program[_program.idx]; + const ProgramMtl& program = m_program[_program.idx]; bx::HashMurmur2A murmur; murmur.begin(); @@ -1726,10 +1724,12 @@ namespace bgfx { namespace mtl uint32_t hash = murmur.end(); - RenderPipelineState pso = m_pipelineStateCache.find(hash); + PipelineStateMtl* pso = m_pipelineStateCache.find(hash); if (NULL == pso) { + pso = BX_NEW(g_allocator, PipelineStateMtl); + RenderPipelineDescriptor pd = m_renderPipelineDescriptor; reset(pd); @@ -1912,23 +1912,17 @@ namespace bgfx { namespace mtl pd.vertexDescriptor = vertexDesc; - if (program.m_processedUniforms) { - pso = m_device.newRenderPipelineStateWithDescriptor(pd); - } - else - { - program.m_numPredefined = 0; RenderPipelineReflection reflection = NULL; - pso = m_device.newRenderPipelineStateWithDescriptor(pd, MTLPipelineOptionBufferTypeInfo, &reflection); + pso->m_rps = m_device.newRenderPipelineStateWithDescriptor(pd, MTLPipelineOptionBufferTypeInfo, &reflection); if (NULL != reflection) { for (uint32_t shaderType = 0; shaderType < 2; ++shaderType) { UniformBuffer*& constantBuffer = shaderType == 0 - ? program.m_vshConstantBuffer - : program.m_fshConstantBuffer + ? pso->m_vshConstantBuffer + : pso->m_fshConstantBuffer ; uint8_t fragmentBit = (1 == shaderType ? BGFX_UNIFORM_FRAGMENTBIT : 0); @@ -1947,13 +1941,13 @@ namespace bgfx { namespace mtl { if (shaderType == 0) { - program.m_vshConstantBufferSize = (uint32_t)arg.bufferDataSize; - program.m_vshConstantBufferAlignmentMask = (uint32_t)arg.bufferAlignment - 1; + pso->m_vshConstantBufferSize = (uint32_t)arg.bufferDataSize; + pso->m_vshConstantBufferAlignmentMask = (uint32_t)arg.bufferAlignment - 1; } else { - program.m_fshConstantBufferSize = (uint32_t)arg.bufferDataSize; - program.m_fshConstantBufferAlignmentMask = (uint32_t)arg.bufferAlignment - 1; + pso->m_fshConstantBufferSize = (uint32_t)arg.bufferDataSize; + pso->m_fshConstantBufferAlignmentMask = (uint32_t)arg.bufferAlignment - 1; } for (MTLStructMember* uniform in arg.bufferStructType.members ) @@ -1984,12 +1978,12 @@ namespace bgfx { namespace mtl PredefinedUniform::Enum predefined = nameToPredefinedUniformEnum(name); if (PredefinedUniform::Count != predefined) { - PredefinedUniform& pu = program.m_predefined[program.m_numPredefined]; + PredefinedUniform& pu = pso->m_predefined[pso->m_numPredefined]; pu.m_loc = uint32_t(uniform.offset); pu.m_count = uint16_t(num); pu.m_type = uint8_t(predefined|fragmentBit); - ++program.m_numPredefined; + ++pso->m_numPredefined; } else { @@ -2019,19 +2013,19 @@ namespace bgfx { namespace mtl if (NULL != info) { - if (program.m_samplerCount >= BGFX_CONFIG_MAX_TEXTURE_SAMPLERS) + if (pso->m_samplerCount >= BGFX_CONFIG_MAX_TEXTURE_SAMPLERS) { BX_WARN(NULL != info, "Too many samplers in shader(only %d is supported). User defined uniform '%s' won't be set.", BGFX_CONFIG_MAX_TEXTURE_SAMPLERS, name); } else { - SamplerInfo& si = program.m_samplers[program.m_samplerCount]; + SamplerInfo& si = pso->m_samplers[pso->m_samplerCount]; si.m_index = uint32_t(arg.index); si.m_uniform = info->m_handle; si.m_fragment = fragmentBit ? 1 : 0; - ++program.m_samplerCount; + ++pso->m_samplerCount; BX_TRACE("texture %s %d index:%d", name, info->m_handle, uint32_t(arg.index) ); } @@ -2050,8 +2044,6 @@ namespace bgfx { namespace mtl } } } - - program.m_processedUniforms = true; } m_pipelineStateCache.add(hash, pso); @@ -2061,7 +2053,7 @@ namespace bgfx { namespace mtl return pso; } - RenderPipelineState getPipelineState( + PipelineStateMtl* getPipelineState( uint64_t _state , uint32_t _rgba , FrameBufferHandle _fbh @@ -2185,9 +2177,10 @@ namespace bgfx { namespace mtl typedef stl::vector PipelineProgramArray; PipelineProgramArray m_pipelineProgram; - StateCacheT m_pipelineStateCache; - StateCacheT m_depthStencilStateCache; - StateCacheT m_samplerStateCache; + + StateCacheT m_pipelineStateCache; + StateCacheT m_depthStencilStateCache; + StateCacheT m_samplerStateCache; TextVideoMem m_textVideoMem; @@ -2381,27 +2374,6 @@ namespace bgfx { namespace mtl { m_vsh = NULL; m_fsh = NULL; - - if (NULL != m_vshConstantBuffer) - { - UniformBuffer::destroy(m_vshConstantBuffer); - m_vshConstantBuffer = NULL; - } - - if (NULL != m_fshConstantBuffer) - { - UniformBuffer::destroy(m_fshConstantBuffer); - m_fshConstantBuffer = NULL; - } - - m_vshConstantBufferSize = 0; - m_vshConstantBufferAlignmentMask = 0; - m_fshConstantBufferSize = 0; - m_fshConstantBufferAlignmentMask = 0; - - m_samplerCount = 0; - m_processedUniforms = false; - m_numPredefined = 0; } void BufferMtl::create(uint32_t _size, void* _data, uint16_t _flags, uint16_t _stride, bool _vertex) @@ -3467,6 +3439,7 @@ namespace bgfx { namespace mtl PrimInfo prim = s_primInfo[primIndex]; RenderCommandEncoder rce; + PipelineStateMtl* currentPso = NULL; bool wasCompute = false; bool viewHasScissor = false; @@ -3896,11 +3869,11 @@ namespace bgfx { namespace mtl } else { - RenderPipelineState pso = NULL; + currentPso = NULL; if (0 < numStreams) { - pso = getPipelineState( + currentPso = getPipelineState( newFlags , draw.m_rgba , fbh @@ -3911,13 +3884,13 @@ namespace bgfx { namespace mtl ); } - if (NULL == pso) + if (NULL == currentPso) { currentProgram = BGFX_INVALID_HANDLE; continue; } - rce.setRenderPipelineState(pso); + rce.setRenderPipelineState(currentPso->m_rps); } if (isValid(draw.m_instanceDataBuffer) ) @@ -3932,55 +3905,51 @@ namespace bgfx { namespace mtl if (isValid(currentProgram) ) { - ProgramMtl& program = m_program[currentProgram.idx]; - - uint32_t vertexUniformBufferSize = program.m_vshConstantBufferSize; - uint32_t fragmentUniformBufferSize = program.m_fshConstantBufferSize; + const uint32_t vertexUniformBufferSize = currentPso->m_vshConstantBufferSize; + const uint32_t fragmentUniformBufferSize = currentPso->m_fshConstantBufferSize; if (0 != vertexUniformBufferSize) { - m_uniformBufferVertexOffset = BX_ALIGN_MASK(m_uniformBufferVertexOffset, program.m_vshConstantBufferAlignmentMask); + m_uniformBufferVertexOffset = BX_ALIGN_MASK(m_uniformBufferVertexOffset, currentPso->m_vshConstantBufferAlignmentMask); rce.setVertexBuffer(m_uniformBuffer, m_uniformBufferVertexOffset, 0); } m_uniformBufferFragmentOffset = m_uniformBufferVertexOffset + vertexUniformBufferSize; if (0 != fragmentUniformBufferSize) { - m_uniformBufferFragmentOffset = BX_ALIGN_MASK(m_uniformBufferFragmentOffset, program.m_fshConstantBufferAlignmentMask); + m_uniformBufferFragmentOffset = BX_ALIGN_MASK(m_uniformBufferFragmentOffset, currentPso->m_fshConstantBufferAlignmentMask); rce.setFragmentBuffer(m_uniformBuffer, m_uniformBufferFragmentOffset, 0); } if (constantsChanged) { - UniformBuffer* vcb = program.m_vshConstantBuffer; + UniformBuffer* vcb = currentPso->m_vshConstantBuffer; if (NULL != vcb) { commit(*vcb); } - UniformBuffer* fcb = program.m_fshConstantBuffer; + UniformBuffer* fcb = currentPso->m_fshConstantBuffer; if (NULL != fcb) { commit(*fcb); } } - viewState.setPredefined<4>(this, view, program, _render, draw); + viewState.setPredefined<4>(this, view, *currentPso, _render, draw); m_uniformBufferFragmentOffset += fragmentUniformBufferSize; - m_uniformBufferVertexOffset = m_uniformBufferFragmentOffset; + m_uniformBufferVertexOffset = m_uniformBufferFragmentOffset; } if (isValid(currentProgram) ) { - ProgramMtl& program = m_program[currentProgram.idx]; - - for (uint32_t sampler = 0; sampler < program.m_samplerCount; ++sampler) + for (uint32_t sampler = 0, numSamplers = currentPso->m_samplerCount; sampler < numSamplers; ++sampler) { - SamplerInfo& samplerInfo = program.m_samplers[sampler]; + const SamplerInfo& samplerInfo = currentPso->m_samplers[sampler]; UniformHandle handle = samplerInfo.m_uniform; - int stage = *((int*)m_uniforms[handle.idx]); + int stage = *( (int*)m_uniforms[handle.idx]); const Binding& bind = renderBind.m_bind[stage]; Binding& current = currentBind.m_bind[stage];