Quoting Kenneth Graunke (2017-07-22 00:17:47) > src/mesa/drivers/dri/i965/brw_program_cache.c | 83 > +++++++-------------------- > 1 file changed, 21 insertions(+), 62 deletions(-) > > diff --git a/src/mesa/drivers/dri/i965/brw_program_cache.c > b/src/mesa/drivers/dri/i965/brw_program_cache.c > index 04682bef34c..8d83af71d3a 100644 > --- a/src/mesa/drivers/dri/i965/brw_program_cache.c > +++ b/src/mesa/drivers/dri/i965/brw_program_cache.c > @@ -45,6 +45,8 @@ > */ > > #include "main/imports.h" > +#include "main/streaming-load-memcpy.h" > +#include "x86/common_x86_asm.h" > #include "intel_batchbuffer.h" > #include "brw_state.h" > #include "brw_wm.h" > @@ -214,32 +216,28 @@ brw_cache_new_bo(struct brw_cache *cache, uint32_t > new_size) > { > struct brw_context *brw = cache->brw; > struct brw_bo *new_bo; > - void *llc_map; > > new_bo = brw_bo_alloc(brw->bufmgr, "program cache", new_size, 64); > if (can_do_exec_capture(brw->screen)) > new_bo->kflags = EXEC_OBJECT_CAPTURE; > - if (brw->has_llc) { > - llc_map = brw_bo_map(brw, new_bo, MAP_READ | MAP_WRITE | > - MAP_ASYNC | MAP_PERSISTENT); > - } > + > + void *map = brw_bo_map(brw, new_bo, MAP_READ | MAP_WRITE | > + MAP_ASYNC | MAP_PERSISTENT); > > /* Copy any existing data that needs to be saved. */ > if (cache->next_offset != 0) { > - if (brw->has_llc) { > - memcpy(llc_map, cache->map, cache->next_offset); > - } else { > - void *map = brw_bo_map(brw, cache->bo, MAP_READ); > - brw_bo_subdata(new_bo, 0, cache->next_offset, map); > - brw_bo_unmap(cache->bo); > - } > +#ifdef USE_SSE41 > + if (!cache->bo->cache_coherent && cpu_has_sse4_1) > + _mesa_streaming_load_memcpy(map, cache->map, cache->next_offset); > + else > +#endif > + memcpy(map, cache->map, cache->next_offset);
Considering the prevalence of sse4.1, another candidate is brw_get_buffer_subdata(), we could use a WC map there as well. diff --git a/src/mesa/drivers/dri/i965/intel_buffer_objects.c b/src/mesa/drivers/dri/i965/intel_buffer_objects.c index e932badaaf..705ade8021 100644 --- a/src/mesa/drivers/dri/i965/intel_buffer_objects.c +++ b/src/mesa/drivers/dri/i965/intel_buffer_objects.c @@ -32,7 +32,9 @@ #include "main/imports.h" #include "main/mtypes.h" #include "main/macros.h" +#include "main/streaming-load-memcpy.h" #include "main/bufferobj.h" +#include "x86/common_x86_asm.h" #include "brw_context.h" #include "intel_blit.h" @@ -337,16 +339,24 @@ brw_get_buffer_subdata(struct gl_context *ctx, intel_batchbuffer_flush(brw); } - void *map = brw_bo_map(brw, intel_obj->buffer, MAP_READ); - - if (unlikely(!map)) { - _mesa_error_no_memory(__func__); - return; + if (!intel_obj->buffer->cache_coherent && cpu_has_sse4_1) { + void *map = brw_bo_map(brw, intel_obj->buffer, MAP_READ | MAP_COHERENT); + if (unlikely(!map)) { + _mesa_error_no_memory(__func__); + return; + } + _mesa_streaming_load_memcpy(data, map + offset, size); + brw_bo_unmap(intel_obj->buffer); + } else { + void *map = brw_bo_map(brw, intel_obj->buffer, MAP_READ); + if (unlikely(!map)) { + _mesa_error_no_memory(__func__); + return; + } + memcpy(data, map + offset, size); + brw_bo_unmap(intel_obj->buffer); } - memcpy(data, map + offset, size); - brw_bo_unmap(intel_obj->buffer); - mark_buffer_inactive(intel_obj); } I didn't see any other obvious candidates, the query readback objects I suggest to use snooping instead. -Chris _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev