r300_screen_buffer.c revision 93f4e3cb6c1ca303ee1f5c2a2491a8eff33f2633
168e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie/* 268e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie * Copyright 2010 Red Hat Inc. 368e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie * 468e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie * Permission is hereby granted, free of charge, to any person obtaining a 568e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie * copy of this software and associated documentation files (the "Software"), 668e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie * to deal in the Software without restriction, including without limitation 768e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie * on the rights to use, copy, modify, merge, publish, distribute, sub 868e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie * license, and/or sell copies of the Software, and to permit persons to whom 968e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie * the Software is furnished to do so, subject to the following conditions: 1068e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie * 1168e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie * The above copyright notice and this permission notice (including the next 1268e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie * paragraph) shall be included in all copies or substantial portions of the 1368e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie * Software. 1468e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie * 1568e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1668e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1768e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 1868e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, 1968e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 2068e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 2168e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie * USE OR OTHER DEALINGS IN THE SOFTWARE. 2268e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie * 2368e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie * Authors: Dave Airlie 2468e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie */ 250b4df63609e9fb25319debd56142a90b11d75671Marek Olšák 2668e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie#include <stdio.h> 2768e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie 2868e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie#include "util/u_inlines.h" 2968e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie#include "util/u_memory.h" 3068e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie#include "util/u_upload_mgr.h" 3168e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie#include "util/u_math.h" 3268e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie 3368e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie#include "r300_screen_buffer.h" 3468e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie 357e752760d410e72cc766691bee207729f28a920aMarek Olšákvoid r300_upload_index_buffer(struct r300_context *r300, 367e752760d410e72cc766691bee207729f28a920aMarek Olšák struct pipe_resource **index_buffer, 377e752760d410e72cc766691bee207729f28a920aMarek Olšák unsigned index_size, unsigned *start, 38476cec37d615df7c7329ef74d4a7ea7200b2d8fbMarek Olšák unsigned count, uint8_t *ptr) 3968e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie{ 407e752760d410e72cc766691bee207729f28a920aMarek Olšák unsigned index_offset; 4131afa7616e3c11e9874f3297ac66ebdd50a67186Marek Olšák boolean flushed; 427e752760d410e72cc766691bee207729f28a920aMarek Olšák 437e752760d410e72cc766691bee207729f28a920aMarek Olšák *index_buffer = NULL; 447e752760d410e72cc766691bee207729f28a920aMarek Olšák 45b541a3c4c0a125087fa9e1e0d35db019c36fb0e9Marek Olšák u_upload_data(r300->vbuf_mgr->uploader, 4606286110b4fc0ff80ae21bb3d8ff9909db1f5d47Marek Olšák 0, count * index_size, 477e752760d410e72cc766691bee207729f28a920aMarek Olšák ptr + (*start * index_size), 487e752760d410e72cc766691bee207729f28a920aMarek Olšák &index_offset, 4906286110b4fc0ff80ae21bb3d8ff9909db1f5d47Marek Olšák index_buffer, &flushed); 507e752760d410e72cc766691bee207729f28a920aMarek Olšák 517e752760d410e72cc766691bee207729f28a920aMarek Olšák *start = index_offset / index_size; 5268e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie} 5368e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie 54287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstatic void r300_buffer_destroy(struct pipe_screen *screen, 55287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *buf) 5668e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie{ 57287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct r300_screen *r300screen = r300_screen(screen); 5856ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák struct r300_resource *rbuf = r300_resource(buf); 5968e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie 603eb557778376bcbbc6f25da88ffbaa269607254cMarek Olšák if (rbuf->constant_buffer) 613eb557778376bcbbc6f25da88ffbaa269607254cMarek Olšák FREE(rbuf->constant_buffer); 623eb557778376bcbbc6f25da88ffbaa269607254cMarek Olšák 635862b6ed6196572be0462da913d9e45b4d05f240Marek Olšák if (rbuf->buf) 64d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák pb_reference(&rbuf->buf, NULL); 655862b6ed6196572be0462da913d9e45b4d05f240Marek Olšák 6680f24c1575688e9cd4a5a811137f43b7e0a661bbMarek Olšák util_slab_free(&r300screen->pool_buffers, rbuf); 677b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák} 687b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák 697b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšákstatic struct pipe_transfer* 706a46fce14f38adf72925842edf9829c00d1ee800Marek Olšákr300_buffer_get_transfer(struct pipe_context *context, 716a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák struct pipe_resource *resource, 726a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák unsigned level, 736a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák unsigned usage, 746a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák const struct pipe_box *box) 757b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák{ 767b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák struct r300_context *r300 = r300_context(context); 777b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák struct pipe_transfer *transfer = 7880f24c1575688e9cd4a5a811137f43b7e0a661bbMarek Olšák util_slab_alloc(&r300->pool_transfers); 797b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák 807b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák transfer->resource = resource; 814c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger transfer->level = level; 827b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák transfer->usage = usage; 837b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák transfer->box = *box; 847b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák transfer->stride = 0; 854c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger transfer->layer_stride = 0; 867b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák transfer->data = NULL; 877b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák 887b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák /* Note strides are zero, this is ok for buffers, but not for 897b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák * textures 2d & higher at least. 907b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák */ 917b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák return transfer; 927b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák} 937b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák 946a46fce14f38adf72925842edf9829c00d1ee800Marek Olšákstatic void r300_buffer_transfer_destroy(struct pipe_context *pipe, 956a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák struct pipe_transfer *transfer) 967b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák{ 977b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák struct r300_context *r300 = r300_context(pipe); 9880f24c1575688e9cd4a5a811137f43b7e0a661bbMarek Olšák util_slab_free(&r300->pool_transfers, transfer); 9968e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie} 10068e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie 10168e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airliestatic void * 102d3e7dfc1fd7753d6305afb402e432ff45a7c0707Marek Olšákr300_buffer_transfer_map( struct pipe_context *pipe, 103d3e7dfc1fd7753d6305afb402e432ff45a7c0707Marek Olšák struct pipe_transfer *transfer ) 10468e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie{ 105fe3caa91d3f637bf9cf9f9e7adb992aa8c7ef8e4Marek Olšák struct r300_context *r300 = r300_context(pipe); 106d3e7dfc1fd7753d6305afb402e432ff45a7c0707Marek Olšák struct r300_screen *r300screen = r300_screen(pipe->screen); 107d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák struct radeon_winsys *rws = r300screen->rws; 10856ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák struct r300_resource *rbuf = r300_resource(transfer->resource); 109d3e7dfc1fd7753d6305afb402e432ff45a7c0707Marek Olšák uint8_t *map; 11068e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie 111c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák if (rbuf->b.user_ptr) 112c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák return (uint8_t *) rbuf->b.user_ptr + transfer->box.x; 1133eb557778376bcbbc6f25da88ffbaa269607254cMarek Olšák if (rbuf->constant_buffer) 1143eb557778376bcbbc6f25da88ffbaa269607254cMarek Olšák return (uint8_t *) rbuf->constant_buffer + transfer->box.x; 11568e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie 1166ccab620a0e7364ab6c0d902b3ddf58ee988f7faMarek Olšák map = rws->buffer_map(rbuf->buf, r300->cs, transfer->usage); 117d3e7dfc1fd7753d6305afb402e432ff45a7c0707Marek Olšák 118d3e7dfc1fd7753d6305afb402e432ff45a7c0707Marek Olšák if (map == NULL) 119d3e7dfc1fd7753d6305afb402e432ff45a7c0707Marek Olšák return NULL; 120d3e7dfc1fd7753d6305afb402e432ff45a7c0707Marek Olšák 121d3e7dfc1fd7753d6305afb402e432ff45a7c0707Marek Olšák return map + transfer->box.x; 12268e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie} 12368e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie 124d3e7dfc1fd7753d6305afb402e432ff45a7c0707Marek Olšákstatic void r300_buffer_transfer_unmap( struct pipe_context *pipe, 125d3e7dfc1fd7753d6305afb402e432ff45a7c0707Marek Olšák struct pipe_transfer *transfer ) 12668e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie{ 127d3e7dfc1fd7753d6305afb402e432ff45a7c0707Marek Olšák struct r300_screen *r300screen = r300_screen(pipe->screen); 128d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák struct radeon_winsys *rws = r300screen->rws; 12956ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák struct r300_resource *rbuf = r300_resource(transfer->resource); 13068e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie 131287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell if (rbuf->buf) { 1326ccab620a0e7364ab6c0d902b3ddf58ee988f7faMarek Olšák rws->buffer_unmap(rbuf->buf); 133287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell } 134287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell} 13568e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie 1366a46fce14f38adf72925842edf9829c00d1ee800Marek Olšákstatic void r300_buffer_transfer_inline_write(struct pipe_context *pipe, 1376a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák struct pipe_resource *resource, 1386a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák unsigned level, 1396a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák unsigned usage, 1406a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák const struct pipe_box *box, 1416a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák const void *data, 1426a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák unsigned stride, 1436a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák unsigned layer_stride) 1446a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák{ 145b606c8a015a0e304110b48c81b3bf06701f6cae1Marek Olšák struct r300_context *r300 = r300_context(pipe); 146d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák struct radeon_winsys *rws = r300->screen->rws; 14756ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák struct r300_resource *rbuf = r300_resource(resource); 1486a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák uint8_t *map = NULL; 1496a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák 1506a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák if (rbuf->constant_buffer) { 1516a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák memcpy(rbuf->constant_buffer + box->x, data, box->width); 1526a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák return; 1536a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák } 154c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák assert(rbuf->b.user_ptr == NULL); 1556a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák 1566ccab620a0e7364ab6c0d902b3ddf58ee988f7faMarek Olšák map = rws->buffer_map(rbuf->buf, r300->cs, 157b606c8a015a0e304110b48c81b3bf06701f6cae1Marek Olšák PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD | usage); 1586a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák 159b606c8a015a0e304110b48c81b3bf06701f6cae1Marek Olšák memcpy(map + box->x, data, box->width); 1606a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák 1616ccab620a0e7364ab6c0d902b3ddf58ee988f7faMarek Olšák rws->buffer_unmap(rbuf->buf); 1626a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák} 1636a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák 164d17d03a8dccb4bad25211693320459420409d997Henri Verbeetstatic const struct u_resource_vtbl r300_buffer_vtbl = 165287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell{ 16656ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák NULL, /* get_handle */ 1677b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák r300_buffer_destroy, /* resource_destroy */ 1686a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák r300_buffer_get_transfer, /* get_transfer */ 1696a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák r300_buffer_transfer_destroy, /* transfer_destroy */ 1707b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák r300_buffer_transfer_map, /* transfer_map */ 17156ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák NULL, /* transfer_flush_region */ 1727b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák r300_buffer_transfer_unmap, /* transfer_unmap */ 1736a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák r300_buffer_transfer_inline_write /* transfer_inline_write */ 174287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell}; 175287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 176287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstruct pipe_resource *r300_buffer_create(struct pipe_screen *screen, 177bb4f5fff0c782f35353e8bfc1b1227e3cc3d5986Marek Olšák const struct pipe_resource *templ) 17868e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie{ 17968e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie struct r300_screen *r300screen = r300_screen(screen); 18056ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák struct r300_resource *rbuf; 181ee678895e903f3ecbbd95b4584dbfbb127f9d4f0Marek Olšák unsigned alignment = 16; 18268e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie 18380f24c1575688e9cd4a5a811137f43b7e0a661bbMarek Olšák rbuf = util_slab_alloc(&r300screen->pool_buffers); 184287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 185c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák rbuf->b.b.b = *templ; 186c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák rbuf->b.b.vtbl = &r300_buffer_vtbl; 187c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák pipe_reference_init(&rbuf->b.b.b.reference, 1); 188c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák rbuf->b.b.b.screen = screen; 189c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák rbuf->b.user_ptr = NULL; 19093f4e3cb6c1ca303ee1f5c2a2491a8eff33f2633Marek Olšák rbuf->domain = RADEON_DOMAIN_GTT; 1917b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák rbuf->buf = NULL; 1927b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák rbuf->constant_buffer = NULL; 193b6b76cbb20b3d9467011231069e23972b98afa49Marek Olšák 1943eb557778376bcbbc6f25da88ffbaa269607254cMarek Olšák /* Alloc constant buffers in RAM. */ 1953eb557778376bcbbc6f25da88ffbaa269607254cMarek Olšák if (templ->bind & PIPE_BIND_CONSTANT_BUFFER) { 1963eb557778376bcbbc6f25da88ffbaa269607254cMarek Olšák rbuf->constant_buffer = MALLOC(templ->width0); 197c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák return &rbuf->b.b.b; 1983eb557778376bcbbc6f25da88ffbaa269607254cMarek Olšák } 1993eb557778376bcbbc6f25da88ffbaa269607254cMarek Olšák 200ee678895e903f3ecbbd95b4584dbfbb127f9d4f0Marek Olšák rbuf->buf = 201ee678895e903f3ecbbd95b4584dbfbb127f9d4f0Marek Olšák r300screen->rws->buffer_create(r300screen->rws, 202ee678895e903f3ecbbd95b4584dbfbb127f9d4f0Marek Olšák rbuf->b.b.b.width0, alignment, 20393f4e3cb6c1ca303ee1f5c2a2491a8eff33f2633Marek Olšák rbuf->b.b.b.bind, rbuf->domain); 204ee678895e903f3ecbbd95b4584dbfbb127f9d4f0Marek Olšák if (!rbuf->buf) { 20580f24c1575688e9cd4a5a811137f43b7e0a661bbMarek Olšák util_slab_free(&r300screen->pool_buffers, rbuf); 2067b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák return NULL; 2077b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák } 208287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 209ee678895e903f3ecbbd95b4584dbfbb127f9d4f0Marek Olšák rbuf->cs_buf = 210ee678895e903f3ecbbd95b4584dbfbb127f9d4f0Marek Olšák r300screen->rws->buffer_get_cs_handle(rbuf->buf); 211ee678895e903f3ecbbd95b4584dbfbb127f9d4f0Marek Olšák 212c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák return &rbuf->b.b.b; 21368e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie} 21468e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie 215287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstruct pipe_resource *r300_user_buffer_create(struct pipe_screen *screen, 216be1af4394e060677b7db6bbb8e3301e38a3363daMarek Olšák void *ptr, unsigned size, 217287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell unsigned bind) 21868e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie{ 2197b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák struct r300_screen *r300screen = r300_screen(screen); 22056ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák struct r300_resource *rbuf; 221287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 22280f24c1575688e9cd4a5a811137f43b7e0a661bbMarek Olšák rbuf = util_slab_alloc(&r300screen->pool_buffers); 223287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 224c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák pipe_reference_init(&rbuf->b.b.b.reference, 1); 225c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák rbuf->b.b.b.screen = screen; 226c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák rbuf->b.b.b.target = PIPE_BUFFER; 227c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák rbuf->b.b.b.format = PIPE_FORMAT_R8_UNORM; 228c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák rbuf->b.b.b.usage = PIPE_USAGE_IMMUTABLE; 229c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák rbuf->b.b.b.bind = bind; 230c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák rbuf->b.b.b.width0 = ~0; 231c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák rbuf->b.b.b.height0 = 1; 232c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák rbuf->b.b.b.depth0 = 1; 233c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák rbuf->b.b.b.array_size = 1; 234c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák rbuf->b.b.b.flags = 0; 235c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák rbuf->b.b.vtbl = &r300_buffer_vtbl; 236c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák rbuf->b.user_ptr = ptr; 23793f4e3cb6c1ca303ee1f5c2a2491a8eff33f2633Marek Olšák rbuf->domain = RADEON_DOMAIN_GTT; 2387b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák rbuf->buf = NULL; 2397b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák rbuf->constant_buffer = NULL; 240c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák return &rbuf->b.b.b; 24168e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie} 242