Mesa (main): gallium: add new PIPE_CAP_IMAGE_STORE_FORMATTED
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Fri Dec 3 16:10:52 UTC 2021
Module: Mesa
Branch: main
Commit: 38c953e287789d9baba0fa04e7383d183dadfdff
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=38c953e287789d9baba0fa04e7383d183dadfdff
Author: Juan A. Suarez Romero <jasuarez at igalia.com>
Date: Thu Nov 25 12:09:50 2021 +0100
gallium: add new PIPE_CAP_IMAGE_STORE_FORMATTED
This capability is enabled for drivers supporting formatless image
writing in shader.
Reviewed-by: Ilia Mirkin <imirkin at alum.mit.edu>
Signed-off-by: Juan A. Suarez Romero <jasuarez at igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13409>
---
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 2e739184faa..178bec4b1cd 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 32b6bea7148..baaac252556 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 e766603354b..468acd24f1a 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 ea0ef8ea8df..3b025cf1b57 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 7bd3a08f1fc..f5da733457c 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 22e687bb833..175b14d6f39 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 88df41c3204..4d6a0749931 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 d7999285458..43acd9a0692 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 9fab126bf08..b2d02e8447f 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 4a391adc8c4..a607991626a 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 80034ebad81..8f67d5d4f5f 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 0ac3ec45ffd..e4a32c35bb9 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 c83584b53dd..4c274fd86e5 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 69aa82484e7..728c9057871 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 b127b5b85f3..cc1a6c39d3d 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 c24db95b315..d6a7fa6d77a 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 5e728f0133b..0043175bf9d 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 4675bc2119f..745047041d7 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 67ea2867ba0..644257eed2b 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,
More information about the mesa-commit
mailing list