From 38c953e287789d9baba0fa04e7383d183dadfdff Mon Sep 17 00:00:00 2001 From: "Juan A. Suarez Romero" Date: Thu, 25 Nov 2021 12:09:50 +0100 Subject: [PATCH] gallium: add new PIPE_CAP_IMAGE_STORE_FORMATTED This capability is enabled for drivers supporting formatless image writing in shader. Reviewed-by: Ilia Mirkin Signed-off-by: Juan A. Suarez Romero Part-of: --- docs/gallium/screen.rst | 1 + src/gallium/auxiliary/util/u_screen.c | 1 + src/gallium/drivers/crocus/crocus_screen.c | 1 + src/gallium/drivers/freedreno/freedreno_screen.c | 1 + src/gallium/drivers/iris/iris_screen.c | 1 + src/gallium/drivers/llvmpipe/lp_screen.c | 1 + src/gallium/drivers/nouveau/nv30/nv30_screen.c | 1 + src/gallium/drivers/nouveau/nv50/nv50_screen.c | 1 + src/gallium/drivers/nouveau/nvc0/nvc0_screen.c | 1 + src/gallium/drivers/panfrost/pan_screen.c | 3 +++ src/gallium/drivers/r600/r600_pipe.c | 1 + src/gallium/drivers/radeonsi/si_get.c | 1 + src/gallium/drivers/swr/swr_screen.cpp | 1 + src/gallium/drivers/v3d/v3d_screen.c | 3 +++ src/gallium/drivers/vc4/vc4_screen.c | 1 + src/gallium/drivers/virgl/virgl_screen.c | 2 ++ src/gallium/drivers/zink/zink_screen.c | 3 +++ src/gallium/frontends/lavapipe/lvp_device.c | 2 +- src/gallium/include/pipe/p_defines.h | 1 + 19 files changed, 26 insertions(+), 1 deletion(-) diff --git a/docs/gallium/screen.rst b/docs/gallium/screen.rst index 2e73918..178bec4 100644 --- a/docs/gallium/screen.rst +++ b/docs/gallium/screen.rst @@ -557,6 +557,7 @@ The integer capabilities: A driver might rely on the input mapping that was defined with the original GLSL code. * ``PIPE_CAP_IMAGE_LOAD_FORMATTED``: True if a format for image loads does not need to be specified in the shader IR +* ``PIPE_CAP_IMAGE_STORE_FORMATTED``: True if a format for image stores does not need to be specified in the shader IR * ``PIPE_CAP_THROTTLE``: Whether or not gallium frontends should throttle pipe_context execution. 0 = throttling is disabled. * ``PIPE_CAP_DMABUF``: Whether Linux DMABUF handles are supported by diff --git a/src/gallium/auxiliary/util/u_screen.c b/src/gallium/auxiliary/util/u_screen.c index 32b6bea..baaac25 100644 --- a/src/gallium/auxiliary/util/u_screen.c +++ b/src/gallium/auxiliary/util/u_screen.c @@ -361,6 +361,7 @@ u_pipe_screen_get_param_defaults(struct pipe_screen *pscreen, case PIPE_CAP_TGSI_ATOMFADD: case PIPE_CAP_TGSI_SKIP_SHRINK_IO_ARRAYS: case PIPE_CAP_IMAGE_LOAD_FORMATTED: + case PIPE_CAP_IMAGE_STORE_FORMATTED: case PIPE_CAP_PREFER_COMPUTE_FOR_MULTIMEDIA: case PIPE_CAP_FRAGMENT_SHADER_INTERLOCK: case PIPE_CAP_CS_DERIVED_SYSTEM_VALUES_SUPPORTED: diff --git a/src/gallium/drivers/crocus/crocus_screen.c b/src/gallium/drivers/crocus/crocus_screen.c index e766603..468acd2 100644 --- a/src/gallium/drivers/crocus/crocus_screen.c +++ b/src/gallium/drivers/crocus/crocus_screen.c @@ -235,6 +235,7 @@ crocus_get_param(struct pipe_screen *pscreen, enum pipe_cap param) case PIPE_CAP_COMPUTE_SHADER_DERIVATIVES: case PIPE_CAP_DOUBLES: case PIPE_CAP_MEMOBJ: + case PIPE_CAP_IMAGE_STORE_FORMATTED: return devinfo->ver >= 7; case PIPE_CAP_QUERY_BUFFER_OBJECT: case PIPE_CAP_ROBUST_BUFFER_ACCESS_BEHAVIOR: diff --git a/src/gallium/drivers/freedreno/freedreno_screen.c b/src/gallium/drivers/freedreno/freedreno_screen.c index ea0ef8e..3b025cf 100644 --- a/src/gallium/drivers/freedreno/freedreno_screen.c +++ b/src/gallium/drivers/freedreno/freedreno_screen.c @@ -268,6 +268,7 @@ fd_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param) return !fd_screen_get_param(pscreen, PIPE_CAP_TEXTURE_MULTISAMPLE); case PIPE_CAP_TEXTURE_MULTISAMPLE: + case PIPE_CAP_IMAGE_STORE_FORMATTED: return is_a5xx(screen) || is_a6xx(screen); case PIPE_CAP_SURFACE_SAMPLE_COUNT: diff --git a/src/gallium/drivers/iris/iris_screen.c b/src/gallium/drivers/iris/iris_screen.c index 7bd3a08..f5da733 100644 --- a/src/gallium/drivers/iris/iris_screen.c +++ b/src/gallium/drivers/iris/iris_screen.c @@ -258,6 +258,7 @@ iris_get_param(struct pipe_screen *pscreen, enum pipe_cap param) case PIPE_CAP_MEMOBJ: case PIPE_CAP_MIXED_COLOR_DEPTH_BITS: case PIPE_CAP_FENCE_SIGNAL: + case PIPE_CAP_IMAGE_STORE_FORMATTED: return true; case PIPE_CAP_FBFETCH: return BRW_MAX_DRAW_BUFFERS; diff --git a/src/gallium/drivers/llvmpipe/lp_screen.c b/src/gallium/drivers/llvmpipe/lp_screen.c index 22e687b..175b14d 100644 --- a/src/gallium/drivers/llvmpipe/lp_screen.c +++ b/src/gallium/drivers/llvmpipe/lp_screen.c @@ -347,6 +347,7 @@ llvmpipe_get_param(struct pipe_screen *screen, enum pipe_cap param) case PIPE_CAP_TGSI_TG4_COMPONENT_IN_SWIZZLE: case PIPE_CAP_TGSI_FS_FACE_IS_INTEGER_SYSVAL: case PIPE_CAP_RESOURCE_FROM_USER_MEMORY: + case PIPE_CAP_IMAGE_STORE_FORMATTED: return 1; #ifdef PIPE_MEMORY_FD case PIPE_CAP_MEMOBJ: diff --git a/src/gallium/drivers/nouveau/nv30/nv30_screen.c b/src/gallium/drivers/nouveau/nv30/nv30_screen.c index 88df41c..4d6a074 100644 --- a/src/gallium/drivers/nouveau/nv30/nv30_screen.c +++ b/src/gallium/drivers/nouveau/nv30/nv30_screen.c @@ -256,6 +256,7 @@ nv30_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param) case PIPE_CAP_IMAGE_LOAD_FORMATTED: case PIPE_CAP_TGSI_DIV: case PIPE_CAP_TGSI_ATOMINC_WRAP: + case PIPE_CAP_IMAGE_STORE_FORMATTED: return 0; case PIPE_CAP_MAX_GS_INVOCATIONS: diff --git a/src/gallium/drivers/nouveau/nv50/nv50_screen.c b/src/gallium/drivers/nouveau/nv50/nv50_screen.c index d799928..43acd9a 100644 --- a/src/gallium/drivers/nouveau/nv50/nv50_screen.c +++ b/src/gallium/drivers/nouveau/nv50/nv50_screen.c @@ -263,6 +263,7 @@ nv50_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param) case PIPE_CAP_CLEAR_SCISSORED: case PIPE_CAP_FRAMEBUFFER_NO_ATTACHMENT: case PIPE_CAP_COMPUTE: + case PIPE_CAP_IMAGE_STORE_FORMATTED: return 1; case PIPE_CAP_TEXTURE_TRANSFER_MODES: return PIPE_TEXTURE_TRANSFER_BLIT; diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c index 9fab126..b2d02e8 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c @@ -312,6 +312,7 @@ nvc0_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param) case PIPE_CAP_PACKED_STREAM_OUTPUT: case PIPE_CAP_CLEAR_SCISSORED: case PIPE_CAP_GL_CLAMP: + case PIPE_CAP_IMAGE_STORE_FORMATTED: return 1; case PIPE_CAP_TEXTURE_TRANSFER_MODES: return nouveau_screen(pscreen)->vram_domain & NOUVEAU_BO_VRAM ? PIPE_TEXTURE_TRANSFER_BLIT : 0; diff --git a/src/gallium/drivers/panfrost/pan_screen.c b/src/gallium/drivers/panfrost/pan_screen.c index 4a391ad..a607991 100644 --- a/src/gallium/drivers/panfrost/pan_screen.c +++ b/src/gallium/drivers/panfrost/pan_screen.c @@ -322,6 +322,9 @@ panfrost_get_param(struct pipe_screen *screen, enum pipe_cap param) return modes; } + case PIPE_CAP_IMAGE_STORE_FORMATTED: + return 1; + default: return u_pipe_screen_get_param_defaults(screen, param); } diff --git a/src/gallium/drivers/r600/r600_pipe.c b/src/gallium/drivers/r600/r600_pipe.c index 80034eb..8f67d5d 100644 --- a/src/gallium/drivers/r600/r600_pipe.c +++ b/src/gallium/drivers/r600/r600_pipe.c @@ -387,6 +387,7 @@ static int r600_get_param(struct pipe_screen* pscreen, enum pipe_cap param) case PIPE_CAP_TGSI_CLOCK: case PIPE_CAP_TGSI_ARRAY_COMPONENTS: case PIPE_CAP_QUERY_BUFFER_OBJECT: + case PIPE_CAP_IMAGE_STORE_FORMATTED: return family >= CHIP_CEDAR ? 1 : 0; case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS: return family >= CHIP_CEDAR ? 4 : 0; diff --git a/src/gallium/drivers/radeonsi/si_get.c b/src/gallium/drivers/radeonsi/si_get.c index 0ac3ec4..e4a32c3 100644 --- a/src/gallium/drivers/radeonsi/si_get.c +++ b/src/gallium/drivers/radeonsi/si_get.c @@ -161,6 +161,7 @@ static int si_get_param(struct pipe_screen *pscreen, enum pipe_cap param) case PIPE_CAP_PREFER_REAL_BUFFER_IN_CONSTBUF0: case PIPE_CAP_COMPUTE_SHADER_DERIVATIVES: case PIPE_CAP_TGSI_ATOMINC_WRAP: + case PIPE_CAP_IMAGE_STORE_FORMATTED: return 1; case PIPE_CAP_TEXTURE_TRANSFER_MODES: diff --git a/src/gallium/drivers/swr/swr_screen.cpp b/src/gallium/drivers/swr/swr_screen.cpp index c83584b..4c274fd 100644 --- a/src/gallium/drivers/swr/swr_screen.cpp +++ b/src/gallium/drivers/swr/swr_screen.cpp @@ -285,6 +285,7 @@ swr_get_param(struct pipe_screen *screen, enum pipe_cap param) case PIPE_CAP_TGSI_TG4_COMPONENT_IN_SWIZZLE: case PIPE_CAP_QUERY_SO_OVERFLOW: case PIPE_CAP_STREAM_OUTPUT_PAUSE_RESUME: + case PIPE_CAP_IMAGE_STORE_FORMATTED: return 1; case PIPE_CAP_SHAREABLE_SHADERS: diff --git a/src/gallium/drivers/v3d/v3d_screen.c b/src/gallium/drivers/v3d/v3d_screen.c index 69aa824..728c905 100644 --- a/src/gallium/drivers/v3d/v3d_screen.c +++ b/src/gallium/drivers/v3d/v3d_screen.c @@ -282,6 +282,9 @@ v3d_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param) case PIPE_CAP_SUPPORTED_PRIM_MODES_WITH_RESTART: return screen->prim_types; + case PIPE_CAP_IMAGE_STORE_FORMATTED: + return false; + default: return u_pipe_screen_get_param_defaults(pscreen, param); } diff --git a/src/gallium/drivers/vc4/vc4_screen.c b/src/gallium/drivers/vc4/vc4_screen.c index b127b5b..cc1a6c3 100644 --- a/src/gallium/drivers/vc4/vc4_screen.c +++ b/src/gallium/drivers/vc4/vc4_screen.c @@ -202,6 +202,7 @@ vc4_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param) case PIPE_CAP_VERTEX_COLOR_CLAMPED: case PIPE_CAP_TWO_SIDED_COLOR: case PIPE_CAP_TEXRECT: + case PIPE_CAP_IMAGE_STORE_FORMATTED: return 0; case PIPE_CAP_SUPPORTED_PRIM_MODES: diff --git a/src/gallium/drivers/virgl/virgl_screen.c b/src/gallium/drivers/virgl/virgl_screen.c index c24db95..d6a7fa6 100644 --- a/src/gallium/drivers/virgl/virgl_screen.c +++ b/src/gallium/drivers/virgl/virgl_screen.c @@ -351,6 +351,8 @@ virgl_get_param(struct pipe_screen *screen, enum pipe_cap param) return vscreen->caps.caps.v2.capability_bits_v2 & VIRGL_CAP_V2_STRING_MARKER; case PIPE_CAP_SURFACE_SAMPLE_COUNT: return vscreen->caps.caps.v2.capability_bits_v2 & VIRGL_CAP_V2_IMPLICIT_MSAA; + case PIPE_CAP_IMAGE_STORE_FORMATTED: + return 1; default: return u_pipe_screen_get_param_defaults(screen, param); } diff --git a/src/gallium/drivers/zink/zink_screen.c b/src/gallium/drivers/zink/zink_screen.c index 5e728f0..0043175 100644 --- a/src/gallium/drivers/zink/zink_screen.c +++ b/src/gallium/drivers/zink/zink_screen.c @@ -567,6 +567,9 @@ zink_get_param(struct pipe_screen *pscreen, enum pipe_cap param) case PIPE_CAP_IMAGE_LOAD_FORMATTED: return screen->info.feats.features.shaderStorageImageReadWithoutFormat; + case PIPE_CAP_IMAGE_STORE_FORMATTED: + return screen->info.feats.features.shaderStorageImageWriteWithoutFormat; + case PIPE_CAP_MIXED_FRAMEBUFFER_SIZES: return 1; diff --git a/src/gallium/frontends/lavapipe/lvp_device.c b/src/gallium/frontends/lavapipe/lvp_device.c index 4675bc2..7450470 100644 --- a/src/gallium/frontends/lavapipe/lvp_device.c +++ b/src/gallium/frontends/lavapipe/lvp_device.c @@ -437,7 +437,7 @@ VKAPI_ATTR void VKAPI_CALL lvp_GetPhysicalDeviceFeatures( .shaderStorageBufferArrayDynamicIndexing = true, .shaderStorageImageArrayDynamicIndexing = indirect, .shaderStorageImageReadWithoutFormat = (pdevice->pscreen->get_param(pdevice->pscreen, PIPE_CAP_IMAGE_LOAD_FORMATTED) != 0), - .shaderStorageImageWriteWithoutFormat = (min_shader_param(pdevice->pscreen, PIPE_SHADER_CAP_MAX_SHADER_IMAGES) != 0), + .shaderStorageImageWriteWithoutFormat = (pdevice->pscreen->get_param(pdevice->pscreen, PIPE_CAP_IMAGE_STORE_FORMATTED) != 0), .shaderClipDistance = true, .shaderCullDistance = (pdevice->pscreen->get_param(pdevice->pscreen, PIPE_CAP_CULL_DISTANCE) == 1), .shaderFloat64 = (pdevice->pscreen->get_param(pdevice->pscreen, PIPE_CAP_DOUBLES) == 1), diff --git a/src/gallium/include/pipe/p_defines.h b/src/gallium/include/pipe/p_defines.h index 67ea286..644257e 100644 --- a/src/gallium/include/pipe/p_defines.h +++ b/src/gallium/include/pipe/p_defines.h @@ -941,6 +941,7 @@ enum pipe_cap PIPE_CAP_COMPUTE_SHADER_DERIVATIVES, PIPE_CAP_TGSI_SKIP_SHRINK_IO_ARRAYS, PIPE_CAP_IMAGE_LOAD_FORMATTED, + PIPE_CAP_IMAGE_STORE_FORMATTED, PIPE_CAP_THROTTLE, PIPE_CAP_DMABUF, PIPE_CAP_PREFER_COMPUTE_FOR_MULTIMEDIA, -- 2.7.4