DRI2: add config query extension

Add a new DRI2 configuration query extension.  Allows for DRI2 client
code to query for common DRI2 configuration options.
This commit is contained in:
Jesse Barnes 2010-04-22 12:47:41 -07:00
parent c059565054
commit 234286c0f8
9 changed files with 78 additions and 1 deletions

View file

@ -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

View file

@ -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
}
}

View file

@ -549,6 +549,10 @@ struct __GLXscreenConfigsRec
const __DRI2flushExtension *f;
#endif
#ifdef __DRI2_CONFIG_QUERY
const __DRI2configQueryExtension *config;
#endif
#endif
/**

View file

@ -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)
{

View file

@ -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

View file

@ -225,6 +225,7 @@ static const __DRIextension *intelScreenExtensions[] = {
&intelTexBufferExtension.base,
&intelFlushExtension.base,
&intelImageExtension.base,
&dri2ConfigQueryExtension.base,
NULL
};

View file

@ -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
};

View file

@ -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;

View file

@ -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;