r600g: add a faster implementation of transfer_inline_write
u_default_transfer_inline_write uses util_copy_rect, which is kinda slow.
This commit is contained in:
@@ -131,6 +131,30 @@ static void r600_transfer_destroy(struct pipe_context *ctx,
|
||||
util_slab_free(&rctx->pool_transfers, transfer);
|
||||
}
|
||||
|
||||
static void r600_buffer_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)
|
||||
{
|
||||
struct radeon *ws = (struct radeon*)pipe->winsys;
|
||||
struct r600_resource_buffer *rbuffer = r600_buffer(resource);
|
||||
uint8_t *map = NULL;
|
||||
|
||||
assert(rbuffer->b.user_ptr == NULL);
|
||||
|
||||
map = r600_bo_map(ws, rbuffer->r.bo,
|
||||
PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD | usage,
|
||||
pipe);
|
||||
|
||||
memcpy(map + box->x, data, box->width);
|
||||
|
||||
if (rbuffer->r.bo)
|
||||
r600_bo_unmap(ws, rbuffer->r.bo);
|
||||
}
|
||||
|
||||
static const struct u_resource_vtbl r600_buffer_vtbl =
|
||||
{
|
||||
@@ -142,7 +166,7 @@ static const struct u_resource_vtbl r600_buffer_vtbl =
|
||||
r600_buffer_transfer_map, /* transfer_map */
|
||||
r600_buffer_transfer_flush_region, /* transfer_flush_region */
|
||||
r600_buffer_transfer_unmap, /* transfer_unmap */
|
||||
u_default_transfer_inline_write /* transfer_inline_write */
|
||||
r600_buffer_transfer_inline_write /* transfer_inline_write */
|
||||
};
|
||||
|
||||
struct pipe_resource *r600_buffer_create(struct pipe_screen *screen,
|
||||
|
||||
Reference in New Issue
Block a user