[Mesa-dev] [PATCH 2/3] i965: Implement a new type_size_4x() function.
Connor Abbott
cwabbott0 at gmail.com
Thu Oct 15 16:14:42 PDT 2015
On Thu, Oct 15, 2015 at 6:17 PM, Kenneth Graunke <kenneth at whitecape.org> wrote:
> Often, shader inputs/outputs are required to be aligned to vec4 slots
> for one reason or another. When working with the scalar backend, we
> want to count the number of scalar components, yet still respect the
> vec4 packing rules as required.
>
> The new "hybrid" type_size_4x() function pads everything out to vec4
> slots, similar to type_size_vec4(), but counts in scalar components,
> similar to type_size_scalar().
>
> Cc: mesa-stable at lists.freedesktop.org
> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> ---
> src/mesa/drivers/dri/i965/brw_fs.cpp | 52 ++++++++++++++++++++++++++++++++++
> src/mesa/drivers/dri/i965/brw_shader.h | 1 +
> 2 files changed, 53 insertions(+)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp
> index 01a7c99..4af88c5 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
> @@ -499,6 +499,58 @@ type_size_scalar(const struct glsl_type *type)
> }
>
> /**
> + * Returns the number of scalar components needed to store type, assuming
> + * that vectors are padded out to vec4.
> + *
> + * This has the packing rules of type_size_vec4(), but counts components
> + * similar to type_size_scalar().
> + */
> +extern "C" int
> +type_size_4x(const struct glsl_type *type)
> +{
> + int size;
> +
> + switch (type->base_type) {
> + case GLSL_TYPE_UINT:
> + case GLSL_TYPE_INT:
> + case GLSL_TYPE_FLOAT:
> + case GLSL_TYPE_BOOL:
> + if (type->is_matrix()) {
> + return 4 * type->matrix_columns;
> + } else {
> + /* Regardless of the size of vector, it's padded out to a vec4. */
> + return 4;
> + }
> + case GLSL_TYPE_ARRAY:
> + return type_size_4x(type->fields.array) * type->length;
> + case GLSL_TYPE_STRUCT:
> + size = 0;
> + for (unsigned i = 0; i < type->length; i++) {
> + size += type_size_4x(type->fields.structure[i].type);
> + }
> + return size;
> + case GLSL_TYPE_SAMPLER:
> + /* Samplers take up no register space, since they're baked in at
> + * link time.
> + */
> + return 0;
> + case GLSL_TYPE_ATOMIC_UINT:
> + return 0;
> + case GLSL_TYPE_SUBROUTINE:
> + return 4;
> + case GLSL_TYPE_IMAGE:
> + return ALIGN(BRW_IMAGE_PARAM_SIZE, 4);
> + case GLSL_TYPE_VOID:
> + case GLSL_TYPE_ERROR:
> + case GLSL_TYPE_INTERFACE:
> + case GLSL_TYPE_DOUBLE:
> + unreachable("not reached");
> + }
> +
> + return 0;
> +}
Is there a difference between this and type_size_vec4(type) * 4?
> +
> +/**
> * Create a MOV to read the timestamp register.
> *
> * The caller is responsible for emitting the MOV. The return value is
> diff --git a/src/mesa/drivers/dri/i965/brw_shader.h b/src/mesa/drivers/dri/i965/brw_shader.h
> index ad2de5e..06a5b4c 100644
> --- a/src/mesa/drivers/dri/i965/brw_shader.h
> +++ b/src/mesa/drivers/dri/i965/brw_shader.h
> @@ -316,6 +316,7 @@ bool brw_cs_precompile(struct gl_context *ctx,
> struct gl_program *prog);
>
> int type_size_scalar(const struct glsl_type *type);
> +int type_size_4x(const struct glsl_type *type);
> int type_size_vec4(const struct glsl_type *type);
>
> bool is_scalar_shader_stage(const struct brw_compiler *compiler, int stage);
> --
> 2.6.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