Mesa (master): freedreno: Add layout_resource_for_modifier screen vfunc

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Feb 5 22:23:35 UTC 2020


Module: Mesa
Branch: master
Commit: d233c8c914ce819147197b9327bc22d1ea58b2fb
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=d233c8c914ce819147197b9327bc22d1ea58b2fb

Author: Kristian H. Kristensen <hoegsberg at google.com>
Date:   Tue Feb  4 17:46:10 2020 -0800

freedreno: Add layout_resource_for_modifier screen vfunc

This function is responsible for completing the layout for an imported
resource with the given modifier.  Returns 0 on success or -1 If the
modifier is unsupported, invalid or the input parameters are not
compatible with the modifier.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3704>

---

 src/gallium/drivers/freedreno/freedreno_resource.c | 48 ++++++++--------------
 src/gallium/drivers/freedreno/freedreno_screen.h   |  1 +
 2 files changed, 17 insertions(+), 32 deletions(-)

diff --git a/src/gallium/drivers/freedreno/freedreno_resource.c b/src/gallium/drivers/freedreno/freedreno_resource.c
index 54bf359a0cc..56f5c478b27 100644
--- a/src/gallium/drivers/freedreno/freedreno_resource.c
+++ b/src/gallium/drivers/freedreno/freedreno_resource.c
@@ -1023,26 +1023,6 @@ fd_resource_create(struct pipe_screen *pscreen,
 	return fd_resource_create_with_modifiers(pscreen, tmpl, &mod, 1);
 }
 
-static bool
-is_supported_modifier(struct pipe_screen *pscreen, enum pipe_format pfmt,
-		uint64_t mod)
-{
-	int count;
-
-	/* Get the count of supported modifiers: */
-	pscreen->query_dmabuf_modifiers(pscreen, pfmt, 0, NULL, NULL, &count);
-
-	/* Get the supported modifiers: */
-	uint64_t modifiers[count];
-	pscreen->query_dmabuf_modifiers(pscreen, pfmt, count, modifiers, NULL, &count);
-
-	for (int i = 0; i < count; i++)
-		if (modifiers[i] == mod)
-			return true;
-
-	return false;
-}
-
 /**
  * Create a texture from a winsys_handle. The handle is often created in
  * another process by first creating a pipe texture and then calling
@@ -1091,20 +1071,11 @@ fd_resource_from_handle(struct pipe_screen *pscreen,
 			(slice->pitch & (pitchalign - 1)))
 		goto fail;
 
-	if (handle->modifier == DRM_FORMAT_MOD_QCOM_COMPRESSED) {
-		if (!is_supported_modifier(pscreen, tmpl->format,
-				DRM_FORMAT_MOD_QCOM_COMPRESSED)) {
-			DBG("bad modifier: %"PRIx64, handle->modifier);
-			goto fail;
-		}
-		/* XXX UBWC setup */
-	} else if (handle->modifier &&
-			(handle->modifier != DRM_FORMAT_MOD_INVALID)) {
-		goto fail;
-	}
-
 	assert(rsc->layout.cpp);
 
+	if (screen->layout_resource_for_modifier(rsc, handle->modifier) < 0)
+		goto fail;
+
 	if (screen->ro) {
 		rsc->scanout =
 			renderonly_create_gpu_import_for_resource(prsc, screen->ro, NULL);
@@ -1210,6 +1181,17 @@ static const uint64_t supported_modifiers[] = {
 	DRM_FORMAT_MOD_LINEAR,
 };
 
+static int
+fd_layout_resource_for_modifier(struct fd_resource *rsc, uint64_t modifier)
+{
+	switch (modifier) {
+	case DRM_FORMAT_MOD_LINEAR:
+		return 0;
+	default:
+		return -1;
+	}
+}
+
 void
 fd_resource_screen_init(struct pipe_screen *pscreen)
 {
@@ -1230,6 +1212,8 @@ fd_resource_screen_init(struct pipe_screen *pscreen)
 
 	if (!screen->setup_slices)
 		screen->setup_slices = fd_setup_slices;
+	if (!screen->layout_resource_for_modifier)
+		screen->layout_resource_for_modifier = fd_layout_resource_for_modifier;
 	if (!screen->supported_modifiers) {
 		screen->supported_modifiers = supported_modifiers;
 		screen->num_supported_modifiers = ARRAY_SIZE(supported_modifiers);
diff --git a/src/gallium/drivers/freedreno/freedreno_screen.h b/src/gallium/drivers/freedreno/freedreno_screen.h
index b5730da0297..534d0a2f859 100644
--- a/src/gallium/drivers/freedreno/freedreno_screen.h
+++ b/src/gallium/drivers/freedreno/freedreno_screen.h
@@ -93,6 +93,7 @@ struct fd_screen {
 
 	uint32_t (*setup_slices)(struct fd_resource *rsc);
 	unsigned (*tile_mode)(const struct pipe_resource *prsc);
+	int (*layout_resource_for_modifier)(struct fd_resource *rsc, uint64_t modifier);
 
 	/* constant emit:  (note currently not used/needed for a2xx) */
 	void (*emit_const)(struct fd_ringbuffer *ring, gl_shader_stage type,



More information about the mesa-commit mailing list