diff --git a/app/src/main/cpp/skyline/gpu/interconnect/graphics_context.h b/app/src/main/cpp/skyline/gpu/interconnect/graphics_context.h index 72c9c64f..c9a4b3d5 100644 --- a/app/src/main/cpp/skyline/gpu/interconnect/graphics_context.h +++ b/app/src/main/cpp/skyline/gpu/interconnect/graphics_context.h @@ -252,9 +252,20 @@ namespace skyline::gpu::interconnect { renderTargetControl = control; } - /* Viewport Transforms */ + /* Viewport */ private: std::array viewports; + std::array scissors; //!< The scissors applied to viewports/render targets for masking writes during draws or clears + constexpr static vk::Rect2D DefaultScissor{ + .extent.height = std::numeric_limits::max(), + .extent.width = std::numeric_limits::max(), + }; //!< A scissor which displays the entire viewport, utilized when the viewport scissor is disabled + vk::PipelineViewportStateCreateInfo viewportState{ + .pViewports = viewports.data(), + .viewportCount = maxwell3d::ViewportCount, + .pScissors = scissors.data(), + .scissorCount = maxwell3d::ViewportCount, + }; public: /** @@ -279,6 +290,27 @@ namespace skyline::gpu::interconnect { viewport.maxDepth = scale + translate; // Counteract the subtraction of the maxDepth (p_z - o_z) by minDepth (o_z) for the host scale } + void SetScissor(size_t index, std::optional scissor) { + scissors.at(index) = scissor ? vk::Rect2D{ + .offset.x = scissor->horizontal.minimum, + .extent.width = static_cast(scissor->horizontal.maximum - scissor->horizontal.minimum), + .offset.y = scissor->vertical.minimum, + .extent.height = static_cast(scissor->horizontal.maximum - scissor->vertical.minimum), + } : DefaultScissor; + } + + void SetScissorHorizontal(size_t index, maxwell3d::Scissor::ScissorBounds bounds) { + auto &scissor{scissors.at(index)}; + scissor.offset.x = bounds.minimum; + scissor.extent.width = bounds.maximum - bounds.minimum; + } + + void SetScissorVertical(size_t index, maxwell3d::Scissor::ScissorBounds bounds) { + auto &scissor{scissors.at(index)}; + scissor.offset.y = bounds.minimum; + scissor.extent.height = bounds.maximum - bounds.minimum; + } + /* Buffer Clears */ private: vk::ClearColorValue clearColorValue{}; //!< The value written to a color buffer being cleared @@ -336,36 +368,6 @@ namespace skyline::gpu::interconnect { } } - /* Viewport Scissors */ - private: - std::array scissors; //!< The scissors applied to viewports/render targets for masking writes during draws or clears - constexpr static vk::Rect2D DefaultScissor{ - .extent.height = std::numeric_limits::max(), - .extent.width = std::numeric_limits::max(), - }; //!< A scissor which displays the entire viewport, utilized when the viewport scissor is disabled - - public: - void SetScissor(size_t index, std::optional scissor) { - scissors.at(index) = scissor ? vk::Rect2D{ - .offset.x = scissor->horizontal.minimum, - .extent.width = static_cast(scissor->horizontal.maximum - scissor->horizontal.minimum), - .offset.y = scissor->vertical.minimum, - .extent.height = static_cast(scissor->horizontal.maximum - scissor->vertical.minimum), - } : DefaultScissor; - } - - void SetScissorHorizontal(size_t index, maxwell3d::Scissor::ScissorBounds bounds) { - auto &scissor{scissors.at(index)}; - scissor.offset.x = bounds.minimum; - scissor.extent.width = bounds.maximum - bounds.minimum; - } - - void SetScissorVertical(size_t index, maxwell3d::Scissor::ScissorBounds bounds) { - auto &scissor{scissors.at(index)}; - scissor.offset.y = bounds.minimum; - scissor.extent.height = bounds.maximum - bounds.minimum; - } - /* Shader Program */ private: struct Shader {