egl: Fixes transparency with EGL and X11.
[mesa.git] / src / mesa / drivers / dri / common / utils.c
index fb991e4e483da01d583bf003b02c70dfdebcf242..2d57aef18f2734fd382f0d6aa168e0708595bcb2 100644 (file)
@@ -212,6 +212,12 @@ driCreateConfigs(mesa_format format,
       /* MESA_FORMAT_R10G10B10A2_UNORM */
       {{ 0x000003FF, 0x000FFC00, 0x3FF00000, 0xC0000000 },
        { 0, 10, 20, 30 }},
+      /* MESA_FORMAT_RGBX_FLOAT16 */
+      {{ 0, 0, 0, 0},
+       { 0, 16, 32, -1 }},
+      /* MESA_FORMAT_RGBA_FLOAT16 */
+      {{ 0, 0, 0, 0},
+       { 0, 16, 32, 48 }},
    };
 
    const uint32_t * masks;
@@ -226,6 +232,7 @@ driCreateConfigs(mesa_format format,
    int blue_bits;
    int alpha_bits;
    bool is_srgb;
+   bool is_float;
 
    switch (format) {
    case MESA_FORMAT_B5G6R5_UNORM:
@@ -259,6 +266,14 @@ driCreateConfigs(mesa_format format,
       masks = format_table[4].masks;
       shifts = format_table[4].shifts;
       break;
+   case MESA_FORMAT_RGBX_FLOAT16:
+      masks = format_table[9].masks;
+      shifts = format_table[9].shifts;
+      break;
+   case MESA_FORMAT_RGBA_FLOAT16:
+      masks = format_table[10].masks;
+      shifts = format_table[10].shifts;
+      break;
    case MESA_FORMAT_R10G10B10X2_UNORM:
       masks = format_table[7].masks;
       shifts = format_table[7].shifts;
@@ -279,6 +294,7 @@ driCreateConfigs(mesa_format format,
    blue_bits = _mesa_get_format_bits(format, GL_BLUE_BITS);
    alpha_bits = _mesa_get_format_bits(format, GL_ALPHA_BITS);
    is_srgb = _mesa_is_format_srgb(format);
+   is_float = _mesa_get_format_datatype(format) == GL_FLOAT;
 
    num_modes = num_depth_stencil_bits * num_db_modes * num_accum_bits * num_msaa_modes;
    configs = calloc(num_modes + 1, sizeof *configs);
@@ -308,6 +324,7 @@ driCreateConfigs(mesa_format format,
                    c++;
 
                    memset(modes, 0, sizeof *modes);
+                   modes->floatMode = is_float;
                    modes->redBits   = red_bits;
                    modes->greenBits = green_bits;
                    modes->blueBits  = blue_bits;
@@ -338,7 +355,6 @@ driCreateConfigs(mesa_format format,
                    modes->transparentBlue = GLX_DONT_CARE;
                    modes->transparentAlpha = GLX_DONT_CARE;
                    modes->transparentIndex = GLX_DONT_CARE;
-                   modes->rgbMode = GL_TRUE;
 
                    if (db_modes[i] == __DRI_ATTRIB_SWAP_NONE) {
                        modes->doubleBufferMode = GL_FALSE;
@@ -352,14 +368,6 @@ driCreateConfigs(mesa_format format,
                    modes->samples = msaa_samples[h];
                    modes->sampleBuffers = modes->samples ? 1 : 0;
 
-
-                   modes->haveAccumBuffer = ((modes->accumRedBits +
-                                          modes->accumGreenBits +
-                                          modes->accumBlueBits +
-                                          modes->accumAlphaBits) > 0);
-                   modes->haveDepthBuffer = (modes->depthBits > 0);
-                   modes->haveStencilBuffer = (modes->stencilBits > 0);
-
                    modes->bindToTextureRgb = GL_TRUE;
                    modes->bindToTextureRgba = GL_TRUE;
                    modes->bindToMipmapTexture = GL_FALSE;
@@ -371,6 +379,7 @@ driCreateConfigs(mesa_format format,
                    modes->yInverted = GL_TRUE;
                    modes->sRGBCapable = is_srgb;
                    modes->mutableRenderBuffer = mutable_render_buffer;
+                   modes->configSelectGroup = 0;
                }
            }
        }
@@ -460,6 +469,7 @@ static const struct { unsigned int attrib, offset; } attribMap[] = {
     __ATTRIB(__DRI_ATTRIB_YINVERTED,                   yInverted),
     __ATTRIB(__DRI_ATTRIB_FRAMEBUFFER_SRGB_CAPABLE,    sRGBCapable),
     __ATTRIB(__DRI_ATTRIB_MUTABLE_RENDER_BUFFER,       mutableRenderBuffer),
+    __ATTRIB(__DRI_ATTRIB_CONFIG_SELECT_GROUP, configSelectGroup),
 
     /* The struct field doesn't matter here, these are handled by the
      * switch in driGetConfigAttribIndex.  We need them in the array
@@ -481,6 +491,8 @@ driGetConfigAttribIndex(const __DRIconfig *config,
     case __DRI_ATTRIB_RENDER_TYPE:
         /* no support for color index mode */
        *value = __DRI_ATTRIB_RGBA_BIT;
+        if (config->modes.floatMode)
+            *value |= __DRI_ATTRIB_FLOAT_BIT;
        break;
     case __DRI_ATTRIB_CONFIG_CAVEAT:
        if (config->modes.visualRating == GLX_NON_CONFORMANT_CONFIG)