r300_screen_buffer.c revision 476cec37d615df7c7329ef74d4a7ea7200b2d8fb
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#include "r300_winsys.h" 3568e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie 3624ceef7a6969ccb2243e7bb32f86d6429d9689b9Marek Olšákunsigned r300_buffer_is_referenced(struct pipe_context *context, 376ccab620a0e7364ab6c0d902b3ddf58ee988f7faMarek Olšák struct pipe_resource *buf) 3868e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie{ 39287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct r300_context *r300 = r300_context(context); 4056ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák struct r300_resource *rbuf = r300_resource(buf); 41287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 4256ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák if (rbuf->b.user_ptr || rbuf->constant_buffer) 43287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell return PIPE_UNREFERENCED; 44287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 456ccab620a0e7364ab6c0d902b3ddf58ee988f7faMarek Olšák if (r300->rws->cs_is_buffer_referenced(r300->cs, rbuf->cs_buf)) 46287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell return PIPE_REFERENCED_FOR_READ | PIPE_REFERENCED_FOR_WRITE; 4768e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie 48287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell return PIPE_UNREFERENCED; 4968e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie} 50287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 517e752760d410e72cc766691bee207729f28a920aMarek Olšákvoid r300_upload_index_buffer(struct r300_context *r300, 527e752760d410e72cc766691bee207729f28a920aMarek Olšák struct pipe_resource **index_buffer, 537e752760d410e72cc766691bee207729f28a920aMarek Olšák unsigned index_size, unsigned *start, 54476cec37d615df7c7329ef74d4a7ea7200b2d8fbMarek Olšák unsigned count, uint8_t *ptr) 5568e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie{ 567e752760d410e72cc766691bee207729f28a920aMarek Olšák unsigned index_offset; 5731afa7616e3c11e9874f3297ac66ebdd50a67186Marek Olšák boolean flushed; 587e752760d410e72cc766691bee207729f28a920aMarek Olšák 597e752760d410e72cc766691bee207729f28a920aMarek Olšák *index_buffer = NULL; 607e752760d410e72cc766691bee207729f28a920aMarek Olšák 61b541a3c4c0a125087fa9e1e0d35db019c36fb0e9Marek Olšák u_upload_data(r300->vbuf_mgr->uploader, 6206286110b4fc0ff80ae21bb3d8ff9909db1f5d47Marek Olšák 0, count * index_size, 637e752760d410e72cc766691bee207729f28a920aMarek Olšák ptr + (*start * index_size), 647e752760d410e72cc766691bee207729f28a920aMarek Olšák &index_offset, 6506286110b4fc0ff80ae21bb3d8ff9909db1f5d47Marek Olšák index_buffer, &flushed); 667e752760d410e72cc766691bee207729f28a920aMarek Olšák 677e752760d410e72cc766691bee207729f28a920aMarek Olšák *start = index_offset / index_size; 6831afa7616e3c11e9874f3297ac66ebdd50a67186Marek Olšák 6931afa7616e3c11e9874f3297ac66ebdd50a67186Marek Olšák if (flushed || !r300->upload_ib_validated) { 7031afa7616e3c11e9874f3297ac66ebdd50a67186Marek Olšák r300->upload_ib_validated = FALSE; 7131afa7616e3c11e9874f3297ac66ebdd50a67186Marek Olšák r300->validate_buffers = TRUE; 7231afa7616e3c11e9874f3297ac66ebdd50a67186Marek Olšák } 7368e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie} 7468e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie 75287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstatic void r300_buffer_destroy(struct pipe_screen *screen, 76287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *buf) 7768e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie{ 78287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct r300_screen *r300screen = r300_screen(screen); 7956ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák struct r300_resource *rbuf = r300_resource(buf); 8068e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie 813eb557778376bcbbc6f25da88ffbaa269607254cMarek Olšák if (rbuf->constant_buffer) 823eb557778376bcbbc6f25da88ffbaa269607254cMarek Olšák FREE(rbuf->constant_buffer); 833eb557778376bcbbc6f25da88ffbaa269607254cMarek Olšák 845862b6ed6196572be0462da913d9e45b4d05f240Marek Olšák if (rbuf->buf) 856ccab620a0e7364ab6c0d902b3ddf58ee988f7faMarek Olšák r300_winsys_bo_reference(&rbuf->buf, NULL); 865862b6ed6196572be0462da913d9e45b4d05f240Marek Olšák 8780f24c1575688e9cd4a5a811137f43b7e0a661bbMarek Olšák util_slab_free(&r300screen->pool_buffers, rbuf); 887b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák} 897b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák 907b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšákstatic struct pipe_transfer* 916a46fce14f38adf72925842edf9829c00d1ee800Marek Olšákr300_buffer_get_transfer(struct pipe_context *context, 926a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák struct pipe_resource *resource, 936a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák unsigned level, 946a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák unsigned usage, 956a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák const struct pipe_box *box) 967b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák{ 977b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák struct r300_context *r300 = r300_context(context); 987b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák struct pipe_transfer *transfer = 9980f24c1575688e9cd4a5a811137f43b7e0a661bbMarek Olšák util_slab_alloc(&r300->pool_transfers); 1007b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák 1017b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák transfer->resource = resource; 1024c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger transfer->level = level; 1037b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák transfer->usage = usage; 1047b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák transfer->box = *box; 1057b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák transfer->stride = 0; 1064c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger transfer->layer_stride = 0; 1077b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák transfer->data = NULL; 1087b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák 1097b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák /* Note strides are zero, this is ok for buffers, but not for 1107b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák * textures 2d & higher at least. 1117b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák */ 1127b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák return transfer; 1137b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák} 1147b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák 1156a46fce14f38adf72925842edf9829c00d1ee800Marek Olšákstatic void r300_buffer_transfer_destroy(struct pipe_context *pipe, 1166a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák struct pipe_transfer *transfer) 1177b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák{ 1187b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák struct r300_context *r300 = r300_context(pipe); 11980f24c1575688e9cd4a5a811137f43b7e0a661bbMarek Olšák util_slab_free(&r300->pool_transfers, transfer); 12068e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie} 12168e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie 12268e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airliestatic void * 123d3e7dfc1fd7753d6305afb402e432ff45a7c0707Marek Olšákr300_buffer_transfer_map( struct pipe_context *pipe, 124d3e7dfc1fd7753d6305afb402e432ff45a7c0707Marek Olšák struct pipe_transfer *transfer ) 12568e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie{ 126fe3caa91d3f637bf9cf9f9e7adb992aa8c7ef8e4Marek Olšák struct r300_context *r300 = r300_context(pipe); 127d3e7dfc1fd7753d6305afb402e432ff45a7c0707Marek Olšák struct r300_screen *r300screen = r300_screen(pipe->screen); 12868e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie struct r300_winsys_screen *rws = r300screen->rws; 12956ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák struct r300_resource *rbuf = r300_resource(transfer->resource); 130d3e7dfc1fd7753d6305afb402e432ff45a7c0707Marek Olšák uint8_t *map; 13168e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie 132c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák if (rbuf->b.user_ptr) 133c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák return (uint8_t *) rbuf->b.user_ptr + transfer->box.x; 1343eb557778376bcbbc6f25da88ffbaa269607254cMarek Olšák if (rbuf->constant_buffer) 1353eb557778376bcbbc6f25da88ffbaa269607254cMarek Olšák return (uint8_t *) rbuf->constant_buffer + transfer->box.x; 13668e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie 1376ccab620a0e7364ab6c0d902b3ddf58ee988f7faMarek Olšák map = rws->buffer_map(rbuf->buf, r300->cs, transfer->usage); 138d3e7dfc1fd7753d6305afb402e432ff45a7c0707Marek Olšák 139d3e7dfc1fd7753d6305afb402e432ff45a7c0707Marek Olšák if (map == NULL) 140d3e7dfc1fd7753d6305afb402e432ff45a7c0707Marek Olšák return NULL; 141d3e7dfc1fd7753d6305afb402e432ff45a7c0707Marek Olšák 142d3e7dfc1fd7753d6305afb402e432ff45a7c0707Marek Olšák return map + transfer->box.x; 14368e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie} 14468e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie 145d3e7dfc1fd7753d6305afb402e432ff45a7c0707Marek Olšákstatic void r300_buffer_transfer_unmap( struct pipe_context *pipe, 146d3e7dfc1fd7753d6305afb402e432ff45a7c0707Marek Olšák struct pipe_transfer *transfer ) 14768e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie{ 148d3e7dfc1fd7753d6305afb402e432ff45a7c0707Marek Olšák struct r300_screen *r300screen = r300_screen(pipe->screen); 14968e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie struct r300_winsys_screen *rws = r300screen->rws; 15056ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák struct r300_resource *rbuf = r300_resource(transfer->resource); 15168e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie 152287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell if (rbuf->buf) { 1536ccab620a0e7364ab6c0d902b3ddf58ee988f7faMarek Olšák rws->buffer_unmap(rbuf->buf); 154287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell } 155287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell} 15668e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie 1576a46fce14f38adf72925842edf9829c00d1ee800Marek Olšákstatic void r300_buffer_transfer_inline_write(struct pipe_context *pipe, 1586a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák struct pipe_resource *resource, 1596a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák unsigned level, 1606a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák unsigned usage, 1616a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák const struct pipe_box *box, 1626a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák const void *data, 1636a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák unsigned stride, 1646a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák unsigned layer_stride) 1656a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák{ 166b606c8a015a0e304110b48c81b3bf06701f6cae1Marek Olšák struct r300_context *r300 = r300_context(pipe); 167b606c8a015a0e304110b48c81b3bf06701f6cae1Marek Olšák struct r300_winsys_screen *rws = r300->screen->rws; 16856ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák struct r300_resource *rbuf = r300_resource(resource); 1696a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák uint8_t *map = NULL; 1706a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák 1716a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák if (rbuf->constant_buffer) { 1726a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák memcpy(rbuf->constant_buffer + box->x, data, box->width); 1736a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák return; 1746a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák } 175c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák assert(rbuf->b.user_ptr == NULL); 1766a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák 1776ccab620a0e7364ab6c0d902b3ddf58ee988f7faMarek Olšák map = rws->buffer_map(rbuf->buf, r300->cs, 178b606c8a015a0e304110b48c81b3bf06701f6cae1Marek Olšák PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD | usage); 1796a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák 180b606c8a015a0e304110b48c81b3bf06701f6cae1Marek Olšák memcpy(map + box->x, data, box->width); 1816a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák 1826ccab620a0e7364ab6c0d902b3ddf58ee988f7faMarek Olšák rws->buffer_unmap(rbuf->buf); 1836a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák} 1846a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák 185d17d03a8dccb4bad25211693320459420409d997Henri Verbeetstatic const struct u_resource_vtbl r300_buffer_vtbl = 186287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell{ 18756ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák NULL, /* get_handle */ 1887b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák r300_buffer_destroy, /* resource_destroy */ 18956ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák NULL, /* is_buffer_referenced */ 1906a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák r300_buffer_get_transfer, /* get_transfer */ 1916a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák r300_buffer_transfer_destroy, /* transfer_destroy */ 1927b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák r300_buffer_transfer_map, /* transfer_map */ 19356ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák NULL, /* transfer_flush_region */ 1947b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák r300_buffer_transfer_unmap, /* transfer_unmap */ 1956a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák r300_buffer_transfer_inline_write /* transfer_inline_write */ 196287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell}; 197287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 198287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstruct pipe_resource *r300_buffer_create(struct pipe_screen *screen, 199bb4f5fff0c782f35353e8bfc1b1227e3cc3d5986Marek Olšák const struct pipe_resource *templ) 20068e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie{ 20168e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie struct r300_screen *r300screen = r300_screen(screen); 20256ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák struct r300_resource *rbuf; 203287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell unsigned alignment = 16; 20468e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie 20580f24c1575688e9cd4a5a811137f43b7e0a661bbMarek Olšák rbuf = util_slab_alloc(&r300screen->pool_buffers); 206287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 207c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák rbuf->b.b.b = *templ; 208c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák rbuf->b.b.vtbl = &r300_buffer_vtbl; 209c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák pipe_reference_init(&rbuf->b.b.b.reference, 1); 210c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák rbuf->b.b.b.screen = screen; 211c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák rbuf->b.user_ptr = NULL; 212b6b76cbb20b3d9467011231069e23972b98afa49Marek Olšák rbuf->domain = R300_DOMAIN_GTT; 2137b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák rbuf->buf = NULL; 2147c24a4c6a86402be1f68d23f4d52d4d071957801Marek Olšák rbuf->buf_size = templ->width0; 2157b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák rbuf->constant_buffer = NULL; 216b6b76cbb20b3d9467011231069e23972b98afa49Marek Olšák 2173eb557778376bcbbc6f25da88ffbaa269607254cMarek Olšák /* Alloc constant buffers in RAM. */ 2183eb557778376bcbbc6f25da88ffbaa269607254cMarek Olšák if (templ->bind & PIPE_BIND_CONSTANT_BUFFER) { 2193eb557778376bcbbc6f25da88ffbaa269607254cMarek Olšák rbuf->constant_buffer = MALLOC(templ->width0); 220c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák return &rbuf->b.b.b; 2213eb557778376bcbbc6f25da88ffbaa269607254cMarek Olšák } 2223eb557778376bcbbc6f25da88ffbaa269607254cMarek Olšák 223fe3caa91d3f637bf9cf9f9e7adb992aa8c7ef8e4Marek Olšák rbuf->buf = 224fe3caa91d3f637bf9cf9f9e7adb992aa8c7ef8e4Marek Olšák r300screen->rws->buffer_create(r300screen->rws, 225c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák rbuf->b.b.b.width0, alignment, 226c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák rbuf->b.b.b.bind, rbuf->b.b.b.usage, 227fe3caa91d3f637bf9cf9f9e7adb992aa8c7ef8e4Marek Olšák rbuf->domain); 2287b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák if (!rbuf->buf) { 22980f24c1575688e9cd4a5a811137f43b7e0a661bbMarek Olšák util_slab_free(&r300screen->pool_buffers, rbuf); 2307b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák return NULL; 2317b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák } 232287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 2339a1fe76a20c6eca67a8b933aa9e84f7ef0ad9ca2Marek Olšák rbuf->cs_buf = 2349a1fe76a20c6eca67a8b933aa9e84f7ef0ad9ca2Marek Olšák r300screen->rws->buffer_get_cs_handle(rbuf->buf); 2359a1fe76a20c6eca67a8b933aa9e84f7ef0ad9ca2Marek Olšák 236c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák return &rbuf->b.b.b; 23768e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie} 23868e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie 239287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstruct pipe_resource *r300_user_buffer_create(struct pipe_screen *screen, 240be1af4394e060677b7db6bbb8e3301e38a3363daMarek Olšák void *ptr, unsigned size, 241287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell unsigned bind) 24268e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie{ 2437b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák struct r300_screen *r300screen = r300_screen(screen); 24456ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák struct r300_resource *rbuf; 245287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 24680f24c1575688e9cd4a5a811137f43b7e0a661bbMarek Olšák rbuf = util_slab_alloc(&r300screen->pool_buffers); 247287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 248c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák pipe_reference_init(&rbuf->b.b.b.reference, 1); 249c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák rbuf->b.b.b.screen = screen; 250c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák rbuf->b.b.b.target = PIPE_BUFFER; 251c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák rbuf->b.b.b.format = PIPE_FORMAT_R8_UNORM; 252c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák rbuf->b.b.b.usage = PIPE_USAGE_IMMUTABLE; 253c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák rbuf->b.b.b.bind = bind; 254c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák rbuf->b.b.b.width0 = ~0; 255c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák rbuf->b.b.b.height0 = 1; 256c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák rbuf->b.b.b.depth0 = 1; 257c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák rbuf->b.b.b.array_size = 1; 258c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák rbuf->b.b.b.flags = 0; 259c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák rbuf->b.b.vtbl = &r300_buffer_vtbl; 260c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák rbuf->b.user_ptr = ptr; 261b6b76cbb20b3d9467011231069e23972b98afa49Marek Olšák rbuf->domain = R300_DOMAIN_GTT; 2627b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák rbuf->buf = NULL; 2637c24a4c6a86402be1f68d23f4d52d4d071957801Marek Olšák rbuf->buf_size = size; 2647b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák rbuf->constant_buffer = NULL; 265c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák return &rbuf->b.b.b; 26668e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie} 267