i965: Use async maps for BufferSubData to regions with no valid data.
authorKenneth Graunke <kenneth@whitecape.org>
Wed, 18 Jan 2017 01:18:01 +0000 (17:18 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Thu, 13 Jul 2017 23:58:17 +0000 (16:58 -0700)
When writing a region of a buffer via glBufferSubData(), we can write
the data asynchronously if the destination doesn't contain any data.
Even if it's busy, the data was undefined, so the new data is fine too.

Removes all stall avoidance blits on BufferSubData calls in
"Total War: WARHAMMER" on my Skylake GT4.

Decreases the number of stall avoidance blits in Manhattan 3.1:
- Skylake GT4: -18.3544% +/- 6.76483% (n=13)
- Apollolake:  -12.1095% +/- 5.24458% (n=13)

Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
src/mesa/drivers/dri/i965/intel_buffer_objects.c

index ff73a37d608cd5809b56937161fd72c5a57d0da4..a335c00afdebed329f2e9d794dd8578f4b99a7c9 100644 (file)
@@ -234,7 +234,9 @@ brw_buffer_subdata(struct gl_context *ctx,
     * up with blitting all the time, at the cost of bandwidth)
     */
    if (offset + size <= intel_obj->gpu_active_start ||
-       intel_obj->gpu_active_end <= offset) {
+       intel_obj->gpu_active_end <= offset ||
+       offset + size <= intel_obj->valid_data_start ||
+       intel_obj->valid_data_end <= offset) {
       void *map = brw_bo_map(brw, intel_obj->buffer, MAP_WRITE | MAP_ASYNC);
       memcpy(map + offset, data, size);
       brw_bo_unmap(intel_obj->buffer);