mirror of
https://github.com/Takiiiiiiii/strato.git
synced 2025-07-17 08:46:39 +00:00
Implement tessellation pipeline state
This commit is contained in:
@ -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 ®s) { 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()};
|
||||
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
};
|
||||
|
Reference in New Issue
Block a user