u_upload_mgr.h revision 06286110b4fc0ff80ae21bb3d8ff9909db1f5d47
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**************************************************************************
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright 2009 VMware, Inc.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * All Rights Reserved.
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Permission is hereby granted, free of charge, to any person obtaining a
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * copy of this software and associated documentation files (the
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * "Software"), to deal in the Software without restriction, including
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * without limitation the rights to use, copy, modify, merge, publish,
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * distribute, sub license, and/or sell copies of the Software, and to
11ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * permit persons to whom the Software is furnished to do so, subject to
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * the following conditions:
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) *
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * The above copyright notice and this permission notice (including the
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * next paragraph) shall be included in all copies or substantial portions
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of the Software.
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch *
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) **************************************************************************/
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Helper utility for uploading user buffers & other data, and
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * coalescing small buffers into larger ones.
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#ifndef U_UPLOAD_MGR_H
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define U_UPLOAD_MGR_H
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "pipe/p_compiler.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)struct pipe_context;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct pipe_resource;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct u_upload_mgr *u_upload_create( struct pipe_context *pipe,
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                      unsigned default_size,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      unsigned alignment,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      unsigned bind );
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void u_upload_destroy( struct u_upload_mgr *upload );
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Unmap and release old buffer.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This must usually be called prior to firing the command stream
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * which references the upload buffer, as many memory managers either
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * don't like firing a mapped buffer or cause subsequent maps of a
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * fired buffer to wait.  For now, it's easiest just to grab a new
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * buffer.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void u_upload_flush( struct u_upload_mgr *upload );
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Sub-allocate new memory from the upload buffer.
60b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) *
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * \param upload           Upload manager
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * \param min_out_offset   Minimum offset that should be returned in out_offset.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * \param size             Size of the allocation.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * \param out_offset       Pointer to where the new buffer offset will be returned.
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * \param outbuf           Pointer to where the upload buffer will be returned.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * \param flushed          Whether the upload buffer was flushed.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * \param ptr              Pointer to the allocated memory that is returned.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum pipe_error u_upload_alloc( struct u_upload_mgr *upload,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                unsigned min_out_offset,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                unsigned size,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                unsigned *out_offset,
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                struct pipe_resource **outbuf,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                boolean *flushed,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                void **ptr );
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Allocate and write data to the upload buffer.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Same as u_upload_alloc, but in addition to that, it copies "data"
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * to the pointer returned from u_upload_alloc.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)enum pipe_error u_upload_data( struct u_upload_mgr *upload,
8523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                               unsigned min_out_offset,
8623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                               unsigned size,
8723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                               const void *data,
8823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                               unsigned *out_offset,
8923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                               struct pipe_resource **outbuf,
9023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                               boolean *flushed );
9123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
9223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)/**
9458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * Allocate and copy an input buffer to the upload buffer.
9558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) *
9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * Same as u_upload_data, except that the input data comes from a buffer
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * instead of a user pointer.
9858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) */
9958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)enum pipe_error u_upload_buffer( struct u_upload_mgr *upload,
10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                 unsigned min_out_offset,
10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                 unsigned offset,
10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                 unsigned size,
10358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                 struct pipe_resource *inbuf,
10458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                 unsigned *out_offset,
10558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                 struct pipe_resource **outbuf,
106868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                 boolean *flushed );
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
11123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
11223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)