Mesa (master): dri: Fold attribMap into the code

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Mar 30 20:56:39 UTC 2021


Module: Mesa
Branch: master
Commit: 1f626eb6a922749e145bf6c8dff62a2e071fecf3
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=1f626eb6a922749e145bf6c8dff62a2e071fecf3

Author: Adam Jackson <ajax at redhat.com>
Date:   Fri Mar 26 22:34:17 2021 -0400

dri: Fold attribMap into the code

This table is mostly a mapping into struct gl_config, which is about to
get radically simplified, so we're going to need code to compute values
here instead of just looking up fields in a struct. Keeping the __ATTRIB
bit is somewhat ugly, but we'll expand it back out after the gl_config
changes settle.

Reviewed-by: Eric Anholt <eric at anholt.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9817>

---

 src/mesa/drivers/dri/common/utils.c | 139 +++++++++++++++---------------------
 1 file changed, 59 insertions(+), 80 deletions(-)

diff --git a/src/mesa/drivers/dri/common/utils.c b/src/mesa/drivers/dri/common/utils.c
index 93b621c56b5..bc0dd6b9b61 100644
--- a/src/mesa/drivers/dri/common/utils.c
+++ b/src/mesa/drivers/dri/common/utils.c
@@ -421,69 +421,8 @@ __DRIconfig **driConcatConfigs(__DRIconfig **a,
     return all;
 }
 
-#define __ATTRIB(attrib, field) \
-    { attrib, offsetof(struct gl_config, field) }
-
-static const struct { unsigned int attrib, offset; } attribMap[] = {
-    __ATTRIB(__DRI_ATTRIB_BUFFER_SIZE,			rgbBits),
-    __ATTRIB(__DRI_ATTRIB_LEVEL,			level),
-    __ATTRIB(__DRI_ATTRIB_RED_SIZE,			redBits),
-    __ATTRIB(__DRI_ATTRIB_GREEN_SIZE,			greenBits),
-    __ATTRIB(__DRI_ATTRIB_BLUE_SIZE,			blueBits),
-    __ATTRIB(__DRI_ATTRIB_ALPHA_SIZE,			alphaBits),
-    __ATTRIB(__DRI_ATTRIB_DEPTH_SIZE,			depthBits),
-    __ATTRIB(__DRI_ATTRIB_STENCIL_SIZE,			stencilBits),
-    __ATTRIB(__DRI_ATTRIB_ACCUM_RED_SIZE,		accumRedBits),
-    __ATTRIB(__DRI_ATTRIB_ACCUM_GREEN_SIZE,		accumGreenBits),
-    __ATTRIB(__DRI_ATTRIB_ACCUM_BLUE_SIZE,		accumBlueBits),
-    __ATTRIB(__DRI_ATTRIB_ACCUM_ALPHA_SIZE,		accumAlphaBits),
-    __ATTRIB(__DRI_ATTRIB_SAMPLE_BUFFERS,		sampleBuffers),
-    __ATTRIB(__DRI_ATTRIB_SAMPLES,			samples),
-    __ATTRIB(__DRI_ATTRIB_DOUBLE_BUFFER,		doubleBufferMode),
-    __ATTRIB(__DRI_ATTRIB_STEREO,			stereoMode),
-    __ATTRIB(__DRI_ATTRIB_AUX_BUFFERS,			numAuxBuffers),
-    __ATTRIB(__DRI_ATTRIB_TRANSPARENT_TYPE,		transparentPixel),
-    __ATTRIB(__DRI_ATTRIB_TRANSPARENT_INDEX_VALUE,	transparentPixel),
-    __ATTRIB(__DRI_ATTRIB_TRANSPARENT_RED_VALUE,	transparentRed),
-    __ATTRIB(__DRI_ATTRIB_TRANSPARENT_GREEN_VALUE,	transparentGreen),
-    __ATTRIB(__DRI_ATTRIB_TRANSPARENT_BLUE_VALUE,	transparentBlue),
-    __ATTRIB(__DRI_ATTRIB_TRANSPARENT_ALPHA_VALUE,	transparentAlpha),
-    __ATTRIB(__DRI_ATTRIB_RED_MASK,			redMask),
-    __ATTRIB(__DRI_ATTRIB_GREEN_MASK,			greenMask),
-    __ATTRIB(__DRI_ATTRIB_BLUE_MASK,			blueMask),
-    __ATTRIB(__DRI_ATTRIB_ALPHA_MASK,			alphaMask),
-    __ATTRIB(__DRI_ATTRIB_MAX_PBUFFER_WIDTH,		maxPbufferWidth),
-    __ATTRIB(__DRI_ATTRIB_MAX_PBUFFER_HEIGHT,		maxPbufferHeight),
-    __ATTRIB(__DRI_ATTRIB_MAX_PBUFFER_PIXELS,		maxPbufferPixels),
-    __ATTRIB(__DRI_ATTRIB_OPTIMAL_PBUFFER_WIDTH,	optimalPbufferWidth),
-    __ATTRIB(__DRI_ATTRIB_OPTIMAL_PBUFFER_HEIGHT,	optimalPbufferHeight),
-    __ATTRIB(__DRI_ATTRIB_SWAP_METHOD,			swapMethod),
-    __ATTRIB(__DRI_ATTRIB_BIND_TO_TEXTURE_RGB,		bindToTextureRgb),
-    __ATTRIB(__DRI_ATTRIB_BIND_TO_TEXTURE_RGBA,		bindToTextureRgba),
-    __ATTRIB(__DRI_ATTRIB_BIND_TO_MIPMAP_TEXTURE,	bindToMipmapTexture),
-    __ATTRIB(__DRI_ATTRIB_BIND_TO_TEXTURE_TARGETS,	bindToTextureTargets),
-    __ATTRIB(__DRI_ATTRIB_YINVERTED,			yInverted),
-    __ATTRIB(__DRI_ATTRIB_FRAMEBUFFER_SRGB_CAPABLE,	sRGBCapable),
-    __ATTRIB(__DRI_ATTRIB_MUTABLE_RENDER_BUFFER,	mutableRenderBuffer),
-    __ATTRIB(__DRI_ATTRIB_RED_SHIFT,			redShift),
-    __ATTRIB(__DRI_ATTRIB_GREEN_SHIFT,			greenShift),
-    __ATTRIB(__DRI_ATTRIB_BLUE_SHIFT,			blueShift),
-    __ATTRIB(__DRI_ATTRIB_ALPHA_SHIFT,			alphaShift),
-
-    /* The struct field doesn't matter here, these are handled by the
-     * switch in driGetConfigAttribIndex.  We need them in the array
-     * so the iterator includes them though.*/
-    __ATTRIB(__DRI_ATTRIB_LUMINANCE_SIZE,               level),
-    __ATTRIB(__DRI_ATTRIB_RENDER_TYPE,			level),
-    __ATTRIB(__DRI_ATTRIB_CONFIG_CAVEAT,		level),
-    __ATTRIB(__DRI_ATTRIB_CONFORMANT,                   level),
-    __ATTRIB(__DRI_ATTRIB_FLOAT_MODE,                   level),
-    __ATTRIB(__DRI_ATTRIB_VISUAL_SELECT_GROUP,          level),
-    __ATTRIB(__DRI_ATTRIB_MAX_SWAP_INTERVAL,            level),
-    __ATTRIB(__DRI_ATTRIB_MIN_SWAP_INTERVAL,            level),
-
-};
-
+/* careful, lack of trailing semicolon */
+#define __ATTRIB(attrib, field) case attrib: *value = config->modes.field; break
 
 /**
  * Return the value of a configuration attribute.  The attribute is
@@ -493,10 +432,30 @@ static int
 driGetConfigAttribIndex(const __DRIconfig *config,
 			unsigned int index, unsigned int *value)
 {
-    switch (attribMap[index].attrib) {
+    switch (index + 1) {
+    __ATTRIB(__DRI_ATTRIB_BUFFER_SIZE,			rgbBits);
+    __ATTRIB(__DRI_ATTRIB_LEVEL,			level);
+    __ATTRIB(__DRI_ATTRIB_RED_SIZE,			redBits);
+    __ATTRIB(__DRI_ATTRIB_GREEN_SIZE,			greenBits);
+    __ATTRIB(__DRI_ATTRIB_BLUE_SIZE,			blueBits);
     case __DRI_ATTRIB_LUMINANCE_SIZE:
         *value = 0;
         break;
+    __ATTRIB(__DRI_ATTRIB_ALPHA_SIZE,			alphaBits);
+    case __DRI_ATTRIB_ALPHA_MASK_SIZE:
+        /* I have no idea what this value was ever meant to mean, it's
+         * never been set to anything, just say 0.
+         */
+        *value = 0;
+        break;
+    __ATTRIB(__DRI_ATTRIB_DEPTH_SIZE,			depthBits);
+    __ATTRIB(__DRI_ATTRIB_STENCIL_SIZE,			stencilBits);
+    __ATTRIB(__DRI_ATTRIB_ACCUM_RED_SIZE,		accumRedBits);
+    __ATTRIB(__DRI_ATTRIB_ACCUM_GREEN_SIZE,		accumGreenBits);
+    __ATTRIB(__DRI_ATTRIB_ACCUM_BLUE_SIZE,		accumBlueBits);
+    __ATTRIB(__DRI_ATTRIB_ACCUM_ALPHA_SIZE,		accumAlphaBits);
+    __ATTRIB(__DRI_ATTRIB_SAMPLE_BUFFERS,		sampleBuffers);
+    __ATTRIB(__DRI_ATTRIB_SAMPLES,			samples);
     case __DRI_ATTRIB_RENDER_TYPE:
         /* no support for color index mode */
 	*value = __DRI_ATTRIB_RGBA_BIT;
@@ -514,30 +473,56 @@ driGetConfigAttribIndex(const __DRIconfig *config,
     case __DRI_ATTRIB_CONFORMANT:
         *value = GL_TRUE;
         break;
+    __ATTRIB(__DRI_ATTRIB_DOUBLE_BUFFER,		doubleBufferMode);
+    __ATTRIB(__DRI_ATTRIB_STEREO,			stereoMode);
+    __ATTRIB(__DRI_ATTRIB_AUX_BUFFERS,			numAuxBuffers);
+    __ATTRIB(__DRI_ATTRIB_TRANSPARENT_TYPE,		transparentPixel);
+    __ATTRIB(__DRI_ATTRIB_TRANSPARENT_INDEX_VALUE,	transparentPixel);
+    __ATTRIB(__DRI_ATTRIB_TRANSPARENT_RED_VALUE,	transparentRed);
+    __ATTRIB(__DRI_ATTRIB_TRANSPARENT_GREEN_VALUE,	transparentGreen);
+    __ATTRIB(__DRI_ATTRIB_TRANSPARENT_BLUE_VALUE,	transparentBlue);
+    __ATTRIB(__DRI_ATTRIB_TRANSPARENT_ALPHA_VALUE,	transparentAlpha);
     case __DRI_ATTRIB_FLOAT_MODE:
         *value = config->modes.floatMode;
         break;
+    __ATTRIB(__DRI_ATTRIB_RED_MASK,			redMask);
+    __ATTRIB(__DRI_ATTRIB_GREEN_MASK,			greenMask);
+    __ATTRIB(__DRI_ATTRIB_BLUE_MASK,			blueMask);
+    __ATTRIB(__DRI_ATTRIB_ALPHA_MASK,			alphaMask);
+    __ATTRIB(__DRI_ATTRIB_MAX_PBUFFER_WIDTH,		maxPbufferWidth);
+    __ATTRIB(__DRI_ATTRIB_MAX_PBUFFER_HEIGHT,		maxPbufferHeight);
+    __ATTRIB(__DRI_ATTRIB_MAX_PBUFFER_PIXELS,		maxPbufferPixels);
+    __ATTRIB(__DRI_ATTRIB_OPTIMAL_PBUFFER_WIDTH,	optimalPbufferWidth);
+    __ATTRIB(__DRI_ATTRIB_OPTIMAL_PBUFFER_HEIGHT,	optimalPbufferHeight);
     case __DRI_ATTRIB_VISUAL_SELECT_GROUP:
         *value = 0;
         break;
+    __ATTRIB(__DRI_ATTRIB_SWAP_METHOD,			swapMethod);
     case __DRI_ATTRIB_MAX_SWAP_INTERVAL:
         *value = INT_MAX;
         break;
     case __DRI_ATTRIB_MIN_SWAP_INTERVAL:
         *value = 0;
         break;
+    __ATTRIB(__DRI_ATTRIB_BIND_TO_TEXTURE_RGB,		bindToTextureRgb);
+    __ATTRIB(__DRI_ATTRIB_BIND_TO_TEXTURE_RGBA,		bindToTextureRgba);
+    __ATTRIB(__DRI_ATTRIB_BIND_TO_MIPMAP_TEXTURE,	bindToMipmapTexture);
+    __ATTRIB(__DRI_ATTRIB_BIND_TO_TEXTURE_TARGETS,	bindToTextureTargets);
+    __ATTRIB(__DRI_ATTRIB_YINVERTED,			yInverted);
+    __ATTRIB(__DRI_ATTRIB_FRAMEBUFFER_SRGB_CAPABLE,	sRGBCapable);
+    __ATTRIB(__DRI_ATTRIB_MUTABLE_RENDER_BUFFER,	mutableRenderBuffer);
+    __ATTRIB(__DRI_ATTRIB_RED_SHIFT,			redShift);
+    __ATTRIB(__DRI_ATTRIB_GREEN_SHIFT,			greenShift);
+    __ATTRIB(__DRI_ATTRIB_BLUE_SHIFT,			blueShift);
+    __ATTRIB(__DRI_ATTRIB_ALPHA_SHIFT,			alphaShift);
     default:
-        /* any other int-sized field */
-	*value = *(unsigned int *)
-	    ((char *) &config->modes + attribMap[index].offset);
-	
-	break;
+        /* XXX log an error or smth */
+        return GL_FALSE;
     }
 
     return GL_TRUE;
 }
 
-
 /**
  * Get the value of a configuration attribute.
  * \param attrib  the attribute (one of the _DRI_ATTRIB_x tokens)
@@ -548,13 +533,7 @@ int
 driGetConfigAttrib(const __DRIconfig *config,
 		   unsigned int attrib, unsigned int *value)
 {
-    unsigned i;
-
-    for (i = 0; i < ARRAY_SIZE(attribMap); i++)
-	if (attribMap[i].attrib == attrib)
-	    return driGetConfigAttribIndex(config, i, value);
-
-    return GL_FALSE;
+    return driGetConfigAttribIndex(config, attrib - 1, value);
 }
 
 
@@ -569,9 +548,9 @@ int
 driIndexConfigAttrib(const __DRIconfig *config, int index,
 		     unsigned int *attrib, unsigned int *value)
 {
-    if (index >= 0 && index < ARRAY_SIZE(attribMap)) {
-	*attrib = attribMap[index].attrib;
-	return driGetConfigAttribIndex(config, index, value);
+    if (driGetConfigAttribIndex(config, index, value)) {
+        *attrib = index + 1;
+        return GL_TRUE;
     }
 
     return GL_FALSE;



More information about the mesa-commit mailing list