intel: Expose more FBconfigs in the 3D driver.
authorEric Anholt <eric@anholt.net>
Thu, 29 Jan 2009 22:57:49 +0000 (14:57 -0800)
committerEric Anholt <eric@anholt.net>
Fri, 30 Jan 2009 21:46:37 +0000 (13:46 -0800)
We can support any combination of (a8r8g8b8, x8r8g8b8, r5g6b5) x (z0,z24,z24s8)
on either class of chipsets.  The only restriction is no mixing bpp when also
mixing tiling.  This shouldn't be occurring currently.

src/mesa/drivers/dri/common/utils.c
src/mesa/drivers/dri/common/utils.h
src/mesa/drivers/dri/intel/intel_screen.c
src/mesa/drivers/dri/swrast/swrast.c

index e4d228c575e7220b58cb7c6b24f913527f78f126..d6de1c0e9bbdbd451688e10d516604dc692fb2c5 100644 (file)
@@ -744,7 +744,8 @@ driCreateConfigs(GLenum fb_format, GLenum fb_type,
     return configs;
 }
 
-const __DRIconfig **driConcatConfigs(__DRIconfig **a, __DRIconfig **b)
+const __DRIconfig **driConcatConfigs(const __DRIconfig **a,
+                                    const __DRIconfig **b)
 {
     const __DRIconfig **all;
     int i, j, index;
index 0c974dbff3ba648a190d232500d2884e6d665eeb..b0908e530a57d10a3d2244b4c6b317dc6c978bf9 100644 (file)
@@ -133,7 +133,8 @@ driCreateConfigs(GLenum fb_format, GLenum fb_type,
                 unsigned num_depth_stencil_bits,
                 const GLenum * db_modes, unsigned num_db_modes);
 
-const __DRIconfig **driConcatConfigs(__DRIconfig **a, __DRIconfig **b);
+const __DRIconfig **driConcatConfigs(const __DRIconfig **a,
+                                    const __DRIconfig **b);
 
 int
 driGetConfigAttrib(const __DRIconfig *config,
index fe890c390f37dad7e67dbb98fc78516d020d3336..aad53fb72d1f3faa7617bbb835d6d5c01f0bb858 100644 (file)
@@ -671,6 +671,17 @@ static const
 __DRIconfig **intelInitScreen2(__DRIscreenPrivate *psp)
 {
    intelScreenPrivate *intelScreen;
+   GLenum fb_format[3];
+   GLenum fb_type[3];
+   /* GLX_SWAP_COPY_OML is only supported because the Intel driver doesn't
+    * support pageflipping at all.
+    */
+   static const GLenum back_buffer_modes[] = {
+      GLX_NONE, GLX_SWAP_UNDEFINED_OML, GLX_SWAP_COPY_OML
+   };
+   uint8_t depth_bits[4], stencil_bits[4];
+   int color;
+   const __DRIconfig **configs = NULL;
 
    /* Calling driInitExtensions here, with a NULL context pointer,
     * does not actually enable the extensions.  It just makes sure
@@ -710,8 +721,47 @@ __DRIconfig **intelInitScreen2(__DRIscreenPrivate *psp)
    intelScreen->irq_active = 1;
    psp->extensions = intelScreenExtensions;
 
-   return driConcatConfigs(intelFillInModes(psp, 16, 16, 0, 1),
-                          intelFillInModes(psp, 32, 24, 8, 1));
+   depth_bits[0] = 0;
+   stencil_bits[0] = 0;
+   depth_bits[1] = 16;
+   stencil_bits[1] = 0;
+   depth_bits[2] = 24;
+   stencil_bits[2] = 0;
+   depth_bits[3] = 24;
+   stencil_bits[3] = 8;
+
+   fb_format[0] = GL_RGB;
+   fb_type[0] = GL_UNSIGNED_SHORT_5_6_5;
+
+   fb_format[1] = GL_RGB;
+   fb_type[1] = GL_UNSIGNED_INT_8_8_8_8_REV;
+
+   fb_format[2] = GL_RGBA;
+   fb_type[2] = GL_UNSIGNED_INT_8_8_8_8_REV;
+
+   for (color = 0; color < ARRAY_SIZE(fb_format); color++) {
+      const __DRIconfig **new_configs;
+
+      new_configs = (const __DRIconfig **)
+        driCreateConfigs(fb_format[color], fb_type[color],
+                         depth_bits,
+                         stencil_bits,
+                         ARRAY_SIZE(depth_bits),
+                         back_buffer_modes,
+                         ARRAY_SIZE(back_buffer_modes));
+      if (configs == NULL)
+        configs = new_configs;
+      else
+        configs = driConcatConfigs(configs, new_configs);
+   }
+
+   if (configs == NULL) {
+      fprintf(stderr, "[%s:%u] Error creating FBConfig!\n", __func__,
+              __LINE__);
+      return NULL;
+   }
+
+   return configs;
 }
 
 const struct __DriverAPIRec driDriverAPI = {
index 07e4ba0710463adb77f1dc373447ec8e510c09e5..390b8f918a2554e859d35ff7799f768cd2579137 100644 (file)
@@ -127,7 +127,7 @@ setupLoaderExtensions(__DRIscreen *psp,
     }
 }
 
-static __DRIconfig **
+static const __DRIconfig **
 swrastFillInModes(__DRIscreen *psp,
                  unsigned pixel_bits, unsigned depth_bits,
                  unsigned stencil_bits, GLboolean have_back_buffer)
@@ -187,7 +187,7 @@ swrastFillInModes(__DRIscreen *psp,
        return NULL;
     }
 
-    return configs;
+    return (const __DRIconfig **)configs;
 }
 
 static __DRIscreen *
@@ -196,7 +196,7 @@ driCreateNewScreen(int scrn, const __DRIextension **extensions,
 {
     static const __DRIextension *emptyExtensionList[] = { NULL };
     __DRIscreen *psp;
-    __DRIconfig **configs8, **configs16, **configs32;
+    const __DRIconfig **configs8, **configs16, **configs32;
 
     (void) data;
 
@@ -215,7 +215,7 @@ driCreateNewScreen(int scrn, const __DRIextension **extensions,
     configs16 = swrastFillInModes(psp, 16, 16, 0, 1);
     configs32 = swrastFillInModes(psp, 32, 24, 8, 1);
 
-    configs16 = (__DRIconfig **)driConcatConfigs(configs8, configs16);
+    configs16 = driConcatConfigs(configs8, configs16);
 
     *driver_configs = driConcatConfigs(configs16, configs32);