From 41cde01b0bb28c6d4fd4e1263767f7f79f901b1b Mon Sep 17 00:00:00 2001 From: Qiang Yu Date: Sat, 14 Sep 2024 15:07:15 +0800 Subject: [PATCH] gallium: add PIPE_RESOURCE_PARAM_DISJOINT_PLANES MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit To query if a DRI_IMAGE has separate plane buffer handle. radeonsi's DCC compressed dri image has multiple planes (compressed data and metadata). But they share the same buffer with different offsets, so we only need one buffer handle for them. This attribute is used to distinguish single buffer multi plane image from multi buffer multi plane image. Acked-by: Pierre-Eric Pelloux-Prayer Reviewed-by: Marek Olšák Acked-by: Daniel Stone Part-of: --- src/gallium/drivers/radeonsi/si_texture.c | 6 ++++++ src/gallium/drivers/zink/zink_resource.c | 6 ++++++ src/gallium/frontends/dri/dri2.c | 4 ++++ src/gallium/include/mesa_interface.h | 2 ++ src/gallium/include/pipe/p_defines.h | 2 ++ 5 files changed, 20 insertions(+) diff --git a/src/gallium/drivers/radeonsi/si_texture.c b/src/gallium/drivers/radeonsi/si_texture.c index 6d6a01589f8..dd9f7e56db1 100644 --- a/src/gallium/drivers/radeonsi/si_texture.c +++ b/src/gallium/drivers/radeonsi/si_texture.c @@ -722,6 +722,12 @@ static bool si_resource_get_param(struct pipe_screen *screen, struct pipe_contex return true; case PIPE_RESOURCE_PARAM_LAYER_STRIDE: break; + case PIPE_RESOURCE_PARAM_DISJOINT_PLANES: + if (resource->target == PIPE_BUFFER) + *value = false; + else + *value = tex->num_planes > 1; + return true; } return false; } diff --git a/src/gallium/drivers/zink/zink_resource.c b/src/gallium/drivers/zink/zink_resource.c index e10a1005cd5..ae76e572ebd 100644 --- a/src/gallium/drivers/zink/zink_resource.c +++ b/src/gallium/drivers/zink/zink_resource.c @@ -1927,6 +1927,12 @@ zink_resource_get_param(struct pipe_screen *pscreen, struct pipe_context *pctx, return false; #endif } + case PIPE_RESOURCE_PARAM_DISJOINT_PLANES: + if (pres->target == PIPE_BUFFER) + *value = false; + else + *value = util_format_get_num_planes(pres->format) > 1; + break; } return true; } diff --git a/src/gallium/frontends/dri/dri2.c b/src/gallium/frontends/dri/dri2.c index 082d38b6c21..7881407f569 100644 --- a/src/gallium/frontends/dri/dri2.c +++ b/src/gallium/frontends/dri/dri2.c @@ -1148,6 +1148,9 @@ dri2_query_image_by_resource_param(struct dri_image *image, int attrib, int *val case __DRI_IMAGE_ATTRIB_FD: param = PIPE_RESOURCE_PARAM_HANDLE_TYPE_FD; break; + case __DRI_IMAGE_ATTRIB_DISJOINT_PLANES: + param = PIPE_RESOURCE_PARAM_DISJOINT_PLANES; + break; default: return false; } @@ -1161,6 +1164,7 @@ dri2_query_image_by_resource_param(struct dri_image *image, int attrib, int *val case __DRI_IMAGE_ATTRIB_STRIDE: case __DRI_IMAGE_ATTRIB_OFFSET: case __DRI_IMAGE_ATTRIB_NUM_PLANES: + case __DRI_IMAGE_ATTRIB_DISJOINT_PLANES: if (res_param > INT_MAX) return false; *value = (int)res_param; diff --git a/src/gallium/include/mesa_interface.h b/src/gallium/include/mesa_interface.h index 562e5437a61..4529e4abbcd 100644 --- a/src/gallium/include/mesa_interface.h +++ b/src/gallium/include/mesa_interface.h @@ -588,6 +588,8 @@ enum dri_loader_cap { #define __DRI_IMAGE_ATTRIB_MODIFIER_LOWER 0x200B /* available in versions 14 */ #define __DRI_IMAGE_ATTRIB_MODIFIER_UPPER 0x200C /* available in versions 14 */ #define __DRI_IMAGE_ATTRIB_COMPRESSION_RATE 0x200D /* available in versions 22 */ +/* If DRI IMAGE has separate plane buffers. */ +#define __DRI_IMAGE_ATTRIB_DISJOINT_PLANES 0x200E enum __DRIYUVColorSpace { __DRI_YUV_COLOR_SPACE_UNDEFINED = 0, diff --git a/src/gallium/include/pipe/p_defines.h b/src/gallium/include/pipe/p_defines.h index 3a89bde9dc3..6acd4b3e0a8 100644 --- a/src/gallium/include/pipe/p_defines.h +++ b/src/gallium/include/pipe/p_defines.h @@ -1168,6 +1168,8 @@ enum pipe_resource_param PIPE_RESOURCE_PARAM_HANDLE_TYPE_KMS, PIPE_RESOURCE_PARAM_HANDLE_TYPE_FD, PIPE_RESOURCE_PARAM_LAYER_STRIDE, + /* If texture/image has separate plane buffers. */ + PIPE_RESOURCE_PARAM_DISJOINT_PLANES, }; /**