@@ -37,8 +37,6 @@ MTL::DepthStencilState* MetalDepthStencilCache::GetDepthStencilState(const Latte
37
37
}
38
38
desc->setDepthCompareFunction (depthCompareFunc);
39
39
40
- // TODO: stencil state
41
- /*
42
40
// get stencil control parameters
43
41
bool stencilEnable = LatteGPUState.contextNew .DB_DEPTH_CONTROL .get_STENCIL_ENABLE ();
44
42
bool backStencilEnable = LatteGPUState.contextNew .DB_DEPTH_CONTROL .get_BACK_STENCIL_ENABLE ();
@@ -58,48 +56,47 @@ MTL::DepthStencilState* MetalDepthStencilCache::GetDepthStencilState(const Latte
58
56
uint32 stencilWriteMaskBack = LatteGPUState.contextNew .DB_STENCILREFMASK_BF .get_STENCILWRITEMASK_B ();
59
57
uint32 stencilRefBack = LatteGPUState.contextNew .DB_STENCILREFMASK_BF .get_STENCILREF_B ();
60
58
61
- static const VkStencilOp stencilOpTable[8] = {
62
- VK_STENCIL_OP_KEEP,
63
- VK_STENCIL_OP_ZERO,
64
- VK_STENCIL_OP_REPLACE,
65
- VK_STENCIL_OP_INCREMENT_AND_CLAMP,
66
- VK_STENCIL_OP_DECREMENT_AND_CLAMP,
67
- VK_STENCIL_OP_INVERT,
68
- VK_STENCIL_OP_INCREMENT_AND_WRAP,
69
- VK_STENCIL_OP_DECREMENT_AND_WRAP
70
- };
71
-
72
- depthStencilState.stencilTestEnable = stencilEnable ? VK_TRUE : VK_FALSE;
73
-
74
- depthStencilState.front.reference = stencilRefFront;
75
- depthStencilState.front.compareMask = stencilCompareMaskFront;
76
- depthStencilState.front.writeMask = stencilWriteMaskBack;
77
- depthStencilState.front.compareOp = vkDepthCompareTable[(size_t)frontStencilFunc];
78
- depthStencilState.front.depthFailOp = stencilOpTable[(size_t)frontStencilZFail];
79
- depthStencilState.front.failOp = stencilOpTable[(size_t)frontStencilFail];
80
- depthStencilState.front.passOp = stencilOpTable[(size_t)frontStencilZPass];
81
-
82
- if (backStencilEnable)
83
- {
84
- depthStencilState.back.reference = stencilRefBack;
85
- depthStencilState.back.compareMask = stencilCompareMaskBack;
86
- depthStencilState.back.writeMask = stencilWriteMaskBack;
87
- depthStencilState.back.compareOp = vkDepthCompareTable[(size_t)backStencilFunc];
88
- depthStencilState.back.depthFailOp = stencilOpTable[(size_t)backStencilZFail];
89
- depthStencilState.back.failOp = stencilOpTable[(size_t)backStencilFail];
90
- depthStencilState.back.passOp = stencilOpTable[(size_t)backStencilZPass];
91
- }
92
- else
59
+ if (stencilEnable)
93
60
{
94
- depthStencilState.back.reference = stencilRefFront;
95
- depthStencilState.back.compareMask = stencilCompareMaskFront;
96
- depthStencilState.back.writeMask = stencilWriteMaskFront;
97
- depthStencilState.back.compareOp = vkDepthCompareTable[(size_t)frontStencilFunc];
98
- depthStencilState.back.depthFailOp = stencilOpTable[(size_t)frontStencilZFail];
99
- depthStencilState.back.failOp = stencilOpTable[(size_t)frontStencilFail];
100
- depthStencilState.back.passOp = stencilOpTable[(size_t)frontStencilZPass];
61
+ MTL::StencilDescriptor* frontStencil = MTL::StencilDescriptor::alloc ()->init ();
62
+ // TODO: set reference
63
+ // depthStencilState.front.reference = stencilRefFront;
64
+ frontStencil->setReadMask (stencilCompareMaskFront);
65
+ frontStencil->setWriteMask (stencilWriteMaskFront);
66
+ frontStencil->setStencilCompareFunction (GetMtlCompareFunc (frontStencilFunc));
67
+ frontStencil->setDepthFailureOperation (GetMtlStencilOp (frontStencilZFail));
68
+ frontStencil->setStencilFailureOperation (GetMtlStencilOp (frontStencilFail));
69
+ frontStencil->setDepthStencilPassOperation (GetMtlStencilOp (frontStencilZPass));
70
+ desc->setFrontFaceStencil (frontStencil);
71
+
72
+ MTL::StencilDescriptor* backStencil = MTL::StencilDescriptor::alloc ()->init ();
73
+ if (backStencilEnable)
74
+ {
75
+ // TODO: set reference
76
+ // depthStencilState.back.reference = stencilRefBack;
77
+ backStencil->setReadMask (stencilCompareMaskBack);
78
+ backStencil->setWriteMask (stencilWriteMaskBack);
79
+ backStencil->setStencilCompareFunction (GetMtlCompareFunc (backStencilFunc));
80
+ backStencil->setDepthFailureOperation (GetMtlStencilOp (backStencilZFail));
81
+ backStencil->setStencilFailureOperation (GetMtlStencilOp (backStencilFail));
82
+ backStencil->setDepthStencilPassOperation (GetMtlStencilOp (backStencilZPass));
83
+ }
84
+ else
85
+ {
86
+ // TODO: set reference
87
+ // depthStencilState.back.reference = stencilRefFront;
88
+ backStencil->setReadMask (stencilCompareMaskFront);
89
+ backStencil->setWriteMask (stencilWriteMaskFront);
90
+ backStencil->setStencilCompareFunction (GetMtlCompareFunc (frontStencilFunc));
91
+ backStencil->setDepthFailureOperation (GetMtlStencilOp (frontStencilZFail));
92
+ backStencil->setStencilFailureOperation (GetMtlStencilOp (frontStencilFail));
93
+ backStencil->setDepthStencilPassOperation (GetMtlStencilOp (frontStencilZPass));
94
+ }
95
+ desc->setBackFaceStencil (backStencil);
96
+
97
+ frontStencil->release ();
98
+ backStencil->release ();
101
99
}
102
- */
103
100
104
101
depthStencilState = m_mtlr->GetDevice ()->newDepthStencilState (desc);
105
102
desc->release ();
0 commit comments