summaryrefslogtreecommitdiffstats
path: root/src/gallium/state_trackers/dri
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/state_trackers/dri')
-rw-r--r--src/gallium/state_trackers/dri/common/dri_screen.c31
1 files changed, 19 insertions, 12 deletions
diff --git a/src/gallium/state_trackers/dri/common/dri_screen.c b/src/gallium/state_trackers/dri/common/dri_screen.c
index 24efbde2017..406e550e58e 100644
--- a/src/gallium/state_trackers/dri/common/dri_screen.c
+++ b/src/gallium/state_trackers/dri/common/dri_screen.c
@@ -41,6 +41,8 @@
#include "util/u_debug.h"
+#define MSAA_VISUAL_MAX_SAMPLES 8
+
PUBLIC const char __driConfigOptions[] =
DRI_CONF_BEGIN
DRI_CONF_SECTION_PERFORMANCE
@@ -72,10 +74,10 @@ dri_fill_in_modes(struct dri_screen *screen,
__DRIconfig **configs_x8r8g8b8 = NULL;
uint8_t depth_bits_array[5];
uint8_t stencil_bits_array[5];
- uint8_t msaa_samples_array[5];
+ uint8_t msaa_samples_array[MSAA_VISUAL_MAX_SAMPLES];
unsigned depth_buffer_factor;
unsigned back_buffer_factor;
- unsigned msaa_samples_factor;
+ unsigned msaa_samples_factor, msaa_samples_max;
unsigned i;
struct pipe_screen *p_screen = screen->base.screen;
boolean pf_r5g6b5, pf_a8r8g8b8, pf_x8r8g8b8;
@@ -89,6 +91,9 @@ dri_fill_in_modes(struct dri_screen *screen,
stencil_bits_array[0] = 0;
depth_buffer_factor = 1;
+ msaa_samples_max = (screen->st_api->feature_mask & ST_API_FEATURE_MS_VISUALS)
+ ? MSAA_VISUAL_MAX_SAMPLES : 1;
+
pf_x8z24 = p_screen->is_format_supported(p_screen, PIPE_FORMAT_Z24X8_UNORM,
PIPE_TEXTURE_2D, 0,
PIPE_BIND_DEPTH_STENCIL);
@@ -146,14 +151,16 @@ dri_fill_in_modes(struct dri_screen *screen,
msaa_samples_array[0] = 0;
back_buffer_factor = 3;
- /* also test color for msaa 2/4/6/8 - just assume it'll work for all depth buffers */
+ /* Also test for color multisample support - just assume it'll work
+ * for all depth buffers.
+ */
if (pf_r5g6b5) {
msaa_samples_factor = 1;
- for (i = 1; i < 5; i++) {
+ for (i = 2; i <= msaa_samples_max; i++) {
if (p_screen->is_format_supported(p_screen, PIPE_FORMAT_B5G6R5_UNORM,
- PIPE_TEXTURE_2D, i*2,
+ PIPE_TEXTURE_2D, i,
PIPE_BIND_RENDER_TARGET)) {
- msaa_samples_array[msaa_samples_factor] = i * 2;
+ msaa_samples_array[msaa_samples_factor] = i;
msaa_samples_factor++;
}
}
@@ -168,11 +175,11 @@ dri_fill_in_modes(struct dri_screen *screen,
if (pf_a8r8g8b8) {
msaa_samples_factor = 1;
- for (i = 1; i < 5; i++) {
+ for (i = 2; i <= msaa_samples_max; i++) {
if (p_screen->is_format_supported(p_screen, PIPE_FORMAT_B8G8R8A8_UNORM,
- PIPE_TEXTURE_2D, i*2,
+ PIPE_TEXTURE_2D, i,
PIPE_BIND_RENDER_TARGET)) {
- msaa_samples_array[msaa_samples_factor] = i * 2;
+ msaa_samples_array[msaa_samples_factor] = i;
msaa_samples_factor++;
}
}
@@ -190,11 +197,11 @@ dri_fill_in_modes(struct dri_screen *screen,
if (pf_x8r8g8b8) {
msaa_samples_factor = 1;
- for (i = 1; i < 5; i++) {
+ for (i = 2; i <= msaa_samples_max; i++) {
if (p_screen->is_format_supported(p_screen, PIPE_FORMAT_B8G8R8X8_UNORM,
- PIPE_TEXTURE_2D, i*2,
+ PIPE_TEXTURE_2D, i,
PIPE_BIND_RENDER_TARGET)) {
- msaa_samples_array[msaa_samples_factor] = i * 2;
+ msaa_samples_array[msaa_samples_factor] = i;
msaa_samples_factor++;
}
}