From: Mathias Fröhlich <[email protected]> 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.
Signed-off-by: Mathias Fröhlich <[email protected]> --- src/intel/compiler/brw_compiler.h | 7 +++++++ src/intel/compiler/brw_fs.cpp | 23 +++++++++++++++++++++++ src/intel/compiler/brw_fs.h | 2 ++ src/intel/compiler/brw_fs_visitor.cpp | 1 + src/mesa/drivers/dri/i965/genX_state_upload.c | 7 +++---- 5 files changed, 36 insertions(+), 4 deletions(-) diff --git a/src/intel/compiler/brw_compiler.h b/src/intel/compiler/brw_compiler.h index 8b4e6fe2e2..a9df45e00d 100644 --- a/src/intel/compiler/brw_compiler.h +++ b/src/intel/compiler/brw_compiler.h @@ -743,6 +743,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 stored in urb_setup_attribs_count. + */ + int urb_setup_attribs[VARYING_SLOT_MAX]; + int urb_setup_attribs_count; }; struct brw_push_const_block { diff --git a/src/intel/compiler/brw_fs.cpp b/src/intel/compiler/brw_fs.cpp index b21996c168..6930414067 100644 --- a/src/intel/compiler/brw_fs.cpp +++ b/src/intel/compiler/brw_fs.cpp @@ -1507,6 +1507,25 @@ fs_visitor::assign_curb_setup() this->first_non_payload_grf = payload.num_regs + prog_data->curb_read_length; } +/* + * 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. + */ +void +brw_compute_urb_setup_index(struct brw_wm_prog_data *wm_prog_data) +{ + int index = 0; + for (int attr = 0; attr < VARYING_SLOT_MAX; attr++) { + int input_index = wm_prog_data->urb_setup[attr]; + if (input_index < 0) + continue; + wm_prog_data->urb_setup_attribs[index++] = attr; + } + wm_prog_data->urb_setup_attribs_count = index; +} + void fs_visitor::calculate_urb_setup() { @@ -1595,6 +1614,8 @@ fs_visitor::calculate_urb_setup() } prog_data->num_varying_inputs = urb_next; + + brw_compute_urb_setup_index(prog_data); } void @@ -6611,6 +6632,8 @@ gen9_ps_header_only_workaround(struct brw_wm_prog_data *wm_prog_data) wm_prog_data->urb_setup[VARYING_SLOT_LAYER] = 0; wm_prog_data->num_varying_inputs = 1; + + brw_compute_urb_setup_index(wm_prog_data); } bool diff --git a/src/intel/compiler/brw_fs.h b/src/intel/compiler/brw_fs.h index e384db809d..4c76b30973 100644 --- a/src/intel/compiler/brw_fs.h +++ b/src/intel/compiler/brw_fs.h @@ -525,4 +525,6 @@ fs_reg setup_imm_df(const brw::fs_builder &bld, enum brw_barycentric_mode brw_barycentric_mode(enum glsl_interp_mode mode, nir_intrinsic_op op); +void brw_compute_urb_setup_index(struct brw_wm_prog_data *wm_prog_data); + #endif /* BRW_FS_H */ diff --git a/src/intel/compiler/brw_fs_visitor.cpp b/src/intel/compiler/brw_fs_visitor.cpp index 7a5f6451f2..14805fce61 100644 --- a/src/intel/compiler/brw_fs_visitor.cpp +++ b/src/intel/compiler/brw_fs_visitor.cpp @@ -119,6 +119,7 @@ fs_visitor::emit_dummy_fs() wm_prog_data->num_varying_inputs = devinfo->gen < 6 ? 1 : 0; memset(wm_prog_data->urb_setup, -1, sizeof(wm_prog_data->urb_setup[0]) * VARYING_SLOT_MAX); + brw_compute_urb_setup_index(wm_prog_data); /* We don't have any uniforms. */ stage_prog_data->nr_params = 0; diff --git a/src/mesa/drivers/dri/i965/genX_state_upload.c b/src/mesa/drivers/dri/i965/genX_state_upload.c index 6178bfa3f8..cd905d13e5 100644 --- a/src/mesa/drivers/dri/i965/genX_state_upload.c +++ b/src/mesa/drivers/dri/i965/genX_state_upload.c @@ -1104,12 +1104,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->urb_setup_attribs_count; 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 _______________________________________________ mesa-dev mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-dev
