panfrost: Implement integer varyings
We need to actually work out the varying format on demand, rather than assuming rgba32f. Fixes dEQP-GLES3.functional.fragment_out.basic.int.* Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
This commit is contained in:
parent
62d056d8e3
commit
67fe2afa51
|
@ -148,7 +148,7 @@ panfrost_shader_compile(
|
|||
|
||||
/* Default to a vec4 varying */
|
||||
struct mali_attr_meta v = {
|
||||
.format = MALI_RGBA32F,
|
||||
.format = program.varying_type[i],
|
||||
.swizzle = default_vec4_swizzle,
|
||||
.unknown1 = 0x2,
|
||||
};
|
||||
|
|
|
@ -2533,6 +2533,58 @@ midgard_get_first_tag_from_block(compiler_context *ctx, unsigned block_idx)
|
|||
return first_tag;
|
||||
}
|
||||
|
||||
static unsigned
|
||||
pan_format_from_nir_base(nir_alu_type base)
|
||||
{
|
||||
switch (base) {
|
||||
case nir_type_int:
|
||||
return MALI_FORMAT_SINT;
|
||||
case nir_type_uint:
|
||||
case nir_type_bool:
|
||||
return MALI_FORMAT_UINT;
|
||||
case nir_type_float:
|
||||
return MALI_CHANNEL_FLOAT;
|
||||
default:
|
||||
unreachable("Invalid base");
|
||||
}
|
||||
}
|
||||
|
||||
static unsigned
|
||||
pan_format_from_nir_size(nir_alu_type base, unsigned size)
|
||||
{
|
||||
if (base == nir_type_float) {
|
||||
switch (size) {
|
||||
case 16: return MALI_FORMAT_SINT;
|
||||
case 32: return MALI_FORMAT_UNORM;
|
||||
default:
|
||||
unreachable("Invalid float size for format");
|
||||
}
|
||||
} else {
|
||||
switch (size) {
|
||||
case 1:
|
||||
case 8: return MALI_CHANNEL_8;
|
||||
case 16: return MALI_CHANNEL_16;
|
||||
case 32: return MALI_CHANNEL_32;
|
||||
default:
|
||||
unreachable("Invalid int size for format");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static enum mali_format
|
||||
pan_format_from_glsl(const struct glsl_type *type)
|
||||
{
|
||||
enum glsl_base_type glsl_base = glsl_get_base_type(glsl_without_array(type));
|
||||
nir_alu_type t = nir_get_nir_type_for_glsl_base_type(glsl_base);
|
||||
|
||||
unsigned base = nir_alu_type_get_base_type(t);
|
||||
unsigned size = nir_alu_type_get_type_size(t);
|
||||
|
||||
return pan_format_from_nir_base(base) |
|
||||
pan_format_from_nir_size(base, size) |
|
||||
MALI_NR_CHANNELS(4);
|
||||
}
|
||||
|
||||
int
|
||||
midgard_compile_shader_nir(nir_shader *nir, midgard_program *program, bool is_blend, unsigned blend_rt, unsigned gpu_id, bool shaderdb)
|
||||
{
|
||||
|
@ -2573,6 +2625,7 @@ midgard_compile_shader_nir(nir_shader *nir, midgard_program *program, bool is_bl
|
|||
|
||||
for (int c = 0; c < sz; ++c) {
|
||||
program->varyings[loc + c] = var->data.location + c;
|
||||
program->varying_type[loc + c] = pan_format_from_glsl(var->type);
|
||||
max_varying = MAX2(max_varying, loc + c);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -78,6 +78,7 @@ typedef struct {
|
|||
unsigned sysvals[MAX_SYSVAL_COUNT];
|
||||
|
||||
unsigned varyings[32];
|
||||
enum mali_format varying_type[32];
|
||||
|
||||
/* Boolean properties of the program */
|
||||
bool writes_point_size;
|
||||
|
|
Loading…
Reference in New Issue