Skip to content

Commit 5b2f0a1

Browse files
committed
Expand stencil state to 64 bits and update handling
1 parent 80a2bc1 commit 5b2f0a1

7 files changed

Lines changed: 135 additions & 80 deletions

File tree

src/vrhi_generated.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -502,12 +502,12 @@ struct VIDL_vhCmdSetStateStencil
502502
static constexpr uint64_t kMagic = 0x007FD9BA;
503503
uint64_t MAGIC = kMagic;
504504
vhStateId id;
505-
uint32_t front;
506-
uint32_t back;
505+
uint64_t front;
506+
uint64_t back;
507507

508508
VIDL_vhCmdSetStateStencil() = default;
509509

510-
VIDL_vhCmdSetStateStencil(vhStateId _id, uint32_t _front, uint32_t _back)
510+
VIDL_vhCmdSetStateStencil(vhStateId _id, uint64_t _front, uint64_t _back)
511511
: id(_id), front(_front), back(_back) {}
512512
};
513513

src/vrhi_internal.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,7 @@ void vhWriteStateToGlobalUniform( const vhState& state, vhGlobalUniform& out );
277277
void vhWriteStateToWorldUniform( const vhState& state, vhWorldUniform& out );
278278
nvrhi::PrimitiveType vhTranslatePrimitiveType( uint64_t stateFlags );
279279
nvrhi::BlendState vhTranslateBlendState( uint64_t stateFlags );
280-
nvrhi::DepthStencilState vhTranslateDepthStencilState( uint64_t stateFlags, uint32_t frontStencil, uint32_t backStencil );
280+
nvrhi::DepthStencilState vhTranslateDepthStencilState( uint64_t stateFlags, uint64_t frontStencil, uint64_t backStencil );
281281
nvrhi::RasterState vhTranslateRasterState( uint64_t stateFlags );
282282
nvrhi::VariableShadingRate vhTranslateShadingRate( uint32_t rate );
283283
nvrhi::ShadingRateCombiner vhTranslateShadingRateCombiner( uint32_t combiner );

src/vrhi_state.cpp

Lines changed: 49 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ void vhCmdSetStateDebugFlags( vhStateId id, uint64_t flags )
7070
vhCmdEnqueue( new VIDL_vhCmdSetStateDebugFlags( id, flags ) );
7171
}
7272

73-
void vhCmdSetStateStencil( vhStateId id, uint32_t front, uint32_t back )
73+
void vhCmdSetStateStencil( vhStateId id, uint64_t front, uint64_t back )
7474
{
7575
vhCmdEnqueue( new VIDL_vhCmdSetStateStencil( id, front, back ) );
7676
}
@@ -344,11 +344,11 @@ nvrhi::BlendState vhTranslateBlendState( uint64_t stateFlags )
344344
return blendState;
345345
}
346346

347-
nvrhi::DepthStencilState vhTranslateDepthStencilState( uint64_t stateFlags, uint32_t frontStencil, uint32_t backStencil )
347+
nvrhi::DepthStencilState vhTranslateDepthStencilState( uint64_t stateFlags, uint64_t frontStencil, uint64_t backStencil )
348348
{
349349
nvrhi::DepthStencilState dsState;
350350

351-
auto fnConvertComparisonFunc = []( uint32_t func ) -> nvrhi::ComparisonFunc
351+
auto fnConvertComparisonFunc = []( uint64_t func ) -> nvrhi::ComparisonFunc
352352
{
353353
switch ( func )
354354
{
@@ -366,7 +366,7 @@ nvrhi::DepthStencilState vhTranslateDepthStencilState( uint64_t stateFlags, uint
366366

367367
dsState.depthWriteEnable = ( stateFlags & VRHI_STATE_WRITE_Z ) != 0;
368368

369-
uint32_t depthFunc = ( uint32_t ) ( ( stateFlags & VRHI_STATE_DEPTH_TEST_MASK ) >> VRHI_STATE_DEPTH_TEST_SHIFT );
369+
uint64_t depthFunc = ( uint64_t ) ( ( stateFlags & VRHI_STATE_DEPTH_TEST_MASK ) >> VRHI_STATE_DEPTH_TEST_SHIFT );
370370
if ( depthFunc != 0 )
371371
{
372372
dsState.depthTestEnable = true;
@@ -383,7 +383,7 @@ nvrhi::DepthStencilState vhTranslateDepthStencilState( uint64_t stateFlags, uint
383383
dsState.depthFunc = nvrhi::ComparisonFunc::Less;
384384
}
385385

386-
auto fnConvertStencilOp = []( uint32_t op ) -> nvrhi::StencilOp
386+
auto fnConvertStencilOp = []( uint64_t op ) -> nvrhi::StencilOp
387387
{
388388
switch ( op )
389389
{
@@ -399,12 +399,25 @@ nvrhi::DepthStencilState vhTranslateDepthStencilState( uint64_t stateFlags, uint
399399
}
400400
};
401401

402-
auto fnUnpackStencil = [&]( uint32_t packed, nvrhi::DepthStencilState::StencilOpDesc& desc )
402+
auto fnUnpackStencilFront = [&]( uint64_t packed, nvrhi::DepthStencilState::StencilOpDesc& desc )
403403
{
404-
uint32_t failOp = ( packed & VRHI_STENCIL_OP_FAIL_S_MASK ) >> VRHI_STENCIL_OP_FAIL_S_SHIFT;
405-
uint32_t depthFailOp = ( packed & VRHI_STENCIL_OP_FAIL_Z_MASK ) >> VRHI_STENCIL_OP_FAIL_Z_SHIFT;
406-
uint32_t passOp = ( packed & VRHI_STENCIL_OP_PASS_Z_MASK ) >> VRHI_STENCIL_OP_PASS_Z_SHIFT;
407-
uint32_t func = ( packed & VRHI_STENCIL_TEST_MASK ) >> VRHI_STENCIL_TEST_SHIFT;
404+
uint64_t failOp = ( packed & VRHI_STENCIL_OP_FAIL_S_MASK ) >> VRHI_STENCIL_OP_FAIL_S_SHIFT;
405+
uint64_t depthFailOp = ( packed & VRHI_STENCIL_OP_FAIL_Z_MASK ) >> VRHI_STENCIL_OP_FAIL_Z_SHIFT;
406+
uint64_t passOp = ( packed & VRHI_STENCIL_OP_PASS_Z_MASK ) >> VRHI_STENCIL_OP_PASS_Z_SHIFT;
407+
uint64_t func = ( packed & VRHI_STENCIL_TEST_MASK ) >> VRHI_STENCIL_TEST_SHIFT;
408+
409+
desc.failOp = fnConvertStencilOp( failOp );
410+
desc.depthFailOp = fnConvertStencilOp( depthFailOp );
411+
desc.passOp = fnConvertStencilOp( passOp );
412+
desc.stencilFunc = fnConvertComparisonFunc( func );
413+
};
414+
415+
auto fnUnpackStencilBack = [&]( uint64_t packed, nvrhi::DepthStencilState::StencilOpDesc& desc )
416+
{
417+
uint64_t failOp = ( packed & VRHI_STENCIL_BACK_OP_FAIL_S_MASK ) >> VRHI_STENCIL_BACK_OP_FAIL_S_SHIFT;
418+
uint64_t depthFailOp = ( packed & VRHI_STENCIL_BACK_OP_FAIL_Z_MASK ) >> VRHI_STENCIL_BACK_OP_FAIL_Z_SHIFT;
419+
uint64_t passOp = ( packed & VRHI_STENCIL_BACK_OP_PASS_Z_MASK ) >> VRHI_STENCIL_BACK_OP_PASS_Z_SHIFT;
420+
uint64_t func = ( packed & VRHI_STENCIL_BACK_TEST_MASK ) >> VRHI_STENCIL_BACK_TEST_SHIFT;
408421

409422
desc.failOp = fnConvertStencilOp( failOp );
410423
desc.depthFailOp = fnConvertStencilOp( depthFailOp );
@@ -415,20 +428,43 @@ nvrhi::DepthStencilState vhTranslateDepthStencilState( uint64_t stateFlags, uint
415428
if ( frontStencil != VRHI_STENCIL_NONE || backStencil != VRHI_STENCIL_NONE )
416429
{
417430
dsState.stencilEnable = true;
418-
fnUnpackStencil( frontStencil, dsState.frontFaceStencil );
431+
fnUnpackStencilFront( frontStencil, dsState.frontFaceStencil );
432+
433+
bool backFaceSet = false;
419434

420435
if ( backStencil != VRHI_STENCIL_NONE )
421436
{
422-
fnUnpackStencil( backStencil, dsState.backFaceStencil );
437+
fnUnpackStencilFront( backStencil, dsState.backFaceStencil );
438+
backFaceSet = true;
423439
}
424440
else
441+
{
442+
// Check if frontStencil contains baked Back Face bits (mask 0xFFFF0000000000)
443+
if ( ( frontStencil & 0xFFFF0000000000ULL ) != 0 )
444+
{
445+
fnUnpackStencilBack( frontStencil, dsState.backFaceStencil );
446+
backFaceSet = true;
447+
}
448+
}
449+
450+
if ( !backFaceSet )
425451
{
426452
dsState.backFaceStencil = dsState.frontFaceStencil;
427453
}
428454

429455
dsState.stencilRefValue = ( uint8_t ) ( ( frontStencil & VRHI_STENCIL_FUNC_REF_MASK ) >> VRHI_STENCIL_FUNC_REF_SHIFT );
430456
dsState.stencilReadMask = ( uint8_t ) ( ( frontStencil & VRHI_STENCIL_FUNC_RMASK_MASK ) >> VRHI_STENCIL_FUNC_RMASK_SHIFT );
431-
dsState.stencilWriteMask = dsState.stencilReadMask;
457+
458+
uint8_t wmask = ( uint8_t ) ( ( frontStencil & VRHI_STENCIL_FUNC_WMASK_MASK ) >> VRHI_STENCIL_FUNC_WMASK_SHIFT );
459+
if ( wmask != 0 || ( frontStencil & VRHI_STENCIL_FUNC_WMASK_MASK ) != 0 )
460+
{
461+
dsState.stencilWriteMask = wmask;
462+
}
463+
else
464+
{
465+
dsState.stencilWriteMask = dsState.stencilReadMask;
466+
}
467+
432468
dsState.dynamicStencilRef = false;
433469
}
434470

test/test_gfx.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -460,7 +460,7 @@ UTEST_F( Graphics, DepthTest )
460460
state.SetVertexBuffer( vbNear, 0 );
461461

462462
vhStateId sidNear = 401;
463-
vhSetState( sidNear, state );
463+
vhSetState( sidNear, state.DirtyAll() );
464464
vhDraw( sidNear, 6 );
465465
vhFinish();
466466

@@ -518,7 +518,7 @@ UTEST_F( Graphics, StencilTest )
518518
.SetStencil( VRHI_STENCIL_TEST_EQUAL | VRHI_STENCIL_OP_FAIL_S_KEEP | VRHI_STENCIL_OP_FAIL_Z_KEEP | VRHI_STENCIL_OP_PASS_Z_KEEP | VRHI_STENCIL_FUNC_REF( 0 ) );
519519

520520
vhStateId sid2 = 502;
521-
vhSetState( sid2, state );
521+
vhSetState( sid2, state.DirtyAll() );
522522
vhClear( sid2, VRHI_CLEAR_COLOR );
523523
vhDraw( sid2, 6 );
524524
vhFinish();
@@ -528,7 +528,7 @@ UTEST_F( Graphics, StencilTest )
528528
state.SetStencil( VRHI_STENCIL_TEST_EQUAL | VRHI_STENCIL_OP_FAIL_S_KEEP | VRHI_STENCIL_OP_FAIL_Z_KEEP | VRHI_STENCIL_OP_PASS_Z_KEEP | VRHI_STENCIL_FUNC_REF( 1 ) );
529529

530530
vhStateId sid3 = 503;
531-
vhSetState( sid3, state );
531+
vhSetState( sid3, state.DirtyAll() );
532532
vhClear( sid3, VRHI_CLEAR_COLOR );
533533
vhDraw( sid3, 6 );
534534
vhFinish();
@@ -634,7 +634,7 @@ UTEST_F( Graphics, Culling )
634634
.SetVertexBuffer( vbCCW, 0 );
635635

636636
vhStateId sidCCW = 601;
637-
vhSetState( sidCCW, state );
637+
vhSetState( sidCCW, state.DirtyAll() );
638638
vhClear( sidCCW, VRHI_CLEAR_COLOR );
639639
vhDraw( sidCCW, 3 );
640640
vhFinish();
@@ -1344,7 +1344,7 @@ UTEST_F( Graphics, ClearTexture )
13441344

13451345
// Clear to green
13461346
state.SetClearColor( glm::vec4( 0.0f, 1.0f, 0.0f, 1.0f ) );
1347-
vhSetState( sid, state );
1347+
vhSetState( sid, state.DirtyAll() );
13481348
vhClear( sid, VRHI_CLEAR_COLOR );
13491349
vhFlush();
13501350

test/test_shader.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ UTEST( ShaderInternal, StateToDesc )
9292

9393
// Test Stencil Enable & Unpacking (Unified)
9494
{
95-
uint32_t stencil =
95+
uint64_t stencil =
9696
VRHI_STENCIL_FUNC_REF( 0x80 ) |
9797
VRHI_STENCIL_FUNC_RMASK( 0xFF ) |
9898
VRHI_STENCIL_TEST_EQUAL |
@@ -119,8 +119,8 @@ UTEST( ShaderInternal, StateToDesc )
119119

120120
// Test Stencil Separate
121121
{
122-
uint32_t front = VRHI_STENCIL_TEST_ALWAYS | VRHI_STENCIL_OP_PASS_Z_KEEP;
123-
uint32_t back = VRHI_STENCIL_TEST_NEVER | VRHI_STENCIL_OP_PASS_Z_REPLACE;
122+
uint64_t front = VRHI_STENCIL_TEST_ALWAYS | VRHI_STENCIL_OP_PASS_Z_KEEP;
123+
uint64_t back = VRHI_STENCIL_TEST_NEVER | VRHI_STENCIL_OP_PASS_Z_REPLACE;
124124

125125
nvrhi::DepthStencilState ds = vhTranslateDepthStencilState( VRHI_STATE_DEFAULT, front, back );
126126

vrhi.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -697,8 +697,8 @@ struct vhState
697697
float clearDepth = 1.0f;
698698
uint8_t clearStencil = 0;
699699

700-
uint32_t frontStencil = 0;
701-
uint32_t backStencil = 0;
700+
uint64_t frontStencil = 0;
701+
uint64_t backStencil = 0;
702702

703703
glm::vec4 pushConstants = glm::vec4( 0.0f, 0.0f, 0.0f, 0.0f );
704704

@@ -861,7 +861,7 @@ struct vhState
861861
}
862862
vhState& SetStateFlags( uint64_t flags ) { stateFlags = flags; dirty |= VRHI_DIRTY_PIPELINE; return *this; }
863863
vhState& SetDebugFlags( uint64_t flags ) { debugFlags = flags; dirty |= VRHI_DIRTY_PIPELINE; return *this; }
864-
vhState& SetStencil( uint32_t front, uint32_t back = 0 )
864+
vhState& SetStencil( uint64_t front, uint64_t back = 0 )
865865
{
866866
frontStencil = front;
867867
backStencil = back;

0 commit comments

Comments
 (0)