diff --git a/src/bgfx_p.h b/src/bgfx_p.h index 64f66a925..9e6236ad0 100644 --- a/src/bgfx_p.h +++ b/src/bgfx_p.h @@ -1334,33 +1334,6 @@ namespace bgfx bool m_discard; }; - struct MaterialRef - { - MaterialRef() - { - } - - MaterialHandle find(uint32_t _hash) - { - MaterialMap::const_iterator it = m_materialMap.find(_hash); - if (it != m_materialMap.end() ) - { - return it->second; - } - - MaterialHandle result = BGFX_INVALID_HANDLE; - return result; - } - - void add(MaterialHandle _handle, uint32_t _hash) - { - m_materialMap.insert(stl::make_pair(_hash, _handle) ); - } - - typedef stl::unordered_map MaterialMap; - MaterialMap m_materialMap; - }; - struct VertexDeclRef { VertexDeclRef() @@ -1928,6 +1901,7 @@ namespace bgfx VertexShaderHandle createVertexShader(const Memory* _mem) { VertexShaderHandle handle = { m_vertexShaderHandle.alloc() }; + m_vertexShaderRef[handle.idx] = 1; CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::CreateVertexShader); cmdbuf.write(handle); cmdbuf.write(_mem); @@ -1936,14 +1910,29 @@ namespace bgfx void destroyVertexShader(VertexShaderHandle _handle) { - CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::DestroyVertexShader); - cmdbuf.write(_handle); - m_submit->free(_handle); + vertexShaderDecRef(_handle); + } + + void vertexShaderIncRef(VertexShaderHandle _handle) + { + ++m_vertexShaderRef[_handle.idx]; + } + + void vertexShaderDecRef(VertexShaderHandle _handle) + { + int32_t refs = --m_vertexShaderRef[_handle.idx]; + if (0 == refs) + { + CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::DestroyVertexShader); + cmdbuf.write(_handle); + m_submit->free(_handle); + } } FragmentShaderHandle createFragmentShader(const Memory* _mem) { FragmentShaderHandle handle = { m_fragmentShaderHandle.alloc() }; + m_fragmentShaderRef[handle.idx] = 1; CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::CreateFragmentShader); cmdbuf.write(handle); cmdbuf.write(_mem); @@ -1952,25 +1941,34 @@ namespace bgfx void destroyFragmentShader(FragmentShaderHandle _handle) { - CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::DestroyFragmentShader); - cmdbuf.write(_handle); - m_submit->free(_handle); + fragmentShaderDecRef(_handle); + } + + void fragmentShaderIncRef(FragmentShaderHandle _handle) + { + ++m_fragmentShaderRef[_handle.idx]; + } + + void fragmentShaderDecRef(FragmentShaderHandle _handle) + { + int32_t refs = --m_fragmentShaderRef[_handle.idx]; + if (0 == refs) + { + CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::DestroyFragmentShader); + cmdbuf.write(_handle); + m_submit->free(_handle); + } } MaterialHandle createMaterial(VertexShaderHandle _vsh, FragmentShaderHandle _fsh) { MaterialHandle handle; -// uint32_t hash = _vsh.idx<<16 | _fsh.idx; -// -// MaterialHandle handle = m_materialRef.find(hash); -// -// if (invalidHandle != handle.idx) -// { -// return handle; -// } -// handle.idx = m_materialHandle.alloc(); -// m_materialRef.add(handle, hash); + + vertexShaderIncRef(_vsh); + fragmentShaderIncRef(_fsh); + m_materialRef[handle.idx].m_vsh = _vsh; + m_materialRef[handle.idx].m_fsh = _fsh; CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::CreateMaterial); cmdbuf.write(handle); @@ -1984,6 +1982,9 @@ namespace bgfx CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::DestroyMaterial); cmdbuf.write(_handle); m_submit->free(_handle); + + vertexShaderDecRef(m_materialRef[_handle.idx].m_vsh); + fragmentShaderDecRef(m_materialRef[_handle.idx].m_fsh); } TextureHandle createTexture(const Memory* _mem, uint32_t _flags, uint16_t* _width, uint16_t* _height) @@ -2787,7 +2788,14 @@ namespace bgfx HandleAlloc m_renderTargetHandle; HandleAlloc m_uniformHandle; - MaterialRef m_materialRef; + int32_t m_vertexShaderRef[BGFX_CONFIG_MAX_VERTEX_SHADERS]; + int32_t m_fragmentShaderRef[BGFX_CONFIG_MAX_FRAGMENT_SHADERS]; + struct MaterialRef + { + VertexShaderHandle m_vsh; + FragmentShaderHandle m_fsh; + }; + MaterialRef m_materialRef[BGFX_CONFIG_MAX_MATERIALS]; VertexDeclRef m_declRef; RenderTargetHandle m_rt[BGFX_CONFIG_MAX_VIEWS]; diff --git a/src/renderer_d3d11.cpp b/src/renderer_d3d11.cpp index 3cfcc77d2..bc27c5b17 100644 --- a/src/renderer_d3d11.cpp +++ b/src/renderer_d3d11.cpp @@ -541,8 +541,9 @@ namespace bgfx { D3D11_INPUT_ELEMENT_DESC vertexElements[Attrib::Count+1+BGFX_CONFIG_MAX_INSTANCE_DATA_COUNT]; D3D11_INPUT_ELEMENT_DESC* elem = fillVertexDecl(vertexElements, Attrib::Count, _vertexDecl); - /*DX_CHECK*/(m_device->CreateInputLayout(vertexElements - , uint32_t(elem-vertexElements) + ptrdiff_t num = elem-vertexElements; + DX_CHECK(m_device->CreateInputLayout(vertexElements + , uint32_t(num) , _material.m_vsh->m_code->data , _material.m_vsh->m_code->size , &layout @@ -1162,6 +1163,7 @@ namespace bgfx m_constantBuffer->finish(); const DWORD* code = (const DWORD*)stream.getDataPtr(); + stream.skip(shaderSize); if (_fragment) { diff --git a/tools/shaderc.cpp b/tools/shaderc.cpp index 5abdea67e..c1e89a61b 100644 --- a/tools/shaderc.cpp +++ b/tools/shaderc.cpp @@ -3,6 +3,8 @@ * License: http://www.opensource.org/licenses/BSD-2-Clause */ +#define SHADERC_DEBUG 0 + #define NOMINMAX #include #include @@ -19,7 +21,7 @@ extern "C" #include } // extern "C" -#if 1 +#if SHADERC_DEBUG # define BX_TRACE(_format, ...) fprintf(stderr, "" _format "\n", ##__VA_ARGS__) #endif // DEBUG @@ -251,6 +253,15 @@ public: write(&_value, sizeof(Ty) ); } + void writeString(const char* _str) + { + uint16_t len = (uint16_t)strlen(_str); + write(len); + write(_str); + char term = '\0'; + write(term); + } + // template // void write(Ty _value) // { @@ -1339,27 +1350,33 @@ int main(int _argc, const char* _argv[]) } } +#if SHADERC_DEBUG + stream->writeString(filePath); +#endif // SHADERC_DEBUG + stream->close(); delete stream; } - if (compiled - && depends) + if (compiled) { - std::string ofp = outFilePath; - ofp += ".d"; - FileWriter stream(ofp.c_str() ); - if (stream.open() ) + if (depends) { - stream.write(outFilePath); - stream.write(":"); - stream.write(preprocessor.m_depends.c_str() ); - stream.write("\n"); - stream.close(); + std::string ofp = outFilePath; + ofp += ".d"; + FileWriter stream(ofp.c_str() ); + if (stream.open() ) + { + stream.write(outFilePath); + stream.write(":"); + stream.write(preprocessor.m_depends.c_str() ); + stream.write("\n"); + stream.close(); + } } - } - return EXIT_SUCCESS; + return EXIT_SUCCESS; + } } fprintf(stderr, "Failed to build shader.\n");