diff options
author | Luc Verhaegen <libv@skynet.be> | 2009-11-22 18:11:28 +0100 |
---|---|---|
committer | Luc Verhaegen <libv@skynet.be> | 2009-11-22 18:11:28 +0100 |
commit | 84c6d56d1ec6d8e42b08020c376ad08fdbe8c854 (patch) | |
tree | 70c2c83639d9d69dd4bae6902ea2c7c2c3c11baa | |
parent | b7571ef081f90c4994b465349372371eff863cd5 (diff) |
DRI: Fix build against debian Lenny's Mesa 7.0.3.
-rw-r--r-- | configure.ac | 74 | ||||
-rw-r--r-- | dri/Makefile.am | 1 | ||||
-rw-r--r-- | dri/via_context.c | 51 | ||||
-rw-r--r-- | dri/via_context.h | 5 | ||||
-rw-r--r-- | dri/via_ioctl.c | 48 | ||||
-rw-r--r-- | dri/via_screen.c | 179 | ||||
-rw-r--r-- | dri/via_screen.h | 2 | ||||
-rw-r--r-- | dri/via_span.c | 1 | ||||
-rw-r--r-- | dri/via_state.c | 18 |
9 files changed, 334 insertions, 45 deletions
diff --git a/configure.ac b/configure.ac index 093d28c..37fdd64 100644 --- a/configure.ac +++ b/configure.ac @@ -395,8 +395,10 @@ fi if test "x$build_dri_driver" = xyes; then AC_CHECK_FILE([${mesa_build_dir}/src/mesa/drivers/dri/common/dri_metaops.c], [mesa_have_dri_metaops=yes],) - AM_CONDITIONAL(MESA_HAVE_DRI_METAOPS, test "x$mesa_have_dri_metaops" = xyes) +fi +AM_CONDITIONAL(MESA_HAVE_DRI_METAOPS, test "x$mesa_have_dri_metaops" = xyes) +if test "x$build_dri_driver" = xyes; then AC_EGREP_HEADER([msaa_samples], [${mesa_build_dir}/src/mesa/drivers/dri/common/utils.h], [mesa_have_msaa=yes],) if test "x$mesa_have_msaa" = xyes; then @@ -404,14 +406,72 @@ if test "x$build_dri_driver" = xyes; then fi SAVED_CFLAGS="$CFLAGS" - CFLAGS="-I${mesa_build_dir}/src/mesa/" - AC_CHECK_MEMBER([struct gl_stencil_attrib._Enabled], - [mesa_gl_stencil_attrib__enabled=yes], , - [#include "${mesa_build_dir}/src/mesa/main/mtypes.h"]) - CFLAGS="$SAVED_CFLAGS" + + CFLAGS="-I${mesa_build_dir}/src/mesa/ $DRI_CFLAGS -I${mesa_build_dir}/include/" + AC_CHECK_MEMBER([struct __DRIextensionRec.name], + [mesa_dri_screen_extension="yes"], , + [#include "GL/gl.h" + #include "GL/internal/dri_interface.h"]) + + if test "x$mesa_dri_screen_extension" = xyes; then + AC_DEFINE(MESA_DRI_SCREEN_EXTENSION, 1, + [Does MESA have the newer screen Extension API?]) + + # only run this test if the previous succeeded. + AC_CHECK_MEMBER([struct __DRImediaStreamCounterExtensionRec.getDrawableMSC], + [mesa_dri_reworked_vblank="yes"], , + [#include "GL/gl.h" + #include "GL/internal/dri_interface.h"]) + fi + + if test "x$mesa_dri_reworked_vblank" = xyes; then + AC_DEFINE(MESA_DRI_REWORKED_VBLANK, 1, + [Was the DRI VBlank infrastructure reworked?]) + + # only run this test if the previous succeeded. + AC_CHECK_MEMBER([struct gl_framebuffer._ColorDrawBufferIndexes], + [mesa_gl_framebuffer_colordrawbufferindexes="yes"], , + [#include "${mesa_build_dir}/src/mesa/main/mtypes.h"]) + fi + + if test "x$mesa_gl_framebuffer_colordrawbufferindexes" = xyes; then + AC_DEFINE(MESA_GL_FRAMEBUFFER_COLORDRAWBUFFERINDEXES, 1, + [Does the gl_framebuffer struct have the _ColorDrawBufferIndexes member.]) + + # only run this test if the previous succeeded. + AC_CHECK_MEMBER([struct __DRIsystemTimeExtensionRec.base], + [mesa_dri_screen_extension_loader="yes"], , + [#include "GL/gl.h" + #include "GL/internal/dri_interface.h"]) + fi + + if test "x$mesa_dri_screen_extension_loader" = xyes; then + AC_DEFINE(MESA_DRI_SCREEN_EXTENSION_LOADER, 1, + [Is the new screen Extension used as a loader interface?]) + + # only run this test if the previous succeeded. + AC_CHECK_DECL([__DRI_LEGACY_VERSION], + [mesa_dri2_interface="yes"], , + [#include "GL/gl.h" + #include "GL/internal/dri_interface.h"]) + fi + + if test "x$mesa_dri2_interface" = xyes; then + AC_DEFINE(MESA_DRI2_INTERFACE, 1, + [DRI interface get reworked in the run-up to dri2?]) + + # only run this test if the previous succeeded. + AC_CHECK_MEMBER([struct gl_stencil_attrib._Enabled], + [mesa_gl_stencil_attrib__enabled=yes], , + [#include "${mesa_build_dir}/src/mesa/main/mtypes.h"]) + fi + if test "x$mesa_gl_stencil_attrib__enabled" = xyes; then - AC_DEFINE(MESA_GL_STENCIL_ATTRIB__ENABLED, 1, [Does struct gl_stencil_attrib have _Enabled]) + AC_DEFINE(MESA_GL_STENCIL_ATTRIB__ENABLED, 1, + [Does struct gl_stencil_attrib have _Enabled]) fi + + CFLAGS="$SAVED_CFLAGS" fi AC_SUBST([DRI_CFLAGS]) diff --git a/dri/Makefile.am b/dri/Makefile.am index b40e242..dd0f568 100644 --- a/dri/Makefile.am +++ b/dri/Makefile.am @@ -11,6 +11,7 @@ AM_CFLAGS += -I@MESA_DIR@/src/mesa/main -I@MESA_DIR@/src/mesa/glapi # convenience library noinst_LTLIBRARIES = libdricommon.la +libdricommon_la_CFLAGS = $(AM_CFLAGS) -I@MESA_DIR@/src/mesa/shader libdricommon_la_SOURCES = \ $(MESA_DRI_DIR)/common/utils.c \ $(MESA_DRI_DIR)/common/texmem.c \ diff --git a/dri/via_context.c b/dri/via_context.c index 2d301d4..63a804b 100644 --- a/dri/via_context.c +++ b/dri/via_context.c @@ -30,6 +30,8 @@ * \author Others at S3 Graphics? */ +#include "config.h" + #include "main/macros.h" #include "main/context.h" #include "main/framebuffer.h" @@ -634,7 +636,7 @@ viaCreateContext(const __GLcontextModes *visual, viaInitSpanFuncs(ctx); viaInitIoctlFuncs(ctx); viaInitState(ctx); - + if (getenv("VIA_DEBUG")) VIA_DEBUG = driParseDebugString( getenv( "VIA_DEBUG" ), debug_control ); @@ -643,10 +645,20 @@ viaCreateContext(const __GLcontextModes *visual, driQueryOptionb(&vmesa->optionCache, "no_rast")) FALLBACK(vmesa, VIA_FALLBACK_USER_DISABLE, 1); +#ifndef MESA_DRI_REWORKED_VBLANK + vmesa->vblank_flags = + vmesa->viaScreen->irqEnabled ? + driGetDefaultVBlankFlags(&vmesa->optionCache) : VBLANK_FLAG_NO_IRQ; +#endif + if (getenv("VIA_PAGEFLIP")) vmesa->allowPageFlip = 1; +#ifdef MESA_DRI_SCREEN_EXTENSION_LOADER (*sPriv->systemTime->getUST)( &vmesa->swap_ust ); +#else + (*dri_interface->getUST)( &vmesa->swap_ust ); +#endif vmesa->regMMIOBase = (GLuint *)((unsigned long)viaScreen->reg); @@ -722,22 +734,35 @@ void viaXMesaWindowMoved(struct via_context *vmesa) draw_buffer = (struct via_renderbuffer *) drawable->driverPrivate; read_buffer = (struct via_renderbuffer *) readable->driverPrivate; - - switch (vmesa->glCtx->DrawBuffer->_ColorDrawBufferIndexes[0]) { - case BUFFER_BACK_LEFT: + + switch ( +#ifdef MESA_GL_FRAMEBUFFER_COLORDRAWBUFFERINDEXES + vmesa->glCtx->DrawBuffer->_ColorDrawBufferIndexes[0] +#else + vmesa->glCtx->DrawBuffer->_ColorDrawBufferMask[0] +#endif + ) { +#ifdef MESA_GL_FRAMEBUFFER_COLORDRAWBUFFERINDEXES + case BUFFER_BACK_LEFT: +#else + case BUFFER_BIT_BACK_LEFT: +#endif if (drawable->numBackClipRects == 0) { vmesa->numClipRects = drawable->numClipRects; vmesa->pClipRects = drawable->pClipRects; - } - else { + } else { vmesa->numClipRects = drawable->numBackClipRects; vmesa->pClipRects = drawable->pBackClipRects; } break; +#ifdef MESA_GL_FRAMEBUFFER_COLORDRAWBUFFERINDEXES case BUFFER_FRONT_LEFT: - vmesa->numClipRects = drawable->numClipRects; - vmesa->pClipRects = drawable->pClipRects; - break; +#else + case BUFFER_BIT_FRONT_LEFT: +#endif + vmesa->numClipRects = drawable->numClipRects; + vmesa->pClipRects = drawable->pClipRects; + break; default: vmesa->numClipRects = 0; break; @@ -820,8 +845,15 @@ viaMakeCurrent(__DRIcontextPrivate *driContextPriv, drawBuffer = (GLframebuffer *)driDrawPriv->driverPrivate; readBuffer = (GLframebuffer *)driReadPriv->driverPrivate; +#ifndef MESA_DRI_REWORKED_VBLANK + if (vmesa->driDrawable != driDrawPriv) + driDrawableInitVBlank(driDrawPriv, vmesa->vblank_flags, + &vmesa->vbl_seq); +#endif + if ((vmesa->driDrawable != driDrawPriv) || (vmesa->driReadable != driReadPriv)) { +#ifdef MESA_DRI_REWORKED_VBLANK if (driDrawPriv->swap_interval == (unsigned)-1) { driDrawPriv->vblFlags = vmesa->viaScreen->irqEnabled ? @@ -830,6 +862,7 @@ viaMakeCurrent(__DRIcontextPrivate *driContextPriv, driDrawableInitVBlank(driDrawPriv); } +#endif vmesa->driDrawable = driDrawPriv; vmesa->driReadable = driReadPriv; diff --git a/dri/via_context.h b/dri/via_context.h index b22d28f..63db99d 100644 --- a/dri/via_context.h +++ b/dri/via_context.h @@ -266,6 +266,11 @@ struct via_context { /* Configuration cache */ driOptionCache optionCache; +#ifndef MESA_DRI_REWORKED_VBLANK + GLuint vblank_flags; + GLuint vbl_seq; +#endif + int64_t swap_ust; int64_t swap_missed_ust; diff --git a/dri/via_ioctl.c b/dri/via_ioctl.c index 590288d..326b9a0 100644 --- a/dri/via_ioctl.c +++ b/dri/via_ioctl.c @@ -22,6 +22,8 @@ * DEALINGS IN THE SOFTWARE. */ +#include "config.h" + #include <errno.h> #include "swrast/swrast.h" @@ -508,7 +510,9 @@ static void viaWaitIdleVBlank( __DRIdrawablePrivate *dPriv, GLuint value ) { GLboolean missed_target; +#ifdef MESA_DRI_SCREEN_EXTENSION_LOADER __DRIscreenPrivate *psp = dPriv->driScreenPriv; +#endif VIA_FLUSH_DMA(vmesa); @@ -520,10 +524,21 @@ static void viaWaitIdleVBlank( __DRIdrawablePrivate *dPriv, vmesa->thrashing) viaSwapOutWork(vmesa); - driWaitForVBlank( dPriv, & missed_target ); +#ifdef MESA_DRI_REWORKED_VBLANK + driWaitForVBlank(dPriv, &missed_target); +#else + driWaitForVBlank(dPriv, &vmesa->vbl_seq, vmesa->vblank_flags, + &missed_target); +#endif + if ( missed_target ) { vmesa->swap_missed_count++; + +#ifdef MESA_DRI_SCREEN_EXTENSION_LOADER (*psp->systemTime->getUST)( &vmesa->swap_missed_ust ); +#else + (*dri_interface->getUST)( &vmesa->swap_missed_ust ); +#endif } } while (!viaCheckBreadcrumb(vmesa, value)); @@ -591,7 +606,9 @@ void viaCopyBuffer(__DRIdrawablePrivate *dPriv) { struct via_context *vmesa = (struct via_context *)dPriv->driContextPriv->driverPrivate; +#ifdef MESA_DRI_SCREEN_EXTENSION_LOADER __DRIscreenPrivate *psp = dPriv->driScreenPriv; +#endif if (VIA_DEBUG & DEBUG_IOCTL) fprintf(stderr, @@ -604,8 +621,13 @@ void viaCopyBuffer(__DRIdrawablePrivate *dPriv) VIA_FLUSH_DMA(vmesa); - if (dPriv->vblFlags == VBLANK_FLAG_SYNC && - vmesa->lastBreadcrumbWrite > 1) + if ( +#ifdef MESA_DRI_REWORKED_VBLANK + (dPriv->vblFlags == VBLANK_FLAG_SYNC) +#else + (vmesa->vblank_flags == VBLANK_FLAG_SYNC) +#endif + && (vmesa->lastBreadcrumbWrite > 1)) viaWaitIdleVBlank(dPriv, vmesa, vmesa->lastBreadcrumbWrite-1); else viaWaitIdleVBlank(dPriv, vmesa, vmesa->lastSwap[1]); @@ -627,7 +649,11 @@ void viaCopyBuffer(__DRIdrawablePrivate *dPriv) viaEmitBreadcrumbLocked(vmesa); UNLOCK_HARDWARE(vmesa); +#ifdef MESA_DRI_SCREEN_EXTENSION_LOADER (*psp->systemTime->getUST)( &vmesa->swap_ust ); +#else + (*dri_interface->getUST)( &vmesa->swap_ust ); +#endif } @@ -636,11 +662,18 @@ void viaPageFlip(__DRIdrawablePrivate *dPriv) struct via_context *vmesa = (struct via_context *)dPriv->driContextPriv->driverPrivate; struct via_renderbuffer buffer_tmp; +#ifdef MESA_DRI_SCREEN_EXTENSION_LOADER __DRIscreenPrivate *psp = dPriv->driScreenPriv; +#endif VIA_FLUSH_DMA(vmesa); - if (dPriv->vblFlags == VBLANK_FLAG_SYNC && - vmesa->lastBreadcrumbWrite > 1) + if ( +#ifdef MESA_DRI_REWORKED_VBLANK + (dPriv->vblFlags == VBLANK_FLAG_SYNC) +#else + (vmesa->vblank_flags == VBLANK_FLAG_SYNC) +#endif + && (vmesa->lastBreadcrumbWrite > 1)) viaWaitIdleVBlank(dPriv, vmesa, vmesa->lastBreadcrumbWrite - 1); else viaWaitIdleVBlank(dPriv, vmesa, vmesa->lastSwap[0]); @@ -652,8 +685,11 @@ void viaPageFlip(__DRIdrawablePrivate *dPriv) viaEmitBreadcrumbLocked(vmesa); UNLOCK_HARDWARE(vmesa); +#ifdef MESA_DRI_SCREEN_EXTENSION_LOADER (*psp->systemTime->getUST)( &vmesa->swap_ust ); - +#else + (*dri_interface->getUST)( &vmesa->swap_ust ); +#endif /* KW: FIXME: When buffers are freed, could free frontbuffer by * accident: diff --git a/dri/via_screen.c b/dri/via_screen.c index 843934e..b0a81bd 100644 --- a/dri/via_screen.c +++ b/dri/via_screen.c @@ -66,16 +66,15 @@ static drmBufMapPtr via_create_empty_buffers(void) { drmBufMapPtr retval; - retval = (drmBufMapPtr)MALLOC(sizeof(drmBufMap)); - if (retval == NULL) return NULL; - memset(retval, 0, sizeof(drmBufMap)); + retval = (drmBufMapPtr)CALLOC(sizeof(drmBufMap)); + if (!retval) + return NULL; - retval->list = (drmBufPtr)MALLOC(sizeof(drmBuf) * VIA_DMA_BUF_NR); - if (retval->list == NULL) { + retval->list = (drmBufPtr)CALLOC(sizeof(drmBuf) * VIA_DMA_BUF_NR); + if (!retval->list) { FREE(retval); return NULL; } - memset(retval->list, 0, sizeof(drmBuf) * VIA_DMA_BUF_NR); return retval; } @@ -94,7 +93,6 @@ viaInitDriver(__DRIscreenPrivate *sPriv) { viaScreenPrivate *viaScreen; VIADRIPtr gDRIPriv = (VIADRIPtr)sPriv->pDevPriv; - int i; if (sPriv->devPrivSize != sizeof(VIADRIRec)) { fprintf(stderr,"\nERROR! sizeof(VIADRIRec) does not match passed size from device driver\n"); @@ -112,7 +110,6 @@ viaInitDriver(__DRIscreenPrivate *sPriv) driParseOptionInfo (&viaScreen->optionCache, __driConfigOptions, __driNConfigOptions); - sPriv->private = (void *)viaScreen; viaScreen->width = gDRIPriv->width; @@ -123,14 +120,15 @@ viaInitDriver(__DRIscreenPrivate *sPriv) viaScreen->irqEnabled = gDRIPriv->irqEnabled; if (VIA_DEBUG & DEBUG_DRI) { - fprintf(stderr, "width = %08x\n", viaScreen->width); - fprintf(stderr, "height = %08x\n", viaScreen->height); + fprintf(stderr, "width = %08x\n", viaScreen->width); + fprintf(stderr, "height = %08x\n", viaScreen->height); } viaScreen->bufs = via_create_empty_buffers(); if (viaScreen->bufs == NULL) { __driUtilMessage("viaInitDriver: via_create_empty_buffers() failed"); FREE(viaScreen); + sPriv->private = NULL; return GL_FALSE; } @@ -158,16 +156,37 @@ viaInitDriver(__DRIscreenPrivate *sPriv) viaScreen->sareaPrivOffset = gDRIPriv->sarea_priv_offset; - i = 0; - viaScreen->extensions[i++] = &driFrameTrackingExtension.base; - viaScreen->extensions[i++] = &driReadDrawableExtension; - if (gDRIPriv->irqEnabled) { - viaScreen->extensions[i++] = &driSwapControlExtension.base; - viaScreen->extensions[i++] = &driMediaStreamCounterExtension.base; - } + { +#ifdef MESA_DRI_SCREEN_EXTENSION + int i = 0; + + viaScreen->extensions[i++] = &driFrameTrackingExtension.base; + viaScreen->extensions[i++] = &driReadDrawableExtension; + if (gDRIPriv->irqEnabled) { + viaScreen->extensions[i++] = &driSwapControlExtension.base; + viaScreen->extensions[i++] = &driMediaStreamCounterExtension.base; + } - viaScreen->extensions[i++] = NULL; - sPriv->extensions = viaScreen->extensions; + viaScreen->extensions[i++] = NULL; + sPriv->extensions = viaScreen->extensions; +#else + PFNGLXSCRENABLEEXTENSIONPROC glx_enable_extension = + (PFNGLXSCRENABLEEXTENSIONPROC) + (*dri_interface->getProcAddress("glxEnableExtension")); + void * const ScreenConfigs = sPriv->psc->screenConfigs; + + if (glx_enable_extension) { + if ( viaScreen->irqEnabled ) { + (*glx_enable_extension)(ScreenConfigs, "GLX_SGI_swap_control"); + (*glx_enable_extension)(ScreenConfigs, "GLX_SGI_video_sync"); + (*glx_enable_extension)(ScreenConfigs, "GLX_MESA_swap_control"); + } + + (*glx_enable_extension)(ScreenConfigs, "GLX_SGI_make_current_read"); + (*glx_enable_extension)(ScreenConfigs, "GLX_MESA_swap_frame_usage"); + } +#endif + } return GL_TRUE; } @@ -308,11 +327,22 @@ viaDestroyBuffer(__DRIdrawablePrivate *driDrawPriv) _mesa_reference_framebuffer((GLframebuffer **)(&(driDrawPriv->driverPrivate)), NULL); } -static const __DRIconfig ** +static +#ifdef MESA_DRI2_INTERFACE +const __DRIconfig ** +#else +__GLcontextModes * +#endif + viaFillInModes( __DRIscreenPrivate *psp, unsigned pixel_bits, GLboolean have_back_buffer ) { +#ifdef MESA_DRI2_INTERFACE __DRIconfig **configs; +#else + __GLcontextModes *modes, *m; + unsigned num_modes; +#endif const unsigned back_buffer_factor = (have_back_buffer) ? 2 : 1; GLenum fb_format; GLenum fb_type; @@ -345,6 +375,7 @@ viaFillInModes( __DRIscreenPrivate *psp, fb_type = GL_UNSIGNED_INT_8_8_8_8_REV; } +#ifdef MESA_DRI2_INTERFACE #ifdef MESA_HAVE_MSAA configs = driCreateConfigs(fb_format, fb_type, depth_bits_array, stencil_bits_array, @@ -365,9 +396,37 @@ viaFillInModes( __DRIscreenPrivate *psp, } return (const __DRIconfig **) configs; -} +#else /* !MESA_DRI2_INTERFACE */ + num_modes = depth_buffer_factor * back_buffer_factor * 4; + +#ifdef MESA_DRI_SCREEN_EXTENSION_LOADER + modes = (*psp->contextModes->createContextModes)(num_modes, sizeof(__GLcontextModes)); +#else + modes = (*dri_interface->createContextModes)( num_modes, sizeof( __GLcontextModes ) ); +#endif + + m = modes; + if (!driFillInModes(&m, fb_format, fb_type, depth_bits_array, stencil_bits_array, + depth_buffer_factor, back_buffer_modes, back_buffer_factor, + GLX_TRUE_COLOR)) { + fprintf(stderr, "[%s:%u] Error creating FBConfig!\n", + __func__, __LINE__); + return NULL; + } + if (!driFillInModes(&m, fb_format, fb_type, depth_bits_array, stencil_bits_array, + depth_buffer_factor, back_buffer_modes, back_buffer_factor, + GLX_DIRECT_COLOR)) { + fprintf(stderr, "[%s:%u] Error creating FBConfig!\n", + __func__, __LINE__ ); + return NULL; + } + + return modes; +#endif /* MESA_DRI2_INTERFACE */ +} +#ifdef MESA_DRI_SCREEN_EXTENSION /** * This is the driver specific part of the createNewScreen entry point. * @@ -375,7 +434,12 @@ viaFillInModes( __DRIscreenPrivate *psp, * * \return the __GLcontextModes supported by this driver */ -static const __DRIconfig ** +static +#ifdef MESA_DRI2_INTERFACE +const __DRIconfig ** +#else +__GLcontextModes * +#endif viaInitScreen(__DRIscreenPrivate *psp) { static const __DRIversion ddx_expected = { VIA_DRIDDX_VERSION_MAJOR, @@ -412,7 +476,71 @@ viaInitScreen(__DRIscreenPrivate *psp) return viaFillInModes( psp, dri_priv->bytesPerPixel * 8, GL_TRUE ); } +#else +/* defined below */ +const struct __DriverAPIRec driDriverAPI; + +/* + * This is the bootstrap function for the driver. libGL supplies all of the + * requisite information about the system, and the driver initializes itself. + * This routine also fills in the linked list pointed to by \c driver_modes + * with the \c __GLcontextModes that the driver can support for windows or + * pbuffers. + * + * \return A pointer to a \c __DRIscreenPrivate on success, or \c NULL on + * failure. + */ +PUBLIC void * +__driCreateNewScreen_20050727(__DRInativeDisplay *dpy, int scrn, + __DRIscreen *psc, + const __GLcontextModes *modes, + const __DRIversion *ddx_version, + const __DRIversion *dri_version, + const __DRIversion *drm_version, + const __DRIframebuffer *frame_buffer, + drmAddress pSAREA, int fd, + int internal_api_version, + const __DRIinterfaceMethods *interface, + __GLcontextModes **driver_modes ) +{ + __DRIscreenPrivate *psp; + static const __DRIversion ddx_expected = {VIA_DRIDDX_VERSION_MAJOR, + VIA_DRIDDX_VERSION_MINOR, + VIA_DRIDDX_VERSION_PATCH }; + static const __DRIversion dri_expected = { 4, 0, 0 }; + static const __DRIversion drm_expected = { 2, 3, 0 }; + static const char *driver_name = "Unichrome"; + + dri_interface = interface; + + if (!driCheckDriDdxDrmVersions2(driver_name, + dri_version, &dri_expected, + ddx_version, &ddx_expected, + drm_version, &drm_expected)) + return NULL; + + psp = __driUtilCreateNewScreen(dpy, scrn, psc, NULL, + ddx_version, dri_version, drm_version, + frame_buffer, pSAREA, fd, + internal_api_version, &driDriverAPI); + if (psp) { + VIADRIPtr dri_priv = (VIADRIPtr) psp->pDevPriv; + *driver_modes = viaFillInModes(psp, dri_priv->bytesPerPixel * 8, GL_TRUE); + + /* Calling driInitExtensions here, with a NULL context pointer, does not actually + * enable the extensions. It just makes sure that all the dispatch offsets for all + * the extensions that *might* be enables are known. This is needed because the + * dispatch offsets need to be known when _mesa_context_create is called, but we can't + * enable the extensions until we have a context pointer. + * + * Hello chicken. Hello egg. How are you two today? + */ + driInitExtensions( NULL, card_extensions, GL_FALSE ); + } + return (void *) psp; +} +#endif /* MESA_DRI_SCREENEXTENSION */ /** * Get information about previous buffer swaps. @@ -441,7 +569,12 @@ getSwapInfo( __DRIdrawablePrivate *dPriv, __DRIswapInfo * sInfo ) } const struct __DriverAPIRec driDriverAPI = { +#ifndef MESA_DRI_SCREEN_EXTENSION + .InitDriver = viaInitDriver, +#endif +#ifdef MESA_DRI2_INTERFACE .InitScreen = viaInitScreen, +#endif .DestroyScreen = viaDestroyScreen, .CreateContext = viaCreateContext, .DestroyContext = viaDestroyContext, @@ -451,7 +584,9 @@ const struct __DriverAPIRec driDriverAPI = { .MakeCurrent = viaMakeCurrent, .UnbindContext = viaUnbindContext, .GetSwapInfo = getSwapInfo, +#ifdef MESA_DRI_REWORKED_VBLANK .GetDrawableMSC = driDrawableGetMSC32, +#endif .WaitForMSC = driWaitForMSC32, .WaitForSBC = NULL, .SwapBuffersMSC = NULL diff --git a/dri/via_screen.h b/dri/via_screen.h index 6d20521..7c31607 100644 --- a/dri/via_screen.h +++ b/dri/via_screen.h @@ -43,7 +43,9 @@ typedef struct viaScreenPrivate { /* Configuration cache with default values for all contexts */ driOptionCache optionCache; +#ifdef MESA_DRI_SCREEN_EXTENSION const __DRIextension *extensions[5]; +#endif } viaScreenPrivate; diff --git a/dri/via_span.c b/dri/via_span.c index 566190d..2b7efa7 100644 --- a/dri/via_span.c +++ b/dri/via_span.c @@ -103,6 +103,7 @@ /* 32 bit depthbuffer functions. */ +#undef VALUE_TYPE #define VALUE_TYPE GLuint #define WRITE_DEPTH(_x, _y, d) \ diff --git a/dri/via_state.c b/dri/via_state.c index ca44dd1..65544b1 100644 --- a/dri/via_state.c +++ b/dri/via_state.c @@ -614,18 +614,34 @@ viaDrawBuffer(GLcontext *ctx, GLenum mode) if (!ctx->DrawBuffer) return; +#ifdef MESA_GL_FRAMEBUFFER_COLORDRAWBUFFERINDEXES if (ctx->DrawBuffer->_NumColorDrawBuffers != 1) { FALLBACK(vmesa, VIA_FALLBACK_DRAW_BUFFER, GL_TRUE); return; } +#endif - switch (ctx->DrawBuffer->_ColorDrawBufferIndexes[0]) { + switch ( +#ifdef MESA_GL_FRAMEBUFFER_COLORDRAWBUFFERINDEXES + ctx->DrawBuffer->_ColorDrawBufferIndexes[0] +#else + ctx->DrawBuffer->_ColorDrawBufferMask[0] +#endif + ) { +#ifdef MESA_GL_FRAMEBUFFER_COLORDRAWBUFFERINDEXES case BUFFER_FRONT_LEFT: +#else + case BUFFER_BIT_FRONT_LEFT: +#endif VIA_FLUSH_DMA(vmesa); vmesa->drawBuffer = &vmesa->front; FALLBACK(vmesa, VIA_FALLBACK_DRAW_BUFFER, GL_FALSE); break; +#ifdef MESA_GL_FRAMEBUFFER_COLORDRAWBUFFERINDEXES case BUFFER_BACK_LEFT: +#else + case BUFFER_BIT_BACK_LEFT: +#endif VIA_FLUSH_DMA(vmesa); vmesa->drawBuffer = &vmesa->back; FALLBACK(vmesa, VIA_FALLBACK_DRAW_BUFFER, GL_FALSE); |