summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/GeometryShaderGen.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Core/VideoCommon/GeometryShaderGen.cpp')
-rw-r--r--Source/Core/VideoCommon/GeometryShaderGen.cpp15
1 files changed, 15 insertions, 0 deletions
diff --git a/Source/Core/VideoCommon/GeometryShaderGen.cpp b/Source/Core/VideoCommon/GeometryShaderGen.cpp
index 4d90e6f10d..83b30943bc 100644
--- a/Source/Core/VideoCommon/GeometryShaderGen.cpp
+++ b/Source/Core/VideoCommon/GeometryShaderGen.cpp
@@ -7,6 +7,7 @@
#include "Common/CommonTypes.h"
#include "VideoCommon/BPMemory.h"
+#include "VideoCommon/DriverDetails.h"
#include "VideoCommon/GeometryShaderGen.h"
#include "VideoCommon/LightingShaderGen.h"
#include "VideoCommon/VideoCommon.h"
@@ -211,6 +212,15 @@ ShaderCode GenerateGeometryShaderCode(APIType ApiType, const geometry_shader_uid
{
out.Write("\tVS_OUTPUT f;\n");
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
{
@@ -312,6 +322,11 @@ static void EmitVertex(ShaderCode& out, const geometry_shader_uid_data* uid_data
if (ApiType == APIType::OpenGL)
{
out.Write("\tgl_Position = %s.pos;\n", vertex);
+ if (g_ActiveConfig.backend_info.bSupportsDepthClamp)
+ {
+ out.Write("\tgl_ClipDistance[0] = %s.clipDist0;\n", vertex);
+ out.Write("\tgl_ClipDistance[1] = %s.clipDist1;\n", vertex);
+ }
AssignVSOutputMembers(out, "ps", vertex, uid_data->numTexGens, uid_data->pixel_lighting);
}
else