|
|
@@ -680,7 +680,7 @@ namespace bgfx { namespace d3d11
|
|
|
uint32_t flags = 0
|
|
|
| D3D11_CREATE_DEVICE_SINGLETHREADED
|
|
|
| D3D11_CREATE_DEVICE_BGRA_SUPPORT
|
|
|
-// | D3D11_CREATE_DEVICE_PREVENT_INTERNAL_THREADING_OPTIMIZATIONS
|
|
|
+ | D3D11_CREATE_DEVICE_PREVENT_INTERNAL_THREADING_OPTIMIZATIONS
|
|
|
| (BX_ENABLED(BGFX_CONFIG_DEBUG) ? D3D11_CREATE_DEVICE_DEBUG : 0)
|
|
|
;
|
|
|
|
|
|
@@ -1777,6 +1777,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
|
|
|
m_depthStencilStateCache.invalidate();
|
|
|
m_rasterizerStateCache.invalidate();
|
|
|
m_samplerStateCache.invalidate();
|
|
|
+ m_srvUavLru.invalidate();
|
|
|
}
|
|
|
|
|
|
void invalidateCompute()
|
|
|
@@ -2394,6 +2395,101 @@ BX_PRAGMA_DIAGNOSTIC_POP();
|
|
|
commitTextureStage();
|
|
|
}
|
|
|
|
|
|
+ ID3D11UnorderedAccessView* getCachedUav(TextureHandle _handle, uint8_t _mip)
|
|
|
+ {
|
|
|
+ bx::HashMurmur2A murmur;
|
|
|
+ murmur.begin();
|
|
|
+ murmur.add(_handle);
|
|
|
+ murmur.add(_mip);
|
|
|
+ murmur.add(0);
|
|
|
+ uint32_t hash = murmur.end();
|
|
|
+
|
|
|
+ IUnknown** ptr = m_srvUavLru.find(hash);
|
|
|
+ ID3D11UnorderedAccessView* uav;
|
|
|
+ if (NULL == ptr)
|
|
|
+ {
|
|
|
+ TextureD3D11& texture = m_textures[_handle.idx];
|
|
|
+
|
|
|
+ D3D11_UNORDERED_ACCESS_VIEW_DESC desc;
|
|
|
+ desc.Format = s_textureFormat[texture.m_textureFormat].m_fmtSrv;
|
|
|
+ switch (texture.m_type)
|
|
|
+ {
|
|
|
+ case TextureD3D11::Texture2D:
|
|
|
+ case TextureD3D11::TextureCube:
|
|
|
+ desc.ViewDimension = D3D11_UAV_DIMENSION_TEXTURE2D;
|
|
|
+ desc.Texture2D.MipSlice = _mip;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case TextureD3D11::Texture3D:
|
|
|
+ desc.ViewDimension = D3D11_UAV_DIMENSION_TEXTURE2D;
|
|
|
+ desc.Texture3D.MipSlice = _mip;
|
|
|
+ desc.Texture3D.FirstWSlice = 0;
|
|
|
+ desc.Texture3D.WSize = 1;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ DX_CHECK(m_device->CreateUnorderedAccessView(texture.m_ptr, &desc, &uav) );
|
|
|
+
|
|
|
+ m_srvUavLru.add(hash, uav, _handle.idx);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ uav = static_cast<ID3D11UnorderedAccessView*>(*ptr);
|
|
|
+ }
|
|
|
+
|
|
|
+ return uav;
|
|
|
+ }
|
|
|
+
|
|
|
+ ID3D11ShaderResourceView* getCachedSrv(TextureHandle _handle, uint8_t _mip)
|
|
|
+ {
|
|
|
+ bx::HashMurmur2A murmur;
|
|
|
+ murmur.begin();
|
|
|
+ murmur.add(_handle);
|
|
|
+ murmur.add(_mip);
|
|
|
+ murmur.add(0);
|
|
|
+ uint32_t hash = murmur.end();
|
|
|
+
|
|
|
+ IUnknown** ptr = m_srvUavLru.find(hash);
|
|
|
+ ID3D11ShaderResourceView* srv;
|
|
|
+ if (NULL == ptr)
|
|
|
+ {
|
|
|
+ TextureD3D11& texture = m_textures[_handle.idx];
|
|
|
+
|
|
|
+ D3D11_SHADER_RESOURCE_VIEW_DESC desc;
|
|
|
+ desc.Format = s_textureFormat[texture.m_textureFormat].m_fmtSrv;
|
|
|
+ switch (texture.m_type)
|
|
|
+ {
|
|
|
+ case TextureD3D11::Texture2D:
|
|
|
+ desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
|
|
|
+ desc.Texture2D.MostDetailedMip = _mip;
|
|
|
+ desc.Texture2D.MipLevels = 1;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case TextureD3D11::TextureCube:
|
|
|
+ desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBE;
|
|
|
+ desc.TextureCube.MostDetailedMip = _mip;
|
|
|
+ desc.TextureCube.MipLevels = 1;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case TextureD3D11::Texture3D:
|
|
|
+ desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE3D;
|
|
|
+ desc.Texture3D.MostDetailedMip = _mip;
|
|
|
+ desc.Texture3D.MipLevels = 1;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ DX_CHECK(m_device->CreateShaderResourceView(texture.m_ptr, &desc, &srv) );
|
|
|
+
|
|
|
+ m_srvUavLru.add(hash, srv, _handle.idx);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ srv = static_cast<ID3D11ShaderResourceView*>(*ptr);
|
|
|
+ }
|
|
|
+
|
|
|
+ return srv;
|
|
|
+ }
|
|
|
+
|
|
|
void ovrPostReset()
|
|
|
{
|
|
|
#if BGFX_CONFIG_USE_OVR
|
|
|
@@ -2838,6 +2934,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
|
|
|
StateCacheT<ID3D11InputLayout> m_inputLayoutCache;
|
|
|
StateCacheT<ID3D11RasterizerState> m_rasterizerStateCache;
|
|
|
StateCacheT<ID3D11SamplerState> m_samplerStateCache;
|
|
|
+ StateCacheLru<IUnknown*, 1024> m_srvUavLru;
|
|
|
|
|
|
TextVideoMem m_textVideoMem;
|
|
|
|
|
|
@@ -3307,7 +3404,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
|
|
|
const bool swizzle = TextureFormat::BGRA8 == m_textureFormat && 0 != (m_flags&BGFX_TEXTURE_COMPUTE_WRITE);
|
|
|
|
|
|
BX_TRACE("Texture %3d: %s (requested: %s), %dx%d%s%s%s."
|
|
|
- , this - s_renderD3D11->m_textures
|
|
|
+ , getHandle()
|
|
|
, getName( (TextureFormat::Enum)m_textureFormat)
|
|
|
, getName( (TextureFormat::Enum)m_requestedFormat)
|
|
|
, textureWidth
|
|
|
@@ -3504,6 +3601,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
|
|
|
|
|
|
void TextureD3D11::destroy()
|
|
|
{
|
|
|
+ s_renderD3D11->m_srvUavLru.invalidateWithParent(getHandle().idx);
|
|
|
DX_RELEASE(m_srv, 0);
|
|
|
DX_RELEASE(m_uav, 0);
|
|
|
DX_RELEASE(m_ptr, 0);
|
|
|
@@ -3560,6 +3658,12 @@ BX_PRAGMA_DIAGNOSTIC_POP();
|
|
|
{
|
|
|
}
|
|
|
|
|
|
+ TextureHandle TextureD3D11::getHandle() const
|
|
|
+ {
|
|
|
+ TextureHandle handle = { (uint16_t)(this - s_renderD3D11->m_textures) };
|
|
|
+ return handle;
|
|
|
+ }
|
|
|
+
|
|
|
void FrameBufferD3D11::create(uint8_t _num, const TextureHandle* _handles)
|
|
|
{
|
|
|
for (uint32_t ii = 0; ii < BX_COUNTOF(m_rtv); ++ii)
|
|
|
@@ -4074,14 +4178,20 @@ BX_PRAGMA_DIAGNOSTIC_POP();
|
|
|
{
|
|
|
case Binding::Image:
|
|
|
{
|
|
|
- const TextureD3D11& texture = m_textures[bind.m_idx];
|
|
|
+ TextureD3D11& texture = m_textures[bind.m_idx];
|
|
|
if (Access::Read != bind.m_un.m_compute.m_access)
|
|
|
{
|
|
|
- uav[ii] = texture.m_uav;
|
|
|
+ uav[ii] = 0 == bind.m_un.m_compute.m_mip
|
|
|
+ ? texture.m_uav
|
|
|
+ : s_renderD3D11->getCachedUav(texture.getHandle(), bind.m_un.m_compute.m_mip)
|
|
|
+ ;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- srv[ii] = texture.m_srv;
|
|
|
+ srv[ii] = 0 == bind.m_un.m_compute.m_mip
|
|
|
+ ? texture.m_srv
|
|
|
+ : s_renderD3D11->getCachedSrv(texture.getHandle(), bind.m_un.m_compute.m_mip)
|
|
|
+ ;
|
|
|
sampler[ii] = texture.m_sampler;
|
|
|
}
|
|
|
}
|