summaryrefslogtreecommitdiffstats
path: root/src/mesa/drivers/dri/i965/intel_buffer_objects.c
diff options
context:
space:
mode:
authorKenneth Graunke <kenneth@whitecape.org>2015-02-24 21:34:30 -0800
committerKenneth Graunke <kenneth@whitecape.org>2015-04-17 12:14:52 -0700
commit1d6829813ef2b002fca488e6a8051e3090bf87bd (patch)
tree830fab0fdb191a174ad9b255882ec45fa97673ce /src/mesa/drivers/dri/i965/intel_buffer_objects.c
parentcd9058fae3eddaa0e88cd3557684700852f86a5a (diff)
downloadexternal_mesa3d-1d6829813ef2b002fca488e6a8051e3090bf87bd.zip
external_mesa3d-1d6829813ef2b002fca488e6a8051e3090bf87bd.tar.gz
external_mesa3d-1d6829813ef2b002fca488e6a8051e3090bf87bd.tar.bz2
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 <kenneth@whitecape.org> Reviewed-by: Ben Widawsky <ben@bwidawsk.net> Tested-by: Ben Widawsky <ben@bwidawsk.net>
Diffstat (limited to 'src/mesa/drivers/dri/i965/intel_buffer_objects.c')
-rw-r--r--src/mesa/drivers/dri/i965/intel_buffer_objects.c16
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 3b0a206..627c487 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);