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