This commit is contained in:
Branimir Karadžić 2018-12-18 16:11:41 -08:00
parent fba9727f8e
commit 095188a533
8 changed files with 154 additions and 145 deletions

View File

@ -1162,9 +1162,9 @@ namespace bgfx
UniformBuffer* uniformBuffer = m_frame->m_uniformBuffer[m_uniformIdx];
m_uniformEnd = uniformBuffer->getPos();
m_key.m_program = kInvalidHandle == _program.idx
? 0
: _program.idx
m_key.m_program = isValid(_program)
? _program
: ProgramHandle{0}
;
m_key.m_view = _id;
@ -1257,7 +1257,7 @@ namespace bgfx
m_compute.m_numZ = bx::max(_numZ, 1u);
m_compute.m_submitFlags = _flags;
m_key.m_program = _handle.idx;
m_key.m_program = _handle;
m_key.m_depth = 0;
m_key.m_view = _id;
m_key.m_seq = s_ctx->getSeqIncr(_id);

View File

@ -1034,46 +1034,58 @@ namespace bgfx
uint64_t encodeDraw(Enum _type)
{
if (SortDepth == _type)
switch (_type)
{
const uint64_t depth = (uint64_t(m_depth ) << SORT_KEY_DRAW_1_DEPTH_SHIFT ) & SORT_KEY_DRAW_1_DEPTH_MASK;
const uint64_t program = (uint64_t(m_program) << SORT_KEY_DRAW_1_PROGRAM_SHIFT) & SORT_KEY_DRAW_1_PROGRAM_MASK;
const uint64_t trans = (uint64_t(m_trans ) << SORT_KEY_DRAW_1_TRANS_SHIFT ) & SORT_KEY_DRAW_1_TRANS_MASK;
const uint64_t view = (uint64_t(m_view ) << SORT_KEY_VIEW_SHIFT ) & SORT_KEY_VIEW_MASK;
const uint64_t key = view|SORT_KEY_DRAW_BIT|SORT_KEY_DRAW_TYPE_DEPTH|depth|trans|program;
case SortProgram:
{
const uint64_t depth = (uint64_t(m_depth ) << SORT_KEY_DRAW_0_DEPTH_SHIFT ) & SORT_KEY_DRAW_0_DEPTH_MASK;
const uint64_t program = (uint64_t(m_program.idx) << SORT_KEY_DRAW_0_PROGRAM_SHIFT) & SORT_KEY_DRAW_0_PROGRAM_MASK;
const uint64_t trans = (uint64_t(m_trans ) << SORT_KEY_DRAW_0_TRANS_SHIFT ) & SORT_KEY_DRAW_0_TRANS_MASK;
const uint64_t view = (uint64_t(m_view ) << SORT_KEY_VIEW_SHIFT ) & SORT_KEY_VIEW_MASK;
const uint64_t key = view|SORT_KEY_DRAW_BIT|SORT_KEY_DRAW_TYPE_PROGRAM|trans|program|depth;
return key;
}
else if (SortSequence == _type)
{
const uint64_t seq = (uint64_t(m_seq ) << SORT_KEY_DRAW_2_SEQ_SHIFT ) & SORT_KEY_DRAW_2_SEQ_MASK;
const uint64_t program = (uint64_t(m_program) << SORT_KEY_DRAW_2_PROGRAM_SHIFT) & SORT_KEY_DRAW_2_PROGRAM_MASK;
const uint64_t trans = (uint64_t(m_trans ) << SORT_KEY_DRAW_2_TRANS_SHIFT ) & SORT_KEY_DRAW_2_TRANS_MASK;
const uint64_t view = (uint64_t(m_view ) << SORT_KEY_VIEW_SHIFT ) & SORT_KEY_VIEW_MASK;
const uint64_t key = view|SORT_KEY_DRAW_BIT|SORT_KEY_DRAW_TYPE_SEQUENCE|seq|trans|program;
return key;
}
break;
BX_CHECK(seq == (uint64_t(m_seq) << SORT_KEY_DRAW_2_SEQ_SHIFT)
, "SortKey error, sequence is truncated (m_seq: %d)."
, m_seq
);
case SortDepth:
{
const uint64_t depth = (uint64_t(m_depth ) << SORT_KEY_DRAW_1_DEPTH_SHIFT ) & SORT_KEY_DRAW_1_DEPTH_MASK;
const uint64_t program = (uint64_t(m_program.idx) << SORT_KEY_DRAW_1_PROGRAM_SHIFT) & SORT_KEY_DRAW_1_PROGRAM_MASK;
const uint64_t trans = (uint64_t(m_trans ) << SORT_KEY_DRAW_1_TRANS_SHIFT ) & SORT_KEY_DRAW_1_TRANS_MASK;
const uint64_t view = (uint64_t(m_view ) << SORT_KEY_VIEW_SHIFT ) & SORT_KEY_VIEW_MASK;
const uint64_t key = view|SORT_KEY_DRAW_BIT|SORT_KEY_DRAW_TYPE_DEPTH|depth|trans|program;
return key;
}
break;
return key;
case SortSequence:
{
const uint64_t seq = (uint64_t(m_seq ) << SORT_KEY_DRAW_2_SEQ_SHIFT ) & SORT_KEY_DRAW_2_SEQ_MASK;
const uint64_t program = (uint64_t(m_program.idx) << SORT_KEY_DRAW_2_PROGRAM_SHIFT) & SORT_KEY_DRAW_2_PROGRAM_MASK;
const uint64_t trans = (uint64_t(m_trans ) << SORT_KEY_DRAW_2_TRANS_SHIFT ) & SORT_KEY_DRAW_2_TRANS_MASK;
const uint64_t view = (uint64_t(m_view ) << SORT_KEY_VIEW_SHIFT ) & SORT_KEY_VIEW_MASK;
const uint64_t key = view|SORT_KEY_DRAW_BIT|SORT_KEY_DRAW_TYPE_SEQUENCE|seq|trans|program;
BX_CHECK(seq == (uint64_t(m_seq) << SORT_KEY_DRAW_2_SEQ_SHIFT)
, "SortKey error, sequence is truncated (m_seq: %d)."
, m_seq
);
return key;
}
break;
}
const uint64_t depth = (uint64_t(m_depth ) << SORT_KEY_DRAW_0_DEPTH_SHIFT ) & SORT_KEY_DRAW_0_DEPTH_MASK;
const uint64_t program = (uint64_t(m_program) << SORT_KEY_DRAW_0_PROGRAM_SHIFT) & SORT_KEY_DRAW_0_PROGRAM_MASK;
const uint64_t trans = (uint64_t(m_trans ) << SORT_KEY_DRAW_0_TRANS_SHIFT ) & SORT_KEY_DRAW_0_TRANS_MASK;
const uint64_t view = (uint64_t(m_view ) << SORT_KEY_VIEW_SHIFT ) & SORT_KEY_VIEW_MASK;
const uint64_t key = view|SORT_KEY_DRAW_BIT|SORT_KEY_DRAW_TYPE_PROGRAM|trans|program|depth;
return key;
BX_CHECK(false, "You should not be here.");
return 0;
}
uint64_t encodeCompute()
{
const uint64_t program = (uint64_t(m_program) << SORT_KEY_COMPUTE_PROGRAM_SHIFT) & SORT_KEY_COMPUTE_PROGRAM_MASK;
const uint64_t seq = (uint64_t(m_seq ) << SORT_KEY_COMPUTE_SEQ_SHIFT ) & SORT_KEY_COMPUTE_SEQ_MASK;
const uint64_t view = (uint64_t(m_view ) << SORT_KEY_VIEW_SHIFT ) & SORT_KEY_VIEW_MASK;
const uint64_t program = (uint64_t(m_program.idx) << SORT_KEY_COMPUTE_PROGRAM_SHIFT) & SORT_KEY_COMPUTE_PROGRAM_MASK;
const uint64_t seq = (uint64_t(m_seq ) << SORT_KEY_COMPUTE_SEQ_SHIFT ) & SORT_KEY_COMPUTE_SEQ_MASK;
const uint64_t view = (uint64_t(m_view ) << SORT_KEY_VIEW_SHIFT ) & SORT_KEY_VIEW_MASK;
const uint64_t key = program|seq|view;
BX_CHECK(seq == (uint64_t(m_seq) << SORT_KEY_COMPUTE_SEQ_SHIFT)
@ -1093,20 +1105,20 @@ namespace bgfx
uint64_t type = _key & SORT_KEY_DRAW_TYPE_MASK;
if (type == SORT_KEY_DRAW_TYPE_DEPTH)
{
m_program = uint16_t( (_key & SORT_KEY_DRAW_1_PROGRAM_MASK) >> SORT_KEY_DRAW_1_PROGRAM_SHIFT);
m_program.idx = uint16_t( (_key & SORT_KEY_DRAW_1_PROGRAM_MASK) >> SORT_KEY_DRAW_1_PROGRAM_SHIFT);
return false;
}
else if (type == SORT_KEY_DRAW_TYPE_SEQUENCE)
{
m_program = uint16_t( (_key & SORT_KEY_DRAW_2_PROGRAM_MASK) >> SORT_KEY_DRAW_2_PROGRAM_SHIFT);
m_program.idx = uint16_t( (_key & SORT_KEY_DRAW_2_PROGRAM_MASK) >> SORT_KEY_DRAW_2_PROGRAM_SHIFT);
return false;
}
m_program = uint16_t( (_key & SORT_KEY_DRAW_0_PROGRAM_MASK) >> SORT_KEY_DRAW_0_PROGRAM_SHIFT);
m_program.idx = uint16_t( (_key & SORT_KEY_DRAW_0_PROGRAM_MASK) >> SORT_KEY_DRAW_0_PROGRAM_SHIFT);
return false; // draw
}
m_program = uint16_t( (_key & SORT_KEY_COMPUTE_PROGRAM_MASK) >> SORT_KEY_COMPUTE_PROGRAM_SHIFT);
m_program.idx = uint16_t( (_key & SORT_KEY_COMPUTE_PROGRAM_MASK) >> SORT_KEY_COMPUTE_PROGRAM_SHIFT);
return true; // compute
}
@ -1127,16 +1139,16 @@ namespace bgfx
{
m_depth = 0;
m_seq = 0;
m_program = 0;
m_program = {0};
m_view = 0;
m_trans = 0;
}
uint32_t m_depth;
uint32_t m_seq;
uint16_t m_program;
ViewId m_view;
uint8_t m_trans;
uint32_t m_depth;
uint32_t m_seq;
ProgramHandle m_program;
ViewId m_view;
uint8_t m_trans;
};
#undef SORT_KEY_RENDER_DRAW
@ -1796,7 +1808,7 @@ namespace bgfx
{
SortKey term;
term.reset();
term.m_program = kInvalidHandle;
term.m_program = BGFX_INVALID_HANDLE;
m_sortKeys[BGFX_CONFIG_MAX_DRAW_CALLS] = term.encodeDraw(SortKey::SortProgram);
m_sortValues[BGFX_CONFIG_MAX_DRAW_CALLS] = BGFX_CONFIG_MAX_DRAW_CALLS;
bx::memSet(m_occlusion, 0xff, sizeof(m_occlusion) );

View File

@ -5257,7 +5257,7 @@ namespace bgfx { namespace d3d11
bool scissorEnabled = false;
setDebugWireframe(wireframe);
uint16_t programIdx = kInvalidHandle;
ProgramHandle currentProgram = BGFX_INVALID_HANDLE;
SortKey key;
uint16_t view = UINT16_MAX;
FrameBufferHandle fbh = { BGFX_CONFIG_MAX_FRAME_BUFFERS };
@ -5333,7 +5333,7 @@ namespace bgfx { namespace d3d11
}
view = key.m_view;
programIdx = kInvalidHandle;
currentProgram = BGFX_INVALID_HANDLE;
if (_render->m_view[view].m_fbh.idx != fbh.idx)
{
@ -5454,11 +5454,11 @@ namespace bgfx { namespace d3d11
bool constantsChanged = compute.m_uniformBegin < compute.m_uniformEnd;
rendererUpdateUniforms(this, _render->m_uniformBuffer[compute.m_uniformIdx], compute.m_uniformBegin, compute.m_uniformEnd);
if (key.m_program != programIdx)
if (key.m_program.idx != currentProgram.idx)
{
programIdx = key.m_program;
currentProgram = key.m_program;
ProgramD3D11& program = m_program[key.m_program];
ProgramD3D11& program = m_program[currentProgram.idx];
m_currentProgram = &program;
deviceCtx->CSSetShader(program.m_vsh->m_computeShader, NULL, 0);
@ -5468,9 +5468,9 @@ namespace bgfx { namespace d3d11
constantsChanged = true;
}
if (kInvalidHandle != programIdx)
if (isValid(currentProgram) )
{
ProgramD3D11& program = m_program[programIdx];
ProgramD3D11& program = m_program[currentProgram.idx];
if (constantsChanged)
{
@ -5597,7 +5597,7 @@ namespace bgfx { namespace d3d11
PIX_BEGINEVENT(D3DCOLOR_DRAW, viewNameW);
}
programIdx = kInvalidHandle;
currentProgram = BGFX_INVALID_HANDLE;
m_currentProgram = NULL;
invalidateCompute();
@ -5748,11 +5748,11 @@ namespace bgfx { namespace d3d11
bool constantsChanged = draw.m_uniformBegin < draw.m_uniformEnd;
rendererUpdateUniforms(this, _render->m_uniformBuffer[draw.m_uniformIdx], draw.m_uniformBegin, draw.m_uniformEnd);
if (key.m_program != programIdx)
if (key.m_program.idx != currentProgram.idx)
{
programIdx = key.m_program;
currentProgram = key.m_program;
if (kInvalidHandle == programIdx)
if (!isValid(currentProgram) )
{
m_currentProgram = NULL;
@ -5761,7 +5761,7 @@ namespace bgfx { namespace d3d11
}
else
{
ProgramD3D11& program = m_program[programIdx];
ProgramD3D11& program = m_program[currentProgram.idx];
m_currentProgram = &program;
const ShaderD3D11* vsh = program.m_vsh;
@ -5785,9 +5785,9 @@ namespace bgfx { namespace d3d11
constantsChanged = true;
}
if (kInvalidHandle != programIdx)
if (isValid(currentProgram) )
{
ProgramD3D11& program = m_program[programIdx];
ProgramD3D11& program = m_program[currentProgram.idx];
if (constantsChanged)
{
@ -5931,12 +5931,12 @@ namespace bgfx { namespace d3d11
const VertexBufferD3D11& inst = m_vertexBuffers[draw.m_instanceDataBuffer.idx];
const uint32_t instStride = draw.m_instanceDataStride;
deviceCtx->IASetVertexBuffers(numStreams, 1, &inst.m_ptr, &instStride, &draw.m_instanceDataOffset);
setInputLayout(numStreams, decls, m_program[programIdx], uint16_t(instStride/16) );
setInputLayout(numStreams, decls, m_program[currentProgram.idx], uint16_t(instStride/16) );
}
else
{
deviceCtx->IASetVertexBuffers(numStreams, 1, s_zero.m_buffer, s_zero.m_zero, s_zero.m_zero);
setInputLayout(numStreams, decls, m_program[programIdx], 0);
setInputLayout(numStreams, decls, m_program[currentProgram.idx], 0);
}
}
else
@ -5948,7 +5948,7 @@ namespace bgfx { namespace d3d11
const VertexBufferD3D11& inst = m_vertexBuffers[draw.m_instanceDataBuffer.idx];
const uint32_t instStride = draw.m_instanceDataStride;
deviceCtx->IASetVertexBuffers(0, 1, &inst.m_ptr, &instStride, &draw.m_instanceDataOffset);
setInputLayout(0, NULL, m_program[programIdx], uint16_t(instStride/16) );
setInputLayout(0, NULL, m_program[currentProgram.idx], uint16_t(instStride/16) );
}
else
{

View File

@ -1928,7 +1928,7 @@ namespace bgfx { namespace d3d12
, packStencil(BGFX_STENCIL_DEFAULT, BGFX_STENCIL_DEFAULT)
, 1
, decls
, _blitter.m_program.idx
, _blitter.m_program
, 0
);
m_commandList->SetPipelineState(pso);
@ -1942,7 +1942,7 @@ namespace bgfx { namespace d3d12
setShaderUniform(flags, predefined.m_loc, proj, 4);
D3D12_GPU_VIRTUAL_ADDRESS gpuAddress;
commitShaderConstants(_blitter.m_program.idx, gpuAddress);
commitShaderConstants(_blitter.m_program, gpuAddress);
ScratchBufferD3D12& scratchBuffer = m_scratchBuffer[m_backBufferColorIdx];
ID3D12DescriptorHeap* heaps[] =
@ -2292,9 +2292,9 @@ namespace bgfx { namespace d3d12
setShaderUniform(_flags, _regIndex, _val, _numRegs);
}
void commitShaderConstants(uint16_t _programIdx, D3D12_GPU_VIRTUAL_ADDRESS& _gpuAddress)
void commitShaderConstants(ProgramHandle _program, D3D12_GPU_VIRTUAL_ADDRESS& _gpuAddress)
{
const ProgramD3D12& program = m_program[_programIdx];
const ProgramD3D12& program = m_program[_program.idx];
uint32_t total = bx::strideAlign(0
+ program.m_vsh->m_size
+ (NULL != program.m_fsh ? program.m_fsh->m_size : 0)
@ -2677,9 +2677,9 @@ namespace bgfx { namespace d3d12
}
}
ID3D12PipelineState* getPipelineState(uint16_t _programIdx)
ID3D12PipelineState* getPipelineState(ProgramHandle _program)
{
ProgramD3D12& program = m_program[_programIdx];
ProgramD3D12& program = m_program[_program.idx];
const uint32_t hash = program.m_vsh->m_hash;
@ -2712,11 +2712,11 @@ namespace bgfx { namespace d3d12
, uint64_t _stencil
, uint8_t _numStreams
, const VertexDecl** _vertexDecls
, uint16_t _programIdx
, ProgramHandle _program
, uint8_t _numInstanceData
)
{
ProgramD3D12& program = m_program[_programIdx];
ProgramD3D12& program = m_program[_program.idx];
_state &= 0
| BGFX_STATE_WRITE_RGB
@ -5661,7 +5661,7 @@ namespace bgfx { namespace d3d12
// setDebugWireframe(wireframe);
uint16_t currentSamplerStateIdx = kInvalidHandle;
uint16_t currentProgramIdx = kInvalidHandle;
ProgramHandle currentProgram = BGFX_INVALID_HANDLE;
uint32_t currentBindHash = 0;
bool hasPredefined = false;
bool commandListChanged = false;
@ -5784,7 +5784,7 @@ namespace bgfx { namespace d3d12
view = key.m_view;
currentPso = NULL;
currentSamplerStateIdx = kInvalidHandle;
currentProgramIdx = kInvalidHandle;
currentProgram = BGFX_INVALID_HANDLE;
hasPredefined = false;
fbh = _render->m_view[view].m_fbh;
@ -5980,12 +5980,12 @@ namespace bgfx { namespace d3d12
bool constantsChanged = false;
if (compute.m_uniformBegin < compute.m_uniformEnd
|| currentProgramIdx != key.m_program)
|| currentProgram.idx != key.m_program.idx)
{
rendererUpdateUniforms(this, _render->m_uniformBuffer[compute.m_uniformIdx], compute.m_uniformBegin, compute.m_uniformEnd);
currentProgramIdx = key.m_program;
ProgramD3D12& program = m_program[currentProgramIdx];
currentProgram = key.m_program;
ProgramD3D12& program = m_program[currentProgram.idx];
UniformBuffer* vcb = program.m_vsh->m_constantBuffer;
if (NULL != vcb)
@ -6000,7 +6000,7 @@ namespace bgfx { namespace d3d12
if (constantsChanged
|| hasPredefined)
{
ProgramD3D12& program = m_program[currentProgramIdx];
ProgramD3D12& program = m_program[currentProgram.idx];
viewState.setPredefined<4>(this, view, 0, program, _render, compute);
commitShaderConstants(key.m_program, gpuAddress);
m_commandList->SetComputeRootConstantBufferView(Rdt::CBV, gpuAddress);
@ -6113,7 +6113,7 @@ namespace bgfx { namespace d3d12
currentPso = NULL;
currentBindHash = 0;
currentSamplerStateIdx = kInvalidHandle;
currentProgramIdx = kInvalidHandle;
currentProgram = BGFX_INVALID_HANDLE;
currentState.clear();
currentState.m_scissor = !draw.m_scissor;
changedFlags = BGFX_STATE_MASK;
@ -6366,11 +6366,11 @@ namespace bgfx { namespace d3d12
}
if (constantsChanged
|| currentProgramIdx != key.m_program
|| currentProgram.idx != key.m_program.idx
|| BGFX_STATE_ALPHA_REF_MASK & changedFlags)
{
currentProgramIdx = key.m_program;
ProgramD3D12& program = m_program[currentProgramIdx];
currentProgram = key.m_program;
ProgramD3D12& program = m_program[currentProgram.idx];
UniformBuffer* vcb = program.m_vsh->m_constantBuffer;
if (NULL != vcb)
@ -6394,7 +6394,7 @@ namespace bgfx { namespace d3d12
if (constantsChanged
|| hasPredefined)
{
ProgramD3D12& program = m_program[currentProgramIdx];
ProgramD3D12& program = m_program[currentProgram.idx];
uint32_t ref = (newFlags&BGFX_STATE_ALPHA_REF_MASK)>>BGFX_STATE_ALPHA_REF_SHIFT;
viewState.m_alphaRef = ref/255.0f;
viewState.setPredefined<4>(this, view, 0, program, _render, draw);

View File

@ -3748,7 +3748,7 @@ namespace bgfx { namespace d3d9
ViewState viewState(_render, false);
DX_CHECK(device->SetRenderState(D3DRS_FILLMODE, _render->m_debug&BGFX_DEBUG_WIREFRAME ? D3DFILL_WIREFRAME : D3DFILL_SOLID) );
uint16_t programIdx = kInvalidHandle;
ProgramHandle currentProgram = BGFX_INVALID_HANDLE;
SortKey key;
uint16_t view = UINT16_MAX;
FrameBufferHandle fbh = { BGFX_CONFIG_MAX_FRAME_BUFFERS };
@ -3838,7 +3838,7 @@ namespace bgfx { namespace d3d9
currentState.m_stencil = newStencil;
view = key.m_view;
programIdx = kInvalidHandle;
currentProgram = BGFX_INVALID_HANDLE;
if (_render->m_view[view].m_fbh.idx != fbh.idx)
{
@ -4114,18 +4114,18 @@ namespace bgfx { namespace d3d9
bool constantsChanged = draw.m_uniformBegin < draw.m_uniformEnd;
rendererUpdateUniforms(this, _render->m_uniformBuffer[draw.m_uniformIdx], draw.m_uniformBegin, draw.m_uniformEnd);
if (key.m_program != programIdx)
if (key.m_program.idx != currentProgram.idx)
{
programIdx = key.m_program;
currentProgram = key.m_program;
if (kInvalidHandle == programIdx)
if (!isValid(currentProgram) )
{
device->SetVertexShader(NULL);
device->SetPixelShader(NULL);
}
else
{
ProgramD3D9& program = m_program[programIdx];
ProgramD3D9& program = m_program[currentProgram.idx];
device->SetVertexShader(program.m_vsh->m_vertexShader);
device->SetPixelShader(NULL == program.m_fsh
? NULL
@ -4137,9 +4137,9 @@ namespace bgfx { namespace d3d9
constantsChanged = true;
}
if (kInvalidHandle != programIdx)
if (isValid(currentProgram) )
{
ProgramD3D9& program = m_program[programIdx];
ProgramD3D9& program = m_program[currentProgram.idx];
if (constantsChanged)
{

View File

@ -6354,8 +6354,8 @@ BX_TRACE("%d, %d, %d, %s", _array, _srgb, _mipAutogen, getName(_format) );
static ViewState viewState;
viewState.reset(_render, hmdEnabled);
uint16_t programIdx = kInvalidHandle;
uint16_t boundProgramIdx = kInvalidHandle;
ProgramHandle currentProgram = BGFX_INVALID_HANDLE;
ProgramHandle boundProgram = BGFX_INVALID_HANDLE;
SortKey key;
uint16_t view = UINT16_MAX;
FrameBufferHandle fbh = { BGFX_CONFIG_MAX_FRAME_BUFFERS };
@ -6448,7 +6448,7 @@ BX_TRACE("%d, %d, %d, %s", _array, _srgb, _mipAutogen, getName(_format) );
}
view = key.m_view;
programIdx = kInvalidHandle;
currentProgram = BGFX_INVALID_HANDLE;
if (_render->m_view[view].m_fbh.idx != fbh.idx)
{
@ -6552,7 +6552,7 @@ BX_TRACE("%d, %d, %d, %s", _array, _srgb, _mipAutogen, getName(_format) );
{
const RenderCompute& compute = renderItem.compute;
ProgramGL& program = m_program[key.m_program];
ProgramGL& program = m_program[key.m_program.idx];
GL_CHECK(glUseProgram(program.m_id) );
GLbitfield barrier = 0;
@ -7036,13 +7036,13 @@ BX_TRACE("%d, %d, %d, %s", _array, _srgb, _mipAutogen, getName(_format) );
bool bindAttribs = false;
rendererUpdateUniforms(this, _render->m_uniformBuffer[draw.m_uniformIdx], draw.m_uniformBegin, draw.m_uniformEnd);
if (key.m_program != programIdx)
if (key.m_program.idx != currentProgram.idx)
{
programIdx = key.m_program;
GLuint id = kInvalidHandle == programIdx ? 0 : m_program[programIdx].m_id;
currentProgram = key.m_program;
GLuint id = isValid(currentProgram) ? m_program[currentProgram.idx].m_id : 0;
// Skip rendering if program index is valid, but program is invalid.
programIdx = 0 == id ? kInvalidHandle : programIdx;
currentProgram = 0 == id ? ProgramHandle{kInvalidHandle} : currentProgram;
GL_CHECK(glUseProgram(id) );
programChanged =
@ -7050,9 +7050,9 @@ BX_TRACE("%d, %d, %d, %s", _array, _srgb, _mipAutogen, getName(_format) );
bindAttribs = true;
}
if (kInvalidHandle != programIdx)
if (isValid(currentProgram) )
{
ProgramGL& program = m_program[programIdx];
ProgramGL& program = m_program[currentProgram.idx];
if (constantsChanged
&& NULL != program.m_constantBuffer)
@ -7183,13 +7183,13 @@ BX_TRACE("%d, %d, %d, %s", _array, _srgb, _mipAutogen, getName(_format) );
if (bindAttribs || diffStartVertex)
{
if(kInvalidHandle != boundProgramIdx)
if (isValid(boundProgram) )
{
ProgramGL& boundProgram = m_program[boundProgramIdx];
boundProgram.unbindAttributes();
m_program[boundProgram.idx].unbindAttributes();
boundProgram = BGFX_INVALID_HANDLE;
}
boundProgramIdx = programIdx;
boundProgram = currentProgram;
program.bindAttributesBegin();
@ -7379,10 +7379,10 @@ BX_TRACE("%d, %d, %d, %s", _array, _srgb, _mipAutogen, getName(_format) );
}
}
if(kInvalidHandle != boundProgramIdx)
if (isValid(boundProgram) )
{
ProgramGL& boundProgram = m_program[boundProgramIdx];
boundProgram.unbindAttributes();
m_program[boundProgram.idx].unbindAttributes();
boundProgram = BGFX_INVALID_HANDLE;
}
submitBlit(bs, BGFX_CONFIG_MAX_VIEWS);

View File

@ -1058,7 +1058,7 @@ namespace bgfx { namespace mtl
, 0
, fbh
, _blitter.m_vb->decl
, _blitter.m_program.idx
, _blitter.m_program
, 0
);
rce.setRenderPipelineState(pso);
@ -1425,7 +1425,7 @@ namespace bgfx { namespace mtl
, 0
, fbh
, _clearQuad.m_vb->decl
, _clearQuad.m_program[numMrt-1].idx
, _clearQuad.m_program[numMrt-1]
, 0
);
m_renderCommandEncoder.setRenderPipelineState(pso);
@ -1666,7 +1666,7 @@ namespace bgfx { namespace mtl
, FrameBufferHandle _fbh
, uint8_t _numStreams
, const VertexDecl** _vertexDecls
, uint16_t _programIdx
, ProgramHandle _program
, uint8_t _numInstanceData
)
{
@ -1681,7 +1681,7 @@ namespace bgfx { namespace mtl
);
const bool independentBlendEnable = !!(BGFX_STATE_BLEND_INDEPENDENT & _state);
ProgramMtl& program = m_program[_programIdx];
ProgramMtl& program = m_program[_program.idx];
bx::HashMurmur2A murmur;
murmur.begin();
@ -2040,7 +2040,7 @@ namespace bgfx { namespace mtl
, uint32_t _rgba
, FrameBufferHandle _fbh
, VertexDeclHandle _declHandle
, uint16_t _programIdx
, ProgramHandle _program
, uint16_t _numInstanceData
)
{
@ -2051,7 +2051,7 @@ namespace bgfx { namespace mtl
, _fbh
, 1
, &decl
, _programIdx
, _program
, _numInstanceData
);
}
@ -3421,7 +3421,7 @@ namespace bgfx { namespace mtl
bool wireframe = !!(_render->m_debug&BGFX_DEBUG_WIREFRAME);
uint16_t programIdx = kInvalidHandle;
ProgramHandle currentProgram = BGFX_INVALID_HANDLE;
SortKey key;
uint16_t view = UINT16_MAX;
FrameBufferHandle fbh = { BGFX_CONFIG_MAX_FRAME_BUFFERS };
@ -3484,7 +3484,7 @@ namespace bgfx { namespace mtl
}
view = key.m_view;
programIdx = kInvalidHandle;
currentProgram = BGFX_INVALID_HANDLE;
viewRestart = BGFX_VIEW_STEREO == (_render->m_view[view].m_flags & BGFX_VIEW_STEREO);
viewRestart &= hmdEnabled;
@ -3687,10 +3687,7 @@ namespace bgfx { namespace mtl
if (wasCompute)
{
wasCompute = false;
programIdx = kInvalidHandle;
//invalidateCompute();
currentProgram = BGFX_INVALID_HANDLE;
}
const RenderDraw& draw = renderItem.draw;
@ -3736,7 +3733,7 @@ namespace bgfx { namespace mtl
currentBind.clear();
programIdx = kInvalidHandle;
currentProgram = BGFX_INVALID_HANDLE;
setDepthStencilState(newFlags, packStencil(BGFX_STENCIL_DEFAULT, BGFX_STENCIL_DEFAULT) );
const uint64_t pt = newFlags&BGFX_STATE_PT_MASK;
@ -3840,7 +3837,7 @@ namespace bgfx { namespace mtl
bool vertexStreamChanged = hasVertexStreamChanged(currentState, draw);
if (key.m_program != programIdx
if (key.m_program.idx != currentProgram.idx
|| vertexStreamChanged
|| (0
| BGFX_STATE_BLEND_MASK
@ -3853,7 +3850,7 @@ namespace bgfx { namespace mtl
) & changedFlags
|| ( (blendFactor != draw.m_rgba) && !!(newFlags & BGFX_STATE_BLEND_INDEPENDENT) ) )
{
programIdx = key.m_program;
currentProgram = key.m_program;
currentState.m_streamMask = draw.m_streamMask;
currentState.m_instanceDataBuffer.idx = draw.m_instanceDataBuffer.idx;
@ -3896,7 +3893,7 @@ namespace bgfx { namespace mtl
currentState.m_numVertices = numVertices;
if (kInvalidHandle == programIdx)
if (!isValid(currentProgram) )
{
continue;
}
@ -3912,14 +3909,14 @@ namespace bgfx { namespace mtl
, fbh
, numStreams
, decls
, programIdx
, currentProgram
, draw.m_instanceDataStride/16
);
}
if (NULL == pso)
{
programIdx = kInvalidHandle;
currentProgram = BGFX_INVALID_HANDLE;
continue;
}
@ -3936,9 +3933,9 @@ namespace bgfx { namespace mtl
constantsChanged = true;
}
if (kInvalidHandle != programIdx)
if (isValid(currentProgram) )
{
ProgramMtl& program = m_program[programIdx];
ProgramMtl& program = m_program[currentProgram.idx];
uint32_t vertexUniformBufferSize = program.m_vshConstantBufferSize;
uint32_t fragmentUniformBufferSize = program.m_fshConstantBufferSize;
@ -3977,9 +3974,9 @@ namespace bgfx { namespace mtl
m_uniformBufferVertexOffset = m_uniformBufferFragmentOffset;
}
if (kInvalidHandle != programIdx)
if (isValid(currentProgram) )
{
ProgramMtl& program = m_program[programIdx];
ProgramMtl& program = m_program[currentProgram.idx];
for (uint32_t sampler = 0; sampler < program.m_samplerCount; ++sampler)
{

View File

@ -2278,9 +2278,9 @@ VK_IMPORT_DEVICE
setShaderUniform(_flags, _regIndex, _val, _numRegs);
}
void commitShaderUniforms(VkCommandBuffer _commandBuffer, uint16_t _programIdx)
void commitShaderUniforms(VkCommandBuffer _commandBuffer, ProgramHandle _program)
{
const ProgramVK& program = m_program[_programIdx];
const ProgramVK& program = m_program[_program.idx];
VkDescriptorBufferInfo descriptorBufferInfo;
uint32_t total = 0
+ program.m_vsh->m_size
@ -2590,16 +2590,16 @@ VK_IMPORT_DEVICE
return num;
}
VkPipeline getPipeline(uint16_t _programIdx)
VkPipeline getPipeline(ProgramHandle _program)
{
BX_UNUSED(_programIdx);
BX_UNUSED(_program);
// vkCreateComputePipelines
return VK_NULL_HANDLE;
}
VkPipeline getPipeline(uint64_t _state, uint64_t _stencil, uint16_t _declIdx, uint16_t _programIdx, uint8_t _numInstanceData)
VkPipeline getPipeline(uint64_t _state, uint64_t _stencil, uint16_t _declIdx, ProgramHandle _program, uint8_t _numInstanceData)
{
ProgramVK& program = m_program[_programIdx];
ProgramVK& program = m_program[_program.idx];
_state &= 0
| BGFX_STATE_WRITE_RGB
@ -3687,7 +3687,7 @@ VK_DESTROY
// setDebugWireframe(wireframe);
uint16_t currentSamplerStateIdx = kInvalidHandle;
uint16_t currentProgramIdx = kInvalidHandle;
ProgramHandle currentProgram = BGFX_INVALID_HANDLE;
uint32_t currentBindHash = 0;
bool hasPredefined = false;
bool commandListChanged = false;
@ -3811,7 +3811,7 @@ finishAll();
currentPipeline = VK_NULL_HANDLE;
currentSamplerStateIdx = kInvalidHandle;
BX_UNUSED(currentSamplerStateIdx);
currentProgramIdx = kInvalidHandle;
currentProgram = BGFX_INVALID_HANDLE;
hasPredefined = false;
fbh = _render->m_view[view].m_fbh;
@ -3976,12 +3976,12 @@ BX_UNUSED(currentSamplerStateIdx);
bool constantsChanged = false;
if (compute.m_uniformBegin < compute.m_uniformEnd
|| currentProgramIdx != key.m_program)
|| currentProgram.idx != key.m_program.idx)
{
rendererUpdateUniforms(this, _render->m_uniformBuffer[compute.m_uniformIdx], compute.m_uniformBegin, compute.m_uniformEnd);
currentProgramIdx = key.m_program;
ProgramVK& program = m_program[currentProgramIdx];
currentProgram = key.m_program;
ProgramVK& program = m_program[currentProgram.idx];
UniformBuffer* vcb = program.m_vsh->m_constantBuffer;
if (NULL != vcb)
@ -3996,7 +3996,7 @@ BX_UNUSED(currentSamplerStateIdx);
if (constantsChanged
|| hasPredefined)
{
ProgramVK& program = m_program[currentProgramIdx];
ProgramVK& program = m_program[currentProgram.idx];
viewState.setPredefined<4>(this, view, 0, program, _render, compute);
// commitShaderConstants(key.m_program, gpuAddress);
// m_commandList->SetComputeRootConstantBufferView(Rdt::CBV, gpuAddress);
@ -4092,7 +4092,7 @@ BX_UNUSED(currentSamplerStateIdx);
currentPipeline = VK_NULL_HANDLE;
currentBindHash = 0;
currentSamplerStateIdx = kInvalidHandle;
currentProgramIdx = kInvalidHandle;
currentProgram = BGFX_INVALID_HANDLE;
currentState.clear();
currentState.m_scissor = !draw.m_scissor;
changedFlags = BGFX_STATE_MASK;
@ -4272,11 +4272,11 @@ BX_UNUSED(currentSamplerStateIdx);
bool constantsChanged = false;
if (draw.m_uniformBegin < draw.m_uniformEnd
|| currentProgramIdx != key.m_program
|| currentProgram.idx != key.m_program.idx
|| BGFX_STATE_ALPHA_REF_MASK & changedFlags)
{
currentProgramIdx = key.m_program;
ProgramVK& program = m_program[currentProgramIdx];
currentProgram = key.m_program;
ProgramVK& program = m_program[currentProgram.idx];
UniformBuffer* vcb = program.m_vsh->m_constantBuffer;
if (NULL != vcb)
@ -4297,7 +4297,7 @@ BX_UNUSED(currentSamplerStateIdx);
if (constantsChanged
|| hasPredefined)
{
ProgramVK& program = m_program[currentProgramIdx];
ProgramVK& program = m_program[currentProgram.idx];
uint32_t ref = (newFlags&BGFX_STATE_ALPHA_REF_MASK)>>BGFX_STATE_ALPHA_REF_SHIFT;
viewState.m_alphaRef = ref/255.0f;
viewState.setPredefined<4>(this, view, 0, program, _render, draw);