mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-23 14:19:46 -06:00
OGL: Workaround gl_ClipDistance bug on Mesa i965.
This commit is contained in:
@ -482,9 +482,7 @@ Renderer::Renderer()
|
|||||||
GLExtensions::Supports("GL_ARB_shading_language_420pack");
|
GLExtensions::Supports("GL_ARB_shading_language_420pack");
|
||||||
|
|
||||||
// Clip distance support is useless without a method to clamp the depth range
|
// Clip distance support is useless without a method to clamp the depth range
|
||||||
g_Config.backend_info.bSupportsDepthClamp =
|
g_Config.backend_info.bSupportsDepthClamp = GLExtensions::Supports("GL_ARB_depth_clamp");
|
||||||
GLExtensions::Supports("GL_ARB_depth_clamp") &&
|
|
||||||
!DriverDetails::HasBug(DriverDetails::BUG_BROKENCLIPDISTANCE);
|
|
||||||
|
|
||||||
g_ogl_config.bSupportsGLSLCache = GLExtensions::Supports("GL_ARB_get_program_binary");
|
g_ogl_config.bSupportsGLSLCache = GLExtensions::Supports("GL_ARB_get_program_binary");
|
||||||
g_ogl_config.bSupportsGLPinnedMemory = GLExtensions::Supports("GL_AMD_pinned_memory");
|
g_ogl_config.bSupportsGLPinnedMemory = GLExtensions::Supports("GL_AMD_pinned_memory");
|
||||||
|
@ -205,12 +205,13 @@ enum Bug
|
|||||||
// everywhere else.
|
// everywhere else.
|
||||||
BUG_SLOWGETBUFFERSUBDATA,
|
BUG_SLOWGETBUFFERSUBDATA,
|
||||||
|
|
||||||
// Bug: Broken lines in geometry shaders when writing to gl_ClipDistance
|
// Bug: Broken lines in geometry shaders when writing to gl_ClipDistance in the vertex shader
|
||||||
// Affected Devices: Mesa i965
|
// Affected Devices: Mesa i965
|
||||||
// Started Version: -1
|
// Started Version: -1
|
||||||
// Ended Version: -1
|
// Ended Version: -1
|
||||||
// Mesa hasn't tested geometry shaders on i965 with user-defined clipping planes.
|
// Writing to gl_ClipDistance in both the vertex shader and the geometry shader will break
|
||||||
// Causes misrenderings on a large amount of things that draw lines.
|
// the geometry shader. Current workaround is to make sure the geometry shader always consumes
|
||||||
|
// the gl_ClipDistance inputs from the vertex shader.
|
||||||
BUG_BROKENCLIPDISTANCE,
|
BUG_BROKENCLIPDISTANCE,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
#include "Common/CommonTypes.h"
|
#include "Common/CommonTypes.h"
|
||||||
#include "VideoCommon/BPMemory.h"
|
#include "VideoCommon/BPMemory.h"
|
||||||
|
#include "VideoCommon/DriverDetails.h"
|
||||||
#include "VideoCommon/GeometryShaderGen.h"
|
#include "VideoCommon/GeometryShaderGen.h"
|
||||||
#include "VideoCommon/LightingShaderGen.h"
|
#include "VideoCommon/LightingShaderGen.h"
|
||||||
#include "VideoCommon/VideoCommon.h"
|
#include "VideoCommon/VideoCommon.h"
|
||||||
@ -211,6 +212,15 @@ ShaderCode GenerateGeometryShaderCode(APIType ApiType, const geometry_shader_uid
|
|||||||
{
|
{
|
||||||
out.Write("\tVS_OUTPUT f;\n");
|
out.Write("\tVS_OUTPUT f;\n");
|
||||||
AssignVSOutputMembers(out, "f", "vs[i]", uid_data->numTexGens, uid_data->pixel_lighting);
|
AssignVSOutputMembers(out, "f", "vs[i]", uid_data->numTexGens, uid_data->pixel_lighting);
|
||||||
|
|
||||||
|
if (g_ActiveConfig.backend_info.bSupportsDepthClamp &&
|
||||||
|
DriverDetails::HasBug(DriverDetails::BUG_BROKENCLIPDISTANCE))
|
||||||
|
{
|
||||||
|
// On certain GPUs we have to consume the clip distance from the vertex shader
|
||||||
|
// or else the other vertex shader outputs will get corrupted.
|
||||||
|
out.Write("\tf.clipDist0 = gl_in[i].gl_ClipDistance[0];\n");
|
||||||
|
out.Write("\tf.clipDist1 = gl_in[i].gl_ClipDistance[1];\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user