diff options
author | Kenneth Graunke <[email protected]> | 2013-02-02 12:40:54 -0800 |
---|---|---|
committer | Kenneth Graunke <[email protected]> | 2013-02-03 13:40:43 -0800 |
commit | 5e9bc7bd1290b0c34be90e9a0b8298ebe4b4b131 (patch) | |
tree | e131860559a962e26290ca45ea6dfd0c639c7b58 /src/mesa/drivers | |
parent | b3efc5bea85a84493a4b81eea0d3c3acfe42813f (diff) |
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 <[email protected]>
Tested-by: Martin Steigerwald <[email protected]>
Signed-off-by: Kenneth Graunke <[email protected]>
Diffstat (limited to 'src/mesa/drivers')
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_state.h | 2 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/gen6_sf_state.c | 10 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/gen7_sf_state.c | 4 |
3 files changed, 12 insertions, 4 deletions
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++) |