Skip to content

Commit e0791c3

Browse files
committed
set stencil reference value
1 parent a50ce99 commit e0791c3

File tree

3 files changed

+35
-23
lines changed

3 files changed

+35
-23
lines changed

src/Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompilerEmitMSL.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3112,7 +3112,7 @@ static void _emitExportCode(LatteDecompilerShaderContext* shaderContext, LatteDe
31123112
if (shaderContext->analyzer.outputPointSize)
31133113
{
31143114
cemu_assert_debug(shaderContext->analyzer.writesPointSize);
3115-
src->add("gl_PointSize = (");
3115+
src->add("out.pointSize = (");
31163116
_emitExportGPRReadCode(shaderContext, cfInstruction, LATTE_DECOMPILER_DTYPE_FLOAT, 0);
31173117
src->add(").x");
31183118
src->add(";" _CRLF);
@@ -4113,12 +4113,12 @@ void LatteDecompiler_emitMSLShader(LatteDecompilerShaderContext* shaderContext,
41134113
if (shader->shaderType == LatteConst::ShaderType::Vertex && shaderContext->options->usesGeometryShader == false)
41144114
src->add("out.pointSize = supportBuffer.pointSize;" _CRLF);
41154115
}
4116-
// HACK: this should be handled outside of the shader, because clipping currently wouldn't work
4116+
// HACK: this should be handled outside of the shader, because clipping currently wouldn't work (or would it?)
41174117
if (shader->shaderType == LatteConst::ShaderType::Vertex)
41184118
{
4119-
// Convert depth from the range of [-1, 1] to [0, 1]
4120-
src->add("out.position /= out.position.w;" _CRLF);
4121-
src->add("out.position.z = out.position.z * 0.5 + 0.5;" _CRLF);
4119+
// TODO: check this
4120+
// MoltenVK does this
4121+
src->add("out.position.z = (out.position.z + out.position.w) / 2.0;" _CRLF);
41224122
}
41234123
// return
41244124
src->add("return out;" _CRLF);

src/Cafe/HW/Latte/Renderer/Metal/MetalDepthStencilCache.cpp

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -37,27 +37,26 @@ MTL::DepthStencilState* MetalDepthStencilCache::GetDepthStencilState(const Latte
3737
}
3838
desc->setDepthCompareFunction(depthCompareFunc);
3939

40-
// get stencil control parameters
40+
// Stencil state
4141
bool stencilEnable = LatteGPUState.contextNew.DB_DEPTH_CONTROL.get_STENCIL_ENABLE();
42-
bool backStencilEnable = LatteGPUState.contextNew.DB_DEPTH_CONTROL.get_BACK_STENCIL_ENABLE();
43-
auto frontStencilFunc = LatteGPUState.contextNew.DB_DEPTH_CONTROL.get_STENCIL_FUNC_F();
44-
auto frontStencilZPass = LatteGPUState.contextNew.DB_DEPTH_CONTROL.get_STENCIL_ZPASS_F();
45-
auto frontStencilZFail = LatteGPUState.contextNew.DB_DEPTH_CONTROL.get_STENCIL_ZFAIL_F();
46-
auto frontStencilFail = LatteGPUState.contextNew.DB_DEPTH_CONTROL.get_STENCIL_FAIL_F();
47-
auto backStencilFunc = LatteGPUState.contextNew.DB_DEPTH_CONTROL.get_STENCIL_FUNC_B();
48-
auto backStencilZPass = LatteGPUState.contextNew.DB_DEPTH_CONTROL.get_STENCIL_ZPASS_B();
49-
auto backStencilZFail = LatteGPUState.contextNew.DB_DEPTH_CONTROL.get_STENCIL_ZFAIL_B();
50-
auto backStencilFail = LatteGPUState.contextNew.DB_DEPTH_CONTROL.get_STENCIL_FAIL_B();
51-
// get stencil control parameters
52-
uint32 stencilCompareMaskFront = LatteGPUState.contextNew.DB_STENCILREFMASK.get_STENCILMASK_F();
53-
uint32 stencilWriteMaskFront = LatteGPUState.contextNew.DB_STENCILREFMASK.get_STENCILWRITEMASK_F();
54-
uint32 stencilRefFront = LatteGPUState.contextNew.DB_STENCILREFMASK.get_STENCILREF_F();
55-
uint32 stencilCompareMaskBack = LatteGPUState.contextNew.DB_STENCILREFMASK_BF.get_STENCILMASK_B();
56-
uint32 stencilWriteMaskBack = LatteGPUState.contextNew.DB_STENCILREFMASK_BF.get_STENCILWRITEMASK_B();
57-
uint32 stencilRefBack = LatteGPUState.contextNew.DB_STENCILREFMASK_BF.get_STENCILREF_B();
58-
5942
if (stencilEnable)
6043
{
44+
// get stencil control parameters
45+
bool backStencilEnable = LatteGPUState.contextNew.DB_DEPTH_CONTROL.get_BACK_STENCIL_ENABLE();
46+
auto frontStencilFunc = LatteGPUState.contextNew.DB_DEPTH_CONTROL.get_STENCIL_FUNC_F();
47+
auto frontStencilZPass = LatteGPUState.contextNew.DB_DEPTH_CONTROL.get_STENCIL_ZPASS_F();
48+
auto frontStencilZFail = LatteGPUState.contextNew.DB_DEPTH_CONTROL.get_STENCIL_ZFAIL_F();
49+
auto frontStencilFail = LatteGPUState.contextNew.DB_DEPTH_CONTROL.get_STENCIL_FAIL_F();
50+
auto backStencilFunc = LatteGPUState.contextNew.DB_DEPTH_CONTROL.get_STENCIL_FUNC_B();
51+
auto backStencilZPass = LatteGPUState.contextNew.DB_DEPTH_CONTROL.get_STENCIL_ZPASS_B();
52+
auto backStencilZFail = LatteGPUState.contextNew.DB_DEPTH_CONTROL.get_STENCIL_ZFAIL_B();
53+
auto backStencilFail = LatteGPUState.contextNew.DB_DEPTH_CONTROL.get_STENCIL_FAIL_B();
54+
// get stencil control parameters
55+
uint32 stencilCompareMaskFront = LatteGPUState.contextNew.DB_STENCILREFMASK.get_STENCILMASK_F();
56+
uint32 stencilWriteMaskFront = LatteGPUState.contextNew.DB_STENCILREFMASK.get_STENCILWRITEMASK_F();
57+
uint32 stencilCompareMaskBack = LatteGPUState.contextNew.DB_STENCILREFMASK_BF.get_STENCILMASK_B();
58+
uint32 stencilWriteMaskBack = LatteGPUState.contextNew.DB_STENCILREFMASK_BF.get_STENCILWRITEMASK_B();
59+
6160
MTL::StencilDescriptor* frontStencil = MTL::StencilDescriptor::alloc()->init();
6261
// TODO: set reference
6362
//depthStencilState.front.reference = stencilRefFront;

src/Cafe/HW/Latte/Renderer/Metal/MetalRenderer.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -603,6 +603,19 @@ void MetalRenderer::draw_execute(uint32 baseVertex, uint32 baseInstance, uint32
603603
MTL::DepthStencilState* depthStencilState = m_depthStencilCache->GetDepthStencilState(LatteGPUState.contextNew);
604604
renderCommandEncoder->setDepthStencilState(depthStencilState);
605605

606+
// Stencil reference
607+
bool stencilEnable = LatteGPUState.contextNew.DB_DEPTH_CONTROL.get_STENCIL_ENABLE();
608+
if (stencilEnable)
609+
{
610+
bool backStencilEnable = LatteGPUState.contextNew.DB_DEPTH_CONTROL.get_BACK_STENCIL_ENABLE();
611+
uint32 stencilRefFront = LatteGPUState.contextNew.DB_STENCILREFMASK.get_STENCILREF_F();
612+
uint32 stencilRefBack = LatteGPUState.contextNew.DB_STENCILREFMASK_BF.get_STENCILREF_B();
613+
if (backStencilEnable)
614+
renderCommandEncoder->setStencilReferenceValues(stencilRefFront, stencilRefBack);
615+
else
616+
renderCommandEncoder->setStencilReferenceValue(stencilRefFront);
617+
}
618+
606619
// Primitive type
607620
const LattePrimitiveMode primitiveMode = static_cast<LattePrimitiveMode>(LatteGPUState.contextRegister[mmVGT_PRIMITIVE_TYPE]);
608621
auto mtlPrimitiveType = GetMtlPrimitiveType(primitiveMode);

0 commit comments

Comments
 (0)