diff options
author | Marek Olšák <marek.olsak@amd.com> | 2016-07-16 21:19:48 +0200 |
---|---|---|
committer | Marek Olšák <marek.olsak@amd.com> | 2016-07-23 13:33:42 +0200 |
commit | 1ffe77e7bb2486ea74cda077ed2a9622b758395c (patch) | |
tree | 4a04818614fc8c4e086e9dcd32dbadecbac4b6fb /src/gallium/drivers/i915 | |
parent | 0ba7288376dc66f932336862c8a6abb629b47686 (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 <nicolai.haehnle@amd.com>
Acked-by: Roland Scheidegger <sroland@vmware.com>
Diffstat (limited to 'src/gallium/drivers/i915')
-rw-r--r-- | src/gallium/drivers/i915/i915_resource.c | 3 | ||||
-rw-r--r-- | src/gallium/drivers/i915/i915_resource.h | 6 | ||||
-rw-r--r-- | src/gallium/drivers/i915/i915_resource_buffer.c | 19 | ||||
-rw-r--r-- | src/gallium/drivers/i915/i915_resource_texture.c | 3 |
4 files changed, 15 insertions, 16 deletions
diff --git a/src/gallium/drivers/i915/i915_resource.c b/src/gallium/drivers/i915/i915_resource.c index 3ffb0b7a5d..8e5572b4cd 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 77fe8b70f7..0afd09501c 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 fb2e53b014..24c954cae3 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 af9d97a8ac..f77bbfde18 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 */ }; |