Plumbing for importing memobj backed textures.

Signed-off-by: Andres Rodriguez <andre...@gmail.com>
---
 src/gallium/drivers/radeon/r600_texture.c | 63 ++++++++++++++++++-------------
 1 file changed, 36 insertions(+), 27 deletions(-)

diff --git a/src/gallium/drivers/radeon/r600_texture.c 
b/src/gallium/drivers/radeon/r600_texture.c
index 2deb56a..c633141 100644
--- a/src/gallium/drivers/radeon/r600_texture.c
+++ b/src/gallium/drivers/radeon/r600_texture.c
@@ -340,6 +340,39 @@ static void r600_texture_init_metadata(struct 
r600_common_screen *rscreen,
        }
 }
 
+static void r600_surface_import_metadata(struct r600_common_screen *rscreen,
+                                        struct radeon_surf *surf,
+                                        struct radeon_bo_metadata *metadata,
+                                        enum radeon_surf_mode *array_mode,
+                                        bool *is_scanout)
+{
+       if (rscreen->chip_class >= GFX9) {
+               if (metadata->u.gfx9.swizzle_mode > 0)
+                       *array_mode = RADEON_SURF_MODE_2D;
+               else
+                       *array_mode = RADEON_SURF_MODE_LINEAR_ALIGNED;
+
+               *is_scanout = metadata->u.gfx9.swizzle_mode == 0 ||
+                       metadata->u.gfx9.swizzle_mode % 4 == 2;
+       } else {
+               surf->u.legacy.pipe_config = metadata->u.legacy.pipe_config;
+               surf->u.legacy.bankw = metadata->u.legacy.bankw;
+               surf->u.legacy.bankh = metadata->u.legacy.bankh;
+               surf->u.legacy.tile_split = metadata->u.legacy.tile_split;
+               surf->u.legacy.mtilea = metadata->u.legacy.mtilea;
+               surf->u.legacy.num_banks = metadata->u.legacy.num_banks;
+
+               if (metadata->u.legacy.macrotile == RADEON_LAYOUT_TILED)
+                       *array_mode = RADEON_SURF_MODE_2D;
+               else if (metadata->u.legacy.microtile == RADEON_LAYOUT_TILED)
+                       *array_mode = RADEON_SURF_MODE_1D;
+               else
+                       *array_mode = RADEON_SURF_MODE_LINEAR_ALIGNED;
+
+               *is_scanout = metadata->u.legacy.scanout;
+       }
+}
+
 static void r600_eliminate_fast_color_clear(struct r600_common_context *rctx,
                                            struct r600_texture *rtex)
 {
@@ -1415,7 +1448,7 @@ static struct pipe_resource 
*r600_texture_from_handle(struct pipe_screen *screen
        struct r600_common_screen *rscreen = (struct r600_common_screen*)screen;
        struct pb_buffer *buf = NULL;
        unsigned stride = 0, offset = 0;
-       unsigned array_mode;
+       enum radeon_surf_mode array_mode;
        struct radeon_surf surface;
        int r;
        struct radeon_bo_metadata metadata = {};
@@ -1432,32 +1465,8 @@ static struct pipe_resource 
*r600_texture_from_handle(struct pipe_screen *screen
                return NULL;
 
        rscreen->ws->buffer_get_metadata(buf, &metadata);
-
-       if (rscreen->chip_class >= GFX9) {
-               if (metadata.u.gfx9.swizzle_mode > 0)
-                       array_mode = RADEON_SURF_MODE_2D;
-               else
-                       array_mode = RADEON_SURF_MODE_LINEAR_ALIGNED;
-
-               is_scanout = metadata.u.gfx9.swizzle_mode == 0 ||
-                            metadata.u.gfx9.swizzle_mode % 4 == 2;
-       } else {
-               surface.u.legacy.pipe_config = metadata.u.legacy.pipe_config;
-               surface.u.legacy.bankw = metadata.u.legacy.bankw;
-               surface.u.legacy.bankh = metadata.u.legacy.bankh;
-               surface.u.legacy.tile_split = metadata.u.legacy.tile_split;
-               surface.u.legacy.mtilea = metadata.u.legacy.mtilea;
-               surface.u.legacy.num_banks = metadata.u.legacy.num_banks;
-
-               if (metadata.u.legacy.macrotile == RADEON_LAYOUT_TILED)
-                       array_mode = RADEON_SURF_MODE_2D;
-               else if (metadata.u.legacy.microtile == RADEON_LAYOUT_TILED)
-                       array_mode = RADEON_SURF_MODE_1D;
-               else
-                       array_mode = RADEON_SURF_MODE_LINEAR_ALIGNED;
-
-               is_scanout = metadata.u.legacy.scanout;
-       }
+       r600_surface_import_metadata(rscreen, &surface, &metadata,
+                                    &array_mode, &is_scanout);
 
        r = r600_init_surface(rscreen, &surface, templ, array_mode, stride,
                              offset, true, is_scanout, false, false);
-- 
2.9.3

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

Reply via email to