summaryrefslogtreecommitdiffstats
path: root/src/mesa
diff options
context:
space:
mode:
authorPaul Berry <[email protected]>2013-07-12 20:17:13 -0700
committerPaul Berry <[email protected]>2013-10-08 12:44:24 -0700
commitd14fcd7db7501cc5dbbcefac166238d9a49ccd84 (patch)
tree331eb6d8571fb48a08154a325984a034e37299b7 /src/mesa
parent8f758b0b92f6105c9615740096fa1206befe343b (diff)
i965/gs: Fixup gl_PointSize on entry to geometry shaders.
gl_PointSize is stored in the w component of VARYING_SLOT_PSIZ, but the geometry shader infrastructure assumes that it should look for all geometry shader inputs of type float in the x component. So when compiling a geomtery shader that uses a gl_PointSize input, fix it up during the shader prolog by moving the w component to the x component. This is similar to how we emit fixups and workarounds for vertex shader attributes. Fixes piglit test spec/glsl-1.50/execution/geometry/core-inputs. Reviewed-by: Ian Romanick <[email protected]> Reviewed-by: Jordan Justen <[email protected]>
Diffstat (limited to 'src/mesa')
-rw-r--r--src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.cpp17
1 files changed, 17 insertions, 0 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.cpp
index 2d3a058ee80..96636e8838b 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.cpp
+++ b/src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.cpp
@@ -156,6 +156,23 @@ vec4_gs_visitor::emit_prolog()
}
}
+ /* If the geometry shader uses the gl_PointSize input, we need to fix it up
+ * to account for the fact that the vertex shader stored it in the w
+ * component of VARYING_SLOT_PSIZ.
+ */
+ if (c->gp->program.Base.InputsRead & VARYING_BIT_PSIZ) {
+ this->current_annotation = "swizzle gl_PointSize input";
+ for (int vertex = 0; vertex < c->gp->program.VerticesIn; vertex++) {
+ dst_reg dst(ATTR,
+ BRW_VARYING_SLOT_COUNT * vertex + VARYING_SLOT_PSIZ);
+ dst.type = BRW_REGISTER_TYPE_F;
+ src_reg src(dst);
+ dst.writemask = WRITEMASK_X;
+ src.swizzle = BRW_SWIZZLE_WWWW;
+ emit(MOV(dst, src));
+ }
+ }
+
this->current_annotation = NULL;
}