st/dri: add support for the always_have_depth_buffer option
authorBrian Paul <brianp@vmware.com>
Thu, 14 Mar 2013 02:24:05 +0000 (20:24 -0600)
committerBrian Paul <brianp@vmware.com>
Fri, 15 Mar 2013 13:05:01 +0000 (07:05 -0600)
This involved adding another driOptionCache to dri_screen.  The
existing one just held the default values.  But now we also need
to have the values from the DRI config file so that we can get at
the always_have_depth_buffer config option, which is per-screen.

src/gallium/state_trackers/dri/common/dri_context.c
src/gallium/state_trackers/dri/common/dri_screen.c
src/gallium/state_trackers/dri/common/dri_screen.h

index 00b9b0aebe2adb5778dce8c6d4f820543a474184..4698feb54d8674797f890e57a601213b97981caa 100644 (file)
@@ -114,7 +114,8 @@ dri_create_context(gl_api api, const struct gl_config * visual,
    ctx->sPriv = sPriv;
 
    driParseConfigFiles(&ctx->optionCache,
-                      &screen->optionCache, sPriv->myNum, driver_descriptor.name);
+                      &screen->optionCacheDefaults,
+                       sPriv->myNum, driver_descriptor.name);
 
    dri_fill_st_options(&attribs.options, &ctx->optionCache);
    dri_fill_st_visual(&attribs.visual, screen, visual);
@@ -174,7 +175,7 @@ dri_destroy_context(__DRIcontext * cPriv)
 
    /* note: we are freeing values and nothing more because
     * driParseConfigFiles allocated values only - the rest
-    * is owned by screen optionCache.
+    * is owned by screen optionCacheDefaults.
     */
    free(ctx->optionCache.values);
 
index a908e28be76b9b051b6bde462913634893acdce6..2f525a24c3cf53e1813d96f1d9602a2d5681218e 100644 (file)
@@ -38,6 +38,7 @@
 #include "pipe/p_screen.h"
 #include "pipe/p_format.h"
 #include "state_tracker/st_gl_api.h" /* for st_gl_api_create */
+#include "state_tracker/drm_driver.h"
 
 #include "util/u_debug.h"
 
@@ -67,11 +68,14 @@ PUBLIC const char __driConfigOptions[] =
          DRI_CONF_FORCE_GLSL_EXTENSIONS_WARN(false)
       DRI_CONF_SECTION_END
 
+      DRI_CONF_SECTION_MISCELLANEOUS
+         DRI_CONF_ALWAYS_HAVE_DEPTH_BUFFER(false)
+      DRI_CONF_SECTION_END
    DRI_CONF_END;
 
 #define false 0
 
-static const uint __driNConfigOptions = 10;
+static const uint __driNConfigOptions = 11;
 
 static const __DRIconfig **
 dri_fill_in_modes(struct dri_screen *screen)
@@ -100,10 +104,16 @@ dri_fill_in_modes(struct dri_screen *screen)
       GLX_NONE, GLX_SWAP_UNDEFINED_OML, GLX_SWAP_COPY_OML
    };
 
-   depth_bits_array[0] = 0;
-   stencil_bits_array[0] = 0;
-   depth_buffer_factor = 1;
-
+   if (driQueryOptionb(&screen->optionCache, "always_have_depth_buffer")) {
+      /* all visuals will have a depth buffer */
+      depth_buffer_factor = 0;
+   }
+   else {
+      depth_bits_array[0] = 0;
+      stencil_bits_array[0] = 0;
+      depth_buffer_factor = 1;
+   }
    msaa_samples_max = (screen->st_api->feature_mask & ST_API_FEATURE_MS_VISUALS_MASK)
       ? MSAA_VISUAL_MAX_SAMPLES : 1;
 
@@ -397,9 +407,14 @@ dri_init_screen_helper(struct dri_screen *screen,
    else
       screen->target = PIPE_TEXTURE_RECT;
 
-   driParseOptionInfo(&screen->optionCache,
+   driParseOptionInfo(&screen->optionCacheDefaults,
                       __driConfigOptions, __driNConfigOptions);
 
+   driParseConfigFiles(&screen->optionCache,
+                      &screen->optionCacheDefaults,
+                       screen->sPriv->myNum,
+                       driver_descriptor.name);
+
    return dri_fill_in_modes(screen);
 }
 
index 181b22f20b721bd237040f0be146d50f87da3d68..859ebfd7f32171990bf04406431c9eca8718d66e 100644 (file)
@@ -57,9 +57,10 @@ struct dri_screen
    boolean throttling_enabled;
    int default_throttle_frames;
 
-   /**
-    * Configuration cache with default values for all contexts
-    */
+   /** Configuration cache with default values for all contexts */
+   driOptionCache optionCacheDefaults;
+
+   /** The screen's effective configuration options */
    driOptionCache optionCache;
 
    /* drm */