From d14fcd7db7501cc5dbbcefac166238d9a49ccd84 Mon Sep 17 00:00:00 2001 From: Paul Berry Date: Fri, 12 Jul 2013 20:17:13 -0700 Subject: [PATCH] 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 Reviewed-by: Jordan Justen --- .../drivers/dri/i965/brw_vec4_gs_visitor.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) 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; } -- 2.30.2