<html>
    <head>
      <base href="https://bugs.freedesktop.org/" />
    </head>
    <body><table border="1" cellspacing="0" cellpadding="8">
        <tr>
          <th>Priority</th>
          <td>medium
          </td>
        </tr>

        <tr>
          <th>Bug ID</th>
          <td><a class="bz_bug_link 
          bz_status_NEW "
   title="NEW --- - Unify the format conversion code"
   href="https://bugs.freedesktop.org/show_bug.cgi?id=84566">84566</a>
          </td>
        </tr>

        <tr>
          <th>Assignee</th>
          <td>mesa-dev@lists.freedesktop.org
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>Unify the format conversion code
          </td>
        </tr>

        <tr>
          <th>Severity</th>
          <td>enhancement
          </td>
        </tr>

        <tr>
          <th>Classification</th>
          <td>Unclassified
          </td>
        </tr>

        <tr>
          <th>OS</th>
          <td>All
          </td>
        </tr>

        <tr>
          <th>Reporter</th>
          <td>jason@jlekstrand.net
          </td>
        </tr>

        <tr>
          <th>Hardware</th>
          <td>All
          </td>
        </tr>

        <tr>
          <th>Status</th>
          <td>NEW
          </td>
        </tr>

        <tr>
          <th>Version</th>
          <td>git
          </td>
        </tr>

        <tr>
          <th>Component</th>
          <td>Mesa core
          </td>
        </tr>

        <tr>
          <th>Product</th>
          <td>Mesa
          </td>
        </tr></table>
      <p>
        <div>
        <pre>Right now we have a lot of format conversion code scattered all over mesa.  Off
the top of my head we have:

 * main/format_utils.c: Convert between two array based formats
 * main/format_pack.c: Convert from GLubyte and GLfloat array formats to mesa
formats
 * main/format_unpack.c: Convert from mesa formats to GLubyte, GLfloat, and
GLuint array formats
 * main/pack.c: Convert GL formats to/from GLubyte, GLfloat, and GLuint array
formats.  (This is redundant since all the GL formats are either array formats
or mesa formats)
 * main/texstore.c: Most of the stuff for color formats is gone, but depth and
stencil is still repeated.  Also, there's a terrible 565 path left there.
 * swrast/s_texfetch.c: Mostly a repeat of format_unpack.c
 * gallium/auxilliary/util/: More packing/unpacking functions that are repeats
of the above.

As you can see, there's a lot of repetition.  There's also several places where
we have the same repeated code to do full conversions.  It's a mess.

I would like to fix clean up this mess and unify a lot of the conversion code. 
Here's what I've envisioned:

 1) Autogenerate all of the color packing/unpacking functions
 2) Convert all of the packing/unpacking functions to pack/unpack a rectangle
taking a width, height, and stride.  We can use 1x1 for single-pixel
conversions.
 3) Make swrast use the unpacking functions instead of its own texture sampling
functions.
 4) Add an array format enum that allows us to enumerate all possible array
formats.  Between mesa_format and this array format, we should also be able to
enumerate all of the GL datatypes.
 5) Make a masater conversion function that takes a void*, format, width,
height, and stride for both source and destination and just does the
conversion.  If the above mentioned array format enum is distinct from the
mesa_format enum, the function could be written to take a uint32_t type and
accept either mesa_format or an array format in the same parameter.
 6) Use the above master conversion function for TexSubimage, TexImage,
GetTexImage, DrawPixels, and ReadPixels.  We still have to deal with pixel
conversion, but it should vastly simplify all of them.</pre>
        </div>
      </p>
      <hr>
      <span>You are receiving this mail because:</span>
      
      <ul>
          <li>You are the assignee for the bug.</li>
      </ul>
    </body>
</html>