This commit is contained in:
Branimir Karadžić 2015-08-23 14:50:44 -07:00
parent 7e7c4cc696
commit ea88ba93fb
2 changed files with 61 additions and 64 deletions

View file

@ -2934,8 +2934,8 @@ data.NumQualityLevels = 0;
void BatchD3D12::create(uint32_t _maxDrawPerBatch) void BatchD3D12::create(uint32_t _maxDrawPerBatch)
{ {
m_maxDrawPerBatch = _maxDrawPerBatch; m_maxDrawPerBatch = _maxDrawPerBatch;
m_minIndirect = 64; setSeqMode(false);
m_flushPerBatch = _maxDrawPerBatch; setIndirectMode(true);
ID3D12Device* device = s_renderD3D12->m_device; ID3D12Device* device = s_renderD3D12->m_device;
ID3D12RootSignature* rootSignature = s_renderD3D12->m_rootSignature; ID3D12RootSignature* rootSignature = s_renderD3D12->m_rootSignature;
@ -4222,21 +4222,6 @@ data.NumQualityLevels = 0;
m_batch.flush(m_commandList, true); m_batch.flush(m_commandList, true);
kick(); kick();
if (isCompute)
{
m_commandList->SetComputeRootSignature(m_rootSignature);
}
else
{
m_commandList->SetGraphicsRootSignature(m_rootSignature);
}
ID3D12DescriptorHeap* heaps[] = {
m_samplerAllocator.getHeap(),
scratchBuffer.getHeap(),
};
m_commandList->SetDescriptorHeaps(BX_COUNTOF(heaps), heaps);
view = key.m_view; view = key.m_view;
currentPso = NULL; currentPso = NULL;
@ -4281,7 +4266,15 @@ data.NumQualityLevels = 0;
if (!wasCompute) if (!wasCompute)
{ {
wasCompute = true; wasCompute = true;
m_commandList->SetComputeRootSignature(m_rootSignature);
ID3D12DescriptorHeap* heaps[] = {
m_samplerAllocator.getHeap(),
scratchBuffer.getHeap(),
};
m_commandList->SetDescriptorHeaps(BX_COUNTOF(heaps), heaps);
} }
const RenderCompute& compute = renderItem.compute; const RenderCompute& compute = renderItem.compute;
bool constantsChanged = compute.m_constBegin < compute.m_constEnd; bool constantsChanged = compute.m_constBegin < compute.m_constEnd;
@ -4395,10 +4388,25 @@ data.NumQualityLevels = 0;
continue; continue;
} }
bool resetState = viewChanged || wasCompute; const RenderDraw& draw = renderItem.draw;
if (wasCompute) const uint64_t newFlags = draw.m_flags;
uint64_t changedFlags = currentState.m_flags ^ draw.m_flags;
currentState.m_flags = newFlags;
const uint64_t newStencil = draw.m_stencil;
uint64_t changedStencil = (currentState.m_stencil ^ draw.m_stencil) & BGFX_STENCIL_FUNC_REF_MASK;
currentState.m_stencil = newStencil;
if (viewChanged
|| wasCompute)
{ {
if (wasCompute)
{
wasCompute = false;
kick();
}
if (BX_ENABLED(BGFX_CONFIG_DEBUG_PIX) ) if (BX_ENABLED(BGFX_CONFIG_DEBUG_PIX) )
{ {
BX_UNUSED(s_viewNameW); BX_UNUSED(s_viewNameW);
@ -4408,8 +4416,6 @@ data.NumQualityLevels = 0;
// PIX_BEGINEVENT(D3DCOLOR_RGBA(0xff, 0x00, 0x00, 0xff), viewNameW); // PIX_BEGINEVENT(D3DCOLOR_RGBA(0xff, 0x00, 0x00, 0xff), viewNameW);
} }
wasCompute = false;
m_currentProgram = NULL; m_currentProgram = NULL;
currentSamplerStateIdx = invalidHandle; currentSamplerStateIdx = invalidHandle;
@ -4420,21 +4426,6 @@ data.NumQualityLevels = 0;
}; };
m_commandList->SetDescriptorHeaps(BX_COUNTOF(heaps), heaps); m_commandList->SetDescriptorHeaps(BX_COUNTOF(heaps), heaps);
// invalidateCompute();
}
const RenderDraw& draw = renderItem.draw;
const uint64_t newFlags = draw.m_flags;
uint64_t changedFlags = currentState.m_flags ^ draw.m_flags;
currentState.m_flags = newFlags;
const uint64_t newStencil = draw.m_stencil;
uint64_t changedStencil = (currentState.m_stencil ^ draw.m_stencil) & BGFX_STENCIL_FUNC_REF_MASK;
currentState.m_stencil = newStencil;
if (resetState)
{
currentState.clear(); currentState.clear();
currentState.m_scissor = !draw.m_scissor; currentState.m_scissor = !draw.m_scissor;
changedFlags = BGFX_STATE_MASK; changedFlags = BGFX_STATE_MASK;
@ -4451,13 +4442,39 @@ data.NumQualityLevels = 0;
if (isValid(draw.m_vertexBuffer) ) if (isValid(draw.m_vertexBuffer) )
{ {
const uint64_t state = draw.m_flags;
bool hasFactor = 0
|| f0 == (state & f0)
|| f1 == (state & f1)
;
const VertexBufferD3D12& vb = m_vertexBuffers[draw.m_vertexBuffer.idx];
uint16_t declIdx = !isValid(vb.m_decl) ? draw.m_vertexDecl.idx : vb.m_decl.idx;
ID3D12PipelineState* pso =
getPipelineState(state
, draw.m_stencil
, declIdx
, key.m_program
, uint8_t(draw.m_instanceDataStride/16)
);
uint32_t bindHash = bx::hashMurmur2A(draw.m_bind, sizeof(draw.m_bind) );
if (currentBindHash != bindHash
|| 0 != changedStencil
|| (hasFactor && blendFactor != draw.m_rgba)
|| (0 != (BGFX_STATE_PT_MASK & changedFlags)
|| prim.m_toplogy != s_primInfo[primIndex].m_toplogy)
|| pso != currentPso)
{
m_batch.flush(m_commandList);
}
for (uint32_t bindHash = bx::hashMurmur2A(draw.m_bind, sizeof(draw.m_bind) ) for (uint32_t bindHash = bx::hashMurmur2A(draw.m_bind, sizeof(draw.m_bind) )
; currentBindHash != bindHash ; currentBindHash != bindHash
; currentBindHash = bindHash ; currentBindHash = bindHash
) )
{ {
m_batch.flush(m_commandList);
D3D12_GPU_DESCRIPTOR_HANDLE* srv = bindLru.find(bindHash); D3D12_GPU_DESCRIPTOR_HANDLE* srv = bindLru.find(bindHash);
if (NULL == srv) if (NULL == srv)
{ {
@ -4509,24 +4526,14 @@ data.NumQualityLevels = 0;
if (0 != changedStencil) if (0 != changedStencil)
{ {
m_batch.flush(m_commandList);
const uint32_t fstencil = unpackStencil(0, draw.m_stencil); const uint32_t fstencil = unpackStencil(0, draw.m_stencil);
const uint32_t ref = (fstencil&BGFX_STENCIL_FUNC_REF_MASK)>>BGFX_STENCIL_FUNC_REF_SHIFT; const uint32_t ref = (fstencil&BGFX_STENCIL_FUNC_REF_MASK)>>BGFX_STENCIL_FUNC_REF_SHIFT;
m_commandList->OMSetStencilRef(ref); m_commandList->OMSetStencilRef(ref);
} }
const uint64_t state = draw.m_flags;
bool hasFactor = 0
|| f0 == (state & f0)
|| f1 == (state & f1)
;
if (hasFactor if (hasFactor
&& blendFactor != draw.m_rgba) && blendFactor != draw.m_rgba)
{ {
m_batch.flush(m_commandList);
blendFactor = draw.m_rgba; blendFactor = draw.m_rgba;
float bf[4]; float bf[4];
@ -4540,28 +4547,14 @@ data.NumQualityLevels = 0;
if (0 != (BGFX_STATE_PT_MASK & changedFlags) if (0 != (BGFX_STATE_PT_MASK & changedFlags)
|| prim.m_toplogy != s_primInfo[primIndex].m_toplogy) || prim.m_toplogy != s_primInfo[primIndex].m_toplogy)
{ {
m_batch.flush(m_commandList);
const uint64_t pt = newFlags&BGFX_STATE_PT_MASK; const uint64_t pt = newFlags&BGFX_STATE_PT_MASK;
primIndex = uint8_t(pt>>BGFX_STATE_PT_SHIFT); primIndex = uint8_t(pt>>BGFX_STATE_PT_SHIFT);
prim = s_primInfo[primIndex]; prim = s_primInfo[primIndex];
m_commandList->IASetPrimitiveTopology(prim.m_toplogy); m_commandList->IASetPrimitiveTopology(prim.m_toplogy);
} }
const VertexBufferD3D12& vb = m_vertexBuffers[draw.m_vertexBuffer.idx];
uint16_t declIdx = !isValid(vb.m_decl) ? draw.m_vertexDecl.idx : vb.m_decl.idx;
ID3D12PipelineState* pso =
getPipelineState(state
, draw.m_stencil
, declIdx
, key.m_program
, uint8_t(draw.m_instanceDataStride/16)
);
if (pso != currentPso) if (pso != currentPso)
{ {
m_batch.flush(m_commandList);
currentPso = pso; currentPso = pso;
m_commandList->SetPipelineState(pso); m_commandList->SetPipelineState(pso);
} }
@ -4595,8 +4588,7 @@ data.NumQualityLevels = 0;
} }
} }
uint32_t numIndices = 0; uint32_t numIndices = m_batch.draw(m_commandList, gpuAddress, draw);
numIndices = m_batch.draw(m_commandList, gpuAddress, draw);
uint32_t numPrimsSubmitted = numIndices / prim.m_div - prim.m_sub; uint32_t numPrimsSubmitted = numIndices / prim.m_div - prim.m_sub;
uint32_t numPrimsRendered = numPrimsSubmitted*draw.m_numInstances; uint32_t numPrimsRendered = numPrimsSubmitted*draw.m_numInstances;

View file

@ -394,6 +394,11 @@ namespace bgfx { namespace d3d12
m_flushPerBatch = _enabled ? 1 : m_maxDrawPerBatch; m_flushPerBatch = _enabled ? 1 : m_maxDrawPerBatch;
} }
void setIndirectMode(bool _enabled)
{
m_minIndirect = _enabled ? 64 : UINT32_MAX;
}
ID3D12CommandSignature* m_commandSignature[Count]; ID3D12CommandSignature* m_commandSignature[Count];
uint32_t m_num[Count]; uint32_t m_num[Count];
void* m_cmds[Count]; void* m_cmds[Count];