[Mesa-dev] [PATCH 21/43] i965/sf: make brw_sf_prog_key::interp_mode an array

Jason Ekstrand jason at jlekstrand.net
Tue May 16 22:45:15 UTC 2017


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().
---
 src/mesa/drivers/dri/i965/brw_sf.c | 6 +++++-
 src/mesa/drivers/dri/i965/brw_sf.h | 2 +-
 2 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_sf.c b/src/mesa/drivers/dri/i965/brw_sf.c
index ff15c97..5b26979 100644
--- a/src/mesa/drivers/dri/i965/brw_sf.c
+++ b/src/mesa/drivers/dri/i965/brw_sf.c
@@ -207,7 +207,11 @@ brw_upload_sf_prog(struct brw_context *brw)
       brw_wm_prog_data(brw->wm.base.prog_data);
    if (wm_prog_data) {
       key.contains_flat_varying = wm_prog_data->contains_flat_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));
    }
 
    /* _NEW_LIGHT | _NEW_PROGRAM */
diff --git a/src/mesa/drivers/dri/i965/brw_sf.h b/src/mesa/drivers/dri/i965/brw_sf.h
index f372656..5450344 100644
--- a/src/mesa/drivers/dri/i965/brw_sf.h
+++ b/src/mesa/drivers/dri/i965/brw_sf.h
@@ -47,7 +47,7 @@
 struct brw_sf_prog_key {
    GLbitfield64 attrs;
    bool contains_flat_varying;
-   const unsigned char *interp_mode;
+   unsigned char interp_mode[65]; /* BRW_VARYING_SLOT_COUNT */
    uint8_t point_sprite_coord_replace;
    GLuint primitive:2;
    GLuint do_twoside_color:1;
-- 
2.5.0.400.gff86faf



More information about the mesa-dev mailing list