On 17/05/17 08:45, Jason Ekstrand wrote:
Having it be a pointer means that we end up caching clip programs based
on a pointer to wm_prog_data rather than the actual interpolation modes.
We've been caching one clip program per FS ever since 91d61fbf7cb61a44a
where Timothy rewrote brw_setup_vue_interpolation().

Apologies, that change also had other caching issues that were later fixed. It seems this area isn't very well covered by piglit.

---
  src/mesa/drivers/dri/i965/brw_clip.c | 6 +++++-
  src/mesa/drivers/dri/i965/brw_clip.h | 2 +-
  2 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_clip.c 
b/src/mesa/drivers/dri/i965/brw_clip.c
index 4187207..34325a7 100644
--- a/src/mesa/drivers/dri/i965/brw_clip.c
+++ b/src/mesa/drivers/dri/i965/brw_clip.c
@@ -155,7 +155,11 @@ brw_upload_clip_prog(struct brw_context *brw)
        key.contains_flat_varying = wm_prog_data->contains_flat_varying;
        key.contains_noperspective_varying =
           wm_prog_data->contains_noperspective_varying;
-      key.interp_mode = wm_prog_data->interp_mode;
+
+      STATIC_ASSERT(sizeof(key.interp_mode) ==
+                    sizeof(wm_prog_data->interp_mode));
+      memcpy(key.interp_mode, wm_prog_data->interp_mode,
+             sizeof(key.interp_mode));
     }
/* BRW_NEW_REDUCED_PRIMITIVE */
diff --git a/src/mesa/drivers/dri/i965/brw_clip.h 
b/src/mesa/drivers/dri/i965/brw_clip.h
index 9dc1f12..2dc84d8 100644
--- a/src/mesa/drivers/dri/i965/brw_clip.h
+++ b/src/mesa/drivers/dri/i965/brw_clip.h
@@ -49,7 +49,7 @@ struct brw_clip_prog_key {
     GLbitfield64 attrs;
     bool contains_flat_varying;
     bool contains_noperspective_varying;
-   const unsigned char *interp_mode;
+   unsigned char interp_mode[65]; /* BRW_VARYING_SLOT_COUNT */
     GLuint primitive:4;
     GLuint nr_userclip:4;
     GLuint pv_first:1;

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to