From: Kenneth Graunke Date: Sat, 2 Feb 2013 20:40:54 +0000 (-0800) Subject: i965: Compute the maximum SF source attribute. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=5e9bc7bd1290b0c34be90e9a0b8298ebe4b4b131;p=mesa.git i965: Compute the maximum SF source attribute. The maximum SF source attribute is necessary to compute the Vertex URB read length properly, which will be done in the next commit. NOTE: This is a candidate for all stable branches. Reviewed-by: Paul Berry Tested-by: Martin Steigerwald Signed-off-by: Kenneth Graunke --- diff --git a/src/mesa/drivers/dri/i965/brw_state.h b/src/mesa/drivers/dri/i965/brw_state.h index d9708c14bb7..adc64e3ed31 100644 --- a/src/mesa/drivers/dri/i965/brw_state.h +++ b/src/mesa/drivers/dri/i965/brw_state.h @@ -225,7 +225,7 @@ void upload_default_color(struct brw_context *brw, /* gen6_sf_state.c */ uint32_t get_attr_override(struct brw_vue_map *vue_map, int urb_entry_read_offset, - int fs_attr, bool two_side_color); + int fs_attr, bool two_side_color, uint32_t *max_source_attr); #ifdef __cplusplus } diff --git a/src/mesa/drivers/dri/i965/gen6_sf_state.c b/src/mesa/drivers/dri/i965/gen6_sf_state.c index bd7d4610d46..5d7fd46bd86 100644 --- a/src/mesa/drivers/dri/i965/gen6_sf_state.c +++ b/src/mesa/drivers/dri/i965/gen6_sf_state.c @@ -54,7 +54,7 @@ */ uint32_t get_attr_override(struct brw_vue_map *vue_map, int urb_entry_read_offset, - int fs_attr, bool two_side_color) + int fs_attr, bool two_side_color, uint32_t *max_source_attr) { int vs_attr = _mesa_frag_attrib_to_vert_result(fs_attr); if (vs_attr < 0 || vs_attr == VERT_RESULT_HPOS) { @@ -101,6 +101,10 @@ get_attr_override(struct brw_vue_map *vue_map, int urb_entry_read_offset, (vue_map->slot_to_vert_result[slot] == VERT_RESULT_COL1 && vue_map->slot_to_vert_result[slot+1] == VERT_RESULT_BFC1)); + /* Update max_source_attr. If swizzling, the SF will read this slot + 1. */ + if (*max_source_attr < source_attr + swizzling) + *max_source_attr = source_attr + swizzling; + if (swizzling) { return source_attr | (ATTRIBUTE_SWIZZLE_INPUTATTR_FACING << ATTRIBUTE_SWIZZLE_SHIFT); @@ -281,6 +285,7 @@ upload_sf_state(struct brw_context *brw) /* Create the mapping from the FS inputs we produce to the VS outputs * they source from. */ + uint32_t max_source_attr = 0; for (; attr < FRAG_ATTRIB_MAX; attr++) { enum glsl_interp_qualifier interp_qualifier = brw->fragment_program->InterpQualifier[attr]; @@ -316,7 +321,8 @@ upload_sf_state(struct brw_context *brw) attr_overrides[input_index++] = get_attr_override(&brw->vs.prog_data->vue_map, urb_entry_read_offset, attr, - ctx->VertexProgram._TwoSideEnabled); + ctx->VertexProgram._TwoSideEnabled, + &max_source_attr); } for (; input_index < FRAG_ATTRIB_MAX; input_index++) diff --git a/src/mesa/drivers/dri/i965/gen7_sf_state.c b/src/mesa/drivers/dri/i965/gen7_sf_state.c index 8b33514d5bd..b801b964136 100644 --- a/src/mesa/drivers/dri/i965/gen7_sf_state.c +++ b/src/mesa/drivers/dri/i965/gen7_sf_state.c @@ -84,6 +84,7 @@ upload_sbe_state(struct brw_context *brw) /* Create the mapping from the FS inputs we produce to the VS outputs * they source from. */ + uint32_t max_source_attr = 0; for (; attr < FRAG_ATTRIB_MAX; attr++) { enum glsl_interp_qualifier interp_qualifier = brw->fragment_program->InterpQualifier[attr]; @@ -118,7 +119,8 @@ upload_sbe_state(struct brw_context *brw) attr_overrides[input_index++] = get_attr_override(&brw->vs.prog_data->vue_map, urb_entry_read_offset, attr, - ctx->VertexProgram._TwoSideEnabled); + ctx->VertexProgram._TwoSideEnabled, + &max_source_attr); } for (; input_index < FRAG_ATTRIB_MAX; input_index++)