summaryrefslogtreecommitdiffstats
path: root/src/mesa/drivers/dri/i965/gen7_sf_state.c
diff options
context:
space:
mode:
authorPaul Berry <stereotype441@gmail.com>2013-09-02 21:59:04 -0700
committerPaul Berry <stereotype441@gmail.com>2013-09-16 12:53:29 -0700
commit0af1252ae478a28a76326a5c5d784864327793e2 (patch)
tree6696f71d2962a5c585747afc54220c8274531c60 /src/mesa/drivers/dri/i965/gen7_sf_state.c
parentaf84bbd2caec19c556d279c5a843566cbd99ecb3 (diff)
downloadexternal_mesa3d-0af1252ae478a28a76326a5c5d784864327793e2.zip
external_mesa3d-0af1252ae478a28a76326a5c5d784864327793e2.tar.gz
external_mesa3d-0af1252ae478a28a76326a5c5d784864327793e2.tar.bz2
i965/sf: Consult brw_wm_prog_data when setting up SF/SBE state.
Previously, the SF/SBE setup code delivered varying inputs to the FS in the order in which they appear in the gl_program::InputsRead bitfield, since that's what the FS expects. When we add support for more than 64 varying components, this will no longer always be the case, because the Gen6+ SF/SBE stage is only capable of performing arbitrary reorderings of 16 varying slots. So, when there are more than 16 vec4's worth of varying inputs, the FS will have to adjust the order its input varyings in order to partially match the order of outputs from the geometry or vertex shader. To allow extra flexibility in the ordering of FS varyings, this patch causes the SF/SBE to deliver varying inputs to the FS in exactly the order that the FS requests, by consulting brw_wm_prog_data::urb_setup and brw_wm_prog_data::num_varying_inputs. Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Diffstat (limited to 'src/mesa/drivers/dri/i965/gen7_sf_state.c')
-rw-r--r--src/mesa/drivers/dri/i965/gen7_sf_state.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/src/mesa/drivers/dri/i965/gen7_sf_state.c b/src/mesa/drivers/dri/i965/gen7_sf_state.c
index 3f7c2e5..62362c2 100644
--- a/src/mesa/drivers/dri/i965/gen7_sf_state.c
+++ b/src/mesa/drivers/dri/i965/gen7_sf_state.c
@@ -33,12 +33,12 @@ static void
upload_sbe_state(struct brw_context *brw)
{
struct gl_context *ctx = &brw->ctx;
- /* BRW_NEW_FRAGMENT_PROGRAM */
- uint32_t num_outputs = _mesa_bitcount_64(brw->fragment_program->Base.InputsRead);
+ /* CACHE_NEW_WM_PROG */
+ uint32_t num_outputs = brw->wm.prog_data->num_varying_inputs;
uint32_t dw1, dw10, dw11;
int i;
const int urb_entry_read_offset = BRW_SF_URB_ENTRY_READ_OFFSET;
- uint16_t attr_overrides[VARYING_SLOT_MAX];
+ uint16_t attr_overrides[16];
/* _NEW_BUFFERS */
bool render_to_fbo = _mesa_is_user_fbo(ctx->DrawBuffer);
uint32_t point_sprite_origin;
@@ -62,7 +62,9 @@ upload_sbe_state(struct brw_context *brw)
dw10 = 0;
dw11 = 0;
- /* BRW_NEW_VUE_MAP_GEOM_OUT | _NEW_POINT | _NEW_LIGHT | _NEW_PROGRAM */
+ /* BRW_NEW_VUE_MAP_GEOM_OUT | _NEW_POINT | _NEW_LIGHT | _NEW_PROGRAM |
+ * CACHE_NEW_WM_PROG
+ */
uint32_t urb_entry_read_length;
calculate_attr_overrides(brw, attr_overrides, &dw10, &dw11,
&urb_entry_read_length);
@@ -93,7 +95,8 @@ const struct brw_tracked_state gen7_sbe_state = {
_NEW_PROGRAM),
.brw = (BRW_NEW_CONTEXT |
BRW_NEW_FRAGMENT_PROGRAM |
- BRW_NEW_VUE_MAP_GEOM_OUT)
+ BRW_NEW_VUE_MAP_GEOM_OUT),
+ .cache = CACHE_NEW_WM_PROG
},
.emit = upload_sbe_state,
};