mirror of
https://github.com/cemu-project/Cemu.git
synced 2025-01-08 08:00:44 +01:00
set stencil reference value
This commit is contained in:
parent
a50ce997df
commit
e0791c3bf4
@ -3112,7 +3112,7 @@ static void _emitExportCode(LatteDecompilerShaderContext* shaderContext, LatteDe
|
|||||||
if (shaderContext->analyzer.outputPointSize)
|
if (shaderContext->analyzer.outputPointSize)
|
||||||
{
|
{
|
||||||
cemu_assert_debug(shaderContext->analyzer.writesPointSize);
|
cemu_assert_debug(shaderContext->analyzer.writesPointSize);
|
||||||
src->add("gl_PointSize = (");
|
src->add("out.pointSize = (");
|
||||||
_emitExportGPRReadCode(shaderContext, cfInstruction, LATTE_DECOMPILER_DTYPE_FLOAT, 0);
|
_emitExportGPRReadCode(shaderContext, cfInstruction, LATTE_DECOMPILER_DTYPE_FLOAT, 0);
|
||||||
src->add(").x");
|
src->add(").x");
|
||||||
src->add(";" _CRLF);
|
src->add(";" _CRLF);
|
||||||
@ -4113,12 +4113,12 @@ void LatteDecompiler_emitMSLShader(LatteDecompilerShaderContext* shaderContext,
|
|||||||
if (shader->shaderType == LatteConst::ShaderType::Vertex && shaderContext->options->usesGeometryShader == false)
|
if (shader->shaderType == LatteConst::ShaderType::Vertex && shaderContext->options->usesGeometryShader == false)
|
||||||
src->add("out.pointSize = supportBuffer.pointSize;" _CRLF);
|
src->add("out.pointSize = supportBuffer.pointSize;" _CRLF);
|
||||||
}
|
}
|
||||||
// HACK: this should be handled outside of the shader, because clipping currently wouldn't work
|
// HACK: this should be handled outside of the shader, because clipping currently wouldn't work (or would it?)
|
||||||
if (shader->shaderType == LatteConst::ShaderType::Vertex)
|
if (shader->shaderType == LatteConst::ShaderType::Vertex)
|
||||||
{
|
{
|
||||||
// Convert depth from the range of [-1, 1] to [0, 1]
|
// TODO: check this
|
||||||
src->add("out.position /= out.position.w;" _CRLF);
|
// MoltenVK does this
|
||||||
src->add("out.position.z = out.position.z * 0.5 + 0.5;" _CRLF);
|
src->add("out.position.z = (out.position.z + out.position.w) / 2.0;" _CRLF);
|
||||||
}
|
}
|
||||||
// return
|
// return
|
||||||
src->add("return out;" _CRLF);
|
src->add("return out;" _CRLF);
|
||||||
|
@ -37,27 +37,26 @@ MTL::DepthStencilState* MetalDepthStencilCache::GetDepthStencilState(const Latte
|
|||||||
}
|
}
|
||||||
desc->setDepthCompareFunction(depthCompareFunc);
|
desc->setDepthCompareFunction(depthCompareFunc);
|
||||||
|
|
||||||
// get stencil control parameters
|
// Stencil state
|
||||||
bool stencilEnable = LatteGPUState.contextNew.DB_DEPTH_CONTROL.get_STENCIL_ENABLE();
|
bool stencilEnable = LatteGPUState.contextNew.DB_DEPTH_CONTROL.get_STENCIL_ENABLE();
|
||||||
bool backStencilEnable = LatteGPUState.contextNew.DB_DEPTH_CONTROL.get_BACK_STENCIL_ENABLE();
|
|
||||||
auto frontStencilFunc = LatteGPUState.contextNew.DB_DEPTH_CONTROL.get_STENCIL_FUNC_F();
|
|
||||||
auto frontStencilZPass = LatteGPUState.contextNew.DB_DEPTH_CONTROL.get_STENCIL_ZPASS_F();
|
|
||||||
auto frontStencilZFail = LatteGPUState.contextNew.DB_DEPTH_CONTROL.get_STENCIL_ZFAIL_F();
|
|
||||||
auto frontStencilFail = LatteGPUState.contextNew.DB_DEPTH_CONTROL.get_STENCIL_FAIL_F();
|
|
||||||
auto backStencilFunc = LatteGPUState.contextNew.DB_DEPTH_CONTROL.get_STENCIL_FUNC_B();
|
|
||||||
auto backStencilZPass = LatteGPUState.contextNew.DB_DEPTH_CONTROL.get_STENCIL_ZPASS_B();
|
|
||||||
auto backStencilZFail = LatteGPUState.contextNew.DB_DEPTH_CONTROL.get_STENCIL_ZFAIL_B();
|
|
||||||
auto backStencilFail = LatteGPUState.contextNew.DB_DEPTH_CONTROL.get_STENCIL_FAIL_B();
|
|
||||||
// get stencil control parameters
|
|
||||||
uint32 stencilCompareMaskFront = LatteGPUState.contextNew.DB_STENCILREFMASK.get_STENCILMASK_F();
|
|
||||||
uint32 stencilWriteMaskFront = LatteGPUState.contextNew.DB_STENCILREFMASK.get_STENCILWRITEMASK_F();
|
|
||||||
uint32 stencilRefFront = LatteGPUState.contextNew.DB_STENCILREFMASK.get_STENCILREF_F();
|
|
||||||
uint32 stencilCompareMaskBack = LatteGPUState.contextNew.DB_STENCILREFMASK_BF.get_STENCILMASK_B();
|
|
||||||
uint32 stencilWriteMaskBack = LatteGPUState.contextNew.DB_STENCILREFMASK_BF.get_STENCILWRITEMASK_B();
|
|
||||||
uint32 stencilRefBack = LatteGPUState.contextNew.DB_STENCILREFMASK_BF.get_STENCILREF_B();
|
|
||||||
|
|
||||||
if (stencilEnable)
|
if (stencilEnable)
|
||||||
{
|
{
|
||||||
|
// get stencil control parameters
|
||||||
|
bool backStencilEnable = LatteGPUState.contextNew.DB_DEPTH_CONTROL.get_BACK_STENCIL_ENABLE();
|
||||||
|
auto frontStencilFunc = LatteGPUState.contextNew.DB_DEPTH_CONTROL.get_STENCIL_FUNC_F();
|
||||||
|
auto frontStencilZPass = LatteGPUState.contextNew.DB_DEPTH_CONTROL.get_STENCIL_ZPASS_F();
|
||||||
|
auto frontStencilZFail = LatteGPUState.contextNew.DB_DEPTH_CONTROL.get_STENCIL_ZFAIL_F();
|
||||||
|
auto frontStencilFail = LatteGPUState.contextNew.DB_DEPTH_CONTROL.get_STENCIL_FAIL_F();
|
||||||
|
auto backStencilFunc = LatteGPUState.contextNew.DB_DEPTH_CONTROL.get_STENCIL_FUNC_B();
|
||||||
|
auto backStencilZPass = LatteGPUState.contextNew.DB_DEPTH_CONTROL.get_STENCIL_ZPASS_B();
|
||||||
|
auto backStencilZFail = LatteGPUState.contextNew.DB_DEPTH_CONTROL.get_STENCIL_ZFAIL_B();
|
||||||
|
auto backStencilFail = LatteGPUState.contextNew.DB_DEPTH_CONTROL.get_STENCIL_FAIL_B();
|
||||||
|
// get stencil control parameters
|
||||||
|
uint32 stencilCompareMaskFront = LatteGPUState.contextNew.DB_STENCILREFMASK.get_STENCILMASK_F();
|
||||||
|
uint32 stencilWriteMaskFront = LatteGPUState.contextNew.DB_STENCILREFMASK.get_STENCILWRITEMASK_F();
|
||||||
|
uint32 stencilCompareMaskBack = LatteGPUState.contextNew.DB_STENCILREFMASK_BF.get_STENCILMASK_B();
|
||||||
|
uint32 stencilWriteMaskBack = LatteGPUState.contextNew.DB_STENCILREFMASK_BF.get_STENCILWRITEMASK_B();
|
||||||
|
|
||||||
MTL::StencilDescriptor* frontStencil = MTL::StencilDescriptor::alloc()->init();
|
MTL::StencilDescriptor* frontStencil = MTL::StencilDescriptor::alloc()->init();
|
||||||
// TODO: set reference
|
// TODO: set reference
|
||||||
//depthStencilState.front.reference = stencilRefFront;
|
//depthStencilState.front.reference = stencilRefFront;
|
||||||
|
@ -603,6 +603,19 @@ void MetalRenderer::draw_execute(uint32 baseVertex, uint32 baseInstance, uint32
|
|||||||
MTL::DepthStencilState* depthStencilState = m_depthStencilCache->GetDepthStencilState(LatteGPUState.contextNew);
|
MTL::DepthStencilState* depthStencilState = m_depthStencilCache->GetDepthStencilState(LatteGPUState.contextNew);
|
||||||
renderCommandEncoder->setDepthStencilState(depthStencilState);
|
renderCommandEncoder->setDepthStencilState(depthStencilState);
|
||||||
|
|
||||||
|
// Stencil reference
|
||||||
|
bool stencilEnable = LatteGPUState.contextNew.DB_DEPTH_CONTROL.get_STENCIL_ENABLE();
|
||||||
|
if (stencilEnable)
|
||||||
|
{
|
||||||
|
bool backStencilEnable = LatteGPUState.contextNew.DB_DEPTH_CONTROL.get_BACK_STENCIL_ENABLE();
|
||||||
|
uint32 stencilRefFront = LatteGPUState.contextNew.DB_STENCILREFMASK.get_STENCILREF_F();
|
||||||
|
uint32 stencilRefBack = LatteGPUState.contextNew.DB_STENCILREFMASK_BF.get_STENCILREF_B();
|
||||||
|
if (backStencilEnable)
|
||||||
|
renderCommandEncoder->setStencilReferenceValues(stencilRefFront, stencilRefBack);
|
||||||
|
else
|
||||||
|
renderCommandEncoder->setStencilReferenceValue(stencilRefFront);
|
||||||
|
}
|
||||||
|
|
||||||
// Primitive type
|
// Primitive type
|
||||||
const LattePrimitiveMode primitiveMode = static_cast<LattePrimitiveMode>(LatteGPUState.contextRegister[mmVGT_PRIMITIVE_TYPE]);
|
const LattePrimitiveMode primitiveMode = static_cast<LattePrimitiveMode>(LatteGPUState.contextRegister[mmVGT_PRIMITIVE_TYPE]);
|
||||||
auto mtlPrimitiveType = GetMtlPrimitiveType(primitiveMode);
|
auto mtlPrimitiveType = GetMtlPrimitiveType(primitiveMode);
|
||||||
|
Loading…
Reference in New Issue
Block a user