D3D12: Fixed texture binding.

This commit is contained in:
Branimir Karadžić 2018-01-18 18:58:42 -08:00
parent 1a90c93458
commit 55427f424c
2 changed files with 14 additions and 11 deletions

View File

@ -120,7 +120,7 @@ function bgfxProjectBase(_kind, _defines)
"BGFX_CONFIG_DEBUG=1", "BGFX_CONFIG_DEBUG=1",
} }
configuration { "vs* or mingw-*", "not durango" } configuration { "vs* or mingw*", "not durango" }
includedirs { includedirs {
path.join(BGFX_DIR, "3rdparty/dxsdk/include"), path.join(BGFX_DIR, "3rdparty/dxsdk/include"),
} }

View File

@ -1264,7 +1264,7 @@ namespace bgfx { namespace d3d12
| BGFX_CAPS_COMPUTE | BGFX_CAPS_COMPUTE
| (m_options.ROVsSupported ? BGFX_CAPS_FRAGMENT_ORDERING : 0) | (m_options.ROVsSupported ? BGFX_CAPS_FRAGMENT_ORDERING : 0)
// | (m_architecture.UMA ? BGFX_CAPS_TEXTURE_DIRECT_ACCESS : 0) // | (m_architecture.UMA ? BGFX_CAPS_TEXTURE_DIRECT_ACCESS : 0)
// | BGFX_CAPS_SWAP_CHAIN // | (BX_ENABLED(BX_PLATFORM_WINDOWS) ? BGFX_CAPS_SWAP_CHAIN : 0)
| BGFX_CAPS_TEXTURE_BLIT | BGFX_CAPS_TEXTURE_BLIT
| BGFX_CAPS_TEXTURE_READ_BACK | BGFX_CAPS_TEXTURE_READ_BACK
| BGFX_CAPS_OCCLUSION_QUERY | BGFX_CAPS_OCCLUSION_QUERY
@ -4897,6 +4897,7 @@ data.NumQualityLevels = 0;
{ {
BX_UNUSED(_depthFormat); BX_UNUSED(_depthFormat);
#if BX_PLATFORM_WINDOWS
DXGI_SWAP_CHAIN_DESC scd; DXGI_SWAP_CHAIN_DESC scd;
bx::memCopy(&scd, &s_renderD3D12->m_scd, sizeof(DXGI_SWAP_CHAIN_DESC) ); bx::memCopy(&scd, &s_renderD3D12->m_scd, sizeof(DXGI_SWAP_CHAIN_DESC) );
scd.BufferDesc.Width = _width; scd.BufferDesc.Width = _width;
@ -4909,6 +4910,7 @@ data.NumQualityLevels = 0;
, reinterpret_cast<IDXGISwapChain**>(&m_swapChain) , reinterpret_cast<IDXGISwapChain**>(&m_swapChain)
); );
BGFX_FATAL(SUCCEEDED(hr), Fatal::UnableToInitialize, "Failed to create swap chain."); BGFX_FATAL(SUCCEEDED(hr), Fatal::UnableToInitialize, "Failed to create swap chain.");
#endif // BX_PLATFORM_WINDOWS
m_denseIdx = _denseIdx; m_denseIdx = _denseIdx;
m_num = 1; m_num = 1;
@ -5937,10 +5939,10 @@ data.NumQualityLevels = 0;
Bind* bindCached = bindLru.find(bindHash); Bind* bindCached = bindLru.find(bindHash);
if (NULL == bindCached) if (NULL == bindCached)
{ {
uint32_t numSet = 0;
D3D12_GPU_DESCRIPTOR_HANDLE srvHandle[BGFX_CONFIG_MAX_TEXTURE_SAMPLERS]; D3D12_GPU_DESCRIPTOR_HANDLE srvHandle[BGFX_CONFIG_MAX_TEXTURE_SAMPLERS];
uint32_t samplerFlags[BGFX_CONFIG_MAX_TEXTURE_SAMPLERS]; uint32_t samplerFlags[BGFX_CONFIG_MAX_TEXTURE_SAMPLERS];
{ {
srvHandle[0].ptr = 0;
for (uint32_t stage = 0; stage < BGFX_CONFIG_MAX_TEXTURE_SAMPLERS; ++stage) for (uint32_t stage = 0; stage < BGFX_CONFIG_MAX_TEXTURE_SAMPLERS; ++stage)
{ {
const Binding& bind = renderBind.m_bind[stage]; const Binding& bind = renderBind.m_bind[stage];
@ -5952,12 +5954,14 @@ data.NumQualityLevels = 0;
{ {
TextureD3D12& texture = m_textures[bind.m_idx]; TextureD3D12& texture = m_textures[bind.m_idx];
texture.setState(m_commandList, D3D12_RESOURCE_STATE_GENERIC_READ); texture.setState(m_commandList, D3D12_RESOURCE_STATE_GENERIC_READ);
scratchBuffer.allocSrv(srvHandle[stage], texture); scratchBuffer.allocSrv(srvHandle[numSet], texture);
samplerFlags[stage] = (0 == (BGFX_TEXTURE_INTERNAL_DEFAULT_SAMPLER & bind.m_un.m_draw.m_textureFlags) samplerFlags[stage] = (0 == (BGFX_TEXTURE_INTERNAL_DEFAULT_SAMPLER & bind.m_un.m_draw.m_textureFlags)
? bind.m_un.m_draw.m_textureFlags ? bind.m_un.m_draw.m_textureFlags
: texture.m_flags : texture.m_flags
) & (BGFX_TEXTURE_SAMPLER_BITS_MASK | BGFX_TEXTURE_BORDER_COLOR_MASK) ) & (BGFX_TEXTURE_SAMPLER_BITS_MASK | BGFX_TEXTURE_BORDER_COLOR_MASK | BGFX_TEXTURE_COMPARE_MASK)
; ;
++numSet;
} }
break; break;
@ -5973,29 +5977,28 @@ data.NumQualityLevels = 0;
if (Access::Read != bind.m_un.m_compute.m_access) if (Access::Read != bind.m_un.m_compute.m_access)
{ {
// The api functions prevent binding with Access::Write,
// but might as well allow it in here for future-proofing
buffer.setState(m_commandList, D3D12_RESOURCE_STATE_UNORDERED_ACCESS); buffer.setState(m_commandList, D3D12_RESOURCE_STATE_UNORDERED_ACCESS);
scratchBuffer.allocUav(srvHandle[stage], buffer); scratchBuffer.allocUav(srvHandle[numSet], buffer);
} }
else else
{ {
buffer.setState(m_commandList, D3D12_RESOURCE_STATE_GENERIC_READ); buffer.setState(m_commandList, D3D12_RESOURCE_STATE_GENERIC_READ);
scratchBuffer.allocSrv(srvHandle[stage], buffer); scratchBuffer.allocSrv(srvHandle[numSet], buffer);
} }
++numSet;
} }
break; break;
} }
} }
else else
{ {
bx::memCopy(&srvHandle[stage], &srvHandle[0], sizeof(D3D12_GPU_DESCRIPTOR_HANDLE) );
samplerFlags[stage] = 0; samplerFlags[stage] = 0;
} }
} }
} }
if (srvHandle[0].ptr != 0) if (0 != numSet)
{ {
uint16_t samplerStateIdx = getSamplerState(samplerFlags, BGFX_CONFIG_MAX_TEXTURE_SAMPLERS, _render->m_colorPalette); uint16_t samplerStateIdx = getSamplerState(samplerFlags, BGFX_CONFIG_MAX_TEXTURE_SAMPLERS, _render->m_colorPalette);
if (samplerStateIdx != currentSamplerStateIdx) if (samplerStateIdx != currentSamplerStateIdx)