From 9a6efb091c6fbf1f4ad7dbd856e497b5cebf81ee Mon Sep 17 00:00:00 2001 From: Billy Laws Date: Tue, 6 Sep 2022 19:22:27 +0100 Subject: [PATCH] Transition tessellation state to pipeline cache key Also adds dirty tracking and removes it from direct state while we're at it. Since we no longer use Vulkan structs directly there's no benefit to it. --- .../maxwell_3d/pipeline_state.cpp | 18 ++++++------- .../interconnect/maxwell_3d/pipeline_state.h | 27 ++++++++++++------- 2 files changed, 27 insertions(+), 18 deletions(-) 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;