r300_screen_buffer.c revision b541a3c4c0a125087fa9e1e0d35db019c36fb0e9
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, 3724ceef7a6969ccb2243e7bb32f86d6429d9689b9Marek Olšák struct pipe_resource *buf, 3824ceef7a6969ccb2243e7bb32f86d6429d9689b9Marek Olšák enum r300_reference_domain domain) 3968e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie{ 40287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct r300_context *r300 = r300_context(context); 4168e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie struct r300_buffer *rbuf = r300_buffer(buf); 42287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 43c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák if (rbuf->b.user_ptr) 44287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell return PIPE_UNREFERENCED; 45287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 463ba8843307a909f35f2a04e6be6dcadd760ad82bMarek Olšák if (r300->rws->cs_is_buffer_referenced(r300->cs, rbuf->cs_buf, domain)) 47287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell return PIPE_REFERENCED_FOR_READ | PIPE_REFERENCED_FOR_WRITE; 4868e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie 49287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell return PIPE_UNREFERENCED; 5068e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie} 51287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 5224ceef7a6969ccb2243e7bb32f86d6429d9689b9Marek Olšákstatic unsigned r300_buffer_is_referenced_by_cs(struct pipe_context *context, 5324ceef7a6969ccb2243e7bb32f86d6429d9689b9Marek Olšák struct pipe_resource *buf, 544c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned level, int layer) 5524ceef7a6969ccb2243e7bb32f86d6429d9689b9Marek Olšák{ 5624ceef7a6969ccb2243e7bb32f86d6429d9689b9Marek Olšák return r300_buffer_is_referenced(context, buf, R300_REF_CS); 5724ceef7a6969ccb2243e7bb32f86d6429d9689b9Marek Olšák} 5824ceef7a6969ccb2243e7bb32f86d6429d9689b9Marek Olšák 597e752760d410e72cc766691bee207729f28a920aMarek Olšákvoid r300_upload_index_buffer(struct r300_context *r300, 607e752760d410e72cc766691bee207729f28a920aMarek Olšák struct pipe_resource **index_buffer, 617e752760d410e72cc766691bee207729f28a920aMarek Olšák unsigned index_size, unsigned *start, 627e752760d410e72cc766691bee207729f28a920aMarek Olšák unsigned count) 6368e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie{ 647e752760d410e72cc766691bee207729f28a920aMarek Olšák unsigned index_offset; 65c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák uint8_t *ptr = r300_buffer(*index_buffer)->b.user_ptr; 6631afa7616e3c11e9874f3297ac66ebdd50a67186Marek Olšák boolean flushed; 677e752760d410e72cc766691bee207729f28a920aMarek Olšák 687e752760d410e72cc766691bee207729f28a920aMarek Olšák *index_buffer = NULL; 697e752760d410e72cc766691bee207729f28a920aMarek Olšák 70b541a3c4c0a125087fa9e1e0d35db019c36fb0e9Marek Olšák u_upload_data(r300->vbuf_mgr->uploader, 7106286110b4fc0ff80ae21bb3d8ff9909db1f5d47Marek Olšák 0, count * index_size, 727e752760d410e72cc766691bee207729f28a920aMarek Olšák ptr + (*start * index_size), 737e752760d410e72cc766691bee207729f28a920aMarek Olšák &index_offset, 7406286110b4fc0ff80ae21bb3d8ff9909db1f5d47Marek Olšák index_buffer, &flushed); 757e752760d410e72cc766691bee207729f28a920aMarek Olšák 767e752760d410e72cc766691bee207729f28a920aMarek Olšák *start = index_offset / index_size; 7731afa7616e3c11e9874f3297ac66ebdd50a67186Marek Olšák 7831afa7616e3c11e9874f3297ac66ebdd50a67186Marek Olšák if (flushed || !r300->upload_ib_validated) { 7931afa7616e3c11e9874f3297ac66ebdd50a67186Marek Olšák r300->upload_ib_validated = FALSE; 8031afa7616e3c11e9874f3297ac66ebdd50a67186Marek Olšák r300->validate_buffers = TRUE; 8131afa7616e3c11e9874f3297ac66ebdd50a67186Marek Olšák } 8268e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie} 8368e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie 84287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstatic void r300_buffer_destroy(struct pipe_screen *screen, 85287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *buf) 8668e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie{ 87287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct r300_screen *r300screen = r300_screen(screen); 8868e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie struct r300_buffer *rbuf = r300_buffer(buf); 895862b6ed6196572be0462da913d9e45b4d05f240Marek Olšák struct r300_winsys_screen *rws = r300screen->rws; 9068e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie 913eb557778376bcbbc6f25da88ffbaa269607254cMarek Olšák if (rbuf->constant_buffer) 923eb557778376bcbbc6f25da88ffbaa269607254cMarek Olšák FREE(rbuf->constant_buffer); 933eb557778376bcbbc6f25da88ffbaa269607254cMarek Olšák 945862b6ed6196572be0462da913d9e45b4d05f240Marek Olšák if (rbuf->buf) 955862b6ed6196572be0462da913d9e45b4d05f240Marek Olšák rws->buffer_reference(rws, &rbuf->buf, NULL); 965862b6ed6196572be0462da913d9e45b4d05f240Marek Olšák 9780f24c1575688e9cd4a5a811137f43b7e0a661bbMarek Olšák util_slab_free(&r300screen->pool_buffers, rbuf); 987b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák} 997b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák 1007b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšákstatic struct pipe_transfer* 1016a46fce14f38adf72925842edf9829c00d1ee800Marek Olšákr300_buffer_get_transfer(struct pipe_context *context, 1026a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák struct pipe_resource *resource, 1036a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák unsigned level, 1046a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák unsigned usage, 1056a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák const struct pipe_box *box) 1067b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák{ 1077b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák struct r300_context *r300 = r300_context(context); 1087b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák struct pipe_transfer *transfer = 10980f24c1575688e9cd4a5a811137f43b7e0a661bbMarek Olšák util_slab_alloc(&r300->pool_transfers); 1107b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák 1117b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák transfer->resource = resource; 1124c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger transfer->level = level; 1137b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák transfer->usage = usage; 1147b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák transfer->box = *box; 1157b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák transfer->stride = 0; 1164c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger transfer->layer_stride = 0; 1177b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák transfer->data = NULL; 1187b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák 1197b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák /* Note strides are zero, this is ok for buffers, but not for 1207b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák * textures 2d & higher at least. 1217b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák */ 1227b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák return transfer; 1237b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák} 1247b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák 1256a46fce14f38adf72925842edf9829c00d1ee800Marek Olšákstatic void r300_buffer_transfer_destroy(struct pipe_context *pipe, 1266a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák struct pipe_transfer *transfer) 1277b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák{ 1287b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák struct r300_context *r300 = r300_context(pipe); 12980f24c1575688e9cd4a5a811137f43b7e0a661bbMarek Olšák util_slab_free(&r300->pool_transfers, transfer); 13068e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie} 13168e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie 13268e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airliestatic void * 133d3e7dfc1fd7753d6305afb402e432ff45a7c0707Marek Olšákr300_buffer_transfer_map( struct pipe_context *pipe, 134d3e7dfc1fd7753d6305afb402e432ff45a7c0707Marek Olšák struct pipe_transfer *transfer ) 13568e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie{ 136fe3caa91d3f637bf9cf9f9e7adb992aa8c7ef8e4Marek Olšák struct r300_context *r300 = r300_context(pipe); 137d3e7dfc1fd7753d6305afb402e432ff45a7c0707Marek Olšák struct r300_screen *r300screen = r300_screen(pipe->screen); 13868e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie struct r300_winsys_screen *rws = r300screen->rws; 139d3e7dfc1fd7753d6305afb402e432ff45a7c0707Marek Olšák struct r300_buffer *rbuf = r300_buffer(transfer->resource); 140d3e7dfc1fd7753d6305afb402e432ff45a7c0707Marek Olšák uint8_t *map; 14168e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie 142c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák if (rbuf->b.user_ptr) 143c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák return (uint8_t *) rbuf->b.user_ptr + transfer->box.x; 1443eb557778376bcbbc6f25da88ffbaa269607254cMarek Olšák if (rbuf->constant_buffer) 1453eb557778376bcbbc6f25da88ffbaa269607254cMarek Olšák return (uint8_t *) rbuf->constant_buffer + transfer->box.x; 14668e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie 147fe3caa91d3f637bf9cf9f9e7adb992aa8c7ef8e4Marek Olšák map = rws->buffer_map(rws, rbuf->buf, r300->cs, transfer->usage); 148d3e7dfc1fd7753d6305afb402e432ff45a7c0707Marek Olšák 149d3e7dfc1fd7753d6305afb402e432ff45a7c0707Marek Olšák if (map == NULL) 150d3e7dfc1fd7753d6305afb402e432ff45a7c0707Marek Olšák return NULL; 151d3e7dfc1fd7753d6305afb402e432ff45a7c0707Marek Olšák 152d3e7dfc1fd7753d6305afb402e432ff45a7c0707Marek Olšák return map + transfer->box.x; 15368e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie} 15468e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie 155d3e7dfc1fd7753d6305afb402e432ff45a7c0707Marek Olšákstatic void r300_buffer_transfer_flush_region( struct pipe_context *pipe, 156d3e7dfc1fd7753d6305afb402e432ff45a7c0707Marek Olšák struct pipe_transfer *transfer, 157d3e7dfc1fd7753d6305afb402e432ff45a7c0707Marek Olšák const struct pipe_box *box) 15868e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie{ 1596125cbe983b267846afb8f1e487d378bdf7a189cMarek Olšák /* no-op */ 16068e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie} 16168e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie 162d3e7dfc1fd7753d6305afb402e432ff45a7c0707Marek Olšákstatic void r300_buffer_transfer_unmap( struct pipe_context *pipe, 163d3e7dfc1fd7753d6305afb402e432ff45a7c0707Marek Olšák struct pipe_transfer *transfer ) 16468e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie{ 165d3e7dfc1fd7753d6305afb402e432ff45a7c0707Marek Olšák struct r300_screen *r300screen = r300_screen(pipe->screen); 16668e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie struct r300_winsys_screen *rws = r300screen->rws; 167d3e7dfc1fd7753d6305afb402e432ff45a7c0707Marek Olšák struct r300_buffer *rbuf = r300_buffer(transfer->resource); 16868e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie 169287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell if (rbuf->buf) { 170287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell rws->buffer_unmap(rws, rbuf->buf); 171287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell } 172287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell} 17368e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie 1746a46fce14f38adf72925842edf9829c00d1ee800Marek Olšákstatic void r300_buffer_transfer_inline_write(struct pipe_context *pipe, 1756a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák struct pipe_resource *resource, 1766a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák unsigned level, 1776a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák unsigned usage, 1786a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák const struct pipe_box *box, 1796a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák const void *data, 1806a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák unsigned stride, 1816a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák unsigned layer_stride) 1826a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák{ 183b606c8a015a0e304110b48c81b3bf06701f6cae1Marek Olšák struct r300_context *r300 = r300_context(pipe); 184b606c8a015a0e304110b48c81b3bf06701f6cae1Marek Olšák struct r300_winsys_screen *rws = r300->screen->rws; 1856a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák struct r300_buffer *rbuf = r300_buffer(resource); 1866a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák uint8_t *map = NULL; 1876a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák 1886a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák if (rbuf->constant_buffer) { 1896a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák memcpy(rbuf->constant_buffer + box->x, data, box->width); 1906a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák return; 1916a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák } 192c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák assert(rbuf->b.user_ptr == NULL); 1936a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák 194b606c8a015a0e304110b48c81b3bf06701f6cae1Marek Olšák map = rws->buffer_map(rws, rbuf->buf, r300->cs, 195b606c8a015a0e304110b48c81b3bf06701f6cae1Marek Olšák PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD | usage); 1966a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák 197b606c8a015a0e304110b48c81b3bf06701f6cae1Marek Olšák memcpy(map + box->x, data, box->width); 1986a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák 199b606c8a015a0e304110b48c81b3bf06701f6cae1Marek Olšák rws->buffer_unmap(rws, rbuf->buf); 2006a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák} 2016a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák 202d17d03a8dccb4bad25211693320459420409d997Henri Verbeetstatic const struct u_resource_vtbl r300_buffer_vtbl = 203287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell{ 204287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell u_default_resource_get_handle, /* get_handle */ 2057b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák r300_buffer_destroy, /* resource_destroy */ 2067b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák r300_buffer_is_referenced_by_cs, /* is_buffer_referenced */ 2076a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák r300_buffer_get_transfer, /* get_transfer */ 2086a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák r300_buffer_transfer_destroy, /* transfer_destroy */ 2097b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák r300_buffer_transfer_map, /* transfer_map */ 210287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell r300_buffer_transfer_flush_region, /* transfer_flush_region */ 2117b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák r300_buffer_transfer_unmap, /* transfer_unmap */ 2126a46fce14f38adf72925842edf9829c00d1ee800Marek Olšák r300_buffer_transfer_inline_write /* transfer_inline_write */ 213287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell}; 214287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 215287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstruct pipe_resource *r300_buffer_create(struct pipe_screen *screen, 216bb4f5fff0c782f35353e8bfc1b1227e3cc3d5986Marek Olšák const struct pipe_resource *templ) 21768e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie{ 21868e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie struct r300_screen *r300screen = r300_screen(screen); 219287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct r300_buffer *rbuf; 220287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell unsigned alignment = 16; 22168e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie 22280f24c1575688e9cd4a5a811137f43b7e0a661bbMarek Olšák rbuf = util_slab_alloc(&r300screen->pool_buffers); 223287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 224287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell rbuf->magic = R300_BUFFER_MAGIC; 225287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 226c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák rbuf->b.b.b = *templ; 227c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák rbuf->b.b.vtbl = &r300_buffer_vtbl; 228c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák pipe_reference_init(&rbuf->b.b.b.reference, 1); 229c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák rbuf->b.b.b.screen = screen; 230c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák rbuf->b.user_ptr = NULL; 231b6b76cbb20b3d9467011231069e23972b98afa49Marek Olšák rbuf->domain = R300_DOMAIN_GTT; 2327b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák rbuf->buf = NULL; 2337b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák rbuf->constant_buffer = NULL; 234b6b76cbb20b3d9467011231069e23972b98afa49Marek Olšák 2353eb557778376bcbbc6f25da88ffbaa269607254cMarek Olšák /* Alloc constant buffers in RAM. */ 2363eb557778376bcbbc6f25da88ffbaa269607254cMarek Olšák if (templ->bind & PIPE_BIND_CONSTANT_BUFFER) { 2373eb557778376bcbbc6f25da88ffbaa269607254cMarek Olšák rbuf->constant_buffer = MALLOC(templ->width0); 238c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák return &rbuf->b.b.b; 2393eb557778376bcbbc6f25da88ffbaa269607254cMarek Olšák } 2403eb557778376bcbbc6f25da88ffbaa269607254cMarek Olšák 241fe3caa91d3f637bf9cf9f9e7adb992aa8c7ef8e4Marek Olšák rbuf->buf = 242fe3caa91d3f637bf9cf9f9e7adb992aa8c7ef8e4Marek Olšák r300screen->rws->buffer_create(r300screen->rws, 243c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák rbuf->b.b.b.width0, alignment, 244c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák rbuf->b.b.b.bind, rbuf->b.b.b.usage, 245fe3caa91d3f637bf9cf9f9e7adb992aa8c7ef8e4Marek Olšák rbuf->domain); 2463ba8843307a909f35f2a04e6be6dcadd760ad82bMarek Olšák rbuf->cs_buf = 2473ba8843307a909f35f2a04e6be6dcadd760ad82bMarek Olšák r300screen->rws->buffer_get_cs_handle(r300screen->rws, rbuf->buf); 248287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 2497b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák if (!rbuf->buf) { 25080f24c1575688e9cd4a5a811137f43b7e0a661bbMarek Olšák util_slab_free(&r300screen->pool_buffers, rbuf); 2517b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák return NULL; 2527b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák } 253287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 254c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák return &rbuf->b.b.b; 25568e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie} 25668e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie 257287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstruct pipe_resource *r300_user_buffer_create(struct pipe_screen *screen, 258be1af4394e060677b7db6bbb8e3301e38a3363daMarek Olšák void *ptr, unsigned size, 259287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell unsigned bind) 26068e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie{ 2617b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák struct r300_screen *r300screen = r300_screen(screen); 262287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct r300_buffer *rbuf; 263287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 26480f24c1575688e9cd4a5a811137f43b7e0a661bbMarek Olšák rbuf = util_slab_alloc(&r300screen->pool_buffers); 265287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 266287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell rbuf->magic = R300_BUFFER_MAGIC; 267287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 268c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák pipe_reference_init(&rbuf->b.b.b.reference, 1); 269c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák rbuf->b.b.b.screen = screen; 270c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák rbuf->b.b.b.target = PIPE_BUFFER; 271c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák rbuf->b.b.b.format = PIPE_FORMAT_R8_UNORM; 272c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák rbuf->b.b.b.usage = PIPE_USAGE_IMMUTABLE; 273c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák rbuf->b.b.b.bind = bind; 274c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák rbuf->b.b.b.width0 = ~0; 275c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák rbuf->b.b.b.height0 = 1; 276c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák rbuf->b.b.b.depth0 = 1; 277c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák rbuf->b.b.b.array_size = 1; 278c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák rbuf->b.b.b.flags = 0; 279c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák rbuf->b.b.vtbl = &r300_buffer_vtbl; 280c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák rbuf->b.user_ptr = ptr; 281b6b76cbb20b3d9467011231069e23972b98afa49Marek Olšák rbuf->domain = R300_DOMAIN_GTT; 2827b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák rbuf->buf = NULL; 2837b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák rbuf->constant_buffer = NULL; 284c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák return &rbuf->b.b.b; 28568e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie} 286