gl_rasterizer: Port front face flip check from Vulkan

While Vulkan was assuming we had no negative viewports, OpenGL code
was assuming we had them. Port the old code from Vulkan to OpenGL,
checking if the first viewport is negative before flipping faces.

This is not a complete implementation since we only check for the first
viewport to be negative. That said, unless a game is using Vulkan,
OpenGL and NVN games should be fine here, and we can always compare with
our Vulkan backend to see if there's a difference.
This commit is contained in:
ReinUsesLisp 2020-05-26 00:57:38 -03:00
parent efe7b7483b
commit 606a62d4c7
1 changed files with 20 additions and 5 deletions

View File

@ -1031,6 +1031,26 @@ void RasterizerOpenGL::SyncViewport() {
const auto& regs = gpu.regs; const auto& regs = gpu.regs;
const bool dirty_viewport = flags[Dirty::Viewports]; const bool dirty_viewport = flags[Dirty::Viewports];
const bool dirty_clip_control = flags[Dirty::ClipControl];
if (dirty_clip_control || flags[Dirty::FrontFace]) {
flags[Dirty::FrontFace] = false;
GLenum mode = MaxwellToGL::FrontFace(regs.front_face);
if (regs.screen_y_control.triangle_rast_flip != 0 &&
regs.viewport_transform[0].scale_y < 0.0f) {
switch (mode) {
case GL_CW:
mode = GL_CCW;
break;
case GL_CCW:
mode = GL_CW;
break;
}
}
glFrontFace(mode);
}
if (dirty_viewport || flags[Dirty::ClipControl]) { if (dirty_viewport || flags[Dirty::ClipControl]) {
flags[Dirty::ClipControl] = false; flags[Dirty::ClipControl] = false;
@ -1128,11 +1148,6 @@ void RasterizerOpenGL::SyncCullMode() {
glDisable(GL_CULL_FACE); glDisable(GL_CULL_FACE);
} }
} }
if (flags[Dirty::FrontFace]) {
flags[Dirty::FrontFace] = false;
glFrontFace(MaxwellToGL::FrontFace(regs.front_face));
}
} }
void RasterizerOpenGL::SyncPrimitiveRestart() { void RasterizerOpenGL::SyncPrimitiveRestart() {