summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/GeometryShaderGen.cpp
diff options
context:
space:
mode:
authorJules Blok <jules.blok@gmail.com>2014-12-15 22:29:56 +0100
committerJules Blok <jules.blok@gmail.com>2014-12-15 22:47:43 +0100
commit8ae738ff3076aa2b4cec254f3d5dcfe2fea95d88 (patch)
tree8d5d12c80d408d6cbf6e1c328d8e7f6f33d6b22f /Source/Core/VideoCommon/GeometryShaderGen.cpp
parent55e60a9c2242713a93621ca1b618930e5c61aef0 (diff)
VideoCommon: Merge PointGeometryShader into GeometryShaderGen.
This adds point-width emulation support to OpenGL.
Diffstat (limited to 'Source/Core/VideoCommon/GeometryShaderGen.cpp')
-rw-r--r--Source/Core/VideoCommon/GeometryShaderGen.cpp34
1 files changed, 33 insertions, 1 deletions
diff --git a/Source/Core/VideoCommon/GeometryShaderGen.cpp b/Source/Core/VideoCommon/GeometryShaderGen.cpp
index ee6da0fe4d..fabd883ded 100644
--- a/Source/Core/VideoCommon/GeometryShaderGen.cpp
+++ b/Source/Core/VideoCommon/GeometryShaderGen.cpp
@@ -140,6 +140,12 @@ static inline void GenerateGeometryShader(T& out, u32 primitive_type, API_TYPE A
out.Write("\t\toffset = float2(0, -" I_LINEPTWIDTH"[0] / " I_VIEWPORT".y);\n");
out.Write("\t}\n");
}
+ else if (primitive_type == PRIMITIVE_POINTS)
+ {
+ // Offset from center to upper right vertex
+ // Lerp PointSize/2 from [0,0..VpWidth,VpHeight] to [-1,1..1,-1]
+ out.Write("float2 offset = float2(" I_LINEPTWIDTH"[1] / " I_VIEWPORT".x, -" I_LINEPTWIDTH"[1] / " I_VIEWPORT".y) * o[0].pos.w;\n");
+ }
if (g_ActiveConfig.iStereoMode > 0)
{
@@ -186,12 +192,38 @@ static inline void GenerateGeometryShader(T& out, u32 primitive_type, API_TYPE A
for (unsigned int i = 0; i < bpmem.genMode.numtexgens; ++i)
{
- out.Write("\tr.tex%d.x += " I_LINEPTWIDTH"[2] * (" I_TEXOFFSETFLAGS"[%d] % 2);\n", i, i);
+ out.Write("\tr.tex%d.x += " I_LINEPTWIDTH"[2] * (" I_TEXOFFSETFLAGS"[%d] & 0x01);\n", i, i);
}
EmitVertex<T>(out, "l", ApiType);
EmitVertex<T>(out, "r", ApiType);
}
+ else if (primitive_type == PRIMITIVE_POINTS)
+ {
+ out.Write("VS_OUTPUT ll = f;\n");
+ out.Write("VS_OUTPUT lr = f;\n");
+ out.Write("VS_OUTPUT ul = f;\n");
+ out.Write("VS_OUTPUT ur = f;\n");
+
+ out.Write("ll.pos.xy += float2(-1,-1) * offset;\n");
+ out.Write("lr.pos.xy += float2(1,-1) * offset;\n");
+ out.Write("ul.pos.xy += float2(-1,1) * offset;\n");
+ out.Write("ur.pos.xy += offset;\n");
+
+ out.Write("float2 texOffset = float2(" I_LINEPTWIDTH"[3], " I_LINEPTWIDTH"[3]);\n");
+
+ for (unsigned int i = 0; i < bpmem.genMode.numtexgens; ++i)
+ {
+ out.Write("ll.tex%d.xy += float2(0,1) * texOffset * (" I_TEXOFFSETFLAGS"[%d] & 0x10);\n", i, i);
+ out.Write("lr.tex%d.xy += texOffset * (" I_TEXOFFSETFLAGS"[%d] & 0x10);\n", i, i);
+ out.Write("ur.tex%d.xy += float2(1,0) * texOffset * (" I_TEXOFFSETFLAGS"[%d] & 0x10);\n", i, i);
+ }
+
+ EmitVertex<T>(out, "ll", ApiType);
+ EmitVertex<T>(out, "lr", ApiType);
+ EmitVertex<T>(out, "ul", ApiType);
+ EmitVertex<T>(out, "ur", ApiType);
+ }
else
{
EmitVertex<T>(out, "f", ApiType);