yuzu-emu
/
yuzu
Archived
1
0
Fork 0

Merge pull request #3236 from ReinUsesLisp/rasterize-enable

gl_rasterizer: Implement RASTERIZE_ENABLE
This commit is contained in:
bunnei 2019-12-24 22:54:10 -05:00 committed by GitHub
commit 4af569ee47
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 28 additions and 4 deletions

View File

@ -88,11 +88,11 @@ void Maxwell3D::InitializeRegisterDefaults() {
color_mask.A.Assign(1); color_mask.A.Assign(1);
} }
// Commercial games seem to assume this value is enabled and nouveau sets this value manually. // NVN games expect these values to be enabled at boot
regs.rasterize_enable = 1;
regs.rt_separate_frag_data = 1; regs.rt_separate_frag_data = 1;
// Some games (like Super Mario Odyssey) assume that SRGB is enabled.
regs.framebuffer_srgb = 1; regs.framebuffer_srgb = 1;
mme_inline[MAXWELL3D_REG_INDEX(draw.vertex_end_gl)] = true; mme_inline[MAXWELL3D_REG_INDEX(draw.vertex_end_gl)] = true;
mme_inline[MAXWELL3D_REG_INDEX(draw.vertex_begin_gl)] = true; mme_inline[MAXWELL3D_REG_INDEX(draw.vertex_begin_gl)] = true;
mme_inline[MAXWELL3D_REG_INDEX(vertex_buffer.count)] = true; mme_inline[MAXWELL3D_REG_INDEX(vertex_buffer.count)] = true;

View File

@ -657,7 +657,11 @@ public:
std::array<f32, 4> tess_level_outer; std::array<f32, 4> tess_level_outer;
std::array<f32, 2> tess_level_inner; std::array<f32, 2> tess_level_inner;
INSERT_UNION_PADDING_WORDS(0x102); INSERT_UNION_PADDING_WORDS(0x10);
u32 rasterize_enable;
INSERT_UNION_PADDING_WORDS(0xF1);
u32 tfb_enabled; u32 tfb_enabled;
@ -1420,6 +1424,7 @@ ASSERT_REG_POSITION(sync_info, 0xB2);
ASSERT_REG_POSITION(tess_mode, 0xC8); ASSERT_REG_POSITION(tess_mode, 0xC8);
ASSERT_REG_POSITION(tess_level_outer, 0xC9); ASSERT_REG_POSITION(tess_level_outer, 0xC9);
ASSERT_REG_POSITION(tess_level_inner, 0xCD); ASSERT_REG_POSITION(tess_level_inner, 0xCD);
ASSERT_REG_POSITION(rasterize_enable, 0xDF);
ASSERT_REG_POSITION(tfb_enabled, 0x1D1); ASSERT_REG_POSITION(tfb_enabled, 0x1D1);
ASSERT_REG_POSITION(rt, 0x200); ASSERT_REG_POSITION(rt, 0x200);
ASSERT_REG_POSITION(viewport_transform, 0x280); ASSERT_REG_POSITION(viewport_transform, 0x280);

View File

@ -514,6 +514,7 @@ void RasterizerOpenGL::Clear() {
ConfigureClearFramebuffer(clear_state, use_color, use_depth, use_stencil); ConfigureClearFramebuffer(clear_state, use_color, use_depth, use_stencil);
SyncViewport(clear_state); SyncViewport(clear_state);
SyncRasterizeEnable(clear_state);
if (regs.clear_flags.scissor) { if (regs.clear_flags.scissor) {
SyncScissorTest(clear_state); SyncScissorTest(clear_state);
} }
@ -541,6 +542,7 @@ void RasterizerOpenGL::Clear() {
void RasterizerOpenGL::DrawPrelude() { void RasterizerOpenGL::DrawPrelude() {
auto& gpu = system.GPU().Maxwell3D(); auto& gpu = system.GPU().Maxwell3D();
SyncRasterizeEnable(state);
SyncColorMask(); SyncColorMask();
SyncFragmentColorClampState(); SyncFragmentColorClampState();
SyncMultiSampleState(); SyncMultiSampleState();
@ -1133,6 +1135,11 @@ void RasterizerOpenGL::SyncStencilTestState() {
} }
} }
void RasterizerOpenGL::SyncRasterizeEnable(OpenGLState& current_state) {
const auto& regs = system.GPU().Maxwell3D().regs;
current_state.rasterizer_discard = regs.rasterize_enable == 0;
}
void RasterizerOpenGL::SyncColorMask() { void RasterizerOpenGL::SyncColorMask() {
auto& maxwell3d = system.GPU().Maxwell3D(); auto& maxwell3d = system.GPU().Maxwell3D();
if (!maxwell3d.dirty.color_mask) { if (!maxwell3d.dirty.color_mask) {

View File

@ -168,6 +168,9 @@ private:
/// Syncs the point state to match the guest state /// Syncs the point state to match the guest state
void SyncPointState(); void SyncPointState();
/// Syncs the rasterizer enable state to match the guest state
void SyncRasterizeEnable(OpenGLState& current_state);
/// Syncs Color Mask /// Syncs Color Mask
void SyncColorMask(); void SyncColorMask();

View File

@ -182,6 +182,10 @@ void OpenGLState::ApplyCulling() {
} }
} }
void OpenGLState::ApplyRasterizerDiscard() {
Enable(GL_RASTERIZER_DISCARD, cur_state.rasterizer_discard, rasterizer_discard);
}
void OpenGLState::ApplyColorMask() { void OpenGLState::ApplyColorMask() {
if (!dirty.color_mask) { if (!dirty.color_mask) {
return; return;
@ -455,6 +459,7 @@ void OpenGLState::Apply() {
ApplyPointSize(); ApplyPointSize();
ApplyFragmentColorClamp(); ApplyFragmentColorClamp();
ApplyMultisample(); ApplyMultisample();
ApplyRasterizerDiscard();
ApplyColorMask(); ApplyColorMask();
ApplyDepthClamp(); ApplyDepthClamp();
ApplyViewport(); ApplyViewport();

View File

@ -48,6 +48,8 @@ public:
GLuint index = 0; GLuint index = 0;
} primitive_restart; // GL_PRIMITIVE_RESTART } primitive_restart; // GL_PRIMITIVE_RESTART
bool rasterizer_discard = false; // GL_RASTERIZER_DISCARD
struct ColorMask { struct ColorMask {
GLboolean red_enabled = GL_TRUE; GLboolean red_enabled = GL_TRUE;
GLboolean green_enabled = GL_TRUE; GLboolean green_enabled = GL_TRUE;
@ -56,6 +58,7 @@ public:
}; };
std::array<ColorMask, Tegra::Engines::Maxwell3D::Regs::NumRenderTargets> std::array<ColorMask, Tegra::Engines::Maxwell3D::Regs::NumRenderTargets>
color_mask; // GL_COLOR_WRITEMASK color_mask; // GL_COLOR_WRITEMASK
struct { struct {
bool test_enabled = false; // GL_STENCIL_TEST bool test_enabled = false; // GL_STENCIL_TEST
struct { struct {
@ -174,6 +177,7 @@ public:
void ApplyMultisample(); void ApplyMultisample();
void ApplySRgb(); void ApplySRgb();
void ApplyCulling(); void ApplyCulling();
void ApplyRasterizerDiscard();
void ApplyColorMask(); void ApplyColorMask();
void ApplyDepth(); void ApplyDepth();
void ApplyPrimitiveRestart(); void ApplyPrimitiveRestart();