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

View File

@ -1034,46 +1034,58 @@ namespace bgfx
uint64_t encodeDraw(Enum _type) 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; case SortProgram:
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 depth = (uint64_t(m_depth ) << SORT_KEY_DRAW_0_DEPTH_SHIFT ) & SORT_KEY_DRAW_0_DEPTH_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_DRAW_0_PROGRAM_SHIFT) & SORT_KEY_DRAW_0_PROGRAM_MASK;
const uint64_t key = view|SORT_KEY_DRAW_BIT|SORT_KEY_DRAW_TYPE_DEPTH|depth|trans|program; 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; return key;
} }
else if (SortSequence == _type) break;
{
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;
BX_CHECK(seq == (uint64_t(m_seq) << SORT_KEY_DRAW_2_SEQ_SHIFT) case SortDepth:
, "SortKey error, sequence is truncated (m_seq: %d)." {
, m_seq 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; BX_CHECK(false, "You should not be here.");
const uint64_t program = (uint64_t(m_program) << SORT_KEY_DRAW_0_PROGRAM_SHIFT) & SORT_KEY_DRAW_0_PROGRAM_MASK; return 0;
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;
} }
uint64_t encodeCompute() uint64_t encodeCompute()
{ {
const uint64_t program = (uint64_t(m_program) << SORT_KEY_COMPUTE_PROGRAM_SHIFT) & SORT_KEY_COMPUTE_PROGRAM_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 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 view = (uint64_t(m_view ) << SORT_KEY_VIEW_SHIFT ) & SORT_KEY_VIEW_MASK;
const uint64_t key = program|seq|view; const uint64_t key = program|seq|view;
BX_CHECK(seq == (uint64_t(m_seq) << SORT_KEY_COMPUTE_SEQ_SHIFT) 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; uint64_t type = _key & SORT_KEY_DRAW_TYPE_MASK;
if (type == SORT_KEY_DRAW_TYPE_DEPTH) 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; return false;
} }
else if (type == SORT_KEY_DRAW_TYPE_SEQUENCE) 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; 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 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 return true; // compute
} }
@ -1127,16 +1139,16 @@ namespace bgfx
{ {
m_depth = 0; m_depth = 0;
m_seq = 0; m_seq = 0;
m_program = 0; m_program = {0};
m_view = 0; m_view = 0;
m_trans = 0; m_trans = 0;
} }
uint32_t m_depth; uint32_t m_depth;
uint32_t m_seq; uint32_t m_seq;
uint16_t m_program; ProgramHandle m_program;
ViewId m_view; ViewId m_view;
uint8_t m_trans; uint8_t m_trans;
}; };
#undef SORT_KEY_RENDER_DRAW #undef SORT_KEY_RENDER_DRAW
@ -1796,7 +1808,7 @@ namespace bgfx
{ {
SortKey term; SortKey term;
term.reset(); term.reset();
term.m_program = kInvalidHandle; term.m_program = BGFX_INVALID_HANDLE;
m_sortKeys[BGFX_CONFIG_MAX_DRAW_CALLS] = term.encodeDraw(SortKey::SortProgram); m_sortKeys[BGFX_CONFIG_MAX_DRAW_CALLS] = term.encodeDraw(SortKey::SortProgram);
m_sortValues[BGFX_CONFIG_MAX_DRAW_CALLS] = BGFX_CONFIG_MAX_DRAW_CALLS; m_sortValues[BGFX_CONFIG_MAX_DRAW_CALLS] = BGFX_CONFIG_MAX_DRAW_CALLS;
bx::memSet(m_occlusion, 0xff, sizeof(m_occlusion) ); bx::memSet(m_occlusion, 0xff, sizeof(m_occlusion) );

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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