From 99605fb3a83fedffcb5b12f9257e8463339cf5e9 Mon Sep 17 00:00:00 2001 From: Qiang Yu Date: Thu, 16 Jan 2025 17:25:17 +0800 Subject: [PATCH] etnaviv: init shader caps MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Acked-by: Alyssa Rosenzweig Acked-by: Marek Olšák Reviewed-by: Christian Gmeiner Part-of: --- src/gallium/drivers/etnaviv/etnaviv_screen.c | 56 ++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/src/gallium/drivers/etnaviv/etnaviv_screen.c b/src/gallium/drivers/etnaviv/etnaviv_screen.c index e2b9d928306..f8943f0222a 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_screen.c +++ b/src/gallium/drivers/etnaviv/etnaviv_screen.c @@ -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);