summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--glx/glxdricommon.c45
-rw-r--r--glx/glxscreens.c18
-rw-r--r--glx/glxscreens.h4
3 files changed, 61 insertions, 6 deletions
diff --git a/glx/glxdricommon.c b/glx/glxdricommon.c
index d374dc753..d3136e87b 100644
--- a/glx/glxdricommon.c
+++ b/glx/glxdricommon.c
@@ -139,13 +139,15 @@ render_type_is_pbuffer_only(unsigned renderType)
static __GLXconfig *
createModeFromConfig(const __DRIcoreExtension * core,
const __DRIconfig * driConfig,
- unsigned int visualType)
+ unsigned int visualType,
+ GLboolean duplicateForComp)
{
__GLXDRIconfig *config;
GLint renderType = 0;
unsigned int attrib, value, drawableType = GLX_PBUFFER_BIT;
int i;
+
config = calloc(1, sizeof *config);
config->driConfig = driConfig;
@@ -203,6 +205,28 @@ createModeFromConfig(const __DRIcoreExtension * core,
config->config.drawableType = drawableType;
config->config.yInverted = GL_TRUE;
+#ifdef COMPOSITE
+ /*
+ * Here we decide what fbconfigs will be duplicated for compositing.
+ * fgbconfigs marked with duplicatedForConf will be reserved for
+ * compositing visuals.
+ * It might look strange to do this decision this late when translation
+ * from a __DRIConfig is already done, but using the __DRIConfig
+ * accessor function becomes worse both with respect to code complexity
+ * and CPU usage.
+ */
+ if (duplicateForComp &&
+ (render_type_is_pbuffer_only(renderType) ||
+ config->config.rgbBits != 32 ||
+ config->config.visualRating != GLX_NONE ||
+ config->config.sampleBuffers != 0)) {
+ free(config);
+ return NULL;
+ }
+
+ config->config.duplicatedForComp = duplicateForComp;
+#endif
+
return &config->config;
}
@@ -217,21 +241,34 @@ glxConvertConfigs(const __DRIcoreExtension * core,
head.next = NULL;
for (i = 0; configs[i]; i++) {
- tail->next = createModeFromConfig(core, configs[i], GLX_TRUE_COLOR);
+ tail->next = createModeFromConfig(core, configs[i], GLX_TRUE_COLOR,
+ GL_FALSE);
if (tail->next == NULL)
break;
-
tail = tail->next;
}
for (i = 0; configs[i]; i++) {
- tail->next = createModeFromConfig(core, configs[i], GLX_DIRECT_COLOR);
+ tail->next = createModeFromConfig(core, configs[i], GLX_DIRECT_COLOR,
+ GL_FALSE);
if (tail->next == NULL)
break;
tail = tail->next;
}
+#ifdef COMPOSITE
+ /* Duplicate fbconfigs for use with compositing visuals */
+ for (i = 0; configs[i]; i++) {
+ tail->next = createModeFromConfig(core, configs[i], GLX_TRUE_COLOR,
+ GL_TRUE);
+ if (tail->next == NULL)
+ continue;
+
+ tail = tail->next;
+ }
+#endif
+
return head.next;
}
diff --git a/glx/glxscreens.c b/glx/glxscreens.c
index 00cdce40a..29bacd988 100644
--- a/glx/glxscreens.c
+++ b/glx/glxscreens.c
@@ -278,7 +278,12 @@ pickFBConfig(__GLXscreen * pGlxScreen, VisualPtr visual)
/* Can't use the same FBconfig for multiple X visuals. I think. */
if (config->visualID != 0)
continue;
-
+#ifdef COMPOSITE
+ /* Use only duplicated configs for compIsAlternateVisuals */
+ if (!!compIsAlternateVisual(pGlxScreen->pScreen, visual->vid) !=
+ !!config->duplicatedForComp)
+ continue;
+#endif
/*
* If possible, use the same swapmethod for all built-in visual
* fbconfigs, to avoid getting the 32-bit composite visual when
@@ -369,7 +374,12 @@ __glXScreenInit(__GLXscreen * pGlxScreen, ScreenPtr pScreen)
* set up above is for.
*/
depth = config->redBits + config->greenBits + config->blueBits;
-
+#ifdef COMPOSITE
+ if (config->duplicatedForComp) {
+ depth += config->alphaBits;
+ config->visualSelectGroup++;
+ }
+#endif
/* Make sure that our FBconfig's depth can actually be displayed
* (corresponds to an existing visual).
*/
@@ -392,6 +402,10 @@ __glXScreenInit(__GLXscreen * pGlxScreen, ScreenPtr pScreen)
if (visual == NULL)
continue;
+#ifdef COMPOSITE
+ if (config->duplicatedForComp)
+ (void) CompositeRegisterAlternateVisuals(pScreen, &visual->vid, 1);
+#endif
pGlxScreen->visuals[pGlxScreen->numVisuals++] = config;
initGlxVisual(visual, config);
}
diff --git a/glx/glxscreens.h b/glx/glxscreens.h
index 0f9a2b9af..c6a0c5021 100644
--- a/glx/glxscreens.h
+++ b/glx/glxscreens.h
@@ -39,7 +39,11 @@
typedef struct __GLXconfig __GLXconfig;
struct __GLXconfig {
+ /* Management */
__GLXconfig *next;
+#ifdef COMPOSITE
+ GLboolean duplicatedForComp;
+#endif
GLuint doubleBufferMode;
GLuint stereoMode;