瀏覽代碼

virgl: do not use inline writes for subdata

Inline writes skip transfer map/unamp at the cost of an extra copy
on the data during execbuffer.  That is generally a win for small
transfers.  But the heuristic to use inline writes based on buffer
sizes rather than transfer sizes makes little sense.  More
importantly, inline writes miss optimizations that are done for
buffer transfers.

Let's just use transfers.

Signed-off-by: Chia-I Wu <olvaffe@gmail.com>
Reviewed-By: Gert Wollny <gert.wollny@collabora.com>
tags/19.2-branchpoint
Chia-I Wu 7 年之前
父節點
當前提交
c7078397ca
共有 1 個文件被更改,包括 7 次插入 和 4 次删除
  1. 7
    4
      src/gallium/drivers/virgl/virgl_resource.c

+ 7
- 4
src/gallium/drivers/virgl/virgl_resource.c 查看文件

@@ -174,6 +174,8 @@ static void virgl_buffer_subdata(struct pipe_context *pipe,
unsigned usage, unsigned offset,
unsigned size, const void *data)
{
struct pipe_transfer *transfer;
uint8_t *map;
struct pipe_box box;

assert(!(usage & PIPE_TRANSFER_READ));
@@ -192,10 +194,11 @@ static void virgl_buffer_subdata(struct pipe_context *pipe,
virgl_buffer_transfer_extend(pipe, resource, usage, &box, data))
return;

if (resource->width0 >= getpagesize())
u_default_buffer_subdata(pipe, resource, usage, offset, size, data);
else
virgl_transfer_inline_write(pipe, resource, 0, usage, &box, data, 0, 0);
map = pipe->transfer_map(pipe, resource, 0, usage, &box, &transfer);
if (map) {
memcpy(map, data, size);
pipe_transfer_unmap(pipe, transfer);
}
}

void virgl_init_context_resource_functions(struct pipe_context *ctx)

Loading…
取消
儲存