Skip to content

Commit 517aba7

Browse files
authored
Handle front face set using cull mode. (#94)
Fixes lighting on Crisis City half pipes.
1 parent 25989c5 commit 517aba7

3 files changed

Lines changed: 72 additions & 10 deletions

File tree

MarathonRecomp/gpu/video.cpp

Lines changed: 65 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@ struct PipelineState
165165
RenderBlend srcBlend = RenderBlend::ONE;
166166
RenderBlend destBlend = RenderBlend::ZERO;
167167
RenderCullMode cullMode = RenderCullMode::NONE;
168+
RenderFrontFace frontFace = RenderFrontFace::CLOCKWISE;
168169
RenderComparisonFunction zFunc = RenderComparisonFunction::LESS;
169170
RenderComparisonFunction stencilFunc = RenderComparisonFunction::ALWAYS;
170171
RenderStencilOp stencilFail = RenderStencilOp::KEEP;
@@ -1256,14 +1257,16 @@ static void ProcSetRenderState(const RenderCommand& cmd)
12561257
RenderCullMode cullMode;
12571258

12581259
switch (value) {
1259-
case D3DCULL_NONE:
1260-
case D3DCULL_NONE_2:
1260+
case D3DCULL_NONE_CCW:
1261+
case D3DCULL_NONE_CW:
12611262
cullMode = RenderCullMode::NONE;
12621263
break;
1263-
case D3DCULL_CW:
1264+
case D3DCULL_FRONT_CCW:
1265+
case D3DCULL_FRONT_CW:
12641266
cullMode = RenderCullMode::FRONT;
12651267
break;
1266-
case D3DCULL_CCW:
1268+
case D3DCULL_BACK_CCW:
1269+
case D3DCULL_BACK_CW:
12671270
cullMode = RenderCullMode::BACK;
12681271
break;
12691272
default:
@@ -1273,6 +1276,7 @@ static void ProcSetRenderState(const RenderCommand& cmd)
12731276
}
12741277

12751278
SetDirtyValue(g_dirtyStates.pipelineState, g_pipelineState.cullMode, cullMode);
1279+
SetDirtyValue(g_dirtyStates.pipelineState, g_pipelineState.frontFace, value < D3DCULL_NONE_CW ? RenderFrontFace::COUNTER_CLOCKWISE : RenderFrontFace::CLOCKWISE);
12761280
break;
12771281
}
12781282
case D3DRS_ZFUNC:
@@ -4418,6 +4422,7 @@ static std::unique_ptr<RenderPipeline> CreateGraphicsPipeline(const PipelineStat
44184422
desc.depthClipEnabled = true;
44194423
desc.primitiveTopology = pipelineState.primitiveTopology;
44204424
desc.cullMode = pipelineState.cullMode;
4425+
desc.frontFace = pipelineState.frontFace;
44214426
desc.renderTargetFormat[0] = pipelineState.renderTargetFormat;
44224427
desc.renderTargetBlend[0].blendEnabled = pipelineState.alphaBlendEnable;
44234428
desc.renderTargetBlend[0].srcBlend = pipelineState.srcBlend;
@@ -4509,10 +4514,24 @@ static RenderPipeline* CreateGraphicsPipelineInRenderThread(PipelineState pipeli
45094514
" instancing: {}\n"
45104515
" zEnable: {}\n"
45114516
" zWriteEnable: {}\n"
4517+
" stencilEnable: {}\n"
4518+
" stencilTwoSided: {}\n"
45124519
" srcBlend: {}\n"
45134520
" destBlend: {}\n"
45144521
" cullMode: {}\n"
4522+
" frontFace: {}\n"
45154523
" zFunc: {}\n"
4524+
" stencilFunc: {}\n"
4525+
" stencilFail: {}\n"
4526+
" stencilZFail: {}\n"
4527+
" stencilPass: {}\n"
4528+
" stencilFuncCCW: {}\n"
4529+
" stencilFailCCW: {}\n"
4530+
" stencilZFailCCW: {}\n"
4531+
" stencilPassCCW: {}\n"
4532+
" stencilMask: {}\n"
4533+
" stencilWriteMask: {}\n"
4534+
" stencilRef: {}\n"
45164535
" alphaBlendEnable: {}\n"
45174536
" blendOp: {}\n"
45184537
" slopeScaledDepthBias: {}\n"
@@ -4538,10 +4557,24 @@ static RenderPipeline* CreateGraphicsPipelineInRenderThread(PipelineState pipeli
45384557
pipelineState.instancing,
45394558
pipelineState.zEnable,
45404559
pipelineState.zWriteEnable,
4560+
pipelineState.stencilEnable,
4561+
pipelineState.stencilTwoSided,
45414562
magic_enum::enum_name(pipelineState.srcBlend),
45424563
magic_enum::enum_name(pipelineState.destBlend),
45434564
magic_enum::enum_name(pipelineState.cullMode),
4565+
magic_enum::enum_name(pipelineState.frontFace),
45444566
magic_enum::enum_name(pipelineState.zFunc),
4567+
magic_enum::enum_name(pipelineState.stencilFunc),
4568+
magic_enum::enum_name(pipelineState.stencilFail),
4569+
magic_enum::enum_name(pipelineState.stencilZFail),
4570+
magic_enum::enum_name(pipelineState.stencilPass),
4571+
magic_enum::enum_name(pipelineState.stencilFuncCCW),
4572+
magic_enum::enum_name(pipelineState.stencilFailCCW),
4573+
magic_enum::enum_name(pipelineState.stencilZFailCCW),
4574+
magic_enum::enum_name(pipelineState.stencilPassCCW),
4575+
pipelineState.stencilMask,
4576+
pipelineState.stencilWriteMask,
4577+
pipelineState.stencilRef,
45454578
pipelineState.alphaBlendEnable,
45464579
magic_enum::enum_name(pipelineState.blendOp),
45474580
pipelineState.slopeScaledDepthBias,
@@ -7810,7 +7843,6 @@ class SDLEventListenerForPSOCaching : public SDLEventListener
78107843
pipelineState.sampleCount = 1;
78117844
pipelineState.enableAlphaToCoverage = false;
78127845

7813-
pipelineState.specConstants &= ~SPEC_CONSTANT_BICUBIC_GI_FILTER;
78147846
if ((pipelineState.specConstants & SPEC_CONSTANT_ALPHA_TO_COVERAGE) != 0)
78157847
{
78167848
pipelineState.specConstants &= ~SPEC_CONSTANT_ALPHA_TO_COVERAGE;
@@ -7840,10 +7872,24 @@ class SDLEventListenerForPSOCaching : public SDLEventListener
78407872
"{},"
78417873
"{},"
78427874
"{},"
7875+
"{},"
7876+
"{},"
78437877
"RenderBlend::{},"
78447878
"RenderBlend::{},"
78457879
"RenderCullMode::{},"
7880+
"RenderFrontFace::{},"
7881+
"RenderComparisonFunction::{},"
7882+
"RenderComparisonFunction::{},"
7883+
"RenderStencilOp::{},"
7884+
"RenderStencilOp::{},"
7885+
"RenderStencilOp::{},"
78467886
"RenderComparisonFunction::{},"
7887+
"RenderStencilOp::{},"
7888+
"RenderStencilOp::{},"
7889+
"RenderStencilOp::{},"
7890+
"{},"
7891+
"{},"
7892+
"{},"
78477893
"{},"
78487894
"RenderBlendOperation::{},"
78497895
"{},"
@@ -7865,10 +7911,24 @@ class SDLEventListenerForPSOCaching : public SDLEventListener
78657911
pipelineState.instancing,
78667912
pipelineState.zEnable,
78677913
pipelineState.zWriteEnable,
7914+
pipelineState.stencilEnable,
7915+
pipelineState.stencilTwoSided,
78687916
magic_enum::enum_name(pipelineState.srcBlend),
78697917
magic_enum::enum_name(pipelineState.destBlend),
78707918
magic_enum::enum_name(pipelineState.cullMode),
7919+
magic_enum::enum_name(pipelineState.frontFace),
78717920
magic_enum::enum_name(pipelineState.zFunc),
7921+
magic_enum::enum_name(pipelineState.stencilFunc),
7922+
magic_enum::enum_name(pipelineState.stencilFail),
7923+
magic_enum::enum_name(pipelineState.stencilZFail),
7924+
magic_enum::enum_name(pipelineState.stencilPass),
7925+
magic_enum::enum_name(pipelineState.stencilFuncCCW),
7926+
magic_enum::enum_name(pipelineState.stencilFailCCW),
7927+
magic_enum::enum_name(pipelineState.stencilZFailCCW),
7928+
magic_enum::enum_name(pipelineState.stencilPassCCW),
7929+
pipelineState.stencilMask,
7930+
pipelineState.stencilWriteMask,
7931+
pipelineState.stencilRef,
78727932
pipelineState.alphaBlendEnable,
78737933
magic_enum::enum_name(pipelineState.blendOp),
78747934
pipelineState.slopeScaledDepthBias,

MarathonRecomp/gpu/video.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -386,10 +386,12 @@ enum GuestRenderState
386386

387387
enum GuestCullMode
388388
{
389-
D3DCULL_NONE = 0,
390-
D3DCULL_CW = 2,
391-
D3DCULL_NONE_2 = 4,
392-
D3DCULL_CCW = 6
389+
D3DCULL_NONE_CCW = 0,
390+
D3DCULL_FRONT_CCW = 1,
391+
D3DCULL_BACK_CCW = 2,
392+
D3DCULL_NONE_CW = 4,
393+
D3DCULL_FRONT_CW = 5,
394+
D3DCULL_BACK_CW = 6
393395
};
394396

395397
enum GuestBlendMode

0 commit comments

Comments
 (0)