u_upload_mgr: allow specifying PIPE_USAGE_* for the upload buffer

Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
This commit is contained in:
Marek Olšák 2015-12-19 17:54:31 +01:00
parent 37d0aea772
commit ecb2da1559
17 changed files with 43 additions and 26 deletions

View file

@ -1177,7 +1177,7 @@ hud_create(struct pipe_context *pipe, struct cso_context *cso)
hud->pipe = pipe; hud->pipe = pipe;
hud->cso = cso; hud->cso = cso;
hud->uploader = u_upload_create(pipe, 256 * 1024, hud->uploader = u_upload_create(pipe, 256 * 1024,
PIPE_BIND_VERTEX_BUFFER); PIPE_BIND_VERTEX_BUFFER, PIPE_USAGE_STREAM);
/* font */ /* font */
if (!util_font_create(pipe, UTIL_FONT_FIXED_8X13, &hud->font)) { if (!util_font_create(pipe, UTIL_FONT_FIXED_8X13, &hud->font)) {

View file

@ -153,7 +153,8 @@ util_primconvert_draw_vbo(struct primconvert_context *pc,
} }
if (!pc->upload) { if (!pc->upload) {
pc->upload = u_upload_create(pc->pipe, 4096, PIPE_BIND_INDEX_BUFFER); pc->upload = u_upload_create(pc->pipe, 4096, PIPE_BIND_INDEX_BUFFER,
PIPE_USAGE_STREAM);
} }
u_upload_alloc(pc->upload, 0, new_ib.index_size * new_info.count, 4, u_upload_alloc(pc->upload, 0, new_ib.index_size * new_info.count, 4,

View file

@ -320,7 +320,8 @@ struct blitter_context *util_blitter_create(struct pipe_context *pipe)
for (i = 0; i < 4; i++) for (i = 0; i < 4; i++)
ctx->vertices[i][0][3] = 1; /*v.w*/ ctx->vertices[i][0][3] = 1; /*v.w*/
ctx->upload = u_upload_create(pipe, 65536, PIPE_BIND_VERTEX_BUFFER); ctx->upload = u_upload_create(pipe, 65536, PIPE_BIND_VERTEX_BUFFER,
PIPE_USAGE_STREAM);
return &ctx->base; return &ctx->base;
} }

View file

@ -43,6 +43,7 @@ struct u_upload_mgr {
unsigned default_size; /* Minimum size of the upload buffer, in bytes. */ unsigned default_size; /* Minimum size of the upload buffer, in bytes. */
unsigned bind; /* Bitmask of PIPE_BIND_* flags. */ unsigned bind; /* Bitmask of PIPE_BIND_* flags. */
unsigned usage; /* PIPE_USAGE_* */
unsigned map_flags; /* Bitmask of PIPE_TRANSFER_* flags. */ unsigned map_flags; /* Bitmask of PIPE_TRANSFER_* flags. */
boolean map_persistent; /* If persistent mappings are supported. */ boolean map_persistent; /* If persistent mappings are supported. */
@ -54,9 +55,9 @@ struct u_upload_mgr {
}; };
struct u_upload_mgr *u_upload_create( struct pipe_context *pipe, struct u_upload_mgr *
unsigned default_size, u_upload_create(struct pipe_context *pipe, unsigned default_size,
unsigned bind ) unsigned bind, unsigned usage)
{ {
struct u_upload_mgr *upload = CALLOC_STRUCT( u_upload_mgr ); struct u_upload_mgr *upload = CALLOC_STRUCT( u_upload_mgr );
if (!upload) if (!upload)
@ -65,6 +66,7 @@ struct u_upload_mgr *u_upload_create( struct pipe_context *pipe,
upload->pipe = pipe; upload->pipe = pipe;
upload->default_size = default_size; upload->default_size = default_size;
upload->bind = bind; upload->bind = bind;
upload->usage = usage;
upload->map_persistent = upload->map_persistent =
pipe->screen->get_param(pipe->screen, pipe->screen->get_param(pipe->screen,
@ -146,7 +148,7 @@ u_upload_alloc_buffer(struct u_upload_mgr *upload,
buffer.target = PIPE_BUFFER; buffer.target = PIPE_BUFFER;
buffer.format = PIPE_FORMAT_R8_UNORM; /* want TYPELESS or similar */ buffer.format = PIPE_FORMAT_R8_UNORM; /* want TYPELESS or similar */
buffer.bind = upload->bind; buffer.bind = upload->bind;
buffer.usage = PIPE_USAGE_STREAM; buffer.usage = upload->usage;
buffer.width0 = size; buffer.width0 = size;
buffer.height0 = 1; buffer.height0 = 1;
buffer.depth0 = 1; buffer.depth0 = 1;

View file

@ -44,10 +44,11 @@ struct pipe_resource;
* \param pipe Pipe driver. * \param pipe Pipe driver.
* \param default_size Minimum size of the upload buffer, in bytes. * \param default_size Minimum size of the upload buffer, in bytes.
* \param bind Bitmask of PIPE_BIND_* flags. * \param bind Bitmask of PIPE_BIND_* flags.
* \param usage PIPE_USAGE_*
*/ */
struct u_upload_mgr *u_upload_create( struct pipe_context *pipe, struct u_upload_mgr *
unsigned default_size, u_upload_create(struct pipe_context *pipe, unsigned default_size,
unsigned bind ); unsigned bind, unsigned usage);
/** /**
* Destroy the upload manager. * Destroy the upload manager.

View file

@ -315,7 +315,8 @@ u_vbuf_create(struct pipe_context *pipe,
memset(mgr->fallback_vbs, ~0, sizeof(mgr->fallback_vbs)); memset(mgr->fallback_vbs, ~0, sizeof(mgr->fallback_vbs));
mgr->uploader = u_upload_create(pipe, 1024 * 1024, mgr->uploader = u_upload_create(pipe, 1024 * 1024,
PIPE_BIND_VERTEX_BUFFER); PIPE_BIND_VERTEX_BUFFER,
PIPE_USAGE_STREAM);
return mgr; return mgr;
} }

View file

@ -1091,7 +1091,8 @@ vl_compositor_init(struct vl_compositor *c, struct pipe_context *pipe)
c->pipe = pipe; c->pipe = pipe;
c->upload = u_upload_create(pipe, 128 * 1024, PIPE_BIND_VERTEX_BUFFER); c->upload = u_upload_create(pipe, 128 * 1024, PIPE_BIND_VERTEX_BUFFER,
PIPE_USAGE_STREAM);
if (!c->upload) if (!c->upload)
return false; return false;

View file

@ -171,7 +171,8 @@ 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, 0); fd3_ctx->border_color_uploader = u_upload_create(pctx, 4096, 0,
PIPE_USAGE_STREAM);
return pctx; return pctx;
} }

View file

@ -171,7 +171,8 @@ 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, 0); fd4_ctx->border_color_uploader = u_upload_create(pctx, 4096, 0,
PIPE_USAGE_STREAM);
return pctx; return pctx;
} }

View file

@ -190,7 +190,8 @@ ilo_context_create(struct pipe_screen *screen, void *priv, unsigned flags)
* context. * context.
*/ */
ilo->uploader = u_upload_create(&ilo->base, 1024 * 1024, ilo->uploader = u_upload_create(&ilo->base, 1024 * 1024,
PIPE_BIND_CONSTANT_BUFFER | PIPE_BIND_INDEX_BUFFER); PIPE_BIND_CONSTANT_BUFFER | PIPE_BIND_INDEX_BUFFER,
PIPE_USAGE_STREAM);
if (!ilo->uploader) { if (!ilo->uploader) {
ilo_context_destroy(&ilo->base); ilo_context_destroy(&ilo->base);
return NULL; return NULL;

View file

@ -422,7 +422,7 @@ struct pipe_context* r300_create_context(struct pipe_screen* screen,
r300->context.create_video_buffer = vl_video_buffer_create; r300->context.create_video_buffer = vl_video_buffer_create;
r300->uploader = u_upload_create(&r300->context, 256 * 1024, r300->uploader = u_upload_create(&r300->context, 256 * 1024,
PIPE_BIND_CUSTOM); PIPE_BIND_CUSTOM, PIPE_USAGE_STREAM);
r300->blitter = util_blitter_create(&r300->context); r300->blitter = util_blitter_create(&r300->context);
if (r300->blitter == NULL) if (r300->blitter == NULL)

View file

@ -274,7 +274,7 @@ bool r600_common_context_init(struct r600_common_context *rctx,
rctx->uploader = u_upload_create(&rctx->b, 1024 * 1024, rctx->uploader = u_upload_create(&rctx->b, 1024 * 1024,
PIPE_BIND_INDEX_BUFFER | PIPE_BIND_INDEX_BUFFER |
PIPE_BIND_CONSTANT_BUFFER); PIPE_BIND_CONSTANT_BUFFER, PIPE_USAGE_STREAM);
if (!rctx->uploader) if (!rctx->uploader)
return false; return false;

View file

@ -219,7 +219,8 @@ struct pipe_context *svga_context_create(struct pipe_screen *screen,
svga->const0_upload = u_upload_create(&svga->pipe, svga->const0_upload = u_upload_create(&svga->pipe,
CONST0_UPLOAD_DEFAULT_SIZE, CONST0_UPLOAD_DEFAULT_SIZE,
PIPE_BIND_CONSTANT_BUFFER); PIPE_BIND_CONSTANT_BUFFER,
PIPE_USAGE_STREAM);
if (!svga->const0_upload) if (!svga->const0_upload)
goto cleanup; goto cleanup;

View file

@ -255,7 +255,8 @@ vc4_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags)
goto fail; goto fail;
vc4->uploader = u_upload_create(pctx, 16 * 1024, vc4->uploader = u_upload_create(pctx, 16 * 1024,
PIPE_BIND_INDEX_BUFFER); PIPE_BIND_INDEX_BUFFER,
PIPE_USAGE_STREAM);
vc4_debug |= saved_shaderdb_flag; vc4_debug |= saved_shaderdb_flag;

View file

@ -949,7 +949,7 @@ struct pipe_context *virgl_context_create(struct pipe_screen *pscreen,
vctx->primconvert = util_primconvert_create(&vctx->base, rs->caps.caps.v1.prim_mask); vctx->primconvert = util_primconvert_create(&vctx->base, rs->caps.caps.v1.prim_mask);
vctx->uploader = u_upload_create(&vctx->base, 1024 * 1024, vctx->uploader = u_upload_create(&vctx->base, 1024 * 1024,
PIPE_BIND_INDEX_BUFFER); PIPE_BIND_INDEX_BUFFER, PIPE_USAGE_STREAM);
if (!vctx->uploader) if (!vctx->uploader)
goto fail; goto fail;

View file

@ -393,13 +393,15 @@ NineDevice9_ctor( struct NineDevice9 *This,
This->driver_caps.user_cbufs = GET_PCAP(USER_CONSTANT_BUFFERS); This->driver_caps.user_cbufs = GET_PCAP(USER_CONSTANT_BUFFERS);
if (!This->driver_caps.user_vbufs) if (!This->driver_caps.user_vbufs)
This->vertex_uploader = u_upload_create(This->pipe, 65536, PIPE_BIND_VERTEX_BUFFER); This->vertex_uploader = u_upload_create(This->pipe, 65536,
PIPE_BIND_VERTEX_BUFFER, PIPE_USAGE_STREAM);
if (!This->driver_caps.user_ibufs) if (!This->driver_caps.user_ibufs)
This->index_uploader = u_upload_create(This->pipe, 128 * 1024, PIPE_BIND_INDEX_BUFFER); This->index_uploader = u_upload_create(This->pipe, 128 * 1024,
PIPE_BIND_INDEX_BUFFER, PIPE_USAGE_STREAM);
if (!This->driver_caps.user_cbufs) { if (!This->driver_caps.user_cbufs) {
This->constbuf_alignment = GET_PCAP(CONSTANT_BUFFER_OFFSET_ALIGNMENT); This->constbuf_alignment = GET_PCAP(CONSTANT_BUFFER_OFFSET_ALIGNMENT);
This->constbuf_uploader = u_upload_create(This->pipe, This->vs_const_size, This->constbuf_uploader = u_upload_create(This->pipe, This->vs_const_size,
PIPE_BIND_CONSTANT_BUFFER); PIPE_BIND_CONSTANT_BUFFER, PIPE_USAGE_STREAM);
} }
This->driver_caps.window_space_position_support = GET_PCAP(TGSI_VS_WINDOW_SPACE_POSITION); This->driver_caps.window_space_position_support = GET_PCAP(TGSI_VS_WINDOW_SPACE_POSITION);

View file

@ -172,16 +172,19 @@ st_create_context_priv( struct gl_context *ctx, struct pipe_context *pipe,
/* Create upload manager for vertex data for glBitmap, glDrawPixels, /* Create upload manager for vertex data for glBitmap, glDrawPixels,
* glClear, etc. * glClear, etc.
*/ */
st->uploader = u_upload_create(st->pipe, 65536, PIPE_BIND_VERTEX_BUFFER); st->uploader = u_upload_create(st->pipe, 65536, PIPE_BIND_VERTEX_BUFFER,
PIPE_USAGE_STREAM);
if (!screen->get_param(screen, PIPE_CAP_USER_INDEX_BUFFERS)) { if (!screen->get_param(screen, PIPE_CAP_USER_INDEX_BUFFERS)) {
st->indexbuf_uploader = u_upload_create(st->pipe, 128 * 1024, st->indexbuf_uploader = u_upload_create(st->pipe, 128 * 1024,
PIPE_BIND_INDEX_BUFFER); PIPE_BIND_INDEX_BUFFER,
PIPE_USAGE_STREAM);
} }
if (!screen->get_param(screen, PIPE_CAP_USER_CONSTANT_BUFFERS)) if (!screen->get_param(screen, PIPE_CAP_USER_CONSTANT_BUFFERS))
st->constbuf_uploader = u_upload_create(pipe, 128 * 1024, st->constbuf_uploader = u_upload_create(pipe, 128 * 1024,
PIPE_BIND_CONSTANT_BUFFER); PIPE_BIND_CONSTANT_BUFFER,
PIPE_USAGE_STREAM);
st->cso_context = cso_create_context(pipe); st->cso_context = cso_create_context(pipe);