From 8ae738ff3076aa2b4cec254f3d5dcfe2fea95d88 Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Mon, 15 Dec 2014 22:29:56 +0100 Subject: VideoCommon: Merge PointGeometryShader into GeometryShaderGen. This adds point-width emulation support to OpenGL. --- Source/Core/VideoCommon/GeometryShaderGen.cpp | 34 ++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) (limited to 'Source/Core/VideoCommon/GeometryShaderGen.cpp') 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(out, "l", ApiType); EmitVertex(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(out, "ll", ApiType); + EmitVertex(out, "lr", ApiType); + EmitVertex(out, "ul", ApiType); + EmitVertex(out, "ur", ApiType); + } else { EmitVertex(out, "f", ApiType); -- cgit v1.2.3