Mesa (master): st/dri: add a way to force MSAA on with an environment variable

Marek Olšák mareko at kemper.freedesktop.org
Wed Dec 12 12:42:29 UTC 2012


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

Author: Marek Olšák <maraeo at gmail.com>
Date:   Mon Dec 10 21:35:59 2012 +0100

st/dri: add a way to force MSAA on with an environment variable

There are 2 ways. I prefer the former:
  GALLIUM_MSAA=n
  __GL_FSAA_MODE=n

Tested with ETQW, which doesn't support MSAA on Linux. This is
the only way to get MSAA there.

Reviewed-by: Brian Paul <brianp at vmware.com>

---

 src/gallium/state_trackers/dri/common/dri_screen.c |   43 ++++++++++++++++++--
 1 files changed, 39 insertions(+), 4 deletions(-)

diff --git a/src/gallium/state_trackers/dri/common/dri_screen.c b/src/gallium/state_trackers/dri/common/dri_screen.c
index 6d220f2..a908e28 100644
--- a/src/gallium/state_trackers/dri/common/dri_screen.c
+++ b/src/gallium/state_trackers/dri/common/dri_screen.c
@@ -194,6 +194,37 @@ dri_fill_in_modes(struct dri_screen *screen)
    return (const __DRIconfig **)configs;
 }
 
+/* The Gallium way to force MSAA. */
+DEBUG_GET_ONCE_NUM_OPTION(msaa, "GALLIUM_MSAA", 0);
+
+/* The NVIDIA way to force MSAA. The same variable is used by the NVIDIA
+ * driver. */
+DEBUG_GET_ONCE_NUM_OPTION(msaa_nv, "__GL_FSAA_MODE", 0);
+
+static void
+dri_force_msaa_visual(struct st_visual *stvis,
+                      struct pipe_screen *screen)
+{
+   int i;
+   int samples = debug_get_option_msaa();
+
+   if (!samples)
+      samples = debug_get_option_msaa_nv();
+
+   if (samples <= 1)
+      return; /* nothing to do */
+
+   /* Choose a supported sample count greater than or equal to samples. */
+   for (i = samples; i <= MSAA_VISUAL_MAX_SAMPLES; i++) {
+      if (screen->is_format_supported(screen, stvis->color_format,
+                                      PIPE_TEXTURE_2D, i,
+                                      PIPE_BIND_RENDER_TARGET)) {
+         stvis->samples = i;
+         break;
+      }
+   }
+}
+
 /**
  * Roughly the converse of dri_fill_in_modes.
  */
@@ -206,10 +237,6 @@ dri_fill_st_visual(struct st_visual *stvis, struct dri_screen *screen,
    if (!mode)
       return;
 
-   if (mode->sampleBuffers) {
-      stvis->samples = mode->samples;
-   }
-
    if (mode->redBits == 8) {
       if (mode->alphaBits == 8)
          stvis->color_format = PIPE_FORMAT_B8G8R8A8_UNORM;
@@ -219,6 +246,14 @@ dri_fill_st_visual(struct st_visual *stvis, struct dri_screen *screen,
       stvis->color_format = PIPE_FORMAT_B5G6R5_UNORM;
    }
 
+   if (mode->sampleBuffers) {
+      stvis->samples = mode->samples;
+   }
+   else {
+      /* This must be done after stvis->color_format is set. */
+      dri_force_msaa_visual(stvis, screen->base.screen);
+   }
+
    switch (mode->depthBits) {
    default:
    case 0:




More information about the mesa-commit mailing list