@@ -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
0 commit comments