From 3aec2b89bf6f72623b6d47e179321141ff4c8b00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Branimir=20Karad=C5=BEi=C4=87?= Date: Wed, 30 Aug 2017 21:46:57 -0700 Subject: [PATCH] Added bgfx::setName to set resource debug name. --- examples/common/bgfx_utils.cpp | 7 +++- include/bgfx/bgfx.h | 18 ++++++++++ src/bgfx.cpp | 26 +++++++++++++++ src/bgfx_p.h | 61 ++++++++++++++++++++++++++++++++++ src/renderer_d3d11.cpp | 18 ++++++++++ src/renderer_d3d11.h | 2 +- src/renderer_d3d12.cpp | 5 +++ src/renderer_d3d9.cpp | 5 +++ src/renderer_gl.cpp | 5 +++ src/renderer_mtl.mm | 5 +++ src/renderer_noop.cpp | 4 +++ src/renderer_vk.cpp | 5 +++ 12 files changed, 159 insertions(+), 2 deletions(-) diff --git a/examples/common/bgfx_utils.cpp b/examples/common/bgfx_utils.cpp index 155fce965..9e8f79092 100644 --- a/examples/common/bgfx_utils.cpp +++ b/examples/common/bgfx_utils.cpp @@ -123,7 +123,10 @@ static bgfx::ShaderHandle loadShader(bx::FileReaderI* _reader, const char* _name bx::strCat(filePath, BX_COUNTOF(filePath), _name); bx::strCat(filePath, BX_COUNTOF(filePath), ".bin"); - return bgfx::createShader(loadMem(_reader, filePath) ); + bgfx::ShaderHandle handle = bgfx::createShader(loadMem(_reader, filePath) ); + bgfx::setName(handle, filePath); + + return handle; } bgfx::ShaderHandle loadShader(const char* _name) @@ -217,6 +220,8 @@ bgfx::TextureHandle loadTexture(bx::FileReaderI* _reader, const char* _filePath, ); } + bgfx::setName(handle, _filePath); + if (NULL != _info) { bgfx::calcTextureSize( diff --git a/include/bgfx/bgfx.h b/include/bgfx/bgfx.h index 040b1fa3b..e39b83984 100644 --- a/include/bgfx/bgfx.h +++ b/include/bgfx/bgfx.h @@ -1552,6 +1552,15 @@ namespace bgfx , uint16_t _max = 0 ); + /// Set shader debug name. + /// + /// @param[in] _handle Shader handle. + /// @param[in] _name Shader name. + /// + /// @attention C99 equivalent is `bgfx_set_shader_name`. + /// + void setName(ShaderHandle _handle, const char* _name); + /// Destroy shader. Once program is created with shader it is safe to /// destroy shader. /// @@ -1896,6 +1905,15 @@ namespace bgfx /// uint32_t readTexture(TextureHandle _handle, void* _data, uint8_t _mip = 0); + /// Set texture debug name. + /// + /// @param[in] _handle Texture handle. + /// @param[in] _name Texture name. + /// + /// @attention C99 equivalent is `bgfx_set_texture_name`. + /// + void setName(TextureHandle _handle, const char* _name); + /// Destroy texture. /// /// @param[in] _handle Texture handle. diff --git a/src/bgfx.cpp b/src/bgfx.cpp index 94012e372..53d06768d 100644 --- a/src/bgfx.cpp +++ b/src/bgfx.cpp @@ -2535,6 +2535,20 @@ namespace bgfx } break; + case CommandBuffer::SetName: + { + Handle handle; + _cmdbuf.read(handle); + + uint16_t len; + _cmdbuf.read(len); + + const char* name = (const char*)_cmdbuf.skip(len); + + m_renderCtx->setName(handle, name); + } + break; + default: BX_CHECK(false, "Invalid command: %d", command); break; @@ -3044,6 +3058,12 @@ error: return s_ctx->getShaderUniforms(_handle, _uniforms, _max); } + void setName(ShaderHandle _handle, const char* _name) + { + BGFX_CHECK_MAIN_THREAD(); + s_ctx->setName(_handle, _name); + } + void destroy(ShaderHandle _handle) { BGFX_CHECK_MAIN_THREAD(); @@ -3373,6 +3393,12 @@ error: return s_ctx->createTexture(mem, _flags, 0, NULL, BackbufferRatio::Count); } + void setName(TextureHandle _handle, const char* _name) + { + BGFX_CHECK_MAIN_THREAD(); + s_ctx->setName(_handle, _name); + } + void destroy(TextureHandle _handle) { BGFX_CHECK_MAIN_THREAD(); diff --git a/src/bgfx_p.h b/src/bgfx_p.h index 5f0105133..b7c77b281 100644 --- a/src/bgfx_p.h +++ b/src/bgfx_p.h @@ -239,6 +239,32 @@ namespace bgfx typedef uint32_t RenderItemCount; #endif // BGFX_CONFIG_MAX_DRAW_CALLS < (64<<10) + struct Handle + { + enum Enum + { + Shader, + Texture, + + Count + }; + + uint16_t type; + uint16_t idx; + }; + + inline Handle convert(ShaderHandle _handle) + { + Handle handle = { Handle::Shader, _handle.idx }; + return handle; + } + + inline Handle convert(TextureHandle _handle) + { + Handle handle = { Handle::Texture, _handle.idx }; + return handle; + } + struct Clear { uint8_t m_index[8]; @@ -612,6 +638,7 @@ namespace bgfx CreateUniform, UpdateViewName, InvalidateOcclusionQuery, + SetName, End, RendererShutdownEnd, DestroyVertexDecl, @@ -2257,6 +2284,7 @@ namespace bgfx virtual void updateUniform(uint16_t _loc, const void* _data, uint32_t _size) = 0; virtual void setMarker(const char* _marker, uint32_t _size) = 0; virtual void invalidateOcclusionQuery(OcclusionQueryHandle _handle) = 0; + virtual void setName(Handle _handle, const char* _name) = 0; virtual void submit(Frame* _render, ClearQuad& _clearQuad, TextVideoMemBlitter& _textVideoMemBlitter) = 0; virtual void blitSetup(TextVideoMemBlitter& _blitter) = 0; virtual void blitRender(TextVideoMemBlitter& _blitter, uint32_t _numIndices) = 0; @@ -3134,6 +3162,25 @@ namespace bgfx return sr.m_num; } + void setName(Handle _handle, const char* _name) + { + CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::SetName); + cmdbuf.write(_handle); + uint16_t len = (uint8_t)bx::strLen(_name)+1; + cmdbuf.write(len); + cmdbuf.write(_name, len); + } + + BGFX_API_FUNC(void setName(ShaderHandle _handle, const char* _name) ) + { + BGFX_CHECK_HANDLE("setName", m_shaderHandle, _handle); + + ShaderRef& sr = m_shaderRef[_handle.idx]; + sr.m_name.set(_name); + + setName(convert(_handle), _name); + } + BGFX_API_FUNC(void destroyShader(ShaderHandle _handle) ) { BGFX_CHECK_HANDLE("destroyShader", m_shaderHandle, _handle); @@ -3381,6 +3428,16 @@ namespace bgfx return handle; } + BGFX_API_FUNC(void setName(TextureHandle _handle, const char* _name) ) + { + BGFX_CHECK_HANDLE("setName", m_textureHandle, _handle); + + TextureRef& ref = m_textureRef[_handle.idx]; + ref.m_name.set(_name); + + setName(convert(_handle), _name); + } + BGFX_API_FUNC(void destroyTexture(TextureHandle _handle) ) { BGFX_CHECK_HANDLE("destroyTexture", m_textureHandle, _handle); @@ -3452,6 +3509,8 @@ namespace bgfx int32_t refs = --ref.m_refCount; if (0 == refs) { + ref.m_name.clear(); + bool ok = m_submit->free(_handle); BX_UNUSED(ok); BX_CHECK(ok, "Texture handle %d is already destroyed!", _handle.idx); @@ -4315,6 +4374,7 @@ namespace bgfx struct ShaderRef { UniformHandle* m_uniforms; + String m_name; uint32_t m_hash; int16_t m_refCount; uint16_t m_num; @@ -4337,6 +4397,7 @@ namespace bgfx struct TextureRef { + String m_name; int16_t m_refCount; uint8_t m_bbRatio; uint8_t m_format; diff --git a/src/renderer_d3d11.cpp b/src/renderer_d3d11.cpp index 2f18e9c3f..331d986ef 100644 --- a/src/renderer_d3d11.cpp +++ b/src/renderer_d3d11.cpp @@ -2133,6 +2133,24 @@ BX_PRAGMA_DIAGNOSTIC_POP(); m_occlusionQuery.invalidate(_handle); } + virtual void setName(Handle _handle, const char* _name) override + { + switch (_handle.type) + { + case Handle::Shader: + setDebugObjectName(m_shaders[_handle.idx].m_ptr, _name); + break; + + case Handle::Texture: + setDebugObjectName(m_textures[_handle.idx].m_ptr, _name); + break; + + default: + BX_CHECK(false, "Invalid handle type?! %d", _handle.type); + break; + } + } + void submitBlit(BlitState& _bs, uint16_t _view); void submit(Frame* _render, ClearQuad& _clearQuad, TextVideoMemBlitter& _textVideoMemBlitter) override; diff --git a/src/renderer_d3d11.h b/src/renderer_d3d11.h index 1af417983..a0124ea90 100644 --- a/src/renderer_d3d11.h +++ b/src/renderer_d3d11.h @@ -154,7 +154,7 @@ namespace bgfx { namespace d3d11 ID3D11ComputeShader* m_computeShader; ID3D11PixelShader* m_pixelShader; ID3D11VertexShader* m_vertexShader; - IUnknown* m_ptr; + ID3D11DeviceChild* m_ptr; }; const Memory* m_code; ID3D11Buffer* m_buffer; diff --git a/src/renderer_d3d12.cpp b/src/renderer_d3d12.cpp index 47df8188c..0fff07bfa 100644 --- a/src/renderer_d3d12.cpp +++ b/src/renderer_d3d12.cpp @@ -1683,6 +1683,11 @@ namespace bgfx { namespace d3d12 m_occlusionQuery.invalidate(_handle); } + virtual void setName(Handle _handle, const char* _name) override + { + BX_UNUSED(_handle, _name) + } + void submitBlit(BlitState& _bs, uint16_t _view); void submit(Frame* _render, ClearQuad& _clearQuad, TextVideoMemBlitter& _textVideoMemBlitter) override; diff --git a/src/renderer_d3d9.cpp b/src/renderer_d3d9.cpp index 69ae756cb..34eacf6ab 100644 --- a/src/renderer_d3d9.cpp +++ b/src/renderer_d3d9.cpp @@ -1292,6 +1292,11 @@ namespace bgfx { namespace d3d9 m_occlusionQuery.invalidate(_handle); } + virtual void setName(Handle _handle, const char* _name) override + { + BX_UNUSED(_handle, _name) + } + void submitBlit(BlitState& _bs, uint16_t _view); void submit(Frame* _render, ClearQuad& _clearQuad, TextVideoMemBlitter& _textVideoMemBlitter) override; diff --git a/src/renderer_gl.cpp b/src/renderer_gl.cpp index 5a3d8ae59..3579fa468 100644 --- a/src/renderer_gl.cpp +++ b/src/renderer_gl.cpp @@ -2982,6 +2982,11 @@ namespace bgfx { namespace gl m_occlusionQuery.invalidate(_handle); } + virtual void setName(Handle _handle, const char* _name) override + { + BX_UNUSED(_handle, _name) + } + void submitBlit(BlitState& _bs, uint16_t _view); void submit(Frame* _render, ClearQuad& _clearQuad, TextVideoMemBlitter& _textVideoMemBlitter) override; diff --git a/src/renderer_mtl.mm b/src/renderer_mtl.mm index 0ac0b30b0..f015892fa 100644 --- a/src/renderer_mtl.mm +++ b/src/renderer_mtl.mm @@ -989,6 +989,11 @@ namespace bgfx { namespace mtl m_occlusionQuery.invalidate(_handle); } + virtual void setName(Handle _handle, const char* _name) override + { + BX_UNUSED(_handle, _name) + } + void submitBlit(BlitState& _bs, uint16_t _view); void submit(Frame* _render, ClearQuad& _clearQuad, TextVideoMemBlitter& _textVideoMemBlitter) override; diff --git a/src/renderer_noop.cpp b/src/renderer_noop.cpp index a8d2afec3..cfa763bc3 100644 --- a/src/renderer_noop.cpp +++ b/src/renderer_noop.cpp @@ -204,6 +204,10 @@ namespace bgfx { namespace noop { } + virtual void setName(Handle /*_handle*/, const char* /*_name*/) override + { + } + void submit(Frame* /*_render*/, ClearQuad& /*_clearQuad*/, TextVideoMemBlitter& /*_textVideoMemBlitter*/) override { } diff --git a/src/renderer_vk.cpp b/src/renderer_vk.cpp index dea79a594..a9d0fefc7 100644 --- a/src/renderer_vk.cpp +++ b/src/renderer_vk.cpp @@ -2122,6 +2122,11 @@ VK_IMPORT_DEVICE BX_UNUSED(_handle); } + virtual void setName(Handle _handle, const char* _name) override + { + BX_UNUSED(_handle, _name) + } + void submitBlit(BlitState& _bs, uint16_t _view); void submit(Frame* _render, ClearQuad& _clearQuad, TextVideoMemBlitter& _textVideoMemBlitter) override;