From e24082cfe090d1e394ff5836e51efd7e2e2b68f8 Mon Sep 17 00:00:00 2001 From: Qiang Yu Date: Wed, 19 Feb 2025 14:39:53 +0800 Subject: [PATCH] mesa: count mesh shader when init limits MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reviewed-by: Marek Olšák Reviewed-by: Yonggang Luo Part-of: --- src/mesa/state_tracker/st_extensions.c | 38 ++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c index 1e70ff79a57..367f8e8a22a 100644 --- a/src/mesa/state_tracker/st_extensions.c +++ b/src/mesa/state_tracker/st_extensions.c @@ -323,12 +323,15 @@ void st_init_limits(struct pipe_screen *screen, } } - c->MaxUserAssignableUniformLocations = MAX2( + c->MaxUserAssignableUniformLocations = MAX3( c->Program[MESA_SHADER_VERTEX].MaxUniformComponents + c->Program[MESA_SHADER_TESS_CTRL].MaxUniformComponents + c->Program[MESA_SHADER_TESS_EVAL].MaxUniformComponents + c->Program[MESA_SHADER_GEOMETRY].MaxUniformComponents + c->Program[MESA_SHADER_FRAGMENT].MaxUniformComponents, + c->Program[MESA_SHADER_TASK].MaxUniformComponents + + c->Program[MESA_SHADER_MESH].MaxUniformComponents + + c->Program[MESA_SHADER_FRAGMENT].MaxUniformComponents, c->Program[MESA_SHADER_COMPUTE].MaxUniformComponents); c->GLSLLowerConstArrays = @@ -364,6 +367,15 @@ void st_init_limits(struct pipe_screen *screen, MAX2(vertex_pipeline_max_combined_texture_image_units, compute_pipeline_max_combined_texture_image_units); + unsigned mesh_pipeline_max_combined_texture_image_units = + c->Program[MESA_SHADER_TASK].MaxTextureImageUnits + + c->Program[MESA_SHADER_MESH].MaxTextureImageUnits + + c->Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits; + + c->MaxCombinedTextureImageUnits = + MAX2(c->MaxCombinedTextureImageUnits, + mesh_pipeline_max_combined_texture_image_units); + /* This depends on program constants. */ c->MaxTextureCoordUnits = _min(c->Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits, @@ -438,14 +450,19 @@ void st_init_limits(struct pipe_screen *screen, c->Program[MESA_SHADER_TESS_EVAL].MaxUniformBlocks + c->Program[MESA_SHADER_GEOMETRY].MaxUniformBlocks + c->Program[MESA_SHADER_FRAGMENT].MaxUniformBlocks + - c->Program[MESA_SHADER_COMPUTE].MaxUniformBlocks; + c->Program[MESA_SHADER_COMPUTE].MaxUniformBlocks + + c->Program[MESA_SHADER_TASK].MaxUniformBlocks + + c->Program[MESA_SHADER_MESH].MaxUniformBlocks; /* Shader program limit */ - c->MaxCombinedUniformBlocks = MAX2( + c->MaxCombinedUniformBlocks = MAX3( c->Program[MESA_SHADER_VERTEX].MaxUniformBlocks + c->Program[MESA_SHADER_TESS_CTRL].MaxUniformBlocks + c->Program[MESA_SHADER_TESS_EVAL].MaxUniformBlocks + c->Program[MESA_SHADER_GEOMETRY].MaxUniformBlocks + c->Program[MESA_SHADER_FRAGMENT].MaxUniformBlocks, + c->Program[MESA_SHADER_TASK].MaxUniformBlocks + + c->Program[MESA_SHADER_MESH].MaxUniformBlocks + + c->Program[MESA_SHADER_FRAGMENT].MaxUniformBlocks, c->Program[MESA_SHADER_COMPUTE].MaxUniformBlocks); assert(c->MaxCombinedUniformBlocks <= MAX_COMBINED_UNIFORM_BUFFERS); } @@ -476,12 +493,15 @@ void st_init_limits(struct pipe_screen *screen, MIN2(screen->caps.max_combined_hw_atomic_counter_buffers, MAX_COMBINED_ATOMIC_BUFFERS); if (!c->MaxCombinedAtomicBuffers) { - c->MaxCombinedAtomicBuffers = MAX2( + c->MaxCombinedAtomicBuffers = MAX3( c->Program[MESA_SHADER_VERTEX].MaxAtomicBuffers + c->Program[MESA_SHADER_TESS_CTRL].MaxAtomicBuffers + c->Program[MESA_SHADER_TESS_EVAL].MaxAtomicBuffers + c->Program[MESA_SHADER_GEOMETRY].MaxAtomicBuffers + c->Program[MESA_SHADER_FRAGMENT].MaxAtomicBuffers, + c->Program[MESA_SHADER_TASK].MaxAtomicBuffers + + c->Program[MESA_SHADER_MESH].MaxAtomicBuffers + + c->Program[MESA_SHADER_FRAGMENT].MaxAtomicBuffers, c->Program[MESA_SHADER_COMPUTE].MaxAtomicBuffers); assert(c->MaxCombinedAtomicBuffers <= MAX_COMBINED_ATOMIC_BUFFERS); } @@ -504,12 +524,15 @@ void st_init_limits(struct pipe_screen *screen, MIN2(screen->caps.max_combined_shader_buffers, MAX_COMBINED_SHADER_STORAGE_BUFFERS); if (!c->MaxCombinedShaderStorageBlocks) { - c->MaxCombinedShaderStorageBlocks = MAX2( + c->MaxCombinedShaderStorageBlocks = MAX3( c->Program[MESA_SHADER_VERTEX].MaxShaderStorageBlocks + c->Program[MESA_SHADER_TESS_CTRL].MaxShaderStorageBlocks + c->Program[MESA_SHADER_TESS_EVAL].MaxShaderStorageBlocks + c->Program[MESA_SHADER_GEOMETRY].MaxShaderStorageBlocks + c->Program[MESA_SHADER_FRAGMENT].MaxShaderStorageBlocks, + c->Program[MESA_SHADER_TASK].MaxShaderStorageBlocks + + c->Program[MESA_SHADER_MESH].MaxShaderStorageBlocks + + c->Program[MESA_SHADER_FRAGMENT].MaxShaderStorageBlocks, c->Program[MESA_SHADER_COMPUTE].MaxShaderStorageBlocks); assert(c->MaxCombinedShaderStorageBlocks < MAX_COMBINED_SHADER_STORAGE_BUFFERS); } @@ -523,12 +546,15 @@ void st_init_limits(struct pipe_screen *screen, extensions->ARB_shader_storage_buffer_object = GL_TRUE; } - c->MaxCombinedImageUniforms = MAX2( + c->MaxCombinedImageUniforms = MAX3( c->Program[MESA_SHADER_VERTEX].MaxImageUniforms + c->Program[MESA_SHADER_TESS_CTRL].MaxImageUniforms + c->Program[MESA_SHADER_TESS_EVAL].MaxImageUniforms + c->Program[MESA_SHADER_GEOMETRY].MaxImageUniforms + c->Program[MESA_SHADER_FRAGMENT].MaxImageUniforms, + c->Program[MESA_SHADER_TASK].MaxImageUniforms + + c->Program[MESA_SHADER_MESH].MaxImageUniforms + + c->Program[MESA_SHADER_FRAGMENT].MaxImageUniforms, c->Program[MESA_SHADER_COMPUTE].MaxImageUniforms); c->MaxCombinedShaderOutputResources += c->MaxCombinedImageUniforms; c->MaxImageUnits = MAX_IMAGE_UNITS;