diff --git a/src/renderer_d3d11.cpp b/src/renderer_d3d11.cpp index bb7516686..fc968bdf8 100644 --- a/src/renderer_d3d11.cpp +++ b/src/renderer_d3d11.cpp @@ -6420,8 +6420,8 @@ BX_PRAGMA_DIAGNOSTIC_POP(); deviceCtx->VSSetConstantBuffers(0, 1, &vsh->m_buffer); const ShaderD3D11* fsh = program.m_fsh; - if (NULL != m_currentColor - || fsh->m_hasDepthOp) + if (NULL != fsh + && (NULL != m_currentColor || fsh->m_hasDepthOp) ) { deviceCtx->PSSetShader(fsh->m_pixelShader, NULL, 0); deviceCtx->PSSetConstantBuffers(0, 1, &fsh->m_buffer); @@ -6448,10 +6448,13 @@ BX_PRAGMA_DIAGNOSTIC_POP(); commit(*vcb); } - UniformBuffer* fcb = program.m_fsh->m_constantBuffer; - if (NULL != fcb) + if (NULL != program.m_fsh) { - commit(*fcb); + UniformBuffer* fcb = program.m_fsh->m_constantBuffer; + if (NULL != fcb) + { + commit(*fcb); + } } } diff --git a/src/renderer_d3d12.cpp b/src/renderer_d3d12.cpp index 70890ac95..f7fb64a40 100644 --- a/src/renderer_d3d12.cpp +++ b/src/renderer_d3d12.cpp @@ -2826,7 +2826,11 @@ data.NumQualityLevels = 0; murmur.add(_stencil); murmur.add(program.m_vsh->m_hash); murmur.add(program.m_vsh->m_attrMask, sizeof(program.m_vsh->m_attrMask) ); - murmur.add(program.m_fsh->m_hash); + if (NULL != program.m_fsh) + { + murmur.add(program.m_fsh->m_hash); + } + for (uint32_t ii = 0; ii < _numStreams; ++ii) { murmur.add(_vertexDecls[ii]->m_hash); @@ -2851,66 +2855,76 @@ data.NumQualityLevels = 0; desc.VS.pShaderBytecode = program.m_vsh->m_code->data; desc.VS.BytecodeLength = program.m_vsh->m_code->size; - const Memory* temp = alloc(program.m_fsh->m_code->size); - bx::memSet(temp->data, 0, temp->size); - bx::MemoryReader rd(program.m_fsh->m_code->data, program.m_fsh->m_code->size); - bx::StaticMemoryBlockWriter wr(temp->data, temp->size); + const Memory* temp = NULL; - DxbcContext dxbc; - bx::Error err; - read(&rd, dxbc, &err); - - bool patchShader = !dxbc.shader.aon9; - if (BX_ENABLED(BGFX_CONFIG_DEBUG) - && patchShader) + if (NULL != program.m_fsh) { - union { uint32_t offset; void* ptr; } cast = { 0 }; - filter(dxbc.shader, dxbc.shader, patchCb0, cast.ptr); + temp = alloc(program.m_fsh->m_code->size); + bx::memSet(temp->data, 0, temp->size); + bx::MemoryReader rd(program.m_fsh->m_code->data, program.m_fsh->m_code->size); + bx::StaticMemoryBlockWriter wr(temp->data, temp->size); - write(&wr, dxbc, &err); + DxbcContext dxbc; + bx::Error err; + read(&rd, dxbc, &err); - dxbcHash(temp->data + 20, temp->size - 20, temp->data + 4); - - patchShader = 0 == bx::memCmp(program.m_fsh->m_code->data, temp->data, 16); - BX_CHECK(patchShader, "DXBC fragment shader patching error (ShaderHandle: %d).", program.m_fsh - m_shaders); - - if (!patchShader) + bool patchShader = !dxbc.shader.aon9; + if (BX_ENABLED(BGFX_CONFIG_DEBUG) + && patchShader) { - for (uint32_t ii = 20; ii < temp->size; ii += 16) - { - if (0 != bx::memCmp(&program.m_fsh->m_code->data[ii], &temp->data[ii], 16) ) - { -// bx::debugPrintfData(&program.m_fsh->m_code->data[ii], temp->size-ii, ""); -// bx::debugPrintfData(&temp->data[ii], temp->size-ii, ""); - break; - } - } + union { uint32_t offset; void* ptr; } cast = { 0 }; + filter(dxbc.shader, dxbc.shader, patchCb0, cast.ptr); + write(&wr, dxbc, &err); + + dxbcHash(temp->data + 20, temp->size - 20, temp->data + 4); + + patchShader = 0 == bx::memCmp(program.m_fsh->m_code->data, temp->data, 16); + BX_CHECK(patchShader, "DXBC fragment shader patching error (ShaderHandle: %d).", program.m_fsh - m_shaders); + + if (!patchShader) + { + for (uint32_t ii = 20; ii < temp->size; ii += 16) + { + if (0 != bx::memCmp(&program.m_fsh->m_code->data[ii], &temp->data[ii], 16) ) + { + // bx::debugPrintfData(&program.m_fsh->m_code->data[ii], temp->size-ii, ""); + // bx::debugPrintfData(&temp->data[ii], temp->size-ii, ""); + break; + } + } + + desc.PS.pShaderBytecode = program.m_fsh->m_code->data; + desc.PS.BytecodeLength = program.m_fsh->m_code->size; + } + } + + if (patchShader) + { + bx::memCopy(temp->data, program.m_fsh->m_code->data, program.m_fsh->m_code->size); + + bx::seek(&wr, 0, bx::Whence::Begin); + union { uint32_t offset; void* ptr; } cast = + { + uint32_t(program.m_vsh->m_size)/16 + }; + filter(dxbc.shader, dxbc.shader, patchCb0, cast.ptr); + write(&wr, dxbc, &err); + dxbcHash(temp->data + 20, temp->size - 20, temp->data + 4); + + desc.PS.pShaderBytecode = temp->data; + desc.PS.BytecodeLength = temp->size; + } + else + { desc.PS.pShaderBytecode = program.m_fsh->m_code->data; desc.PS.BytecodeLength = program.m_fsh->m_code->size; } } - - if (patchShader) - { - bx::memCopy(temp->data, program.m_fsh->m_code->data, program.m_fsh->m_code->size); - - bx::seek(&wr, 0, bx::Whence::Begin); - union { uint32_t offset; void* ptr; } cast = - { - uint32_t(program.m_vsh->m_size)/16 - }; - filter(dxbc.shader, dxbc.shader, patchCb0, cast.ptr); - write(&wr, dxbc, &err); - dxbcHash(temp->data + 20, temp->size - 20, temp->data + 4); - - desc.PS.pShaderBytecode = temp->data; - desc.PS.BytecodeLength = temp->size; - } else { - desc.PS.pShaderBytecode = program.m_fsh->m_code->data; - desc.PS.BytecodeLength = program.m_fsh->m_code->size; + desc.PS.pShaderBytecode = NULL; + desc.PS.BytecodeLength = 0; } desc.DS.pShaderBytecode = NULL; @@ -3018,7 +3032,10 @@ data.NumQualityLevels = 0; m_pipelineStateCache.add(hash, pso); - release(temp); + if (NULL != temp) + { + release(temp); + } ID3DBlob* blob; HRESULT hr = pso->GetCachedBlob(&blob); @@ -6285,10 +6302,13 @@ data.NumQualityLevels = 0; commit(*vcb); } - UniformBuffer* fcb = program.m_fsh->m_constantBuffer; - if (NULL != fcb) + if (NULL != program.m_fsh) { - commit(*fcb); + UniformBuffer* fcb = program.m_fsh->m_constantBuffer; + if (NULL != fcb) + { + commit(*fcb); + } } hasPredefined = 0 < program.m_numPredefined; diff --git a/src/renderer_d3d9.cpp b/src/renderer_d3d9.cpp index 7bd7491cd..264d96345 100644 --- a/src/renderer_d3d9.cpp +++ b/src/renderer_d3d9.cpp @@ -1027,7 +1027,7 @@ namespace bgfx { namespace d3d9 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 @@ -4105,7 +4105,10 @@ namespace bgfx { namespace d3d9 { ProgramD3D9& program = m_program[programIdx]; device->SetVertexShader(program.m_vsh->m_vertexShader); - device->SetPixelShader(program.m_fsh->m_pixelShader); + device->SetPixelShader(NULL == program.m_fsh + ? NULL + : program.m_fsh->m_pixelShader + ); } programChanged = @@ -4124,10 +4127,13 @@ namespace bgfx { namespace d3d9 commit(*vcb); } - UniformBuffer* fcb = program.m_fsh->m_constantBuffer; - if (NULL != fcb) + if (NULL != program.m_fsh) { - commit(*fcb); + UniformBuffer* fcb = program.m_fsh->m_constantBuffer; + if (NULL != fcb) + { + commit(*fcb); + } } } @@ -4406,11 +4412,11 @@ namespace bgfx { namespace d3d9 ); const D3DADAPTER_IDENTIFIER9& identifier = m_identifier; - tvm.printf(0, pos++, 0x8b, " Device: %s (%s)", identifier.Description, identifier.Driver); + tvm.printf(0, pos++, 0x8f, " Device: %s (%s)", identifier.Description, identifier.Driver); char processMemoryUsed[16]; bx::prettify(processMemoryUsed, BX_COUNTOF(processMemoryUsed), bx::getProcessMemoryUsed() ); - tvm.printf(0, pos++, 0x8b, " Memory: %s (process) ", processMemoryUsed); + tvm.printf(0, pos++, 0x8f, " Memory: %s (process) ", processMemoryUsed); pos = 10; tvm.printf(10, pos++, 0x8b, " Frame: %7.3f, % 7.3f \x1f, % 7.3f \x1e [ms] / % 6.2f FPS " diff --git a/src/renderer_d3d9.h b/src/renderer_d3d9.h index b9321403e..248b61467 100644 --- a/src/renderer_d3d9.h +++ b/src/renderer_d3d9.h @@ -259,17 +259,19 @@ namespace bgfx { namespace d3d9 struct ProgramD3D9 { - void create(const ShaderD3D9& _vsh, const ShaderD3D9& _fsh) + void create(const ShaderD3D9* _vsh, const ShaderD3D9* _fsh) { - BX_CHECK(NULL != _vsh.m_vertexShader, "Vertex shader doesn't exist."); - m_vsh = &_vsh; + m_vsh = _vsh; + m_fsh = _fsh; - BX_CHECK(NULL != _fsh.m_pixelShader, "Fragment shader doesn't exist."); - m_fsh = &_fsh; + bx::memCopy(&m_predefined[0], _vsh->m_predefined, _vsh->m_numPredefined*sizeof(PredefinedUniform) ); + m_numPredefined = _vsh->m_numPredefined; - bx::memCopy(&m_predefined[0], _vsh.m_predefined, _vsh.m_numPredefined*sizeof(PredefinedUniform) ); - bx::memCopy(&m_predefined[_vsh.m_numPredefined], _fsh.m_predefined, _fsh.m_numPredefined*sizeof(PredefinedUniform) ); - m_numPredefined = _vsh.m_numPredefined + _fsh.m_numPredefined; + if (NULL != _fsh) + { + bx::memCopy(&m_predefined[_vsh->m_numPredefined], _fsh->m_predefined, _fsh->m_numPredefined*sizeof(PredefinedUniform) ); + m_numPredefined += _fsh->m_numPredefined; + } } void destroy()