Mesa (main): intel: properly constify isl_format_layouts

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Jun 4 18:51:23 UTC 2021


Module: Mesa
Branch: main
Commit: ed6e586562f4443c56e385017a109e5a5ca5294e
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=ed6e586562f4443c56e385017a109e5a5ca5294e

Author: Adam Jackson <ajax at redhat.com>
Date:   Thu Jun  3 11:36:00 2021 -0400

intel: properly constify isl_format_layouts

Putting a const char * in the struct means it's a pointer that has to be
resolved at rtld time, which means it can be in .data.rel.ro but not
.rodata like you'd hope. Fix this with the usual string table trick.

Cuts about 20k (-80k read-write +60k read-only) and ~280 relocations
from the gallium driver.

Reviewed-by: Jason Ekstrand <jason at jlekstrand.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11168>

---

 src/intel/isl/gen_format_layout.py          | 15 +++++++++++++--
 src/intel/isl/isl.h                         |  7 +++++--
 src/mesa/drivers/dri/i965/brw_mipmap_tree.c |  2 +-
 3 files changed, 19 insertions(+), 5 deletions(-)

diff --git a/src/intel/isl/gen_format_layout.py b/src/intel/isl/gen_format_layout.py
index b1c4df2574e..540c0537e27 100644
--- a/src/intel/isl/gen_format_layout.py
+++ b/src/intel/isl/gen_format_layout.py
@@ -61,12 +61,23 @@ TEMPLATE = template.Template(future_imports=['division'],
 
 #include "isl/isl.h"
 
+const uint16_t isl_format_name_offsets[] = { <% offset = 0 %>
+% for format in formats:
+    ${offset}, <% offset += 11 + len(format.name) + 1 %>
+% endfor
+};
+
+const char isl_format_names[] = {
+% for format in formats:
+  "ISL_FORMAT_${format.name}\\0"
+% endfor
+};
+
 const struct isl_format_layout
 isl_format_layouts[] = {
 % for format in formats:
   [ISL_FORMAT_${format.name}] = {
     .format = ISL_FORMAT_${format.name},
-    .name = "ISL_FORMAT_${format.name}",
     .bpb = ${format.bpb},
     .bw = ${format.bw},
     .bh = ${format.bh},
@@ -94,7 +105,7 @@ isl_format_is_valid(enum isl_format format)
 {
     if (format >= sizeof(isl_format_layouts) / sizeof(isl_format_layouts[0]))
         return false;
-    return isl_format_layouts[format].name;
+    return true;
 }
 
 enum isl_format
diff --git a/src/intel/isl/isl.h b/src/intel/isl/isl.h
index fb45ac5e06f..cb9610da2e8 100644
--- a/src/intel/isl/isl.h
+++ b/src/intel/isl/isl.h
@@ -1116,7 +1116,6 @@ struct isl_channel_layout {
  */
 struct isl_format_layout {
    enum isl_format format;
-   const char *name;
 
    uint16_t bpb; /**< Bits per block */
    uint8_t bw; /**< Block width, in pixels */
@@ -1522,6 +1521,8 @@ struct isl_depth_stencil_hiz_emit_info {
 };
 
 extern const struct isl_format_layout isl_format_layouts[];
+extern const char isl_format_names[];
+extern const uint16_t isl_format_name_offsets[];
 
 void
 isl_device_init(struct isl_device *dev,
@@ -1544,7 +1545,9 @@ bool isl_format_is_valid(enum isl_format);
 static inline const char * ATTRIBUTE_CONST
 isl_format_get_name(enum isl_format fmt)
 {
-   return isl_format_get_layout(fmt)->name;
+   assert(fmt != ISL_FORMAT_UNSUPPORTED);
+   assert(fmt < ISL_NUM_FORMATS);
+   return isl_format_names + isl_format_name_offsets[fmt];
 }
 
 enum isl_format isl_format_for_pipe_format(enum pipe_format pf);
diff --git a/src/mesa/drivers/dri/i965/brw_mipmap_tree.c b/src/mesa/drivers/dri/i965/brw_mipmap_tree.c
index 2c175c9119a..c2983854f8f 100644
--- a/src/mesa/drivers/dri/i965/brw_mipmap_tree.c
+++ b/src/mesa/drivers/dri/i965/brw_mipmap_tree.c
@@ -1896,7 +1896,7 @@ can_texture_with_ccs(struct brw_context *brw,
    if (!format_ccs_e_compat_with_miptree(&brw->screen->devinfo,
                                          mt, view_format)) {
       perf_debug("Incompatible sampling format (%s) for rbc (%s)\n",
-                 isl_format_get_layout(view_format)->name,
+                 isl_format_get_name(view_format),
                  _mesa_get_format_name(mt->format));
       return false;
    }



More information about the mesa-commit mailing list