Mesa (main): gallium: change pipe_vertex_element::src_format to uint8_t

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Aug 2 20:35:19 UTC 2021


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

Author: Marek Olšák <marek.olsak at amd.com>
Date:   Fri May 28 15:22:03 2021 -0400

gallium: change pipe_vertex_element::src_format to uint8_t

This removes the bitfield packing/unpacking.

pipe_format entries are reordered to have vertex formats first because
vertex formats must be <= 255.

Reviewed-by: Alyssa Rosenzweig <alyssa at collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11370>

---

 src/gallium/drivers/d3d12/d3d12_context.cpp |   6 +-
 src/gallium/drivers/swr/swr_state.cpp       |   6 +-
 src/gallium/include/pipe/p_format.h         | 135 ++++++++++++++--------------
 src/gallium/include/pipe/p_state.h          |   9 +-
 src/mesa/main/varray.c                      |   2 +
 5 files changed, 82 insertions(+), 76 deletions(-)

diff --git a/src/gallium/drivers/d3d12/d3d12_context.cpp b/src/gallium/drivers/d3d12/d3d12_context.cpp
index 8661b280357..6167f9be28b 100644
--- a/src/gallium/drivers/d3d12/d3d12_context.cpp
+++ b/src/gallium/drivers/d3d12/d3d12_context.cpp
@@ -102,10 +102,12 @@ d3d12_create_vertex_elements_state(struct pipe_context *pctx,
       cso->elements[i].SemanticName = "TEXCOORD";
       cso->elements[i].SemanticIndex = i;
 
-      enum pipe_format format_helper = d3d12_emulated_vtx_format(elements[i].src_format);
+      enum pipe_format format_helper =
+         d3d12_emulated_vtx_format((enum pipe_format)elements[i].src_format);
       bool needs_emulation = format_helper != elements[i].src_format;
       cso->needs_format_emulation |= needs_emulation;
-      cso->format_conversion[i] = needs_emulation ? elements[i].src_format : PIPE_FORMAT_NONE;
+      cso->format_conversion[i] =
+         needs_emulation ? (enum pipe_format)elements[i].src_format : PIPE_FORMAT_NONE;
 
       cso->elements[i].Format = d3d12_get_format(format_helper);
       assert(cso->elements[i].Format != DXGI_FORMAT_UNKNOWN);
diff --git a/src/gallium/drivers/swr/swr_state.cpp b/src/gallium/drivers/swr/swr_state.cpp
index bea1c1e8b5e..6a56e227417 100644
--- a/src/gallium/drivers/swr/swr_state.cpp
+++ b/src/gallium/drivers/swr/swr_state.cpp
@@ -596,11 +596,11 @@ swr_create_vertex_elements_state(struct pipe_context *pipe,
          // XXX: we should do this keyed on the VS usage info
 
          const struct util_format_description *desc =
-            util_format_description(attribs[i].src_format);
+            util_format_description((enum pipe_format)attribs[i].src_format);
 
          velems->fsState.layout[i].AlignedByteOffset = attribs[i].src_offset;
          velems->fsState.layout[i].Format =
-            mesa_to_swr_format(attribs[i].src_format);
+            mesa_to_swr_format((enum pipe_format)attribs[i].src_format);
          velems->fsState.layout[i].StreamIndex =
             attribs[i].vertex_buffer_index;
          velems->fsState.layout[i].InstanceEnable =
@@ -627,7 +627,7 @@ swr_create_vertex_elements_state(struct pipe_context *pipe,
 
          /* Calculate the pitch of each stream */
          const SWR_FORMAT_INFO &swr_desc = GetFormatInfo(
-            mesa_to_swr_format(attribs[i].src_format));
+            mesa_to_swr_format((enum pipe_format)attribs[i].src_format));
          velems->stream_pitch[attribs[i].vertex_buffer_index] += swr_desc.Bpp;
 
          if (attribs[i].instance_divisor != 0) {
diff --git a/src/gallium/include/pipe/p_format.h b/src/gallium/include/pipe/p_format.h
index 0c93d7df6e2..f2d4be77db9 100644
--- a/src/gallium/include/pipe/p_format.h
+++ b/src/gallium/include/pipe/p_format.h
@@ -40,32 +40,7 @@ extern "C" {
  */
 enum pipe_format {
    PIPE_FORMAT_NONE,
-   PIPE_FORMAT_B8G8R8A8_UNORM,
-   PIPE_FORMAT_B8G8R8X8_UNORM,
-   PIPE_FORMAT_A8R8G8B8_UNORM,
-   PIPE_FORMAT_X8R8G8B8_UNORM,
-   PIPE_FORMAT_B5G5R5A1_UNORM,
-   PIPE_FORMAT_R4G4B4A4_UNORM,
-   PIPE_FORMAT_B4G4R4A4_UNORM,
-   PIPE_FORMAT_R5G6B5_UNORM,
-   PIPE_FORMAT_B5G6R5_UNORM,
-   PIPE_FORMAT_R10G10B10A2_UNORM,
-   PIPE_FORMAT_L8_UNORM,    /**< ubyte luminance */
-   PIPE_FORMAT_A8_UNORM,    /**< ubyte alpha */
-   PIPE_FORMAT_I8_UNORM,    /**< ubyte intensity */
-   PIPE_FORMAT_L8A8_UNORM,  /**< ubyte alpha, luminance */
-   PIPE_FORMAT_L16_UNORM,   /**< ushort luminance */
-   PIPE_FORMAT_UYVY,
-   PIPE_FORMAT_YUYV,
-   PIPE_FORMAT_Z16_UNORM,
-   PIPE_FORMAT_Z16_UNORM_S8_UINT,
-   PIPE_FORMAT_Z32_UNORM,
-   PIPE_FORMAT_Z32_FLOAT,
-   PIPE_FORMAT_Z24_UNORM_S8_UINT,
-   PIPE_FORMAT_S8_UINT_Z24_UNORM,
-   PIPE_FORMAT_Z24X8_UNORM,
-   PIPE_FORMAT_X8Z24_UNORM,
-   PIPE_FORMAT_S8_UINT,     /**< ubyte stencil */
+   /* Vertex formats must be first and must be <= 255. */
    PIPE_FORMAT_R64_FLOAT,
    PIPE_FORMAT_R64G64_FLOAT,
    PIPE_FORMAT_R64G64B64_FLOAT,
@@ -109,9 +84,8 @@ enum pipe_format {
    PIPE_FORMAT_R8_UNORM,
    PIPE_FORMAT_R8G8_UNORM,
    PIPE_FORMAT_R8G8B8_UNORM,
-   PIPE_FORMAT_B8G8R8_UNORM,
    PIPE_FORMAT_R8G8B8A8_UNORM,
-   PIPE_FORMAT_X8B8G8R8_UNORM,
+   PIPE_FORMAT_B8G8R8A8_UNORM,
    PIPE_FORMAT_R8_USCALED,
    PIPE_FORMAT_R8G8_USCALED,
    PIPE_FORMAT_R8G8B8_USCALED,
@@ -132,6 +106,7 @@ enum pipe_format {
    PIPE_FORMAT_R8G8B8A8_SSCALED,
    PIPE_FORMAT_B8G8R8A8_SSCALED,
    PIPE_FORMAT_A8B8G8R8_SSCALED,
+   PIPE_FORMAT_A8R8G8B8_UNORM,
    PIPE_FORMAT_R32_FIXED,
    PIPE_FORMAT_R32G32_FIXED,
    PIPE_FORMAT_R32G32B32_FIXED,
@@ -140,6 +115,70 @@ enum pipe_format {
    PIPE_FORMAT_R16G16_FLOAT,
    PIPE_FORMAT_R16G16B16_FLOAT,
    PIPE_FORMAT_R16G16B16A16_FLOAT,
+   PIPE_FORMAT_R8_UINT,
+   PIPE_FORMAT_R8G8_UINT,
+   PIPE_FORMAT_R8G8B8_UINT,
+   PIPE_FORMAT_R8G8B8A8_UINT,
+   PIPE_FORMAT_R8_SINT,
+   PIPE_FORMAT_R8G8_SINT,
+   PIPE_FORMAT_R8G8B8_SINT,
+   PIPE_FORMAT_R8G8B8A8_SINT,
+   PIPE_FORMAT_R16_UINT,
+   PIPE_FORMAT_R16G16_UINT,
+   PIPE_FORMAT_R16G16B16_UINT,
+   PIPE_FORMAT_R16G16B16A16_UINT,
+   PIPE_FORMAT_R16_SINT,
+   PIPE_FORMAT_R16G16_SINT,
+   PIPE_FORMAT_R16G16B16_SINT,
+   PIPE_FORMAT_R16G16B16A16_SINT,
+   PIPE_FORMAT_R32_UINT,
+   PIPE_FORMAT_R32G32_UINT,
+   PIPE_FORMAT_R32G32B32_UINT,
+   PIPE_FORMAT_R32G32B32A32_UINT,
+   PIPE_FORMAT_R32_SINT,
+   PIPE_FORMAT_R32G32_SINT,
+   PIPE_FORMAT_R32G32B32_SINT,
+   PIPE_FORMAT_R32G32B32A32_SINT,
+
+   PIPE_FORMAT_R10G10B10A2_UNORM,
+   PIPE_FORMAT_R10G10B10A2_SNORM,
+   PIPE_FORMAT_R10G10B10A2_USCALED,
+   PIPE_FORMAT_R10G10B10A2_SSCALED,
+
+   PIPE_FORMAT_B10G10R10A2_UNORM,
+   PIPE_FORMAT_B10G10R10A2_SNORM,
+   PIPE_FORMAT_B10G10R10A2_USCALED,
+   PIPE_FORMAT_B10G10R10A2_SSCALED,
+
+   PIPE_FORMAT_R11G11B10_FLOAT,
+   /* End of vertex formats. */
+
+   /* Texture-only formats are below. */
+   PIPE_FORMAT_B8G8R8_UNORM,
+   PIPE_FORMAT_B8G8R8X8_UNORM,
+   PIPE_FORMAT_X8B8G8R8_UNORM,
+   PIPE_FORMAT_X8R8G8B8_UNORM,
+   PIPE_FORMAT_B5G5R5A1_UNORM,
+   PIPE_FORMAT_R4G4B4A4_UNORM,
+   PIPE_FORMAT_B4G4R4A4_UNORM,
+   PIPE_FORMAT_R5G6B5_UNORM,
+   PIPE_FORMAT_B5G6R5_UNORM,
+   PIPE_FORMAT_L8_UNORM,    /**< ubyte luminance */
+   PIPE_FORMAT_A8_UNORM,    /**< ubyte alpha */
+   PIPE_FORMAT_I8_UNORM,    /**< ubyte intensity */
+   PIPE_FORMAT_L8A8_UNORM,  /**< ubyte alpha, luminance */
+   PIPE_FORMAT_L16_UNORM,   /**< ushort luminance */
+   PIPE_FORMAT_UYVY,
+   PIPE_FORMAT_YUYV,
+   PIPE_FORMAT_Z16_UNORM,
+   PIPE_FORMAT_Z16_UNORM_S8_UINT,
+   PIPE_FORMAT_Z32_UNORM,
+   PIPE_FORMAT_Z32_FLOAT,
+   PIPE_FORMAT_Z24_UNORM_S8_UINT,
+   PIPE_FORMAT_S8_UINT_Z24_UNORM,
+   PIPE_FORMAT_Z24X8_UNORM,
+   PIPE_FORMAT_X8Z24_UNORM,
+   PIPE_FORMAT_S8_UINT,     /**< ubyte stencil */
 
    /* sRGB formats */
    PIPE_FORMAT_L8_SRGB,
@@ -184,8 +223,6 @@ enum pipe_format {
    /* TODO: re-order these */
    PIPE_FORMAT_A8B8G8R8_UNORM,
    PIPE_FORMAT_B5G5R5X1_UNORM,
-   PIPE_FORMAT_R10G10B10A2_USCALED,
-   PIPE_FORMAT_R11G11B10_FLOAT,
    PIPE_FORMAT_R9G9B9E5_FLOAT,
    PIPE_FORMAT_Z32_FLOAT_S8X24_UINT,
    PIPE_FORMAT_R1_UNORM,
@@ -194,7 +231,6 @@ enum pipe_format {
    PIPE_FORMAT_L4A4_UNORM,
    PIPE_FORMAT_A2R10G10B10_UNORM,
    PIPE_FORMAT_A2B10G10R10_UNORM,
-   PIPE_FORMAT_B10G10R10A2_UNORM,
    PIPE_FORMAT_R10SG10SB10SA2U_NORM,
    PIPE_FORMAT_R8G8Bx_SNORM,
    PIPE_FORMAT_R8G8B8X8_UNORM,
@@ -257,43 +293,6 @@ enum pipe_format {
    PIPE_FORMAT_R8A8_UNORM,
    PIPE_FORMAT_A8R8_UNORM,
 
-   PIPE_FORMAT_R10G10B10A2_SSCALED,
-   PIPE_FORMAT_R10G10B10A2_SNORM,
-
-   PIPE_FORMAT_B10G10R10A2_USCALED,
-   PIPE_FORMAT_B10G10R10A2_SSCALED,
-   PIPE_FORMAT_B10G10R10A2_SNORM,
-
-   PIPE_FORMAT_R8_UINT,
-   PIPE_FORMAT_R8G8_UINT,
-   PIPE_FORMAT_R8G8B8_UINT,
-   PIPE_FORMAT_R8G8B8A8_UINT,
-
-   PIPE_FORMAT_R8_SINT,
-   PIPE_FORMAT_R8G8_SINT,
-   PIPE_FORMAT_R8G8B8_SINT,
-   PIPE_FORMAT_R8G8B8A8_SINT,
-
-   PIPE_FORMAT_R16_UINT,
-   PIPE_FORMAT_R16G16_UINT,
-   PIPE_FORMAT_R16G16B16_UINT,
-   PIPE_FORMAT_R16G16B16A16_UINT,
-
-   PIPE_FORMAT_R16_SINT,
-   PIPE_FORMAT_R16G16_SINT,
-   PIPE_FORMAT_R16G16B16_SINT,
-   PIPE_FORMAT_R16G16B16A16_SINT,
-
-   PIPE_FORMAT_R32_UINT,
-   PIPE_FORMAT_R32G32_UINT,
-   PIPE_FORMAT_R32G32B32_UINT,
-   PIPE_FORMAT_R32G32B32A32_UINT,
-
-   PIPE_FORMAT_R32_SINT,
-   PIPE_FORMAT_R32G32_SINT,
-   PIPE_FORMAT_R32G32B32_SINT,
-   PIPE_FORMAT_R32G32B32A32_SINT,
-
    PIPE_FORMAT_R64_UINT,
    PIPE_FORMAT_R64_SINT,
 
diff --git a/src/gallium/include/pipe/p_state.h b/src/gallium/include/pipe/p_state.h
index 8e56f8e4391..788a74fe10f 100644
--- a/src/gallium/include/pipe/p_state.h
+++ b/src/gallium/include/pipe/p_state.h
@@ -674,14 +674,17 @@ struct pipe_stream_output_target
 struct pipe_vertex_element
 {
    /** Offset of this attribute, in bytes, from the start of the vertex */
-   unsigned src_offset:16;
+   uint16_t src_offset;
 
    /** Which vertex_buffer (as given to pipe->set_vertex_buffer()) does
     * this attribute live in?
     */
-   unsigned vertex_buffer_index:5;
+   uint8_t vertex_buffer_index;
 
-   enum pipe_format src_format:11;
+   /**
+    * This has only 8 bits because all vertex formats should be <= 255.
+    */
+   uint8_t src_format; /* low 8 bits of enum pipe_format. */
 
    /** Instance data rate divisor. 0 means this is per-vertex data,
     *  n means per-instance data used for n consecutive instances (n > 0).
diff --git a/src/mesa/main/varray.c b/src/mesa/main/varray.c
index ad34e44a49e..50bae007d8e 100644
--- a/src/mesa/main/varray.c
+++ b/src/mesa/main/varray.c
@@ -545,6 +545,8 @@ _mesa_set_vertex_format(struct gl_vertex_format *vertex_format,
    vertex_format->_PipeFormat =
       vertex_format_to_pipe_format(size, type, format, normalized, integer,
                                    doubles);
+   /* pipe_vertex_element::src_format has only 8 bits, assuming a signed enum */
+   assert(vertex_format->_PipeFormat <= 255);
 }
 
 



More information about the mesa-commit mailing list