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);
|
INSERT_PADDING_WORDS(0x3);
|
||||||
s32 clear_stencil;
|
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;
|
s32 stencil_back_func_ref;
|
||||||
u32 stencil_back_mask;
|
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_color[0], 0x360);
|
||||||
ASSERT_REG_POSITION(clear_depth, 0x364);
|
ASSERT_REG_POSITION(clear_depth, 0x364);
|
||||||
ASSERT_REG_POSITION(clear_stencil, 0x368);
|
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_func_ref, 0x3D5);
|
||||||
ASSERT_REG_POSITION(stencil_back_mask, 0x3D6);
|
ASSERT_REG_POSITION(stencil_back_mask, 0x3D6);
|
||||||
ASSERT_REG_POSITION(stencil_back_func_mask, 0x3D7);
|
ASSERT_REG_POSITION(stencil_back_func_mask, 0x3D7);
|
||||||
|
|
|
@ -552,6 +552,7 @@ void RasterizerOpenGL::DrawArrays() {
|
||||||
SyncLogicOpState();
|
SyncLogicOpState();
|
||||||
SyncCullMode();
|
SyncCullMode();
|
||||||
SyncAlphaTest();
|
SyncAlphaTest();
|
||||||
|
SyncScissorTest();
|
||||||
SyncTransformFeedback();
|
SyncTransformFeedback();
|
||||||
SyncPointState();
|
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() {
|
void RasterizerOpenGL::SyncTransformFeedback() {
|
||||||
const auto& regs = Core::System::GetInstance().GPU().Maxwell3D().regs;
|
const auto& regs = Core::System::GetInstance().GPU().Maxwell3D().regs;
|
||||||
|
|
||||||
|
|
|
@ -165,6 +165,9 @@ private:
|
||||||
/// Syncs the alpha test state to match the guest state
|
/// Syncs the alpha test state to match the guest state
|
||||||
void SyncAlphaTest();
|
void SyncAlphaTest();
|
||||||
|
|
||||||
|
/// Syncs the scissor test state to match the guest state
|
||||||
|
void SyncScissorTest();
|
||||||
|
|
||||||
/// Syncs the transform feedback state to match the guest state
|
/// Syncs the transform feedback state to match the guest state
|
||||||
void SyncTransformFeedback();
|
void SyncTransformFeedback();
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue