From: Tom Stellard <thomas.stell...@amd.com>

This function creates a buffer with an associated radeon_surface that
can be used as a RAT.
---
 src/gallium/drivers/r600/r600_buffer.c   | 69 ++++++++++++++++++++++++++++----
 src/gallium/drivers/r600/r600_pipe.h     |  2 +
 src/gallium/drivers/r600/r600_resource.h |  5 +++
 src/gallium/drivers/r600/r600_texture.c  |  2 +-
 4 files changed, 69 insertions(+), 9 deletions(-)

diff --git a/src/gallium/drivers/r600/r600_buffer.c 
b/src/gallium/drivers/r600/r600_buffer.c
index 0b0ac34..5bc3d72 100644
--- a/src/gallium/drivers/r600/r600_buffer.c
+++ b/src/gallium/drivers/r600/r600_buffer.c
@@ -24,6 +24,7 @@
  *      Jerome Glisse
  *      Corbin Simpson <mostawesomed...@gmail.com>
  */
+#include "r600d.h"
 #include "r600_pipe.h"
 #include "util/u_upload_mgr.h"
 #include "util/u_memory.h"
@@ -239,6 +240,65 @@ bool r600_init_resource(struct r600_screen *rscreen,
        return true;
 }
 
+static int r600_buffer_init(struct r600_resource *rbuffer,
+                       struct r600_screen *rscreen,
+                       const struct pipe_resource *templ,
+                       unsigned alignment)
+
+{
+       rbuffer->b.b = *templ;
+       pipe_reference_init(&rbuffer->b.b.reference, 1);
+       rbuffer->b.b.screen = (struct pipe_screen *)rscreen;
+       rbuffer->b.vtbl = &r600_buffer_vtbl;
+
+       if (!r600_init_resource(rscreen, rbuffer, templ->width0, alignment, 
templ->bind, templ->usage)) {
+               FREE(rbuffer);
+               return -1;
+       }
+       return 0;
+}
+
+/**
+ * Create a buffer that can be used as a RAT and also passed to
+ * evergreen_init_color surface.
+ */
+struct r600_texture *r600_rat_buffer_create(struct pipe_screen *screen,
+                                       const struct pipe_resource *templ)
+{
+       struct r600_screen *rscreen = (struct r600_screen*)screen;
+       struct r600_texture *rtex;
+       int r;
+
+       rtex = CALLOC_STRUCT(r600_texture);
+       if (!rtex)
+               goto fail;
+
+       r = r600_init_surface(rscreen, &rtex->surface, templ,
+                       V_038000_ARRAY_LINEAR_ALIGNED,
+                       templ->flags & R600_RESOURCE_FLAG_TRANSFER,
+                       templ->flags & R600_RESOURCE_FLAG_FLUSHED_DEPTH);
+       if (r)
+               goto fail;
+
+       r = rscreen->ws->surface_best(rscreen->ws, &rtex->surface);
+
+       if (r)
+               goto fail;
+
+       rtex->is_rat = 1;
+
+       r = r600_buffer_init(&rtex->resource, rscreen, templ,
+                       rtex->surface.bo_alignment);
+       if (r)
+               goto fail;
+
+       return rtex;
+
+fail:
+       FREE(rtex);
+       return NULL;
+}
+
 struct pipe_resource *r600_buffer_create(struct pipe_screen *screen,
                                         const struct pipe_resource *templ,
                                         unsigned alignment)
@@ -248,14 +308,7 @@ struct pipe_resource *r600_buffer_create(struct 
pipe_screen *screen,
 
        rbuffer = MALLOC_STRUCT(r600_resource);
 
-       rbuffer->b.b = *templ;
-       pipe_reference_init(&rbuffer->b.b.reference, 1);
-       rbuffer->b.b.screen = screen;
-       rbuffer->b.vtbl = &r600_buffer_vtbl;
+       r600_buffer_init(rbuffer, rscreen, templ, alignment);
 
-       if (!r600_init_resource(rscreen, rbuffer, templ->width0, alignment, 
templ->bind, templ->usage)) {
-               FREE(rbuffer);
-               return NULL;
-       }
        return &rbuffer->b.b;
 }
diff --git a/src/gallium/drivers/r600/r600_pipe.h 
b/src/gallium/drivers/r600/r600_pipe.h
index 1428e9a..80ac5d0 100644
--- a/src/gallium/drivers/r600/r600_pipe.h
+++ b/src/gallium/drivers/r600/r600_pipe.h
@@ -552,6 +552,8 @@ bool r600_init_resource(struct r600_screen *rscreen,
 struct pipe_resource *r600_buffer_create(struct pipe_screen *screen,
                                         const struct pipe_resource *templ,
                                         unsigned alignment);
+struct r600_texture *r600_rat_buffer_create(struct pipe_screen *screen,
+                                       const struct pipe_resource *templ);
 
 /* r600_pipe.c */
 void r600_flush(struct pipe_context *ctx, struct pipe_fence_handle **fence,
diff --git a/src/gallium/drivers/r600/r600_resource.h 
b/src/gallium/drivers/r600/r600_resource.h
index a5a5404..28a72b0 100644
--- a/src/gallium/drivers/r600/r600_resource.h
+++ b/src/gallium/drivers/r600/r600_resource.h
@@ -125,6 +125,11 @@ void r600_texture_get_fmask_info(struct r600_screen 
*rscreen,
 void r600_texture_get_cmask_info(struct r600_screen *rscreen,
                                 struct r600_texture *rtex,
                                 struct r600_cmask_info *out);
+int r600_init_surface(struct r600_screen *rscreen,
+                            struct radeon_surface *surface,
+                            const struct pipe_resource *ptex,
+                            unsigned array_mode,
+                            bool is_transfer, bool is_flushed_depth);
 struct pipe_resource *r600_texture_create(struct pipe_screen *screen,
                                        const struct pipe_resource *templ);
 struct pipe_resource *r600_texture_from_handle(struct pipe_screen *screen,
diff --git a/src/gallium/drivers/r600/r600_texture.c 
b/src/gallium/drivers/r600/r600_texture.c
index 7dc3fa5..58bfa54 100644
--- a/src/gallium/drivers/r600/r600_texture.c
+++ b/src/gallium/drivers/r600/r600_texture.c
@@ -65,7 +65,7 @@ unsigned r600_texture_get_offset(struct r600_texture *rtex,
               layer * rtex->surface.level[level].slice_size;
 }
 
-static int r600_init_surface(struct r600_screen *rscreen,
+int r600_init_surface(struct r600_screen *rscreen,
                             struct radeon_surface *surface,
                             const struct pipe_resource *ptex,
                             unsigned array_mode,
-- 
1.7.11.4

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

Reply via email to