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