mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-03 16:39:01 -06:00 
			
		
		
		
	Merge pull request #515 from Subv/viewport_fix
GPU: Calculate the correct viewport dimensions based on the scale and translate registers.
This commit is contained in:
		@@ -354,10 +354,35 @@ public:
 | 
				
			|||||||
                    f32 scale_x;
 | 
					                    f32 scale_x;
 | 
				
			||||||
                    f32 scale_y;
 | 
					                    f32 scale_y;
 | 
				
			||||||
                    f32 scale_z;
 | 
					                    f32 scale_z;
 | 
				
			||||||
                    u32 translate_x;
 | 
					                    f32 translate_x;
 | 
				
			||||||
                    u32 translate_y;
 | 
					                    f32 translate_y;
 | 
				
			||||||
                    u32 translate_z;
 | 
					                    f32 translate_z;
 | 
				
			||||||
                    INSERT_PADDING_WORDS(2);
 | 
					                    INSERT_PADDING_WORDS(2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    MathUtil::Rectangle<s32> GetRect() const {
 | 
				
			||||||
 | 
					                        return {
 | 
				
			||||||
 | 
					                            GetX(),               // left
 | 
				
			||||||
 | 
					                            GetY() + GetHeight(), // top
 | 
				
			||||||
 | 
					                            GetX() + GetWidth(),  // right
 | 
				
			||||||
 | 
					                            GetY()                // bottom
 | 
				
			||||||
 | 
					                        };
 | 
				
			||||||
 | 
					                    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    s32 GetX() const {
 | 
				
			||||||
 | 
					                        return static_cast<s32>(std::max(0.0f, translate_x - std::fabs(scale_x)));
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    s32 GetY() const {
 | 
				
			||||||
 | 
					                        return static_cast<s32>(std::max(0.0f, translate_y - std::fabs(scale_y)));
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    s32 GetWidth() const {
 | 
				
			||||||
 | 
					                        return static_cast<s32>(translate_x + std::fabs(scale_x)) - GetX();
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    s32 GetHeight() const {
 | 
				
			||||||
 | 
					                        return static_cast<s32>(translate_y + std::fabs(scale_y)) - GetY();
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
                } viewport_transform[NumViewports];
 | 
					                } viewport_transform[NumViewports];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                struct {
 | 
					                struct {
 | 
				
			||||||
@@ -371,15 +396,6 @@ public:
 | 
				
			|||||||
                    };
 | 
					                    };
 | 
				
			||||||
                    float depth_range_near;
 | 
					                    float depth_range_near;
 | 
				
			||||||
                    float depth_range_far;
 | 
					                    float depth_range_far;
 | 
				
			||||||
 | 
					 | 
				
			||||||
                    MathUtil::Rectangle<s32> GetRect() const {
 | 
					 | 
				
			||||||
                        return {
 | 
					 | 
				
			||||||
                            static_cast<s32>(x),          // left
 | 
					 | 
				
			||||||
                            static_cast<s32>(y + height), // top
 | 
					 | 
				
			||||||
                            static_cast<s32>(x + width),  // right
 | 
					 | 
				
			||||||
                            static_cast<s32>(y)           // bottom
 | 
					 | 
				
			||||||
                        };
 | 
					 | 
				
			||||||
                    };
 | 
					 | 
				
			||||||
                } viewport[NumViewports];
 | 
					                } viewport[NumViewports];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                INSERT_PADDING_WORDS(0x1D);
 | 
					                INSERT_PADDING_WORDS(0x1D);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -298,7 +298,7 @@ void RasterizerOpenGL::DrawArrays() {
 | 
				
			|||||||
    const bool has_stencil = false;
 | 
					    const bool has_stencil = false;
 | 
				
			||||||
    const bool using_color_fb = true;
 | 
					    const bool using_color_fb = true;
 | 
				
			||||||
    const bool using_depth_fb = false;
 | 
					    const bool using_depth_fb = false;
 | 
				
			||||||
    const MathUtil::Rectangle<s32> viewport_rect{regs.viewport[0].GetRect()};
 | 
					    const MathUtil::Rectangle<s32> viewport_rect{regs.viewport_transform[0].GetRect()};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const bool write_color_fb =
 | 
					    const bool write_color_fb =
 | 
				
			||||||
        state.color_mask.red_enabled == GL_TRUE || state.color_mask.green_enabled == GL_TRUE ||
 | 
					        state.color_mask.red_enabled == GL_TRUE || state.color_mask.green_enabled == GL_TRUE ||
 | 
				
			||||||
@@ -702,7 +702,7 @@ void RasterizerOpenGL::BindFramebufferSurfaces(const Surface& color_surface,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void RasterizerOpenGL::SyncViewport(const MathUtil::Rectangle<u32>& surfaces_rect, u16 res_scale) {
 | 
					void RasterizerOpenGL::SyncViewport(const MathUtil::Rectangle<u32>& surfaces_rect, u16 res_scale) {
 | 
				
			||||||
    const auto& regs = Core::System().GetInstance().GPU().Maxwell3D().regs;
 | 
					    const auto& regs = Core::System().GetInstance().GPU().Maxwell3D().regs;
 | 
				
			||||||
    const MathUtil::Rectangle<s32> viewport_rect{regs.viewport[0].GetRect()};
 | 
					    const MathUtil::Rectangle<s32> viewport_rect{regs.viewport_transform[0].GetRect()};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    state.viewport.x = static_cast<GLint>(surfaces_rect.left) + viewport_rect.left * res_scale;
 | 
					    state.viewport.x = static_cast<GLint>(surfaces_rect.left) + viewport_rect.left * res_scale;
 | 
				
			||||||
    state.viewport.y = static_cast<GLint>(surfaces_rect.bottom) + viewport_rect.bottom * res_scale;
 | 
					    state.viewport.y = static_cast<GLint>(surfaces_rect.bottom) + viewport_rect.bottom * res_scale;
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user