From 67c5d00273ca248d681bc73e81a53a8c45741991 Mon Sep 17 00:00:00 2001 From: Kenneth Graunke Date: Wed, 13 Jan 2016 20:33:16 -0800 Subject: [PATCH] i965/vec4/gs: Stop munging the ATTR containing gl_PointSize. gl_PointSize is delivered in the .w component of the VUE header, while the language expects it to be a float (and thus in the .x component). Previously, we emitted MOVs to copy it over to the .x component. But this is silly - we can just use a .wwww swizzle and access it without copying anything or clobbering the value stored at .x (which admittedly is useless). Removes the last use of ATTR destinations. v2: Use BRW_SWIZZLE_WWWW, not SWIZZLE_WWWW (caught by GCC). Signed-off-by: Kenneth Graunke Reviewed-by: Matt Turner Reviewed-by: Chris Forbes --- src/mesa/drivers/dri/i965/brw_vec4_gs_nir.cpp | 4 ++++ .../drivers/dri/i965/brw_vec4_gs_visitor.cpp | 23 ------------------- 2 files changed, 4 insertions(+), 23 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_vec4_gs_nir.cpp b/src/mesa/drivers/dri/i965/brw_vec4_gs_nir.cpp index 6f66978f8e1..d9c048e1764 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4_gs_nir.cpp +++ b/src/mesa/drivers/dri/i965/brw_vec4_gs_nir.cpp @@ -73,6 +73,10 @@ vec4_gs_visitor::nir_emit_intrinsic(nir_intrinsic_instr *instr) src = src_reg(ATTR, BRW_VARYING_SLOT_COUNT * vertex->u[0] + instr->const_index[0] + offset->u[0], type); + /* gl_PointSize is passed in the .w component of the VUE header */ + if (instr->const_index[0] == VARYING_SLOT_PSIZ) + src.swizzle = BRW_SWIZZLE_WWWW; + dest = get_nir_dest(instr->dest, src.type); dest.writemask = brw_writemask_for_size(instr->num_components); emit(MOV(dest, src)); 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 b2a971a40ff..1b63d568d85 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.cpp +++ b/src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.cpp @@ -182,29 +182,6 @@ 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 (nir->info.inputs_read & VARYING_BIT_PSIZ) { - this->current_annotation = "swizzle gl_PointSize input"; - for (int vertex = 0; vertex < (int)nir->info.gs.vertices_in; 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; - inst = emit(MOV(dst, src)); - - /* In dual instanced dispatch mode, dst has a width of 4, so we need - * to make sure the MOV happens regardless of which channels are - * enabled. - */ - inst->force_writemask_all = true; - } - } - this->current_annotation = NULL; } -- 2.30.2