diff options
author | Kenneth Graunke <[email protected]> | 2015-02-24 21:34:30 -0800 |
---|---|---|
committer | Kenneth Graunke <[email protected]> | 2015-04-17 12:14:52 -0700 |
commit | 1d6829813ef2b002fca488e6a8051e3090bf87bd (patch) | |
tree | 830fab0fdb191a174ad9b255882ec45fa97673ce /src/mesa/drivers/dri/i965/intel_buffer_objects.c | |
parent | cd9058fae3eddaa0e88cd3557684700852f86a5a (diff) |
i965: Issue perf_debug messages for unsynchronized maps on !LLC systems.
We haven't implemented proper unsynchronized map support on !LLC systems
(pre-SNB, Atom). MapBufferRange with GL_MAP_UNSYNCHRONIZE_BIT will
actually do a synchronized map, probably killing performance.
Also warn on BufferSubData, when we should be doing an unsynchronized
upload, but instead have to do a synchronous map.
v2: Only complain if the buffer is actually busy - we use unsynchronized
maps internally for vertex upload and such, but expect those to not
be busy.
Signed-off-by: Kenneth Graunke <[email protected]>
Reviewed-by: Ben Widawsky <[email protected]>
Tested-by: Ben Widawsky <[email protected]>
Diffstat (limited to 'src/mesa/drivers/dri/i965/intel_buffer_objects.c')
-rw-r--r-- | src/mesa/drivers/dri/i965/intel_buffer_objects.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/src/mesa/drivers/dri/i965/intel_buffer_objects.c b/src/mesa/drivers/dri/i965/intel_buffer_objects.c index 3b0a206d886..627c487f0e7 100644 --- a/src/mesa/drivers/dri/i965/intel_buffer_objects.c +++ b/src/mesa/drivers/dri/i965/intel_buffer_objects.c @@ -254,9 +254,9 @@ brw_buffer_subdata(struct gl_context *ctx, * (otherwise, an app that might occasionally stall but mostly not will end * up with blitting all the time, at the cost of bandwidth) */ - if (brw->has_llc) { - if (offset + size <= intel_obj->gpu_active_start || - intel_obj->gpu_active_end <= offset) { + if (offset + size <= intel_obj->gpu_active_start || + intel_obj->gpu_active_end <= offset) { + if (brw->has_llc) { drm_intel_gem_bo_map_unsynchronized(intel_obj->buffer); memcpy(intel_obj->buffer->virtual + offset, data, size); drm_intel_bo_unmap(intel_obj->buffer); @@ -264,6 +264,8 @@ brw_buffer_subdata(struct gl_context *ctx, if (intel_obj->gpu_active_end > intel_obj->gpu_active_start) intel_obj->prefer_stall_to_blit = true; return; + } else { + perf_debug("BufferSubData could be unsynchronized, but !LLC doesn't support it yet\n"); } } @@ -437,9 +439,13 @@ brw_map_buffer_range(struct gl_context *ctx, return obj->Mappings[index].Pointer; } - if (access & GL_MAP_UNSYNCHRONIZED_BIT) + if (access & GL_MAP_UNSYNCHRONIZED_BIT) { + if (!brw->has_llc && brw->perf_debug && + drm_intel_bo_busy(intel_obj->buffer)) { + perf_debug("MapBufferRange with GL_MAP_UNSYNCHRONIZED_BIT stalling (it's actually synchronized on non-LLC platforms)\n"); + } drm_intel_gem_bo_map_unsynchronized(intel_obj->buffer); - else if (!brw->has_llc && (!(access & GL_MAP_READ_BIT) || + } else if (!brw->has_llc && (!(access & GL_MAP_READ_BIT) || (access & GL_MAP_PERSISTENT_BIT))) { drm_intel_gem_bo_map_gtt(intel_obj->buffer); mark_buffer_inactive(intel_obj); |