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