diff options
author | Kenneth Graunke <kenneth@whitecape.org> | 2013-02-02 12:40:54 -0800 |
---|---|---|
committer | Andreas Boll <andreas.boll.dev@gmail.com> | 2013-02-13 21:48:37 +0100 |
commit | 2de8874ec37bfc548de2e16bbefa51341e25d340 (patch) | |
tree | 2938444705c45e906858db04238f606b9f2da75c | |
parent | d47020b6d4d810ac3f20c1e47c90d9de3fb8a53a (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.
Reviewed-by: Paul Berry <stereotype441@gmail.com>
Tested-by: Martin Steigerwald <martin@lichtvoll.de>
Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
(cherry picked from commit 5e9bc7bd1290b0c34be90e9a0b8298ebe4b4b131)
-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 48dd4ba76b..139ee06432 100644 --- a/src/mesa/drivers/dri/i965/brw_state.h +++ b/src/mesa/drivers/dri/i965/brw_state.h @@ -232,7 +232,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 bd7d4610d4..5d7fd46bd8 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 8b33514d5b..b801b96413 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++) |