Add a new DRI2 configuration query extension. Allows for DRI2 client code to query for common DRI2 configuration options.tags/mesa-7.9-rc1
@@ -812,4 +812,18 @@ struct __DRIimageLookupExtensionRec { | |||
void *loaderPrivate); | |||
}; | |||
/** | |||
* This extension allows for common DRI2 options | |||
*/ | |||
#define __DRI2_CONFIG_QUERY "DRI_CONFIG_QUERY" | |||
#define __DRI2_CONFIG_QUERY_VERSION 1 | |||
typedef struct __DRI2configQueryExtensionRec __DRI2configQueryExtension; | |||
struct __DRI2configQueryExtensionRec { | |||
__DRIextension base; | |||
int (*configQueryb)(__DRIscreen *screen, const char *var, GLboolean *val); | |||
int (*configQueryi)(__DRIscreen *screen, const char *var, GLint *val); | |||
int (*configQueryf)(__DRIscreen *screen, const char *var, GLfloat *val); | |||
}; | |||
#endif |
@@ -403,6 +403,11 @@ dri2BindExtensions(__GLXscreenConfigs *psc) | |||
/* internal driver extension, no GL extension exposed */ | |||
} | |||
#endif | |||
#ifdef __DRI2_CONFIG_QUERY | |||
if ((strcmp(extensions[i]->name, __DRI2_CONFIG_QUERY) == 0)) | |||
psc->config = (__DRI2configQueryExtension *) extensions[i]; | |||
#endif | |||
} | |||
} | |||
@@ -549,6 +549,10 @@ struct __GLXscreenConfigsRec | |||
const __DRI2flushExtension *f; | |||
#endif | |||
#ifdef __DRI2_CONFIG_QUERY | |||
const __DRI2configQueryExtension *config; | |||
#endif | |||
#endif | |||
/** |
@@ -467,6 +467,41 @@ dri2CreateNewDrawable(__DRIscreen *screen, | |||
return pdraw; | |||
} | |||
static int | |||
dri2ConfigQueryb(__DRIscreen *screen, const char *var, GLboolean *val) | |||
{ | |||
if (!driCheckOption(&screen->optionCache, var, DRI_BOOL)) | |||
return -1; | |||
*val = driQueryOptionb(&screen->optionCache, var); | |||
return 0; | |||
} | |||
static int | |||
dri2ConfigQueryi(__DRIscreen *screen, const char *var, GLint *val) | |||
{ | |||
if (!driCheckOption(&screen->optionCache, var, DRI_INT) && | |||
!driCheckOption(&screen->optionCache, var, DRI_ENUM)) | |||
return -1; | |||
*val = driQueryOptioni(&screen->optionCache, var); | |||
return 0; | |||
} | |||
static int | |||
dri2ConfigQueryf(__DRIscreen *screen, const char *var, GLfloat *val) | |||
{ | |||
if (!driCheckOption(&screen->optionCache, var, DRI_FLOAT)) | |||
return -1; | |||
*val = driQueryOptionf(&screen->optionCache, var); | |||
return 0; | |||
} | |||
static void dri_get_drawable(__DRIdrawable *pdp) | |||
{ | |||
pdp->refcount++; | |||
@@ -739,6 +774,7 @@ dri2CreateNewScreen(int scrn, int fd, | |||
static const __DRIextension *emptyExtensionList[] = { NULL }; | |||
__DRIscreen *psp; | |||
drmVersionPtr version; | |||
driOptionCache options; | |||
if (driDriverAPI.InitScreen2 == NULL) | |||
return NULL; | |||
@@ -771,6 +807,9 @@ dri2CreateNewScreen(int scrn, int fd, | |||
psp->DriverAPI = driDriverAPI; | |||
driParseOptionInfo(&options, __dri2ConfigOptions, __dri2NConfigOptions); | |||
driParseConfigFiles(&psp->optionCache, &options, psp->myNum, "dri2"); | |||
return psp; | |||
} | |||
@@ -813,6 +852,13 @@ const __DRIdri2Extension driDRI2Extension = { | |||
dri2CreateNewContext, | |||
}; | |||
const __DRI2configQueryExtension dri2ConfigQueryExtension = { | |||
{ __DRI2_CONFIG_QUERY, __DRI2_CONFIG_QUERY_VERSION }, | |||
dri2ConfigQueryb, | |||
dri2ConfigQueryi, | |||
dri2ConfigQueryf, | |||
}; | |||
static int | |||
driFrameTracking(__DRIdrawable *drawable, GLboolean enable) | |||
{ |
@@ -51,6 +51,7 @@ | |||
#include <drm.h> | |||
#include <drm_sarea.h> | |||
#include <xf86drm.h> | |||
#include "xmlconfig.h" | |||
#include "main/glheader.h" | |||
#include "GL/internal/glcore.h" | |||
#include "GL/internal/dri_interface.h" | |||
@@ -70,6 +71,7 @@ extern const __DRIcopySubBufferExtension driCopySubBufferExtension; | |||
extern const __DRIswapControlExtension driSwapControlExtension; | |||
extern const __DRIframeTrackingExtension driFrameTrackingExtension; | |||
extern const __DRImediaStreamCounterExtension driMediaStreamCounterExtension; | |||
extern const __DRI2configQueryExtension dri2ConfigQueryExtension; | |||
/** | |||
* Used by DRI_VALIDATE_DRAWABLE_INFO | |||
@@ -527,6 +529,8 @@ struct __DRIscreenRec { | |||
/* The lock actually in use, old sarea or DRI2 */ | |||
drmLock *lock; | |||
driOptionCache optionCache; | |||
}; | |||
extern void |
@@ -225,6 +225,7 @@ static const __DRIextension *intelScreenExtensions[] = { | |||
&intelTexBufferExtension.base, | |||
&intelFlushExtension.base, | |||
&intelImageExtension.base, | |||
&dri2ConfigQueryExtension.base, | |||
NULL | |||
}; | |||
@@ -236,6 +236,7 @@ static const struct __DRItexBufferExtensionRec nouveau_texbuffer_extension = { | |||
static const __DRIextension *nouveau_screen_extensions[] = { | |||
&nouveau_flush_extension.base, | |||
&nouveau_texbuffer_extension.base, | |||
&dri2ConfigQueryExtension.base, | |||
NULL | |||
}; | |||
@@ -1235,6 +1235,8 @@ radeonCreateScreen( __DRIscreen *sPriv ) | |||
screen->extensions[i++] = &r600texOffsetExtension.base; | |||
#endif | |||
screen->extensions[i++] = &dri2ConfigQueryExtension.base; | |||
screen->extensions[i++] = NULL; | |||
sPriv->extensions = screen->extensions; | |||
@@ -105,7 +105,7 @@ typedef struct radeon_screen { | |||
/* Configuration cache with default values for all contexts */ | |||
driOptionCache optionCache; | |||
const __DRIextension *extensions[16]; | |||
const __DRIextension *extensions[17]; | |||
int num_gb_pipes; | |||
int num_z_pipes; |