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