GPU States: Implement Polygon Offset. This is used in SMO all the time. (#1784)
* GPU States: Implement Polygon Offset. This is used in SMO all the time. * Clang Format fixes. * Initialize polygon_offset in the constructor.
This commit is contained in:
		@@ -590,10 +590,18 @@ public:
 | 
			
		||||
 | 
			
		||||
                float clear_color[4];
 | 
			
		||||
                float clear_depth;
 | 
			
		||||
 | 
			
		||||
                INSERT_PADDING_WORDS(0x3);
 | 
			
		||||
 | 
			
		||||
                s32 clear_stencil;
 | 
			
		||||
 | 
			
		||||
                INSERT_PADDING_WORDS(0x17);
 | 
			
		||||
                INSERT_PADDING_WORDS(0x7);
 | 
			
		||||
 | 
			
		||||
                u32 polygon_offset_point_enable;
 | 
			
		||||
                u32 polygon_offset_line_enable;
 | 
			
		||||
                u32 polygon_offset_fill_enable;
 | 
			
		||||
 | 
			
		||||
                INSERT_PADDING_WORDS(0xD);
 | 
			
		||||
 | 
			
		||||
                std::array<ScissorTest, NumViewports> scissor_test;
 | 
			
		||||
 | 
			
		||||
@@ -762,7 +770,11 @@ public:
 | 
			
		||||
                    }
 | 
			
		||||
                } tsc;
 | 
			
		||||
 | 
			
		||||
                INSERT_PADDING_WORDS(0x3);
 | 
			
		||||
                INSERT_PADDING_WORDS(0x1);
 | 
			
		||||
 | 
			
		||||
                float polygon_offset_factor;
 | 
			
		||||
 | 
			
		||||
                INSERT_PADDING_WORDS(0x1);
 | 
			
		||||
 | 
			
		||||
                struct {
 | 
			
		||||
                    u32 tic_address_high;
 | 
			
		||||
@@ -787,7 +799,9 @@ public:
 | 
			
		||||
 | 
			
		||||
                u32 framebuffer_srgb;
 | 
			
		||||
 | 
			
		||||
                INSERT_PADDING_WORDS(0x12);
 | 
			
		||||
                float polygon_offset_units;
 | 
			
		||||
 | 
			
		||||
                INSERT_PADDING_WORDS(0x11);
 | 
			
		||||
 | 
			
		||||
                union {
 | 
			
		||||
                    BitField<2, 1, u32> coord_origin;
 | 
			
		||||
@@ -864,7 +878,9 @@ public:
 | 
			
		||||
 | 
			
		||||
                INSERT_PADDING_WORDS(0x7);
 | 
			
		||||
 | 
			
		||||
                INSERT_PADDING_WORDS(0x20);
 | 
			
		||||
                INSERT_PADDING_WORDS(0x1F);
 | 
			
		||||
 | 
			
		||||
                float polygon_offset_clamp;
 | 
			
		||||
 | 
			
		||||
                struct {
 | 
			
		||||
                    u32 is_instanced[NumVertexArrays];
 | 
			
		||||
@@ -1137,6 +1153,9 @@ 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(polygon_offset_point_enable, 0x370);
 | 
			
		||||
ASSERT_REG_POSITION(polygon_offset_line_enable, 0x371);
 | 
			
		||||
ASSERT_REG_POSITION(polygon_offset_fill_enable, 0x372);
 | 
			
		||||
ASSERT_REG_POSITION(scissor_test, 0x380);
 | 
			
		||||
ASSERT_REG_POSITION(stencil_back_func_ref, 0x3D5);
 | 
			
		||||
ASSERT_REG_POSITION(stencil_back_mask, 0x3D6);
 | 
			
		||||
@@ -1175,6 +1194,7 @@ ASSERT_REG_POSITION(point_size, 0x546);
 | 
			
		||||
ASSERT_REG_POSITION(zeta_enable, 0x54E);
 | 
			
		||||
ASSERT_REG_POSITION(multisample_control, 0x54F);
 | 
			
		||||
ASSERT_REG_POSITION(tsc, 0x557);
 | 
			
		||||
ASSERT_REG_POSITION(polygon_offset_factor, 0x55b);
 | 
			
		||||
ASSERT_REG_POSITION(tic, 0x55D);
 | 
			
		||||
ASSERT_REG_POSITION(stencil_two_side_enable, 0x565);
 | 
			
		||||
ASSERT_REG_POSITION(stencil_back_op_fail, 0x566);
 | 
			
		||||
@@ -1182,11 +1202,13 @@ ASSERT_REG_POSITION(stencil_back_op_zfail, 0x567);
 | 
			
		||||
ASSERT_REG_POSITION(stencil_back_op_zpass, 0x568);
 | 
			
		||||
ASSERT_REG_POSITION(stencil_back_func_func, 0x569);
 | 
			
		||||
ASSERT_REG_POSITION(framebuffer_srgb, 0x56E);
 | 
			
		||||
ASSERT_REG_POSITION(polygon_offset_units, 0x56F);
 | 
			
		||||
ASSERT_REG_POSITION(point_coord_replace, 0x581);
 | 
			
		||||
ASSERT_REG_POSITION(code_address, 0x582);
 | 
			
		||||
ASSERT_REG_POSITION(draw, 0x585);
 | 
			
		||||
ASSERT_REG_POSITION(primitive_restart, 0x591);
 | 
			
		||||
ASSERT_REG_POSITION(index_array, 0x5F2);
 | 
			
		||||
ASSERT_REG_POSITION(polygon_offset_clamp, 0x61F);
 | 
			
		||||
ASSERT_REG_POSITION(instanced_arrays, 0x620);
 | 
			
		||||
ASSERT_REG_POSITION(cull, 0x646);
 | 
			
		||||
ASSERT_REG_POSITION(logic_op, 0x671);
 | 
			
		||||
 
 | 
			
		||||
@@ -620,7 +620,7 @@ void RasterizerOpenGL::DrawArrays() {
 | 
			
		||||
    SyncTransformFeedback();
 | 
			
		||||
    SyncPointState();
 | 
			
		||||
    CheckAlphaTests();
 | 
			
		||||
 | 
			
		||||
    SyncPolygonOffset();
 | 
			
		||||
    // TODO(bunnei): Sync framebuffer_scale uniform here
 | 
			
		||||
    // TODO(bunnei): Sync scissorbox uniform(s) here
 | 
			
		||||
 | 
			
		||||
@@ -1179,6 +1179,16 @@ void RasterizerOpenGL::SyncPointState() {
 | 
			
		||||
    state.point.size = regs.point_size;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RasterizerOpenGL::SyncPolygonOffset() {
 | 
			
		||||
    const auto& regs = Core::System::GetInstance().GPU().Maxwell3D().regs;
 | 
			
		||||
    state.polygon_offset.fill_enable = regs.polygon_offset_fill_enable != 0;
 | 
			
		||||
    state.polygon_offset.line_enable = regs.polygon_offset_line_enable != 0;
 | 
			
		||||
    state.polygon_offset.point_enable = regs.polygon_offset_point_enable != 0;
 | 
			
		||||
    state.polygon_offset.units = regs.polygon_offset_units;
 | 
			
		||||
    state.polygon_offset.factor = regs.polygon_offset_factor;
 | 
			
		||||
    state.polygon_offset.clamp = regs.polygon_offset_clamp;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RasterizerOpenGL::CheckAlphaTests() {
 | 
			
		||||
    const auto& regs = Core::System::GetInstance().GPU().Maxwell3D().regs;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -183,6 +183,9 @@ private:
 | 
			
		||||
    /// Syncs Color Mask
 | 
			
		||||
    void SyncColorMask();
 | 
			
		||||
 | 
			
		||||
    /// Syncs the polygon offsets
 | 
			
		||||
    void SyncPolygonOffset();
 | 
			
		||||
 | 
			
		||||
    /// Check asserts for alpha testing.
 | 
			
		||||
    void CheckAlphaTests();
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -92,6 +92,13 @@ OpenGLState::OpenGLState() {
 | 
			
		||||
 | 
			
		||||
    point.size = 1;
 | 
			
		||||
    fragment_color_clamp.enabled = false;
 | 
			
		||||
 | 
			
		||||
    polygon_offset.fill_enable = false;
 | 
			
		||||
    polygon_offset.line_enable = false;
 | 
			
		||||
    polygon_offset.point_enable = false;
 | 
			
		||||
    polygon_offset.factor = 0.0f;
 | 
			
		||||
    polygon_offset.units = 0.0f;
 | 
			
		||||
    polygon_offset.clamp = 0.0f;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void OpenGLState::ApplyDefaultState() {
 | 
			
		||||
@@ -406,6 +413,55 @@ void OpenGLState::ApplyLogicOp() const {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void OpenGLState::ApplyPolygonOffset() const {
 | 
			
		||||
 | 
			
		||||
    const bool fill_enable_changed =
 | 
			
		||||
        polygon_offset.fill_enable != cur_state.polygon_offset.fill_enable;
 | 
			
		||||
    const bool line_enable_changed =
 | 
			
		||||
        polygon_offset.line_enable != cur_state.polygon_offset.line_enable;
 | 
			
		||||
    const bool point_enable_changed =
 | 
			
		||||
        polygon_offset.point_enable != cur_state.polygon_offset.point_enable;
 | 
			
		||||
    const bool factor_changed = polygon_offset.factor != cur_state.polygon_offset.factor;
 | 
			
		||||
    const bool units_changed = polygon_offset.units != cur_state.polygon_offset.units;
 | 
			
		||||
    const bool clamp_changed = polygon_offset.clamp != cur_state.polygon_offset.clamp;
 | 
			
		||||
 | 
			
		||||
    if (fill_enable_changed) {
 | 
			
		||||
        if (polygon_offset.fill_enable) {
 | 
			
		||||
            glEnable(GL_POLYGON_OFFSET_FILL);
 | 
			
		||||
        } else {
 | 
			
		||||
            glDisable(GL_POLYGON_OFFSET_FILL);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (line_enable_changed) {
 | 
			
		||||
        if (polygon_offset.line_enable) {
 | 
			
		||||
            glEnable(GL_POLYGON_OFFSET_LINE);
 | 
			
		||||
        } else {
 | 
			
		||||
            glDisable(GL_POLYGON_OFFSET_LINE);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (point_enable_changed) {
 | 
			
		||||
        if (polygon_offset.point_enable) {
 | 
			
		||||
            glEnable(GL_POLYGON_OFFSET_POINT);
 | 
			
		||||
        } else {
 | 
			
		||||
            glDisable(GL_POLYGON_OFFSET_POINT);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ((polygon_offset.fill_enable || polygon_offset.line_enable || polygon_offset.point_enable) &&
 | 
			
		||||
        (factor_changed || units_changed || clamp_changed)) {
 | 
			
		||||
 | 
			
		||||
        if (GLAD_GL_EXT_polygon_offset_clamp && polygon_offset.clamp != 0) {
 | 
			
		||||
            glPolygonOffsetClamp(polygon_offset.factor, polygon_offset.units, polygon_offset.clamp);
 | 
			
		||||
        } else {
 | 
			
		||||
            glPolygonOffset(polygon_offset.factor, polygon_offset.units);
 | 
			
		||||
            UNIMPLEMENTED_IF_MSG(polygon_offset.clamp != 0,
 | 
			
		||||
                                 "Unimplemented Depth polygon offset clamp.");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void OpenGLState::ApplyTextures() const {
 | 
			
		||||
    for (std::size_t i = 0; i < std::size(texture_units); ++i) {
 | 
			
		||||
        const auto& texture_unit = texture_units[i];
 | 
			
		||||
@@ -532,6 +588,7 @@ void OpenGLState::Apply() const {
 | 
			
		||||
    ApplyLogicOp();
 | 
			
		||||
    ApplyTextures();
 | 
			
		||||
    ApplySamplers();
 | 
			
		||||
    ApplyPolygonOffset();
 | 
			
		||||
    cur_state = *this;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -176,6 +176,15 @@ public:
 | 
			
		||||
        float size; // GL_POINT_SIZE
 | 
			
		||||
    } point;
 | 
			
		||||
 | 
			
		||||
    struct {
 | 
			
		||||
        bool point_enable;
 | 
			
		||||
        bool line_enable;
 | 
			
		||||
        bool fill_enable;
 | 
			
		||||
        GLfloat units;
 | 
			
		||||
        GLfloat factor;
 | 
			
		||||
        GLfloat clamp;
 | 
			
		||||
    } polygon_offset;
 | 
			
		||||
 | 
			
		||||
    std::array<bool, 2> clip_distance; // GL_CLIP_DISTANCE
 | 
			
		||||
 | 
			
		||||
    OpenGLState();
 | 
			
		||||
@@ -226,6 +235,7 @@ private:
 | 
			
		||||
    void ApplyLogicOp() const;
 | 
			
		||||
    void ApplyTextures() const;
 | 
			
		||||
    void ApplySamplers() const;
 | 
			
		||||
    void ApplyPolygonOffset() const;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace OpenGL
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user