aboutsummaryrefslogtreecommitdiffstats
path: root/src/gallium/state_trackers
diff options
context:
space:
mode:
authorMarek Olšák <[email protected]>2017-07-28 17:30:34 +0200
committerMarek Olšák <[email protected]>2017-07-31 12:49:30 +0200
commit1bf703e4ea5c4f742bc7ba55d01e5afc3f4e11f9 (patch)
tree11fe6774ef619cc9a5f073c58c5cf19ddedb611d /src/gallium/state_trackers
parent5d8359ff4d8c379fdf1a78758f405bb4cdf69459 (diff)
dri_interface,egl,gallium: only expose RGBA visuals on Android
X/GLX can't handle them. This removes almost 500 GLX visuals that were incorrectly exposed. Add an optional getCapability callback for querying what the loader can do. I'm not splitting this patch, because it's already too small. v2: also add the callback to __DRIimageLoaderExtension Reviewed-by: Nicolai Hähnle <[email protected]> Cc: 17.2 <[email protected]>
Diffstat (limited to 'src/gallium/state_trackers')
-rw-r--r--src/gallium/state_trackers/dri/dri_screen.c24
1 files changed, 23 insertions, 1 deletions
diff --git a/src/gallium/state_trackers/dri/dri_screen.c b/src/gallium/state_trackers/dri/dri_screen.c
index 59a850b1423..890a8bff4c6 100644
--- a/src/gallium/state_trackers/dri/dri_screen.c
+++ b/src/gallium/state_trackers/dri/dri_screen.c
@@ -124,6 +124,21 @@ dri_fill_st_options(struct dri_screen *screen)
driComputeOptionsSha1(optionCache, options->config_options_sha1);
}
+static unsigned
+dri_loader_get_cap(struct dri_screen *screen, enum dri_loader_cap cap)
+{
+ const __DRIdri2LoaderExtension *dri2_loader = screen->sPriv->dri2.loader;
+ const __DRIimageLoaderExtension *image_loader = screen->sPriv->image.loader;
+
+ if (dri2_loader && dri2_loader->base.version >= 4)
+ return dri2_loader->getCapability(screen->sPriv->loaderPrivate, cap);
+
+ if (image_loader && image_loader->base.version >= 2)
+ return image_loader->getCapability(screen->sPriv->loaderPrivate, cap);
+
+ return 0;
+}
+
static const __DRIconfig **
dri_fill_in_modes(struct dri_screen *screen)
{
@@ -235,8 +250,15 @@ dri_fill_in_modes(struct dri_screen *screen)
assert(ARRAY_SIZE(mesa_formats) == ARRAY_SIZE(pipe_formats));
+ /* Expose only BGRA ordering if the loader doesn't support RGBA ordering. */
+ unsigned num_formats;
+ if (dri_loader_get_cap(screen, DRI_LOADER_CAP_RGBA_ORDERING))
+ num_formats = ARRAY_SIZE(mesa_formats);
+ else
+ num_formats = 5;
+
/* Add configs. */
- for (format = 0; format < ARRAY_SIZE(mesa_formats); format++) {
+ for (format = 0; format < num_formats; format++) {
__DRIconfig **new_configs = NULL;
unsigned num_msaa_modes = 0; /* includes a single-sample mode */
uint8_t msaa_modes[MSAA_VISUAL_MAX_SAMPLES];