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

---
 src/gallium/drivers/radeon/r600_texture.c | 47 +++++++++++++++----------------
 1 file changed, 23 insertions(+), 24 deletions(-)

diff --git a/src/gallium/drivers/radeon/r600_texture.c 
b/src/gallium/drivers/radeon/r600_texture.c
index c811d6a..e21dc37 100644
--- a/src/gallium/drivers/radeon/r600_texture.c
+++ b/src/gallium/drivers/radeon/r600_texture.c
@@ -530,28 +530,27 @@ static boolean r600_texture_get_handle(struct 
pipe_screen* screen,
        struct r600_common_context *rctx;
        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;
        unsigned stride, offset, slice_size;
 
        ctx = threaded_context_unwrap_sync(ctx);
        rctx = (struct r600_common_context*)(ctx ? ctx : rscreen->aux_context);
 
-       /* This is not supported now, but it might be required for OpenCL
-        * interop in the future.
-        */
-       if (resource->target != PIPE_BUFFER &&
-           (resource->nr_samples > 1 || rtex->is_depth))
-               return false;
-
        if (resource->target != PIPE_BUFFER) {
+               /* This is not supported now, but it might be required for 
OpenCL
+                * interop in the future.
+                */
+               if (resource->nr_samples > 1 || rtex->is_depth)
+                       return false;
+
                /* 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) {
                        if (r600_texture_disable_dcc(rctx, rtex))
                                update_metadata = true;
                }
 
                if (!(usage & PIPE_HANDLE_USAGE_EXPLICIT_FLUSH) &&
@@ -568,51 +567,51 @@ static boolean r600_texture_get_handle(struct 
pipe_screen* screen,
 
                /* Set metadata. */
                if (!res->b.is_shared || update_metadata) {
                        r600_texture_init_metadata(rscreen, rtex, &metadata);
                        if (rscreen->query_opaque_metadata)
                                rscreen->query_opaque_metadata(rscreen, rtex,
                                                               &metadata);
 
                        rscreen->ws->buffer_set_metadata(res->buf, &metadata);
                }
+
+               if (rscreen->chip_class >= GFX9) {
+                       offset = rtex->surface.u.gfx9.surf_offset;
+                       stride = rtex->surface.u.gfx9.surf_pitch *
+                                rtex->surface.bpe;
+                       slice_size = rtex->surface.u.gfx9.surf_slice_size;
+               } else {
+                       offset = rtex->surface.u.legacy.level[0].offset;
+                       stride = rtex->surface.u.legacy.level[0].nblk_x *
+                                rtex->surface.bpe;
+                       slice_size = rtex->surface.u.legacy.level[0].slice_size;
+               }
+       } else {
+               /* Buffers */
+               offset = 0;
+               stride = 0;
+               slice_size = 0;
        }
 
        if (res->b.is_shared) {
                /* USAGE_EXPLICIT_FLUSH must be cleared if at least one user
                 * doesn't set it.
                 */
                res->external_usage |= usage & 
~PIPE_HANDLE_USAGE_EXPLICIT_FLUSH;
                if (!(usage & PIPE_HANDLE_USAGE_EXPLICIT_FLUSH))
                        res->external_usage &= 
~PIPE_HANDLE_USAGE_EXPLICIT_FLUSH;
        } else {
                res->b.is_shared = true;
                res->external_usage = usage;
        }
 
-       if (res->b.b.target == PIPE_BUFFER) {
-               offset = 0;
-               stride = 0;
-               slice_size = 0;
-       } else {
-               if (rscreen->chip_class >= GFX9) {
-                       offset = rtex->surface.u.gfx9.surf_offset;
-                       stride = rtex->surface.u.gfx9.surf_pitch *
-                                rtex->surface.bpe;
-                       slice_size = rtex->surface.u.gfx9.surf_slice_size;
-               } else {
-                       offset = rtex->surface.u.legacy.level[0].offset;
-                       stride = rtex->surface.u.legacy.level[0].nblk_x *
-                                rtex->surface.bpe;
-                       slice_size = rtex->surface.u.legacy.level[0].slice_size;
-               }
-       }
        return rscreen->ws->buffer_get_handle(res->buf, stride, offset,
                                              slice_size, whandle);
 }
 
 static void r600_texture_destroy(struct pipe_screen *screen,
                                 struct pipe_resource *ptex)
 {
        struct r600_texture *rtex = (struct r600_texture*)ptex;
        struct r600_resource *resource = &rtex->resource;
 
-- 
2.7.4

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

Reply via email to