Merge pull request #3236 from ReinUsesLisp/rasterize-enable
gl_rasterizer: Implement RASTERIZE_ENABLE
This commit is contained in:
		@@ -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();
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user