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 <kenneth@whitecape.org> Reviewed-by: Matt Turner <mattst88@gmail.com> Reviewed-by: Chris Forbes <chrisf@ijw.co.nz>
This commit is contained in:
@@ -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));
|
||||
|
@@ -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;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user