mirror of
https://github.com/yuzu-emu/yuzu.git
synced 2024-08-20 11:03:23 +02:00
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:
parent
7684f4d0cf
commit
cb8d51e37e
@ -590,10 +590,18 @@ public:
|
|||||||
|
|
||||||
float clear_color[4];
|
float clear_color[4];
|
||||||
float clear_depth;
|
float clear_depth;
|
||||||
|
|
||||||
INSERT_PADDING_WORDS(0x3);
|
INSERT_PADDING_WORDS(0x3);
|
||||||
|
|
||||||
s32 clear_stencil;
|
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;
|
std::array<ScissorTest, NumViewports> scissor_test;
|
||||||
|
|
||||||
@ -762,7 +770,11 @@ public:
|
|||||||
}
|
}
|
||||||
} tsc;
|
} tsc;
|
||||||
|
|
||||||
INSERT_PADDING_WORDS(0x3);
|
INSERT_PADDING_WORDS(0x1);
|
||||||
|
|
||||||
|
float polygon_offset_factor;
|
||||||
|
|
||||||
|
INSERT_PADDING_WORDS(0x1);
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
u32 tic_address_high;
|
u32 tic_address_high;
|
||||||
@ -787,7 +799,9 @@ public:
|
|||||||
|
|
||||||
u32 framebuffer_srgb;
|
u32 framebuffer_srgb;
|
||||||
|
|
||||||
INSERT_PADDING_WORDS(0x12);
|
float polygon_offset_units;
|
||||||
|
|
||||||
|
INSERT_PADDING_WORDS(0x11);
|
||||||
|
|
||||||
union {
|
union {
|
||||||
BitField<2, 1, u32> coord_origin;
|
BitField<2, 1, u32> coord_origin;
|
||||||
@ -864,7 +878,9 @@ public:
|
|||||||
|
|
||||||
INSERT_PADDING_WORDS(0x7);
|
INSERT_PADDING_WORDS(0x7);
|
||||||
|
|
||||||
INSERT_PADDING_WORDS(0x20);
|
INSERT_PADDING_WORDS(0x1F);
|
||||||
|
|
||||||
|
float polygon_offset_clamp;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
u32 is_instanced[NumVertexArrays];
|
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_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(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(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);
|
||||||
@ -1175,6 +1194,7 @@ ASSERT_REG_POSITION(point_size, 0x546);
|
|||||||
ASSERT_REG_POSITION(zeta_enable, 0x54E);
|
ASSERT_REG_POSITION(zeta_enable, 0x54E);
|
||||||
ASSERT_REG_POSITION(multisample_control, 0x54F);
|
ASSERT_REG_POSITION(multisample_control, 0x54F);
|
||||||
ASSERT_REG_POSITION(tsc, 0x557);
|
ASSERT_REG_POSITION(tsc, 0x557);
|
||||||
|
ASSERT_REG_POSITION(polygon_offset_factor, 0x55b);
|
||||||
ASSERT_REG_POSITION(tic, 0x55D);
|
ASSERT_REG_POSITION(tic, 0x55D);
|
||||||
ASSERT_REG_POSITION(stencil_two_side_enable, 0x565);
|
ASSERT_REG_POSITION(stencil_two_side_enable, 0x565);
|
||||||
ASSERT_REG_POSITION(stencil_back_op_fail, 0x566);
|
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_op_zpass, 0x568);
|
||||||
ASSERT_REG_POSITION(stencil_back_func_func, 0x569);
|
ASSERT_REG_POSITION(stencil_back_func_func, 0x569);
|
||||||
ASSERT_REG_POSITION(framebuffer_srgb, 0x56E);
|
ASSERT_REG_POSITION(framebuffer_srgb, 0x56E);
|
||||||
|
ASSERT_REG_POSITION(polygon_offset_units, 0x56F);
|
||||||
ASSERT_REG_POSITION(point_coord_replace, 0x581);
|
ASSERT_REG_POSITION(point_coord_replace, 0x581);
|
||||||
ASSERT_REG_POSITION(code_address, 0x582);
|
ASSERT_REG_POSITION(code_address, 0x582);
|
||||||
ASSERT_REG_POSITION(draw, 0x585);
|
ASSERT_REG_POSITION(draw, 0x585);
|
||||||
ASSERT_REG_POSITION(primitive_restart, 0x591);
|
ASSERT_REG_POSITION(primitive_restart, 0x591);
|
||||||
ASSERT_REG_POSITION(index_array, 0x5F2);
|
ASSERT_REG_POSITION(index_array, 0x5F2);
|
||||||
|
ASSERT_REG_POSITION(polygon_offset_clamp, 0x61F);
|
||||||
ASSERT_REG_POSITION(instanced_arrays, 0x620);
|
ASSERT_REG_POSITION(instanced_arrays, 0x620);
|
||||||
ASSERT_REG_POSITION(cull, 0x646);
|
ASSERT_REG_POSITION(cull, 0x646);
|
||||||
ASSERT_REG_POSITION(logic_op, 0x671);
|
ASSERT_REG_POSITION(logic_op, 0x671);
|
||||||
|
@ -620,7 +620,7 @@ void RasterizerOpenGL::DrawArrays() {
|
|||||||
SyncTransformFeedback();
|
SyncTransformFeedback();
|
||||||
SyncPointState();
|
SyncPointState();
|
||||||
CheckAlphaTests();
|
CheckAlphaTests();
|
||||||
|
SyncPolygonOffset();
|
||||||
// TODO(bunnei): Sync framebuffer_scale uniform here
|
// TODO(bunnei): Sync framebuffer_scale uniform here
|
||||||
// TODO(bunnei): Sync scissorbox uniform(s) here
|
// TODO(bunnei): Sync scissorbox uniform(s) here
|
||||||
|
|
||||||
@ -1179,6 +1179,16 @@ void RasterizerOpenGL::SyncPointState() {
|
|||||||
state.point.size = regs.point_size;
|
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() {
|
void RasterizerOpenGL::CheckAlphaTests() {
|
||||||
const auto& regs = Core::System::GetInstance().GPU().Maxwell3D().regs;
|
const auto& regs = Core::System::GetInstance().GPU().Maxwell3D().regs;
|
||||||
|
|
||||||
|
@ -183,6 +183,9 @@ private:
|
|||||||
/// Syncs Color Mask
|
/// Syncs Color Mask
|
||||||
void SyncColorMask();
|
void SyncColorMask();
|
||||||
|
|
||||||
|
/// Syncs the polygon offsets
|
||||||
|
void SyncPolygonOffset();
|
||||||
|
|
||||||
/// Check asserts for alpha testing.
|
/// Check asserts for alpha testing.
|
||||||
void CheckAlphaTests();
|
void CheckAlphaTests();
|
||||||
|
|
||||||
|
@ -92,6 +92,13 @@ OpenGLState::OpenGLState() {
|
|||||||
|
|
||||||
point.size = 1;
|
point.size = 1;
|
||||||
fragment_color_clamp.enabled = false;
|
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() {
|
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 {
|
void OpenGLState::ApplyTextures() const {
|
||||||
for (std::size_t i = 0; i < std::size(texture_units); ++i) {
|
for (std::size_t i = 0; i < std::size(texture_units); ++i) {
|
||||||
const auto& texture_unit = texture_units[i];
|
const auto& texture_unit = texture_units[i];
|
||||||
@ -532,6 +588,7 @@ void OpenGLState::Apply() const {
|
|||||||
ApplyLogicOp();
|
ApplyLogicOp();
|
||||||
ApplyTextures();
|
ApplyTextures();
|
||||||
ApplySamplers();
|
ApplySamplers();
|
||||||
|
ApplyPolygonOffset();
|
||||||
cur_state = *this;
|
cur_state = *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -176,6 +176,15 @@ public:
|
|||||||
float size; // GL_POINT_SIZE
|
float size; // GL_POINT_SIZE
|
||||||
} point;
|
} 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
|
std::array<bool, 2> clip_distance; // GL_CLIP_DISTANCE
|
||||||
|
|
||||||
OpenGLState();
|
OpenGLState();
|
||||||
@ -226,6 +235,7 @@ private:
|
|||||||
void ApplyLogicOp() const;
|
void ApplyLogicOp() const;
|
||||||
void ApplyTextures() const;
|
void ApplyTextures() const;
|
||||||
void ApplySamplers() const;
|
void ApplySamplers() const;
|
||||||
|
void ApplyPolygonOffset() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace OpenGL
|
} // namespace OpenGL
|
||||||
|
Loading…
Reference in New Issue
Block a user