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