[Mesa-dev] [PATCH 1/2] i965/fs: Add a flat_inputs field to prog_data
Samuel Iglesias Gonsálvez
siglesias at igalia.com
Wed Apr 6 06:03:56 UTC 2016
On 06/04/16 05:12, Jason Ekstrand wrote:
> ---
> src/mesa/drivers/dri/i965/brw_compiler.h | 6 ++++++
> src/mesa/drivers/dri/i965/brw_fs.cpp | 31 +++++++++++++++++++++++++++++++
> 2 files changed, 37 insertions(+)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_compiler.h b/src/mesa/drivers/dri/i965/brw_compiler.h
> index 231e000..3c7e382 100644
> --- a/src/mesa/drivers/dri/i965/brw_compiler.h
> +++ b/src/mesa/drivers/dri/i965/brw_compiler.h
> @@ -403,6 +403,12 @@ struct brw_wm_prog_data {
> uint32_t barycentric_interp_modes;
>
> /**
> + * Mask of which FS inputs are marked flat by the shader source. This is
> + * needed for setting up 3DSTATE_FS/SBE.
> + */
> + uint32_t flat_inputs;
> +
I think this should be uint64_t. If we are using all the available
locations (48 VARYING_SLOT_* that can appear in FS, according to
gl_varying_slot) then there would be input_index values higher than 32.
With that fixed,
Reviewed-by: Samuel Iglesias Gonsálvez <siglesias at igalia.com>
Sam
> + /**
> * Map from gl_varying_slot to the position within the FS setup data
> * payload where the varying's attribute vertex deltas should be delivered.
> * For varying slots that are not used by the FS, the value is -1.
> diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp
> index 1a6a229..fede15f 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
> @@ -5565,6 +5565,31 @@ brw_compute_barycentric_interp_modes(const struct brw_device_info *devinfo,
> return barycentric_interp_modes;
> }
>
> +static void
> +brw_compute_flat_inputs(struct brw_wm_prog_data *prog_data,
> + bool shade_model_flat, const nir_shader *shader)
> +{
> + prog_data->flat_inputs = 0;
> +
> + nir_foreach_variable(var, &shader->inputs) {
> + enum glsl_interp_qualifier interp_qualifier =
> + (enum glsl_interp_qualifier)var->data.interpolation;
> + bool is_gl_Color = (var->data.location == VARYING_SLOT_COL0) ||
> + (var->data.location == VARYING_SLOT_COL1);
> +
> + int input_index = prog_data->urb_setup[var->data.location];
> +
> + if (input_index < 0)
> + continue;
> +
> + /* flat shading */
> + if (interp_qualifier == INTERP_QUALIFIER_FLAT ||
> + (shade_model_flat && is_gl_Color &&
> + interp_qualifier == INTERP_QUALIFIER_NONE))
> + prog_data->flat_inputs |= (1 << input_index);
> + }
> +}
> +
> static uint8_t
> computed_depth_mode(const nir_shader *shader)
> {
> @@ -5649,6 +5674,12 @@ brw_compile_fs(const struct brw_compiler *compiler, void *log_data,
> }
> }
>
> + /* We have to compute the flat inputs after the visitor is finished running
> + * because it relies on prog_data->urb_setup which is computed in
> + * fs_visitor::calculate_urb_setup().
> + */
> + brw_compute_flat_inputs(prog_data, key->flat_shade, shader);
> +
> cfg_t *simd8_cfg;
> int no_simd8 = (INTEL_DEBUG & DEBUG_NO8) || use_rep_send;
> if ((no_simd8 || compiler->devinfo->gen < 5) && simd16_cfg) {
>
More information about the mesa-dev
mailing list