Fixed Scissor Test on Intel based GPUs (#595)
* Reworked scissor tests to remove fixme and handle issues with intel gpu's * Error handling for scissor tests * Disable strict opengl by default * Reformatting for JD * Updated scheme for new property in config * Fixed typo * Moved magic value to constant. I liked the magic :( * Fixed ordering for undertale * Fixed undertale bug * Removed strict opengl in favour of required. With this an exception is no longer thrown, just a warning for required extensions * Uses clamp instead of if's * Removed evil tabs and no longer used include
This commit is contained in:
parent
dbc105eafb
commit
0973daefa1
6 changed files with 171 additions and 73 deletions
|
@ -270,47 +270,52 @@ namespace Ryujinx.Graphics.Gal.OpenGL
|
|||
|
||||
|
||||
// Scissor Test
|
||||
bool forceUpdate;
|
||||
|
||||
for (int Index = 0; Index < New.ScissorTestCount; Index++)
|
||||
// All scissor test are disabled before drawing final framebuffer to screen so we don't need to handle disabling
|
||||
// Skip if there are no scissor tests to enable
|
||||
if (New.ScissorTestCount != 0)
|
||||
{
|
||||
forceUpdate = false;
|
||||
int scissorsApplied = 0;
|
||||
bool applyToAll = false;
|
||||
|
||||
if (New.ScissorTestEnabled[Index])
|
||||
for (int Index = 0; Index < GalPipelineState.RenderTargetsCount; Index++)
|
||||
{
|
||||
// If there is only 1 scissor test, geometry shaders are disabled so the scissor test applies to all viewports
|
||||
if (New.ScissorTestCount == 1)
|
||||
if (New.ScissorTestEnabled[Index])
|
||||
{
|
||||
GL.Enable(EnableCap.ScissorTest);
|
||||
}
|
||||
else
|
||||
{
|
||||
GL.Enable(IndexedEnableCap.ScissorTest, Index);
|
||||
}
|
||||
forceUpdate = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
GL.Disable(IndexedEnableCap.ScissorTest, Index);
|
||||
}
|
||||
// If viewport arrays are unavailable apply first scissor test to all or
|
||||
// there is only 1 scissor test and it's the first, the scissor test applies to all viewports
|
||||
if (!OGLExtension.Required.ViewportArray || (Index == 0 && New.ScissorTestCount == 1))
|
||||
{
|
||||
GL.Enable(EnableCap.ScissorTest);
|
||||
applyToAll = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
GL.Enable(IndexedEnableCap.ScissorTest, Index);
|
||||
}
|
||||
|
||||
if (New.ScissorTestEnabled[Index] &&
|
||||
(New.ScissorTestX[Index] != Old.ScissorTestX[Index] ||
|
||||
New.ScissorTestY[Index] != Old.ScissorTestY[Index] ||
|
||||
New.ScissorTestWidth[Index] != Old.ScissorTestWidth[Index] ||
|
||||
New.ScissorTestHeight[Index] != Old.ScissorTestHeight[Index] ||
|
||||
forceUpdate)) // Force update intentionally last to reduce if comparisons
|
||||
{
|
||||
// If there is only 1 scissor test geometry shaders are disables so the scissor test applies to all viewports
|
||||
if (New.ScissorTestCount == 1)
|
||||
{
|
||||
GL.Scissor(New.ScissorTestX[Index], New.ScissorTestY[Index],
|
||||
New.ScissorTestWidth[Index], New.ScissorTestHeight[Index]);
|
||||
}
|
||||
else
|
||||
{
|
||||
GL.ScissorIndexed(Index, New.ScissorTestX[Index], New.ScissorTestY[Index],
|
||||
New.ScissorTestWidth[Index], New.ScissorTestHeight[Index]);
|
||||
if (New.ScissorTestEnabled[Index] != Old.ScissorTestEnabled[Index] ||
|
||||
New.ScissorTestX[Index] != Old.ScissorTestX[Index] ||
|
||||
New.ScissorTestY[Index] != Old.ScissorTestY[Index] ||
|
||||
New.ScissorTestWidth[Index] != Old.ScissorTestWidth[Index] ||
|
||||
New.ScissorTestHeight[Index] != Old.ScissorTestHeight[Index])
|
||||
{
|
||||
if (applyToAll)
|
||||
{
|
||||
GL.Scissor(New.ScissorTestX[Index], New.ScissorTestY[Index],
|
||||
New.ScissorTestWidth[Index], New.ScissorTestHeight[Index]);
|
||||
}
|
||||
else
|
||||
{
|
||||
GL.ScissorIndexed(Index, New.ScissorTestX[Index], New.ScissorTestY[Index],
|
||||
New.ScissorTestWidth[Index], New.ScissorTestHeight[Index]);
|
||||
}
|
||||
}
|
||||
|
||||
// If all scissor tests have been applied, or viewport arrays are unavailable we can skip remaining itterations
|
||||
if (!OGLExtension.Required.ViewportArray || ++scissorsApplied == New.ScissorTestCount)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -378,6 +383,14 @@ namespace Ryujinx.Graphics.Gal.OpenGL
|
|||
Old = New;
|
||||
}
|
||||
|
||||
public void Unbind(GalPipelineState State)
|
||||
{
|
||||
if (State.ScissorTestCount > 0)
|
||||
{
|
||||
GL.Disable(EnableCap.ScissorTest);
|
||||
}
|
||||
}
|
||||
|
||||
private void SetAllBlendState(BlendState New)
|
||||
{
|
||||
Enable(EnableCap.Blend, New.Enabled);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue