r600_buffer.c revision b8fb1d75ce95fe5d404b301ab31ca0c323967d14
172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse/*
272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * Copyright 2010 Jerome Glisse <glisse@freedesktop.org>
372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse *
472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * Permission is hereby granted, free of charge, to any person obtaining a
572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * copy of this software and associated documentation files (the "Software"),
672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * to deal in the Software without restriction, including without limitation
772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * on the rights to use, copy, modify, merge, publish, distribute, sub
872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * license, and/or sell copies of the Software, and to permit persons to whom
972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * the Software is furnished to do so, subject to the following conditions:
1072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse *
1172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * The above copyright notice and this permission notice (including the next
1272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * paragraph) shall be included in all copies or substantial portions of the
1372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * Software.
1472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse *
1572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
1872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
1972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
2072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
2172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * USE OR OTHER DEALINGS IN THE SOFTWARE.
2272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse *
2372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * Authors:
2472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse *      Jerome Glisse
2572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse *      Corbin Simpson <MostAwesomeDude@gmail.com>
2672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse */
2772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse#include <pipe/p_screen.h>
2872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse#include <util/u_format.h>
2972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse#include <util/u_math.h>
3072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse#include <util/u_inlines.h>
3172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse#include <util/u_memory.h>
32b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák#include "state_tracker/drm_api.h"
3372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse#include "r600_screen.h"
3472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse#include "r600_context.h"
3572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
36b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšákextern struct u_resource_vtbl r600_buffer_vtbl;
37b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák
3872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glissestatic u32 r600_domain_from_usage(unsigned usage)
3972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
4072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	u32 domain = RADEON_GEM_DOMAIN_GTT;
4172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
42b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	if (usage & PIPE_BIND_RENDER_TARGET) {
43b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	    domain |= RADEON_GEM_DOMAIN_VRAM;
44b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	}
45b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	if (usage & PIPE_BIND_DEPTH_STENCIL) {
46b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	    domain |= RADEON_GEM_DOMAIN_VRAM;
4772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
48b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	if (usage & PIPE_BIND_SAMPLER_VIEW) {
49b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	    domain |= RADEON_GEM_DOMAIN_VRAM;
5072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
51b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	/* also need BIND_BLIT_SOURCE/DESTINATION ? */
52b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	if (usage & PIPE_BIND_VERTEX_BUFFER) {
53b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	    domain |= RADEON_GEM_DOMAIN_GTT;
5472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
55b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	if (usage & PIPE_BIND_INDEX_BUFFER) {
56b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	    domain |= RADEON_GEM_DOMAIN_GTT;
5772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
58b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák
5972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	return domain;
6072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
6172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
62b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšákstruct pipe_resource *r600_buffer_create(struct pipe_screen *screen,
63b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák					 const struct pipe_resource *templ)
6472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
6572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	struct r600_screen *rscreen = r600_screen(screen);
66b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	struct r600_buffer *rbuffer;
6772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	struct radeon_bo *bo;
6872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	struct pb_desc desc;
69b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	/* XXX We probably want a different alignment for buffers and textures. */
70b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	unsigned alignment = 4096;
7172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
72b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	rbuffer = CALLOC_STRUCT(r600_buffer);
7372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	if (rbuffer == NULL)
7472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		return NULL;
7572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
76b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	pipe_reference_init(&rbuffer->b.b.reference, 1);
77b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	rbuffer->b.b = *templ;
78b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	rbuffer->b.b.screen = screen;
79b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	rbuffer->b.vtbl = &r600_buffer_vtbl;
8072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
81b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	if (rbuffer->b.b.bind & PIPE_BIND_CONSTANT_BUFFER) {
8272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		desc.alignment = alignment;
83b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák		desc.usage = rbuffer->b.b.bind;
84b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák		rbuffer->pb = pb_malloc_buffer_create(rbuffer->b.b.width0,
85b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák						      &desc);
8672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		if (rbuffer->pb == NULL) {
8772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse			free(rbuffer);
8872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse			return NULL;
8972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		}
90b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák		return &rbuffer->b.b;
9172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
92b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	rbuffer->domain = r600_domain_from_usage(rbuffer->b.b.bind);
93b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	bo = radeon_bo(rscreen->rw, 0, rbuffer->b.b.width0, alignment, NULL);
9472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	if (bo == NULL) {
9572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		FREE(rbuffer);
9672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		return NULL;
9772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
9872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	rbuffer->bo = bo;
99b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	return &rbuffer->b.b;
10072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
10172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
102b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšákstruct pipe_resource *r600_user_buffer_create(struct pipe_screen *screen,
103b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák					      void *ptr, unsigned bytes,
104b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák					      unsigned bind)
10572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
106b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	struct r600_buffer *rbuffer;
10772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	struct r600_screen *rscreen = r600_screen(screen);
108b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	struct pipe_resource templ;
109b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák
110b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	memset(&templ, 0, sizeof(struct pipe_resource));
111b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	templ.target = PIPE_BUFFER;
112b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	templ.format = PIPE_FORMAT_R8_UNORM;
113b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	templ.usage = PIPE_USAGE_IMMUTABLE;
114b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	templ.bind = bind;
115b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	templ.width0 = bytes;
116b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	templ.height0 = 1;
117b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	templ.depth0 = 1;
118b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák
119b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	rbuffer = (struct r600_buffer*)r600_buffer_create(screen, &templ);
12072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	if (rbuffer == NULL) {
12172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		return NULL;
12272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
12372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	radeon_bo_map(rscreen->rw, rbuffer->bo);
12472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	memcpy(rbuffer->bo->data, ptr, bytes);
12572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	radeon_bo_unmap(rscreen->rw, rbuffer->bo);
126b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	return &rbuffer->b.b;
12772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
12872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
129b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšákstatic void r600_buffer_destroy(struct pipe_screen *screen,
130b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák				struct pipe_resource *buf)
13172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
132b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	struct r600_buffer *rbuffer = (struct r600_buffer*)buf;
133b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	struct r600_screen *rscreen = r600_screen(screen);
13472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
13572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	if (rbuffer->pb) {
13672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		pipe_reference_init(&rbuffer->pb->base.reference, 0);
13772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		pb_destroy(rbuffer->pb);
13872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		rbuffer->pb = NULL;
13972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
14072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	if (rbuffer->bo) {
14172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		radeon_bo_decref(rscreen->rw, rbuffer->bo);
14272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
14372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	FREE(rbuffer);
14472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
14572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
146b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšákstatic void *r600_buffer_transfer_map(struct pipe_context *pipe,
147b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák				      struct pipe_transfer *transfer)
14872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
149b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	struct r600_buffer *rbuffer = (struct r600_buffer*)transfer->resource;
150b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	struct r600_screen *rscreen = r600_screen(pipe->screen);
15172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	int write = 0;
15272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
15372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	if (rbuffer->pb) {
154b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák		return pb_map(rbuffer->pb, transfer->usage) + transfer->box.x;
15572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
156b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	if (transfer->usage & PIPE_TRANSFER_DONTBLOCK) {
15772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		/* FIXME */
15872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
159b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	if (transfer->usage & PIPE_TRANSFER_WRITE) {
16072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		write = 1;
16172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
16272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	if (radeon_bo_map(rscreen->rw, rbuffer->bo)) {
16372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		return NULL;
16472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
165b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	return rbuffer->bo->data + transfer->box.x;
16672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
16772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
168b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšákstatic void r600_buffer_transfer_unmap(struct pipe_context *pipe,
169b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák				       struct pipe_transfer *transfer)
17072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
171b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	struct r600_buffer *rbuffer = (struct r600_buffer*)transfer->resource;
172b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	struct r600_screen *rscreen = r600_screen(pipe->screen);
17372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
17472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	if (rbuffer->pb) {
17572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		pb_unmap(rbuffer->pb);
17672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	} else {
17772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		radeon_bo_unmap(rscreen->rw, rbuffer->bo);
17872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
17972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
18072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
181b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšákstatic void r600_buffer_transfer_flush_region(struct pipe_context *pipe,
182b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák					      struct pipe_transfer *transfer,
183b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák					      const struct pipe_box *box)
18472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
18572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
18672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
187b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšákunsigned r600_buffer_is_referenced_by_cs(struct pipe_context *context,
188b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák					 struct pipe_resource *buf,
189b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák					 unsigned face, unsigned level)
19072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
191b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	/* XXX */
192b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	return PIPE_REFERENCED_FOR_READ | PIPE_REFERENCED_FOR_WRITE;
193b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák}
194b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák
195b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšákstruct pipe_resource *r600_buffer_from_handle(struct pipe_screen *screen,
196b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák					      struct winsys_handle *whandle)
197b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák{
198b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	struct radeon *rw = (struct radeon*)screen->winsys;
199b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	struct r600_buffer *rbuffer;
200b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	struct radeon_bo *bo = NULL;
201b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák
202b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	bo = radeon_bo(rw, whandle->handle, 0, 0, NULL);
203b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	if (bo == NULL) {
204b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák		return NULL;
205b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	}
206b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák
207b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	rbuffer = CALLOC_STRUCT(r600_buffer);
208b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	if (rbuffer == NULL) {
209b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák		radeon_bo_decref(rw, bo);
210b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák		return NULL;
211b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	}
212b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák
213b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	pipe_reference_init(&rbuffer->b.b.reference, 1);
214b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	rbuffer->b.b.target = PIPE_BUFFER;
215b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	rbuffer->b.b.screen = screen;
216b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	rbuffer->b.vtbl = &r600_buffer_vtbl;
217b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	rbuffer->bo = bo;
218b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	return &rbuffer->b.b;
21972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
220b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák
221b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšákstruct u_resource_vtbl r600_buffer_vtbl =
222b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák{
223b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	u_default_resource_get_handle,		/* get_handle */
224b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	r600_buffer_destroy,			/* resource_destroy */
225b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	r600_buffer_is_referenced_by_cs,	/* is_buffer_referenced */
226b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	u_default_get_transfer,			/* get_transfer */
227b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	u_default_transfer_destroy,		/* transfer_destroy */
228b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	r600_buffer_transfer_map,		/* transfer_map */
229b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	r600_buffer_transfer_flush_region,	/* transfer_flush_region */
230b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	r600_buffer_transfer_unmap,		/* transfer_unmap */
231b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák	u_default_transfer_inline_write		/* transfer_inline_write */
232b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák};
233