radeonsi/gfx9: pass correct parameters to buffer_get_handle
authorMarek Olšák <marek.olsak@amd.com>
Thu, 27 Oct 2016 18:25:37 +0000 (20:25 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Thu, 30 Mar 2017 12:44:33 +0000 (14:44 +0200)
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/gallium/drivers/radeon/r600_texture.c

index ebd2c5c44776dfea7f68631a34b6c86274680127..129b3f422b7abcd31385d83a3d079b1b67a88a09 100644 (file)
@@ -500,6 +500,7 @@ static boolean r600_texture_get_handle(struct pipe_screen* screen,
        struct r600_texture *rtex = (struct r600_texture*)resource;
        struct radeon_bo_metadata metadata;
        bool update_metadata = false;
+       unsigned stride, offset, slice_size;
 
        /* This is not supported now, but it might be required for OpenCL
         * interop in the future.
@@ -553,12 +554,19 @@ static boolean r600_texture_get_handle(struct pipe_screen* screen,
                res->external_usage = usage;
        }
 
-       return rscreen->ws->buffer_get_handle(res->buf,
-                                             rtex->surface.u.legacy.level[0].nblk_x *
-                                             rtex->surface.bpe,
-                                             rtex->surface.u.legacy.level[0].offset,
-                                             rtex->surface.u.legacy.level[0].slice_size,
-                                             whandle);
+       if (rscreen->chip_class >= GFX9) {
+               offset = 0;
+               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,