u_upload_mgr: pass alignment to u_upload_alloc manually

The fixed alignment of u_upload_mgr will go away.
This is the first step.

The motivation is that one u_upload_mgr can have multiple users,
each allocating from the same buffer, but requiring a different alignment.

Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
This commit is contained in:
Marek Olšák
2015-12-19 17:15:02 +01:00
parent ffc4716e97
commit 020009f7cc
25 changed files with 36 additions and 27 deletions

View File

@@ -431,7 +431,7 @@ hud_alloc_vertices(struct hud_context *hud, struct vertex_queue *v,
v->max_num_vertices = num_vertices; v->max_num_vertices = num_vertices;
v->vbuf.stride = stride; v->vbuf.stride = stride;
u_upload_alloc(hud->uploader, 0, v->vbuf.stride * v->max_num_vertices, u_upload_alloc(hud->uploader, 0, v->vbuf.stride * v->max_num_vertices,
&v->vbuf.buffer_offset, &v->vbuf.buffer, 16, &v->vbuf.buffer_offset, &v->vbuf.buffer,
(void**)&v->vertices); (void**)&v->vertices);
} }

View File

@@ -156,7 +156,7 @@ util_primconvert_draw_vbo(struct primconvert_context *pc,
pc->upload = u_upload_create(pc->pipe, 4096, 4, PIPE_BIND_INDEX_BUFFER); pc->upload = u_upload_create(pc->pipe, 4096, 4, PIPE_BIND_INDEX_BUFFER);
} }
u_upload_alloc(pc->upload, 0, new_ib.index_size * new_info.count, u_upload_alloc(pc->upload, 0, new_ib.index_size * new_info.count, 4,
&new_ib.offset, &new_ib.buffer, &dst); &new_ib.offset, &new_ib.buffer, &dst);
if (info->indexed) { if (info->indexed) {

View File

@@ -181,11 +181,11 @@ void
u_upload_alloc(struct u_upload_mgr *upload, u_upload_alloc(struct u_upload_mgr *upload,
unsigned min_out_offset, unsigned min_out_offset,
unsigned size, unsigned size,
unsigned alignment,
unsigned *out_offset, unsigned *out_offset,
struct pipe_resource **outbuf, struct pipe_resource **outbuf,
void **ptr) void **ptr)
{ {
unsigned alignment = upload->alignment;
unsigned buffer_size = upload->buffer ? upload->buffer->width0 : 0; unsigned buffer_size = upload->buffer ? upload->buffer->width0 : 0;
unsigned offset; unsigned offset;
@@ -249,7 +249,7 @@ void u_upload_data(struct u_upload_mgr *upload,
{ {
uint8_t *ptr; uint8_t *ptr;
u_upload_alloc(upload, min_out_offset, size, u_upload_alloc(upload, min_out_offset, size, upload->alignment,
out_offset, outbuf, out_offset, outbuf,
(void**)&ptr); (void**)&ptr);
if (ptr) if (ptr)

View File

@@ -74,6 +74,7 @@ void u_upload_unmap( struct u_upload_mgr *upload );
* \param upload Upload manager * \param upload Upload manager
* \param min_out_offset Minimum offset that should be returned in out_offset. * \param min_out_offset Minimum offset that should be returned in out_offset.
* \param size Size of the allocation. * \param size Size of the allocation.
* \param alignment Alignment of the suballocation within the buffer
* \param out_offset Pointer to where the new buffer offset will be returned. * \param out_offset Pointer to where the new buffer offset will be returned.
* \param outbuf Pointer to where the upload buffer will be returned. * \param outbuf Pointer to where the upload buffer will be returned.
* \param ptr Pointer to the allocated memory that is returned. * \param ptr Pointer to the allocated memory that is returned.
@@ -81,6 +82,7 @@ void u_upload_unmap( struct u_upload_mgr *upload );
void u_upload_alloc(struct u_upload_mgr *upload, void u_upload_alloc(struct u_upload_mgr *upload,
unsigned min_out_offset, unsigned min_out_offset,
unsigned size, unsigned size,
unsigned alignment,
unsigned *out_offset, unsigned *out_offset,
struct pipe_resource **outbuf, struct pipe_resource **outbuf,
void **ptr); void **ptr);

View File

@@ -454,7 +454,7 @@ u_vbuf_translate_buffers(struct u_vbuf *mgr, struct translate_key *key,
/* Create and map the output buffer. */ /* Create and map the output buffer. */
u_upload_alloc(mgr->uploader, 0, u_upload_alloc(mgr->uploader, 0,
key->output_stride * num_indices, key->output_stride * num_indices, 4,
&out_offset, &out_buffer, &out_offset, &out_buffer,
(void**)&out_map); (void**)&out_map);
if (!out_buffer) if (!out_buffer)
@@ -487,7 +487,7 @@ u_vbuf_translate_buffers(struct u_vbuf *mgr, struct translate_key *key,
/* Create and map the output buffer. */ /* Create and map the output buffer. */
u_upload_alloc(mgr->uploader, u_upload_alloc(mgr->uploader,
key->output_stride * start_vertex, key->output_stride * start_vertex,
key->output_stride * num_vertices, key->output_stride * num_vertices, 4,
&out_offset, &out_buffer, &out_offset, &out_buffer,
(void**)&out_map); (void**)&out_map);
if (!out_buffer) if (!out_buffer)

View File

@@ -716,6 +716,7 @@ gen_vertex_data(struct vl_compositor *c, struct vl_compositor_state *s, struct u
/* Allocate new memory for vertices. */ /* Allocate new memory for vertices. */
u_upload_alloc(c->upload, 0, u_upload_alloc(c->upload, 0,
c->vertex_buf.stride * VL_COMPOSITOR_MAX_LAYERS * 4, /* size */ c->vertex_buf.stride * VL_COMPOSITOR_MAX_LAYERS * 4, /* size */
4, /* alignment */
&c->vertex_buf.buffer_offset, &c->vertex_buf.buffer, &c->vertex_buf.buffer_offset, &c->vertex_buf.buffer,
(void**)&vb); (void**)&vb);

View File

@@ -172,7 +172,7 @@ fd3_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags)
fd3_query_context_init(pctx); fd3_query_context_init(pctx);
fd3_ctx->border_color_uploader = u_upload_create(pctx, 4096, fd3_ctx->border_color_uploader = u_upload_create(pctx, 4096,
2 * PIPE_MAX_SAMPLERS * BORDERCOLOR_SIZE, 0); BORDER_COLOR_UPLOAD_SIZE, 0);
return pctx; return pctx;
} }

View File

@@ -145,7 +145,8 @@ emit_textures(struct fd_context *ctx, struct fd_ringbuffer *ring,
void *ptr; void *ptr;
u_upload_alloc(fd3_ctx->border_color_uploader, u_upload_alloc(fd3_ctx->border_color_uploader,
0, 2 * PIPE_MAX_SAMPLERS * BORDERCOLOR_SIZE, &off, 0, BORDER_COLOR_UPLOAD_SIZE,
BORDER_COLOR_UPLOAD_SIZE, &off,
&fd3_ctx->border_color_buf, &fd3_ctx->border_color_buf,
&ptr); &ptr);

View File

@@ -172,7 +172,7 @@ fd4_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags)
fd4_query_context_init(pctx); fd4_query_context_init(pctx);
fd4_ctx->border_color_uploader = u_upload_create(pctx, 4096, fd4_ctx->border_color_uploader = u_upload_create(pctx, 4096,
2 * PIPE_MAX_SAMPLERS * BORDERCOLOR_SIZE, 0); BORDER_COLOR_UPLOAD_SIZE, 0);
return pctx; return pctx;
} }

View File

@@ -133,7 +133,8 @@ emit_textures(struct fd_context *ctx, struct fd_ringbuffer *ring,
void *ptr; void *ptr;
u_upload_alloc(fd4_ctx->border_color_uploader, u_upload_alloc(fd4_ctx->border_color_uploader,
0, 2 * PIPE_MAX_SAMPLERS * BORDERCOLOR_SIZE, &off, 0, BORDER_COLOR_UPLOAD_SIZE,
BORDER_COLOR_UPLOAD_SIZE, &off,
&fd4_ctx->border_color_buf, &fd4_ctx->border_color_buf,
&ptr); &ptr);

View File

@@ -40,6 +40,8 @@
#include "freedreno_gmem.h" #include "freedreno_gmem.h"
#include "freedreno_util.h" #include "freedreno_util.h"
#define BORDER_COLOR_UPLOAD_SIZE (2 * PIPE_MAX_SAMPLERS * BORDERCOLOR_SIZE)
struct fd_vertex_stateobj; struct fd_vertex_stateobj;
struct fd_texture_stateobj { struct fd_texture_stateobj {

View File

@@ -37,7 +37,7 @@ void r300_translate_index_buffer(struct r300_context *r300,
switch (*index_size) { switch (*index_size) {
case 1: case 1:
*out_buffer = NULL; *out_buffer = NULL;
u_upload_alloc(r300->uploader, 0, count * 2, u_upload_alloc(r300->uploader, 0, count * 2, 4,
&out_offset, out_buffer, &ptr); &out_offset, out_buffer, &ptr);
util_shorten_ubyte_elts_to_userptr( util_shorten_ubyte_elts_to_userptr(
@@ -51,7 +51,7 @@ void r300_translate_index_buffer(struct r300_context *r300,
case 2: case 2:
if (index_offset) { if (index_offset) {
*out_buffer = NULL; *out_buffer = NULL;
u_upload_alloc(r300->uploader, 0, count * 2, u_upload_alloc(r300->uploader, 0, count * 2, 4,
&out_offset, out_buffer, &ptr); &out_offset, out_buffer, &ptr);
util_rebuild_ushort_elts_to_userptr(&r300->context, ib, util_rebuild_ushort_elts_to_userptr(&r300->context, ib,
@@ -65,7 +65,7 @@ void r300_translate_index_buffer(struct r300_context *r300,
case 4: case 4:
if (index_offset) { if (index_offset) {
*out_buffer = NULL; *out_buffer = NULL;
u_upload_alloc(r300->uploader, 0, count * 4, u_upload_alloc(r300->uploader, 0, count * 4, 4,
&out_offset, out_buffer, &ptr); &out_offset, out_buffer, &ptr);
util_rebuild_uint_elts_to_userptr(&r300->context, ib, util_rebuild_uint_elts_to_userptr(&r300->context, ib,

View File

@@ -1732,7 +1732,7 @@ static void r600_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info
} }
} }
u_upload_alloc(rctx->b.uploader, start, count * 2, u_upload_alloc(rctx->b.uploader, start, count * 2, 256,
&out_offset, &out_buffer, &ptr); &out_offset, &out_buffer, &ptr);
util_shorten_ubyte_elts_to_userptr( util_shorten_ubyte_elts_to_userptr(

View File

@@ -298,7 +298,7 @@ static void *r600_buffer_transfer_map(struct pipe_context *ctx,
struct r600_resource *staging = NULL; struct r600_resource *staging = NULL;
u_upload_alloc(rctx->uploader, 0, box->width + (box->x % R600_MAP_BUFFER_ALIGNMENT), u_upload_alloc(rctx->uploader, 0, box->width + (box->x % R600_MAP_BUFFER_ALIGNMENT),
&offset, (struct pipe_resource**)&staging, (void**)&data); 256, &offset, (struct pipe_resource**)&staging, (void**)&data);
if (staging) { if (staging) {
data += box->x % R600_MAP_BUFFER_ALIGNMENT; data += box->x % R600_MAP_BUFFER_ALIGNMENT;

View File

@@ -85,7 +85,7 @@ void r600_draw_rectangle(struct blitter_context *blitter,
/* Upload vertices. The hw rectangle has only 3 vertices, /* Upload vertices. The hw rectangle has only 3 vertices,
* I guess the 4th one is derived from the first 3. * I guess the 4th one is derived from the first 3.
* The vertex specification should match u_blitter's vertex element state. */ * The vertex specification should match u_blitter's vertex element state. */
u_upload_alloc(rctx->uploader, 0, sizeof(float) * 24, &offset, &buf, (void**)&vb); u_upload_alloc(rctx->uploader, 0, sizeof(float) * 24, 256, &offset, &buf, (void**)&vb);
if (!buf) if (!buf)
return; return;

View File

@@ -109,7 +109,7 @@ static bool si_upload_descriptors(struct si_context *sctx,
if (!desc->list_dirty) if (!desc->list_dirty)
return true; return true;
u_upload_alloc(sctx->b.uploader, 0, list_size, u_upload_alloc(sctx->b.uploader, 0, list_size, 256,
&desc->buffer_offset, &desc->buffer_offset,
(struct pipe_resource**)&desc->buffer, &ptr); (struct pipe_resource**)&desc->buffer, &ptr);
if (!desc->buffer) if (!desc->buffer)
@@ -391,7 +391,7 @@ static bool si_upload_vertex_buffer_descriptors(struct si_context *sctx)
* directly through a staging buffer and don't go through * directly through a staging buffer and don't go through
* the fine-grained upload path. * the fine-grained upload path.
*/ */
u_upload_alloc(sctx->b.uploader, 0, count * 16, &desc->buffer_offset, u_upload_alloc(sctx->b.uploader, 0, count * 16, 256, &desc->buffer_offset,
(struct pipe_resource**)&desc->buffer, (void**)&ptr); (struct pipe_resource**)&desc->buffer, (void**)&ptr);
if (!desc->buffer) if (!desc->buffer)
return false; return false;
@@ -465,7 +465,7 @@ void si_upload_const_buffer(struct si_context *sctx, struct r600_resource **rbuf
{ {
void *tmp; void *tmp;
u_upload_alloc(sctx->b.uploader, 0, size, const_offset, u_upload_alloc(sctx->b.uploader, 0, size, 256, const_offset,
(struct pipe_resource**)rbuffer, &tmp); (struct pipe_resource**)rbuffer, &tmp);
if (rbuffer) if (rbuffer)
util_memcpy_cpu_to_le32(tmp, ptr, size); util_memcpy_cpu_to_le32(tmp, ptr, size);

View File

@@ -818,7 +818,7 @@ void si_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info)
si_get_draw_start_count(sctx, info, &start, &count); si_get_draw_start_count(sctx, info, &start, &count);
start_offset = start * ib.index_size; start_offset = start * ib.index_size;
u_upload_alloc(sctx->b.uploader, start_offset, count * 2, u_upload_alloc(sctx->b.uploader, start_offset, count * 2, 256,
&out_offset, &out_buffer, &ptr); &out_offset, &out_buffer, &ptr);
if (!out_buffer) { if (!out_buffer) {
pipe_resource_reference(&ib.buffer, NULL); pipe_resource_reference(&ib.buffer, NULL);

View File

@@ -46,7 +46,6 @@
#include "svga_winsys.h" #include "svga_winsys.h"
#define CONST0_UPLOAD_DEFAULT_SIZE 65536 #define CONST0_UPLOAD_DEFAULT_SIZE 65536
#define CONST0_UPLOAD_ALIGNMENT 256
DEBUG_GET_ONCE_BOOL_OPTION(no_swtnl, "SVGA_NO_SWTNL", FALSE) DEBUG_GET_ONCE_BOOL_OPTION(no_swtnl, "SVGA_NO_SWTNL", FALSE)
DEBUG_GET_ONCE_BOOL_OPTION(force_swtnl, "SVGA_FORCE_SWTNL", FALSE); DEBUG_GET_ONCE_BOOL_OPTION(force_swtnl, "SVGA_FORCE_SWTNL", FALSE);

View File

@@ -74,6 +74,8 @@
*/ */
#define SVGA_MAX_CONST_BUF_SIZE (4096 * 4 * sizeof(int)) #define SVGA_MAX_CONST_BUF_SIZE (4096 * 4 * sizeof(int))
#define CONST0_UPLOAD_ALIGNMENT 256
struct draw_vertex_shader; struct draw_vertex_shader;
struct draw_fragment_shader; struct draw_fragment_shader;
struct svga_shader_variant; struct svga_shader_variant;

View File

@@ -613,7 +613,8 @@ emit_constbuf_vgpu10(struct svga_context *svga, unsigned shader)
*/ */
new_buf_size = align(new_buf_size, 16); new_buf_size = align(new_buf_size, 16);
u_upload_alloc(svga->const0_upload, 0, new_buf_size, &offset, u_upload_alloc(svga->const0_upload, 0, new_buf_size,
CONST0_UPLOAD_ALIGNMENT, &offset,
&dst_buffer, &dst_map); &dst_buffer, &dst_map);
if (!dst_map) { if (!dst_map) {
if (src_map) if (src_map)

View File

@@ -921,7 +921,7 @@ vc4_get_shadow_index_buffer(struct pipe_context *pctx,
void *data; void *data;
struct pipe_resource *shadow_rsc = NULL; struct pipe_resource *shadow_rsc = NULL;
u_upload_alloc(vc4->uploader, 0, count * 2, u_upload_alloc(vc4->uploader, 0, count * 2, 4,;
shadow_offset, &shadow_rsc, &data); shadow_offset, &shadow_rsc, &data);
uint16_t *dst = data; uint16_t *dst = data;

View File

@@ -204,7 +204,7 @@ setup_bitmap_vertex_data(struct st_context *st, bool normalized,
tBot = (GLfloat) height; tBot = (GLfloat) height;
} }
u_upload_alloc(st->uploader, 0, 4 * sizeof(vertices[0]), u_upload_alloc(st->uploader, 0, 4 * sizeof(vertices[0]), 4,
vbuf_offset, vbuf, (void **) &vertices); vbuf_offset, vbuf, (void **) &vertices);
if (!*vbuf) { if (!*vbuf) {
return; return;

View File

@@ -184,7 +184,7 @@ draw_quad(struct st_context *st,
vb.stride = 8 * sizeof(float); vb.stride = 8 * sizeof(float);
u_upload_alloc(st->uploader, 0, 4 * sizeof(vertices[0]), u_upload_alloc(st->uploader, 0, 4 * sizeof(vertices[0]), 4,
&vb.buffer_offset, &vb.buffer, &vb.buffer_offset, &vb.buffer,
(void **) &vertices); (void **) &vertices);
if (!vb.buffer) { if (!vb.buffer) {

View File

@@ -457,7 +457,7 @@ draw_quad(struct gl_context *ctx, GLfloat x0, GLfloat y0, GLfloat z,
struct pipe_resource *buf = NULL; struct pipe_resource *buf = NULL;
unsigned offset; unsigned offset;
u_upload_alloc(st->uploader, 0, 4 * sizeof(verts[0]), &offset, u_upload_alloc(st->uploader, 0, 4 * sizeof(verts[0]), 4, &offset,
&buf, (void **) &verts); &buf, (void **) &verts);
if (!buf) { if (!buf) {
return; return;

View File

@@ -150,7 +150,7 @@ st_DrawTex(struct gl_context *ctx, GLfloat x, GLfloat y, GLfloat z,
GLuint attr; GLuint attr;
u_upload_alloc(st->uploader, 0, u_upload_alloc(st->uploader, 0,
numAttribs * 4 * 4 * sizeof(GLfloat), numAttribs * 4 * 4 * sizeof(GLfloat), 4,
&offset, &vbuffer, (void **) &vbuf); &offset, &vbuffer, (void **) &vbuf);
if (!vbuffer) { if (!vbuffer) {
return; return;