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