forked from suyu/suyu
gl_rasterizer: Implement GL_POINT_SPRITE
OpenGL core defaults to GL_POINT_SPRITE, meanwhile on OpenGL compatibility we have to explicitly enable it. This fixes gl_PointCoord's behaviour.
This commit is contained in:
parent
bf21aacc74
commit
7da52673d0
4 changed files with 9 additions and 1 deletions
|
@ -862,7 +862,11 @@ public:
|
||||||
|
|
||||||
float point_size;
|
float point_size;
|
||||||
|
|
||||||
INSERT_UNION_PADDING_WORDS(0x7);
|
INSERT_UNION_PADDING_WORDS(0x1);
|
||||||
|
|
||||||
|
u32 point_sprite_enable;
|
||||||
|
|
||||||
|
INSERT_UNION_PADDING_WORDS(0x5);
|
||||||
|
|
||||||
u32 zeta_enable;
|
u32 zeta_enable;
|
||||||
|
|
||||||
|
@ -1494,6 +1498,7 @@ ASSERT_REG_POSITION(vb_element_base, 0x50D);
|
||||||
ASSERT_REG_POSITION(vb_base_instance, 0x50E);
|
ASSERT_REG_POSITION(vb_base_instance, 0x50E);
|
||||||
ASSERT_REG_POSITION(clip_distance_enabled, 0x544);
|
ASSERT_REG_POSITION(clip_distance_enabled, 0x544);
|
||||||
ASSERT_REG_POSITION(point_size, 0x546);
|
ASSERT_REG_POSITION(point_size, 0x546);
|
||||||
|
ASSERT_REG_POSITION(point_sprite_enable, 0x548);
|
||||||
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(condition, 0x554);
|
ASSERT_REG_POSITION(condition, 0x554);
|
||||||
|
|
|
@ -1293,6 +1293,7 @@ void RasterizerOpenGL::SyncPointState() {
|
||||||
// Limit the point size to 1 since nouveau sometimes sets a point size of 0 (and that's invalid
|
// Limit the point size to 1 since nouveau sometimes sets a point size of 0 (and that's invalid
|
||||||
// in OpenGL).
|
// in OpenGL).
|
||||||
state.point.program_control = regs.vp_point_size.enable != 0;
|
state.point.program_control = regs.vp_point_size.enable != 0;
|
||||||
|
state.point.sprite = regs.point_sprite_enable != 0;
|
||||||
state.point.size = std::max(1.0f, regs.point_size);
|
state.point.size = std::max(1.0f, regs.point_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -128,6 +128,7 @@ void OpenGLState::ApplyClipDistances() {
|
||||||
|
|
||||||
void OpenGLState::ApplyPointSize() {
|
void OpenGLState::ApplyPointSize() {
|
||||||
Enable(GL_PROGRAM_POINT_SIZE, cur_state.point.program_control, point.program_control);
|
Enable(GL_PROGRAM_POINT_SIZE, cur_state.point.program_control, point.program_control);
|
||||||
|
Enable(GL_POINT_SPRITE, cur_state.point.sprite, point.sprite);
|
||||||
if (UpdateValue(cur_state.point.size, point.size)) {
|
if (UpdateValue(cur_state.point.size, point.size)) {
|
||||||
glPointSize(point.size);
|
glPointSize(point.size);
|
||||||
}
|
}
|
||||||
|
|
|
@ -132,6 +132,7 @@ public:
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
bool program_control = false; // GL_PROGRAM_POINT_SIZE
|
bool program_control = false; // GL_PROGRAM_POINT_SIZE
|
||||||
|
bool sprite = false; // GL_POINT_SPRITE
|
||||||
GLfloat size = 1.0f; // GL_POINT_SIZE
|
GLfloat size = 1.0f; // GL_POINT_SIZE
|
||||||
} point;
|
} point;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue