Merge pull request #1460 from FernandoS27/scissor_test
Implemented Scissor Testing
This commit is contained in:
		
						commit
						03ec936ca0
					
				@ -532,7 +532,21 @@ public:
 | 
			
		||||
                INSERT_PADDING_WORDS(0x3);
 | 
			
		||||
                s32 clear_stencil;
 | 
			
		||||
 | 
			
		||||
                INSERT_PADDING_WORDS(0x6C);
 | 
			
		||||
                INSERT_PADDING_WORDS(0x17);
 | 
			
		||||
 | 
			
		||||
                struct {
 | 
			
		||||
                    u32 enable;
 | 
			
		||||
                    union {
 | 
			
		||||
                        BitField<0, 16, u32> min_x;
 | 
			
		||||
                        BitField<16, 16, u32> max_x;
 | 
			
		||||
                    };
 | 
			
		||||
                    union {
 | 
			
		||||
                        BitField<0, 16, u32> min_y;
 | 
			
		||||
                        BitField<16, 16, u32> max_y;
 | 
			
		||||
                    };
 | 
			
		||||
                } scissor_test;
 | 
			
		||||
 | 
			
		||||
                INSERT_PADDING_WORDS(0x52);
 | 
			
		||||
 | 
			
		||||
                s32 stencil_back_func_ref;
 | 
			
		||||
                u32 stencil_back_mask;
 | 
			
		||||
@ -1002,6 +1016,7 @@ ASSERT_REG_POSITION(vertex_buffer, 0x35D);
 | 
			
		||||
ASSERT_REG_POSITION(clear_color[0], 0x360);
 | 
			
		||||
ASSERT_REG_POSITION(clear_depth, 0x364);
 | 
			
		||||
ASSERT_REG_POSITION(clear_stencil, 0x368);
 | 
			
		||||
ASSERT_REG_POSITION(scissor_test, 0x380);
 | 
			
		||||
ASSERT_REG_POSITION(stencil_back_func_ref, 0x3D5);
 | 
			
		||||
ASSERT_REG_POSITION(stencil_back_mask, 0x3D6);
 | 
			
		||||
ASSERT_REG_POSITION(stencil_back_func_mask, 0x3D7);
 | 
			
		||||
 | 
			
		||||
@ -552,6 +552,7 @@ void RasterizerOpenGL::DrawArrays() {
 | 
			
		||||
    SyncLogicOpState();
 | 
			
		||||
    SyncCullMode();
 | 
			
		||||
    SyncAlphaTest();
 | 
			
		||||
    SyncScissorTest();
 | 
			
		||||
    SyncTransformFeedback();
 | 
			
		||||
    SyncPointState();
 | 
			
		||||
 | 
			
		||||
@ -984,6 +985,22 @@ void RasterizerOpenGL::SyncAlphaTest() {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RasterizerOpenGL::SyncScissorTest() {
 | 
			
		||||
    const auto& regs = Core::System::GetInstance().GPU().Maxwell3D().regs;
 | 
			
		||||
 | 
			
		||||
    state.scissor.enabled = (regs.scissor_test.enable != 0);
 | 
			
		||||
    // TODO(Blinkhawk): Figure if the hardware supports scissor testing per viewport and how it's
 | 
			
		||||
    // implemented.
 | 
			
		||||
    if (regs.scissor_test.enable != 0) {
 | 
			
		||||
        const u32 width = regs.scissor_test.max_x - regs.scissor_test.min_x;
 | 
			
		||||
        const u32 height = regs.scissor_test.max_y - regs.scissor_test.min_y;
 | 
			
		||||
        state.scissor.x = regs.scissor_test.min_x;
 | 
			
		||||
        state.scissor.y = regs.scissor_test.min_y;
 | 
			
		||||
        state.scissor.width = width;
 | 
			
		||||
        state.scissor.height = height;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RasterizerOpenGL::SyncTransformFeedback() {
 | 
			
		||||
    const auto& regs = Core::System::GetInstance().GPU().Maxwell3D().regs;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -165,6 +165,9 @@ private:
 | 
			
		||||
    /// Syncs the alpha test state to match the guest state
 | 
			
		||||
    void SyncAlphaTest();
 | 
			
		||||
 | 
			
		||||
    /// Syncs the scissor test state to match the guest state
 | 
			
		||||
    void SyncScissorTest();
 | 
			
		||||
 | 
			
		||||
    /// Syncs the transform feedback state to match the guest state
 | 
			
		||||
    void SyncTransformFeedback();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user