nir/i965/freedreno/vc4: add a bindless bool to type size functions
This required to calculate sizes correctly when we have bindless samplers/images. Reviewed-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
committed by
Karol Herbst
parent
3b2a9ffd60
commit
035759b61b
@@ -576,7 +576,7 @@ vec4_visitor::emit_pack_snorm_4x8(const dst_reg &dst, const src_reg &src0)
|
||||
* false) elements needed to pack a type.
|
||||
*/
|
||||
static int
|
||||
type_size_xvec4(const struct glsl_type *type, bool as_vec4)
|
||||
type_size_xvec4(const struct glsl_type *type, bool as_vec4, bool bindless)
|
||||
{
|
||||
unsigned int i;
|
||||
int size;
|
||||
@@ -609,12 +609,14 @@ type_size_xvec4(const struct glsl_type *type, bool as_vec4)
|
||||
}
|
||||
case GLSL_TYPE_ARRAY:
|
||||
assert(type->length > 0);
|
||||
return type_size_xvec4(type->fields.array, as_vec4) * type->length;
|
||||
return type_size_xvec4(type->fields.array, as_vec4, bindless) *
|
||||
type->length;
|
||||
case GLSL_TYPE_STRUCT:
|
||||
case GLSL_TYPE_INTERFACE:
|
||||
size = 0;
|
||||
for (i = 0; i < type->length; i++) {
|
||||
size += type_size_xvec4(type->fields.structure[i].type, as_vec4);
|
||||
size += type_size_xvec4(type->fields.structure[i].type, as_vec4,
|
||||
bindless);
|
||||
}
|
||||
return size;
|
||||
case GLSL_TYPE_SUBROUTINE:
|
||||
@@ -624,11 +626,11 @@ type_size_xvec4(const struct glsl_type *type, bool as_vec4)
|
||||
/* Samplers take up no register space, since they're baked in at
|
||||
* link time.
|
||||
*/
|
||||
return 0;
|
||||
return bindless ? 1 : 0;
|
||||
case GLSL_TYPE_ATOMIC_UINT:
|
||||
return 0;
|
||||
case GLSL_TYPE_IMAGE:
|
||||
return DIV_ROUND_UP(BRW_IMAGE_PARAM_SIZE, 4);
|
||||
return bindless ? 1 : DIV_ROUND_UP(BRW_IMAGE_PARAM_SIZE, 4);
|
||||
case GLSL_TYPE_VOID:
|
||||
case GLSL_TYPE_ERROR:
|
||||
case GLSL_TYPE_FUNCTION:
|
||||
@@ -649,9 +651,9 @@ type_size_xvec4(const struct glsl_type *type, bool as_vec4)
|
||||
* store a particular type.
|
||||
*/
|
||||
extern "C" int
|
||||
type_size_vec4(const struct glsl_type *type)
|
||||
type_size_vec4(const struct glsl_type *type, bool bindless)
|
||||
{
|
||||
return type_size_xvec4(type, true);
|
||||
return type_size_xvec4(type, true, bindless);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -674,9 +676,9 @@ type_size_vec4(const struct glsl_type *type)
|
||||
* type fits in one or two vec4 slots.
|
||||
*/
|
||||
extern "C" int
|
||||
type_size_dvec4(const struct glsl_type *type)
|
||||
type_size_dvec4(const struct glsl_type *type, bool bindless)
|
||||
{
|
||||
return type_size_xvec4(type, false);
|
||||
return type_size_xvec4(type, false, bindless);
|
||||
}
|
||||
|
||||
src_reg::src_reg(class vec4_visitor *v, const struct glsl_type *type)
|
||||
@@ -684,7 +686,7 @@ src_reg::src_reg(class vec4_visitor *v, const struct glsl_type *type)
|
||||
init();
|
||||
|
||||
this->file = VGRF;
|
||||
this->nr = v->alloc.allocate(type_size_vec4(type));
|
||||
this->nr = v->alloc.allocate(type_size_vec4(type, false));
|
||||
|
||||
if (type->is_array() || type->is_struct()) {
|
||||
this->swizzle = BRW_SWIZZLE_NOOP;
|
||||
@@ -702,7 +704,7 @@ src_reg::src_reg(class vec4_visitor *v, const struct glsl_type *type, int size)
|
||||
init();
|
||||
|
||||
this->file = VGRF;
|
||||
this->nr = v->alloc.allocate(type_size_vec4(type) * size);
|
||||
this->nr = v->alloc.allocate(type_size_vec4(type, false) * size);
|
||||
|
||||
this->swizzle = BRW_SWIZZLE_NOOP;
|
||||
|
||||
@@ -714,7 +716,7 @@ dst_reg::dst_reg(class vec4_visitor *v, const struct glsl_type *type)
|
||||
init();
|
||||
|
||||
this->file = VGRF;
|
||||
this->nr = v->alloc.allocate(type_size_vec4(type));
|
||||
this->nr = v->alloc.allocate(type_size_vec4(type, false));
|
||||
|
||||
if (type->is_array() || type->is_struct()) {
|
||||
this->writemask = WRITEMASK_XYZW;
|
||||
|
||||
Reference in New Issue
Block a user