We flush everytime the command buffer (16 kB) is full, which is quite costly. This improves dEQP-GLES3.performance.buffer.data_upload.function_call.buffer_data.new_buffer.usage_stream_draw from 111.16 MB/s to 1930.36 MB/s. In addition, I made the benchmark produce buffers from 0 --> VIRGL_MAX_CMDBUF_DWORDS * 4, and tried ((VIRGL_MAX_CMDBUF_DWORDS * 4) / 2), ((VIRGL_MAX_CMDBUF_DWORDS * 4) / 4), etc. I didn't notice any clear differences, so let's just go with the most obvious heuristic. Tested-By: Gert Wollny <gert.wollny@collabora.com> Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com>tags/19.0-branchpoint
@@ -95,7 +95,11 @@ static void virgl_buffer_subdata(struct pipe_context *pipe, | |||
usage |= PIPE_TRANSFER_DISCARD_RANGE; | |||
u_box_1d(offset, size, &box); | |||
virgl_transfer_inline_write(pipe, resource, 0, usage, &box, data, 0, 0); | |||
if (size >= (VIRGL_MAX_CMDBUF_DWORDS * 4)) | |||
u_default_buffer_subdata(pipe, resource, usage, offset, size, data); | |||
else | |||
virgl_transfer_inline_write(pipe, resource, 0, usage, &box, data, 0, 0); | |||
} | |||
void virgl_init_context_resource_functions(struct pipe_context *ctx) |