[Mesa-dev] [PATCH 12/15] intel: Refactor creation of DRI2 configs

Chad Versace chad.versace at linux.intel.com
Mon Aug 6 17:19:19 PDT 2012


DRI2 configs were constructed in intelInitScreen2. That function already
does too much, so move verbatim the code for creating configs to a new
function, intel_screen_make_configs.

CC: Eric Anholt <eric at anholt.net>
Reviewed-by: Paul Berry <stereotype441 at gmail.com>
Signed-off-by: Chad Versace <chad.versace at linux.intel.com>
---
 src/mesa/drivers/dri/intel/intel_screen.c | 189 ++++++++++++++++--------------
 1 file changed, 98 insertions(+), 91 deletions(-)

diff --git a/src/mesa/drivers/dri/intel/intel_screen.c b/src/mesa/drivers/dri/intel/intel_screen.c
index a3c0140..491f12a 100644
--- a/src/mesa/drivers/dri/intel/intel_screen.c
+++ b/src/mesa/drivers/dri/intel/intel_screen.c
@@ -821,6 +821,103 @@ intel_detect_swizzling(struct intel_screen *screen)
       return true;
 }
 
+static __DRIconfig**
+intel_screen_make_configs(__DRIscreen *dri_screen)
+{
+   static const GLenum back_buffer_modes[] = {
+       GLX_NONE, GLX_SWAP_UNDEFINED_OML, GLX_SWAP_COPY_OML
+   };
+
+   GLenum fb_format[3];
+   GLenum fb_type[3];
+   uint8_t depth_bits[4], stencil_bits[4], msaa_samples_array[1];
+   int color;
+   __DRIconfig **configs = NULL;
+
+   msaa_samples_array[0] = 0;
+
+   fb_format[0] = GL_RGB;
+   fb_type[0] = GL_UNSIGNED_SHORT_5_6_5;
+
+   fb_format[1] = GL_BGR;
+   fb_type[1] = GL_UNSIGNED_INT_8_8_8_8_REV;
+
+   fb_format[2] = GL_BGRA;
+   fb_type[2] = GL_UNSIGNED_INT_8_8_8_8_REV;
+
+   depth_bits[0] = 0;
+   stencil_bits[0] = 0;
+
+   /* Generate a rich set of useful configs that do not include an
+    * accumulation buffer.
+    */
+   for (color = 0; color < ARRAY_SIZE(fb_format); color++) {
+      __DRIconfig **new_configs;
+      int depth_factor;
+
+      /* Starting with DRI2 protocol version 1.1 we can request a depth/stencil
+       * buffer that has a different number of bits per pixel than the color
+       * buffer.  This isn't yet supported here.
+       */
+      if (fb_type[color] == GL_UNSIGNED_SHORT_5_6_5) {
+         depth_bits[1] = 16;
+         stencil_bits[1] = 0;
+      } else {
+         depth_bits[1] = 24;
+         stencil_bits[1] = 8;
+      }
+
+      depth_factor = 2;
+
+      new_configs = driCreateConfigs(fb_format[color], fb_type[color],
+                                     depth_bits,
+                                     stencil_bits,
+                                     depth_factor,
+                                     back_buffer_modes,
+                                     ARRAY_SIZE(back_buffer_modes),
+                                     msaa_samples_array,
+                                     ARRAY_SIZE(msaa_samples_array),
+                                     false);
+      if (configs == NULL)
+         configs = new_configs;
+      else
+         configs = driConcatConfigs(configs, new_configs);
+   }
+
+   /* Generate the minimum possible set of configs that include an
+    * accumulation buffer.
+    */
+   for (color = 0; color < ARRAY_SIZE(fb_format); color++) {
+      __DRIconfig **new_configs;
+
+      if (fb_type[color] == GL_UNSIGNED_SHORT_5_6_5) {
+         depth_bits[0] = 16;
+         stencil_bits[0] = 0;
+      } else {
+         depth_bits[0] = 24;
+         stencil_bits[0] = 8;
+      }
+
+      new_configs = driCreateConfigs(fb_format[color], fb_type[color],
+                                     depth_bits, stencil_bits, 1,
+                                     back_buffer_modes + 1, 1,
+                                     msaa_samples_array, 1,
+                                     true);
+      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;
+}
+
 /**
  * This is the driver specific part of the createNewScreen entry point.
  * Called when using DRI2.
@@ -831,17 +928,8 @@ static const
 __DRIconfig **intelInitScreen2(__DRIscreen *psp)
 {
    struct intel_screen *intelScreen;
-   GLenum fb_format[3];
-   GLenum fb_type[3];
    unsigned int api_mask;
 
-   static const GLenum back_buffer_modes[] = {
-       GLX_NONE, GLX_SWAP_UNDEFINED_OML, GLX_SWAP_COPY_OML
-   };
-   uint8_t depth_bits[4], stencil_bits[4], msaa_samples_array[1];
-   int color;
-   __DRIconfig **configs = NULL;
-
    if (psp->dri2.loader->base.version <= 2 ||
        psp->dri2.loader->getBuffersWithFormat == NULL) {
       fprintf(stderr,
@@ -914,88 +1002,7 @@ __DRIconfig **intelInitScreen2(__DRIscreen *psp)
 
    psp->extensions = intelScreenExtensions;
 
-   msaa_samples_array[0] = 0;
-
-   fb_format[0] = GL_RGB;
-   fb_type[0] = GL_UNSIGNED_SHORT_5_6_5;
-
-   fb_format[1] = GL_BGR;
-   fb_type[1] = GL_UNSIGNED_INT_8_8_8_8_REV;
-
-   fb_format[2] = GL_BGRA;
-   fb_type[2] = GL_UNSIGNED_INT_8_8_8_8_REV;
-
-   depth_bits[0] = 0;
-   stencil_bits[0] = 0;
-
-   /* Generate a rich set of useful configs that do not include an
-    * accumulation buffer.
-    */
-   for (color = 0; color < ARRAY_SIZE(fb_format); color++) {
-      __DRIconfig **new_configs;
-      int depth_factor;
-
-      /* Starting with DRI2 protocol version 1.1 we can request a depth/stencil
-       * buffer that has a diffferent number of bits per pixel than the color
-       * buffer.  This isn't yet supported here.
-       */
-      if (fb_type[color] == GL_UNSIGNED_SHORT_5_6_5) {
-	 depth_bits[1] = 16;
-	 stencil_bits[1] = 0;
-      } else {
-	 depth_bits[1] = 24;
-	 stencil_bits[1] = 8;
-      }
-
-      depth_factor = 2;
-
-      new_configs = driCreateConfigs(fb_format[color], fb_type[color],
-				     depth_bits,
-				     stencil_bits,
-				     depth_factor,
-				     back_buffer_modes,
-				     ARRAY_SIZE(back_buffer_modes),
-				     msaa_samples_array,
-				     ARRAY_SIZE(msaa_samples_array),
-				     false);
-      if (configs == NULL)
-	 configs = new_configs;
-      else
-	 configs = driConcatConfigs(configs, new_configs);
-   }
-
-   /* Generate the minimum possible set of configs that include an
-    * accumulation buffer.
-    */
-   for (color = 0; color < ARRAY_SIZE(fb_format); color++) {
-      __DRIconfig **new_configs;
-
-      if (fb_type[color] == GL_UNSIGNED_SHORT_5_6_5) {
-	 depth_bits[0] = 16;
-	 stencil_bits[0] = 0;
-      } else {
-	 depth_bits[0] = 24;
-	 stencil_bits[0] = 8;
-      }
-
-      new_configs = driCreateConfigs(fb_format[color], fb_type[color],
-				     depth_bits, stencil_bits, 1,
-				     back_buffer_modes + 1, 1,
-				     msaa_samples_array, 1,
-				     true);
-      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 (const __DRIconfig **)configs;
+   return (const __DRIconfig**) intel_screen_make_configs(psp);
 }
 
 struct intel_buffer {
-- 
1.7.11.4



More information about the mesa-dev mailing list