mirror of
https://github.com/scratchfoundation/bgfx.git
synced 2025-02-17 20:31:57 -05:00
DX11 unified caching sampler state.
This commit is contained in:
parent
da9382cad7
commit
5aa0c15dd5
1 changed files with 40 additions and 56 deletions
|
@ -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()
|
||||
|
|
Loading…
Reference in a new issue