1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2024-12-02 10:24:12 +01:00

[dxbc] Added support for the control point phase in Hull Shaders

This commit is contained in:
Philip Rebohle 2018-03-05 17:23:00 +01:00
parent 4688b2cc5a
commit b2f5b262f7
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
2 changed files with 55 additions and 2 deletions

View File

@ -498,6 +498,11 @@ namespace dxvk {
"oDepthLe");
} break;
case DxbcOperandType::OutputControlPointId: {
// The hull shader's invocation
// ID has been declared already
} break;
case DxbcOperandType::InputForkInstanceId:
case DxbcOperandType::InputJoinInstanceId: {
auto phase = this->getCurrentHsForkJoinPhase();
@ -1074,6 +1079,8 @@ namespace dxvk {
// dcl_input_control_points has the control point
// count embedded within the opcode token.
m_hs.vertexCountIn = ins.controls.controlPointCount;
emitDclInputArray(m_hs.vertexCountIn);
}
@ -2377,6 +2384,15 @@ namespace dxvk {
m_hs.currPhaseType = DxbcCompilerHsPhase::Decl;
} break;
case DxbcOpcode::HsControlPointPhase: {
m_hs.cpPhase = this->emitNewHullShaderControlPointPhase();
m_hs.currPhaseType = DxbcCompilerHsPhase::ControlPoint;
m_hs.currPhaseId = 0;
m_module.setDebugName(m_hs.cpPhase.functionId, "hs_control_point");
} break;
case DxbcOpcode::HsForkPhase: {
auto phase = this->emitNewHullShaderForkJoinPhase();
m_hs.forkPhases.push_back(phase);
@ -4052,6 +4068,11 @@ namespace dxvk {
{ DxbcScalarType::Float32, 1 },
m_ps.builtinDepth };
case DxbcOperandType::OutputControlPointId:
return DxbcRegisterPointer {
{ DxbcScalarType::Uint32, 1 },
m_hs.builtinInvocationId };
case DxbcOperandType::InputForkInstanceId:
return DxbcRegisterPointer {
{ DxbcScalarType::Uint32, 1 },
@ -5000,6 +5021,13 @@ namespace dxvk {
m_module.enableCapability(spv::CapabilityClipDistance);
m_module.enableCapability(spv::CapabilityCullDistance);
m_hs.builtinInvocationId = emitNewBuiltinVariable(
DxbcRegisterInfo {
{ DxbcScalarType::Uint32, 1, 0 },
spv::StorageClassInput },
spv::BuiltInInvocationId,
"vOutputControlPointId");
m_hs.builtinTessLevelOuter = emitBuiltinTessLevelOuter(spv::StorageClassOutput);
m_hs.builtinTessLevelInner = emitBuiltinTessLevelInner(spv::StorageClassOutput);
}
@ -5119,6 +5147,8 @@ namespace dxvk {
void DxbcCompiler::emitHsFinalize() {
emitInputSetup(m_hs.vertexCountIn);
this->emitHsControlPointPhase(m_hs.cpPhase);
if (m_hs.forkPhases.size() != 0
@ -5169,7 +5199,11 @@ namespace dxvk {
void DxbcCompiler::emitHsControlPointPhase(
const DxbcCompilerHsControlPointPhase& phase) {
if (phase.functionId != 0) {
m_module.opFunctionCall(
m_module.defVoidType(),
phase.functionId, 0, nullptr);
}
}
@ -5232,6 +5266,22 @@ namespace dxvk {
}
DxbcCompilerHsControlPointPhase DxbcCompiler::emitNewHullShaderControlPointPhase() {
uint32_t funTypeId = m_module.defFunctionType(
m_module.defVoidType(), 0, nullptr);
uint32_t funId = m_module.allocateId();
m_module.functionBegin(m_module.defVoidType(),
funId, funTypeId, spv::FunctionControlMaskNone);
m_module.opLabel(m_module.allocateId());
DxbcCompilerHsControlPointPhase result;
result.functionId = funId;
return result;
}
DxbcCompilerHsForkJoinPhase DxbcCompiler::emitNewHullShaderForkJoinPhase() {
uint32_t argTypeId = m_module.defIntType(32, 0);
uint32_t funTypeId = m_module.defFunctionType(

View File

@ -173,7 +173,7 @@ namespace dxvk {
* point phase program of a hull shader.
*/
struct DxbcCompilerHsControlPointPhase {
uint32_t functionId = 0;
uint32_t functionId = 0;
};
@ -202,6 +202,7 @@ namespace dxvk {
uint32_t vertexCountIn = 0;
uint32_t vertexCountOut = 0;
uint32_t builtinInvocationId = 0;
uint32_t builtinTessLevelOuter = 0;
uint32_t builtinTessLevelInner = 0;
@ -878,6 +879,8 @@ namespace dxvk {
uint32_t vertexCount,
const char* varName);
DxbcCompilerHsControlPointPhase emitNewHullShaderControlPointPhase();
DxbcCompilerHsForkJoinPhase emitNewHullShaderForkJoinPhase();
///////////////////////////////