From 7adfc7856a6587ac214bb2024766daaec0b57531 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Branimir=20Karad=C5=BEi=C4=87?= Date: Wed, 16 Sep 2015 20:59:22 -0700 Subject: [PATCH] D3D12: Sampler border color. --- src/renderer_d3d12.cpp | 42 +++++++++++++++++++++++++++++++----------- src/renderer_d3d12.h | 2 +- 2 files changed, 32 insertions(+), 12 deletions(-) diff --git a/src/renderer_d3d12.cpp b/src/renderer_d3d12.cpp index a2efa2e2..9c6a0c3e 100644 --- a/src/renderer_d3d12.cpp +++ b/src/renderer_d3d12.cpp @@ -1467,7 +1467,7 @@ namespace bgfx { namespace d3d12 TextureD3D12& texture = m_textures[_blitter.m_texture.idx]; uint32_t samplerFlags[BGFX_CONFIG_MAX_TEXTURE_SAMPLERS] = { texture.m_flags & BGFX_TEXTURE_SAMPLER_BITS_MASK }; - uint16_t samplerStateIdx = getSamplerState(samplerFlags); + uint16_t samplerStateIdx = getSamplerState(samplerFlags, BGFX_CONFIG_MAX_TEXTURE_SAMPLERS, NULL); m_commandList->SetGraphicsRootDescriptorTable(Rdt::Sampler, m_samplerAllocator.get(samplerStateIdx) ); D3D12_GPU_DESCRIPTOR_HANDLE srvHandle; scratchBuffer.allocSrv(srvHandle, texture); @@ -2265,7 +2265,7 @@ data.NumQualityLevels = 0; return pso; } - uint16_t getSamplerState(const uint32_t* _flags, uint32_t _num = BGFX_CONFIG_MAX_TEXTURE_SAMPLERS) + uint16_t getSamplerState(const uint32_t* _flags, uint32_t _num, const float _palette[][4]) { bx::HashMurmur2A murmur; murmur.begin(); @@ -2275,7 +2275,7 @@ data.NumQualityLevels = 0; uint16_t sampler = m_samplerStateCache.find(hash); if (UINT16_MAX == sampler) { - sampler = m_samplerAllocator.alloc(_flags, _num); + sampler = m_samplerAllocator.alloc(_flags, _num, _palette); m_samplerStateCache.add(hash, sampler); } @@ -2784,7 +2784,7 @@ data.NumQualityLevels = 0; return idx; } - uint16_t DescriptorAllocatorD3D12::alloc(const uint32_t* _flags, uint32_t _num) + uint16_t DescriptorAllocatorD3D12::alloc(const uint32_t* _flags, uint32_t _num, const float _palette[][4]) { uint16_t idx = m_handleAlloc->alloc(); @@ -2808,10 +2808,30 @@ data.NumQualityLevels = 0; sd.MipLODBias = 0.0f; sd.MaxAnisotropy = 1; //m_maxAnisotropy; sd.ComparisonFunc = 0 == cmpFunc ? D3D12_COMPARISON_FUNC_NEVER : s_cmpFunc[cmpFunc]; - sd.BorderColor[0] = 0.0f; - sd.BorderColor[1] = 0.0f; - sd.BorderColor[2] = 0.0f; - sd.BorderColor[3] = 0.0f; + + uint32_t index = (flags & BGFX_TEXTURE_BORDER_COLOR_MASK) >> BGFX_TEXTURE_BORDER_COLOR_SHIFT; + const bool needBorderColor = false + || BGFX_TEXTURE_U_BORDER == (flags & BGFX_TEXTURE_U_BORDER) + || BGFX_TEXTURE_V_BORDER == (flags & BGFX_TEXTURE_V_BORDER) + || BGFX_TEXTURE_W_BORDER == (flags & BGFX_TEXTURE_W_BORDER) + ; + + if (NULL != _palette + && needBorderColor) + { + const float* rgba = _palette[index]; + sd.BorderColor[0] = rgba[0]; + sd.BorderColor[1] = rgba[1]; + sd.BorderColor[2] = rgba[2]; + sd.BorderColor[3] = rgba[3]; + } + else + { + sd.BorderColor[0] = 0.0f; + sd.BorderColor[1] = 0.0f; + sd.BorderColor[2] = 0.0f; + sd.BorderColor[3] = 0.0f; + } sd.MinLOD = 0; sd.MaxLOD = D3D12_FLOAT32_MAX; @@ -4441,7 +4461,7 @@ data.NumQualityLevels = 0; } } - uint16_t samplerStateIdx = getSamplerState(samplerFlags, BGFX_MAX_COMPUTE_BINDINGS); + uint16_t samplerStateIdx = getSamplerState(samplerFlags, BGFX_MAX_COMPUTE_BINDINGS, _render->m_colorPalette); if (samplerStateIdx != currentSamplerStateIdx) { currentSamplerStateIdx = samplerStateIdx; @@ -4625,7 +4645,7 @@ data.NumQualityLevels = 0; samplerFlags[stage] = (0 == (BGFX_SAMPLER_DEFAULT_FLAGS & bind.m_un.m_draw.m_flags) ? bind.m_un.m_draw.m_flags : texture.m_flags - ) & BGFX_TEXTURE_SAMPLER_BITS_MASK + ) & (BGFX_TEXTURE_SAMPLER_BITS_MASK|BGFX_TEXTURE_BORDER_COLOR_MASK) ; } else @@ -4638,7 +4658,7 @@ data.NumQualityLevels = 0; if (srvHandle[0].ptr != 0) { - uint16_t samplerStateIdx = getSamplerState(samplerFlags); + uint16_t samplerStateIdx = getSamplerState(samplerFlags, BGFX_CONFIG_MAX_TEXTURE_SAMPLERS, _render->m_colorPalette); if (samplerStateIdx != currentSamplerStateIdx) { currentSamplerStateIdx = samplerStateIdx; diff --git a/src/renderer_d3d12.h b/src/renderer_d3d12.h index fe89ebb9..00f9a17f 100644 --- a/src/renderer_d3d12.h +++ b/src/renderer_d3d12.h @@ -107,7 +107,7 @@ namespace bgfx { namespace d3d12 void destroy(); uint16_t alloc(ID3D12Resource* _ptr, const D3D12_SHADER_RESOURCE_VIEW_DESC* _desc); - uint16_t alloc(const uint32_t* _flags, uint32_t _num = BGFX_CONFIG_MAX_TEXTURE_SAMPLERS); + uint16_t alloc(const uint32_t* _flags, uint32_t _num, const float _palette[][4]); void free(uint16_t _handle); void reset();