From 5aa0c15dd56ce9bb0b59fb7782cbaa81b14c4cc7 Mon Sep 17 00:00:00 2001 From: bkaradzic Date: Sat, 16 Feb 2013 13:52:35 -0800 Subject: [PATCH] DX11 unified caching sampler state. --- src/renderer_d3d11.cpp | 96 ++++++++++++++++++------------------------ 1 file changed, 40 insertions(+), 56 deletions(-) diff --git a/src/renderer_d3d11.cpp b/src/renderer_d3d11.cpp index 235c06a48..789892215 100644 --- a/src/renderer_d3d11.cpp +++ b/src/renderer_d3d11.cpp @@ -759,6 +759,44 @@ namespace bgfx m_deviceCtx->RSSetState(rs); } + ID3D11SamplerState* getSamplerState(uint32_t _flags) + { + _flags &= BGFX_TEXTURE_MIN_MASK|BGFX_TEXTURE_MAG_MASK|BGFX_TEXTURE_MIP_MASK + | BGFX_TEXTURE_U_MASK|BGFX_TEXTURE_V_MASK|BGFX_TEXTURE_W_MASK + ; + + uint8_t minFilter = s_textureFilter[0][(_flags&BGFX_TEXTURE_MIN_MASK)>>BGFX_TEXTURE_MIN_SHIFT]; + uint8_t magFilter = s_textureFilter[1][(_flags&BGFX_TEXTURE_MAG_MASK)>>BGFX_TEXTURE_MAG_SHIFT]; + uint8_t mipFilter = s_textureFilter[2][(_flags&BGFX_TEXTURE_MIP_MASK)>>BGFX_TEXTURE_MIP_SHIFT]; + + D3D11_SAMPLER_DESC sd; + sd.Filter = (D3D11_FILTER)(minFilter|magFilter|mipFilter); + sd.AddressU = s_textureAddress[(_flags&BGFX_TEXTURE_U_MASK)>>BGFX_TEXTURE_U_SHIFT]; + sd.AddressV = s_textureAddress[(_flags&BGFX_TEXTURE_V_MASK)>>BGFX_TEXTURE_V_SHIFT]; + sd.AddressW = s_textureAddress[(_flags&BGFX_TEXTURE_W_MASK)>>BGFX_TEXTURE_W_SHIFT]; + sd.MipLODBias = 0.0f; + sd.MaxAnisotropy = 1; + sd.ComparisonFunc = D3D11_COMPARISON_NEVER; + 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 = D3D11_FLOAT32_MAX; + uint32_t hash = bx::hashMurmur2A(sd); + + ID3D11SamplerState* sampler = m_samplerStateCache.find(hash); + if (NULL == sampler) + { + m_device->CreateSamplerState(&sd, &sampler); + DX_CHECK_REFCOUNT(sampler, 1); + + m_samplerStateCache.add(hash, sampler); + } + + return sampler; + } + void commitTextureStage() { m_deviceCtx->PSSetShaderResources(0, BGFX_STATE_TEX_COUNT, m_textureStage.m_srv); @@ -1397,36 +1435,7 @@ namespace bgfx void Texture::create(const Memory* _mem, uint32_t _flags) { - _flags &= BGFX_TEXTURE_MIN_MASK|BGFX_TEXTURE_MAG_MASK|BGFX_TEXTURE_MIP_MASK - | BGFX_TEXTURE_U_MASK|BGFX_TEXTURE_V_MASK|BGFX_TEXTURE_W_MASK - ; - - m_sampler = s_renderCtx.m_samplerStateCache.find(_flags); - if (NULL == m_sampler) - { - uint8_t minFilter = s_textureFilter[0][(_flags&BGFX_TEXTURE_MIN_MASK)>>BGFX_TEXTURE_MIN_SHIFT]; - uint8_t magFilter = s_textureFilter[1][(_flags&BGFX_TEXTURE_MAG_MASK)>>BGFX_TEXTURE_MAG_SHIFT]; - uint8_t mipFilter = s_textureFilter[2][(_flags&BGFX_TEXTURE_MIP_MASK)>>BGFX_TEXTURE_MIP_SHIFT]; - - D3D11_SAMPLER_DESC desc; - desc.Filter = (D3D11_FILTER)(minFilter|magFilter|mipFilter); - desc.AddressU = s_textureAddress[(_flags&BGFX_TEXTURE_U_MASK)>>BGFX_TEXTURE_U_SHIFT]; - desc.AddressV = s_textureAddress[(_flags&BGFX_TEXTURE_V_MASK)>>BGFX_TEXTURE_V_SHIFT]; - desc.AddressW = s_textureAddress[(_flags&BGFX_TEXTURE_W_MASK)>>BGFX_TEXTURE_W_SHIFT]; - desc.MipLODBias = 0.0f; - desc.MaxAnisotropy = 1; - desc.ComparisonFunc = D3D11_COMPARISON_NEVER; - desc.BorderColor[0] = 0.0f; - desc.BorderColor[1] = 0.0f; - desc.BorderColor[2] = 0.0f; - desc.BorderColor[3] = 0.0f; - desc.MinLOD = 0; - desc.MaxLOD = D3D11_FLOAT32_MAX; - s_renderCtx.m_device->CreateSamplerState(&desc, &m_sampler); - DX_CHECK_REFCOUNT(m_sampler, 1); - - s_renderCtx.m_samplerStateCache.add(_flags, m_sampler); - } + m_sampler = s_renderCtx.getSamplerState(_flags); Dds dds; @@ -1841,32 +1850,7 @@ namespace bgfx // DX_CHECK(s_renderCtx.m_device->CreateShaderResourceView(m_depthTexture, NULL, &m_srv) ); } - _textureFlags &= BGFX_TEXTURE_MIN_MASK|BGFX_TEXTURE_MAG_MASK|BGFX_TEXTURE_MIP_MASK - | BGFX_TEXTURE_U_MASK|BGFX_TEXTURE_V_MASK|BGFX_TEXTURE_W_MASK - ; - - m_sampler = s_renderCtx.m_samplerStateCache.find(_textureFlags); - if (NULL == m_sampler) - { - D3D11_SAMPLER_DESC desc; - desc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; - desc.AddressU = s_textureAddress[(_textureFlags&BGFX_TEXTURE_U_MASK)>>BGFX_TEXTURE_U_SHIFT]; - desc.AddressV = s_textureAddress[(_textureFlags&BGFX_TEXTURE_V_MASK)>>BGFX_TEXTURE_V_SHIFT]; - desc.AddressW = s_textureAddress[(_textureFlags&BGFX_TEXTURE_W_MASK)>>BGFX_TEXTURE_W_SHIFT]; - desc.MipLODBias = 0.0f; - desc.MaxAnisotropy = 1; - desc.ComparisonFunc = D3D11_COMPARISON_ALWAYS; - desc.BorderColor[0] = 0.0f; - desc.BorderColor[1] = 0.0f; - desc.BorderColor[2] = 0.0f; - desc.BorderColor[3] = 0.0f; - desc.MinLOD = 0; - desc.MaxLOD = D3D11_FLOAT32_MAX; - s_renderCtx.m_device->CreateSamplerState(&desc, &m_sampler); - DX_CHECK_REFCOUNT(m_sampler, 1); - - s_renderCtx.m_samplerStateCache.add(_textureFlags, m_sampler); - } + m_sampler = s_renderCtx.getSamplerState(_textureFlags); } void RenderTarget::destroy()