Implement tessellation pipeline state

This commit is contained in:
Billy Laws
2022-09-02 13:18:24 +01:00
parent 3649d4c779
commit 90cd6adb91
5 changed files with 109 additions and 13 deletions

View File

@ -434,6 +434,48 @@ namespace skyline::gpu::interconnect::maxwell3d {
inputAssemblyState.primitiveRestartEnable = enabled;
}
/* Tessellation State */
void TessellationState::EngineRegisters::DirtyBind(DirtyManager &manager, dirty::Handle handle) const {
manager.Bind(handle, patchControlPoints, tessellationParameters);
}
const vk::PipelineTessellationStateCreateInfo &TessellationState::Build() {
return tessellationState;
}
void TessellationState::SetPatchControlPoints(u32 patchControlPoints) {
tessellationState.patchControlPoints = patchControlPoints;
}
Shader::TessPrimitive ConvertShaderTessPrimitive(engine::TessellationParameters::DomainType domainType) {
switch (domainType) {
case engine::TessellationParameters::DomainType::Isoline:
return Shader::TessPrimitive::Isolines;
case engine::TessellationParameters::DomainType::Triangle:
return Shader::TessPrimitive::Triangles;
case engine::TessellationParameters::DomainType::Quad:
return Shader::TessPrimitive::Quads;
}
}
Shader::TessSpacing ConvertShaderTessSpacing(engine::TessellationParameters::Spacing spacing) {
switch (spacing) {
case engine::TessellationParameters::Spacing::Integer:
return Shader::TessSpacing::Equal;
case engine::TessellationParameters::Spacing::FractionalEven:
return Shader::TessSpacing::FractionalEven;
case engine::TessellationParameters::Spacing::FractionalOdd:
return Shader::TessSpacing::FractionalOdd;
}
}
void TessellationState::SetParameters(engine::TessellationParameters params) {
// UpdateRuntimeInformation(runtimeInfo.tess_primitive, ConvertShaderTessPrimitive(params.domainType), maxwell3d::PipelineStage::TessellationEvaluation);
// UpdateRuntimeInformation(runtimeInfo.tess_spacing, ConvertShaderTessSpacing(params.spacing), maxwell3d::PipelineStage::TessellationEvaluation);
// UpdateRuntimeInformation(runtimeInfo.tess_clockwise, params.outputPrimitive == engine::TessellationParameters::OutputPrimitives::TrianglesCW,
// maxwell3d::PipelineStage::TessellationEvaluation);
}
/* Pipeline State */
void PipelineState::EngineRegisters::DirtyBind(DirtyManager &manager, dirty::Handle handle) const {
auto bindFunc{[&](auto &regs) { regs.DirtyBind(manager, handle); }};
@ -455,6 +497,7 @@ namespace skyline::gpu::interconnect::maxwell3d {
auto vertexState{directState.vertexInput.Build(ctx, engine->vertexInputRegisters)};
auto inputAssemblyState{directState.inputAssembly.Build()};
auto tessellationState{directState.tessellationState.Build()};
}

View File

@ -114,12 +114,32 @@ namespace skyline::gpu::interconnect::maxwell3d {
void SetPrimitiveRestart(bool enable);
};
struct TessellationState {
private:
vk::PipelineTessellationStateCreateInfo tessellationState{};
public:
struct EngineRegisters {
const u32 &patchControlPoints;
const engine::TessellationParameters &tessellationParameters;
void DirtyBind(DirtyManager &manager, dirty::Handle handle) const;
};
const vk::PipelineTessellationStateCreateInfo &Build();
void SetPatchControlPoints(u32 controlPoints);
void SetParameters(engine::TessellationParameters parameters);
};
/**
* @brief Holds pipeline state that is directly written by the engine code, without using dirty tracking
*/
struct DirectPipelineState {
VertexInputState vertexInput;
InputAssemblyState inputAssembly;
TessellationState tessellation;
};
/**
@ -132,6 +152,7 @@ namespace skyline::gpu::interconnect::maxwell3d {
DepthRenderTargetState::EngineRegisters depthRenderTargetRegisters;
VertexInputState::EngineRegisters vertexInputRegisters;
InputAssemblyState::EngineRegisters inputAssemblyRegisters;
TessellationState::EngineRegisters tessellationRegisters;
void DirtyBind(DirtyManager &manager, dirty::Handle handle) const;
};