diff --git a/docs/gallium/screen.rst b/docs/gallium/screen.rst index e358de4c4ce..8ab60463eba 100644 --- a/docs/gallium/screen.rst +++ b/docs/gallium/screen.rst @@ -641,6 +641,7 @@ The integer capabilities: * ``PIPE_CAP_CLAMP_SPARSE_TEXTURE_LOD``: TRUE if shader sparse texture sample instruction support clamp the minimal lod to prevent read from un-committed pages. * ``PIPE_CAP_ALLOW_DRAW_OUT_OF_ORDER``: TRUE if the driver allows the "draw out of order" optimization to be enabled. See _mesa_update_allow_draw_out_of_order for more details. * ``PIPE_CAP_MAX_CONSTANT_BUFFER_SIZE_UINT``: Maximum bound constant buffer size in bytes. This is unsigned integer with the maximum of 4GB - 1. This applies to all constant buffers used by UBOs, unlike `PIPE_SHADER_CAP_MAX_CONST_BUFFER0_SIZE`, which is specifically for GLSL uniforms. +* ``PIPE_CAP_HARDWARE_GL_SELECT``: Enable hardware accelerated GL_SELECT for this driver. .. _pipe_capf: diff --git a/src/gallium/auxiliary/util/u_screen.c b/src/gallium/auxiliary/util/u_screen.c index 0379bca0347..e80d8915f68 100644 --- a/src/gallium/auxiliary/util/u_screen.c +++ b/src/gallium/auxiliary/util/u_screen.c @@ -23,6 +23,7 @@ #include "pipe/p_screen.h" #include "util/u_screen.h" +#include "util/u_debug.h" /** * Helper to use from a pipe_screen->get_param() implementation to return @@ -497,6 +498,22 @@ u_pipe_screen_get_param_defaults(struct pipe_screen *pscreen, return pscreen->get_shader_param(pscreen, PIPE_SHADER_FRAGMENT, PIPE_SHADER_CAP_MAX_CONST_BUFFER0_SIZE); + case PIPE_CAP_HARDWARE_GL_SELECT: { + /* =0: on CPU, always disabled + * >0: on GPU, enable by default, user can disable it manually + * <0: unknown, disable by default, user can enable it manually + */ + int accel = pscreen->get_param(pscreen, PIPE_CAP_ACCELERATED); + + return !!accel && debug_get_bool_option("MESA_HW_ACCEL_SELECT", accel > 0) && + /* internal geometry shader need indirect array access */ + pscreen->get_shader_param(pscreen, PIPE_SHADER_GEOMETRY, + PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR) && + /* internal geometry shader need SSBO support */ + pscreen->get_shader_param(pscreen, PIPE_SHADER_GEOMETRY, + PIPE_SHADER_CAP_MAX_SHADER_BUFFERS); + } + default: unreachable("bad PIPE_CAP_*"); } diff --git a/src/gallium/drivers/crocus/crocus_screen.c b/src/gallium/drivers/crocus/crocus_screen.c index 40673ebe17e..64e9095b80a 100644 --- a/src/gallium/drivers/crocus/crocus_screen.c +++ b/src/gallium/drivers/crocus/crocus_screen.c @@ -392,6 +392,9 @@ crocus_get_param(struct pipe_screen *pscreen, enum pipe_cap param) case PIPE_CAP_PCI_FUNCTION: return 0; + case PIPE_CAP_HARDWARE_GL_SELECT: + return 0; + default: return u_pipe_screen_get_param_defaults(pscreen, param); } diff --git a/src/gallium/drivers/nouveau/nv50/nv50_screen.c b/src/gallium/drivers/nouveau/nv50/nv50_screen.c index 647aa5b63b5..e54f0919390 100644 --- a/src/gallium/drivers/nouveau/nv50/nv50_screen.c +++ b/src/gallium/drivers/nouveau/nv50/nv50_screen.c @@ -416,6 +416,7 @@ nv50_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param) case PIPE_CAP_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS: case PIPE_CAP_QUERY_SPARSE_TEXTURE_RESIDENCY: case PIPE_CAP_CLAMP_SPARSE_TEXTURE_LOD: + case PIPE_CAP_HARDWARE_GL_SELECT: return 0; case PIPE_CAP_VENDOR_ID: diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c index e3a1e551afb..a04969809c4 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c @@ -437,6 +437,7 @@ nvc0_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param) case PIPE_CAP_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS: case PIPE_CAP_QUERY_SPARSE_TEXTURE_RESIDENCY: case PIPE_CAP_CLAMP_SPARSE_TEXTURE_LOD: + case PIPE_CAP_HARDWARE_GL_SELECT: return 0; case PIPE_CAP_VENDOR_ID: diff --git a/src/gallium/include/pipe/p_defines.h b/src/gallium/include/pipe/p_defines.h index f3a3b9fd636..50c89824d8d 100644 --- a/src/gallium/include/pipe/p_defines.h +++ b/src/gallium/include/pipe/p_defines.h @@ -1009,6 +1009,7 @@ enum pipe_cap PIPE_CAP_CLAMP_SPARSE_TEXTURE_LOD, PIPE_CAP_ALLOW_DRAW_OUT_OF_ORDER, PIPE_CAP_MAX_CONSTANT_BUFFER_SIZE_UINT, + PIPE_CAP_HARDWARE_GL_SELECT, PIPE_CAP_LAST, /* XXX do not add caps after PIPE_CAP_LAST! */ diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c index 027ca948788..79051ba7ec3 100644 --- a/src/mesa/state_tracker/st_extensions.c +++ b/src/mesa/state_tracker/st_extensions.c @@ -627,17 +627,8 @@ void st_init_limits(struct pipe_screen *screen, c->SparseTextureFullArrayCubeMipmaps = screen->get_param(screen, PIPE_CAP_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS); - /* =0: on CPU, always disabled - * >0: on GPU, enable by default, user can disable it manually - * <0: unknown, disable by default, user can enable it manually - */ - int accel = screen->get_param(screen, PIPE_CAP_ACCELERATED); c->HardwareAcceleratedSelect = - accel && debug_get_bool_option("MESA_HW_ACCEL_SELECT", accel > 0) && - /* internal geometry shader need indirect array access */ - !c->ShaderCompilerOptions[MESA_SHADER_GEOMETRY].EmitNoIndirectTemp && - /* internal geometry shader need SSBO support */ - c->Program[MESA_SHADER_GEOMETRY].MaxShaderStorageBlocks; + screen->get_param(screen, PIPE_CAP_HARDWARE_GL_SELECT); }