diff --git a/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/pipeline_state.cpp b/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/pipeline_state.cpp index 137380f6..d6fadaaf 100644 --- a/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/pipeline_state.cpp +++ b/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/pipeline_state.cpp @@ -383,15 +383,14 @@ namespace skyline::gpu::interconnect::maxwell3d { /* Tessellation State */ void TessellationState::EngineRegisters::DirtyBind(DirtyManager &manager, dirty::Handle handle) const { - manager.Bind(handle, patchControlPoints, tessellationParameters); + manager.Bind(handle, patchSize, tessellationParameters); } - const vk::PipelineTessellationStateCreateInfo &TessellationState::Build() { - return tessellationState; - } + TessellationState::TessellationState(const EngineRegisters &engine) : engine{engine} {} - void TessellationState::SetPatchControlPoints(u32 patchControlPoints) { - tessellationState.patchControlPoints = patchControlPoints; + void TessellationState::Update(Key &key) { + key.patchSize = engine.patchSize; + key.SetTessellationParameters(engine.tessellationParameters); } Shader::TessPrimitive ConvertShaderTessPrimitive(engine::TessellationParameters::DomainType domainType) { @@ -416,12 +415,12 @@ namespace skyline::gpu::interconnect::maxwell3d { } } - void TessellationState::SetParameters(engine::TessellationParameters params) { + // 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); - } + // } /* Rasterizer State */ void RasterizationState::EngineRegisters::DirtyBind(DirtyManager &manager, dirty::Handle handle) const { @@ -774,6 +773,7 @@ namespace skyline::gpu::interconnect::maxwell3d { colorRenderTargets{util::MergeInto, engine::ColorTargetCount>(manager, engine.colorRenderTargetsRegisters, util::IncrementingT{})}, depthRenderTarget{manager, engine.depthRenderTargetRegisters}, vertexInput{manager, engine.vertexInputRegisters}, + tessellation{engine.tessellationRegisters}, rasterization{manager, engine.rasterizationRegisters}, depthStencil{manager, engine.depthStencilRegisters}, colorBlend{manager, engine.colorBlendRegisters}, @@ -790,7 +790,7 @@ namespace skyline::gpu::interconnect::maxwell3d { vertexInput.Update(key); directState.inputAssembly.Update(key); - const auto &tessellationState{directState.tessellation.Build()}; + tessellation.Update(key); const auto &rasterizationState{rasterization.UpdateGet().rasterizationState}; vk::PipelineMultisampleStateCreateInfo multisampleState{ .rasterizationSamples = vk::SampleCountFlagBits::e1 diff --git a/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/pipeline_state.h b/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/pipeline_state.h index 6dbc2ba1..63c93f07 100644 --- a/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/pipeline_state.h +++ b/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/pipeline_state.h @@ -14,6 +14,9 @@ namespace skyline::gpu::interconnect::maxwell3d { u8 ztFormat : 5; //!< Use {Set, Get}ZtFormat. ZtFormat - 0xA as u8 engine::DrawTopology topology : 4; bool primitiveRestartEnabled : 1; + engine::TessellationParameters::DomainType domainType : 2; //!< Use SetTessellationParameters + engine::TessellationParameters::Spacing spacing : 2; //!< Use SetTessellationParameters + engine::TessellationParameters::OutputPrimitives outputPrimitives : 2; //!< Use SetTessellationParameters }; struct VertexBinding { @@ -25,6 +28,7 @@ namespace skyline::gpu::interconnect::maxwell3d { }; static_assert(sizeof(VertexBinding) == 0x8); + u32 patchSize; std::array ctFormats; //!< Use {Set, Get}CtFormat. ColorTarget::Format as u8 std::array vertexBindings; //!< Use {Set, Get}VertexBinding std::array vertexAttributes; @@ -43,6 +47,12 @@ namespace skyline::gpu::interconnect::maxwell3d { vertexBindings[index].enable = stream.format.enable; vertexBindings[index].divisor = stream.frequency; } + + void SetTessellationParameters(engine::TessellationParameters parameters) { + domainType = parameters.domainType; + spacing = parameters.spacing; + outputPrimitives = parameters.outputPrimitives; + } }; class ColorRenderTargetState : dirty::ManualDirty { @@ -134,23 +144,22 @@ namespace skyline::gpu::interconnect::maxwell3d { bool NeedsQuadConversion() const; }; - struct TessellationState { - private: - vk::PipelineTessellationStateCreateInfo tessellationState{}; - + class TessellationState { public: struct EngineRegisters { - const u32 &patchControlPoints; + const u32 &patchSize; const engine::TessellationParameters &tessellationParameters; void DirtyBind(DirtyManager &manager, dirty::Handle handle) const; }; - const vk::PipelineTessellationStateCreateInfo &Build(); + private: + EngineRegisters engine; - void SetPatchControlPoints(u32 controlPoints); + public: + TessellationState(const EngineRegisters &engine); - void SetParameters(engine::TessellationParameters parameters); + void Update(Key &key); }; /** @@ -158,7 +167,6 @@ namespace skyline::gpu::interconnect::maxwell3d { */ struct DirectPipelineState { InputAssemblyState inputAssembly; - TessellationState tessellation; }; class RasterizationState : dirty::ManualDirty { @@ -268,6 +276,7 @@ namespace skyline::gpu::interconnect::maxwell3d { std::array, engine::ColorTargetCount> colorRenderTargets; dirty::ManualDirtyState depthRenderTarget; dirty::ManualDirtyState vertexInput; + TessellationState tessellation; dirty::ManualDirtyState rasterization; dirty::ManualDirtyState depthStencil; dirty::ManualDirtyState colorBlend;