etnaviv: init shader caps

Acked-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
Acked-by: Marek Olšák <marek.olsak@amd.com>
Reviewed-by: Christian Gmeiner <cgmeiner@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/33176>
This commit is contained in:
Qiang Yu 2025-01-16 17:25:17 +08:00
parent 332502d9a2
commit 99605fb3a8

View file

@ -240,6 +240,61 @@ etna_screen_get_shader_param(struct pipe_screen *pscreen,
return 0;
}
static void
etna_init_single_shader_caps(struct etna_screen *screen, enum pipe_shader_type shader)
{
struct pipe_shader_caps *caps =
(struct pipe_shader_caps *)&screen->base.shader_caps[shader];
bool ubo_enable = screen->info->halti >= 2;
if (DBG_ENABLED(ETNA_DBG_DEQP))
ubo_enable = true;
caps->max_instructions =
caps->max_alu_instructions =
caps->max_tex_instructions =
caps->max_tex_indirections = ETNA_MAX_TOKENS;
caps->max_control_flow_depth = ETNA_MAX_DEPTH; /* XXX */
/* Maximum number of inputs for the vertex shader is the number
* of vertex elements - each element defines one vertex shader
* input register. For the fragment shader, this is the number
* of varyings. */
caps->max_inputs = shader == PIPE_SHADER_FRAGMENT ?
screen->specs.max_varyings : screen->specs.vertex_max_elements;
caps->max_outputs = screen->specs.max_vs_outputs;
caps->max_temps = 64; /* Max native temporaries. */
caps->max_const_buffers = ubo_enable ? ETNA_MAX_CONST_BUF : 1;
caps->cont_supported = true;
caps->indirect_temp_addr = true;
caps->indirect_const_addr = true;
caps->tgsi_sqrt_supported = VIV_FEATURE(screen, ETNA_FEATURE_HAS_SQRT_TRIG);
caps->integers = screen->info->halti >= 2;
caps->max_texture_samplers =
caps->max_sampler_views = shader == PIPE_SHADER_FRAGMENT
? screen->specs.fragment_sampler_count
: screen->specs.vertex_sampler_count;
caps->max_const_buffer0_size =
ubo_enable ? 16384 /* 16384 so state tracker enables UBOs */ :
(shader == PIPE_SHADER_FRAGMENT
? screen->specs.max_ps_uniforms * sizeof(float[4])
: screen->specs.max_vs_uniforms * sizeof(float[4]));
caps->supported_irs =
(1 << PIPE_SHADER_IR_TGSI) |
(1 << PIPE_SHADER_IR_NIR);
}
static void
etna_init_shader_caps(struct etna_screen *screen)
{
etna_init_single_shader_caps(screen, PIPE_SHADER_VERTEX);
etna_init_single_shader_caps(screen, PIPE_SHADER_FRAGMENT);
}
static void
etna_init_screen_caps(struct etna_screen *screen)
{
@ -1084,6 +1139,7 @@ etna_screen_create(struct etna_device *dev, struct etna_gpu *gpu,
etna_query_screen_init(pscreen);
etna_resource_screen_init(pscreen);
etna_init_shader_caps(screen);
etna_init_screen_caps(screen);
util_dynarray_init(&screen->supported_pm_queries, NULL);