Move GLX_MESA_swap_frame_usage DRI entry points to the new mechanism.

This commit is contained in:
Kristian Høgsberg
2007-05-16 15:50:40 -04:00
committed by Kristian Høgsberg
parent 78a6aa57a0
commit a7a0a2beb5
17 changed files with 78 additions and 61 deletions

View File

@@ -61,6 +61,7 @@ typedef struct __DRIextensionRec __DRIextension;
typedef struct __DRIcopySubBufferExtensionRec __DRIcopySubBufferExtension; typedef struct __DRIcopySubBufferExtensionRec __DRIcopySubBufferExtension;
typedef struct __DRIswapControlExtensionRec __DRIswapControlExtension; typedef struct __DRIswapControlExtensionRec __DRIswapControlExtension;
typedef struct __DRIallocateExtensionRec __DRIallocateExtension; typedef struct __DRIallocateExtensionRec __DRIallocateExtension;
typedef struct __DRIframeTrackingExtensionRec __DRIframeTrackingExtension;
/*@}*/ /*@}*/
@@ -112,6 +113,30 @@ struct __DRIallocateExtensionRec {
GLuint (*memoryOffset)(__DRIscreen *screen, const GLvoid *pointer); GLuint (*memoryOffset)(__DRIscreen *screen, const GLvoid *pointer);
}; };
/**
* Used by drivers that implement the GLX_MESA_swap_frame_usage extension.
*/
#define __DRI_FRAME_TRACKING "DRI_FrameTracking"
struct __DRIframeTrackingExtensionRec {
__DRIextension base;
/**
* Enable or disable frame usage tracking.
*
* \since Internal API version 20030317.
*/
int (*frameTracking)(__DRIdrawable *drawable, GLboolean enable);
/**
* Retrieve frame usage information.
*
* \since Internal API version 20030317.
*/
int (*queryFrameTracking)(__DRIdrawable *drawable,
int64_t * sbc, int64_t * missedFrames,
float * lastMissedUsage, float * usage);
};
/** /**
* \name Functions provided by the driver loader. * \name Functions provided by the driver loader.
*/ */
@@ -480,22 +505,6 @@ struct __DRIdrawableRec {
int64_t (*swapBuffersMSC)(__DRIdrawable *drawable, int64_t (*swapBuffersMSC)(__DRIdrawable *drawable,
int64_t target_msc, int64_t target_msc,
int64_t divisor, int64_t remainder); int64_t divisor, int64_t remainder);
/**
* Enable or disable frame usage tracking.
*
* \since Internal API version 20030317.
*/
int (*frameTracking)(__DRIdrawable *drawable, GLboolean enable);
/**
* Retrieve frame usage information.
*
* \since Internal API version 20030317.
*/
int (*queryFrameTracking)(__DRIdrawable *drawable,
int64_t * sbc, int64_t * missedFrames,
float * lastMissedUsage, float * usage);
}; };
#endif #endif

View File

@@ -489,6 +489,10 @@ struct __GLXscreenConfigsRec {
__DRIallocateExtension *allocate; __DRIallocateExtension *allocate;
#endif #endif
#ifdef __DRI_FRAME_TRACKING
__DRIframeTrackingExtension *frameTracking;
#endif
#endif #endif
/** /**

View File

@@ -1835,15 +1835,13 @@ static int __glXGetSwapIntervalMESA(void)
static GLint __glXBeginFrameTrackingMESA(Display *dpy, GLXDrawable drawable) static GLint __glXBeginFrameTrackingMESA(Display *dpy, GLXDrawable drawable)
{ {
int status = GLX_BAD_CONTEXT; int status = GLX_BAD_CONTEXT;
#ifdef GLX_DIRECT_RENDERING #ifdef __DRI_FRAME_TRACKING
int screen; int screen;
__DRIdrawable * const pdraw = GetDRIDrawable(dpy, drawable, & screen); __DRIdrawable * const pdraw = GetDRIDrawable(dpy, drawable, & screen);
__GLXscreenConfigs * const psc = GetGLXScreenConfigs(dpy, screen); __GLXscreenConfigs * const psc = GetGLXScreenConfigs(dpy, screen);
if ( (pdraw != NULL) && (pdraw->frameTracking != NULL) if (pdraw != NULL && psc->frameTracking != NULL)
&& __glXExtensionBitIsEnabled( psc, MESA_swap_frame_usage_bit ) ) { status = psc->frameTracking->frameTracking(pdraw, GL_TRUE);
status = pdraw->frameTracking(pdraw, GL_TRUE);
}
#else #else
(void) dpy; (void) dpy;
(void) drawable; (void) drawable;
@@ -1855,15 +1853,13 @@ static GLint __glXBeginFrameTrackingMESA(Display *dpy, GLXDrawable drawable)
static GLint __glXEndFrameTrackingMESA(Display *dpy, GLXDrawable drawable) static GLint __glXEndFrameTrackingMESA(Display *dpy, GLXDrawable drawable)
{ {
int status = GLX_BAD_CONTEXT; int status = GLX_BAD_CONTEXT;
#ifdef GLX_DIRECT_RENDERING #ifdef __DRI_FRAME_TRACKING
int screen; int screen;
__DRIdrawable * const pdraw = GetDRIDrawable(dpy, drawable, & screen); __DRIdrawable * const pdraw = GetDRIDrawable(dpy, drawable, & screen);
__GLXscreenConfigs * const psc = GetGLXScreenConfigs(dpy, screen); __GLXscreenConfigs * const psc = GetGLXScreenConfigs(dpy, screen);
if ( (pdraw != NULL) && (pdraw->frameTracking != NULL) if (pdraw != NULL && psc->frameTracking != NULL)
&& __glXExtensionBitIsEnabled( psc, MESA_swap_frame_usage_bit ) ) { status = psc->frameTracking->frameTracking(pdraw, GL_FALSE);
status = pdraw->frameTracking(pdraw, GL_FALSE);
}
#else #else
(void) dpy; (void) dpy;
(void) drawable; (void) drawable;
@@ -1876,18 +1872,19 @@ static GLint __glXGetFrameUsageMESA(Display *dpy, GLXDrawable drawable,
GLfloat *usage) GLfloat *usage)
{ {
int status = GLX_BAD_CONTEXT; int status = GLX_BAD_CONTEXT;
#ifdef GLX_DIRECT_RENDERING #ifdef __DRI_FRAME_TRACKING
int screen; int screen;
__DRIdrawable * const pdraw = GetDRIDrawable(dpy, drawable, & screen); __DRIdrawable * const pdraw = GetDRIDrawable(dpy, drawable, & screen);
__GLXscreenConfigs * const psc = GetGLXScreenConfigs(dpy, screen); __GLXscreenConfigs * const psc = GetGLXScreenConfigs(dpy, screen);
if ( (pdraw != NULL ) && (pdraw->queryFrameTracking != NULL) if (pdraw != NULL && psc->frameTracking != NULL) {
&& __glXExtensionBitIsEnabled( psc, MESA_swap_frame_usage_bit ) ) { int64_t sbc, missedFrames;
int64_t sbc, missedFrames; float lastMissedUsage;
float lastMissedUsage;
status = pdraw->queryFrameTracking(pdraw, &sbc, &missedFrames, status = psc->frameTracking->queryFrameTracking(pdraw, &sbc,
&lastMissedUsage, usage); &missedFrames,
&lastMissedUsage,
usage);
} }
#else #else
(void) dpy; (void) dpy;
@@ -1903,17 +1900,16 @@ static GLint __glXQueryFrameTrackingMESA(Display *dpy, GLXDrawable drawable,
GLfloat *lastMissedUsage) GLfloat *lastMissedUsage)
{ {
int status = GLX_BAD_CONTEXT; int status = GLX_BAD_CONTEXT;
#ifdef GLX_DIRECT_RENDERING #ifdef __DRI_FRAME_TRACKING
int screen; int screen;
__DRIdrawable * const pdraw = GetDRIDrawable(dpy, drawable, & screen); __DRIdrawable * const pdraw = GetDRIDrawable(dpy, drawable, & screen);
__GLXscreenConfigs * const psc = GetGLXScreenConfigs(dpy, screen); __GLXscreenConfigs * const psc = GetGLXScreenConfigs(dpy, screen);
if ( (pdraw != NULL ) && (pdraw->queryFrameTracking != NULL) if (pdraw != NULL && psc->frameTracking != NULL) {
&& __glXExtensionBitIsEnabled( psc, MESA_swap_frame_usage_bit ) ) {
float usage; float usage;
status = pdraw->queryFrameTracking(pdraw, sbc, missedFrames, status = psc->frameTracking->queryFrameTracking(pdraw, sbc, missedFrames,
lastMissedUsage, &usage); lastMissedUsage, &usage);
} }
#else #else
(void) dpy; (void) dpy;

View File

@@ -1024,7 +1024,6 @@ static void queryExtensions(__GLXscreenConfigs *psc)
psc->copySubBuffer = (__DRIcopySubBufferExtension *) extensions[i]; psc->copySubBuffer = (__DRIcopySubBufferExtension *) extensions[i];
__glXScrEnableExtension(&psc->driScreen, __glXScrEnableExtension(&psc->driScreen,
"GLX_MESA_copy_sub_buffer"); "GLX_MESA_copy_sub_buffer");
} }
#endif #endif
@@ -1035,7 +1034,6 @@ static void queryExtensions(__GLXscreenConfigs *psc)
"GLX_SGI_swap_control"); "GLX_SGI_swap_control");
__glXScrEnableExtension(&psc->driScreen, __glXScrEnableExtension(&psc->driScreen,
"GLX_MESA_swap_control"); "GLX_MESA_swap_control");
} }
#endif #endif
@@ -1046,7 +1044,14 @@ static void queryExtensions(__GLXscreenConfigs *psc)
"GLX_SGI_swap_control"); "GLX_SGI_swap_control");
__glXScrEnableExtension(&psc->driScreen, __glXScrEnableExtension(&psc->driScreen,
"GLX_MESA_swap_control"); "GLX_MESA_swap_control");
}
#endif
#ifdef __DRI_FRAME_TRACKING
if (strcmp(extensions[i]->name, __DRI_FRAME_TRACKING) == 0) {
psc->frameTracking = (__DRIframeTrackingExtension *) extensions[i];
__glXScrEnableExtension(&psc->driScreen,
"GLX_MESA_swap_frame_usage");
} }
#endif #endif

View File

@@ -52,11 +52,6 @@ static const int empty_attribute_list[1] = { None };
*/ */
static int api_ver = 0; static int api_ver = 0;
/* forward declarations */
static int driQueryFrameTracking( __DRIdrawable *drawable,
int64_t *sbc, int64_t *missedFrames,
float *lastMissedUsage, float *usage );
static void *driCreateNewDrawable(__DRIscreen *screen, static void *driCreateNewDrawable(__DRIscreen *screen,
const __GLcontextModes *modes, const __GLcontextModes *modes,
__DRIdrawable *pdraw, __DRIdrawable *pdraw,
@@ -515,8 +510,6 @@ static void *driCreateNewDrawable(__DRIscreen *screen,
pdraw->waitForSBC = driWaitForSBC; pdraw->waitForSBC = driWaitForSBC;
pdraw->waitForMSC = driWaitForMSC; pdraw->waitForMSC = driWaitForMSC;
pdraw->swapBuffersMSC = driSwapBuffersMSC; pdraw->swapBuffersMSC = driSwapBuffersMSC;
pdraw->frameTracking = NULL;
pdraw->queryFrameTracking = driQueryFrameTracking;
/* This special default value is replaced with the configured /* This special default value is replaced with the configured
* default value when the drawable is first bound to a direct * default value when the drawable is first bound to a direct
@@ -825,6 +818,12 @@ int driCompareGLXAPIVersion( GLint required_version )
} }
static int
driFrameTracking(__DRIdrawable *drawable, GLboolean enable)
{
return GLX_BAD_CONTEXT;
}
static int static int
driQueryFrameTracking(__DRIdrawable *drawable, driQueryFrameTracking(__DRIdrawable *drawable,
int64_t * sbc, int64_t * missedFrames, int64_t * sbc, int64_t * missedFrames,
@@ -849,6 +848,11 @@ driQueryFrameTracking(__DRIdrawable *drawable,
return status; return status;
} }
const __DRIframeTrackingExtension driFrameTrackingExtension = {
{ __DRI_FRAME_TRACKING },
driFrameTracking,
driQueryFrameTracking
};
/** /**
* Calculate amount of swap interval used between GLX buffer swaps. * Calculate amount of swap interval used between GLX buffer swaps.

View File

@@ -78,6 +78,7 @@ extern __GLcontextModes *__driDriverInitScreen(__DRIscreenPrivate *psp);
*/ */
extern const __DRIcopySubBufferExtension driCopySubBufferExtension; extern const __DRIcopySubBufferExtension driCopySubBufferExtension;
extern const __DRIswapControlExtension driSwapControlExtension; extern const __DRIswapControlExtension driSwapControlExtension;
extern const __DRIframeTrackingExtension driFrameTrackingExtension;
/** /**
* Used by DRI_VALIDATE_DRAWABLE_INFO * Used by DRI_VALIDATE_DRAWABLE_INFO

View File

@@ -430,6 +430,7 @@ static const __DRIextension *intelExtensions[] = {
&driCopySubBufferExtension.base, &driCopySubBufferExtension.base,
&driSwapControlExtension.base, &driSwapControlExtension.base,
&intelAllocateExtension.base, &intelAllocateExtension.base,
&driFrameTrackingExtension.base,
NULL NULL
}; };
@@ -539,7 +540,6 @@ static GLboolean intelInitDriver(__DRIscreenPrivate *sPriv)
if (glx_enable_extension != NULL) { if (glx_enable_extension != NULL) {
(*glx_enable_extension) (sPriv->psc, "GLX_SGI_video_sync"); (*glx_enable_extension) (sPriv->psc, "GLX_SGI_video_sync");
(*glx_enable_extension) (sPriv->psc, "GLX_MESA_swap_frame_usage");
(*glx_enable_extension) (sPriv->psc, "GLX_SGI_make_current_read"); (*glx_enable_extension) (sPriv->psc, "GLX_SGI_make_current_read");
} }

View File

@@ -267,6 +267,7 @@ intelUpdateScreenFromSAREA(intelScreenPrivate *intelScreen,
static const __DRIextension *intelExtensions[] = { static const __DRIextension *intelExtensions[] = {
&driCopySubBufferExtension.base, &driCopySubBufferExtension.base,
&driSwapControlExtension.base, &driSwapControlExtension.base,
&driFrameTrackingExtension.base,
NULL NULL
}; };
@@ -359,7 +360,6 @@ static GLboolean intelInitDriver(__DRIscreenPrivate *sPriv)
if (glx_enable_extension != NULL) { if (glx_enable_extension != NULL) {
(*glx_enable_extension)( sPriv->psc, "GLX_SGI_video_sync" ); (*glx_enable_extension)( sPriv->psc, "GLX_SGI_video_sync" );
(*glx_enable_extension)( sPriv->psc, "GLX_MESA_swap_frame_usage" );
(*glx_enable_extension)( sPriv->psc, "GLX_SGI_make_current_read" ); (*glx_enable_extension)( sPriv->psc, "GLX_SGI_make_current_read" );
} }

View File

@@ -320,14 +320,13 @@ mach64CreateScreen( __DRIscreenPrivate *sPriv )
mach64Screen->driScreen = sPriv; mach64Screen->driScreen = sPriv;
i = 0; i = 0;
mach64Screen->extensions[i++] = &driFrameTrackingExtension.base;
if ( glx_enable_extension != NULL ) { if ( glx_enable_extension != NULL ) {
if ( mach64Screen->irq != 0 ) { if ( mach64Screen->irq != 0 ) {
mach64Screen->extensions[i++] = &driSwapControlExtension.base; mach64Screen->extensions[i++] = &driSwapControlExtension.base;
(*glx_enable_extension)( sPriv->psc, "GLX_SGI_video_sync" ); (*glx_enable_extension)( sPriv->psc, "GLX_SGI_video_sync" );
} }
(*glx_enable_extension)( sPriv->psc, "GLX_MESA_swap_frame_usage" );
} }
mach64Screen->extensions[i++] = NULL; mach64Screen->extensions[i++] = NULL;
sPriv->extensions = mach64Screen->extensions; sPriv->extensions = mach64Screen->extensions;

View File

@@ -74,7 +74,7 @@ typedef struct {
driOptionCache optionCache; driOptionCache optionCache;
const __DRIextension *extensions[2]; const __DRIextension *extensions[3];
} mach64ScreenRec, *mach64ScreenPtr; } mach64ScreenRec, *mach64ScreenPtr;
#endif /* __MACH64_SCREEN_H__ */ #endif /* __MACH64_SCREEN_H__ */

View File

@@ -195,6 +195,7 @@ mgaFillInModes( unsigned pixel_bits, unsigned depth_bits,
static const __DRIextension *mgaExtensions[] = { static const __DRIextension *mgaExtensions[] = {
&driSwapControlExtension.base, &driSwapControlExtension.base,
&driFrameTrackingExtension.base,
NULL NULL
}; };
@@ -242,7 +243,6 @@ mgaInitDriver(__DRIscreenPrivate *sPriv)
sPriv->extensions = mgaExtensions; sPriv->extensions = mgaExtensions;
if ( glx_enable_extension != NULL ) { if ( glx_enable_extension != NULL ) {
(*glx_enable_extension)( sPriv->psc, "GLX_MESA_swap_frame_usage" );
(*glx_enable_extension)( sPriv->psc, "GLX_SGI_make_current_read" ); (*glx_enable_extension)( sPriv->psc, "GLX_SGI_make_current_read" );
(*glx_enable_extension)( sPriv->psc, "GLX_SGI_video_sync" ); (*glx_enable_extension)( sPriv->psc, "GLX_SGI_video_sync" );
} }

View File

@@ -227,13 +227,12 @@ r128CreateScreen( __DRIscreenPrivate *sPriv )
r128Screen->driScreen = sPriv; r128Screen->driScreen = sPriv;
i = 0; i = 0;
r128Screen->extensions[i++] = &driFrameTrackingExtension.base;
if ( glx_enable_extension != NULL ) { if ( glx_enable_extension != NULL ) {
if ( r128Screen->irq != 0 ) { if ( r128Screen->irq != 0 ) {
r128Screen->extensions[i++] = &driSwapControlExtension.base; r128Screen->extensions[i++] = &driSwapControlExtension.base;
(*glx_enable_extension)( sPriv->psc, "GLX_SGI_video_sync" ); (*glx_enable_extension)( sPriv->psc, "GLX_SGI_video_sync" );
} }
(*glx_enable_extension)( sPriv->psc, "GLX_MESA_swap_frame_usage" );
} }
r128Screen->extensions[i++] = NULL; r128Screen->extensions[i++] = NULL;
sPriv->extensions = r128Screen->extensions; sPriv->extensions = r128Screen->extensions;

View File

@@ -78,7 +78,7 @@ typedef struct {
/* Configuration cache with default values for all contexts */ /* Configuration cache with default values for all contexts */
driOptionCache optionCache; driOptionCache optionCache;
const __DRIextension *extensions[2]; const __DRIextension *extensions[3];
} r128ScreenRec, *r128ScreenPtr; } r128ScreenRec, *r128ScreenPtr;

View File

@@ -744,6 +744,7 @@ radeonCreateScreen( __DRIscreenPrivate *sPriv )
i = 0; i = 0;
screen->extensions[i++] = &driCopySubBufferExtension.base; screen->extensions[i++] = &driCopySubBufferExtension.base;
screen->extensions[i++] = &driFrameTrackingExtension.base;
if ( glx_enable_extension != NULL ) { if ( glx_enable_extension != NULL ) {
if ( screen->irq != 0 ) { if ( screen->irq != 0 ) {
@@ -751,7 +752,6 @@ radeonCreateScreen( __DRIscreenPrivate *sPriv )
(*glx_enable_extension)( sPriv->psc, "GLX_SGI_video_sync" ); (*glx_enable_extension)( sPriv->psc, "GLX_SGI_video_sync" );
} }
(*glx_enable_extension)( sPriv->psc, "GLX_MESA_swap_frame_usage" );
(*glx_enable_extension)( sPriv->psc, "GLX_SGI_make_current_read" ); (*glx_enable_extension)( sPriv->psc, "GLX_SGI_make_current_read" );
} }

View File

@@ -104,7 +104,7 @@ typedef struct {
/* Configuration cache with default values for all contexts */ /* Configuration cache with default values for all contexts */
driOptionCache optionCache; driOptionCache optionCache;
const __DRIextension *extensions[4]; const __DRIextension *extensions[5];
} radeonScreenRec, *radeonScreenPtr; } radeonScreenRec, *radeonScreenPtr;
#define IS_R100_CLASS(screen) \ #define IS_R100_CLASS(screen) \

View File

@@ -176,6 +176,7 @@ viaInitDriver(__DRIscreenPrivate *sPriv)
viaScreen->sareaPrivOffset = gDRIPriv->sarea_priv_offset; viaScreen->sareaPrivOffset = gDRIPriv->sarea_priv_offset;
i = 0; i = 0;
viaScreen->extensions[i++] = &driFrameTrackingExtension.base;
if ( glx_enable_extension != NULL ) { if ( glx_enable_extension != NULL ) {
if ( viaScreen->irqEnabled ) { if ( viaScreen->irqEnabled ) {
viaScreen->extensions[i++] = &driSwapControlExtension.base; viaScreen->extensions[i++] = &driSwapControlExtension.base;
@@ -183,7 +184,6 @@ viaInitDriver(__DRIscreenPrivate *sPriv)
} }
(*glx_enable_extension)( sPriv->psc, "GLX_SGI_make_current_read" ); (*glx_enable_extension)( sPriv->psc, "GLX_SGI_make_current_read" );
(*glx_enable_extension)( sPriv->psc, "GLX_MESA_swap_frame_usage" );
} }
viaScreen->extensions[i++] = NULL; viaScreen->extensions[i++] = NULL;
sPriv->extensions = viaScreen->extensions; sPriv->extensions = viaScreen->extensions;

View File

@@ -71,7 +71,7 @@ typedef struct {
/* Configuration cache with default values for all contexts */ /* Configuration cache with default values for all contexts */
driOptionCache optionCache; driOptionCache optionCache;
const __DRIextension *extensions[2]; const __DRIextension *extensions[3];
} viaScreenPrivate; } viaScreenPrivate;