2 * Copyright 2010 Jerome Glisse <glisse@freedesktop.org>
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * on the rights to use, copy, modify, merge, publish, distribute, sub
8 * license, and/or sell copies of the Software, and to permit persons to whom
9 * the Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
19 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
20 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
21 * USE OR OTHER DEALINGS IN THE SOFTWARE.
24 * Jerome Glisse <jglisse@redhat.com>
27 #include "util/u_inlines.h"
28 #include "util/u_memory.h"
30 #include "r600_pipe.h"
31 #include "r600_resource.h"
34 struct r600_pipe_context
*rctx
;
35 struct r600_bo
*buffer
;
38 unsigned default_size
;
39 unsigned total_alloc_size
;
44 struct r600_upload
*r600_upload_create(struct r600_pipe_context
*rctx
,
45 unsigned default_size
,
48 struct r600_upload
*upload
= CALLOC_STRUCT(r600_upload
);
55 upload
->default_size
= default_size
;
56 upload
->alignment
= alignment
;
58 upload
->buffer
= NULL
;
59 upload
->total_alloc_size
= 0;
64 void r600_upload_flush(struct r600_upload
*upload
)
67 r600_bo_reference(upload
->rctx
->radeon
, &upload
->buffer
, NULL
);
69 upload
->default_size
= MAX2(upload
->total_alloc_size
, upload
->default_size
);
70 upload
->total_alloc_size
= 0;
74 upload
->buffer
= NULL
;
77 void r600_upload_destroy(struct r600_upload
*upload
)
79 r600_upload_flush(upload
);
83 int r600_upload_buffer(struct r600_upload
*upload
, unsigned offset
,
84 unsigned size
, struct r600_resource_buffer
*in_buffer
,
85 unsigned *out_offset
, unsigned *out_size
,
86 struct r600_bo
**out_buffer
)
88 unsigned alloc_size
= align(size
, upload
->alignment
);
89 const void *in_ptr
= NULL
;
91 if (upload
->offset
+ alloc_size
> upload
->size
) {
93 r600_bo_reference(upload
->rctx
->radeon
, &upload
->buffer
, NULL
);
95 upload
->size
= align(MAX2(upload
->default_size
, alloc_size
), 4096);
96 upload
->total_alloc_size
+= upload
->size
;
98 upload
->buffer
= r600_bo(upload
->rctx
->radeon
, upload
->size
, 4096, PIPE_BIND_VERTEX_BUFFER
, 0);
99 if (upload
->buffer
== NULL
) {
102 upload
->ptr
= r600_bo_map(upload
->rctx
->radeon
, upload
->buffer
, 0, NULL
);
105 in_ptr
= in_buffer
->user_buffer
;
106 memcpy(upload
->ptr
+ upload
->offset
, (uint8_t *) in_ptr
+ offset
, size
);
107 *out_offset
= upload
->offset
;
108 *out_size
= upload
->size
;
110 r600_bo_reference(upload
->rctx
->radeon
, out_buffer
, upload
->buffer
);
111 upload
->offset
+= alloc_size
;