On Oct 15, 2015 16:14, "Connor Abbott" <cwabbo...@gmail.com> wrote: > > On Thu, Oct 15, 2015 at 6:17 PM, Kenneth Graunke <kenn...@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-sta...@lists.freedesktop.org > > Signed-off-by: Kenneth Graunke <kenn...@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?
That's what I would like to know too. Also, I'm not sure I like the name "type_size_4x". 4x of what? That said, I don't have anything better. > > + > > +/** > > * 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@lists.freedesktop.org > > http://lists.freedesktop.org/mailman/listinfo/mesa-dev > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev