diff options
author | Eric Anholt <[email protected]> | 2018-08-08 17:34:42 -0700 |
---|---|---|
committer | Eric Anholt <[email protected]> | 2018-08-08 18:14:31 -0700 |
commit | fdfb689a48b11954f35fe39ad49cbe2108f2e279 (patch) | |
tree | 0c02305db9c104c82a385dfc1f53351f330bcbc4 /src | |
parent | 25bee5ef9ea923bf0d99f5f8eb19082c449f3e53 (diff) |
vc4: Implement texture_subdata() to directly upload tiled data.
This avoids a memcpy into a temporary in the upload path.
Improves x11perf -putimage100 performance by 12.1586% +/- 1.38155% (n=145)
Diffstat (limited to 'src')
-rw-r--r-- | src/gallium/drivers/vc4/vc4_resource.c | 40 |
1 files changed, 39 insertions, 1 deletions
diff --git a/src/gallium/drivers/vc4/vc4_resource.c b/src/gallium/drivers/vc4/vc4_resource.c index f2adb290614..e169303f4a3 100644 --- a/src/gallium/drivers/vc4/vc4_resource.c +++ b/src/gallium/drivers/vc4/vc4_resource.c @@ -232,6 +232,44 @@ fail: } static void +vc4_texture_subdata(struct pipe_context *pctx, + struct pipe_resource *prsc, + unsigned level, + unsigned usage, + const struct pipe_box *box, + const void *data, + unsigned stride, + unsigned layer_stride) +{ + struct vc4_resource *rsc = vc4_resource(prsc); + struct vc4_resource_slice *slice = &rsc->slices[level]; + + /* For a direct mapping, we can just take the u_transfer path. */ + if (!rsc->tiled || + box->depth != 1 || + (usage & PIPE_TRANSFER_DISCARD_WHOLE_RESOURCE)) { + return u_default_texture_subdata(pctx, prsc, level, usage, box, + data, stride, layer_stride); + } + + /* Otherwise, map and store the texture data directly into the tiled + * texture. + */ + void *buf; + if (usage & PIPE_TRANSFER_UNSYNCHRONIZED) + buf = vc4_bo_map_unsynchronized(rsc->bo); + else + buf = vc4_bo_map(rsc->bo); + + vc4_store_tiled_image(buf + slice->offset + + box->z * rsc->cube_map_stride, + slice->stride, + (void *)data, stride, + slice->tiling, rsc->cpp, + box); +} + +static void vc4_resource_destroy(struct pipe_screen *pscreen, struct pipe_resource *prsc) { @@ -1112,7 +1150,7 @@ vc4_resource_context_init(struct pipe_context *pctx) pctx->transfer_flush_region = u_transfer_helper_transfer_flush_region; pctx->transfer_unmap = u_transfer_helper_transfer_unmap; pctx->buffer_subdata = u_default_buffer_subdata; - pctx->texture_subdata = u_default_texture_subdata; + pctx->texture_subdata = vc4_texture_subdata; pctx->create_surface = vc4_create_surface; pctx->surface_destroy = vc4_surface_destroy; pctx->resource_copy_region = util_resource_copy_region; |