[Mesa-dev] [PATCH 7/7] i965: Drop non-LLC lunacy in the program cache code.

Chris Wilson chris at chris-wilson.co.uk
Sat Jul 22 09:14:28 UTC 2017


Quoting Kenneth Graunke (2017-07-22 00:17:47)
> The non-LLC story was a horror show.  We uploaded data via pwrite
> (drm_intel_bo_subdata), which would stall if the cache BO was in
> use (being read) by the GPU.  Obviously, we wanted to avoid that.
> So, we tried to detect whether the buffer was busy, and if so, we'd
> allocate a new BO, map the old one read-only (hopefully not stalling),
> copy all shaders compiled since the dawn of time to the new buffer,
> upload our new one, toss the old BO, and let the state upload code
> know that our program cache BO changed.  This was a lot of extra data
> copying, and flagging BRW_NEW_PROGRAM_CACHE would also cause a new
> STATE_BASE_ADDRESS to be emitted, stalling the entire pipeline.
> 
> Not only that, but our rudimentary busy tracking consistented of a flag
> set at execbuf time, and not cleared until we threw out the program
> cache BO.  So, the first shader upload after any drawing would hit this
> "abandon the cache and start over" copying path.
> 
> This is largely unnecessary - it's just ancient and crufty code.  We can
> use the same persistent mapping paths on all platforms.  On non-ancient
> kernels, this will use a write combining map, which should be reasonably
> fast.
> 
> One aspect that is worse: we do occasionally grow the program cache BO,
> and copy the old contents to the newer BO.  This will suffer from UC
> readback performance now.  To mitigate this, we use the MOVNTDQA based
> streaming memcpy on platforms with SSE 4.1 (all Gen7+ atoms).  Gen4-5
> are unfortunately going to be penalized.
> 
> v2: Add MOVNTDQA path, rebase on other map flag changes.

Don't forgot cache->bo_used_by_gpu!

diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h
index 2acebaa820..a4a04daaa9 100644
--- a/src/mesa/drivers/dri/i965/brw_context.h
+++ b/src/mesa/drivers/dri/i965/brw_context.h
@@ -373,7 +373,6 @@ struct brw_cache {
    GLuint size, n_items;
 
    uint32_t next_offset;
-   bool bo_used_by_gpu;
 };
 
 /* Considered adding a member to this struct to document which flags
diff --git a/src/mesa/drivers/dri/i965/brw_program_cache.c b/src/mesa/drivers/dri/i965/brw_program_cache.c
index 8d83af71d3..4dcfd5234d 100644
--- a/src/mesa/drivers/dri/i965/brw_program_cache.c
+++ b/src/mesa/drivers/dri/i965/brw_program_cache.c
@@ -238,7 +238,6 @@ brw_cache_new_bo(struct brw_cache *cache, uint32_t new_size)
    brw_bo_unreference(cache->bo);
    cache->bo = new_bo;
    cache->map = map;
-   cache->bo_used_by_gpu = false;
 
    /* Since we have a new BO in place, we need to signal the units
     * that depend on it (state base address on gen5+, or unit state before).
diff --git a/src/mesa/drivers/dri/i965/intel_batchbuffer.c b/src/mesa/drivers/dri/i965/intel_batchbuffer.c
index 4461a59b80..e2f208a3d1 100644
--- a/src/mesa/drivers/dri/i965/intel_batchbuffer.c
+++ b/src/mesa/drivers/dri/i965/intel_batchbuffer.c
@@ -465,12 +465,6 @@ brw_finish_batch(struct brw_context *brw)
                                           PIPE_CONTROL_CS_STALL);
       }
    }
-
-   /* Mark that the current program cache BO has been used by the GPU.
-    * It will be reallocated if we need to put new programs in for the
-    * next batch.
-    */
-   brw->cache.bo_used_by_gpu = true;
 }
 
 static void


More information about the mesa-dev mailing list