From: Marek Olšák <marek.ol...@amd.com>

Instead of failing an assertion, disable DCC and CMASK on the first export
that needs it, and merge the external usage flags.
---
 src/gallium/drivers/radeon/r600_texture.c | 55 ++++++++++++++++++-------------
 1 file changed, 33 insertions(+), 22 deletions(-)

diff --git a/src/gallium/drivers/radeon/r600_texture.c 
b/src/gallium/drivers/radeon/r600_texture.c
index 83fc002..a2c61f3 100644
--- a/src/gallium/drivers/radeon/r600_texture.c
+++ b/src/gallium/drivers/radeon/r600_texture.c
@@ -329,6 +329,7 @@ static boolean r600_texture_get_handle(struct pipe_screen* 
screen,
        struct r600_resource *res = (struct r600_resource*)resource;
        struct r600_texture *rtex = (struct r600_texture*)resource;
        struct radeon_bo_metadata metadata;
+       bool update_metadata = false;
 
        /* This is not supported now, but it might be required for OpenCL
         * interop in the future.
@@ -337,38 +338,48 @@ static boolean r600_texture_get_handle(struct 
pipe_screen* screen,
            (resource->nr_samples > 1 || rtex->is_depth))
                return false;
 
-       if (!res->is_shared) {
-               res->is_shared = true;
-               res->external_usage = usage;
-
-               if (resource->target != PIPE_BUFFER) {
-                       /* Since shader image stores don't support DCC on VI,
-                        * disable it for external clients that want write
-                        * access.
-                        */
-                       if (usage & PIPE_HANDLE_USAGE_WRITE)
-                               r600_texture_disable_dcc(rscreen, rtex);
+       if (resource->target != PIPE_BUFFER) {
+               /* Since shader image stores don't support DCC on VI,
+                * disable it for external clients that want write
+                * access.
+                */
+               if (usage & PIPE_HANDLE_USAGE_WRITE && rtex->dcc_offset) {
+                       r600_texture_disable_dcc(rscreen, rtex);
+                       update_metadata = true;
+               }
 
-                       if (!(usage & PIPE_HANDLE_USAGE_EXPLICIT_FLUSH)) {
-                               /* Eliminate fast clear (both CMASK and DCC) */
-                               r600_eliminate_fast_color_clear(rscreen, rtex);
+               if (!(usage & PIPE_HANDLE_USAGE_EXPLICIT_FLUSH) &&
+                   rtex->cmask.size) {
+                       /* Eliminate fast clear (both CMASK and DCC) */
+                       r600_eliminate_fast_color_clear(rscreen, rtex);
 
-                               /* Disable CMASK if flush_resource isn't going
-                                * to be called.
-                                */
-                               r600_texture_disable_cmask(rscreen, rtex);
-                       }
+                       /* Disable CMASK if flush_resource isn't going
+                        * to be called.
+                        */
+                       r600_texture_disable_cmask(rscreen, rtex);
+                       update_metadata = true;
+               }
 
-                       /* Set metadata. */
+               /* Set metadata. */
+               if (!res->is_shared || update_metadata) {
                        r600_texture_init_metadata(rtex, &metadata);
                        if (rscreen->query_opaque_metadata)
+
                                rscreen->query_opaque_metadata(rscreen, rtex,
                                                               &metadata);
-
                        rscreen->ws->buffer_set_metadata(res->buf, &metadata);
                }
+       }
+
+       if (res->is_shared) {
+               /* If USAGE_EXPLICIT_FLUSH has not been set before,
+                * it should stay that way.
+                */
+               res->external_usage |=
+                       usage & ~PIPE_HANDLE_USAGE_EXPLICIT_FLUSH;
        } else {
-               assert(res->external_usage == usage);
+               res->is_shared = true;
+               res->external_usage = usage;
        }
 
        return rscreen->ws->buffer_get_handle(res->buf,
-- 
2.5.0

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to