spirv: move block_size() definition
Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
This commit is contained in:
@@ -385,6 +385,54 @@ end:
|
|||||||
return offset;
|
return offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Tries to compute the size of an interface block based on the strides and
|
||||||
|
* offsets that are provided to us in the SPIR-V source.
|
||||||
|
*/
|
||||||
|
static unsigned
|
||||||
|
vtn_type_block_size(struct vtn_type *type)
|
||||||
|
{
|
||||||
|
enum glsl_base_type base_type = glsl_get_base_type(type->type);
|
||||||
|
switch (base_type) {
|
||||||
|
case GLSL_TYPE_UINT:
|
||||||
|
case GLSL_TYPE_INT:
|
||||||
|
case GLSL_TYPE_FLOAT:
|
||||||
|
case GLSL_TYPE_BOOL:
|
||||||
|
case GLSL_TYPE_DOUBLE: {
|
||||||
|
unsigned cols = type->row_major ? glsl_get_vector_elements(type->type) :
|
||||||
|
glsl_get_matrix_columns(type->type);
|
||||||
|
if (cols > 1) {
|
||||||
|
assert(type->stride > 0);
|
||||||
|
return type->stride * cols;
|
||||||
|
} else if (base_type == GLSL_TYPE_DOUBLE) {
|
||||||
|
return glsl_get_vector_elements(type->type) * 8;
|
||||||
|
} else {
|
||||||
|
return glsl_get_vector_elements(type->type) * 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
case GLSL_TYPE_STRUCT:
|
||||||
|
case GLSL_TYPE_INTERFACE: {
|
||||||
|
unsigned size = 0;
|
||||||
|
unsigned num_fields = glsl_get_length(type->type);
|
||||||
|
for (unsigned f = 0; f < num_fields; f++) {
|
||||||
|
unsigned field_end = type->offsets[f] +
|
||||||
|
vtn_type_block_size(type->members[f]);
|
||||||
|
size = MAX2(size, field_end);
|
||||||
|
}
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
case GLSL_TYPE_ARRAY:
|
||||||
|
assert(type->stride > 0);
|
||||||
|
assert(glsl_get_length(type->type) > 0);
|
||||||
|
return type->stride * glsl_get_length(type->type);
|
||||||
|
|
||||||
|
default:
|
||||||
|
assert(!"Invalid block type");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_vtn_load_store_tail(struct vtn_builder *b, nir_intrinsic_op op, bool load,
|
_vtn_load_store_tail(struct vtn_builder *b, nir_intrinsic_op op, bool load,
|
||||||
nir_ssa_def *index, nir_ssa_def *offset,
|
nir_ssa_def *index, nir_ssa_def *offset,
|
||||||
@@ -1109,54 +1157,6 @@ var_decoration_cb(struct vtn_builder *b, struct vtn_value *val, int member,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Tries to compute the size of an interface block based on the strides and
|
|
||||||
* offsets that are provided to us in the SPIR-V source.
|
|
||||||
*/
|
|
||||||
static unsigned
|
|
||||||
vtn_type_block_size(struct vtn_type *type)
|
|
||||||
{
|
|
||||||
enum glsl_base_type base_type = glsl_get_base_type(type->type);
|
|
||||||
switch (base_type) {
|
|
||||||
case GLSL_TYPE_UINT:
|
|
||||||
case GLSL_TYPE_INT:
|
|
||||||
case GLSL_TYPE_FLOAT:
|
|
||||||
case GLSL_TYPE_BOOL:
|
|
||||||
case GLSL_TYPE_DOUBLE: {
|
|
||||||
unsigned cols = type->row_major ? glsl_get_vector_elements(type->type) :
|
|
||||||
glsl_get_matrix_columns(type->type);
|
|
||||||
if (cols > 1) {
|
|
||||||
assert(type->stride > 0);
|
|
||||||
return type->stride * cols;
|
|
||||||
} else if (base_type == GLSL_TYPE_DOUBLE) {
|
|
||||||
return glsl_get_vector_elements(type->type) * 8;
|
|
||||||
} else {
|
|
||||||
return glsl_get_vector_elements(type->type) * 4;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
case GLSL_TYPE_STRUCT:
|
|
||||||
case GLSL_TYPE_INTERFACE: {
|
|
||||||
unsigned size = 0;
|
|
||||||
unsigned num_fields = glsl_get_length(type->type);
|
|
||||||
for (unsigned f = 0; f < num_fields; f++) {
|
|
||||||
unsigned field_end = type->offsets[f] +
|
|
||||||
vtn_type_block_size(type->members[f]);
|
|
||||||
size = MAX2(size, field_end);
|
|
||||||
}
|
|
||||||
return size;
|
|
||||||
}
|
|
||||||
|
|
||||||
case GLSL_TYPE_ARRAY:
|
|
||||||
assert(type->stride > 0);
|
|
||||||
assert(glsl_get_length(type->type) > 0);
|
|
||||||
return type->stride * glsl_get_length(type->type);
|
|
||||||
|
|
||||||
default:
|
|
||||||
assert(!"Invalid block type");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
vtn_handle_variables(struct vtn_builder *b, SpvOp opcode,
|
vtn_handle_variables(struct vtn_builder *b, SpvOp opcode,
|
||||||
const uint32_t *w, unsigned count)
|
const uint32_t *w, unsigned count)
|
||||||
|
Reference in New Issue
Block a user