[Mesa-dev] [PATCH] i965: Move down genX_upload_sbe in profiles.
Mathias.Froehlich at gmx.net
Mathias.Froehlich at gmx.net
Sat Jan 27 16:19:10 UTC 2018
From: Mathias Fröhlich <mathias.froehlich at web.de>
Hi all,
Avoid looping over all VARYING_SLOT_MAX urb_setup array
entries from genX_upload_sbe. Prepare an array indirection
to the active entries of urb_setup already in the compile
step. On upload only walk the active arrays.
The change moves down genX_upload_sbe in perf profiles by some lines.
Please review.
best
Mathias
Signed-off-by: Mathias Fröhlich <Mathias.Froehlich at web.de>
---
src/intel/compiler/brw_compiler.h | 7 +++++++
src/intel/compiler/brw_fs.cpp | 13 +++++++++++++
src/mesa/drivers/dri/i965/genX_state_upload.c | 7 +++----
3 files changed, 23 insertions(+), 4 deletions(-)
diff --git a/src/intel/compiler/brw_compiler.h b/src/intel/compiler/brw_compiler.h
index b1086bbcee..988b926b99 100644
--- a/src/intel/compiler/brw_compiler.h
+++ b/src/intel/compiler/brw_compiler.h
@@ -731,6 +731,13 @@ struct brw_wm_prog_data {
* For varying slots that are not used by the FS, the value is -1.
*/
int urb_setup[VARYING_SLOT_MAX];
+ /**
+ * Cache structure into the urb_setup array above that contains the
+ * attribute numbers of active varyings out of urb_setup.
+ * The actual count is already available with the num_varying_inputs
+ * value above.
+ */
+ int urb_setup_attribs[VARYING_SLOT_MAX];
};
struct brw_push_const_block {
diff --git a/src/intel/compiler/brw_fs.cpp b/src/intel/compiler/brw_fs.cpp
index 6fb46e7374..52c5a22b81 100644
--- a/src/intel/compiler/brw_fs.cpp
+++ b/src/intel/compiler/brw_fs.cpp
@@ -1564,6 +1564,19 @@ fs_visitor::calculate_urb_setup()
prog_data->urb_setup[VARYING_SLOT_PNTC] = urb_next++;
}
+ /*
+ * Build up an array of indices into the urb_setup array that
+ * references the active entries of the urb_setup array.
+ * Used to accelerate walking the active entries of the urb_setup array
+ * on each upload.
+ */
+ for (int attr = 0, index = 0; attr < VARYING_SLOT_MAX; attr++) {
+ int input_index = prog_data->urb_setup[attr];
+ if (input_index < 0)
+ continue;
+ prog_data->urb_setup_attribs[index++] = attr;
+ }
+
prog_data->num_varying_inputs = urb_next;
}
diff --git a/src/mesa/drivers/dri/i965/genX_state_upload.c b/src/mesa/drivers/dri/i965/genX_state_upload.c
index aa4d64d08e..e2ed4ef040 100644
--- a/src/mesa/drivers/dri/i965/genX_state_upload.c
+++ b/src/mesa/drivers/dri/i965/genX_state_upload.c
@@ -1052,12 +1052,11 @@ genX(calculate_attr_overrides)(const struct brw_context *brw,
* BRW_NEW_PRIMITIVE | BRW_NEW_GS_PROG_DATA | BRW_NEW_TES_PROG_DATA
*/
bool drawing_points = brw_is_drawing_points(brw);
-
- for (int attr = 0; attr < VARYING_SLOT_MAX; attr++) {
+ for (int index = 0; index < wm_prog_data->num_varying_inputs; index++) {
+ int attr = wm_prog_data->urb_setup_attribs[index];
int input_index = wm_prog_data->urb_setup[attr];
- if (input_index < 0)
- continue;
+ assert(0 <= input_index);
/* _NEW_POINT */
bool point_sprite = false;
--
2.14.3
More information about the mesa-dev
mailing list