From 00c46fec4328c9e759cb75a45c7aa993b643bc66 Mon Sep 17 00:00:00 2001 From: Ilia Mirkin Date: Sat, 1 May 2021 17:08:14 -0400 Subject: [PATCH] st/mesa: avoid enabling image/buffer/compute extensions for weak hardware The requirements for ES 3.1 are lower than the requirements for desktop GL. The thread block size can be smaller, and images/buffers/atomics need not be supported in the fragment stage. Allow a driver to expose ES 3.1 without flipping on the desktop GL extensions. Signed-off-by: Ilia Mirkin Reviewed-by: Eric Anholt Part-of: --- src/mesa/state_tracker/st_extensions.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c index 462861fb8bf..73cbb297c45 100644 --- a/src/mesa/state_tracker/st_extensions.c +++ b/src/mesa/state_tracker/st_extensions.c @@ -540,7 +540,7 @@ void st_init_limits(struct pipe_screen *screen, if (!c->MaxCombinedAtomicCounters) c->MaxCombinedAtomicCounters = MAX_ATOMIC_COUNTERS; - if (c->MaxCombinedAtomicBuffers > 0) { + if (c->Program[MESA_SHADER_FRAGMENT].MaxAtomicBuffers) { extensions->ARB_shader_atomic_counters = GL_TRUE; extensions->ARB_shader_atomic_counter_ops = GL_TRUE; } @@ -568,7 +568,8 @@ void st_init_limits(struct pipe_screen *screen, c->MaxCombinedShaderStorageBlocks; c->MaxShaderStorageBlockSize = screen->get_param(screen, PIPE_CAP_MAX_SHADER_BUFFER_SIZE); - extensions->ARB_shader_storage_buffer_object = GL_TRUE; + if (c->Program[MESA_SHADER_FRAGMENT].MaxShaderStorageBlocks) + extensions->ARB_shader_storage_buffer_object = GL_TRUE; } c->MaxCombinedImageUniforms = @@ -580,7 +581,7 @@ void st_init_limits(struct pipe_screen *screen, c->Program[MESA_SHADER_COMPUTE].MaxImageUniforms; c->MaxCombinedShaderOutputResources += c->MaxCombinedImageUniforms; c->MaxImageUnits = MAX_IMAGE_UNITS; - if (c->MaxCombinedImageUniforms) { + if (c->Program[MESA_SHADER_FRAGMENT].MaxImageUniforms) { extensions->ARB_shader_image_load_store = GL_TRUE; extensions->ARB_shader_image_size = GL_TRUE; } @@ -1651,8 +1652,9 @@ void st_init_extensions(struct pipe_screen *screen, } extensions->ARB_compute_shader = - extensions->ARB_shader_image_load_store && - extensions->ARB_shader_atomic_counters; + max_threads_per_block >= 1024 && + extensions->ARB_shader_image_load_store && + extensions->ARB_shader_atomic_counters; if (extensions->ARB_compute_shader) { uint64_t max_variable_threads_per_block = 0;