forked from suyu/suyu
Merge pull request #1460 from FernandoS27/scissor_test
Implemented Scissor Testing
This commit is contained in:
commit
03ec936ca0
3 changed files with 36 additions and 1 deletions
|
@ -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 a new issue