From: Marek Olšák Date: Sat, 16 Jul 2016 19:19:48 +0000 (+0200) Subject: gallium: split transfer_inline_write into buffer and texture callbacks X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=1ffe77e7bb2486ea74cda077ed2a9622b758395c;p=mesa.git gallium: split transfer_inline_write into buffer and texture callbacks to reduce the call indirections with u_resource_vtbl. The worst call tree you could get was: - u_transfer_inline_write_vtbl - u_default_transfer_inline_write - u_transfer_map_vtbl - driver_transfer_map - u_transfer_unmap_vtbl - driver_transfer_unmap That's 6 indirect calls. Some drivers only had 5. The goal is to have 1 indirect call for drivers that care. The resource type can be determined statically at most call sites. The new interface is: pipe_context::buffer_subdata(ctx, resource, usage, offset, size, data) pipe_context::texture_subdata(ctx, resource, level, usage, box, data, stride, layer_stride) v2: fix whitespace, correct ilo's behavior Reviewed-by: Nicolai Hähnle Acked-by: Roland Scheidegger --- diff --git a/src/gallium/auxiliary/postprocess/pp_mlaa.c b/src/gallium/auxiliary/postprocess/pp_mlaa.c index a3f58b52f48..502fcf169a6 100644 --- a/src/gallium/auxiliary/postprocess/pp_mlaa.c +++ b/src/gallium/auxiliary/postprocess/pp_mlaa.c @@ -62,13 +62,9 @@ static void up_consts(struct pp_queue_t *ppq) { struct pipe_context *pipe = ppq->p->pipe; - struct pipe_box box; - - u_box_2d(0, 0, sizeof(constants), 1, &box); - pipe->transfer_inline_write(pipe, ppq->constbuf, 0, PIPE_TRANSFER_WRITE, - &box, constants, sizeof(constants), - sizeof(constants)); + pipe->buffer_subdata(pipe, ppq->constbuf, PIPE_TRANSFER_WRITE, + 0, sizeof(constants), constants); } /** Run function of the MLAA filter. */ @@ -280,9 +276,9 @@ pp_jimenezmlaa_init_run(struct pp_queue_t *ppq, unsigned int n, u_box_2d(0, 0, 165, 165, &box); - ppq->p->pipe->transfer_inline_write(ppq->p->pipe, ppq->areamaptex, 0, - PIPE_TRANSFER_WRITE, &box, - areamap, 165 * 2, sizeof(areamap)); + ppq->p->pipe->texture_subdata(ppq->p->pipe, ppq->areamaptex, 0, + PIPE_TRANSFER_WRITE, &box, + areamap, 165 * 2, sizeof(areamap)); ppq->shaders[n][1] = pp_tgsi_to_state(ppq->p->pipe, offsetvs, true, "offsetvs"); diff --git a/src/gallium/auxiliary/util/u_inlines.h b/src/gallium/auxiliary/util/u_inlines.h index 207e2aa838f..07f73546ad7 100644 --- a/src/gallium/auxiliary/util/u_inlines.h +++ b/src/gallium/auxiliary/util/u_inlines.h @@ -339,7 +339,6 @@ pipe_buffer_write(struct pipe_context *pipe, unsigned size, const void *data) { - struct pipe_box box; unsigned access = PIPE_TRANSFER_WRITE; if (offset == 0 && size == buf->width0) { @@ -348,16 +347,7 @@ pipe_buffer_write(struct pipe_context *pipe, access |= PIPE_TRANSFER_DISCARD_RANGE; } - u_box_1d(offset, size, &box); - - pipe->transfer_inline_write( pipe, - buf, - 0, - access, - &box, - data, - size, - 0); + pipe->buffer_subdata(pipe, buf, access, offset, size, data); } /** @@ -372,18 +362,10 @@ pipe_buffer_write_nooverlap(struct pipe_context *pipe, unsigned offset, unsigned size, const void *data) { - struct pipe_box box; - - u_box_1d(offset, size, &box); - - pipe->transfer_inline_write(pipe, - buf, - 0, - (PIPE_TRANSFER_WRITE | - PIPE_TRANSFER_UNSYNCHRONIZED), - &box, - data, - 0, 0); + pipe->buffer_subdata(pipe, buf, + (PIPE_TRANSFER_WRITE | + PIPE_TRANSFER_UNSYNCHRONIZED), + offset, size, data); } diff --git a/src/gallium/auxiliary/util/u_transfer.c b/src/gallium/auxiliary/util/u_transfer.c index 0610535cd2c..82cf68db958 100644 --- a/src/gallium/auxiliary/util/u_transfer.c +++ b/src/gallium/auxiliary/util/u_transfer.c @@ -4,34 +4,58 @@ #include "util/u_transfer.h" #include "util/u_memory.h" -/* One-shot transfer operation with data supplied in a user - * pointer. XXX: strides?? - */ -void u_default_transfer_inline_write( struct pipe_context *pipe, - struct pipe_resource *resource, - unsigned level, - unsigned usage, - const struct pipe_box *box, - const void *data, - unsigned stride, - unsigned layer_stride) +void u_default_buffer_subdata(struct pipe_context *pipe, + struct pipe_resource *resource, + unsigned usage, unsigned offset, + unsigned size, const void *data) { struct pipe_transfer *transfer = NULL; + struct pipe_box box; uint8_t *map = NULL; assert(!(usage & PIPE_TRANSFER_READ)); - /* the write flag is implicit by the nature of transfer_inline_write */ + /* the write flag is implicit by the nature of buffer_subdata */ usage |= PIPE_TRANSFER_WRITE; - /* transfer_inline_write implicitly discards the rewritten buffer range */ - if (resource->target == PIPE_BUFFER && - box->x == 0 && box->width == resource->width0) { + /* buffer_subdata implicitly discards the rewritten buffer range */ + if (offset == 0 && size == resource->width0) { usage |= PIPE_TRANSFER_DISCARD_WHOLE_RESOURCE; } else { usage |= PIPE_TRANSFER_DISCARD_RANGE; } + u_box_1d(offset, size, &box); + + map = pipe->transfer_map(pipe, resource, 0, usage, &box, &transfer); + if (!map) + return; + + memcpy(map, data, size); + pipe_transfer_unmap(pipe, transfer); +} + +void u_default_texture_subdata(struct pipe_context *pipe, + struct pipe_resource *resource, + unsigned level, + unsigned usage, + const struct pipe_box *box, + const void *data, + unsigned stride, + unsigned layer_stride) +{ + struct pipe_transfer *transfer = NULL; + const uint8_t *src_data = data; + uint8_t *map = NULL; + + assert(!(usage & PIPE_TRANSFER_READ)); + + /* the write flag is implicit by the nature of texture_subdata */ + usage |= PIPE_TRANSFER_WRITE; + + /* texture_subdata implicitly discards the rewritten buffer range */ + usage |= PIPE_TRANSFER_DISCARD_RANGE; + map = pipe->transfer_map(pipe, resource, level, @@ -40,28 +64,18 @@ void u_default_transfer_inline_write( struct pipe_context *pipe, if (!map) return; - if (resource->target == PIPE_BUFFER) { - assert(box->height == 1); - assert(box->depth == 1); - - memcpy(map, data, box->width); - } - else { - const uint8_t *src_data = data; - - util_copy_box(map, - resource->format, - transfer->stride, /* bytes */ - transfer->layer_stride, /* bytes */ - 0, 0, 0, - box->width, - box->height, - box->depth, - src_data, - stride, /* bytes */ - layer_stride, /* bytes */ - 0, 0, 0); - } + util_copy_box(map, + resource->format, + transfer->stride, /* bytes */ + transfer->layer_stride, /* bytes */ + 0, 0, 0, + box->width, + box->height, + box->depth, + src_data, + stride, /* bytes */ + layer_stride, /* bytes */ + 0, 0, 0); pipe_transfer_unmap(pipe, transfer); } @@ -138,27 +152,3 @@ void u_transfer_unmap_vtbl( struct pipe_context *pipe, struct u_resource *ur = u_resource(transfer->resource); ur->vtbl->transfer_unmap(pipe, transfer); } - -void u_transfer_inline_write_vtbl( struct pipe_context *pipe, - struct pipe_resource *resource, - unsigned level, - unsigned usage, - const struct pipe_box *box, - const void *data, - unsigned stride, - unsigned layer_stride) -{ - struct u_resource *ur = u_resource(resource); - ur->vtbl->transfer_inline_write(pipe, - resource, - level, - usage, - box, - data, - stride, - layer_stride); -} - - - - diff --git a/src/gallium/auxiliary/util/u_transfer.h b/src/gallium/auxiliary/util/u_transfer.h index 660dc161d33..7f680bc6582 100644 --- a/src/gallium/auxiliary/util/u_transfer.h +++ b/src/gallium/auxiliary/util/u_transfer.h @@ -14,14 +14,19 @@ boolean u_default_resource_get_handle(struct pipe_screen *screen, struct pipe_resource *resource, struct winsys_handle *handle); -void u_default_transfer_inline_write( struct pipe_context *pipe, - struct pipe_resource *resource, - unsigned level, - unsigned usage, - const struct pipe_box *box, - const void *data, - unsigned stride, - unsigned layer_stride); +void u_default_buffer_subdata(struct pipe_context *pipe, + struct pipe_resource *resource, + unsigned usage, unsigned offset, + unsigned size, const void *data); + +void u_default_texture_subdata(struct pipe_context *pipe, + struct pipe_resource *resource, + unsigned level, + unsigned usage, + const struct pipe_box *box, + const void *data, + unsigned stride, + unsigned layer_stride); void u_default_transfer_flush_region( struct pipe_context *pipe, struct pipe_transfer *transfer, @@ -58,15 +63,6 @@ struct u_resource_vtbl { void (*transfer_unmap)( struct pipe_context *, struct pipe_transfer *transfer ); - - void (*transfer_inline_write)( struct pipe_context *pipe, - struct pipe_resource *resource, - unsigned level, - unsigned usage, - const struct pipe_box *box, - const void *data, - unsigned stride, - unsigned layer_stride); }; @@ -98,13 +94,4 @@ void u_transfer_flush_region_vtbl( struct pipe_context *pipe, void u_transfer_unmap_vtbl( struct pipe_context *rm_ctx, struct pipe_transfer *transfer ); -void u_transfer_inline_write_vtbl( struct pipe_context *rm_ctx, - struct pipe_resource *resource, - unsigned level, - unsigned usage, - const struct pipe_box *box, - const void *data, - unsigned stride, - unsigned layer_stride); - #endif diff --git a/src/gallium/docs/source/context.rst b/src/gallium/docs/source/context.rst index 8fb621bcac3..e646ea02f78 100644 --- a/src/gallium/docs/source/context.rst +++ b/src/gallium/docs/source/context.rst @@ -538,8 +538,9 @@ to the transfer object remains unchanged (i.e. it can be non-NULL). the transfer object. The pointer into the resource should be considered invalid and discarded. -``transfer_inline_write`` performs a simplified transfer for simple writes. -Basically transfer_map, data write, and transfer_unmap all in one. +``texture_subdata`` and ``buffer_subdata`` perform a simplified +transfer for simple writes. Basically transfer_map, data write, and +transfer_unmap all in one. The box parameter to some of these functions defines a 1D, 2D or 3D diff --git a/src/gallium/drivers/ddebug/dd_context.c b/src/gallium/drivers/ddebug/dd_context.c index 98475b9fe99..c0b2b3ddd7e 100644 --- a/src/gallium/drivers/ddebug/dd_context.c +++ b/src/gallium/drivers/ddebug/dd_context.c @@ -599,17 +599,28 @@ dd_context_transfer_unmap(struct pipe_context *_pipe, } static void -dd_context_transfer_inline_write(struct pipe_context *_pipe, - struct pipe_resource *resource, - unsigned level, unsigned usage, - const struct pipe_box *box, - const void *data, unsigned stride, - unsigned layer_stride) +dd_context_buffer_subdata(struct pipe_context *_pipe, + struct pipe_resource *resource, + unsigned usage, unsigned offset, + unsigned size, const void *data) +{ + struct pipe_context *pipe = dd_context(_pipe)->pipe; + + pipe->buffer_subdata(pipe, resource, usage, offset, size, data); +} + +static void +dd_context_texture_subdata(struct pipe_context *_pipe, + struct pipe_resource *resource, + unsigned level, unsigned usage, + const struct pipe_box *box, + const void *data, unsigned stride, + unsigned layer_stride) { struct pipe_context *pipe = dd_context(_pipe)->pipe; - pipe->transfer_inline_write(pipe, resource, level, usage, box, data, - stride, layer_stride); + pipe->texture_subdata(pipe, resource, level, usage, box, data, + stride, layer_stride); } @@ -767,7 +778,8 @@ dd_context_create(struct dd_screen *dscreen, struct pipe_context *pipe) CTX_INIT(transfer_map); CTX_INIT(transfer_flush_region); CTX_INIT(transfer_unmap); - CTX_INIT(transfer_inline_write); + CTX_INIT(buffer_subdata); + CTX_INIT(texture_subdata); CTX_INIT(texture_barrier); CTX_INIT(memory_barrier); /* create_video_codec */ diff --git a/src/gallium/drivers/freedreno/freedreno_resource.c b/src/gallium/drivers/freedreno/freedreno_resource.c index ded81474331..96d1d88eeed 100644 --- a/src/gallium/drivers/freedreno/freedreno_resource.c +++ b/src/gallium/drivers/freedreno/freedreno_resource.c @@ -476,7 +476,6 @@ static const struct u_resource_vtbl fd_resource_vtbl = { .transfer_map = fd_resource_transfer_map, .transfer_flush_region = fd_resource_transfer_flush_region, .transfer_unmap = fd_resource_transfer_unmap, - .transfer_inline_write = u_default_transfer_inline_write, }; static uint32_t @@ -864,7 +863,8 @@ fd_resource_context_init(struct pipe_context *pctx) pctx->transfer_map = u_transfer_map_vtbl; pctx->transfer_flush_region = u_transfer_flush_region_vtbl; pctx->transfer_unmap = u_transfer_unmap_vtbl; - pctx->transfer_inline_write = u_transfer_inline_write_vtbl; + pctx->buffer_subdata = u_default_buffer_subdata; + pctx->texture_subdata = u_default_texture_subdata; pctx->create_surface = fd_create_surface; pctx->surface_destroy = fd_surface_destroy; pctx->resource_copy_region = fd_resource_copy_region; diff --git a/src/gallium/drivers/i915/i915_resource.c b/src/gallium/drivers/i915/i915_resource.c index 3ffb0b7a5d2..8e5572b4cd4 100644 --- a/src/gallium/drivers/i915/i915_resource.c +++ b/src/gallium/drivers/i915/i915_resource.c @@ -39,7 +39,8 @@ i915_init_resource_functions(struct i915_context *i915 ) i915->base.transfer_map = u_transfer_map_vtbl; i915->base.transfer_flush_region = u_transfer_flush_region_vtbl; i915->base.transfer_unmap = u_transfer_unmap_vtbl; - i915->base.transfer_inline_write = u_transfer_inline_write_vtbl; + i915->base.buffer_subdata = i915_buffer_subdata; + i915->base.texture_subdata = u_default_texture_subdata; } void diff --git a/src/gallium/drivers/i915/i915_resource.h b/src/gallium/drivers/i915/i915_resource.h index 77fe8b70f79..0afd09501c6 100644 --- a/src/gallium/drivers/i915/i915_resource.h +++ b/src/gallium/drivers/i915/i915_resource.h @@ -129,4 +129,10 @@ struct pipe_resource * i915_buffer_create(struct pipe_screen *screen, const struct pipe_resource *template); +void +i915_buffer_subdata(struct pipe_context *rm_ctx, + struct pipe_resource *resource, + unsigned usage, unsigned offset, + unsigned size, const void *data); + #endif /* I915_RESOURCE_H */ diff --git a/src/gallium/drivers/i915/i915_resource_buffer.c b/src/gallium/drivers/i915/i915_resource_buffer.c index fb2e53b014f..24c954cae34 100644 --- a/src/gallium/drivers/i915/i915_resource_buffer.c +++ b/src/gallium/drivers/i915/i915_resource_buffer.c @@ -92,21 +92,15 @@ i915_buffer_transfer_unmap(struct pipe_context *pipe, util_slab_free(&i915->transfer_pool, transfer); } -static void -i915_buffer_transfer_inline_write( struct pipe_context *rm_ctx, - struct pipe_resource *resource, - unsigned level, - unsigned usage, - const struct pipe_box *box, - const void *data, - unsigned stride, - unsigned layer_stride) +void +i915_buffer_subdata(struct pipe_context *rm_ctx, + struct pipe_resource *resource, + unsigned usage, unsigned offset, + unsigned size, const void *data) { struct i915_buffer *buffer = i915_buffer(resource); - memcpy(buffer->data + box->x, - data, - box->width); + memcpy(buffer->data + offset, data, size); } @@ -117,7 +111,6 @@ struct u_resource_vtbl i915_buffer_vtbl = i915_buffer_transfer_map, /* transfer_map */ u_default_transfer_flush_region, /* transfer_flush_region */ i915_buffer_transfer_unmap, /* transfer_unmap */ - i915_buffer_transfer_inline_write /* transfer_inline_write */ }; diff --git a/src/gallium/drivers/i915/i915_resource_texture.c b/src/gallium/drivers/i915/i915_resource_texture.c index af9d97a8acc..f77bbfde181 100644 --- a/src/gallium/drivers/i915/i915_resource_texture.c +++ b/src/gallium/drivers/i915/i915_resource_texture.c @@ -818,7 +818,7 @@ i915_texture_transfer_unmap(struct pipe_context *pipe, } #if 0 -static void i915_transfer_inline_write( struct pipe_context *pipe, +static void i915_texture_subdata(struct pipe_context *pipe, struct pipe_resource *resource, unsigned level, unsigned usage, @@ -913,7 +913,6 @@ struct u_resource_vtbl i915_texture_vtbl = i915_texture_transfer_map, /* transfer_map */ u_default_transfer_flush_region, /* transfer_flush_region */ i915_texture_transfer_unmap, /* transfer_unmap */ - u_default_transfer_inline_write /* transfer_inline_write */ }; diff --git a/src/gallium/drivers/ilo/ilo_transfer.c b/src/gallium/drivers/ilo/ilo_transfer.c index 5abd3bebf68..d243e38fbe2 100644 --- a/src/gallium/drivers/ilo/ilo_transfer.c +++ b/src/gallium/drivers/ilo/ilo_transfer.c @@ -1236,32 +1236,15 @@ ilo_transfer_map(struct pipe_context *pipe, return ptr; } -static void -ilo_transfer_inline_write(struct pipe_context *pipe, - struct pipe_resource *res, - unsigned level, - unsigned usage, - const struct pipe_box *box, - const void *data, - unsigned stride, - unsigned layer_stride) +static void ilo_buffer_subdata(struct pipe_context *pipe, + struct pipe_resource *resource, + unsigned usage, unsigned offset, + unsigned size, const void *data) { - if (likely(res->target == PIPE_BUFFER) && - !(usage & PIPE_TRANSFER_UNSYNCHRONIZED)) { - /* they should specify just an offset and a size */ - assert(level == 0); - assert(box->y == 0); - assert(box->z == 0); - assert(box->height == 1); - assert(box->depth == 1); - - buf_pwrite(ilo_context(pipe), res, - usage, box->x, box->width, data); - } - else { - u_default_transfer_inline_write(pipe, res, - level, usage, box, data, stride, layer_stride); - } + if (usage & PIPE_TRANSFER_UNSYNCHRONIZED) + u_default_buffer_subdata(pipe, resource, usage, offset, size, data); + else + buf_pwrite(ilo_context(pipe), resource, usage, offset, size, data); } /** @@ -1273,5 +1256,6 @@ ilo_init_transfer_functions(struct ilo_context *ilo) ilo->base.transfer_map = ilo_transfer_map; ilo->base.transfer_flush_region = ilo_transfer_flush_region; ilo->base.transfer_unmap = ilo_transfer_unmap; - ilo->base.transfer_inline_write = ilo_transfer_inline_write; + ilo->base.buffer_subdata = ilo_buffer_subdata; + ilo->base.texture_subdata = u_default_texture_subdata; } diff --git a/src/gallium/drivers/llvmpipe/lp_texture.c b/src/gallium/drivers/llvmpipe/lp_texture.c index 36f1c6b1a20..0d4c4efe0b9 100644 --- a/src/gallium/drivers/llvmpipe/lp_texture.c +++ b/src/gallium/drivers/llvmpipe/lp_texture.c @@ -816,5 +816,6 @@ llvmpipe_init_context_resource_funcs(struct pipe_context *pipe) pipe->transfer_unmap = llvmpipe_transfer_unmap; pipe->transfer_flush_region = u_default_transfer_flush_region; - pipe->transfer_inline_write = u_default_transfer_inline_write; + pipe->buffer_subdata = u_default_buffer_subdata; + pipe->texture_subdata = u_default_texture_subdata; } diff --git a/src/gallium/drivers/noop/noop_pipe.c b/src/gallium/drivers/noop/noop_pipe.c index 99e5f1ae1a9..097ff21c38b 100644 --- a/src/gallium/drivers/noop/noop_pipe.c +++ b/src/gallium/drivers/noop/noop_pipe.c @@ -192,14 +192,21 @@ static void noop_transfer_unmap(struct pipe_context *pipe, FREE(transfer); } -static void noop_transfer_inline_write(struct pipe_context *pipe, - struct pipe_resource *resource, - unsigned level, - unsigned usage, - const struct pipe_box *box, - const void *data, - unsigned stride, - unsigned layer_stride) +static void noop_buffer_subdata(struct pipe_context *pipe, + struct pipe_resource *resource, + unsigned usage, unsigned offset, + unsigned size, const void *data) +{ +} + +static void noop_texture_subdata(struct pipe_context *pipe, + struct pipe_resource *resource, + unsigned level, + unsigned usage, + const struct pipe_box *box, + const void *data, + unsigned stride, + unsigned layer_stride) { } @@ -294,7 +301,8 @@ static struct pipe_context *noop_create_context(struct pipe_screen *screen, ctx->transfer_map = noop_transfer_map; ctx->transfer_flush_region = noop_transfer_flush_region; ctx->transfer_unmap = noop_transfer_unmap; - ctx->transfer_inline_write = noop_transfer_inline_write; + ctx->buffer_subdata = noop_buffer_subdata; + ctx->texture_subdata = noop_texture_subdata; noop_init_state_functions(ctx); return ctx; diff --git a/src/gallium/drivers/nouveau/nouveau_buffer.c b/src/gallium/drivers/nouveau/nouveau_buffer.c index 7c1421b5815..17052b26e9c 100644 --- a/src/gallium/drivers/nouveau/nouveau_buffer.c +++ b/src/gallium/drivers/nouveau/nouveau_buffer.c @@ -634,7 +634,6 @@ const struct u_resource_vtbl nouveau_buffer_vtbl = nouveau_buffer_transfer_map, /* transfer_map */ nouveau_buffer_transfer_flush_region, /* transfer_flush_region */ nouveau_buffer_transfer_unmap, /* transfer_unmap */ - u_default_transfer_inline_write /* transfer_inline_write */ }; struct pipe_resource * diff --git a/src/gallium/drivers/nouveau/nv30/nv30_miptree.c b/src/gallium/drivers/nouveau/nv30/nv30_miptree.c index c6f69650068..165b8f29b4b 100644 --- a/src/gallium/drivers/nouveau/nv30/nv30_miptree.c +++ b/src/gallium/drivers/nouveau/nv30/nv30_miptree.c @@ -358,7 +358,6 @@ const struct u_resource_vtbl nv30_miptree_vtbl = { nv30_miptree_transfer_map, u_default_transfer_flush_region, nv30_miptree_transfer_unmap, - u_default_transfer_inline_write }; struct pipe_resource * diff --git a/src/gallium/drivers/nouveau/nv30/nv30_resource.c b/src/gallium/drivers/nouveau/nv30/nv30_resource.c index 4d215d2e616..6238a2384cb 100644 --- a/src/gallium/drivers/nouveau/nv30/nv30_resource.c +++ b/src/gallium/drivers/nouveau/nv30/nv30_resource.c @@ -90,7 +90,8 @@ nv30_resource_init(struct pipe_context *pipe) pipe->transfer_map = u_transfer_map_vtbl; pipe->transfer_flush_region = u_transfer_flush_region_vtbl; pipe->transfer_unmap = u_transfer_unmap_vtbl; - pipe->transfer_inline_write = u_transfer_inline_write_vtbl; + pipe->buffer_subdata = u_default_buffer_subdata; + pipe->texture_subdata = u_default_texture_subdata; pipe->create_surface = nv30_miptree_surface_new; pipe->surface_destroy = nv30_miptree_surface_del; pipe->resource_copy_region = nv30_resource_copy_region; diff --git a/src/gallium/drivers/nouveau/nv50/nv50_miptree.c b/src/gallium/drivers/nouveau/nv50/nv50_miptree.c index 745011977b3..f2e304fde62 100644 --- a/src/gallium/drivers/nouveau/nv50/nv50_miptree.c +++ b/src/gallium/drivers/nouveau/nv50/nv50_miptree.c @@ -204,7 +204,6 @@ const struct u_resource_vtbl nv50_miptree_vtbl = nv50_miptree_transfer_map, /* transfer_map */ u_default_transfer_flush_region, /* transfer_flush_region */ nv50_miptree_transfer_unmap, /* transfer_unmap */ - u_default_transfer_inline_write /* transfer_inline_write */ }; static inline bool diff --git a/src/gallium/drivers/nouveau/nv50/nv50_resource.c b/src/gallium/drivers/nouveau/nv50/nv50_resource.c index b090a30aed6..aed8c6241d4 100644 --- a/src/gallium/drivers/nouveau/nv50/nv50_resource.c +++ b/src/gallium/drivers/nouveau/nv50/nv50_resource.c @@ -97,7 +97,8 @@ nv50_init_resource_functions(struct pipe_context *pcontext) pcontext->transfer_map = u_transfer_map_vtbl; pcontext->transfer_flush_region = u_transfer_flush_region_vtbl; pcontext->transfer_unmap = u_transfer_unmap_vtbl; - pcontext->transfer_inline_write = u_transfer_inline_write_vtbl; + pcontext->buffer_subdata = u_default_buffer_subdata; + pcontext->texture_subdata = u_default_texture_subdata; pcontext->create_surface = nv50_surface_create; pcontext->surface_destroy = nv50_surface_destroy; pcontext->invalidate_resource = nv50_invalidate_resource; diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_miptree.c b/src/gallium/drivers/nouveau/nvc0/nvc0_miptree.c index ed1ac48315b..27674f72a7c 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_miptree.c +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_miptree.c @@ -240,7 +240,6 @@ const struct u_resource_vtbl nvc0_miptree_vtbl = nvc0_miptree_transfer_map, /* transfer_map */ u_default_transfer_flush_region, /* transfer_flush_region */ nvc0_miptree_transfer_unmap, /* transfer_unmap */ - u_default_transfer_inline_write /* transfer_inline_write */ }; struct pipe_resource * diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_resource.c b/src/gallium/drivers/nouveau/nvc0/nvc0_resource.c index 0aee5890fd8..9bafe3d835d 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_resource.c +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_resource.c @@ -49,7 +49,8 @@ nvc0_init_resource_functions(struct pipe_context *pcontext) pcontext->transfer_map = u_transfer_map_vtbl; pcontext->transfer_flush_region = u_transfer_flush_region_vtbl; pcontext->transfer_unmap = u_transfer_unmap_vtbl; - pcontext->transfer_inline_write = u_transfer_inline_write_vtbl; + pcontext->buffer_subdata = u_default_buffer_subdata; + pcontext->texture_subdata = u_default_texture_subdata; pcontext->create_surface = nvc0_surface_create; pcontext->surface_destroy = nv50_surface_destroy; pcontext->invalidate_resource = nv50_invalidate_resource; diff --git a/src/gallium/drivers/r300/r300_resource.c b/src/gallium/drivers/r300/r300_resource.c index 701fd249d30..3da5fefef6d 100644 --- a/src/gallium/drivers/r300/r300_resource.c +++ b/src/gallium/drivers/r300/r300_resource.c @@ -43,7 +43,8 @@ void r300_init_resource_functions(struct r300_context *r300) r300->context.transfer_map = u_transfer_map_vtbl; r300->context.transfer_flush_region = u_default_transfer_flush_region; r300->context.transfer_unmap = u_transfer_unmap_vtbl; - r300->context.transfer_inline_write = u_default_transfer_inline_write; + r300->context.buffer_subdata = u_default_buffer_subdata; + r300->context.texture_subdata = u_default_texture_subdata; r300->context.create_surface = r300_create_surface; r300->context.surface_destroy = r300_surface_destroy; } diff --git a/src/gallium/drivers/r300/r300_screen_buffer.c b/src/gallium/drivers/r300/r300_screen_buffer.c index 5b69b24f59b..069e9fdc6b0 100644 --- a/src/gallium/drivers/r300/r300_screen_buffer.c +++ b/src/gallium/drivers/r300/r300_screen_buffer.c @@ -152,7 +152,6 @@ static const struct u_resource_vtbl r300_buffer_vtbl = r300_buffer_transfer_map, /* transfer_map */ NULL, /* transfer_flush_region */ r300_buffer_transfer_unmap, /* transfer_unmap */ - NULL /* transfer_inline_write */ }; struct pipe_resource *r300_buffer_create(struct pipe_screen *screen, diff --git a/src/gallium/drivers/r300/r300_texture.c b/src/gallium/drivers/r300/r300_texture.c index 14372da62e4..2fc93c2dfd6 100644 --- a/src/gallium/drivers/r300/r300_texture.c +++ b/src/gallium/drivers/r300/r300_texture.c @@ -1058,7 +1058,6 @@ static const struct u_resource_vtbl r300_texture_vtbl = r300_texture_transfer_map, /* transfer_map */ NULL, /* transfer_flush_region */ r300_texture_transfer_unmap, /* transfer_unmap */ - NULL /* transfer_inline_write */ }; /* The common texture constructor. */ diff --git a/src/gallium/drivers/r600/evergreen_compute.c b/src/gallium/drivers/r600/evergreen_compute.c index b711786da29..292b5e32afd 100644 --- a/src/gallium/drivers/r600/evergreen_compute.c +++ b/src/gallium/drivers/r600/evergreen_compute.c @@ -977,18 +977,6 @@ static void r600_compute_global_transfer_flush_region(struct pipe_context *ctx, assert(0 && "TODO"); } -static void r600_compute_global_transfer_inline_write(struct pipe_context *pipe, - struct pipe_resource *resource, - unsigned level, - unsigned usage, - const struct pipe_box *box, - const void *data, - unsigned stride, - unsigned layer_stride) -{ - assert(0 && "TODO"); -} - static void r600_compute_global_buffer_destroy(struct pipe_screen *screen, struct pipe_resource *res) { @@ -1014,7 +1002,6 @@ static const struct u_resource_vtbl r600_global_buffer_vtbl = r600_compute_global_transfer_map, /* transfer_map */ r600_compute_global_transfer_flush_region,/* transfer_flush_region */ r600_compute_global_transfer_unmap, /* transfer_unmap */ - r600_compute_global_transfer_inline_write /* transfer_inline_write */ }; struct pipe_resource *r600_compute_global_buffer_create(struct pipe_screen *screen, diff --git a/src/gallium/drivers/radeon/r600_buffer_common.c b/src/gallium/drivers/radeon/r600_buffer_common.c index 9583d70489e..b5c8697ac52 100644 --- a/src/gallium/drivers/radeon/r600_buffer_common.c +++ b/src/gallium/drivers/radeon/r600_buffer_common.c @@ -456,7 +456,6 @@ static const struct u_resource_vtbl r600_buffer_vtbl = r600_buffer_transfer_map, /* transfer_map */ r600_buffer_flush_region, /* transfer_flush_region */ r600_buffer_transfer_unmap, /* transfer_unmap */ - NULL /* transfer_inline_write */ }; static struct r600_resource * diff --git a/src/gallium/drivers/radeon/r600_pipe_common.c b/src/gallium/drivers/radeon/r600_pipe_common.c index 647832b5f6e..4ef58cae282 100644 --- a/src/gallium/drivers/radeon/r600_pipe_common.c +++ b/src/gallium/drivers/radeon/r600_pipe_common.c @@ -422,8 +422,9 @@ bool r600_common_context_init(struct r600_common_context *rctx, rctx->b.transfer_map = u_transfer_map_vtbl; rctx->b.transfer_flush_region = u_transfer_flush_region_vtbl; rctx->b.transfer_unmap = u_transfer_unmap_vtbl; - rctx->b.transfer_inline_write = u_default_transfer_inline_write; - rctx->b.memory_barrier = r600_memory_barrier; + rctx->b.buffer_subdata = u_default_buffer_subdata; + rctx->b.texture_subdata = u_default_texture_subdata; + rctx->b.memory_barrier = r600_memory_barrier; rctx->b.flush = r600_flush_from_st; rctx->b.set_debug_callback = r600_set_debug_callback; diff --git a/src/gallium/drivers/radeon/r600_texture.c b/src/gallium/drivers/radeon/r600_texture.c index 7763f812141..f7c2f80ec3c 100644 --- a/src/gallium/drivers/radeon/r600_texture.c +++ b/src/gallium/drivers/radeon/r600_texture.c @@ -1628,7 +1628,6 @@ static const struct u_resource_vtbl r600_texture_vtbl = r600_texture_transfer_map, /* transfer_map */ u_default_transfer_flush_region, /* transfer_flush_region */ r600_texture_transfer_unmap, /* transfer_unmap */ - NULL /* transfer_inline_write */ }; struct pipe_surface *r600_create_surface_custom(struct pipe_context *pipe, diff --git a/src/gallium/drivers/rbug/rbug_context.c b/src/gallium/drivers/rbug/rbug_context.c index 77f09b001a8..83914d3615b 100644 --- a/src/gallium/drivers/rbug/rbug_context.c +++ b/src/gallium/drivers/rbug/rbug_context.c @@ -1141,14 +1141,31 @@ rbug_context_transfer_unmap(struct pipe_context *_context, static void -rbug_context_transfer_inline_write(struct pipe_context *_context, - struct pipe_resource *_resource, - unsigned level, - unsigned usage, - const struct pipe_box *box, - const void *data, - unsigned stride, - unsigned layer_stride) +rbug_context_buffer_subdata(struct pipe_context *_context, + struct pipe_resource *_resource, + unsigned usage, unsigned offset, + unsigned size, const void *data) +{ + struct rbug_context *rb_pipe = rbug_context(_context); + struct rbug_resource *rb_resource = rbug_resource(_resource); + struct pipe_context *context = rb_pipe->pipe; + struct pipe_resource *resource = rb_resource->resource; + + pipe_mutex_lock(rb_pipe->call_mutex); + context->buffer_subdata(context, resource, usage, offset, size, data); + pipe_mutex_unlock(rb_pipe->call_mutex); +} + + +static void +rbug_context_texture_subdata(struct pipe_context *_context, + struct pipe_resource *_resource, + unsigned level, + unsigned usage, + const struct pipe_box *box, + const void *data, + unsigned stride, + unsigned layer_stride) { struct rbug_context *rb_pipe = rbug_context(_context); struct rbug_resource *rb_resource = rbug_resource(_resource); @@ -1156,14 +1173,14 @@ rbug_context_transfer_inline_write(struct pipe_context *_context, struct pipe_resource *resource = rb_resource->resource; pipe_mutex_lock(rb_pipe->call_mutex); - context->transfer_inline_write(context, - resource, - level, - usage, - box, - data, - stride, - layer_stride); + context->texture_subdata(context, + resource, + level, + usage, + box, + data, + stride, + layer_stride); pipe_mutex_unlock(rb_pipe->call_mutex); } @@ -1252,7 +1269,8 @@ rbug_context_create(struct pipe_screen *_screen, struct pipe_context *pipe) rb_pipe->base.transfer_map = rbug_context_transfer_map; rb_pipe->base.transfer_unmap = rbug_context_transfer_unmap; rb_pipe->base.transfer_flush_region = rbug_context_transfer_flush_region; - rb_pipe->base.transfer_inline_write = rbug_context_transfer_inline_write; + rb_pipe->base.buffer_subdata = rbug_context_buffer_subdata; + rb_pipe->base.texture_subdata = rbug_context_texture_subdata; rb_pipe->pipe = pipe; diff --git a/src/gallium/drivers/softpipe/sp_texture.c b/src/gallium/drivers/softpipe/sp_texture.c index 64666fee03f..9c64397d0b9 100644 --- a/src/gallium/drivers/softpipe/sp_texture.c +++ b/src/gallium/drivers/softpipe/sp_texture.c @@ -514,7 +514,8 @@ softpipe_init_texture_funcs(struct pipe_context *pipe) pipe->transfer_unmap = softpipe_transfer_unmap; pipe->transfer_flush_region = u_default_transfer_flush_region; - pipe->transfer_inline_write = u_default_transfer_inline_write; + pipe->buffer_subdata = u_default_buffer_subdata; + pipe->texture_subdata = u_default_texture_subdata; pipe->create_surface = softpipe_create_surface; pipe->surface_destroy = softpipe_surface_destroy; diff --git a/src/gallium/drivers/svga/svga_resource.c b/src/gallium/drivers/svga/svga_resource.c index 264ac335405..6a297a2ae02 100644 --- a/src/gallium/drivers/svga/svga_resource.c +++ b/src/gallium/drivers/svga/svga_resource.c @@ -107,7 +107,8 @@ svga_init_resource_functions(struct svga_context *svga) svga->pipe.transfer_map = u_transfer_map_vtbl; svga->pipe.transfer_flush_region = u_transfer_flush_region_vtbl; svga->pipe.transfer_unmap = u_transfer_unmap_vtbl; - svga->pipe.transfer_inline_write = u_transfer_inline_write_vtbl; + svga->pipe.buffer_subdata = u_default_buffer_subdata; + svga->pipe.texture_subdata = u_default_texture_subdata; if (svga_have_vgpu10(svga)) { svga->pipe.generate_mipmap = svga_texture_generate_mipmap; diff --git a/src/gallium/drivers/svga/svga_resource_buffer.c b/src/gallium/drivers/svga/svga_resource_buffer.c index a92a5c11904..68ce103f750 100644 --- a/src/gallium/drivers/svga/svga_resource_buffer.c +++ b/src/gallium/drivers/svga/svga_resource_buffer.c @@ -369,7 +369,6 @@ struct u_resource_vtbl svga_buffer_vtbl = svga_buffer_transfer_map, /* transfer_map */ svga_buffer_transfer_flush_region, /* transfer_flush_region */ svga_buffer_transfer_unmap, /* transfer_unmap */ - u_default_transfer_inline_write /* transfer_inline_write */ }; diff --git a/src/gallium/drivers/svga/svga_resource_texture.c b/src/gallium/drivers/svga/svga_resource_texture.c index 9e1aaabd18c..230221a3867 100644 --- a/src/gallium/drivers/svga/svga_resource_texture.c +++ b/src/gallium/drivers/svga/svga_resource_texture.c @@ -779,7 +779,6 @@ struct u_resource_vtbl svga_texture_vtbl = svga_texture_transfer_map, /* transfer_map */ u_default_transfer_flush_region, /* transfer_flush_region */ svga_texture_transfer_unmap, /* transfer_unmap */ - u_default_transfer_inline_write /* transfer_inline_write */ }; diff --git a/src/gallium/drivers/swr/swr_context.cpp b/src/gallium/drivers/swr/swr_context.cpp index 1f3a14cb9c8..1083c9de194 100644 --- a/src/gallium/drivers/swr/swr_context.cpp +++ b/src/gallium/drivers/swr/swr_context.cpp @@ -376,7 +376,8 @@ swr_create_context(struct pipe_screen *p_screen, void *priv, unsigned flags) ctx->pipe.transfer_unmap = swr_transfer_unmap; ctx->pipe.transfer_flush_region = u_default_transfer_flush_region; - ctx->pipe.transfer_inline_write = u_default_transfer_inline_write; + ctx->pipe.buffer_subdata = u_default_buffer_subdata; + ctx->pipe.texture_subdata = u_default_texture_subdata; ctx->pipe.resource_copy_region = swr_resource_copy; ctx->pipe.render_condition = swr_render_condition; diff --git a/src/gallium/drivers/trace/tr_context.c b/src/gallium/drivers/trace/tr_context.c index c1ad991eede..65d7f4eca79 100644 --- a/src/gallium/drivers/trace/tr_context.c +++ b/src/gallium/drivers/trace/tr_context.c @@ -1470,7 +1470,7 @@ trace_context_transfer_map(struct pipe_context *_context, /* * Map and transfers can't be serialized so we convert all write transfers - * to transfer_inline_write and ignore read transfers. + * to texture/buffer_subdata and ignore read transfers. */ map = context->transfer_map(context, texture, level, usage, box, &result); @@ -1512,7 +1512,7 @@ trace_context_transfer_unmap(struct pipe_context *_context, if (tr_trans->map) { /* - * Fake a transfer_inline_write + * Fake a texture/buffer_subdata */ struct pipe_resource *resource = transfer->resource; @@ -1522,7 +1522,10 @@ trace_context_transfer_unmap(struct pipe_context *_context, unsigned stride = transfer->stride; unsigned layer_stride = transfer->layer_stride; - trace_dump_call_begin("pipe_context", "transfer_inline_write"); + if (resource->target == PIPE_BUFFER) + trace_dump_call_begin("pipe_context", "buffer_subdata"); + else + trace_dump_call_begin("pipe_context", "texture_subdata"); trace_dump_arg(ptr, context); trace_dump_arg(ptr, resource); @@ -1552,14 +1555,47 @@ trace_context_transfer_unmap(struct pipe_context *_context, static void -trace_context_transfer_inline_write(struct pipe_context *_context, - struct pipe_resource *_resource, - unsigned level, - unsigned usage, - const struct pipe_box *box, - const void *data, - unsigned stride, - unsigned layer_stride) +trace_context_buffer_subdata(struct pipe_context *_context, + struct pipe_resource *_resource, + unsigned usage, unsigned offset, + unsigned size, const void *data) +{ + struct trace_context *tr_context = trace_context(_context); + struct trace_resource *tr_res = trace_resource(_resource); + struct pipe_context *context = tr_context->pipe; + struct pipe_resource *resource = tr_res->resource; + struct pipe_box box; + + assert(resource->screen == context->screen); + + trace_dump_call_begin("pipe_context", "buffer_subdata"); + + trace_dump_arg(ptr, context); + trace_dump_arg(ptr, resource); + trace_dump_arg(uint, usage); + trace_dump_arg(uint, offset); + trace_dump_arg(uint, size); + + trace_dump_arg_begin("data"); + u_box_1d(offset, size, &box); + trace_dump_box_bytes(data, resource, &box, 0, 0); + trace_dump_arg_end(); + + trace_dump_call_end(); + + context->buffer_subdata(context, resource, usage, offset, size, data); +} + + +static void +trace_context_texture_subdata(struct pipe_context *_context, + struct pipe_resource *_resource, + unsigned level, + unsigned usage, + const struct pipe_box *box, + const void *data, + unsigned stride, + unsigned layer_stride) { struct trace_context *tr_context = trace_context(_context); struct trace_resource *tr_res = trace_resource(_resource); @@ -1568,7 +1604,7 @@ trace_context_transfer_inline_write(struct pipe_context *_context, assert(resource->screen == context->screen); - trace_dump_call_begin("pipe_context", "transfer_inline_write"); + trace_dump_call_begin("pipe_context", "texture_subdata"); trace_dump_arg(ptr, context); trace_dump_arg(ptr, resource); @@ -1589,8 +1625,8 @@ trace_context_transfer_inline_write(struct pipe_context *_context, trace_dump_call_end(); - context->transfer_inline_write(context, resource, level, usage, box, - data, stride, layer_stride); + context->texture_subdata(context, resource, level, usage, box, + data, stride, layer_stride); } @@ -1873,7 +1909,8 @@ trace_context_create(struct trace_screen *tr_scr, TR_CTX_INIT(transfer_map); TR_CTX_INIT(transfer_unmap); TR_CTX_INIT(transfer_flush_region); - TR_CTX_INIT(transfer_inline_write); + TR_CTX_INIT(buffer_subdata); + TR_CTX_INIT(texture_subdata); #undef TR_CTX_INIT diff --git a/src/gallium/drivers/vc4/vc4_resource.c b/src/gallium/drivers/vc4/vc4_resource.c index 08d7d207f79..398aa8181df 100644 --- a/src/gallium/drivers/vc4/vc4_resource.c +++ b/src/gallium/drivers/vc4/vc4_resource.c @@ -353,7 +353,6 @@ static const struct u_resource_vtbl vc4_resource_vtbl = { .transfer_map = vc4_resource_transfer_map, .transfer_flush_region = u_default_transfer_flush_region, .transfer_unmap = vc4_resource_transfer_unmap, - .transfer_inline_write = u_default_transfer_inline_write, }; static void @@ -985,7 +984,8 @@ vc4_resource_context_init(struct pipe_context *pctx) pctx->transfer_map = u_transfer_map_vtbl; pctx->transfer_flush_region = u_transfer_flush_region_vtbl; pctx->transfer_unmap = u_transfer_unmap_vtbl; - pctx->transfer_inline_write = u_transfer_inline_write_vtbl; + pctx->buffer_subdata = u_default_buffer_subdata; + pctx->texture_subdata = u_default_texture_subdata; pctx->create_surface = vc4_create_surface; pctx->surface_destroy = vc4_surface_destroy; pctx->resource_copy_region = util_resource_copy_region; diff --git a/src/gallium/drivers/virgl/virgl_buffer.c b/src/gallium/drivers/virgl/virgl_buffer.c index 94034072439..153df8dd0c9 100644 --- a/src/gallium/drivers/virgl/virgl_buffer.c +++ b/src/gallium/drivers/virgl/virgl_buffer.c @@ -145,7 +145,6 @@ static const struct u_resource_vtbl virgl_buffer_vtbl = virgl_buffer_transfer_map, /* transfer_map */ virgl_buffer_transfer_flush_region, /* transfer_flush_region */ virgl_buffer_transfer_unmap, /* transfer_unmap */ - virgl_transfer_inline_write /* transfer_inline_write */ }; struct pipe_resource *virgl_buffer_create(struct virgl_screen *vs, diff --git a/src/gallium/drivers/virgl/virgl_resource.c b/src/gallium/drivers/virgl/virgl_resource.c index 2b3794765e2..441b0c11703 100644 --- a/src/gallium/drivers/virgl/virgl_resource.c +++ b/src/gallium/drivers/virgl/virgl_resource.c @@ -82,10 +82,22 @@ void virgl_init_screen_resource_functions(struct pipe_screen *screen) screen->resource_destroy = u_resource_destroy_vtbl; } +static void virgl_buffer_subdata(struct pipe_context *pipe, + struct pipe_resource *resource, + unsigned usage, unsigned offset, + unsigned size, const void *data) +{ + struct pipe_box box; + + u_box_1d(offset, size, &box); + virgl_transfer_inline_write(pipe, resource, 0, usage, &box, data, 0, 0); +} + void virgl_init_context_resource_functions(struct pipe_context *ctx) { ctx->transfer_map = u_transfer_map_vtbl; ctx->transfer_flush_region = u_transfer_flush_region_vtbl; ctx->transfer_unmap = u_transfer_unmap_vtbl; - ctx->transfer_inline_write = u_transfer_inline_write_vtbl; + ctx->buffer_subdata = virgl_buffer_subdata; + ctx->texture_subdata = u_default_texture_subdata; } diff --git a/src/gallium/drivers/virgl/virgl_texture.c b/src/gallium/drivers/virgl/virgl_texture.c index 34db0560fe9..64b6744462d 100644 --- a/src/gallium/drivers/virgl/virgl_texture.c +++ b/src/gallium/drivers/virgl/virgl_texture.c @@ -304,7 +304,6 @@ static const struct u_resource_vtbl virgl_texture_vtbl = virgl_texture_transfer_map, /* transfer_map */ NULL, /* transfer_flush_region */ virgl_texture_transfer_unmap, /* transfer_unmap */ - u_default_transfer_inline_write /* transfer_inline_write */ }; struct pipe_resource * diff --git a/src/gallium/include/pipe/p_context.h b/src/gallium/include/pipe/p_context.h index 0c88e00de16..fe567b67197 100644 --- a/src/gallium/include/pipe/p_context.h +++ b/src/gallium/include/pipe/p_context.h @@ -519,16 +519,23 @@ struct pipe_context { struct pipe_transfer *transfer); /* One-shot transfer operation with data supplied in a user - * pointer. XXX: strides?? - */ - void (*transfer_inline_write)( struct pipe_context *, - struct pipe_resource *, - unsigned level, - unsigned usage, /* a combination of PIPE_TRANSFER_x */ - const struct pipe_box *, - const void *data, - unsigned stride, - unsigned layer_stride); + * pointer. + */ + void (*buffer_subdata)(struct pipe_context *, + struct pipe_resource *, + unsigned usage, /* a combination of PIPE_TRANSFER_x */ + unsigned offset, + unsigned size, + const void *data); + + void (*texture_subdata)(struct pipe_context *, + struct pipe_resource *, + unsigned level, + unsigned usage, /* a combination of PIPE_TRANSFER_x */ + const struct pipe_box *, + const void *data, + unsigned stride, + unsigned layer_stride); /** * Flush any pending framebuffer writes and invalidate texture caches. diff --git a/src/gallium/state_trackers/clover/core/resource.cpp b/src/gallium/state_trackers/clover/core/resource.cpp index 10a29a94eac..83781d39c01 100644 --- a/src/gallium/state_trackers/clover/core/resource.cpp +++ b/src/gallium/state_trackers/clover/core/resource.cpp @@ -161,9 +161,13 @@ root_resource::root_resource(clover::device &dev, memory_obj &obj, box rect { {{ 0, 0, 0 }}, {{ info.width0, info.height0, info.depth0 }} }; unsigned cpp = util_format_get_blocksize(info.format); - q.pipe->transfer_inline_write(q.pipe, pipe, 0, PIPE_TRANSFER_WRITE, - rect, data_ptr, cpp * info.width0, - cpp * info.width0 * info.height0); + if (pipe->target == PIPE_BUFFER) + q.pipe->buffer_subdata(q.pipe, pipe, PIPE_TRANSFER_WRITE, + 0, info.width0, data_ptr); + else + q.pipe->texture_subdata(q.pipe, pipe, 0, PIPE_TRANSFER_WRITE, + rect, data_ptr, cpp * info.width0, + cpp * info.width0 * info.height0); } } diff --git a/src/gallium/state_trackers/nine/buffer9.h b/src/gallium/state_trackers/nine/buffer9.h index 8bdb4326a4c..c109cf66140 100644 --- a/src/gallium/state_trackers/nine/buffer9.h +++ b/src/gallium/state_trackers/nine/buffer9.h @@ -88,10 +88,10 @@ NineBuffer9_Upload( struct NineBuffer9 *This ) struct pipe_context *pipe = This->pipe; assert(This->base.pool == D3DPOOL_MANAGED && This->managed.dirty); - pipe->transfer_inline_write(pipe, This->base.resource, 0, 0, - &This->managed.dirty_box, - (char *)This->managed.data + This->managed.dirty_box.x, - This->size, This->size); + pipe->buffer_subdata(pipe, This->base.resource, 0, + This->managed.dirty_box.x, + This->managed.dirty_box.width, + (char *)This->managed.data + This->managed.dirty_box.x); This->managed.dirty = FALSE; } diff --git a/src/gallium/state_trackers/nine/nine_state.c b/src/gallium/state_trackers/nine/nine_state.c index 6aa63250112..fd098ca68ea 100644 --- a/src/gallium/state_trackers/nine/nine_state.c +++ b/src/gallium/state_trackers/nine/nine_state.c @@ -86,8 +86,7 @@ prepare_ps_constants_userbuf(struct NineDevice9 *device); DBG("upload ConstantF [%u .. %u]\n", x, (x) + (c) - 1); \ box.x = (p) * 4 * sizeof(float); \ box.width = (c) * 4 * sizeof(float); \ - pipe->transfer_inline_write(pipe, buf, 0, usage, &box, &((d)[p * 4]), \ - 0, 0); \ + pipe->buffer_subdata(pipe, buf, usage, box.x, box.width, &((d)[p * 4])); \ } while(0) /* OK, this is a bit ugly ... */ @@ -186,7 +185,7 @@ upload_constants(struct NineDevice9 *device, unsigned shader_type) box.x = x; box.width = c * 4; DBG("upload ConstantB [%u .. %u]\n", x, x + c - 1); - pipe->transfer_inline_write(pipe, buf, 0, usage, &box, data_b, 0, 0); + pipe->buffer_subdata(pipe, buf, usage, box.x, box.width, data_b); } /* int4 */ @@ -203,7 +202,7 @@ upload_constants(struct NineDevice9 *device, unsigned shader_type) box.x += x * 4 * sizeof(int); box.width = c * 4 * sizeof(int); c = 0; - pipe->transfer_inline_write(pipe, buf, 0, usage, &box, data, 0, 0); + pipe->buffer_subdata(pipe, buf, usage, box.x, box.width, data); } } if (c) { @@ -212,7 +211,7 @@ upload_constants(struct NineDevice9 *device, unsigned shader_type) box.x = buf->width0 - (NINE_MAX_CONST_I * 4 + NINE_MAX_CONST_B) * 4; box.x += x * 4 * sizeof(int); box.width = c * 4 * sizeof(int); - pipe->transfer_inline_write(pipe, buf, 0, usage, &box, data, 0, 0); + pipe->buffer_subdata(pipe, buf, usage, box.x, box.width, data); } /* TODO: only upload these when shader itself changes */ @@ -224,7 +223,7 @@ upload_constants(struct NineDevice9 *device, unsigned shader_type) n += r->end - r->bgn; box.width = (r->end - r->bgn) * 4 * sizeof(float); data = &lconstf_data[4 * n]; - pipe->transfer_inline_write(pipe, buf, 0, usage, &box, data, 0, 0); + pipe->buffer_subdata(pipe, buf, usage, box.x, box.width, data); r = r->next; } } diff --git a/src/gallium/state_trackers/nine/surface9.c b/src/gallium/state_trackers/nine/surface9.c index 2606dbfcfa8..6a4a0d9dc74 100644 --- a/src/gallium/state_trackers/nine/surface9.c +++ b/src/gallium/state_trackers/nine/surface9.c @@ -673,8 +673,8 @@ NineSurface9_UploadSelf( struct NineSurface9 *This, ptr = NineSurface9_GetSystemMemPointer(This, box.x, box.y); - pipe->transfer_inline_write(pipe, res, This->level, 0, - &box, ptr, This->stride, 0); + pipe->texture_subdata(pipe, res, This->level, 0, + &box, ptr, This->stride, 0); return D3D_OK; } diff --git a/src/gallium/state_trackers/nine/volume9.c b/src/gallium/state_trackers/nine/volume9.c index 1fdc6388197..0302b099931 100644 --- a/src/gallium/state_trackers/nine/volume9.c +++ b/src/gallium/state_trackers/nine/volume9.c @@ -496,8 +496,8 @@ NineVolume9_UploadSelf( struct NineVolume9 *This, ptr = NineVolume9_GetSystemMemPointer(This, box.x, box.y, box.z); - pipe->transfer_inline_write(pipe, res, This->level, 0, &box, - ptr, This->stride, This->layer_stride); + pipe->texture_subdata(pipe, res, This->level, 0, &box, + ptr, This->stride, This->layer_stride); return D3D_OK; } diff --git a/src/gallium/state_trackers/omx/vid_enc.c b/src/gallium/state_trackers/omx/vid_enc.c index 642238e53f0..0d7ab28fb37 100644 --- a/src/gallium/state_trackers/omx/vid_enc.c +++ b/src/gallium/state_trackers/omx/vid_enc.c @@ -905,16 +905,16 @@ static OMX_ERRORTYPE enc_LoadImage(omx_base_PortType *port, OMX_BUFFERHEADERTYPE box.width = def->nFrameWidth; box.height = def->nFrameHeight; box.depth = 1; - priv->s_pipe->transfer_inline_write(priv->s_pipe, views[0]->texture, 0, - PIPE_TRANSFER_WRITE, &box, - ptr, def->nStride, 0); + priv->s_pipe->texture_subdata(priv->s_pipe, views[0]->texture, 0, + PIPE_TRANSFER_WRITE, &box, + ptr, def->nStride, 0); ptr = ((uint8_t*)buf->pBuffer) + (def->nStride * box.height); box.width = def->nFrameWidth / 2; box.height = def->nFrameHeight / 2; box.depth = 1; - priv->s_pipe->transfer_inline_write(priv->s_pipe, views[1]->texture, 0, - PIPE_TRANSFER_WRITE, &box, - ptr, def->nStride, 0); + priv->s_pipe->texture_subdata(priv->s_pipe, views[1]->texture, 0, + PIPE_TRANSFER_WRITE, &box, + ptr, def->nStride, 0); } else { struct pipe_blit_info blit; struct vl_video_buffer *dst_buf = (struct vl_video_buffer *)vbuf; diff --git a/src/gallium/state_trackers/va/image.c b/src/gallium/state_trackers/va/image.c index 1b956e36bc1..36b24695edf 100644 --- a/src/gallium/state_trackers/va/image.c +++ b/src/gallium/state_trackers/va/image.c @@ -515,10 +515,10 @@ vlVaPutImage(VADriverContextP ctx, VASurfaceID surface, VAImageID image, vlVaVideoSurfaceSize(surf, i, &width, &height); for (j = 0; j < views[i]->texture->array_size; ++j) { struct pipe_box dst_box = {0, 0, j, width, height, 1}; - drv->pipe->transfer_inline_write(drv->pipe, views[i]->texture, 0, - PIPE_TRANSFER_WRITE, &dst_box, - data[i] + pitches[i] * j, - pitches[i] * views[i]->texture->array_size, 0); + drv->pipe->texture_subdata(drv->pipe, views[i]->texture, 0, + PIPE_TRANSFER_WRITE, &dst_box, + data[i] + pitches[i] * j, + pitches[i] * views[i]->texture->array_size, 0); } } pipe_mutex_unlock(drv->mutex); diff --git a/src/gallium/state_trackers/vdpau/bitmap.c b/src/gallium/state_trackers/vdpau/bitmap.c index 35c8820433d..fd67a986c61 100644 --- a/src/gallium/state_trackers/vdpau/bitmap.c +++ b/src/gallium/state_trackers/vdpau/bitmap.c @@ -201,9 +201,9 @@ vlVdpBitmapSurfacePutBitsNative(VdpBitmapSurface surface, vlVdpResolveDelayedRendering(vlsurface->device, NULL, NULL); dst_box = RectToPipeBox(destination_rect, vlsurface->sampler_view->texture); - pipe->transfer_inline_write(pipe, vlsurface->sampler_view->texture, 0, - PIPE_TRANSFER_WRITE, &dst_box, *source_data, - *source_pitches, 0); + pipe->texture_subdata(pipe, vlsurface->sampler_view->texture, 0, + PIPE_TRANSFER_WRITE, &dst_box, *source_data, + *source_pitches, 0); pipe_mutex_unlock(vlsurface->device->mutex); diff --git a/src/gallium/state_trackers/vdpau/output.c b/src/gallium/state_trackers/vdpau/output.c index 8a064e849b6..0b4f081be3e 100644 --- a/src/gallium/state_trackers/vdpau/output.c +++ b/src/gallium/state_trackers/vdpau/output.c @@ -257,9 +257,9 @@ vlVdpOutputSurfacePutBitsNative(VdpOutputSurface surface, vlVdpResolveDelayedRendering(vlsurface->device, NULL, NULL); dst_box = RectToPipeBox(destination_rect, vlsurface->sampler_view->texture); - pipe->transfer_inline_write(pipe, vlsurface->sampler_view->texture, 0, - PIPE_TRANSFER_WRITE, &dst_box, *source_data, - *source_pitches, 0); + pipe->texture_subdata(pipe, vlsurface->sampler_view->texture, 0, + PIPE_TRANSFER_WRITE, &dst_box, *source_data, + *source_pitches, 0); pipe_mutex_unlock(vlsurface->device->mutex); return VDP_STATUS_OK; @@ -346,9 +346,9 @@ vlVdpOutputSurfacePutBitsIndexed(VdpOutputSurface surface, box.height = res->height0; box.depth = res->depth0; - context->transfer_inline_write(context, res, 0, PIPE_TRANSFER_WRITE, &box, - source_data[0], source_pitch[0], - source_pitch[0] * res->height0); + context->texture_subdata(context, res, 0, PIPE_TRANSFER_WRITE, &box, + source_data[0], source_pitch[0], + source_pitch[0] * res->height0); memset(&sv_tmpl, 0, sizeof(sv_tmpl)); u_sampler_view_default_template(&sv_tmpl, res, res->format); @@ -379,8 +379,8 @@ vlVdpOutputSurfacePutBitsIndexed(VdpOutputSurface surface, box.height = res->height0; box.depth = res->depth0; - context->transfer_inline_write(context, res, 0, PIPE_TRANSFER_WRITE, &box, color_table, - util_format_get_stride(colortbl_format, res->width0), 0); + context->texture_subdata(context, res, 0, PIPE_TRANSFER_WRITE, &box, color_table, + util_format_get_stride(colortbl_format, res->width0), 0); memset(&sv_tmpl, 0, sizeof(sv_tmpl)); u_sampler_view_default_template(&sv_tmpl, res, res->format); @@ -485,8 +485,8 @@ vlVdpOutputSurfacePutBitsYCbCr(VdpOutputSurface surface, sv->texture->width0, sv->texture->height0, 1 }; - pipe->transfer_inline_write(pipe, sv->texture, 0, PIPE_TRANSFER_WRITE, &dst_box, - source_data[i], source_pitches[i], 0); + pipe->texture_subdata(pipe, sv->texture, 0, PIPE_TRANSFER_WRITE, &dst_box, + source_data[i], source_pitches[i], 0); } if (!csc_matrix) { diff --git a/src/gallium/state_trackers/vdpau/surface.c b/src/gallium/state_trackers/vdpau/surface.c index 7998527b2d1..6dc479a6726 100644 --- a/src/gallium/state_trackers/vdpau/surface.c +++ b/src/gallium/state_trackers/vdpau/surface.c @@ -359,11 +359,11 @@ vlVdpVideoSurfacePutBitsYCbCr(VdpVideoSurface surface, width, height, 1 }; - pipe->transfer_inline_write(pipe, sv->texture, 0, - PIPE_TRANSFER_WRITE, &dst_box, - source_data[i] + source_pitches[i] * j, - source_pitches[i] * sv->texture->array_size, - 0); + pipe->texture_subdata(pipe, sv->texture, 0, + PIPE_TRANSFER_WRITE, &dst_box, + source_data[i] + source_pitches[i] * j, + source_pitches[i] * sv->texture->array_size, + 0); } } pipe_mutex_unlock(p_surf->device->mutex); diff --git a/src/gallium/tests/graw/fs-test.c b/src/gallium/tests/graw/fs-test.c index bd5259afe46..b23769259ec 100644 --- a/src/gallium/tests/graw/fs-test.c +++ b/src/gallium/tests/graw/fs-test.c @@ -311,14 +311,14 @@ static void init_tex( void ) u_box_2d(0,0,SIZE,SIZE, &box); - ctx->transfer_inline_write(ctx, - samptex, - 0, - PIPE_TRANSFER_WRITE, - &box, - tex2d, - sizeof tex2d[0], - sizeof tex2d); + ctx->texture_subdata(ctx, + samptex, + 0, + PIPE_TRANSFER_WRITE, + &box, + tex2d, + sizeof tex2d[0], + sizeof tex2d); /* Possibly read back & compare against original data: */ diff --git a/src/gallium/tests/graw/graw_util.h b/src/gallium/tests/graw/graw_util.h index 5d72bb9d4a7..f6033855aa0 100644 --- a/src/gallium/tests/graw/graw_util.h +++ b/src/gallium/tests/graw/graw_util.h @@ -242,14 +242,14 @@ graw_util_create_tex2d(const struct graw_info *info, u_box_2d(0, 0, width, height, &box); - info->ctx->transfer_inline_write(info->ctx, - tex, - 0, - PIPE_TRANSFER_WRITE, - &box, - data, - row_stride, - image_bytes); + info->ctx->texture_subdata(info->ctx, + tex, + 0, + PIPE_TRANSFER_WRITE, + &box, + data, + row_stride, + image_bytes); /* Possibly read back & compare against original data: */ diff --git a/src/gallium/tests/graw/gs-test.c b/src/gallium/tests/graw/gs-test.c index c680b62eaaa..00fb59161a8 100644 --- a/src/gallium/tests/graw/gs-test.c +++ b/src/gallium/tests/graw/gs-test.c @@ -149,7 +149,6 @@ static float constants2[] = static void init_fs_constbuf( void ) { struct pipe_resource templat; - struct pipe_box box; templat.target = PIPE_BUFFER; templat.format = PIPE_FORMAT_R8_UNORM; @@ -169,34 +168,18 @@ static void init_fs_constbuf( void ) exit(4); { - u_box_2d(0,0,sizeof(constants1),1, &box); - - ctx->transfer_inline_write(ctx, - constbuf1, - 0, - PIPE_TRANSFER_WRITE, - &box, - constants1, - sizeof constants1, - sizeof constants1); - + ctx->buffer_subdata(ctx, constbuf1, + PIPE_TRANSFER_WRITE, + 0, sizeof(constants1), constants1); pipe_set_constant_buffer(ctx, PIPE_SHADER_GEOMETRY, 0, constbuf1); } { - u_box_2d(0,0,sizeof(constants2),1, &box); - - ctx->transfer_inline_write(ctx, - constbuf2, - 0, - PIPE_TRANSFER_WRITE, - &box, - constants2, - sizeof constants2, - sizeof constants2); - + ctx->buffer_subdata(ctx, constbuf2, + PIPE_TRANSFER_WRITE, + 0, sizeof(constants2), constants2); pipe_set_constant_buffer(ctx, PIPE_SHADER_GEOMETRY, 1, @@ -418,14 +401,14 @@ static void init_tex( void ) u_box_2d(0,0,SIZE,SIZE, &box); - ctx->transfer_inline_write(ctx, - samptex, - 0, - PIPE_TRANSFER_WRITE, - &box, - tex2d, - sizeof tex2d[0], - sizeof tex2d); + ctx->texture_subdata(ctx, + samptex, + 0, + PIPE_TRANSFER_WRITE, + &box, + tex2d, + sizeof tex2d[0], + sizeof tex2d); /* Possibly read back & compare against original data: */ diff --git a/src/gallium/tests/graw/quad-sample.c b/src/gallium/tests/graw/quad-sample.c index 97f241ff844..d1bee359261 100644 --- a/src/gallium/tests/graw/quad-sample.c +++ b/src/gallium/tests/graw/quad-sample.c @@ -226,14 +226,14 @@ static void init_tex( void ) u_box_2d(0,0,SIZE,SIZE, &box); - ctx->transfer_inline_write(ctx, - samptex, - 0, - PIPE_TRANSFER_WRITE, - &box, - tex2d, - sizeof tex2d[0], - sizeof tex2d); + ctx->texture_subdata(ctx, + samptex, + 0, + PIPE_TRANSFER_WRITE, + &box, + tex2d, + sizeof tex2d[0], + sizeof tex2d); /* Possibly read back & compare against original data: */ diff --git a/src/gallium/tests/graw/vs-test.c b/src/gallium/tests/graw/vs-test.c index 3a55131669b..48f06f461d8 100644 --- a/src/gallium/tests/graw/vs-test.c +++ b/src/gallium/tests/graw/vs-test.c @@ -100,15 +100,9 @@ static void init_fs_constbuf( void ) u_box_2d(0,0,sizeof(constants),1, &box); - ctx->transfer_inline_write(ctx, - constbuf, - 0, - PIPE_TRANSFER_WRITE, - &box, - constants, - sizeof constants, - sizeof constants); - + ctx->buffer_subdata(ctx, constbuf, + PIPE_TRANSFER_WRITE, + 0, sizeof(constants), constants); pipe_set_constant_buffer(ctx, PIPE_SHADER_VERTEX, 0, @@ -305,14 +299,14 @@ static void init_tex( void ) u_box_2d(0,0,SIZE,SIZE, &box); - ctx->transfer_inline_write(ctx, - samptex, - 0, - PIPE_TRANSFER_WRITE, - &box, - tex2d, - sizeof tex2d[0], - sizeof tex2d); + ctx->texture_subdata(ctx, + samptex, + 0, + PIPE_TRANSFER_WRITE, + &box, + tex2d, + sizeof tex2d[0], + sizeof tex2d); /* Possibly read back & compare against original data: */ diff --git a/src/mesa/state_tracker/st_cb_bufferobjects.c b/src/mesa/state_tracker/st_cb_bufferobjects.c index 1a8aea3c198..2d4c82148c8 100644 --- a/src/mesa/state_tracker/st_cb_bufferobjects.c +++ b/src/mesa/state_tracker/st_cb_bufferobjects.c @@ -196,12 +196,9 @@ st_bufferobj_data(struct gl_context *ctx, * This should be the same as creating a new buffer, but we avoid * a lot of validation in Mesa. */ - struct pipe_box box; - - u_box_1d(0, size, &box); - pipe->transfer_inline_write(pipe, st_obj->buffer, 0, - PIPE_TRANSFER_DISCARD_WHOLE_RESOURCE, - &box, data, 0, 0); + pipe->buffer_subdata(pipe, st_obj->buffer, + PIPE_TRANSFER_DISCARD_WHOLE_RESOURCE, + 0, size, data); return GL_TRUE; } else if (screen->get_param(screen, PIPE_CAP_INVALIDATE_BUFFER)) { pipe->invalidate_resource(pipe, st_obj->buffer); diff --git a/src/mesa/state_tracker/st_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c index a76775f6ded..d2acc71b81c 100644 --- a/src/mesa/state_tracker/st_cb_texture.c +++ b/src/mesa/state_tracker/st_cb_texture.c @@ -1339,7 +1339,7 @@ st_TexSubImage(struct gl_context *ctx, GLuint dims, if (!dst) goto fallback; - /* Try transfer_inline_write, which should be the fastest memcpy path. */ + /* Try texture_subdata, which should be the fastest memcpy path. */ if (pixels && !_mesa_is_bufferobj(unpack->BufferObj) && _mesa_texstore_can_use_memcpy(ctx, texImage->_BaseFormat, @@ -1365,8 +1365,8 @@ st_TexSubImage(struct gl_context *ctx, GLuint dims, } u_box_3d(xoffset, yoffset, zoffset + dstz, width, height, depth, &box); - pipe->transfer_inline_write(pipe, dst, dst_level, 0, - &box, data, stride, layer_stride); + pipe->texture_subdata(pipe, dst, dst_level, 0, + &box, data, stride, layer_stride); return; }