summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/ilo/ilo_transfer.c
diff options
context:
space:
mode:
authorMarek Olšák <[email protected]>2016-07-16 21:19:48 +0200
committerMarek Olšák <[email protected]>2016-07-23 13:33:42 +0200
commit1ffe77e7bb2486ea74cda077ed2a9622b758395c (patch)
tree4a04818614fc8c4e086e9dcd32dbadecbac4b6fb /src/gallium/drivers/ilo/ilo_transfer.c
parent0ba7288376dc66f932336862c8a6abb629b47686 (diff)
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 <[email protected]> Acked-by: Roland Scheidegger <[email protected]>
Diffstat (limited to 'src/gallium/drivers/ilo/ilo_transfer.c')
-rw-r--r--src/gallium/drivers/ilo/ilo_transfer.c36
1 files changed, 10 insertions, 26 deletions
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;
}