Browse Source
Merge pull request #3236 from ReinUsesLisp/rasterize-enable
gl_rasterizer: Implement RASTERIZE_ENABLE
pull/15/merge
bunnei
6 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with
28 additions and
4 deletions
-
src/video_core/engines/maxwell_3d.cpp
-
src/video_core/engines/maxwell_3d.h
-
src/video_core/renderer_opengl/gl_rasterizer.cpp
-
src/video_core/renderer_opengl/gl_rasterizer.h
-
src/video_core/renderer_opengl/gl_state.cpp
-
src/video_core/renderer_opengl/gl_state.h
|
|
|
@ -88,11 +88,11 @@ void Maxwell3D::InitializeRegisterDefaults() { |
|
|
|
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; |
|
|
|
|
|
|
|
// Some games (like Super Mario Odyssey) assume that SRGB is enabled.
|
|
|
|
regs.framebuffer_srgb = 1; |
|
|
|
|
|
|
|
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(vertex_buffer.count)] = true; |
|
|
|
|
|
|
|
@ -657,7 +657,11 @@ public: |
|
|
|
std::array<f32, 4> tess_level_outer; |
|
|
|
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; |
|
|
|
|
|
|
|
@ -1420,6 +1424,7 @@ ASSERT_REG_POSITION(sync_info, 0xB2); |
|
|
|
ASSERT_REG_POSITION(tess_mode, 0xC8); |
|
|
|
ASSERT_REG_POSITION(tess_level_outer, 0xC9); |
|
|
|
ASSERT_REG_POSITION(tess_level_inner, 0xCD); |
|
|
|
ASSERT_REG_POSITION(rasterize_enable, 0xDF); |
|
|
|
ASSERT_REG_POSITION(tfb_enabled, 0x1D1); |
|
|
|
ASSERT_REG_POSITION(rt, 0x200); |
|
|
|
ASSERT_REG_POSITION(viewport_transform, 0x280); |
|
|
|
|
|
|
|
@ -514,6 +514,7 @@ void RasterizerOpenGL::Clear() { |
|
|
|
ConfigureClearFramebuffer(clear_state, use_color, use_depth, use_stencil); |
|
|
|
|
|
|
|
SyncViewport(clear_state); |
|
|
|
SyncRasterizeEnable(clear_state); |
|
|
|
if (regs.clear_flags.scissor) { |
|
|
|
SyncScissorTest(clear_state); |
|
|
|
} |
|
|
|
@ -541,6 +542,7 @@ void RasterizerOpenGL::Clear() { |
|
|
|
void RasterizerOpenGL::DrawPrelude() { |
|
|
|
auto& gpu = system.GPU().Maxwell3D(); |
|
|
|
|
|
|
|
SyncRasterizeEnable(state); |
|
|
|
SyncColorMask(); |
|
|
|
SyncFragmentColorClampState(); |
|
|
|
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() { |
|
|
|
auto& maxwell3d = system.GPU().Maxwell3D(); |
|
|
|
if (!maxwell3d.dirty.color_mask) { |
|
|
|
|
|
|
|
@ -168,6 +168,9 @@ private: |
|
|
|
/// Syncs the point state to match the guest state |
|
|
|
void SyncPointState(); |
|
|
|
|
|
|
|
/// Syncs the rasterizer enable state to match the guest state |
|
|
|
void SyncRasterizeEnable(OpenGLState& current_state); |
|
|
|
|
|
|
|
/// Syncs Color Mask |
|
|
|
void SyncColorMask(); |
|
|
|
|
|
|
|
|
|
|
|
@ -182,6 +182,10 @@ void OpenGLState::ApplyCulling() { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void OpenGLState::ApplyRasterizerDiscard() { |
|
|
|
Enable(GL_RASTERIZER_DISCARD, cur_state.rasterizer_discard, rasterizer_discard); |
|
|
|
} |
|
|
|
|
|
|
|
void OpenGLState::ApplyColorMask() { |
|
|
|
if (!dirty.color_mask) { |
|
|
|
return; |
|
|
|
@ -455,6 +459,7 @@ void OpenGLState::Apply() { |
|
|
|
ApplyPointSize(); |
|
|
|
ApplyFragmentColorClamp(); |
|
|
|
ApplyMultisample(); |
|
|
|
ApplyRasterizerDiscard(); |
|
|
|
ApplyColorMask(); |
|
|
|
ApplyDepthClamp(); |
|
|
|
ApplyViewport(); |
|
|
|
|
|
|
|
@ -48,6 +48,8 @@ public: |
|
|
|
GLuint index = 0; |
|
|
|
} primitive_restart; // GL_PRIMITIVE_RESTART |
|
|
|
|
|
|
|
bool rasterizer_discard = false; // GL_RASTERIZER_DISCARD |
|
|
|
|
|
|
|
struct ColorMask { |
|
|
|
GLboolean red_enabled = GL_TRUE; |
|
|
|
GLboolean green_enabled = GL_TRUE; |
|
|
|
@ -56,6 +58,7 @@ public: |
|
|
|
}; |
|
|
|
std::array<ColorMask, Tegra::Engines::Maxwell3D::Regs::NumRenderTargets> |
|
|
|
color_mask; // GL_COLOR_WRITEMASK |
|
|
|
|
|
|
|
struct { |
|
|
|
bool test_enabled = false; // GL_STENCIL_TEST |
|
|
|
struct { |
|
|
|
@ -174,6 +177,7 @@ public: |
|
|
|
void ApplyMultisample(); |
|
|
|
void ApplySRgb(); |
|
|
|
void ApplyCulling(); |
|
|
|
void ApplyRasterizerDiscard(); |
|
|
|
void ApplyColorMask(); |
|
|
|
void ApplyDepth(); |
|
|
|
void ApplyPrimitiveRestart(); |
|
|
|
|