[Mesa-dev] [PATCH 16/27] i965: Include UBO parameter sizes in push constant parameters

Pohjolainen, Topi topi.pohjolainen at intel.com
Thu May 7 08:26:22 PDT 2015


On Tue, Apr 28, 2015 at 11:08:13PM +0300, Abdiel Janulgue wrote:
> Now that we consider UBO constants as push constants, we need to include
> the sizes of the UBO's constant slots in the visitor's uniform slot sizes.
> This information is needed to properly pack vector constants tightly next to
> each other.
> 
> Signed-off-by: Abdiel Janulgue <abdiel.janulgue at linux.intel.com>
> ---
>  src/mesa/drivers/dri/i965/brw_gs.c | 11 +++++++++++
>  src/mesa/drivers/dri/i965/brw_vs.c | 13 +++++++++++++
>  src/mesa/drivers/dri/i965/brw_wm.c | 13 +++++++++++++
>  3 files changed, 37 insertions(+)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_gs.c b/src/mesa/drivers/dri/i965/brw_gs.c
> index 97658d5..2dc3ea1 100644
> --- a/src/mesa/drivers/dri/i965/brw_gs.c
> +++ b/src/mesa/drivers/dri/i965/brw_gs.c
> @@ -32,6 +32,7 @@
>  #include "brw_vec4_gs_visitor.h"
>  #include "brw_state.h"
>  #include "brw_ff_gs.h"
> +#include "glsl/nir/nir_types.h"
>  
>  
>  bool
> @@ -70,6 +71,16 @@ brw_compile_gs_prog(struct brw_context *brw,
>     c.prog_data.base.base.pull_param =
>        rzalloc_array(NULL, const gl_constant_value *, param_count);
>     c.prog_data.base.base.nr_params = param_count;
> +   c.prog_data.base.base.nr_ubo_params = 0;
> +   for (int i = 0; i < gs->NumUniformBlocks; i++) {
> +      for (int p = 0; p < gs->UniformBlocks[i].NumUniforms; p++) {
> +         const struct glsl_type *type = gs->UniformBlocks[i].Uniforms[p].Type;
> +         const struct glsl_type *elem = glsl_get_element_type(type);
> +         int array_sz = elem ? glsl_get_array_size(type) : 1;
> +         int components = elem ? glsl_get_components(elem) : glsl_get_components(type);
> +         c.prog_data.base.base.nr_ubo_params += components * array_sz;
> +      }
> +   }
>     c.prog_data.base.base.nr_gather_table = 0;
>     c.prog_data.base.base.gather_table =
>        rzalloc_size(NULL, sizeof(*c.prog_data.base.base.gather_table) *
> diff --git a/src/mesa/drivers/dri/i965/brw_vs.c b/src/mesa/drivers/dri/i965/brw_vs.c
> index 52333c9..86bef5e 100644
> --- a/src/mesa/drivers/dri/i965/brw_vs.c
> +++ b/src/mesa/drivers/dri/i965/brw_vs.c
> @@ -37,6 +37,7 @@
>  #include "brw_state.h"
>  #include "program/prog_print.h"
>  #include "program/prog_parameter.h"
> +#include "glsl/nir/nir_types.h"
>  
>  #include "util/ralloc.h"
>  
> @@ -243,6 +244,18 @@ brw_compile_vs_prog(struct brw_context *brw,
>        rzalloc_array(NULL, const gl_constant_value *, param_count);
>     stage_prog_data->nr_params = param_count;
>  
> +   stage_prog_data->nr_ubo_params = 0;
> +   if (vs) {
> +      for (int i = 0; i < vs->NumUniformBlocks; i++) {
> +         for (int p = 0; p < vs->UniformBlocks[i].NumUniforms; p++) {
> +            const struct glsl_type *type = vs->UniformBlocks[i].Uniforms[p].Type;
> +            const struct glsl_type *elem = glsl_get_element_type(type);
> +            int array_sz = elem ? glsl_get_array_size(type) : 1;
> +            int components = elem ? glsl_get_components(elem) : glsl_get_components(type);
> +            stage_prog_data->nr_ubo_params += components * array_sz;
> +         }
> +      }
> +   }
>     stage_prog_data->nr_gather_table = 0;
>     stage_prog_data->gather_table = rzalloc_size(NULL, sizeof(*stage_prog_data->gather_table) *
>                                                  (stage_prog_data->nr_params +
> diff --git a/src/mesa/drivers/dri/i965/brw_wm.c b/src/mesa/drivers/dri/i965/brw_wm.c
> index 13a64d8..2060eab 100644
> --- a/src/mesa/drivers/dri/i965/brw_wm.c
> +++ b/src/mesa/drivers/dri/i965/brw_wm.c
> @@ -38,6 +38,7 @@
>  #include "main/samplerobj.h"
>  #include "program/prog_parameter.h"
>  #include "program/program.h"
> +#include "glsl/nir/nir_types.h"
>  #include "intel_mipmap_tree.h"
>  
>  #include "util/ralloc.h"
> @@ -205,6 +206,18 @@ brw_compile_wm_prog(struct brw_context *brw,
>        rzalloc_array(NULL, const gl_constant_value *, param_count);
>     prog_data.base.nr_params = param_count;
>  
> +   prog_data.base.nr_ubo_params = 0;
> +   if (fs) {
> +      for (int i = 0; i < fs->NumUniformBlocks; i++) {
> +         for (int p = 0; p < fs->UniformBlocks[i].NumUniforms; p++) {
> +            const struct glsl_type *type = fs->UniformBlocks[i].Uniforms[p].Type;
> +            const struct glsl_type *elem = glsl_get_element_type(type);
> +            int array_sz = elem ? glsl_get_array_size(type) : 1;
> +            int components = elem ? glsl_get_components(elem) : glsl_get_components(type);
> +            prog_data.base.nr_ubo_params += components * array_sz;
> +         }
> +      }
> +   }

I didn't check for exact details but looks to me you could refactor this
into its own routine - all three occurences look awfully similar.

>     prog_data.base.nr_gather_table = 0;
>     prog_data.base.gather_table = rzalloc_size(NULL, sizeof(*prog_data.base.gather_table) *
>                                                (prog_data.base.nr_params +
> -- 
> 1.9.1
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list