This commit is contained in:
Branimir Karadžić 2016-09-08 17:00:16 -07:00
parent 813d145ac9
commit 425868f391
6 changed files with 29 additions and 20 deletions

View File

@ -1161,7 +1161,10 @@ namespace bgfx
const UniformInfo& add(UniformHandle _handle, const char* _name, const void* _data) const UniformInfo& add(UniformHandle _handle, const char* _name, const void* _data)
{ {
m_uniforms.insert(bx::hashMurmur2A(_name), _handle.idx); BX_CHECK(isValid(_handle), "Uniform handle is invalid (name: %s)!", _name);
const uint32_t key = bx::hashMurmur2A(_name);
m_uniforms.removeByKey(key);
m_uniforms.insert(key, _handle.idx);
UniformInfo& info = m_info[_handle.idx]; UniformInfo& info = m_info[_handle.idx];
info.m_data = _data; info.m_data = _data;
@ -1170,6 +1173,11 @@ namespace bgfx
return info; return info;
} }
void remove(UniformHandle _handle)
{
m_uniforms.removeByHandle(_handle.idx);
}
private: private:
typedef bx::HandleHashMapT<BGFX_CONFIG_MAX_UNIFORMS*2> UniformHashMap; typedef bx::HandleHashMapT<BGFX_CONFIG_MAX_UNIFORMS*2> UniformHashMap;
UniformHashMap m_uniforms; UniformHashMap m_uniforms;
@ -2981,7 +2989,9 @@ namespace bgfx
pr.m_fsh = _fsh; pr.m_fsh = _fsh;
pr.m_refCount = 1; pr.m_refCount = 1;
m_programHashMap.insert(uint32_t(_fsh.idx<<16)|_vsh.idx, handle.idx); const uint32_t key = uint32_t(_fsh.idx<<16)|_vsh.idx;
bool ok = m_programHashMap.insert(key, handle.idx);
BX_CHECK(ok, "Program already exists (key: %x, handle: %3d)!", key, handle.idx); BX_UNUSED(ok);
CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::CreateProgram); CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::CreateProgram);
cmdbuf.write(handle); cmdbuf.write(handle);
@ -3029,7 +3039,9 @@ namespace bgfx
pr.m_fsh = fsh; pr.m_fsh = fsh;
pr.m_refCount = 1; pr.m_refCount = 1;
m_programHashMap.insert(uint32_t(_vsh.idx), handle.idx); const uint32_t key = uint32_t(_vsh.idx);
bool ok = m_programHashMap.insert(key, handle.idx);
BX_CHECK(ok, "Program already exists (key: %x, handle: %3d)!", key, handle.idx); BX_UNUSED(ok);
CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::CreateProgram); CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::CreateProgram);
cmdbuf.write(handle); cmdbuf.write(handle);
@ -3066,7 +3078,7 @@ namespace bgfx
hash |= pr.m_fsh.idx << 16; hash |= pr.m_fsh.idx << 16;
} }
m_programHashMap.removeByKey(hash); m_programHashMap.removeByHandle(_handle.idx);
} }
} }
@ -3399,7 +3411,8 @@ namespace bgfx
uniform.m_type = _type; uniform.m_type = _type;
uniform.m_num = _num; uniform.m_num = _num;
m_uniformHashMap.insert(bx::hashMurmur2A(_name), handle.idx); bool ok = m_uniformHashMap.insert(bx::hashMurmur2A(_name), handle.idx);
BX_CHECK(ok, "Uniform already exists (name: %s)!", _name); BX_UNUSED(ok);
CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::CreateUniform); CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::CreateUniform);
cmdbuf.write(handle); cmdbuf.write(handle);
@ -3657,6 +3670,7 @@ namespace bgfx
{ {
BGFX_CHECK_HANDLE("setUniform", m_uniformHandle, _handle); BGFX_CHECK_HANDLE("setUniform", m_uniformHandle, _handle);
UniformRef& uniform = m_uniformRef[_handle.idx]; UniformRef& uniform = m_uniformRef[_handle.idx];
BX_CHECK(isValid(_handle) && 0 < uniform.m_refCount, "Setting invalid uniform (handle %3d)!", _handle.idx);
BX_CHECK(_num == UINT16_MAX || uniform.m_num >= _num, "Truncated uniform update. %d (max: %d)", _num, uniform.m_num); BX_CHECK(_num == UINT16_MAX || uniform.m_num >= _num, "Truncated uniform update. %d (max: %d)", _num, uniform.m_num);
if (BX_ENABLED(BGFX_CONFIG_DEBUG_UNIFORM) ) if (BX_ENABLED(BGFX_CONFIG_DEBUG_UNIFORM) )
{ {

View File

@ -1231,12 +1231,6 @@ BX_PRAGMA_DIAGNOSTIC_POP();
} }
{ {
UniformHandle handle = BGFX_INVALID_HANDLE;
for (uint32_t ii = 0; ii < PredefinedUniform::Count; ++ii)
{
m_uniformReg.add(handle, getPredefinedUniformName(PredefinedUniform::Enum(ii) ), &m_predefinedUniforms[ii]);
}
g_caps.supported |= (0 g_caps.supported |= (0
| BGFX_CAPS_TEXTURE_3D | BGFX_CAPS_TEXTURE_3D
| BGFX_CAPS_VERTEX_ATTRIB_HALF | BGFX_CAPS_VERTEX_ATTRIB_HALF
@ -1934,6 +1928,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
{ {
BX_FREE(g_allocator, m_uniforms[_handle.idx]); BX_FREE(g_allocator, m_uniforms[_handle.idx]);
m_uniforms[_handle.idx] = NULL; m_uniforms[_handle.idx] = NULL;
m_uniformReg.remove(_handle);
} }
void saveScreenShot(const char* _filePath) BX_OVERRIDE void saveScreenShot(const char* _filePath) BX_OVERRIDE
@ -4152,7 +4147,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
else if (0 == (BGFX_UNIFORM_SAMPLERBIT & type) ) else if (0 == (BGFX_UNIFORM_SAMPLERBIT & type) )
{ {
const UniformInfo* info = s_renderD3D11->m_uniformReg.find(name); const UniformInfo* info = s_renderD3D11->m_uniformReg.find(name);
BX_CHECK(NULL != info, "User defined uniform '%s' is not found, it won't be set.", name); BX_WARN(NULL != info, "User defined uniform '%s' is not found, it won't be set.", name);
if (NULL != info) if (NULL != info)
{ {

View File

@ -987,12 +987,6 @@ namespace bgfx { namespace d3d12
, (void**)&m_rootSignature , (void**)&m_rootSignature
) ); ) );
UniformHandle handle = BGFX_INVALID_HANDLE;
for (uint32_t ii = 0; ii < PredefinedUniform::Count; ++ii)
{
m_uniformReg.add(handle, getPredefinedUniformName(PredefinedUniform::Enum(ii) ), &m_predefinedUniforms[ii]);
}
g_caps.supported |= ( 0 g_caps.supported |= ( 0
| BGFX_CAPS_TEXTURE_3D | BGFX_CAPS_TEXTURE_3D
| BGFX_CAPS_TEXTURE_COMPARE_ALL | BGFX_CAPS_TEXTURE_COMPARE_ALL
@ -1555,6 +1549,7 @@ namespace bgfx { namespace d3d12
{ {
BX_FREE(g_allocator, m_uniforms[_handle.idx]); BX_FREE(g_allocator, m_uniforms[_handle.idx]);
m_uniforms[_handle.idx] = NULL; m_uniforms[_handle.idx] = NULL;
m_uniformReg.remove(_handle);
} }
void saveScreenShot(const char* _filePath) BX_OVERRIDE void saveScreenShot(const char* _filePath) BX_OVERRIDE
@ -3879,7 +3874,7 @@ data.NumQualityLevels = 0;
else if (0 == (BGFX_UNIFORM_SAMPLERBIT & type) ) else if (0 == (BGFX_UNIFORM_SAMPLERBIT & type) )
{ {
const UniformInfo* info = s_renderD3D12->m_uniformReg.find(name); const UniformInfo* info = s_renderD3D12->m_uniformReg.find(name);
BX_CHECK(NULL != info, "User defined uniform '%s' is not found, it won't be set.", name); BX_WARN(NULL != info, "User defined uniform '%s' is not found, it won't be set.", name);
if (NULL != info) if (NULL != info)
{ {

View File

@ -1113,6 +1113,7 @@ namespace bgfx { namespace d3d9
{ {
BX_FREE(g_allocator, m_uniforms[_handle.idx]); BX_FREE(g_allocator, m_uniforms[_handle.idx]);
m_uniforms[_handle.idx] = NULL; m_uniforms[_handle.idx] = NULL;
m_uniformReg.remove(_handle);
} }
void saveScreenShot(const char* _filePath) BX_OVERRIDE void saveScreenShot(const char* _filePath) BX_OVERRIDE
@ -2426,7 +2427,7 @@ namespace bgfx { namespace d3d9
else if (0 == (BGFX_UNIFORM_SAMPLERBIT & type) ) else if (0 == (BGFX_UNIFORM_SAMPLERBIT & type) )
{ {
const UniformInfo* info = s_renderD3D9->m_uniformReg.find(name); const UniformInfo* info = s_renderD3D9->m_uniformReg.find(name);
BX_CHECK(NULL != info, "User defined uniform '%s' is not found, it won't be set.", name); BX_WARN(NULL != info, "User defined uniform '%s' is not found, it won't be set.", name);
if (NULL != info) if (NULL != info)
{ {

View File

@ -2439,6 +2439,7 @@ namespace bgfx { namespace gl
{ {
BX_FREE(g_allocator, m_uniforms[_handle.idx]); BX_FREE(g_allocator, m_uniforms[_handle.idx]);
m_uniforms[_handle.idx] = NULL; m_uniforms[_handle.idx] = NULL;
m_uniformReg.remove(_handle);
} }
void saveScreenShot(const char* _filePath) BX_OVERRIDE void saveScreenShot(const char* _filePath) BX_OVERRIDE

View File

@ -897,6 +897,7 @@ namespace bgfx { namespace mtl
{ {
BX_FREE(g_allocator, m_uniforms[_handle.idx]); BX_FREE(g_allocator, m_uniforms[_handle.idx]);
m_uniforms[_handle.idx] = NULL; m_uniforms[_handle.idx] = NULL;
m_uniformReg.remove(_handle);
} }
//cmdPre //cmdPre
@ -2278,6 +2279,8 @@ namespace bgfx { namespace mtl
else else
{ {
const UniformInfo* info = s_renderMtl->m_uniformReg.find(name); const UniformInfo* info = s_renderMtl->m_uniformReg.find(name);
BX_WARN(NULL != info, "User defined uniform '%s' is not found, it won't be set.", name);
if (NULL != info) if (NULL != info)
{ {
if (NULL == constantBuffer) if (NULL == constantBuffer)