diff options
Diffstat (limited to 'src/mesa/drivers')
156 files changed, 3075 insertions, 9178 deletions
diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c index b97b760f18..84a2a5fcb3 100644 --- a/src/mesa/drivers/common/meta.c +++ b/src/mesa/drivers/common/meta.c @@ -429,13 +429,15 @@ _mesa_meta_begin(GLcontext *ctx, GLbitfield state)     if (state & META_SHADER) {        if (ctx->Extensions.ARB_vertex_program) {           save->VertexProgramEnabled = ctx->VertexProgram.Enabled; -         save->VertexProgram = ctx->VertexProgram.Current; +         _mesa_reference_vertprog(ctx, &save->VertexProgram, +				  ctx->VertexProgram.Current);           _mesa_set_enable(ctx, GL_VERTEX_PROGRAM_ARB, GL_FALSE);        }        if (ctx->Extensions.ARB_fragment_program) {           save->FragmentProgramEnabled = ctx->FragmentProgram.Enabled; -         save->FragmentProgram = ctx->FragmentProgram.Current; +         _mesa_reference_fragprog(ctx, &save->FragmentProgram, +				  ctx->FragmentProgram.Current);           _mesa_set_enable(ctx, GL_FRAGMENT_PROGRAM_ARB, GL_FALSE);        } @@ -663,6 +665,7 @@ _mesa_meta_end(GLcontext *ctx)                            save->VertexProgramEnabled);           _mesa_reference_vertprog(ctx, &ctx->VertexProgram.Current,                                     save->VertexProgram); +	 _mesa_reference_vertprog(ctx, &save->VertexProgram, NULL);        }        if (ctx->Extensions.ARB_fragment_program) { @@ -670,6 +673,7 @@ _mesa_meta_end(GLcontext *ctx)                            save->FragmentProgramEnabled);           _mesa_reference_fragprog(ctx, &ctx->FragmentProgram.Current,                                    save->FragmentProgram); +	 _mesa_reference_fragprog(ctx, &save->FragmentProgram, NULL);        }        if (ctx->Extensions.ARB_shader_objects) { @@ -720,6 +724,7 @@ _mesa_meta_end(GLcontext *ctx)        for (tgt = 0; tgt < NUM_TEXTURE_TARGETS; tgt++) {           _mesa_reference_texobj(&ctx->Texture.Unit[0].CurrentTex[tgt],                                  save->CurrentTexture[tgt]); +         _mesa_reference_texobj(&save->CurrentTexture[tgt], NULL);        }        /* Re-enable textures, texgen */ @@ -2062,8 +2067,10 @@ _mesa_meta_Bitmap(GLcontext *ctx,     }     bitmap1 = _mesa_map_pbo_source(ctx, &unpackSave, bitmap1); -   if (!bitmap1) +   if (!bitmap1) { +      _mesa_meta_end(ctx);        return; +   }     bitmap8 = (GLubyte *) calloc(1, width * height);     if (bitmap8) { diff --git a/src/mesa/drivers/dri/Makefile.template b/src/mesa/drivers/dri/Makefile.template index a0c25d26cd..f19cc039b2 100644 --- a/src/mesa/drivers/dri/Makefile.template +++ b/src/mesa/drivers/dri/Makefile.template @@ -51,9 +51,12 @@ lib: symlinks subdirs depend  	@$(MAKE) $(LIBNAME) $(TOP)/$(LIB_DIR)/$(LIBNAME)  $(LIBNAME): $(OBJECTS) $(MESA_MODULES) $(EXTRA_MODULES) Makefile \ -		$(TOP)/src/mesa/drivers/dri/Makefile.template -	$(MKLIB) -o $@ -noprefix -linker '$(CC)' -ldflags '$(LDFLAGS)' \ +		$(TOP)/src/mesa/drivers/dri/Makefile.template $(TOP)/src/mesa/drivers/dri/common/dri_test.o +	$(MKLIB) -o $@.tmp -noprefix -linker '$(CC)' -ldflags '$(LDFLAGS)' \  		$(OBJECTS) $(MESA_MODULES) $(EXTRA_MODULES) $(DRI_LIB_DEPS) +	$(CC) -o $@.test $(TOP)/src/mesa/drivers/dri/common/dri_test.o $@.tmp $(DRI_LIB_DEPS) +	@rm -f $@.test +	mv -f $@.tmp $@  $(TOP)/$(LIB_DIR)/$(LIBNAME): $(LIBNAME) diff --git a/src/mesa/drivers/dri/common/dri_test.c b/src/mesa/drivers/dri/common/dri_test.c new file mode 100644 index 0000000000..793f0c37d7 --- /dev/null +++ b/src/mesa/drivers/dri/common/dri_test.c @@ -0,0 +1,89 @@ +#include "main/glheader.h" +#include "main/compiler.h" +#include "glapi/glapi.h" + +/* This is just supposed to make sure we get a reference to +   the driver entry symbol that the compiler doesn't optimize away */ + +extern char __driDriverExtensions[]; + +/* provide glapi symbols */ + +#if defined(GLX_USE_TLS) + +PUBLIC __thread struct _glapi_table * _glapi_tls_Dispatch +    __attribute__((tls_model("initial-exec"))); + +PUBLIC __thread void * _glapi_tls_Context +    __attribute__((tls_model("initial-exec"))); + +PUBLIC const struct _glapi_table *_glapi_Dispatch; +PUBLIC const void *_glapi_Context; + +#else + +PUBLIC struct _glapi_table *_glapi_Dispatch; +PUBLIC void *_glapi_Context; + +#endif + +PUBLIC void +_glapi_check_multithread(void) +{} + +PUBLIC void +_glapi_set_context(void *context) +{} + +PUBLIC void * +_glapi_get_context(void) +{ +	return 0; +} + +PUBLIC void +_glapi_set_dispatch(struct _glapi_table *dispatch) +{} + +PUBLIC struct _glapi_table * +_glapi_get_dispatch(void) +{ +	return 0; +} + +PUBLIC int +_glapi_add_dispatch( const char * const * function_names, +		     const char * parameter_signature ) +{ +	return 0; +} + +PUBLIC GLint +_glapi_get_proc_offset(const char *funcName) +{ +	return 0; +} + +PUBLIC _glapi_proc +_glapi_get_proc_address(const char *funcName) +{ +	return 0; +} + +PUBLIC GLuint +_glapi_get_dispatch_table_size(void) +{ +	return 0; +} + +PUBLIC unsigned long +_glthread_GetID(void) +{ +   return 0; +} + +int main(int argc, char** argv) +{ +   void* p = __driDriverExtensions; +   return (int)(unsigned long)p; +} diff --git a/src/mesa/drivers/dri/common/dri_util.c b/src/mesa/drivers/dri/common/dri_util.c index 75c98825b7..f1bbd38612 100644 --- a/src/mesa/drivers/dri/common/dri_util.c +++ b/src/mesa/drivers/dri/common/dri_util.c @@ -47,28 +47,6 @@ const __DRIextension driReadDrawableExtension = {      __DRI_READ_DRAWABLE, __DRI_READ_DRAWABLE_VERSION  }; -/** - * Print message to \c stderr if the \c LIBGL_DEBUG environment variable - * is set.  - *  - * Is called from the drivers. - *  - * \param f \c printf like format string. - */ -void -__driUtilMessage(const char *f, ...) -{ -    va_list args; - -    if (getenv("LIBGL_DEBUG")) { -        fprintf(stderr, "libGL: "); -        va_start(args, f); -        vfprintf(stderr, f, args); -        va_end(args); -        fprintf(stderr, "\n"); -    } -} -  GLint  driIntersectArea( drm_clip_rect_t rect1, drm_clip_rect_t rect2 )  { @@ -151,11 +129,6 @@ static int driUnbindContext(__DRIcontext *pcp)       */      pcp->driDrawablePriv = pcp->driReadablePriv = NULL; -#if 0 -    /* Unbind the drawable */ -    pdp->driContextPriv = &psp->dummyContextPriv; -#endif -      return GL_TRUE;  } @@ -455,7 +428,6 @@ driCreateNewDrawable(__DRIscreen *psp, const __DRIconfig *config,      pdp->vblFlags = 0;      pdp->driScreenPriv = psp; -    pdp->driContextPriv = &psp->dummyContextPriv;      if (!(*psp->DriverAPI.CreateBuffer)(psp, pdp, &config->modes,  					renderType == GLX_PIXMAP_BIT)) { @@ -589,17 +561,6 @@ driCreateNewContext(__DRIscreen *psp, const __DRIconfig *config,      pcp->dri2.draw_stamp = 0;      pcp->dri2.read_stamp = 0; -    /* When the first context is created for a screen, initialize a "dummy" -     * context. -     */ - -    if (!psp->dri2.enabled && !psp->dummyContextPriv.driScreenPriv) { -        psp->dummyContextPriv.hHWContext = psp->pSAREA->dummy_context; -        psp->dummyContextPriv.driScreenPriv = psp; -        psp->dummyContextPriv.driDrawablePriv = NULL; -        psp->dummyContextPriv.driverPrivate = NULL; -	/* No other fields should be used! */ -    }      pcp->hHWContext = hwContext; @@ -756,13 +717,6 @@ driCreateNewScreen(int scrn,      psp->myNum = scrn;      psp->dri2.enabled = GL_FALSE; -    /* -    ** Do not init dummy context here; actual initialization will be -    ** done when the first DRI context is created.  Init screen priv ptr -    ** to NULL to let CreateContext routine that it needs to be inited. -    */ -    psp->dummyContextPriv.driScreenPriv = NULL; -      psp->DriverAPI = driDriverAPI;      *driver_modes = driDriverAPI.InitScreen(psp); diff --git a/src/mesa/drivers/dri/common/dri_util.h b/src/mesa/drivers/dri/common/dri_util.h index 99c0f1e442..038a81604f 100644 --- a/src/mesa/drivers/dri/common/dri_util.h +++ b/src/mesa/drivers/dri/common/dri_util.h @@ -399,11 +399,6 @@ struct __DRIcontextRec {      void *driverPrivate;      /** -     * Pointer back to the \c __DRIcontext that contains this structure. -     */ -    __DRIcontext *pctx; - -    /**       * Pointer to drawable currently bound to this context for drawing.       */      __DRIdrawable *driDrawablePriv; @@ -511,29 +506,12 @@ struct __DRIscreenRec {      /*@}*/      /** -     * Dummy context to which drawables are bound when not bound to any -     * other context.  -     * -     * A dummy hHWContext is created for this context, and is used by the GL -     * core when a hardware lock is required but the drawable is not currently -     * bound (e.g., potentially during a SwapBuffers request).  The dummy -     * context is created when the first "real" context is created on this -     * screen. -     */ -    __DRIcontext dummyContextPriv; - -    /**       * Device-dependent private information (not stored in the SAREA).       *        * This pointer is never touched by the DRI layer.       */      void *private; -    /** -     * Pointer back to the \c __DRIscreen that contains this structure. -     */ -    __DRIscreen *psc; -      /* Extensions provided by the loader. */      const __DRIgetDrawableInfoExtension *getDrawableInfo;      const __DRIsystemTimeExtension *systemTime; @@ -552,10 +530,6 @@ struct __DRIscreenRec {  };  extern void -__driUtilMessage(const char *f, ...); - - -extern void  __driUtilUpdateDrawableInfo(__DRIdrawable *pdp);  extern float diff --git a/src/mesa/drivers/dri/common/drisw_util.c b/src/mesa/drivers/dri/common/drisw_util.c new file mode 100644 index 0000000000..8d08b93bfb --- /dev/null +++ b/src/mesa/drivers/dri/common/drisw_util.c @@ -0,0 +1,272 @@ +/* + * Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. + * All Rights Reserved. + * Copyright 2010 George Sapountzis <gsapountzis@gmail.com> + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/** + * \file drisw_util.c + * + * DRISW utility functions, i.e. dri_util.c stripped from drm-specific bits. + */ + +#include "drisw_util.h" +#include "utils.h" + + +/** + * Screen functions + */ + +static void +setupLoaderExtensions(__DRIscreen *psp, +		      const __DRIextension **extensions) +{ +    int i; + +    for (i = 0; extensions[i]; i++) { +	if (strcmp(extensions[i]->name, __DRI_SWRAST_LOADER) == 0) +	    psp->swrast_loader = (__DRIswrastLoaderExtension *) extensions[i]; +    } +} + +static __DRIscreen * +driCreateNewScreen(int scrn, const __DRIextension **extensions, +		   const __DRIconfig ***driver_configs, void *data) +{ +    static const __DRIextension *emptyExtensionList[] = { NULL }; +    __DRIscreen *psp; + +    (void) data; + +    psp = CALLOC_STRUCT(__DRIscreenRec); +    if (!psp) +	return NULL; + +    setupLoaderExtensions(psp, extensions); + +    psp->extensions = emptyExtensionList; +    psp->fd = -1; +    psp->myNum = scrn; + +    *driver_configs = driDriverAPI.InitScreen(psp); + +    if (*driver_configs == NULL) { +	FREE(psp); +	return NULL; +    } + +    return psp; +} + +static void driDestroyScreen(__DRIscreen *psp) +{ +    if (psp) { +	driDriverAPI.DestroyScreen(psp); + +	FREE(psp); +    } +} + +static const __DRIextension **driGetExtensions(__DRIscreen *psp) +{ +    return psp->extensions; +} + + +/** + * Context functions + */ + +static __DRIcontext * +driCreateNewContext(__DRIscreen *psp, const __DRIconfig *config, +		    __DRIcontext *shared, void *data) +{ +    __DRIcontext *pcp; +    void * const shareCtx = (shared != NULL) ? shared->driverPrivate : NULL; + +    pcp = CALLOC_STRUCT(__DRIcontextRec); +    if (!pcp) +	return NULL; + +    pcp->loaderPrivate = data; + +    pcp->driScreenPriv = psp; +    pcp->driDrawablePriv = NULL; +    pcp->driReadablePriv = NULL; + +    if (!driDriverAPI.CreateContext(&config->modes, pcp, shareCtx)) { +	FREE(pcp); +	return NULL; +    } + +    return pcp; +} + +static void +driDestroyContext(__DRIcontext *pcp) +{ +    if (pcp) { +	driDriverAPI.DestroyContext(pcp); +	FREE(pcp); +    } +} + +static int +driCopyContext(__DRIcontext *dst, __DRIcontext *src, unsigned long mask) +{ +    return GL_FALSE; +} + +static void dri_get_drawable(__DRIdrawable *pdp); +static void dri_put_drawable(__DRIdrawable *pdp); + +static int driBindContext(__DRIcontext *pcp, +			  __DRIdrawable *pdp, +			  __DRIdrawable *prp) +{ +    /* Bind the drawable to the context */ +    if (pcp) { +	pcp->driDrawablePriv = pdp; +	pcp->driReadablePriv = prp; +	if (pdp) { +	    pdp->driContextPriv = pcp; +	    dri_get_drawable(pdp); +	} +	if ( prp && pdp != prp ) { +	    dri_get_drawable(prp); +	} +    } + +    return driDriverAPI.MakeCurrent(pcp, pdp, prp); +} + +static int driUnbindContext(__DRIcontext *pcp) +{ +    __DRIdrawable *pdp; +    __DRIdrawable *prp; + +    if (pcp == NULL) +	return GL_FALSE; + +    pdp = pcp->driDrawablePriv; +    prp = pcp->driReadablePriv; + +    /* already unbound */ +    if (!pdp && !prp) +	return GL_TRUE; + +    driDriverAPI.UnbindContext(pcp); + +    dri_put_drawable(pdp); + +    if (prp != pdp) { +	dri_put_drawable(prp); +    } + +    pcp->driDrawablePriv = NULL; +    pcp->driReadablePriv = NULL; + +    return GL_TRUE; +} + + +/** + * Drawable functions + */ + +static void dri_get_drawable(__DRIdrawable *pdp) +{ +    pdp->refcount++; +} + +static void dri_put_drawable(__DRIdrawable *pdp) +{ +    if (pdp) { +	pdp->refcount--; +	if (pdp->refcount) +	    return; + +	driDriverAPI.DestroyBuffer(pdp); + +	FREE(pdp); +    } +} + +static __DRIdrawable * +driCreateNewDrawable(__DRIscreen *psp, +		     const __DRIconfig *config, void *data) +{ +    __DRIdrawable *pdp; + +    pdp = CALLOC_STRUCT(__DRIdrawableRec); +    if (!pdp) +	return NULL; + +    pdp->loaderPrivate = data; + +    pdp->driScreenPriv = psp; +    pdp->driContextPriv = NULL; + +    dri_get_drawable(pdp); + +    if (!driDriverAPI.CreateBuffer(psp, pdp, &config->modes, GL_FALSE)) { +	FREE(pdp); +	return NULL; +    } + +    pdp->lastStamp = 1; /* const */ + +    return pdp; +} + +static void +driDestroyDrawable(__DRIdrawable *pdp) +{ +    dri_put_drawable(pdp); +} + +static void driSwapBuffers(__DRIdrawable *pdp) +{ +    driDriverAPI.SwapBuffers(pdp); +} + +const __DRIcoreExtension driCoreExtension = { +    { __DRI_CORE, __DRI_CORE_VERSION }, +    NULL, /* driCreateNewScreen */ +    driDestroyScreen, +    driGetExtensions, +    driGetConfigAttrib, +    driIndexConfigAttrib, +    NULL, /* driCreateNewDrawable */ +    driDestroyDrawable, +    driSwapBuffers, +    driCreateNewContext, +    driCopyContext, +    driDestroyContext, +    driBindContext, +    driUnbindContext +}; + +const __DRIswrastExtension driSWRastExtension = { +    { __DRI_SWRAST, __DRI_SWRAST_VERSION }, +    driCreateNewScreen, +    driCreateNewDrawable +}; diff --git a/src/mesa/drivers/dri/common/drisw_util.h b/src/mesa/drivers/dri/common/drisw_util.h new file mode 100644 index 0000000000..08d5a116e9 --- /dev/null +++ b/src/mesa/drivers/dri/common/drisw_util.h @@ -0,0 +1,132 @@ +/* + * Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. + * All Rights Reserved. + * Copyright 2010 George Sapountzis <gsapountzis@gmail.com> + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/** + * @file + * Binding of the DRI interface (dri_interface.h) for DRISW. + * + * The DRISW structs are 'base classes' of the corresponding DRI1 / DRI2 (DRM) + * structs. The bindings for SW and DRM can be unified by making the DRM structs + * 'sub-classes' of the SW structs, either proper or with field re-ordering. + * + * The code can also be unified but that requires cluttering the common code + * with ifdef's and guarding with (__DRIscreen::fd >= 0) for DRM. + */ + +#ifndef _DRISW_UTIL_H +#define _DRISW_UTIL_H + +#include <GL/gl.h> +#include <GL/internal/glcore.h> +#include <GL/internal/dri_interface.h> +typedef struct _drmLock drmLock; + + +/** + * Extensions + */ +extern const __DRIcoreExtension driCoreExtension; +extern const __DRIswrastExtension driSWRastExtension; + + +/** + * Driver callback functions + */ +struct __DriverAPIRec { +    const __DRIconfig **(*InitScreen) (__DRIscreen * priv); + +    void (*DestroyScreen)(__DRIscreen *driScrnPriv); + +    GLboolean (*CreateContext)(const __GLcontextModes *glVis, +                               __DRIcontext *driContextPriv, +                               void *sharedContextPrivate); + +    void (*DestroyContext)(__DRIcontext *driContextPriv); + +    GLboolean (*CreateBuffer)(__DRIscreen *driScrnPriv, +                              __DRIdrawable *driDrawPriv, +                              const __GLcontextModes *glVis, +                              GLboolean pixmapBuffer); + +    void (*DestroyBuffer)(__DRIdrawable *driDrawPriv); + +    void (*SwapBuffers)(__DRIdrawable *driDrawPriv); + +    GLboolean (*MakeCurrent)(__DRIcontext *driContextPriv, +                             __DRIdrawable *driDrawPriv, +                             __DRIdrawable *driReadPriv); + +    GLboolean (*UnbindContext)(__DRIcontext *driContextPriv); +}; + +extern const struct __DriverAPIRec driDriverAPI; + + +/** + * Data types + */ +struct __DRIscreenRec { +    int myNum; + +    int fd; + +    void *private; + +    const __DRIextension **extensions; + +    const __DRIswrastLoaderExtension *swrast_loader; +}; + +struct __DRIcontextRec { + +    void *driverPrivate; + +    void *loaderPrivate; + +    __DRIdrawable *driDrawablePriv; + +    __DRIdrawable *driReadablePriv; + +    __DRIscreen *driScreenPriv; +}; + +struct __DRIdrawableRec { + +    void *driverPrivate; + +    void *loaderPrivate; + +    __DRIcontext *driContextPriv; + +    __DRIscreen *driScreenPriv; + +    int refcount; + +    /* gallium */ +    unsigned int lastStamp; + +    int w; +    int h; +}; + +#endif /* _DRISW_UTIL_H */ diff --git a/src/mesa/drivers/dri/common/utils.c b/src/mesa/drivers/dri/common/utils.c index b85b364c57..0dd879abc9 100644 --- a/src/mesa/drivers/dri/common/utils.c +++ b/src/mesa/drivers/dri/common/utils.c @@ -37,6 +37,29 @@  #include "utils.h" +/** + * Print message to \c stderr if the \c LIBGL_DEBUG environment variable + * is set.  + *  + * Is called from the drivers. + *  + * \param f \c printf like format string. + */ +void +__driUtilMessage(const char *f, ...) +{ +    va_list args; + +    if (getenv("LIBGL_DEBUG")) { +        fprintf(stderr, "libGL: "); +        va_start(args, f); +        vfprintf(stderr, f, args); +        va_end(args); +        fprintf(stderr, "\n"); +    } +} + +  unsigned  driParseDebugString( const char * debug,   		     const struct dri_debug_control * control  ) @@ -230,9 +253,6 @@ void driInitSingleExtension( GLcontext * ctx,  /**   * Utility function used by drivers to test the verions of other components.   * - * If one of the version requirements is not met, a message is logged using - * \c __driUtilMessage. - *   * \param driver_name  Name of the driver.  Used in error messages.   * \param driActual    Actual DRI version supplied __driCreateNewScreen.   * \param driExpected  Minimum DRI version required by the driver. @@ -244,7 +264,7 @@ void driInitSingleExtension( GLcontext * ctx,   * \returns \c GL_TRUE if all version requirements are met.  Otherwise,   *          \c GL_FALSE is returned.   *  - * \sa __driCreateNewScreen, driCheckDriDdxDrmVersions2, __driUtilMessage + * \sa __driCreateNewScreen, driCheckDriDdxDrmVersions2   *   * \todo   * Now that the old \c driCheckDriDdxDrmVersions function is gone, this diff --git a/src/mesa/drivers/dri/common/utils.h b/src/mesa/drivers/dri/common/utils.h index 02ca3feb73..de6070c398 100644 --- a/src/mesa/drivers/dri/common/utils.h +++ b/src/mesa/drivers/dri/common/utils.h @@ -69,6 +69,9 @@ struct __DRIutilversionRec2 {      int    patch;        /**< Patch-level. */  }; +extern void +__driUtilMessage(const char *f, ...); +  extern unsigned driParseDebugString( const char * debug,      const struct dri_debug_control * control ); diff --git a/src/mesa/drivers/dri/common/xmlconfig.c b/src/mesa/drivers/dri/common/xmlconfig.c index 477259ea7e..de4500a39b 100644 --- a/src/mesa/drivers/dri/common/xmlconfig.c +++ b/src/mesa/drivers/dri/common/xmlconfig.c @@ -36,7 +36,7 @@  #include <unistd.h>  #include <errno.h>  #include "main/imports.h" -#include "dri_util.h" +#include "utils.h"  #include "xmlconfig.h"  #undef GET_PROGRAM_NAME diff --git a/src/mesa/drivers/dri/i810/Makefile b/src/mesa/drivers/dri/i810/Makefile index 3874faee51..54a837d5ea 100644 --- a/src/mesa/drivers/dri/i810/Makefile +++ b/src/mesa/drivers/dri/i810/Makefile @@ -5,9 +5,6 @@ include $(TOP)/configs/current  LIBNAME = i810_dri.so -# Not yet -# MINIGLX_SOURCES = server/i810_dri.c  -  DRIVER_SOURCES = \  	i810context.c \  	i810ioctl.c \ diff --git a/src/mesa/drivers/dri/i810/server/i810_dri.c b/src/mesa/drivers/dri/i810/server/i810_dri.c deleted file mode 100644 index f52797c5ed..0000000000 --- a/src/mesa/drivers/dri/i810/server/i810_dri.c +++ /dev/null @@ -1,975 +0,0 @@ -/** - * \file server/i810_dri.c - * \brief File to perform the device-specific initialization tasks typically - * done in the X server. - * - * Here they are converted to run in the client (or perhaps a standalone - * process), and to work with the frame buffer device rather than the X - * server infrastructure. - *  - * Copyright (C) 2004 Dave Airlie (airlied@linux.ie) - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <errno.h> -#include <unistd.h> - -#include "driver.h" -#include "drm.h" - -#include "i810.h" -#include "i810_dri.h" -#include "i810_reg.h" - - -static int i810_pitches[] = { -   512, -   1024, -   2048, -   4096, -   0 -}; - -static int i810_pitch_flags[] = { -   0x0, -   0x1, -   0x2, -   0x3, -   0 -}; - -static unsigned int i810_drm_version = 0; - -static int -I810AllocLow(I810MemRange * result, I810MemRange * pool, int size) -{ -   if (size > pool->Size) -      return 0; - -   pool->Size -= size; -   result->Size = size; -   result->Start = pool->Start; -   result->End = pool->Start += size; - -   return 1; -} - -static int -I810AllocHigh(I810MemRange * result, I810MemRange * pool, int size) -{ -   if (size > pool->Size) -      return 0; - -   pool->Size -= size; -   result->Size = size; -   result->End = pool->End; -   result->Start = pool->End -= size; - -   return 1; -} - - -/** - * \brief Wait for free FIFO entries. - * - * \param ctx display handle. - * \param entries number of free entries to wait. - * - * It polls the free entries from the chip until it reaches the requested value - * or a timeout (3000 tries) occurs. Aborts the program if the FIFO times out. - */ -static void I810WaitForFifo( const DRIDriverContext *ctx, -			       int entries ) -{ -} - -/** - * \brief Reset graphics card to known state. - * - * \param ctx display handle. - * - * Resets the values of several I810 registers. - */ -static void I810EngineReset( const DRIDriverContext *ctx ) -{ -   unsigned char *I810MMIO = ctx->MMIOAddress; -} - -/** - * \brief Restore the drawing engine. - * - * \param ctx display handle - * - * Resets the graphics card and sets initial values for several registers of - * the card's drawing engine. - * - * Turns on the i810 command processor engine (i.e., the ringbuffer). - */ -static int I810EngineRestore( const DRIDriverContext *ctx ) -{ -   I810Ptr info = ctx->driverPrivate; -   unsigned char *I810MMIO = ctx->MMIOAddress; - -   fprintf(stderr, "%s\n", __FUNCTION__); - -   return 1; -} - - -/** - * \brief Shutdown the drawing engine. - * - * \param ctx display handle - * - * Turns off the command processor engine & restores the graphics card - * to a state that fbdev understands. - */ -static int I810EngineShutdown( const DRIDriverContext *ctx ) -{ -  drmI810Init info; -  int ret; - -  memset(&info, 0, sizeof(drmI810Init)); -  info.func = I810_CLEANUP_DMA; -   -  ret = drmCommandWrite(ctx->drmFD, DRM_I810_INIT, &info, sizeof(drmI810Init)); -  if (ret>0) -  { -    fprintf(stderr,"[dri] I810 DMA Cleanup failed\n"); -    return -errno; -  } -  return 0; -} - -/** - * \brief Compute base 2 logarithm. - * - * \param val value. - *  - * \return base 2 logarithm of \p val. - */ -static int I810MinBits(int val) -{ -   int  bits; - -   if (!val) return 1; -   for (bits = 0; val; val >>= 1, ++bits); -   return bits; -} - -static int I810DRIAgpPreInit( const DRIDriverContext *ctx, I810Ptr info) -{ - -  if (drmAgpAcquire(ctx->drmFD) < 0) { -    fprintf(stderr, "[gart] AGP not available\n"); -    return 0; -  } -   -   -  if (drmAgpEnable(ctx->drmFD, 0) < 0) { -    fprintf(stderr, "[gart] AGP not enabled\n"); -    drmAgpRelease(ctx->drmFD); -    return 0; -  } -} - -/** - * \brief Initialize the AGP state - * - * \param ctx display handle. - * \param info driver private data. - * - * \return one on success, or zero on failure. - *  - * Acquires and enables the AGP device. Reserves memory in the AGP space for - * the ring buffer, vertex buffers and textures. Initialize the I810 - * registers to point to that memory and add client mappings. - */ -static int I810DRIAgpInit( const DRIDriverContext *ctx, I810Ptr info) -{ -   unsigned char *I810MMIO = ctx->MMIOAddress; -   int            ret; -   int            s, l; -   unsigned long dcacheHandle; -   unsigned long agpHandle; -   int pitch_idx = 0; -   int back_size = 0; -   int sysmem_size = 0; -   int width = ctx->shared.virtualWidth * ctx->cpp; - - -   info->backHandle = DRM_AGP_NO_HANDLE; -   info->zHandle = DRM_AGP_NO_HANDLE; -   info->sysmemHandle = DRM_AGP_NO_HANDLE; -   info->dcacheHandle = DRM_AGP_NO_HANDLE; - -   memset(&info->DcacheMem, 0, sizeof(I810MemRange)); -   memset(&info->BackBuffer, 0, sizeof(I810MemRange)); -   memset(&info->DepthBuffer, 0, sizeof(I810MemRange)); -    -   drmAgpAlloc(ctx->drmFD, 4096 * 1024, 1, NULL, &dcacheHandle); -   info->dcacheHandle = dcacheHandle; -    -   fprintf(stderr, "[agp] dcacheHandle : 0x%x\n", dcacheHandle); - -#define Elements(x) sizeof(x)/sizeof(*x) -   for (pitch_idx = 0; pitch_idx < Elements(i810_pitches); pitch_idx++) -     if (width <= i810_pitches[pitch_idx]) -       break; -    -   if (pitch_idx == Elements(i810_pitches)) { -     fprintf(stderr,"[dri] Couldn't find depth/back buffer pitch\n"); -     exit(-1); -   } -   else -   { -     int lines = (ctx->shared.virtualWidth + 15) / 16 * 16; -     back_size = i810_pitches[pitch_idx] * lines; -     back_size = ((back_size + 4096 - 1) / 4096) * 4096; -   } - -   sysmem_size = ctx->shared.fbSize; -   fprintf(stderr,"sysmem_size is %lu back_size is %lu\n", sysmem_size, back_size); -   if (dcacheHandle != DRM_AGP_NO_HANDLE) { -     if (back_size > 4 * 1024 * 1024) { -       fprintf(stderr,"[dri] Backsize is larger then 4 meg\n"); -       sysmem_size = sysmem_size - 2 * back_size; -       drmAgpFree(ctx->drmFD, dcacheHandle); -       info->dcacheHandle = dcacheHandle = DRM_AGP_NO_HANDLE; -     } else { -       sysmem_size = sysmem_size - back_size; -     } -   } else { -     sysmem_size = sysmem_size - 2 * back_size; -   } -    -   info->SysMem.Start=0; -   info->SysMem.Size = sysmem_size; -   info->SysMem.End = sysmem_size; -    -   if (dcacheHandle != DRM_AGP_NO_HANDLE) { -      if (drmAgpBind(ctx->drmFD, dcacheHandle, info->DepthOffset) == 0) { -	memset(&info->DcacheMem, 0, sizeof(I810MemRange)); -	fprintf(stderr,"[agp] GART: Found 4096K Z buffer memory\n"); -	info->DcacheMem.Start = info->DepthOffset; -	 info->DcacheMem.Size = 1024 * 4096; -	 info->DcacheMem.End =  info->DcacheMem.Start + info->DcacheMem.Size; -      } else { -	fprintf(stderr, "[agp] GART: dcache bind failed\n"); -	drmAgpFree(ctx->drmFD, dcacheHandle); -	info->dcacheHandle = dcacheHandle = DRM_AGP_NO_HANDLE; -      } -   } else { -     fprintf(stderr, "[agp] GART: no dcache memory found\n"); -   } -    -   drmAgpAlloc(ctx->drmFD, back_size, 0, NULL, &agpHandle); -   info->backHandle = agpHandle; - -   if (agpHandle != DRM_AGP_NO_HANDLE) { -      if (drmAgpBind(ctx->drmFD, agpHandle, info->BackOffset) == 0) { -	fprintf(stderr, "[agp] Bound backbuffer memory\n"); - -	info->BackBuffer.Start = info->BackOffset; -	info->BackBuffer.Size = back_size; -	info->BackBuffer.End = (info->BackBuffer.Start + -				 info->BackBuffer.Size); -      } else { -	fprintf(stderr,"[agp] Unable to bind backbuffer.  Disabling DRI.\n"); -	return 0; -      } -   } else { -     fprintf(stderr, "[dri] Unable to allocate backbuffer memory.  Disabling DRI.\n"); -     return 0; -   } - -   if (dcacheHandle == DRM_AGP_NO_HANDLE) { -     drmAgpAlloc(ctx->drmFD, back_size, 0, NULL, &agpHandle); - -     info->zHandle = agpHandle; - -     if (agpHandle != DRM_AGP_NO_HANDLE) { -       if (drmAgpBind(ctx->drmFD, agpHandle, info->DepthOffset) == 0) { -	 fprintf(stderr,"[agp] Bound depthbuffer memory\n"); -	 info->DepthBuffer.Start = info->DepthOffset; -	 info->DepthBuffer.Size = back_size; -	 info->DepthBuffer.End = (info->DepthBuffer.Start + -				   info->DepthBuffer.Size); -       } else { -	 fprintf(stderr,"[agp] Unable to bind depthbuffer.  Disabling DRI.\n"); -	 return 0; -       } -     } else { -       fprintf(stderr,"[agp] Unable to allocate depthbuffer memory.  Disabling DRI.\n"); -       return 0; -     } -   } - -   /* Now allocate and bind the agp space.  This memory will include the -    * regular framebuffer as well as texture memory. -    */ -   drmAgpAlloc(ctx->drmFD, sysmem_size, 0, NULL, &agpHandle); -   info->sysmemHandle = agpHandle; -    -   if (agpHandle != DRM_AGP_NO_HANDLE) { -     if (drmAgpBind(ctx->drmFD, agpHandle, 0) == 0) { -       fprintf(stderr, "[agp] Bound System Texture Memory\n"); -     } else { -       fprintf(stderr, "[agp] Unable to bind system texture memory. Disabling DRI.\n"); -       return 0; -     } -   } else { -     fprintf(stderr, "[agp] Unable to allocate system texture memory. Disabling DRI.\n"); -     return 0; -   } -    -   info->auxPitch = i810_pitches[pitch_idx]; -   info->auxPitchBits = i810_pitch_flags[pitch_idx]; -    -   return 1; -} - - -/** - * \brief Initialize the kernel data structures and enable the CP engine. - * - * \param ctx display handle. - * \param info driver private data. - * - * \return non-zero on success, or zero on failure. - * - * This function is a wrapper around the DRM_I810_CP_INIT command, passing - * all the parameters in a drmI810Init structure. - */ -static int I810DRIKernelInit( const DRIDriverContext *ctx, -			       I810Ptr info) -{ -   int cpp = ctx->bpp / 8; -   drmI810Init  drmInfo; -   int ret; -   I810RingBuffer *ring = &(info->LpRing); - -   /* This is the struct passed to the kernel module for its initialization */ -   memset(&drmInfo, 0, sizeof(drmI810Init)); -    -   /* make sure we have at least 1.4 */ -   drmInfo.func             = I810_INIT_DMA_1_4; - -   drmInfo.ring_start = ring->mem.Start; -   drmInfo.ring_end = ring->mem.End; -   drmInfo.ring_size = ring->mem.Size; - -   drmInfo.mmio_offset         = (unsigned int)info->regs; -   drmInfo.buffers_offset      = (unsigned int)info->buffer_map; -   drmInfo.sarea_priv_offset   = sizeof(drm_sarea_t); - -   drmInfo.front_offset        = 0; -   drmInfo.back_offset         = info->BackBuffer.Start; -   drmInfo.depth_offset        = info->DepthBuffer.Start; - -   drmInfo.w                   = ctx->shared.virtualWidth; -   drmInfo.h                   = ctx->shared.virtualHeight; -   drmInfo.pitch               = info->auxPitch; -   drmInfo.pitch_bits          = info->auxPitchBits; -    - -   ret = drmCommandWrite(ctx->drmFD, DRM_I810_INIT, &drmInfo,  -			 sizeof(drmI810Init)); - -   return ret >= 0; -} - - -/** - * \brief Add a map for the vertex buffers that will be accessed by any - * DRI-based clients. - *  - * \param ctx display handle. - * \param info driver private data. - * - * \return one on success, or zero on failure. - * - * Calls drmAddBufs() with the previously allocated vertex buffers. - */ -static int I810DRIBufInit( const DRIDriverContext *ctx, I810Ptr info ) -{ -   /* Initialize vertex buffers */ -   info->bufNumBufs = drmAddBufs(ctx->drmFD, -				 I810_DMA_BUF_NR, -				 I810_DMA_BUF_SZ, -				 DRM_AGP_BUFFER, -				 info->BufferMem.Start); - -   if (info->bufNumBufs <= 0) { -      fprintf(stderr, -	      "[drm] Could not create vertex/indirect buffers list\n"); -      return 0; -   } -   fprintf(stderr, -	   "[drm] Added %d %d byte vertex/indirect buffers\n", -	   info->bufNumBufs, I810_DMA_BUF_SZ); -    -   return 1; -} - -/** - * \brief Install an IRQ handler. - *  - * \param ctx display handle. - * \param info driver private data. - * - * Attempts to install an IRQ handler via drmCtlInstHandler(), falling back to - * IRQ-free operation on failure. - */ -static void I810DRIIrqInit(const DRIDriverContext *ctx, -			     I810Ptr info) -{ -   if (!info->irq) { -      info->irq = drmGetInterruptFromBusID(ctx->drmFD, -					   ctx->pciBus, -					   ctx->pciDevice, -					   ctx->pciFunc); - -      if ((drmCtlInstHandler(ctx->drmFD, info->irq)) != 0) { -	 fprintf(stderr, -		 "[drm] failure adding irq handler, " -		 "there is a device already using that irq\n" -		 "[drm] falling back to irq-free operation\n"); -	 info->irq = 0; -      } -   } - -   if (info->irq) -      fprintf(stderr, -	      "[drm] dma control initialized, using IRQ %d\n", -	      info->irq); -} - -static int I810CheckDRMVersion( const DRIDriverContext *ctx, -				  I810Ptr info ) -{ -   drmVersionPtr  version; - -   version = drmGetVersion(ctx->drmFD); -   if (version) { -      int req_minor, req_patch; - -      req_minor = 4; -      req_patch = 0;	 - -      i810_drm_version = (version->version_major<<16) | version->version_minor; -      if (version->version_major != 1 || -	  version->version_minor < req_minor || -	  (version->version_minor == req_minor &&  -	   version->version_patchlevel < req_patch)) { -	 /* Incompatible drm version */ -	 fprintf(stderr, -		 "[dri] I810DRIScreenInit failed because of a version " -		 "mismatch.\n" -		 "[dri] i810.o kernel module version is %d.%d.%d " -		 "but version 1.%d.%d or newer is needed.\n" -		 "[dri] Disabling DRI.\n", -		 version->version_major, -		 version->version_minor, -		 version->version_patchlevel, -		 req_minor, -		 req_patch); -	 drmFreeVersion(version); -	 return 0; -      } - -      info->drmMinor = version->version_minor; -      drmFreeVersion(version); -   } - -   return 1; -} - -static int I810MemoryInit( const DRIDriverContext *ctx, I810Ptr info ) -{ -   int        width_bytes = ctx->shared.virtualWidth * ctx->cpp; -   int        cpp         = ctx->cpp; -   int        bufferSize  = (ctx->shared.virtualHeight * width_bytes); -   int        depthSize   = (((ctx->shared.virtualHeight+15) & ~15) * width_bytes); -   int        l; - -   if (drmAddMap(ctx->drmFD, (drm_handle_t) info->BackBuffer.Start, -		 info->BackBuffer.Size, DRM_AGP, 0, -		 &info->backbuffer) < 0) { -     fprintf(stderr, "[drm] drmAddMap(backbuffer) failed.  Disabling DRI\n"); -     return 0; -   } -    -   if (drmAddMap(ctx->drmFD, (drm_handle_t) info->DepthBuffer.Start, -		 info->DepthBuffer.Size, DRM_AGP, 0, -		 &info->depthbuffer) < 0) { -     fprintf(stderr, "[drm] drmAddMap(depthbuffer) failed.  Disabling DRI.\n"); -      return 0; -   } - -   if (!I810AllocLow(&(info->FrontBuffer), &(info->SysMem), (((ctx->shared.virtualHeight * width_bytes) + 4095) & ~4095))) -   { -     fprintf(stderr,"Framebuffer allocation failed\n"); -     return 0; -   } -   else -     fprintf(stderr,"Frame buffer at 0x%.8x (%luk, %lu bytes)\n", -	     info->FrontBuffer.Start, -	     info->FrontBuffer.Size / 1024, info->FrontBuffer.Size); -    -   memset(&(info->LpRing), 0, sizeof(I810RingBuffer)); -   if (I810AllocLow(&(info->LpRing.mem), &(info->SysMem), 16 * 4096)) { -     fprintf(stderr, -	    "Ring buffer at 0x%.8x (%luk, %lu bytes)\n", -	     info->LpRing.mem.Start, -	     info->LpRing.mem.Size / 1024, info->LpRing.mem.Size); -      -     info->LpRing.tail_mask = info->LpRing.mem.Size - 1; -     info->LpRing.virtual_start = info->LpRing.mem.Start; -     info->LpRing.head = 0; -     info->LpRing.tail = 0; -     info->LpRing.space = 0; -   } else { -     fprintf(stderr, "Ring buffer allocation failed\n"); -     return (0); -   } - -   /* Allocate buffer memory */ -   I810AllocHigh(&(info->BufferMem), &(info->SysMem), -		 I810_DMA_BUF_NR * I810_DMA_BUF_SZ); -    - -   fprintf(stderr, "[dri] Buffer map : %lx\n", -	      info->BufferMem.Start); - -   if (info->BufferMem.Start == 0 || -       info->BufferMem.End - info->BufferMem.Start > -       I810_DMA_BUF_NR * I810_DMA_BUF_SZ) { -     fprintf(stderr,"[dri] Not enough memory for dma buffers.  Disabling DRI.\n"); -     return 0; -   } - -   if (drmAddMap(ctx->drmFD, (drm_handle_t) info->BufferMem.Start, -		 info->BufferMem.Size, DRM_AGP, 0, &info->buffer_map) < 0) { -     fprintf(stderr, "[drm] drmAddMap(buffer_map) failed.  Disabling DRI.\n"); -     return 0; -   } - -   if (drmAddMap(ctx->drmFD, (drm_handle_t) info->LpRing.mem.Start, -		 info->LpRing.mem.Size, DRM_AGP, 0, &info->ring_map) < 0) { -     fprintf(stderr, "[drm] drmAddMap(ring_map) failed.  Disabling DRI. \n"); -     return 0; -   } - -   /* Front, back and depth buffers - everything else texture?? -    */ -   info->textureSize = info->SysMem.Size; - -   if (info->textureSize < 0)  -      return 0; - -    -   l = I810MinBits((info->textureSize-1) / I810_NR_TEX_REGIONS); -   if (l < I810_LOG_MIN_TEX_REGION_SIZE) l = I810_LOG_MIN_TEX_REGION_SIZE; - -   /* Round the texture size up to the nearest whole number of -    * texture regions.  Again, be greedy about this, don't -    * round down. -    */ -   info->logTextureGranularity = l; -   info->textureSize = (info->textureSize >> l) << l; - -   /* Set a minimum usable local texture heap size.  This will fit -    * two 256x256x32bpp textures. -    */ -   if (info->textureSize < 512 * 1024) { -      info->textureOffset = 0; -      info->textureSize = 0; -   } - -   I810AllocLow(&(info->TexMem), &(info->SysMem), info->textureSize); - -   if (drmAddMap(ctx->drmFD, (drm_handle_t) info->TexMem.Start, -		 info->TexMem.Size, DRM_AGP, 0, &info->textures) < 0) { -     fprintf(stderr, -		 "[drm] drmAddMap(textures) failed.  Disabling DRI.\n"); -      return 0; -   } - -   /* Reserve space for textures */ -   fprintf(stderr,  -	   "Will use back buffer at offset 0x%x\n", -	   info->BackOffset); -   fprintf(stderr,  -	   "Will use depth buffer at offset 0x%x\n", -	   info->DepthOffset); -   fprintf(stderr,  -	   "Will use %d kb for textures at offset 0x%x\n", -	   info->TexMem.Size/1024, info->TexMem.Start); - -   return 1; -}  - - - -/** - * Called at the start of each server generation. - * - * \param ctx display handle. - * \param info driver private data. - * - * \return non-zero on success, or zero on failure. - * - * Performs static frame buffer allocation. Opens the DRM device and add maps - * to the SAREA, framebuffer and MMIO regions. Fills in \p info with more - * information. Creates a \e server context to grab the lock for the - * initialization ioctls and calls the other initilization functions in this - * file. Starts the CP engine via the DRM_I810_CP_START command. - * - * Setups a I810DRIRec structure to be passed to i810_dri.so for its - * initialization. - */ -static int I810ScreenInit( DRIDriverContext *ctx, I810Ptr info ) -{ -   I810DRIPtr   pI810DRI; -   int err; - -   usleep(100); -   /*assert(!ctx->IsClient);*/ - -   /* from XFree86 driver */ -   info->DepthOffset = 0x3000000; -   info->BackOffset = 0x3800000; -   { -      int  width_bytes = (ctx->shared.virtualWidth * ctx->cpp); -      int  maxy        = ctx->shared.fbSize / width_bytes; - - -      if (maxy <= ctx->shared.virtualHeight * 3) { -	 fprintf(stderr,  -		 "Static buffer allocation failed -- " -		 "need at least %d kB video memory (have %d kB)\n", -		 (ctx->shared.virtualWidth * ctx->shared.virtualHeight * -		  ctx->cpp * 3 + 1023) / 1024, -		 ctx->shared.fbSize / 1024); -	 return 0; -      }  -   } - - -   info->regsSize = ctx->MMIOSize; -   ctx->shared.SAREASize = 0x2000; - -   /* Note that drmOpen will try to load the kernel module, if needed. */ -   ctx->drmFD = drmOpen("i810", NULL ); -   if (ctx->drmFD < 0) { -      fprintf(stderr, "[drm] drmOpen failed\n"); -      return 0; -   } - -   if ((err = drmSetBusid(ctx->drmFD, ctx->pciBusID)) < 0) { -      fprintf(stderr, "[drm] drmSetBusid failed (%d, %s), %s\n", -	      ctx->drmFD, ctx->pciBusID, strerror(-err)); -      return 0; -   } - -   if (drmAddMap( ctx->drmFD, -		  0, -		  ctx->shared.SAREASize, -		  DRM_SHM, -		  DRM_CONTAINS_LOCK, -		  &ctx->shared.hSAREA) < 0) -   { -      fprintf(stderr, "[drm] drmAddMap failed\n"); -      return 0; -   } -   fprintf(stderr, "[drm] added %d byte SAREA at 0x%08lx\n", -	   ctx->shared.SAREASize, ctx->shared.hSAREA); - -   if (drmMap( ctx->drmFD, -	       ctx->shared.hSAREA, -	       ctx->shared.SAREASize, -	       (drmAddressPtr)(&ctx->pSAREA)) < 0) -   { -      fprintf(stderr, "[drm] drmMap failed\n"); -      return 0; -   } -   memset(ctx->pSAREA, 0, ctx->shared.SAREASize); -   fprintf(stderr, "[drm] mapped SAREA 0x%08lx to %p, size %d\n", -	   ctx->shared.hSAREA, ctx->pSAREA, ctx->shared.SAREASize); - -   if (drmAddMap(ctx->drmFD,  -		 ctx->MMIOStart, -		 ctx->MMIOSize, -		 DRM_REGISTERS,  -		 DRM_READ_ONLY,  -		 &info->regs) < 0) { -      fprintf(stderr, "[drm] drmAddMap mmio failed\n");	 -      return 0; -   } -   fprintf(stderr, -	   "[drm] register handle = 0x%08x\n", info->regs); - -   I810DRIAgpPreInit(ctx, info); -   /* Need to AddMap the framebuffer and mmio regions here: -    */ -   if (drmAddMap( ctx->drmFD, -		  (drm_handle_t)ctx->FBStart, -		  ctx->FBSize, -		  DRM_FRAME_BUFFER, -#ifndef _EMBEDDED -		  0, -#else -		  DRM_READ_ONLY, -#endif -		  &ctx->shared.hFrameBuffer) < 0) -   { -      fprintf(stderr, "[drm] drmAddMap framebuffer failed\n"); -      return 0; -   } - -   fprintf(stderr, "[drm] framebuffer handle = 0x%08lx\n", -	   ctx->shared.hFrameBuffer); - -   /* Check the i810 DRM version */ -   if (!I810CheckDRMVersion(ctx, info)) { -      return 0; -   } - -   /* Initialize AGP */ -   if (!I810DRIAgpInit(ctx, info)) { -      return 0; -   } - - -   /* Memory manager setup */ -   if (!I810MemoryInit(ctx, info)) { -      return 0; -   } - -   /* Initialize the SAREA private data structure */ -   { -      I810SAREAPtr pSAREAPriv; -      pSAREAPriv = (I810SAREAPtr)(((char*)ctx->pSAREA) +  -					sizeof(drm_sarea_t)); -      memset(pSAREAPriv, 0, sizeof(*pSAREAPriv)); -      //      pSAREAPriv->pf_enabled=1; -   } - - -   /* Create a 'server' context so we can grab the lock for -    * initialization ioctls. -    */ -   if ((err = drmCreateContext(ctx->drmFD, &ctx->serverContext)) != 0) { -      fprintf(stderr, "%s: drmCreateContext failed %d\n", __FUNCTION__, err); -      return 0; -   } - -   DRM_LOCK(ctx->drmFD, ctx->pSAREA, ctx->serverContext, 0);  - -   /* Initialize the vertex buffers list */ -   if (!I810DRIBufInit(ctx, info)) { -      fprintf(stderr, "I810DRIBufInit failed\n"); -      DRM_UNLOCK(ctx->drmFD, ctx->pSAREA, ctx->serverContext); -      return 0; -   } - -   /* Initialize the kernel data structures */ -   if (!I810DRIKernelInit(ctx, info)) { -      fprintf(stderr, "I810DRIKernelInit failed\n"); -      DRM_UNLOCK(ctx->drmFD, ctx->pSAREA, ctx->serverContext); -      return 0; -   } - -   /* Initialize IRQ */ -   I810DRIIrqInit(ctx, info); - -   /* Quick hack to clear the front & back buffers.  Could also use -    * the clear ioctl to do this, but would need to setup hw state -    * first. -    */ -#if 0 -   memset((char *)ctx->FBAddress, -	  0, -	  info->auxPitch * ctx->cpp * ctx->shared.virtualHeight ); - -   memset((char *)info->backbuffer, -	  0, -	  info->auxPitch * ctx->cpp * ctx->shared.virtualHeight ); -#endif - -   /* This is the struct passed to i810_dri.so for its initialization */ -   ctx->driverClientMsg = malloc(sizeof(I810DRIRec)); -   ctx->driverClientMsgSize = sizeof(I810DRIRec); -   pI810DRI                    = (I810DRIPtr)ctx->driverClientMsg; - -   pI810DRI->regs              = info->regs; -   pI810DRI->regsSize          = info->regsSize; -   // regsMap is unused - -   pI810DRI->backbufferSize    = info->BackBuffer.Size; -   pI810DRI->backbuffer        = info->backbuffer; - -   pI810DRI->depthbufferSize   = info->DepthBuffer.Size; -   pI810DRI->depthbuffer       = info->depthbuffer; - -   pI810DRI->textures          = info->textures; -   pI810DRI->textureSize       = info->textureSize; - -   pI810DRI->agp_buffers       = info->buffer_map; -   pI810DRI->agp_buf_size      = info->BufferMem.Size; - -   pI810DRI->deviceID          = info->Chipset; -   pI810DRI->width             = ctx->shared.virtualWidth; -   pI810DRI->height            = ctx->shared.virtualHeight; -   pI810DRI->mem               = ctx->shared.fbSize; -   pI810DRI->cpp               = ctx->bpp / 8; -   pI810DRI->bitsPerPixel      = ctx->bpp; -   pI810DRI->fbOffset          = info->FrontBuffer.Start; -   pI810DRI->fbStride          = info->auxPitch; -    -   pI810DRI->backOffset        = info->BackBuffer.Start; -   pI810DRI->depthOffset       = info->DepthBuffer.Start; - -   pI810DRI->auxPitch          = info->auxPitch; -   pI810DRI->auxPitchBits      = info->auxPitchBits; - -   pI810DRI->logTextureGranularity = info->logTextureGranularity; -   pI810DRI->textureOffset     = info->TexMem.Start; -   -   pI810DRI->ringOffset        = info->LpRing.mem.Start; -   pI810DRI->ringSize          = info->LpRing.mem.Size; - -   // drmBufs looks unused  -   pI810DRI->irq               = info->irq; -   pI810DRI->sarea_priv_offset = sizeof(drm_sarea_t); - -   /* Don't release the lock now - let the VT switch handler do it. */ -   return 1; -} - - -/** - * \brief Validate the fbdev mode. - *  - * \param ctx display handle. - * - * \return one on success, or zero on failure. - * - * Saves some registers and returns 1. - * - * \sa i810ValidateMode(). - */ -static int i810ValidateMode( const DRIDriverContext *ctx ) -{ -   unsigned char *I810MMIO = ctx->MMIOAddress; -   I810Ptr info = ctx->driverPrivate; - -   return 1; -} - - -/** - * \brief Examine mode returned by fbdev. - *  - * \param ctx display handle. - * - * \return one on success, or zero on failure. - * - * Restores registers that fbdev has clobbered and returns 1. - * - * \sa i810ValidateMode(). - */ -static int i810PostValidateMode( const DRIDriverContext *ctx ) -{ -   unsigned char *I810MMIO = ctx->MMIOAddress; -   I810Ptr info = ctx->driverPrivate; - -   return 1; -} - - -/** - * \brief Initialize the framebuffer device mode - * - * \param ctx display handle. - * - * \return one on success, or zero on failure. - * - * Fills in \p info with some default values and some information from \p ctx - * and then calls I810ScreenInit() for the screen initialization. - *  - * Before exiting clears the framebuffer memory accessing it directly. - */ -static int i810InitFBDev( DRIDriverContext *ctx ) -{ -  I810Ptr info = calloc(1, sizeof(*info)); - -   { -      int  dummy = ctx->shared.virtualWidth; - -      switch (ctx->bpp / 8) { -      case 1: dummy = (ctx->shared.virtualWidth + 127) & ~127; break; -      case 2: dummy = (ctx->shared.virtualWidth +  31) &  ~31; break; -      case 3: -      case 4: dummy = (ctx->shared.virtualWidth +  15) &  ~15; break; -      } - -      ctx->shared.virtualWidth = dummy; -   } - -   ctx->driverPrivate = (void *)info; -    -   info->Chipset = ctx->chipset; - -   if (!I810ScreenInit( ctx, info )) -      return 0; - - -   return 1; -} - - -/** - * \brief The screen is being closed, so clean up any state and free any - * resources used by the DRI. - * - * \param ctx display handle. - * - * Unmaps the SAREA, closes the DRM device file descriptor and frees the driver - * private data. - */ -static void i810HaltFBDev( DRIDriverContext *ctx ) -{ -    drmUnmap( ctx->pSAREA, ctx->shared.SAREASize ); -    drmClose(ctx->drmFD); - -    if (ctx->driverPrivate) { -       free(ctx->driverPrivate); -       ctx->driverPrivate = 0; -    } -} - - -extern void i810NotifyFocus( int ); - -/** - * \brief Exported driver interface for Mini GLX. - * - * \sa DRIDriverRec. - */ -const struct DRIDriverRec __driDriver = { -   i810ValidateMode, -   i810PostValidateMode, -   i810InitFBDev, -   i810HaltFBDev, -   I810EngineShutdown, -   I810EngineRestore,   -#ifndef _EMBEDDED -   0, -#else -   i810NotifyFocus,  -#endif -}; diff --git a/src/mesa/drivers/dri/i915/Makefile b/src/mesa/drivers/dri/i915/Makefile index dc15ae425c..5b49d0c77c 100644 --- a/src/mesa/drivers/dri/i915/Makefile +++ b/src/mesa/drivers/dri/i915/Makefile @@ -4,8 +4,6 @@ include $(TOP)/configs/current  LIBNAME = i915_dri.so -MINIGLX_SOURCES = server/intel_dri.c -  DRIVER_SOURCES = \  	i830_context.c \  	i830_state.c \ diff --git a/src/mesa/drivers/dri/i915/i830_texstate.c b/src/mesa/drivers/dri/i915/i830_texstate.c index e8f7e378ec..a28073919c 100644 --- a/src/mesa/drivers/dri/i915/i830_texstate.c +++ b/src/mesa/drivers/dri/i915/i830_texstate.c @@ -146,15 +146,15 @@ i830_update_tex_unit(struct intel_context *intel, GLuint unit, GLuint ss3)     dri_bo_reference(intelObj->mt->region->buffer);     i830->state.tex_buffer[unit] = intelObj->mt->region->buffer; +   pitch = intelObj->mt->region->pitch * intelObj->mt->cpp; +     /* XXX: This calculation is probably broken for tiled images with      * a non-page-aligned offset.      */ -   i830->state.tex_offset[unit] = (dst_x + dst_y * intelObj->mt->pitch) * -      intelObj->mt->cpp; +   i830->state.tex_offset[unit] = dst_x * intelObj->mt->cpp + dst_y * pitch;     format = translate_texture_format(firstImage->TexFormat,  				     firstImage->InternalFormat); -   pitch = intelObj->mt->pitch * intelObj->mt->cpp;     state[I830_TEXREG_TM0LI] = (_3DSTATE_LOAD_STATE_IMMEDIATE_2 |                                 (LOAD_TEXTURE_MAP0 << unit) | 4); diff --git a/src/mesa/drivers/dri/i915/i915_state.c b/src/mesa/drivers/dri/i915/i915_state.c index 7275617a6f..91b228d52b 100644 --- a/src/mesa/drivers/dri/i915/i915_state.c +++ b/src/mesa/drivers/dri/i915/i915_state.c @@ -374,7 +374,7 @@ intelCalcViewport(GLcontext * ctx)     else {        /* window buffer, y=0=top */        yScale = -1.0; -      yBias = (intel->driDrawable) ? intel->driDrawable->h : 0.0F; +      yBias = ctx->DrawBuffer->Height;     }     m[MAT_SX] = v[MAT_SX]; diff --git a/src/mesa/drivers/dri/i915/i915_tex_layout.c b/src/mesa/drivers/dri/i915/i915_tex_layout.c index fe3908f580..702655283b 100644 --- a/src/mesa/drivers/dri/i915/i915_tex_layout.c +++ b/src/mesa/drivers/dri/i915/i915_tex_layout.c @@ -123,13 +123,12 @@ i915_miptree_layout_cube(struct intel_context *intel,     assert(lvlWidth == lvlHeight); /* cubemap images are square */     /* double pitch for cube layouts */ -   mt->pitch = intel_miptree_pitch_align (intel, mt, tiling, dim * 2); +   mt->total_width = dim * 2;     mt->total_height = dim * 4;     for (level = mt->first_level; level <= mt->last_level; level++) {        intel_miptree_set_level_info(mt, level, 6,  				   0, 0, -				   /*OLD: mt->pitch, mt->total_height,*/  				   lvlWidth, lvlHeight,  				   1);        lvlWidth /= 2; @@ -167,7 +166,7 @@ i915_miptree_layout_3d(struct intel_context *intel,     GLint level;     /* Calculate the size of a single slice. */ -   mt->pitch = intel_miptree_pitch_align (intel, mt, tiling, mt->width0); +   mt->total_width = mt->width0;     /* XXX: hardware expects/requires 9 levels at minimum. */     for (level = mt->first_level; level <= MAX2(8, mt->last_level); level++) { @@ -210,7 +209,7 @@ i915_miptree_layout_2d(struct intel_context *intel,     GLuint img_height;     GLint level; -   mt->pitch = intel_miptree_pitch_align (intel, mt, tiling, mt->width0); +   mt->total_width = mt->width0;     mt->total_height = 0;     for (level = mt->first_level; level <= mt->last_level; level++) { @@ -251,9 +250,8 @@ i915_miptree_layout(struct intel_context *intel, struct intel_mipmap_tree * mt,        break;     } -   DBG("%s: %dx%dx%d - sz 0x%x\n", __FUNCTION__, -       mt->pitch, -       mt->total_height, mt->cpp, mt->pitch * mt->total_height * mt->cpp); +   DBG("%s: %dx%dx%d\n", __FUNCTION__, +       mt->total_width, mt->total_height, mt->cpp);     return GL_TRUE;  } @@ -336,9 +334,9 @@ i945_miptree_layout_cube(struct intel_context *intel,      * or the final row of 4x4, 2x2 and 1x1 faces below this.      */     if (dim > 32) -      mt->pitch = intel_miptree_pitch_align (intel, mt, tiling, dim * 2); +      mt->total_width = dim * 2;     else -      mt->pitch = intel_miptree_pitch_align (intel, mt, tiling, 14 * 8); +      mt->total_width = 14 * 8;     if (dim >= 4)        mt->total_height = dim * 4 + 4; @@ -423,11 +421,11 @@ i945_miptree_layout_3d(struct intel_context *intel,     GLuint pack_y_pitch;     GLuint level; -   mt->pitch = intel_miptree_pitch_align (intel, mt, tiling, mt->width0); +   mt->total_width = mt->width0;     mt->total_height = 0;     pack_y_pitch = MAX2(mt->height0, 2); -   pack_x_pitch = mt->pitch; +   pack_x_pitch = mt->total_width;     pack_x_nr = 1;     for (level = mt->first_level; level <= mt->last_level; level++) { @@ -454,7 +452,7 @@ i945_miptree_layout_3d(struct intel_context *intel,        if (pack_x_pitch > 4) {  	 pack_x_pitch >>= 1;  	 pack_x_nr <<= 1; -	 assert(pack_x_pitch * pack_x_nr <= mt->pitch); +	 assert(pack_x_pitch * pack_x_nr <= mt->total_width);        }        if (pack_y_pitch > 2) { @@ -491,9 +489,8 @@ i945_miptree_layout(struct intel_context *intel, struct intel_mipmap_tree * mt,        break;     } -   DBG("%s: %dx%dx%d - sz 0x%x\n", __FUNCTION__, -       mt->pitch, -       mt->total_height, mt->cpp, mt->pitch * mt->total_height * mt->cpp); +   DBG("%s: %dx%dx%d\n", __FUNCTION__, +       mt->total_width, mt->total_height, mt->cpp);     return GL_TRUE;  } diff --git a/src/mesa/drivers/dri/i915/i915_texstate.c b/src/mesa/drivers/dri/i915/i915_texstate.c index a1ab8f8b6d..ff9ab88c5a 100644 --- a/src/mesa/drivers/dri/i915/i915_texstate.c +++ b/src/mesa/drivers/dri/i915/i915_texstate.c @@ -165,7 +165,7 @@ i915_update_tex_unit(struct intel_context *intel, GLuint unit, GLuint ss3)     format = translate_texture_format(firstImage->TexFormat,  				     firstImage->InternalFormat,  				     tObj->DepthMode); -   pitch = intelObj->mt->pitch * intelObj->mt->cpp; +   pitch = intelObj->mt->region->pitch * intelObj->mt->cpp;     state[I915_TEXREG_MS3] =        (((firstImage->Height - 1) << MS3_HEIGHT_SHIFT) | diff --git a/src/mesa/drivers/dri/i915/intel_tris.c b/src/mesa/drivers/dri/i915/intel_tris.c index 81c4adeaf3..9449a158dc 100644 --- a/src/mesa/drivers/dri/i915/intel_tris.c +++ b/src/mesa/drivers/dri/i915/intel_tris.c @@ -488,9 +488,9 @@ intel_wpos_triangle(struct intel_context *intel,     __memcpy(v1_wpos, v1, size);     __memcpy(v2_wpos, v2, size); -   v0_wpos[1] = -v0_wpos[1] + intel->driDrawable->h; -   v1_wpos[1] = -v1_wpos[1] + intel->driDrawable->h; -   v2_wpos[1] = -v2_wpos[1] + intel->driDrawable->h; +   v0_wpos[1] = -v0_wpos[1] + intel->ctx.DrawBuffer->Height; +   v1_wpos[1] = -v1_wpos[1] + intel->ctx.DrawBuffer->Height; +   v2_wpos[1] = -v2_wpos[1] + intel->ctx.DrawBuffer->Height;     intel_draw_triangle(intel, v0, v1, v2); @@ -509,8 +509,8 @@ intel_wpos_line(struct intel_context *intel,     __memcpy(v0_wpos, v0, size);     __memcpy(v1_wpos, v1, size); -   v0_wpos[1] = -v0_wpos[1] + intel->driDrawable->h; -   v1_wpos[1] = -v1_wpos[1] + intel->driDrawable->h; +   v0_wpos[1] = -v0_wpos[1] + intel->ctx.DrawBuffer->Height; +   v1_wpos[1] = -v1_wpos[1] + intel->ctx.DrawBuffer->Height;     intel_draw_line(intel, v0, v1);  } @@ -524,7 +524,7 @@ intel_wpos_point(struct intel_context *intel, intelVertexPtr v0)     GLfloat *v0_wpos = (GLfloat *)((char *)v0 + offset);     __memcpy(v0_wpos, v0, size); -   v0_wpos[1] = -v0_wpos[1] + intel->driDrawable->h; +   v0_wpos[1] = -v0_wpos[1] + intel->ctx.DrawBuffer->Height;     intel_draw_point(intel, v0);  } diff --git a/src/mesa/drivers/dri/i915/server/intel_dri.c b/src/mesa/drivers/dri/i915/server/intel_dri.c deleted file mode 120000 index effdd26448..0000000000 --- a/src/mesa/drivers/dri/i915/server/intel_dri.c +++ /dev/null @@ -1 +0,0 @@ -../../intel/server/intel_dri.c
\ No newline at end of file diff --git a/src/mesa/drivers/dri/i965/Makefile b/src/mesa/drivers/dri/i965/Makefile index f98a1a27db..842d4b7aa1 100644 --- a/src/mesa/drivers/dri/i965/Makefile +++ b/src/mesa/drivers/dri/i965/Makefile @@ -54,6 +54,7 @@ DRIVER_SOURCES = \  	brw_gs_emit.c \  	brw_gs_state.c \  	brw_misc_state.c \ +	brw_optimize.c \  	brw_program.c \  	brw_queryobj.c \  	brw_sf.c \ @@ -99,7 +100,6 @@ DRIVER_SOURCES = \  C_SOURCES = \  	$(COMMON_SOURCES) \ -	$(MINIGLX_SOURCES) \  	$(DRIVER_SOURCES)  ASM_SOURCES =  diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c index a512896f31..241193c357 100644 --- a/src/mesa/drivers/dri/i965/brw_context.c +++ b/src/mesa/drivers/dri/i965/brw_context.c @@ -156,6 +156,7 @@ GLboolean brwCreateContext( const __GLcontextModes *mesaVis,        brw->has_surface_tile_offset = GL_TRUE;        brw->has_compr4 = GL_TRUE;        brw->has_aa_line_parameters = GL_TRUE; +      brw->has_pln = GL_TRUE;    } else {        brw->CMD_VF_STATISTICS = CMD_VF_STATISTICS_965;        brw->CMD_PIPELINE_SELECT = CMD_PIPELINE_SELECT_965; diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h index d6fc37e4d8..2855c93ea6 100644 --- a/src/mesa/drivers/dri/i965/brw_context.h +++ b/src/mesa/drivers/dri/i965/brw_context.h @@ -446,6 +446,7 @@ struct brw_context     GLboolean has_compr4;     GLboolean has_negative_rhw_bug;     GLboolean has_aa_line_parameters; +   GLboolean has_pln;  ;     struct {        struct brw_state_flags dirty; diff --git a/src/mesa/drivers/dri/i965/brw_defines.h b/src/mesa/drivers/dri/i965/brw_defines.h index bb1b5f5ef0..6fe574b22e 100644 --- a/src/mesa/drivers/dri/i965/brw_defines.h +++ b/src/mesa/drivers/dri/i965/brw_defines.h @@ -550,6 +550,7 @@  #define BRW_OPCODE_DP2        87  #define BRW_OPCODE_DPA2       88  #define BRW_OPCODE_LINE       89 +#define BRW_OPCODE_PLN        90  #define BRW_OPCODE_NOP        126  #define BRW_PREDICATE_NONE             0 @@ -830,8 +831,8 @@  #define CMD_URB					0x7805 /* GEN6+ */  # define GEN6_URB_VS_SIZE_SHIFT				16  # define GEN6_URB_VS_ENTRIES_SHIFT			0 -# define GEN6_URB_GS_SIZE_SHIFT				8 -# define GEN6_URB_GS_ENTRIES_SHIFT			0 +# define GEN6_URB_GS_ENTRIES_SHIFT			8 +# define GEN6_URB_GS_SIZE_SHIFT				0  #define CMD_VIEWPORT_STATE_POINTERS			0x780d /* GEN6+ */  # define GEN6_CC_VIEWPORT_MODIFY			(1 << 12) diff --git a/src/mesa/drivers/dri/i965/brw_disasm.c b/src/mesa/drivers/dri/i965/brw_disasm.c index a8f6b993ac..db3fc50a63 100644 --- a/src/mesa/drivers/dri/i965/brw_disasm.c +++ b/src/mesa/drivers/dri/i965/brw_disasm.c @@ -50,12 +50,14 @@ struct {      [BRW_OPCODE_MAC] = { .name = "mac", .nsrc = 2, .ndst = 1 },      [BRW_OPCODE_MACH] = { .name = "mach", .nsrc = 2, .ndst = 1 },      [BRW_OPCODE_LINE] = { .name = "line", .nsrc = 2, .ndst = 1 }, +    [BRW_OPCODE_PLN] = { .name = "pln", .nsrc = 2, .ndst = 1 },      [BRW_OPCODE_SAD2] = { .name = "sad2", .nsrc = 2, .ndst = 1 },      [BRW_OPCODE_SADA2] = { .name = "sada2", .nsrc = 2, .ndst = 1 },      [BRW_OPCODE_DP4] = { .name = "dp4", .nsrc = 2, .ndst = 1 },      [BRW_OPCODE_DPH] = { .name = "dph", .nsrc = 2, .ndst = 1 },      [BRW_OPCODE_DP3] = { .name = "dp3", .nsrc = 2, .ndst = 1 },      [BRW_OPCODE_DP2] = { .name = "dp2", .nsrc = 2, .ndst = 1 }, +    [BRW_OPCODE_MATH] = { .name = "math", .nsrc = 2, .ndst = 1 },      [BRW_OPCODE_AVG] = { .name = "avg", .nsrc = 2, .ndst = 1 },      [BRW_OPCODE_ADD] = { .name = "add", .nsrc = 2, .ndst = 1 }, @@ -73,10 +75,10 @@ struct {      [BRW_OPCODE_NOP] = { .name = "nop", .nsrc = 0, .ndst = 0 },      [BRW_OPCODE_JMPI] = { .name = "jmpi", .nsrc = 1, .ndst = 0 },      [BRW_OPCODE_IF] = { .name = "if", .nsrc = 2, .ndst = 0 }, -    [BRW_OPCODE_IFF] = { .name = "iff", .nsrc = 1, .ndst = 01 }, -    [BRW_OPCODE_WHILE] = { .name = "while", .nsrc = 1, .ndst = 0 }, +    [BRW_OPCODE_IFF] = { .name = "iff", .nsrc = 2, .ndst = 1 }, +    [BRW_OPCODE_WHILE] = { .name = "while", .nsrc = 2, .ndst = 0 },      [BRW_OPCODE_ELSE] = { .name = "else", .nsrc = 2, .ndst = 0 }, -    [BRW_OPCODE_BREAK] = { .name = "break", .nsrc = 1, .ndst = 0 }, +    [BRW_OPCODE_BREAK] = { .name = "break", .nsrc = 2, .ndst = 0 },      [BRW_OPCODE_CONTINUE] = { .name = "cont", .nsrc = 1, .ndst = 0 },      [BRW_OPCODE_HALT] = { .name = "halt", .nsrc = 1, .ndst = 0 },      [BRW_OPCODE_MSAVE] = { .name = "msave", .nsrc = 1, .ndst = 1 }, @@ -796,7 +798,11 @@ int brw_disasm (FILE *file, struct brw_instruction *inst)      err |= control (file, "saturate", saturate, inst->header.saturate, NULL);      err |= control (file, "debug control", debug_ctrl, inst->header.debug_control, NULL); -    if (inst->header.opcode != BRW_OPCODE_SEND) +    if (inst->header.opcode == BRW_OPCODE_MATH) { +	string (file, " "); +	err |= control (file, "function", math_function, +			inst->header.destreg__conditionalmod, NULL); +    } else if (inst->header.opcode != BRW_OPCODE_SEND)  	err |= control (file, "conditional modifier", conditional_modifier,  			inst->header.destreg__conditionalmod, NULL); diff --git a/src/mesa/drivers/dri/i965/brw_eu.h b/src/mesa/drivers/dri/i965/brw_eu.h index 39eb88d7c2..4f55158e8f 100644 --- a/src/mesa/drivers/dri/i965/brw_eu.h +++ b/src/mesa/drivers/dri/i965/brw_eu.h @@ -795,6 +795,7 @@ ALU2(DPH)  ALU2(DP3)  ALU2(DP2)  ALU2(LINE) +ALU2(PLN)  #undef ALU1  #undef ALU2 @@ -965,4 +966,9 @@ void brw_math_invert( struct brw_compile *p,  void brw_set_src1( struct brw_instruction *insn,                            struct brw_reg reg ); + + +/* brw_optimize.c */ +void brw_optimize(struct brw_compile *p); +  #endif diff --git a/src/mesa/drivers/dri/i965/brw_eu_emit.c b/src/mesa/drivers/dri/i965/brw_eu_emit.c index 82f2fdab2f..c33c3def30 100644 --- a/src/mesa/drivers/dri/i965/brw_eu_emit.c +++ b/src/mesa/drivers/dri/i965/brw_eu_emit.c @@ -573,7 +573,7 @@ ALU2(DPH)  ALU2(DP3)  ALU2(DP2)  ALU2(LINE) - +ALU2(PLN) @@ -1416,7 +1416,10 @@ void brw_urb_WRITE(struct brw_compile *p,      * and the first message register index comes from src0.      */     if (intel->gen >= 6) { +      brw_push_insn_state(p); +      brw_set_mask_control( p, BRW_MASK_DISABLE );        brw_MOV(p, brw_message_reg(msg_reg_nr), src0); +      brw_pop_insn_state(p);        src0 = brw_message_reg(msg_reg_nr);     } diff --git a/src/mesa/drivers/dri/i965/brw_optimize.c b/src/mesa/drivers/dri/i965/brw_optimize.c new file mode 100644 index 0000000000..57df9ea115 --- /dev/null +++ b/src/mesa/drivers/dri/i965/brw_optimize.c @@ -0,0 +1,115 @@ +/* + * Copyright © 2010 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Authors: + *    Eric Anholt <eric@anholt.net> + * + */ + +#include "main/macros.h" +#include "shader/program.h" +#include "shader/prog_parameter.h" +#include "shader/prog_print.h" +#include "brw_context.h" +#include "brw_defines.h" +#include "brw_eu.h" + +static GLboolean +is_single_channel_dp4(struct brw_instruction *insn) +{ +   if (insn->header.opcode != BRW_OPCODE_DP4 || +       insn->header.execution_size != BRW_EXECUTE_8 || +       insn->header.access_mode != BRW_ALIGN_16 || +       insn->bits1.da1.dest_reg_file != BRW_GENERAL_REGISTER_FILE) +      return GL_FALSE; + +   if (!is_power_of_two(insn->bits1.da16.dest_writemask)) +      return GL_FALSE; + +   return GL_TRUE; +} + +/** + * Sets the dependency control fields on DP4 instructions. + * + * The hardware only tracks dependencies on a register basis, so when + * you do: + * + * DP4 dst.x src1 src2 + * DP4 dst.y src1 src3 + * DP4 dst.z src1 src4 + * DP4 dst.w src1 src5 + * + * It will wait to do the DP4 dst.y until the dst.x is resolved, etc. + * We can examine our instruction stream and set the dependency + * control fields to tell the hardware when to do it. + * + * We may want to extend this to other instructions that are used to + * fill in a channel at a time of the destination register. + */ +static void +brw_set_dp4_dependency_control(struct brw_compile *p) +{ +   int i; + +   for (i = 1; i < p->nr_insn; i++) { +      struct brw_instruction *insn = &p->store[i]; +      struct brw_instruction *prev = &p->store[i - 1]; + +      if (!is_single_channel_dp4(prev)) +	 continue; + +      if (!is_single_channel_dp4(insn)) { +	 i++; +	 continue; +      } + +      /* Only avoid hw dep control if the write masks are different +       * channels of one reg. +       */ +      if (insn->bits1.da16.dest_writemask == prev->bits1.da16.dest_writemask) +	 continue; +      if (insn->bits1.da16.dest_reg_nr != prev->bits1.da16.dest_reg_nr) +	 continue; + +      /* Check if the second instruction depends on the previous one +       * for a src. +       */ +      if (insn->bits1.da1.src0_reg_file == BRW_GENERAL_REGISTER_FILE && +	  (insn->bits2.da1.src0_address_mode != BRW_ADDRESS_DIRECT || +	   insn->bits2.da1.src0_reg_nr == insn->bits1.da16.dest_reg_nr)) +	  continue; +      if (insn->bits1.da1.src1_reg_file == BRW_GENERAL_REGISTER_FILE && +	  (insn->bits3.da1.src1_address_mode != BRW_ADDRESS_DIRECT || +	   insn->bits3.da1.src1_reg_nr == insn->bits1.da16.dest_reg_nr)) +	  continue; + +      prev->header.dependency_control |= BRW_DEPENDENCY_NOTCLEARED; +      insn->header.dependency_control |= BRW_DEPENDENCY_NOTCHECKED; +   } +} + +void +brw_optimize(struct brw_compile *p) +{ +   brw_set_dp4_dependency_control(p); +} diff --git a/src/mesa/drivers/dri/i965/brw_tex_layout.c b/src/mesa/drivers/dri/i965/brw_tex_layout.c index 09edfd81fd..b1f56a8e64 100644 --- a/src/mesa/drivers/dri/i965/brw_tex_layout.c +++ b/src/mesa/drivers/dri/i965/brw_tex_layout.c @@ -58,12 +58,12 @@ GLboolean brw_miptree_layout(struct intel_context *intel,            GLuint qpitch = 0;            GLuint y_pitch = 0; -          mt->pitch = mt->width0; +          mt->total_width = mt->width0;            intel_get_texture_alignment_unit(mt->internal_format, &align_w, &align_h);            y_pitch = ALIGN(height, align_h);            if (mt->compressed) { -              mt->pitch = ALIGN(mt->width0, align_w); +              mt->total_width = ALIGN(mt->width0, align_w);            }            if (mt->first_level != mt->last_level) { @@ -77,13 +77,11 @@ GLboolean brw_miptree_layout(struct intel_context *intel,                        + minify(minify(mt->width0));                } -              if (mip1_width > mt->pitch) { -                  mt->pitch = mip1_width; +              if (mip1_width > mt->total_width) { +                  mt->total_width = mip1_width;                }            } -          mt->pitch = intel_miptree_pitch_align(intel, mt, tiling, mt->pitch); -            if (mt->compressed) {                qpitch = (y_pitch + ALIGN(minify(y_pitch), align_h) + 11 * align_h) / 4;                mt->total_height = (y_pitch + ALIGN(minify(y_pitch), align_h) + 11 * align_h) / 4 * 6; @@ -137,10 +135,10 @@ GLboolean brw_miptree_layout(struct intel_context *intel,        intel_get_texture_alignment_unit(mt->internal_format, &align_w, &align_h);        if (mt->compressed) { -          mt->pitch = ALIGN(width, align_w); +          mt->total_width = ALIGN(width, align_w);            pack_y_pitch = (height + 3) / 4;        } else { -	 mt->pitch = intel_miptree_pitch_align (intel, mt, tiling, mt->width0); +	 mt->total_width = mt->width0;  	 pack_y_pitch = ALIGN(mt->height0, align_h);        } @@ -184,7 +182,7 @@ GLboolean brw_miptree_layout(struct intel_context *intel,  	    if (pack_x_pitch > 4) {  	       pack_x_pitch >>= 1;  	       pack_x_nr <<= 1; -	       assert(pack_x_pitch * pack_x_nr <= mt->pitch); +	       assert(pack_x_pitch * pack_x_nr <= mt->total_width);  	    }  	    if (pack_y_pitch > 2) { @@ -211,11 +209,8 @@ GLboolean brw_miptree_layout(struct intel_context *intel,        i945_miptree_layout_2d(intel, mt, tiling);        break;     } -   DBG("%s: %dx%dx%d - sz 0x%x\n", __FUNCTION__, -		mt->pitch, -		mt->total_height, -		mt->cpp, -		mt->pitch * mt->total_height * mt->cpp ); +   DBG("%s: %dx%dx%d\n", __FUNCTION__, +       mt->total_width, mt->total_height, mt->cpp);     return GL_TRUE;  } diff --git a/src/mesa/drivers/dri/i965/brw_vs_emit.c b/src/mesa/drivers/dri/i965/brw_vs_emit.c index a48804a660..227261409c 100644 --- a/src/mesa/drivers/dri/i965/brw_vs_emit.c +++ b/src/mesa/drivers/dri/i965/brw_vs_emit.c @@ -1361,31 +1361,6 @@ static void emit_vertex_write( struct brw_vs_compile *c)     }  } - -/** - * Called after code generation to resolve subroutine calls and the - * END instruction. - * \param end_inst  points to brw code for END instruction - * \param last_inst  points to last instruction emitted before vertex write - */ -static void  -post_vs_emit( struct brw_vs_compile *c, -              struct brw_instruction *end_inst, -              struct brw_instruction *last_inst ) -{ -   GLint offset; - -   brw_resolve_cals(&c->func); - -   /* patch up the END code to jump past subroutines, etc */ -   offset = last_inst - end_inst; -   if (offset > 1) { -      brw_set_src1(end_inst, brw_imm_d(offset * 16)); -   } else { -      end_inst->header.opcode = BRW_OPCODE_NOP; -   } -} -  static GLboolean  accumulator_contains(struct brw_vs_compile *c, struct brw_reg val)  { @@ -1466,8 +1441,6 @@ void brw_vs_emit(struct brw_vs_compile *c )     struct intel_context *intel = &brw->intel;     const GLuint nr_insns = c->vp->program.Base.NumInstructions;     GLuint insn, if_depth = 0, loop_depth = 0; -   GLuint end_offset = 0; -   struct brw_instruction *end_inst, *last_inst;     struct brw_instruction *if_inst[MAX_IF_DEPTH], *loop_inst[MAX_LOOP_DEPTH] = { 0 };     const struct brw_indirect stack_index = brw_indirect(0, 0);        GLuint index; @@ -1751,12 +1724,8 @@ void brw_vs_emit(struct brw_vs_compile *c )           brw_MOV(p, brw_ip_reg(), deref_1d(stack_index, 0));  	 brw_set_access_mode(p, BRW_ALIGN_16);  	 break; -      case OPCODE_END:	 -         end_offset = p->nr_insn; -         /* this instruction will get patched later to jump past subroutine -          * code, etc. -          */ -         brw_ADD(p, brw_ip_reg(), brw_ip_reg(), brw_imm_d(1*16)); +      case OPCODE_END: +	 emit_vertex_write(c);           break;        case OPCODE_PRINT:           /* no-op */ @@ -1817,13 +1786,9 @@ void brw_vs_emit(struct brw_vs_compile *c )        release_tmps(c);     } -   end_inst = &p->store[end_offset]; -   last_inst = &p->store[p->nr_insn]; - -   /* The END instruction will be patched to jump to this code */ -   emit_vertex_write(c); +   brw_resolve_cals(p); -   post_vs_emit(c, end_inst, last_inst); +   brw_optimize(p);     if (INTEL_DEBUG & DEBUG_VS) {        int i; diff --git a/src/mesa/drivers/dri/i965/brw_wm.h b/src/mesa/drivers/dri/i965/brw_wm.h index 47b764d24d..5aade1c4e6 100644 --- a/src/mesa/drivers/dri/i965/brw_wm.h +++ b/src/mesa/drivers/dri/i965/brw_wm.h @@ -286,7 +286,7 @@ void brw_wm_pass0( struct brw_wm_compile *c );  void brw_wm_pass1( struct brw_wm_compile *c );  void brw_wm_pass2( struct brw_wm_compile *c );  void brw_wm_emit( struct brw_wm_compile *c ); - +GLboolean brw_wm_arg_can_be_immediate(enum prog_opcode, int arg);  void brw_wm_print_value( struct brw_wm_compile *c,  			 struct brw_wm_value *value ); diff --git a/src/mesa/drivers/dri/i965/brw_wm_emit.c b/src/mesa/drivers/dri/i965/brw_wm_emit.c index c7d87b9d94..f79de5dbff 100644 --- a/src/mesa/drivers/dri/i965/brw_wm_emit.c +++ b/src/mesa/drivers/dri/i965/brw_wm_emit.c @@ -34,6 +34,23 @@  #include "brw_context.h"  #include "brw_wm.h" +static GLboolean can_do_pln(struct intel_context *intel, +			    const struct brw_reg *deltas) +{ +   struct brw_context *brw = brw_context(&intel->ctx); + +   if (!brw->has_pln) +      return GL_FALSE; + +   if (deltas[1].nr != deltas[0].nr + 1) +      return GL_FALSE; + +   if (intel->gen < 6 && ((deltas[0].nr & 1) != 0)) +      return GL_FALSE; + +   return GL_TRUE; +} +  /* Not quite sure how correct this is - need to understand horiz   * vs. vertical strides a little better.   */ @@ -44,8 +61,52 @@ static INLINE struct brw_reg sechalf( struct brw_reg reg )     return reg;  } +/* Return the SrcReg index of the channels that can be immediate float operands + * instead of usage of PROGRAM_CONSTANT values through push/pull. + */ +GLboolean +brw_wm_arg_can_be_immediate(enum prog_opcode opcode, int arg) +{ +   int opcode_array[] = { +      [OPCODE_ADD] = 2, +      [OPCODE_CMP] = 3, +      [OPCODE_DP3] = 2, +      [OPCODE_DP4] = 2, +      [OPCODE_DPH] = 2, +      [OPCODE_MAX] = 2, +      [OPCODE_MIN] = 2, +      [OPCODE_MOV] = 1, +      [OPCODE_MUL] = 2, +      [OPCODE_SEQ] = 2, +      [OPCODE_SGE] = 2, +      [OPCODE_SGT] = 2, +      [OPCODE_SLE] = 2, +      [OPCODE_SLT] = 2, +      [OPCODE_SNE] = 2, +      [OPCODE_XPD] = 2, +   }; + +   /* These opcodes get broken down in a way that allow two +    * args to be immediates. +    */ +   if (opcode == OPCODE_MAD || opcode == OPCODE_LRP) { +      if (arg == 1 || arg == 2) +	 return GL_TRUE; +   } + +   if (opcode > ARRAY_SIZE(opcode_array)) +      return GL_FALSE; + +   return arg == opcode_array[opcode] - 1; +} -/* Payload R0: +/** + * Computes the screen-space x,y position of the pixels. + * + * This will be used by emit_delta_xy() or emit_wpos_xy() for + * interpolation of attributes.. + * + * Payload R0:   *   * R0.0 -- pixel mask, one bit for each of 4 pixels in 4 tiles,   *         corresponding to each of the 16 execution channels. @@ -60,7 +121,6 @@ static INLINE struct brw_reg sechalf( struct brw_reg reg )   * R1.7 -- ?   * R1.8 -- ?   */ -  void emit_pixel_xy(struct brw_wm_compile *c,  		   const struct brw_reg *dst,  		   GLuint mask) @@ -100,7 +160,14 @@ void emit_pixel_xy(struct brw_wm_compile *c,     brw_pop_insn_state(p);  } - +/** + * Computes the screen-space x,y distance of the pixels from the start + * vertex. + * + * This will be used in linterp or pinterp with the start vertex value + * and the Cx, Cy, and C0 coefficients passed in from the setup engine + * to produce interpolated attribute values. + */  void emit_delta_xy(struct brw_compile *p,  		   const struct brw_reg *dst,  		   GLuint mask, @@ -108,25 +175,27 @@ void emit_delta_xy(struct brw_compile *p,  {     struct brw_reg r1 = brw_vec1_grf(1, 0); -   /* Calc delta X,Y by subtracting origin in r1 from the pixel -    * centers. -    */ -   if (mask & WRITEMASK_X) { -      brw_ADD(p, -	      dst[0], -	      retype(arg0[0], BRW_REGISTER_TYPE_UW), -	      negate(r1)); -   } +   if (mask == 0) +      return; -   if (mask & WRITEMASK_Y) { -      brw_ADD(p, -	      dst[1], -	      retype(arg0[1], BRW_REGISTER_TYPE_UW), -	      negate(suboffset(r1,1))); +   assert(mask == WRITEMASK_XY); -   } +   /* Calc delta X,Y by subtracting origin in r1 from the pixel +    * centers produced by emit_pixel_xy(). +    */ +   brw_ADD(p, +	   dst[0], +	   retype(arg0[0], BRW_REGISTER_TYPE_UW), +	   negate(r1)); +   brw_ADD(p, +	   dst[1], +	   retype(arg0[1], BRW_REGISTER_TYPE_UW), +	   negate(suboffset(r1,1)));  } +/** + * Computes the pixel offset from the window origin for gl_FragCoord(). + */  void emit_wpos_xy(struct brw_wm_compile *c,  		  const struct brw_reg *dst,  		  GLuint mask, @@ -134,9 +203,6 @@ void emit_wpos_xy(struct brw_wm_compile *c,  {     struct brw_compile *p = &c->func; -   /* Calculate the pixel offset from window bottom left into destination -    * X and Y channels. -    */     if (mask & WRITEMASK_X) {        if (c->fp->program.PixelCenterInteger) {  	 /* X' = X */ @@ -186,6 +252,7 @@ void emit_pixel_w(struct brw_wm_compile *c,  		  const struct brw_reg *deltas)  {     struct brw_compile *p = &c->func; +   struct intel_context *intel = &p->brw->intel;     /* Don't need this if all you are doing is interpolating color, for      * instance. @@ -196,8 +263,12 @@ void emit_pixel_w(struct brw_wm_compile *c,        /* Calc 1/w - just linterp wpos[3] optimized by putting the         * result straight into a message reg.         */ -      brw_LINE(p, brw_null_reg(), interp3, deltas[0]); -      brw_MAC(p, brw_message_reg(2), suboffset(interp3, 1), deltas[1]); +      if (can_do_pln(intel, deltas)) { +	 brw_PLN(p, brw_message_reg(2), interp3, deltas[0]); +      } else { +	 brw_LINE(p, brw_null_reg(), interp3, deltas[0]); +	 brw_MAC(p, brw_message_reg(2), suboffset(interp3, 1), deltas[1]); +      }        /* Calc w */        if (c->dispatch_width == 16) { @@ -224,6 +295,7 @@ void emit_linterp(struct brw_compile *p,  		  const struct brw_reg *arg0,  		  const struct brw_reg *deltas)  { +   struct intel_context *intel = &p->brw->intel;     struct brw_reg interp[4];     GLuint nr = arg0[0].nr;     GLuint i; @@ -235,8 +307,12 @@ void emit_linterp(struct brw_compile *p,     for (i = 0; i < 4; i++) {        if (mask & (1<<i)) { -	 brw_LINE(p, brw_null_reg(), interp[i], deltas[0]); -	 brw_MAC(p, dst[i], suboffset(interp[i],1), deltas[1]); +	 if (can_do_pln(intel, deltas)) { +	    brw_PLN(p, dst[i], interp[i], deltas[0]); +	 } else { +	    brw_LINE(p, brw_null_reg(), interp[i], deltas[0]); +	    brw_MAC(p, dst[i], suboffset(interp[i],1), deltas[1]); +	 }        }     }  } @@ -249,6 +325,7 @@ void emit_pinterp(struct brw_compile *p,  		  const struct brw_reg *deltas,  		  const struct brw_reg *w)  { +   struct intel_context *intel = &p->brw->intel;     struct brw_reg interp[4];     GLuint nr = arg0[0].nr;     GLuint i; @@ -260,8 +337,12 @@ void emit_pinterp(struct brw_compile *p,     for (i = 0; i < 4; i++) {        if (mask & (1<<i)) { -	 brw_LINE(p, brw_null_reg(), interp[i], deltas[0]); -	 brw_MAC(p, dst[i], suboffset(interp[i],1), deltas[1]); +	 if (can_do_pln(intel, deltas)) { +	    brw_PLN(p, dst[i], interp[i], deltas[0]); +	 } else { +	    brw_LINE(p, brw_null_reg(), interp[i], deltas[0]); +	    brw_MAC(p, dst[i], suboffset(interp[i],1), deltas[1]); +	 }        }     }     for (i = 0; i < 4; i++) { @@ -577,14 +658,10 @@ void emit_cmp(struct brw_compile *p,     for (i = 0; i < 4; i++) {        if (mask & (1<<i)) {	 -	 brw_set_saturate(p, (mask & SATURATE) ? 1 : 0); -	 brw_MOV(p, dst[i], arg2[i]); -	 brw_set_saturate(p, 0); -  	 brw_CMP(p, brw_null_reg(), BRW_CONDITIONAL_L, arg0[i], brw_imm_f(0));  	 brw_set_saturate(p, (mask & SATURATE) ? 1 : 0); -	 brw_MOV(p, dst[i], arg1[i]); +	 brw_SEL(p, dst[i], arg1[i], arg2[i]);  	 brw_set_saturate(p, 0);  	 brw_set_predicate_control_flag_value(p, 0xff);        } @@ -601,14 +678,10 @@ void emit_max(struct brw_compile *p,     for (i = 0; i < 4; i++) {        if (mask & (1<<i)) {	 -	 brw_set_saturate(p, (mask & SATURATE) ? 1 : 0); -	 brw_MOV(p, dst[i], arg0[i]); -	 brw_set_saturate(p, 0); - -	 brw_CMP(p, brw_null_reg(), BRW_CONDITIONAL_L, arg0[i], arg1[i]); +	 brw_CMP(p, brw_null_reg(), BRW_CONDITIONAL_GE, arg0[i], arg1[i]);  	 brw_set_saturate(p, (mask & SATURATE) ? 1 : 0); -	 brw_MOV(p, dst[i], arg1[i]); +	 brw_SEL(p, dst[i], arg0[i], arg1[i]);  	 brw_set_saturate(p, 0);  	 brw_set_predicate_control_flag_value(p, 0xff);        } @@ -625,14 +698,10 @@ void emit_min(struct brw_compile *p,     for (i = 0; i < 4; i++) {        if (mask & (1<<i)) {	 -	 brw_set_saturate(p, (mask & SATURATE) ? 1 : 0); -	 brw_MOV(p, dst[i], arg1[i]); -	 brw_set_saturate(p, 0); -  	 brw_CMP(p, brw_null_reg(), BRW_CONDITIONAL_L, arg0[i], arg1[i]);  	 brw_set_saturate(p, (mask & SATURATE) ? 1 : 0); -	 brw_MOV(p, dst[i], arg0[i]); +	 brw_SEL(p, dst[i], arg0[i], arg1[i]);  	 brw_set_saturate(p, 0);  	 brw_set_predicate_control_flag_value(p, 0xff);        } @@ -1086,11 +1155,19 @@ static void emit_kil( struct brw_wm_compile *c,  {     struct brw_compile *p = &c->func;     struct brw_reg r0uw = retype(brw_vec1_grf(0, 0), BRW_REGISTER_TYPE_UW); -   GLuint i; -    -   /* XXX - usually won't need 4 compares! -    */ +   GLuint i, j; +     for (i = 0; i < 4; i++) { +      /* Check if we've already done the comparison for this reg +       * -- common when someone does KIL TEMP.wwww. +       */ +      for (j = 0; j < i; j++) { +	 if (memcmp(&arg0[j], &arg0[i], sizeof(arg0[0])) == 0) +	    break; +      } +      if (j != i) +	 continue; +        brw_push_insn_state(p);        brw_CMP(p, brw_null_reg(), BRW_CONDITIONAL_GE, arg0[i], brw_imm_f(0));           brw_set_predicate_control_flag_value(p, 0xff); diff --git a/src/mesa/drivers/dri/i965/brw_wm_glsl.c b/src/mesa/drivers/dri/i965/brw_wm_glsl.c index 315b030484..3b7e421b16 100644 --- a/src/mesa/drivers/dri/i965/brw_wm_glsl.c +++ b/src/mesa/drivers/dri/i965/brw_wm_glsl.c @@ -23,6 +23,9 @@ GLboolean brw_wm_is_glsl(const struct gl_fragment_program *fp)  {      int i; +    if (INTEL_DEBUG & DEBUG_GLSL_FORCE) +       return GL_TRUE; +      for (i = 0; i < fp->Base.NumInstructions; i++) {  	const struct prog_instruction *inst = &fp->Base.Instructions[i];  	switch (inst->Opcode) { @@ -289,6 +292,7 @@ reclaim_temps(struct brw_wm_compile *c)   */  static void prealloc_reg(struct brw_wm_compile *c)  { +    struct intel_context *intel = &c->func.brw->intel;      int i, j;      struct brw_reg reg;      int urb_read_length = 0; @@ -413,6 +417,43 @@ static void prealloc_reg(struct brw_wm_compile *c)  	}      } +    for (i = 0; i < c->nr_fp_insns; i++) { +	const struct prog_instruction *inst = &c->prog_instructions[i]; + +	switch (inst->Opcode) { +	case WM_DELTAXY: +	    /* Allocate WM_DELTAXY destination on G45/GM45 to an +	     * even-numbered GRF if possible so that we can use the PLN +	     * instruction. +	     */ +	    if (inst->DstReg.WriteMask == WRITEMASK_XY && +		!c->wm_regs[inst->DstReg.File][inst->DstReg.Index][0].inited && +		!c->wm_regs[inst->DstReg.File][inst->DstReg.Index][1].inited && +		(IS_G4X(intel->intelScreen->deviceID) || intel->gen == 5)) { +		int grf; + +		for (grf = c->first_free_grf & ~1; +		     grf < BRW_WM_MAX_GRF; +		     grf += 2) +		{ +		    if (!c->used_grf[grf] && !c->used_grf[grf + 1]) { +			c->used_grf[grf] = GL_TRUE; +			c->used_grf[grf + 1] = GL_TRUE; +			c->first_free_grf = grf + 2;  /* a guess */ + +			set_reg(c, inst->DstReg.File, inst->DstReg.Index, 0, +				brw_vec8_grf(grf, 0)); +			set_reg(c, inst->DstReg.File, inst->DstReg.Index, 1, +				brw_vec8_grf(grf + 1, 0)); +			break; +		    } +		} +	    } +	default: +	    break; +	} +    } +      /* An instruction may reference up to three constants.       * They'll be found in these registers.       * XXX alloc these on demand! @@ -529,12 +570,35 @@ static struct brw_reg get_src_reg(struct brw_wm_compile *c,      const GLuint nr = 1;      const GLuint component = GET_SWZ(src->Swizzle, channel); -    /* Extended swizzle terms */ -    if (component == SWIZZLE_ZERO) { -       return brw_imm_f(0.0F); -    } -    else if (component == SWIZZLE_ONE) { -       return brw_imm_f(1.0F); +    /* Only one immediate value can be used per native opcode, and it +     * has be in the src1 slot, so not all Mesa instructions will get +     * to take advantage of immediate constants. +     */ +    if (brw_wm_arg_can_be_immediate(inst->Opcode, srcRegIndex)) { +       const struct gl_program_parameter_list *params; + +       params = c->fp->program.Base.Parameters; + +       /* Extended swizzle terms */ +       if (component == SWIZZLE_ZERO) { +	  return brw_imm_f(0.0F); +       } else if (component == SWIZZLE_ONE) { +	  if (src->Negate) +	     return brw_imm_f(-1.0F); +	  else +	     return brw_imm_f(1.0F); +       } + +       if (src->File == PROGRAM_CONSTANT) { +	  float f = params->ParameterValues[src->Index][component]; + +	  if (src->Abs) +	     f = fabs(f); +	  if (src->Negate) +	     f = -f; + +	  return brw_imm_f(f); +       }      }      if (c->fp->use_const_buffer && @@ -2029,8 +2093,9 @@ static void brw_wm_emit_glsl(struct brw_context *brw, struct brw_wm_compile *c)                 }                 break;  	    default: -		printf("unsupported IR in fragment shader %d\n", -			inst->Opcode); +		printf("unsupported opcode %d (%s) in fragment shader\n", +		       inst->Opcode, inst->Opcode < MAX_OPCODE ? +		       _mesa_opcode_string(inst->Opcode) : "unknown");  	}  	/* Release temporaries containing any unaliased source regs. */ diff --git a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c index ce0bf0b97d..6b9e566886 100644 --- a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c +++ b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c @@ -261,7 +261,7 @@ brw_update_texture_surface( GLcontext *ctx, GLuint unit )     key.format = firstImage->TexFormat;     key.internal_format = firstImage->InternalFormat; -   key.pitch = intelObj->mt->pitch; +   key.pitch = intelObj->mt->region->pitch;     key.depth = firstImage->Depth;     key.bo = intelObj->mt->region->buffer;     key.offset = 0; diff --git a/src/mesa/drivers/dri/i965/gen6_clip_state.c b/src/mesa/drivers/dri/i965/gen6_clip_state.c index 06f8145e32..acc4b7f101 100644 --- a/src/mesa/drivers/dri/i965/gen6_clip_state.c +++ b/src/mesa/drivers/dri/i965/gen6_clip_state.c @@ -55,7 +55,7 @@ upload_clip_state(struct brw_context *brw)     OUT_BATCH(GEN6_CLIP_STATISTICS_ENABLE);     OUT_BATCH(GEN6_CLIP_ENABLE |  	     GEN6_CLIP_API_OGL | -	     GEN6_CLIP_MODE_REJECT_ALL | /* XXX: debug: get VS working */ +	     GEN6_CLIP_MODE_NORMAL |  	     GEN6_CLIP_XY_TEST |  	     depth_clamp |  	     provoking); diff --git a/src/mesa/drivers/dri/i965/gen6_gs_state.c b/src/mesa/drivers/dri/i965/gen6_gs_state.c index 161e7b85c2..cefc93ba48 100644 --- a/src/mesa/drivers/dri/i965/gen6_gs_state.c +++ b/src/mesa/drivers/dri/i965/gen6_gs_state.c @@ -50,7 +50,8 @@ upload_gs_state(struct brw_context *brw)        BEGIN_BATCH(7);        OUT_BATCH(CMD_3D_GS_STATE << 16 | (7 - 2));        OUT_RELOC(brw->gs.prog_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0); -      OUT_BATCH((0 << GEN6_GS_SAMPLER_COUNT_SHIFT) | +      OUT_BATCH(GEN6_GS_SPF_MODE | +		(0 << GEN6_GS_SAMPLER_COUNT_SHIFT) |  		(0 << GEN6_GS_BINDING_TABLE_ENTRY_COUNT_SHIFT));        OUT_BATCH(0); /* scratch space base offset */        OUT_BATCH((1 << GEN6_GS_DISPATCH_START_GRF_SHIFT) | diff --git a/src/mesa/drivers/dri/i965/gen6_vs_state.c b/src/mesa/drivers/dri/i965/gen6_vs_state.c index fe597dfb94..5916a13994 100644 --- a/src/mesa/drivers/dri/i965/gen6_vs_state.c +++ b/src/mesa/drivers/dri/i965/gen6_vs_state.c @@ -100,7 +100,8 @@ upload_vs_state(struct brw_context *brw)  	     (brw->vs.prog_data->urb_read_length << GEN6_VS_URB_READ_LENGTH_SHIFT) |  	     (0 << GEN6_VS_URB_ENTRY_READ_OFFSET_SHIFT));     OUT_BATCH((0 << GEN6_VS_MAX_THREADS_SHIFT) | -	     GEN6_VS_STATISTICS_ENABLE); +	     GEN6_VS_STATISTICS_ENABLE | +	     GEN6_VS_ENABLE);     ADVANCE_BATCH();     intel_batchbuffer_emit_mi_flush(intel->batch); diff --git a/src/mesa/drivers/dri/i965/server/intel_dri.c b/src/mesa/drivers/dri/i965/server/intel_dri.c deleted file mode 120000 index effdd26448..0000000000 --- a/src/mesa/drivers/dri/i965/server/intel_dri.c +++ /dev/null @@ -1 +0,0 @@ -../../intel/server/intel_dri.c
\ No newline at end of file diff --git a/src/mesa/drivers/dri/intel/intel_blit.c b/src/mesa/drivers/dri/intel/intel_blit.c index 4ad42a7c28..167140d274 100644 --- a/src/mesa/drivers/dri/intel/intel_blit.c +++ b/src/mesa/drivers/dri/intel/intel_blit.c @@ -119,22 +119,8 @@ intelEmitCopyBlit(struct intel_context *intel,             break;     } while (pass < 2); -   if (pass >= 2) { -      drm_intel_gem_bo_map_gtt(dst_buffer); -      drm_intel_gem_bo_map_gtt(src_buffer); -      _mesa_copy_rect((GLubyte *)dst_buffer->virtual + dst_offset, -		      cpp, -		      dst_pitch, -		      dst_x, dst_y, -		      w, h, -		      (GLubyte *)src_buffer->virtual + src_offset, -		      src_pitch, -		      src_x, src_y); -      drm_intel_gem_bo_unmap_gtt(src_buffer); -      drm_intel_gem_bo_unmap_gtt(dst_buffer); - -      return GL_TRUE; -   } +   if (pass >= 2) +      return GL_FALSE;     intel_batchbuffer_require_space(intel->batch, 8 * 4);     DBG("%s src:buf(%p)/%d+%d %d,%d dst:buf(%p)/%d+%d %d,%d sz:%dx%d\n", @@ -480,6 +466,7 @@ intel_emit_linear_blit(struct intel_context *intel,  		       unsigned int size)  {     GLuint pitch, height; +   GLboolean ok;     /* Blits are in a different ringbuffer so we don't use them. */     assert(intel->gen < 6); @@ -487,25 +474,27 @@ intel_emit_linear_blit(struct intel_context *intel,     /* The pitch is a signed value. */     pitch = MIN2(size, (1 << 15) - 1);     height = size / pitch; -   intelEmitCopyBlit(intel, 1, -		     pitch, src_bo, src_offset, I915_TILING_NONE, -		     pitch, dst_bo, dst_offset, I915_TILING_NONE, -		     0, 0, /* src x/y */ -		     0, 0, /* dst x/y */ -		     pitch, height, /* w, h */ -		     GL_COPY); +   ok = intelEmitCopyBlit(intel, 1, +			  pitch, src_bo, src_offset, I915_TILING_NONE, +			  pitch, dst_bo, dst_offset, I915_TILING_NONE, +			  0, 0, /* src x/y */ +			  0, 0, /* dst x/y */ +			  pitch, height, /* w, h */ +			  GL_COPY); +   assert(ok);     src_offset += pitch * height;     dst_offset += pitch * height;     size -= pitch * height;     assert (size < (1 << 15));     if (size != 0) { -      intelEmitCopyBlit(intel, 1, -			size, src_bo, src_offset, I915_TILING_NONE, -			size, dst_bo, dst_offset, I915_TILING_NONE, -			0, 0, /* src x/y */ -			0, 0, /* dst x/y */ -			size, 1, /* w, h */ -			GL_COPY); +      ok = intelEmitCopyBlit(intel, 1, +			     size, src_bo, src_offset, I915_TILING_NONE, +			     size, dst_bo, dst_offset, I915_TILING_NONE, +			     0, 0, /* src x/y */ +			     0, 0, /* dst x/y */ +			     size, 1, /* w, h */ +			     GL_COPY); +      assert(ok);     }  } diff --git a/src/mesa/drivers/dri/intel/intel_context.c b/src/mesa/drivers/dri/intel/intel_context.c index 0a7dcb80c6..9077a61132 100644 --- a/src/mesa/drivers/dri/intel/intel_context.c +++ b/src/mesa/drivers/dri/intel/intel_context.c @@ -63,7 +63,7 @@ int INTEL_DEBUG = (0);  #endif -#define DRIVER_DATE                     "20100328 2010Q1" +#define DRIVER_DATE                     "20100330 DEVELOPMENT"  #define DRIVER_DATE_GEM                 "GEM " DRIVER_DATE @@ -389,7 +389,7 @@ intel_prepare_render(struct intel_context *intel)     __DRIcontext *driContext = intel->driContext;     __DRIdrawable *drawable; -   drawable = intel->driDrawable; +   drawable = driContext->driDrawablePriv;     if (drawable->dri2.stamp != driContext->dri2.draw_stamp) {        if (drawable->lastStamp != drawable->dri2.stamp)  	 intel_update_renderbuffers(driContext, drawable); @@ -397,7 +397,7 @@ intel_prepare_render(struct intel_context *intel)        driContext->dri2.draw_stamp = drawable->dri2.stamp;     } -   drawable = intel->driReadDrawable; +   drawable = driContext->driReadablePriv;     if (drawable->dri2.stamp != driContext->dri2.read_stamp) {        if (drawable->lastStamp != drawable->dri2.stamp)  	 intel_update_renderbuffers(driContext, drawable); @@ -444,6 +444,7 @@ static const struct dri_debug_control debug_control[] = {     { "sing",  DEBUG_SINGLE_THREAD },     { "thre",  DEBUG_SINGLE_THREAD },     { "wm",    DEBUG_WM }, +   { "glsl_force", DEBUG_GLSL_FORCE },     { "urb",   DEBUG_URB },     { "vs",    DEBUG_VS },     { NULL,    0 } @@ -471,6 +472,7 @@ void  intel_flush(GLcontext *ctx, GLboolean needs_mi_flush)  {     struct intel_context *intel = intel_context(ctx); +    __DRIcontext *driContext = intel->driContext;     if (intel->Fallback)        _swrast_flush(ctx); @@ -487,9 +489,10 @@ intel_flush(GLcontext *ctx, GLboolean needs_mi_flush)        if (screen->dri2.loader &&            (screen->dri2.loader->base.version >= 2)  	  && (screen->dri2.loader->flushFrontBuffer != NULL) && -          intel->driDrawable && intel->driDrawable->loaderPrivate) { -	 (*screen->dri2.loader->flushFrontBuffer)(intel->driDrawable, -						  intel->driDrawable->loaderPrivate); +          driContext->driDrawablePriv && +	  driContext->driDrawablePriv->loaderPrivate) { +	 (*screen->dri2.loader->flushFrontBuffer)(driContext->driDrawablePriv, +						  driContext->driDrawablePriv->loaderPrivate);  	 /* Only clear the dirty bit if front-buffer rendering is no longer  	  * enabled.  This is done so that the dirty bit can only be set in @@ -606,7 +609,6 @@ intelInitContext(struct intel_context *intel,     driContextPriv->driverPrivate = intel;     intel->intelScreen = intelScreen; -   intel->driScreen = sPriv;     intel->driContext = driContextPriv;     intel->driFd = sPriv->fd; @@ -635,8 +637,7 @@ intelInitContext(struct intel_context *intel,     }     driParseConfigFiles(&intel->optionCache, &intelScreen->optionCache, -                       intel->driScreen->myNum, -		       (intel->gen >= 4) ? "i965" : "i915"); +                       sPriv->myNum, (intel->gen >= 4) ? "i965" : "i915");     if (intelScreen->deviceID == PCI_CHIP_I865_G)        intel->maxBatchSize = 4096;     else @@ -844,14 +845,6 @@ intelDestroyContext(__DRIcontext * driContextPriv)  GLboolean  intelUnbindContext(__DRIcontext * driContextPriv)  { -   struct intel_context *intel = -      (struct intel_context *) driContextPriv->driverPrivate; - -   /* Deassociate the context with the drawables. -    */ -   intel->driDrawable = NULL; -   intel->driReadDrawable = NULL; -     return GL_TRUE;  } @@ -880,8 +873,6 @@ intelMakeCurrent(__DRIcontext * driContextPriv,        struct gl_framebuffer *fb = driDrawPriv->driverPrivate;        struct gl_framebuffer *readFb = driReadPriv->driverPrivate; -      intel->driReadDrawable = driReadPriv; -      intel->driDrawable = driDrawPriv;        driContextPriv->dri2.draw_stamp = driDrawPriv->dri2.stamp - 1;        driContextPriv->dri2.read_stamp = driReadPriv->dri2.stamp - 1;        intel_prepare_render(intel); diff --git a/src/mesa/drivers/dri/intel/intel_context.h b/src/mesa/drivers/dri/intel/intel_context.h index 22736a9327..c4bb2bed8e 100644 --- a/src/mesa/drivers/dri/intel/intel_context.h +++ b/src/mesa/drivers/dri/intel/intel_context.h @@ -243,9 +243,6 @@ struct intel_context     int driFd;     __DRIcontext *driContext; -   __DRIdrawable *driDrawable; -   __DRIdrawable *driReadDrawable; -   __DRIscreen *driScreen;     struct intel_screen *intelScreen;     /** @@ -342,6 +339,7 @@ extern int INTEL_DEBUG;  #define DEBUG_WM        0x800000  #define DEBUG_URB       0x1000000  #define DEBUG_VS        0x2000000 +#define DEBUG_GLSL_FORCE 0x4000000  #define DBG(...) do {						\  	if (INTEL_DEBUG & FILE_DEBUG_FLAG)			\ diff --git a/src/mesa/drivers/dri/intel/intel_fbo.c b/src/mesa/drivers/dri/intel/intel_fbo.c index ba3bb8fdba..8278d12bb9 100644 --- a/src/mesa/drivers/dri/intel/intel_fbo.c +++ b/src/mesa/drivers/dri/intel/intel_fbo.c @@ -568,7 +568,7 @@ intel_render_texture(GLcontext * ctx,  				  att->Zoffset,  				  &dst_x, &dst_y); -   intel_image->mt->region->draw_offset = (dst_y * intel_image->mt->pitch + +   intel_image->mt->region->draw_offset = (dst_y * intel_image->mt->region->pitch +  					   dst_x) * intel_image->mt->cpp;     intel_image->mt->region->draw_x = dst_x;     intel_image->mt->region->draw_y = dst_y; diff --git a/src/mesa/drivers/dri/intel/intel_mipmap_tree.c b/src/mesa/drivers/dri/intel/intel_mipmap_tree.c index 5b6b4b2624..ef1966ea7e 100644 --- a/src/mesa/drivers/dri/intel/intel_mipmap_tree.c +++ b/src/mesa/drivers/dri/intel/intel_mipmap_tree.c @@ -83,7 +83,6 @@ intel_miptree_create_internal(struct intel_context *intel,     mt->cpp = compress_byte ? compress_byte : cpp;     mt->compressed = compress_byte ? 1 : 0;     mt->refcount = 1;  -   mt->pitch = 0;  #ifdef I915     if (intel->is_945) @@ -136,7 +135,7 @@ intel_miptree_create(struct intel_context *intel,     /*      * pitch == 0 || height == 0  indicates the null texture      */ -   if (!mt || !mt->pitch || !mt->total_height) { +   if (!mt || !mt->total_height) {        free(mt);        return NULL;     } @@ -144,10 +143,9 @@ intel_miptree_create(struct intel_context *intel,     mt->region = intel_region_alloc(intel,  				   tiling,  				   mt->cpp, -				   mt->pitch, +				   mt->total_width,  				   mt->total_height,  				   expect_accelerated_upload); -   mt->pitch = mt->region->pitch;     if (!mt->region) {         free(mt); @@ -178,71 +176,11 @@ intel_miptree_create_for_region(struct intel_context *intel,     if (!mt)        return mt; -   /* The mipmap tree pitch is aligned to 64 bytes to make sure render -    * to texture works, but we don't need that for texturing from a -    * pixmap.  Just override it here. */ -   mt->pitch = region->pitch; -     intel_region_reference(&mt->region, region);     return mt;  } - -/** - * intel_miptree_pitch_align: - * - * @intel: intel context pointer - * - * @mt: the miptree to compute pitch alignment for - * - * @pitch: the natural pitch value - * - * Given @pitch, compute a larger value which accounts for - * any necessary alignment required by the device - */ -int intel_miptree_pitch_align (struct intel_context *intel, -			       struct intel_mipmap_tree *mt, -			       uint32_t tiling, -			       int pitch) -{ -#ifdef I915 -   GLcontext *ctx = &intel->ctx; -#endif - -   if (!mt->compressed) { -      int pitch_align; - -      /* XXX: Align pitch to multiple of 64 bytes for now to allow -       * render-to-texture to work in all cases. This should probably be -       * replaced at some point by some scheme to only do this when really -       * necessary. -       */ -      pitch_align = 64; - -      if (tiling == I915_TILING_X) -	 pitch_align = 512; -      else if (tiling == I915_TILING_Y) -	 pitch_align = 128; - -      pitch = ALIGN(pitch * mt->cpp, pitch_align); - -#ifdef I915 -      /* Do a little adjustment to linear allocations so that we avoid -       * hitting the same channel of memory for 2 different pages when -       * reading a 2x2 subspan or doing bilinear filtering. -       */ -      if (tiling == I915_TILING_NONE && !(pitch & 511) && -	 (pitch + pitch_align) < (1 << ctx->Const.MaxTextureLevels)) -	 pitch += pitch_align; -#endif - -      pitch /= mt->cpp; -   } -   return pitch; -} - -  void  intel_miptree_reference(struct intel_mipmap_tree **dst,                          struct intel_mipmap_tree *src) @@ -342,13 +280,12 @@ intel_miptree_set_level_info(struct intel_mipmap_tree *mt,     mt->level[level].width = w;     mt->level[level].height = h;     mt->level[level].depth = d; -   mt->level[level].level_offset = (x + y * mt->pitch) * mt->cpp;     mt->level[level].level_x = x;     mt->level[level].level_y = y;     mt->level[level].nr_images = nr_images; -   DBG("%s level %d size: %d,%d,%d offset %d,%d (0x%x)\n", __FUNCTION__, -       level, w, h, d, x, y, mt->level[level].level_offset); +   DBG("%s level %d size: %d,%d,%d offset %d,%d\n", __FUNCTION__, +       level, w, h, d, x, y);     assert(nr_images);     assert(!mt->level[level].x_offset); @@ -415,7 +352,7 @@ intel_miptree_image_map(struct intel_context * intel,     DBG("%s \n", __FUNCTION__);     if (row_stride) -      *row_stride = mt->pitch * mt->cpp; +      *row_stride = mt->region->pitch * mt->cpp;     if (mt->target == GL_TEXTURE_3D) {        int i; @@ -424,7 +361,7 @@ intel_miptree_image_map(struct intel_context * intel,  	 intel_miptree_get_image_offset(mt, level, face, i,  					&x, &y); -	 image_offsets[i] = x + y * mt->pitch; +	 image_offsets[i] = x + y * mt->region->pitch;        }        return intel_region_map(intel, mt->region); @@ -435,7 +372,7 @@ intel_miptree_image_map(struct intel_context * intel,        image_offsets[0] = 0;        return intel_region_map(intel, mt->region) + -	 (x + y * mt->pitch) * mt->cpp; +	 (x + y * mt->region->pitch) * mt->cpp;     }  } @@ -527,13 +464,13 @@ intel_miptree_image_copy(struct intel_context *intel,  	 src_ptr = intel_region_map(intel, src->region);  	 dst_ptr = intel_region_map(intel, dst->region); -	 _mesa_copy_rect(dst_ptr + dst->cpp * (dst_x + dst_y * dst->pitch), +	 _mesa_copy_rect(dst_ptr,  			 dst->cpp, -			 dst->pitch, -			 0, 0, width, height, -			 src_ptr + src->cpp * (src_x + src_y * src->pitch), -			 src->pitch, -			 0, 0); +			 dst->region->pitch, +			 dst_x, dst_y, width, height, +			 src_ptr, +			 src->region->pitch, +			 src_x, src_y);  	 intel_region_unmap(intel, src->region);  	 intel_region_unmap(intel, dst->region);        } diff --git a/src/mesa/drivers/dri/intel/intel_mipmap_tree.h b/src/mesa/drivers/dri/intel/intel_mipmap_tree.h index b19c548def..21db2f4d3b 100644 --- a/src/mesa/drivers/dri/intel/intel_mipmap_tree.h +++ b/src/mesa/drivers/dri/intel/intel_mipmap_tree.h @@ -62,14 +62,6 @@   */  struct intel_mipmap_level  { -   /** -    * Byte offset to the base of this level. -    * -    * This is used for mipmap levels of 1D/2D/3D textures.  However, CUBE -    * layouts spread images around the whole tree, so the level offset is -    * always zero in that case. -    */ -   GLuint level_offset;     /** Offset to this miptree level, used in computing x_offset. */     GLuint level_x;     /** Offset to this miptree level, used in computing y_offset. */ @@ -81,8 +73,8 @@ struct intel_mipmap_level     /** Number of images at this level: 1 for 1D/2D, 6 for CUBE, depth for 3D */     GLuint nr_images; -   /** -    * Byte offset from level_offset to the image for each cube face or depth +   /** @{ +    * offsets from level_[xy] to the image for each cube face or depth      * level.      *      * Pretty much have to accept that hardware formats @@ -91,6 +83,7 @@ struct intel_mipmap_level      * so have to store them as a lookup table.      */     GLuint *x_offset, *y_offset; +   /** @} */  };  struct intel_mipmap_tree @@ -109,8 +102,7 @@ struct intel_mipmap_tree     /* Derived from the above:      */ -   GLuint pitch; -   GLuint depth_pitch;          /* per-image on i945? */ +   GLuint total_width;     GLuint total_height;     /* Includes image offset tables: diff --git a/src/mesa/drivers/dri/intel/intel_screen.c b/src/mesa/drivers/dri/intel/intel_screen.c index 6e4bb64365..5e3f40836d 100644 --- a/src/mesa/drivers/dri/intel/intel_screen.c +++ b/src/mesa/drivers/dri/intel/intel_screen.c @@ -312,18 +312,13 @@ intelCreateBuffer(__DRIscreen * driScrnPriv,        }        if (mesaVis->depthBits == 24) { -	 if (mesaVis->stencilBits == 8) { -	    /* combined depth/stencil buffer */ -	    struct intel_renderbuffer *depthStencilRb -	       = intel_create_renderbuffer(MESA_FORMAT_S8_Z24); -	    /* note: bind RB to two attachment points */ -	    _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &depthStencilRb->Base); -	    _mesa_add_renderbuffer(fb, BUFFER_STENCIL, &depthStencilRb->Base); -	 } else { -	    struct intel_renderbuffer *depthRb -	       = intel_create_renderbuffer(MESA_FORMAT_X8_Z24); -	    _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &depthRb->Base); -	 } +	 assert(mesaVis->stencilBits == 8); +	 /* combined depth/stencil buffer */ +	 struct intel_renderbuffer *depthStencilRb +	    = intel_create_renderbuffer(MESA_FORMAT_S8_Z24); +	 /* note: bind RB to two attachment points */ +	 _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &depthStencilRb->Base); +	 _mesa_add_renderbuffer(fb, BUFFER_STENCIL, &depthStencilRb->Base);        }        else if (mesaVis->depthBits == 16) {           /* just 16-bit depth buffer, no hw stencil */ diff --git a/src/mesa/drivers/dri/intel/intel_span.c b/src/mesa/drivers/dri/intel/intel_span.c index 377f3a8627..c1e15d1b0f 100644 --- a/src/mesa/drivers/dri/intel/intel_span.c +++ b/src/mesa/drivers/dri/intel/intel_span.c @@ -134,7 +134,7 @@ intel_set_span_functions(struct intel_context *intel,     (*(uint32_t *)(irb->region->buffer->virtual + NO_TILE(_x, _y)) = d)  #define READ_DEPTH(d, _x, _y) \     d = *(uint32_t *)(irb->region->buffer->virtual + NO_TILE(_x, _y)) -#define TAG(x) intel_##x##_z24_x8 +#define TAG(x) intel_##x##_z24_s8  #include "depthtmp.h"  void @@ -361,7 +361,7 @@ intel_set_span_functions(struct intel_context *intel,        break;     case MESA_FORMAT_X8_Z24:     case MESA_FORMAT_S8_Z24: -      intel_InitDepthPointers_z24_x8(rb); +      intel_InitDepthPointers_z24_s8(rb);        break;     default:        _mesa_problem(NULL, diff --git a/src/mesa/drivers/dri/intel/intel_tex_copy.c b/src/mesa/drivers/dri/intel/intel_tex_copy.c index 13b8bcfa86..62e1e78f59 100644 --- a/src/mesa/drivers/dri/intel/intel_tex_copy.c +++ b/src/mesa/drivers/dri/intel/intel_tex_copy.c @@ -130,18 +130,8 @@ do_copy_texsubimage(struct intel_context *intel,        }        if (ctx->ReadBuffer->Name == 0) { -	 /* reading from a window, adjust x, y */ -	 const __DRIdrawable *dPriv = intel->driReadDrawable; -	 y = dPriv->y + (dPriv->h - (y + height)); -	 x += dPriv->x; - -	 /* Invert the data coming from the source rectangle due to GL -	  * and hardware disagreeing on where y=0 is. -	  * -	  * It appears that our offsets and pitches get mangled -	  * appropriately by the hardware, and we don't need to adjust them -	  * on our own. -	  */ +	 /* Flip vertical orientation for system framebuffers */ +	 y = ctx->ReadBuffer->Height - (y + height);  	 src_pitch = -src->pitch;        } else {  	 /* reading from a FBO, y is already oriented the way we like */ @@ -155,7 +145,7 @@ do_copy_texsubimage(struct intel_context *intel,  			     src->buffer,  			     0,  			     src->tiling, -			     intelImage->mt->pitch, +			     intelImage->mt->region->pitch,  			     dst_bo,  			     0,  			     intelImage->mt->region->tiling, diff --git a/src/mesa/drivers/dri/intel/intel_tex_image.c b/src/mesa/drivers/dri/intel/intel_tex_image.c index bac36eeb56..9db96acdc0 100644 --- a/src/mesa/drivers/dri/intel/intel_tex_image.c +++ b/src/mesa/drivers/dri/intel/intel_tex_image.c @@ -236,7 +236,7 @@ try_pbo_upload(struct intel_context *intel,  				  intelImage->face, 0,  				  &dst_x, &dst_y); -   dst_stride = intelImage->mt->pitch; +   dst_stride = intelImage->mt->region->pitch;     if (drm_intel_bo_references(intel->batch->buf, dst_buffer))        intelFlush(&intel->ctx); @@ -290,7 +290,7 @@ try_pbo_zcopy(struct intel_context *intel,  				  intelImage->face, 0,  				  &dst_x, &dst_y); -   dst_stride = intelImage->mt->pitch; +   dst_stride = intelImage->mt->region->pitch;     if (src_stride != dst_stride || dst_x != 0 || dst_y != 0 ||         src_offset != 0) { diff --git a/src/mesa/drivers/dri/intel/intel_tex_layout.c b/src/mesa/drivers/dri/intel/intel_tex_layout.c index 7d69ea4484..d132e19e83 100644 --- a/src/mesa/drivers/dri/intel/intel_tex_layout.c +++ b/src/mesa/drivers/dri/intel/intel_tex_layout.c @@ -74,14 +74,14 @@ void i945_miptree_layout_2d( struct intel_context *intel,     GLuint width = mt->width0;     GLuint height = mt->height0; -   mt->pitch = mt->width0; +   mt->total_width = mt->width0;     intel_get_texture_alignment_unit(mt->internal_format, &align_w, &align_h);     if (mt->compressed) { -       mt->pitch = ALIGN(mt->width0, align_w); +       mt->total_width = ALIGN(mt->width0, align_w);     } -   /* May need to adjust pitch to accomodate the placement of +   /* May need to adjust width to accomodate the placement of      * the 2nd mipmap.  This occurs when the alignment      * constraints of mipmap placement push the right edge of the      * 2nd mipmap out past the width of its parent. @@ -97,15 +97,11 @@ void i945_miptree_layout_2d( struct intel_context *intel,                 + minify(minify(mt->width0));         } -       if (mip1_width > mt->pitch) { -           mt->pitch = mip1_width; +       if (mip1_width > mt->total_width) { +           mt->total_width = mip1_width;         }     } -   /* Pitch must be a whole number of dwords, even though we -    * express it in texels. -    */ -   mt->pitch = intel_miptree_pitch_align (intel, mt, tiling, mt->pitch);     mt->total_height = 0;     for ( level = mt->first_level ; level <= mt->last_level ; level++ ) { diff --git a/src/mesa/drivers/dri/intel/server/intel_dri.c b/src/mesa/drivers/dri/intel/server/intel_dri.c deleted file mode 100644 index e49c4214ad..0000000000 --- a/src/mesa/drivers/dri/intel/server/intel_dri.c +++ /dev/null @@ -1,1306 +0,0 @@ -/** - * \file server/intel_dri.c - * \brief File to perform the device-specific initialization tasks typically - * done in the X server. - * - * Here they are converted to run in the client (or perhaps a standalone - * process), and to work with the frame buffer device rather than the X - * server infrastructure. - *  - * Copyright (C) 2006 Dave Airlie (airlied@linux.ie) - - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sub license, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: -  - The above copyright notice and this permission notice (including the - next paragraph) shall be included in all copies or substantial portions - of the Software. -  - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. - IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND/OR THEIR SUPPLIERS BE LIABLE FOR - ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <errno.h> -#include <unistd.h> - -#include "driver.h" -#include "drm.h" - -#include "intel.h" -#include "i830_dri.h" - -#include "memops.h" -#include "pciaccess.h" - -static size_t drm_page_size; -static int nextTile = 0; -#define xf86DrvMsg(...) do {} while(0) - -static const int pitches[] = { -  128 * 8, -  128 * 16, -  128 * 32, -  128 * 64, -  0 -}; - -static Bool I830DRIDoMappings(DRIDriverContext *ctx, I830Rec *pI830, drmI830Sarea *sarea); - -static unsigned long -GetBestTileAlignment(unsigned long size) -{ -   unsigned long i; - -   for (i = KB(512); i < size; i <<= 1) -      ; - -   if (i > MB(64)) -      i = MB(64); - -   return i; -} - -static void SetFenceRegs(const DRIDriverContext *ctx, I830Rec *pI830) -{ -  int i; -  unsigned char *MMIO = ctx->MMIOAddress; - -  for (i = 0; i < 8; i++) { -    OUTREG(FENCE + i * 4, pI830->Fence[i]); -    //    if (I810_DEBUG & DEBUG_VERBOSE_VGA) -    fprintf(stderr,"Fence Register : %x\n", pI830->Fence[i]); -  } -} - -/* Tiled memory is good... really, really good... - * - * Need to make it less likely that we miss out on this - probably - * need to move the frontbuffer away from the 'guarenteed' alignment - * of the first memory segment, or perhaps allocate a discontigous - * framebuffer to get more alignment 'sweet spots'. - */ -static void -SetFence(const DRIDriverContext *ctx, I830Rec *pI830, -	 int nr, unsigned int start, unsigned int pitch, -         unsigned int size) -{ -   unsigned int val; -   unsigned int fence_mask = 0; -   unsigned int fence_pitch; - -   if (nr < 0 || nr > 7) { -      fprintf(stderr, -		 "SetFence: fence %d out of range\n",nr); -      return; -   } - -   pI830->Fence[nr] = 0; - -   if (IS_I9XX(pI830)) -   	fence_mask = ~I915G_FENCE_START_MASK; -   else -   	fence_mask = ~I830_FENCE_START_MASK; - -   if (start & fence_mask) { -      fprintf(stderr, -		 "SetFence: %d: start (0x%08x) is not %s aligned\n", -		 nr, start, (IS_I9XX(pI830)) ? "1MB" : "512k"); -      return; -   } - -   if (start % size) { -      fprintf(stderr, -		 "SetFence: %d: start (0x%08x) is not size (%dk) aligned\n", -		 nr, start, size / 1024); -      return; -   } - -   if (pitch & 127) { -      fprintf(stderr, -		 "SetFence: %d: pitch (%d) not a multiple of 128 bytes\n", -		 nr, pitch); -      return; -   } - -   val = (start | FENCE_X_MAJOR | FENCE_VALID); - -   if (IS_I9XX(pI830)) { -   	switch (size) { -	   case MB(1): -      		val |= I915G_FENCE_SIZE_1M; -      		break; -   	   case MB(2): -      		val |= I915G_FENCE_SIZE_2M; -      		break; -   	   case MB(4): -      		val |= I915G_FENCE_SIZE_4M; -      		break; -   	   case MB(8): -      		val |= I915G_FENCE_SIZE_8M; -      		break; -   	   case MB(16): -      		val |= I915G_FENCE_SIZE_16M; -      		break; -   	   case MB(32): -      		val |= I915G_FENCE_SIZE_32M; -      		break; -   	   case MB(64): -      		val |= I915G_FENCE_SIZE_64M; -      		break; -   	   default: -      		fprintf(stderr, -		 "SetFence: %d: illegal size (%d kByte)\n", nr, size / 1024); -      		return; -   	} -    } else { -   	switch (size) { -	   case KB(512): -      		val |= FENCE_SIZE_512K; -      		break; -	   case MB(1): -      		val |= FENCE_SIZE_1M; -      		break; -   	   case MB(2): -      		val |= FENCE_SIZE_2M; -      		break; -   	   case MB(4): -      		val |= FENCE_SIZE_4M; -      		break; -   	   case MB(8): -      		val |= FENCE_SIZE_8M; -      		break; -   	   case MB(16): -      		val |= FENCE_SIZE_16M; -      		break; -   	   case MB(32): -      		val |= FENCE_SIZE_32M; -      		break; -   	   case MB(64): -      		val |= FENCE_SIZE_64M; -      		break; -   	   default: -      		fprintf(stderr, -		 "SetFence: %d: illegal size (%d kByte)\n", nr, size / 1024); -      		return; -   	} -   } - -   if (IS_I9XX(pI830)) -	fence_pitch = pitch / 512; -   else -	fence_pitch = pitch / 128; - -   switch (fence_pitch) { -   case 1: -      val |= FENCE_PITCH_1; -      break; -   case 2: -      val |= FENCE_PITCH_2; -      break; -   case 4: -      val |= FENCE_PITCH_4; -      break; -   case 8: -      val |= FENCE_PITCH_8; -      break; -   case 16: -      val |= FENCE_PITCH_16; -      break; -   case 32: -      val |= FENCE_PITCH_32; -      break; -   case 64: -      val |= FENCE_PITCH_64; -      break; -   default: -      fprintf(stderr, -		 "SetFence: %d: illegal pitch (%d)\n", nr, pitch); -      return; -   } - -   pI830->Fence[nr] = val; -} - -static Bool -MakeTiles(const DRIDriverContext *ctx, I830Rec *pI830, I830MemRange *pMem) -{ -   int pitch, ntiles, i; - -   pitch = pMem->Pitch * ctx->cpp; -   /* -    * Simply try to break the region up into at most four pieces of size -    * equal to the alignment. -    */ -   ntiles = ROUND_TO(pMem->Size, pMem->Alignment) / pMem->Alignment; -   if (ntiles >= 4) { -      return FALSE; -   } - -   for (i = 0; i < ntiles; i++, nextTile++) { -     SetFence(ctx, pI830, nextTile, pMem->Start + i * pMem->Alignment, -	       pitch, pMem->Alignment); -   } -   return TRUE; -} - -static void I830SetupMemoryTiling(const DRIDriverContext *ctx, I830Rec *pI830) -{ -  int i; - -  /* Clear out */ -  for (i = 0; i < 8; i++) -    pI830->Fence[i] = 0; -   -  nextTile = 0; - -  if (pI830->BackBuffer.Alignment >= KB(512)) { -    if (MakeTiles(ctx, pI830, &(pI830->BackBuffer))) { -      fprintf(stderr, -		 "Activating tiled memory for the back buffer.\n"); -    } else { -      fprintf(stderr, -		 "MakeTiles failed for the back buffer.\n"); -      pI830->allowPageFlip = FALSE; -    } -  } -   -  if (pI830->DepthBuffer.Alignment >= KB(512)) { -    if (MakeTiles(ctx, pI830, &(pI830->DepthBuffer))) { -      fprintf(stderr, -		 "Activating tiled memory for the depth buffer.\n"); -    } else { -      fprintf(stderr, -		 "MakeTiles failed for the depth buffer.\n"); -    } -  } - -  return; -} - -static int I830DetectMemory(const DRIDriverContext *ctx, I830Rec *pI830) -{ -  struct pci_device host_bridge, ig_dev; -  uint32_t gmch_ctrl; -  int memsize = 0; -  int range; -  uint32_t aper_size; -  uint32_t membase2 = 0; -       -  memset(&host_bridge, 0, sizeof(host_bridge)); -  memset(&ig_dev, 0, sizeof(ig_dev)); - -  ig_dev.dev = 2; - -  pci_device_cfg_read_u32(&host_bridge, &gmch_ctrl, I830_GMCH_CTRL); - -  if (IS_I830(pI830) || IS_845G(pI830)) { -    if ((gmch_ctrl & I830_GMCH_MEM_MASK) == I830_GMCH_MEM_128M) { -      aper_size = 0x80000000; -    } else { -      aper_size = 0x40000000; -    } -  } else { -    if (IS_I9XX(pI830)) { -      int ret; -      ret = pci_device_cfg_read_u32(&ig_dev, &membase2, 0x18); -      if (membase2 & 0x08000000) -	aper_size = 0x8000000; -      else -	aper_size = 0x10000000; - -      fprintf(stderr,"aper size is %08X %08x %d\n", aper_size, membase2, ret); -    } else -      aper_size = 0x8000000; -  } - -  pI830->aper_size = aper_size; - - -  /* We need to reduce the stolen size, by the GTT and the popup. -   * The GTT varying according the the FbMapSize and the popup is 4KB */ -  range = (ctx->shared.fbSize / (1024*1024)) + 4; - -   if (IS_I85X(pI830) || IS_I865G(pI830) || IS_I9XX(pI830)) { -      switch (gmch_ctrl & I830_GMCH_GMS_MASK) { -      case I855_GMCH_GMS_STOLEN_1M: -	 memsize = MB(1) - KB(range); -	 break; -      case I855_GMCH_GMS_STOLEN_4M: -	 memsize = MB(4) - KB(range); -	 break; -      case I855_GMCH_GMS_STOLEN_8M: -	 memsize = MB(8) - KB(range); -	 break; -      case I855_GMCH_GMS_STOLEN_16M: -	 memsize = MB(16) - KB(range); -	 break; -      case I855_GMCH_GMS_STOLEN_32M: -	 memsize = MB(32) - KB(range); -	 break; -      case I915G_GMCH_GMS_STOLEN_48M: -	 if (IS_I9XX(pI830)) -	    memsize = MB(48) - KB(range); -	 break; -      case I915G_GMCH_GMS_STOLEN_64M: -	 if (IS_I9XX(pI830)) -	    memsize = MB(64) - KB(range); -	 break; -      } -   } else { -      switch (gmch_ctrl & I830_GMCH_GMS_MASK) { -      case I830_GMCH_GMS_STOLEN_512: -	 memsize = KB(512) - KB(range); -	 break; -      case I830_GMCH_GMS_STOLEN_1024: -	 memsize = MB(1) - KB(range); -	 break; -      case I830_GMCH_GMS_STOLEN_8192: -	 memsize = MB(8) - KB(range); -	 break; -      case I830_GMCH_GMS_LOCAL: -	 memsize = 0; -	 xf86DrvMsg(pScrn->scrnIndex, X_WARNING, -		    "Local memory found, but won't be used.\n"); -	 break; -      } -   } -   if (memsize > 0) { -     fprintf(stderr, -		 "detected %d kB stolen memory.\n", memsize / 1024); -   } else { -     fprintf(stderr, -		 "no video memory detected.\n"); -   } -   return memsize; -} - -static int AgpInit(const DRIDriverContext *ctx, I830Rec *info) -{ -  unsigned long mode = 0x4; - -  if (drmAgpAcquire(ctx->drmFD) < 0) { -    fprintf(stderr, "[gart] AGP not available\n"); -    return 0; -  } -   -  if (drmAgpEnable(ctx->drmFD, mode) < 0) { -    fprintf(stderr, "[gart] AGP not enabled\n"); -    drmAgpRelease(ctx->drmFD); -    return 0; -  } -  else -    fprintf(stderr, "[gart] AGP enabled at %dx\n", ctx->agpmode); - -  return 1; -} - -/* - * Allocate memory from the given pool.  Grow the pool if needed and if - * possible. - */ -static unsigned long -AllocFromPool(const DRIDriverContext *ctx, I830Rec *pI830,  -	      I830MemRange *result, I830MemPool *pool, -	      long size, unsigned long alignment, int flags) -{ -   long needed, start, end; - -   if (!result || !pool || !size) -      return 0; - -   /* Calculate how much space is needed. */ -   if (alignment <= GTT_PAGE_SIZE) -      needed = size; -   else { -	 start = ROUND_TO(pool->Free.Start, alignment); -	 end = ROUND_TO(start + size, alignment); -	 needed = end - pool->Free.Start; -   } -   if (needed > pool->Free.Size) { -     return 0; -   } - -   result->Start = ROUND_TO(pool->Free.Start, alignment); -   pool->Free.Start += needed; -   result->End = pool->Free.Start; - -   pool->Free.Size = pool->Free.End - pool->Free.Start; -   result->Size = result->End - result->Start; -   result->Pool = pool; -   result->Alignment = alignment; -   return needed; -} - -static unsigned long AllocFromAGP(const DRIDriverContext *ctx, I830Rec *pI830, long size, unsigned long alignment, I830MemRange  *result) -{ -   unsigned long start, end; -   unsigned long newApStart, newApEnd; -   int ret; -   if (!result || !size) -      return 0; -    -   if (!alignment) -     alignment = 4; - -   start = ROUND_TO(pI830->MemoryAperture.Start, alignment); -   end = ROUND_TO(start + size, alignment); -   newApStart = end; -   newApEnd = pI830->MemoryAperture.End; - -   ret=drmAgpAlloc(ctx->drmFD, size, 0, &(result->Physical), (drm_handle_t *)&(result->Key)); -    -   if (ret) -   { -     fprintf(stderr,"drmAgpAlloc failed %d\n", ret); -     return 0; -   } -   pI830->allocatedMemory += size; -   pI830->MemoryAperture.Start = newApStart; -   pI830->MemoryAperture.End = newApEnd; -   pI830->MemoryAperture.Size = newApEnd - newApStart; -   //   pI830->FreeMemory -= size; -   result->Start = start; -   result->End = start + size; -   result->Size = size; -   result->Offset = start; -   result->Alignment = alignment; -   result->Pool = NULL; -   -   return size; -} - -unsigned long -I830AllocVidMem(const DRIDriverContext *ctx, I830Rec *pI830, -                I830MemRange *result, I830MemPool *pool, long size, -                unsigned long alignment, int flags) -{ -   unsigned long ret; - -   if (!result) -      return 0; - -   /* Make sure these are initialised. */ -   result->Size = 0; -   result->Key = -1; - -   if (!size) { -      return 0; -   } - -   if (pool->Free.Size < size) { -      ret = AllocFromAGP(ctx, pI830, size, alignment, result); -   } -   else { -      ret = AllocFromPool(ctx, pI830, result, pool, size, alignment, flags); -      if (ret == 0) -         ret = AllocFromAGP(ctx, pI830, size, alignment, result); -   } -   return ret; -} - -static Bool BindAgpRange(const DRIDriverContext *ctx, I830MemRange *mem) -{ -  if (!mem) -    return FALSE; -   -  if (mem->Key == -1) -    return TRUE; - -  return !drmAgpBind(ctx->drmFD, mem->Key, mem->Offset); -} - -/* simple memory allocation routines needed */ -/* put ring buffer in low memory */ -/* need to allocate front, back, depth buffers aligned correctly, -   allocate ring buffer,  -*/ - -/* */ -static Bool -I830AllocateMemory(const DRIDriverContext *ctx, I830Rec *pI830) -{ -  unsigned long size, ret; -  unsigned long lines, lineSize, align; - -  /* allocate ring buffer */ -  memset(pI830->LpRing, 0, sizeof(I830RingBuffer)); -  pI830->LpRing->mem.Key = -1; - -  size = PRIMARY_RINGBUFFER_SIZE; -   -  ret = I830AllocVidMem(ctx, pI830, &pI830->LpRing->mem, &pI830->StolenPool, size, 0x1000, 0); -   -  if (ret != size) -  { -    fprintf(stderr,"unable to allocate ring buffer %ld\n", ret); -    return FALSE; -  } - -  pI830->LpRing->tail_mask = pI830->LpRing->mem.Size - 1; - -   -  /* allocate front buffer */ -  memset(&(pI830->FrontBuffer), 0, sizeof(pI830->FrontBuffer)); -  pI830->FrontBuffer.Key = -1; -  pI830->FrontBuffer.Pitch = ctx->shared.virtualWidth; - -  align = KB(512);   - -  lineSize = ctx->shared.virtualWidth * ctx->cpp; -  lines = (ctx->shared.virtualHeight + 15) / 16 * 16; -  size = lineSize * lines; -  size = ROUND_TO_PAGE(size); - -  align = GetBestTileAlignment(size); - -  ret = I830AllocVidMem(ctx, pI830, &pI830->FrontBuffer, &pI830->StolenPool, size, align, 0); -  if (ret < size) -  { -    fprintf(stderr,"unable to allocate front buffer %ld\n", ret); -    return FALSE; -  } - -  memset(&(pI830->BackBuffer), 0, sizeof(pI830->BackBuffer)); -  pI830->BackBuffer.Key = -1; -  pI830->BackBuffer.Pitch = ctx->shared.virtualWidth; - -  ret = I830AllocVidMem(ctx, pI830, &pI830->BackBuffer, &pI830->StolenPool, size, align, 0); -  if (ret < size) -  { -    fprintf(stderr,"unable to allocate back buffer %ld\n", ret); -    return FALSE; -  } -   -  memset(&(pI830->DepthBuffer), 0, sizeof(pI830->DepthBuffer)); -  pI830->DepthBuffer.Key = -1; -  pI830->DepthBuffer.Pitch = ctx->shared.virtualWidth; - -  ret = I830AllocVidMem(ctx, pI830, &pI830->DepthBuffer, &pI830->StolenPool, size, align, 0); -  if (ret < size) -  { -    fprintf(stderr,"unable to allocate depth buffer %ld\n", ret); -    return FALSE; -  } - -  memset(&(pI830->ContextMem), 0, sizeof(pI830->ContextMem)); -  pI830->ContextMem.Key = -1; -  size = KB(32); - -  ret = I830AllocVidMem(ctx, pI830, &pI830->ContextMem, &pI830->StolenPool, size, align, 0); -  if (ret < size) -  { -    fprintf(stderr,"unable to allocate context buffer %ld\n", ret); -    return FALSE; -  } - -#if 0   -  memset(&(pI830->TexMem), 0, sizeof(pI830->TexMem)); -  pI830->TexMem.Key = -1; - -  size = 32768 * 1024; -  ret = AllocFromAGP(ctx, pI830, size, align, &pI830->TexMem); -  if (ret < size) -  { -    fprintf(stderr,"unable to allocate texture memory %ld\n", ret); -    return FALSE; -  } -#endif - -  return TRUE; -} - -static Bool -I830BindMemory(const DRIDriverContext *ctx, I830Rec *pI830) -{ -  if (!BindAgpRange(ctx, &pI830->LpRing->mem)) -    return FALSE; -  if (!BindAgpRange(ctx, &pI830->FrontBuffer)) -    return FALSE; -  if (!BindAgpRange(ctx, &pI830->BackBuffer)) -    return FALSE; -  if (!BindAgpRange(ctx, &pI830->DepthBuffer)) -    return FALSE; -  if (!BindAgpRange(ctx, &pI830->ContextMem)) -    return FALSE; -#if 0 -  if (!BindAgpRange(ctx, &pI830->TexMem)) -    return FALSE; -#endif -  return TRUE; -} - -static void SetupDRIMM(const DRIDriverContext *ctx, I830Rec *pI830) -{ -  unsigned long aperEnd = ROUND_DOWN_TO(pI830->aper_size, GTT_PAGE_SIZE) / GTT_PAGE_SIZE; -  unsigned long aperStart = ROUND_TO(pI830->aper_size - KB(32768), GTT_PAGE_SIZE) / GTT_PAGE_SIZE; - -  fprintf(stderr, "aper size is %08X\n", ctx->shared.fbSize); -  if (drmMMInit(ctx->drmFD, aperStart, aperEnd - aperStart, DRM_BO_MEM_TT)) { -      fprintf(stderr, -	      "DRM MM Initialization Failed\n"); -  } else { -    fprintf(stderr, -	    "DRM MM Initialized at offset 0x%lx length %d page\n", aperStart, aperEnd-aperStart); -  } - -} - -static Bool -I830CleanupDma(const DRIDriverContext *ctx) -{ -   drmI830Init info; - -   memset(&info, 0, sizeof(drmI830Init)); -   info.func = I830_CLEANUP_DMA; - -   if (drmCommandWrite(ctx->drmFD, DRM_I830_INIT, -		       &info, sizeof(drmI830Init))) { -     fprintf(stderr, "I830 Dma Cleanup Failed\n"); -      return FALSE; -   } - -   return TRUE; -} - -static Bool -I830InitDma(const DRIDriverContext *ctx, I830Rec *pI830) -{ -   I830RingBuffer *ring = pI830->LpRing; -   drmI830Init info; - -   memset(&info, 0, sizeof(drmI830Init)); -   info.func = I830_INIT_DMA; - -   info.ring_start = ring->mem.Start + pI830->LinearAddr; -   info.ring_end = ring->mem.End + pI830->LinearAddr; -   info.ring_size = ring->mem.Size; - -   info.mmio_offset = (unsigned int)ctx->MMIOStart; - -   info.sarea_priv_offset = sizeof(drm_sarea_t); - -   info.front_offset = pI830->FrontBuffer.Start; -   info.back_offset = pI830->BackBuffer.Start; -   info.depth_offset = pI830->DepthBuffer.Start; -   info.w = ctx->shared.virtualWidth; -   info.h = ctx->shared.virtualHeight; -   info.pitch = ctx->shared.virtualWidth; -   info.back_pitch = pI830->BackBuffer.Pitch; -   info.depth_pitch = pI830->DepthBuffer.Pitch; -   info.cpp = ctx->cpp; - -   if (drmCommandWrite(ctx->drmFD, DRM_I830_INIT, -		       &info, sizeof(drmI830Init))) { -      fprintf(stderr, -		 "I830 Dma Initialization Failed\n"); -      return FALSE; -   } - -   return TRUE; -} - -static int I830CheckDRMVersion( const DRIDriverContext *ctx, -				  I830Rec *pI830 ) -{ -   drmVersionPtr  version; - -   version = drmGetVersion(ctx->drmFD); - -   if (version) { -     int req_minor, req_patch; - -     req_minor = 4; -     req_patch = 0;	 - -     if (version->version_major != 1 || -	 version->version_minor < req_minor || -	 (version->version_minor == req_minor &&  -	  version->version_patchlevel < req_patch)) { -       /* Incompatible drm version */ -       fprintf(stderr, -	       "[dri] I830DRIScreenInit failed because of a version " -	       "mismatch.\n" -	       "[dri] i915.o kernel module version is %d.%d.%d " -	       "but version 1.%d.%d or newer is needed.\n" -	       "[dri] Disabling DRI.\n", -	       version->version_major, -	       version->version_minor, -	       version->version_patchlevel, -	       req_minor, -	       req_patch); -       drmFreeVersion(version); -       return 0; -     } -      -     pI830->drmMinor = version->version_minor; -     drmFreeVersion(version); -   } -   return 1; -} - -static void -I830SetRingRegs(const DRIDriverContext *ctx, I830Rec *pI830) -{ -  unsigned int itemp; -  unsigned char *MMIO = ctx->MMIOAddress; - -   OUTREG(LP_RING + RING_LEN, 0); -   OUTREG(LP_RING + RING_TAIL, 0); -   OUTREG(LP_RING + RING_HEAD, 0); - -   if ((long)(pI830->LpRing->mem.Start & I830_RING_START_MASK) != -       pI830->LpRing->mem.Start) { -      fprintf(stderr, -		 "I830SetRingRegs: Ring buffer start (%lx) violates its " -		 "mask (%x)\n", pI830->LpRing->mem.Start, I830_RING_START_MASK); -   } -   /* Don't care about the old value.  Reserved bits must be zero anyway. */ -   itemp = pI830->LpRing->mem.Start & I830_RING_START_MASK; -   OUTREG(LP_RING + RING_START, itemp); - -   if (((pI830->LpRing->mem.Size - 4096) & I830_RING_NR_PAGES) != -       pI830->LpRing->mem.Size - 4096) { -      fprintf(stderr, -		 "I830SetRingRegs: Ring buffer size - 4096 (%lx) violates its " -		 "mask (%x)\n", pI830->LpRing->mem.Size - 4096, -		 I830_RING_NR_PAGES); -   } -   /* Don't care about the old value.  Reserved bits must be zero anyway. */ -   itemp = (pI830->LpRing->mem.Size - 4096) & I830_RING_NR_PAGES; -   itemp |= (RING_NO_REPORT | RING_VALID); -   OUTREG(LP_RING + RING_LEN, itemp); - -   pI830->LpRing->head = INREG(LP_RING + RING_HEAD) & I830_HEAD_MASK; -   pI830->LpRing->tail = INREG(LP_RING + RING_TAIL); -   pI830->LpRing->space = pI830->LpRing->head - (pI830->LpRing->tail + 8); -   if (pI830->LpRing->space < 0) -      pI830->LpRing->space += pI830->LpRing->mem.Size; - -   SetFenceRegs(ctx, pI830); -    -   /* RESET THE DISPLAY PIPE TO POINT TO THE FRONTBUFFER - hacky -      hacky hacky */ -   OUTREG(DSPABASE, pI830->FrontBuffer.Start + pI830->LinearAddr); - -} - -static Bool -I830SetParam(const DRIDriverContext *ctx, int param, int value) -{ -   drmI830SetParam sp; - -   memset(&sp, 0, sizeof(sp)); -   sp.param = param; -   sp.value = value; - -   if (drmCommandWrite(ctx->drmFD, DRM_I830_SETPARAM, &sp, sizeof(sp))) { -      fprintf(stderr, "I830 SetParam Failed\n"); -      return FALSE; -   } - -   return TRUE; -} - -static Bool -I830DRIMapScreenRegions(DRIDriverContext *ctx, I830Rec *pI830, drmI830Sarea *sarea) -{ -   fprintf(stderr, -              "[drm] Mapping front buffer\n"); - -   if (drmAddMap(ctx->drmFD, -                 (drm_handle_t)(sarea->front_offset + pI830->LinearAddr), -                 sarea->front_size, -                 DRM_FRAME_BUFFER,  /*DRM_AGP,*/ -                 0, -                 &sarea->front_handle) < 0) { -     fprintf(stderr, -	     "[drm] drmAddMap(front_handle) failed. Disabling DRI\n"); -      return FALSE; -   } -   ctx->shared.hFrameBuffer = sarea->front_handle; -   ctx->shared.fbSize = sarea->front_size; -   fprintf(stderr, "[drm] Front Buffer = 0x%08x\n", -	   sarea->front_handle); - -   if (drmAddMap(ctx->drmFD, -                 (drm_handle_t)(sarea->back_offset), -                 sarea->back_size, DRM_AGP, 0, -                 &sarea->back_handle) < 0) { -      fprintf(stderr, -                 "[drm] drmAddMap(back_handle) failed. Disabling DRI\n"); -      return FALSE; -   } -   fprintf(stderr, "[drm] Back Buffer = 0x%08x\n", -              sarea->back_handle); - -   if (drmAddMap(ctx->drmFD, -                 (drm_handle_t)sarea->depth_offset, -                 sarea->depth_size, DRM_AGP, 0, -                 &sarea->depth_handle) < 0) { -      fprintf(stderr, -                 "[drm] drmAddMap(depth_handle) failed. Disabling DRI\n"); -      return FALSE; -   } -   fprintf(stderr, "[drm] Depth Buffer = 0x%08x\n", -              sarea->depth_handle); - -#if 0 -   if (drmAddMap(ctx->drmFD, -		 (drm_handle_t)sarea->tex_offset, -		 sarea->tex_size, DRM_AGP, 0, -		 &sarea->tex_handle) < 0) { -      fprintf(stderr, -		 "[drm] drmAddMap(tex_handle) failed. Disabling DRI\n"); -      return FALSE; -   } -   fprintf(stderr, "[drm] textures = 0x%08x\n", -	      sarea->tex_handle); -#endif -   return TRUE; -} - - -static void -I830DRIUnmapScreenRegions(const DRIDriverContext *ctx, I830Rec *pI830, drmI830Sarea *sarea) -{ -#if 1 -   if (sarea->front_handle) { -      drmRmMap(ctx->drmFD, sarea->front_handle); -      sarea->front_handle = 0; -   } -#endif -   if (sarea->back_handle) { -      drmRmMap(ctx->drmFD, sarea->back_handle); -      sarea->back_handle = 0; -   } -   if (sarea->depth_handle) { -      drmRmMap(ctx->drmFD, sarea->depth_handle); -      sarea->depth_handle = 0; -   } -   if (sarea->tex_handle) { -      drmRmMap(ctx->drmFD, sarea->tex_handle); -      sarea->tex_handle = 0; -   } -} - -static Bool -I830DRIDoMappings(DRIDriverContext *ctx, I830Rec *pI830, drmI830Sarea *sarea) -{ -  if (drmAddMap(ctx->drmFD, -		(drm_handle_t)pI830->LpRing->mem.Start, -		pI830->LpRing->mem.Size, DRM_AGP, 0, -		&pI830->ring_map) < 0) { -    fprintf(stderr, -	    "[drm] drmAddMap(ring_map) failed. Disabling DRI\n"); -    return FALSE; -  } -  fprintf(stderr, "[drm] ring buffer = 0x%08x\n", -	  pI830->ring_map); - -  if (I830InitDma(ctx, pI830) == FALSE) { -    return FALSE; -  } -   -   /* init to zero to be safe */ - -  I830DRIMapScreenRegions(ctx, pI830, sarea); -  SetupDRIMM(ctx, pI830); - -   if (ctx->pciDevice != PCI_CHIP_845_G && -       ctx->pciDevice != PCI_CHIP_I830_M) { -      I830SetParam(ctx, I830_SETPARAM_USE_MI_BATCHBUFFER_START, 1 ); -   } - -   /* Okay now initialize the dma engine */ -   { -      pI830->irq = drmGetInterruptFromBusID(ctx->drmFD, -					    ctx->pciBus, -					    ctx->pciDevice, -					    ctx->pciFunc); - -      if (drmCtlInstHandler(ctx->drmFD, pI830->irq)) { -	 fprintf(stderr, -		    "[drm] failure adding irq handler\n"); -	 pI830->irq = 0; -	 return FALSE; -      } -      else -	 fprintf(stderr, -		    "[drm] dma control initialized, using IRQ %d\n", -		    pI830->irq); -   } - -   fprintf(stderr, "[dri] visual configs initialized\n"); - -   return TRUE; -} - -static Bool -I830ClearScreen(DRIDriverContext *ctx, I830Rec *pI830, drmI830Sarea *sarea) -{ -  /* need to drmMap front and back buffers and zero them */ -  drmAddress map_addr; -  int ret; - -  ret = drmMap(ctx->drmFD, -	       sarea->front_handle, -	       sarea->front_size, -	       &map_addr); - -  if (ret) -  { -    fprintf(stderr, "Unable to map front buffer\n"); -    return FALSE; -  } - -  drimemsetio((char *)map_addr, -	      0, -	      sarea->front_size); -  drmUnmap(map_addr, sarea->front_size); - - -  ret = drmMap(ctx->drmFD, -	       sarea->back_handle, -	       sarea->back_size, -	       &map_addr); - -  if (ret) -  { -    fprintf(stderr, "Unable to map back buffer\n"); -    return FALSE; -  } - -  drimemsetio((char *)map_addr, -	      0, -	      sarea->back_size); -  drmUnmap(map_addr, sarea->back_size); - -  return TRUE; -} - -static Bool -I830ScreenInit(DRIDriverContext *ctx, I830Rec *pI830) -		   -{ -   I830DRIPtr pI830DRI; -   drmI830Sarea *pSAREAPriv; -   int err; -       -   drm_page_size = getpagesize();    - -   pI830->registerSize = ctx->MMIOSize; -   /* This is a hack for now.  We have to have more than a 4k page here -    * because of the size of the state.  However, the state should be -    * in a per-context mapping.  This will be added in the Mesa 3.5 port -    * of the I830 driver. -    */ -   ctx->shared.SAREASize = SAREA_MAX; - -   /* Note that drmOpen will try to load the kernel module, if needed. */ -   ctx->drmFD = drmOpen("i915", NULL ); -   if (ctx->drmFD < 0) { -      fprintf(stderr, "[drm] drmOpen failed\n"); -      return 0; -   } - -   if ((err = drmSetBusid(ctx->drmFD, ctx->pciBusID)) < 0) { -      fprintf(stderr, "[drm] drmSetBusid failed (%d, %s), %s\n", -	      ctx->drmFD, ctx->pciBusID, strerror(-err)); -      return 0; -   } - -   if (drmAddMap( ctx->drmFD, -		  0, -		  ctx->shared.SAREASize, -		  DRM_SHM, -		  DRM_CONTAINS_LOCK, -		  &ctx->shared.hSAREA) < 0) -   { -     fprintf(stderr, "[drm] drmAddMap failed\n"); -     return 0; -   } - -   fprintf(stderr, "[drm] added %d byte SAREA at 0x%08x\n", -	   ctx->shared.SAREASize, ctx->shared.hSAREA); -    -   if (drmMap( ctx->drmFD, -	       ctx->shared.hSAREA, -	       ctx->shared.SAREASize, -	       (drmAddressPtr)(&ctx->pSAREA)) < 0) -   { -      fprintf(stderr, "[drm] drmMap failed\n"); -      return 0; -    -   } -    -   memset(ctx->pSAREA, 0, ctx->shared.SAREASize); -   fprintf(stderr, "[drm] mapped SAREA 0x%08x to %p, size %d\n", -	   ctx->shared.hSAREA, ctx->pSAREA, ctx->shared.SAREASize); -    - -   if (drmAddMap(ctx->drmFD,  -		 ctx->MMIOStart, -		 ctx->MMIOSize, -		 DRM_REGISTERS,  -		 DRM_READ_ONLY,  -		 &pI830->registerHandle) < 0) { -      fprintf(stderr, "[drm] drmAddMap mmio failed\n");	 -      return 0; -   } -   fprintf(stderr, -	   "[drm] register handle = 0x%08x\n", pI830->registerHandle); - - -   if (!I830CheckDRMVersion(ctx, pI830)) { -     return FALSE; -   } - -   /* Create a 'server' context so we can grab the lock for -    * initialization ioctls. -    */ -   if ((err = drmCreateContext(ctx->drmFD, &ctx->serverContext)) != 0) { -      fprintf(stderr, "%s: drmCreateContext failed %d\n", __FUNCTION__, err); -      return 0; -   } - -   DRM_LOCK(ctx->drmFD, ctx->pSAREA, ctx->serverContext, 0);  - -   /* Initialize the SAREA private data structure */ -   pSAREAPriv = (drmI830Sarea *)(((char*)ctx->pSAREA) +  -				 sizeof(drm_sarea_t)); -   memset(pSAREAPriv, 0, sizeof(*pSAREAPriv)); - -   pI830->StolenMemory.Size = I830DetectMemory(ctx, pI830); -   pI830->StolenMemory.Start = 0; -   pI830->StolenMemory.End = pI830->StolenMemory.Size; - -   pI830->MemoryAperture.Start = pI830->StolenMemory.End; -   pI830->MemoryAperture.End = KB(40000); -   pI830->MemoryAperture.Size = pI830->MemoryAperture.End - pI830->MemoryAperture.Start; - -   pI830->StolenPool.Fixed = pI830->StolenMemory; -   pI830->StolenPool.Total = pI830->StolenMemory; -   pI830->StolenPool.Free = pI830->StolenPool.Total; -   pI830->FreeMemory = pI830->StolenPool.Total.Size; - -   if (!AgpInit(ctx, pI830)) -     return FALSE; - -   if (I830AllocateMemory(ctx, pI830) == FALSE) -   { -     return FALSE; -   } - -   if (I830BindMemory(ctx, pI830) == FALSE) -   { -     return FALSE; -   } - -   pSAREAPriv->rotated_offset = -1; -   pSAREAPriv->rotated_size = 0; -   pSAREAPriv->rotated_pitch = ctx->shared.virtualWidth; - -   pSAREAPriv->front_offset = pI830->FrontBuffer.Start; -   pSAREAPriv->front_size = pI830->FrontBuffer.Size; -   pSAREAPriv->width = ctx->shared.virtualWidth; -   pSAREAPriv->height = ctx->shared.virtualHeight; -   pSAREAPriv->pitch = ctx->shared.virtualWidth; -   pSAREAPriv->virtualX = ctx->shared.virtualWidth; -   pSAREAPriv->virtualY = ctx->shared.virtualHeight; -   pSAREAPriv->back_offset = pI830->BackBuffer.Start; -   pSAREAPriv->back_size = pI830->BackBuffer.Size; -   pSAREAPriv->depth_offset = pI830->DepthBuffer.Start; -   pSAREAPriv->depth_size = pI830->DepthBuffer.Size; -#if 0 -   pSAREAPriv->tex_offset = pI830->TexMem.Start; -   pSAREAPriv->tex_size = pI830->TexMem.Size; -#endif -   pSAREAPriv->log_tex_granularity = pI830->TexGranularity; - -   ctx->driverClientMsg = malloc(sizeof(I830DRIRec)); -   ctx->driverClientMsgSize = sizeof(I830DRIRec); -   pI830DRI = (I830DRIPtr)ctx->driverClientMsg; -   pI830DRI->deviceID = pI830->Chipset; -   pI830DRI->regsSize = I830_REG_SIZE; -   pI830DRI->width = ctx->shared.virtualWidth; -   pI830DRI->height = ctx->shared.virtualHeight; -   pI830DRI->mem = ctx->shared.fbSize; -   pI830DRI->cpp = ctx->cpp; - -   pI830DRI->bitsPerPixel = ctx->bpp; -   pI830DRI->sarea_priv_offset = sizeof(drm_sarea_t); -    -   err = I830DRIDoMappings(ctx, pI830, pSAREAPriv); -   if (err == FALSE) -       return FALSE; - -   I830SetupMemoryTiling(ctx, pI830); - -   /* Quick hack to clear the front & back buffers.  Could also use -    * the clear ioctl to do this, but would need to setup hw state -    * first. -    */ -   I830ClearScreen(ctx, pI830, pSAREAPriv); - -   I830SetRingRegs(ctx, pI830); - -   return TRUE; -} - - -/** - * \brief Validate the fbdev mode. - *  - * \param ctx display handle. - * - * \return one on success, or zero on failure. - * - * Saves some registers and returns 1. - * - * \sa radeonValidateMode(). - */ -static int i830ValidateMode( const DRIDriverContext *ctx ) -{ -  return 1; -} - -/** - * \brief Examine mode returned by fbdev. - *  - * \param ctx display handle. - * - * \return one on success, or zero on failure. - * - * Restores registers that fbdev has clobbered and returns 1. - * - * \sa i810ValidateMode(). - */ -static int i830PostValidateMode( const DRIDriverContext *ctx ) -{ -  I830Rec *pI830 = ctx->driverPrivate; - -  I830SetRingRegs(ctx, pI830); -  return 1; -} - - -/** - * \brief Initialize the framebuffer device mode - * - * \param ctx display handle. - * - * \return one on success, or zero on failure. - * - * Fills in \p info with some default values and some information from \p ctx - * and then calls I810ScreenInit() for the screen initialization. - *  - * Before exiting clears the framebuffer memory accessing it directly. - */ -static int i830InitFBDev( DRIDriverContext *ctx ) -{ -  I830Rec *pI830 = calloc(1, sizeof(I830Rec)); -  int i; - -   { -      int  dummy = ctx->shared.virtualWidth; - -      switch (ctx->bpp / 8) { -      case 1: dummy = (ctx->shared.virtualWidth + 127) & ~127; break; -      case 2: dummy = (ctx->shared.virtualWidth +  31) &  ~31; break; -      case 3: -      case 4: dummy = (ctx->shared.virtualWidth +  15) &  ~15; break; -      } - -      ctx->shared.virtualWidth = dummy; -      ctx->shared.Width = ctx->shared.virtualWidth; -   } - - -   for (i = 0; pitches[i] != 0; i++) { -     if (pitches[i] >= ctx->shared.virtualWidth) { -       ctx->shared.virtualWidth = pitches[i]; -       break; -     } -   } - -   ctx->driverPrivate = (void *)pI830; -    -   pI830->LpRing = calloc(1, sizeof(I830RingBuffer)); -   pI830->Chipset = ctx->chipset; -   pI830->LinearAddr = ctx->FBStart; - -   if (!I830ScreenInit( ctx, pI830 )) -      return 0; - -    -   return 1; -} - - -/** - * \brief The screen is being closed, so clean up any state and free any - * resources used by the DRI. - * - * \param ctx display handle. - * - * Unmaps the SAREA, closes the DRM device file descriptor and frees the driver - * private data. - */ -static void i830HaltFBDev( DRIDriverContext *ctx ) -{ -  drmI830Sarea *pSAREAPriv; -  I830Rec *pI830 = ctx->driverPrivate; - -   if (pI830->irq) { -       drmCtlUninstHandler(ctx->drmFD); -       pI830->irq = 0;   } - -   I830CleanupDma(ctx); - -  pSAREAPriv = (drmI830Sarea *)(((char*)ctx->pSAREA) +  -				sizeof(drm_sarea_t)); - -  I830DRIUnmapScreenRegions(ctx, pI830, pSAREAPriv); -  drmUnmap( ctx->pSAREA, ctx->shared.SAREASize ); -  drmClose(ctx->drmFD); -   -  if (ctx->driverPrivate) { -    free(ctx->driverPrivate); -    ctx->driverPrivate = 0; -  } -} - - -extern void i810NotifyFocus( int ); - -/** - * \brief Exported driver interface for Mini GLX. - * - * \sa DRIDriverRec. - */ -const struct DRIDriverRec __driDriver = { -   i830ValidateMode, -   i830PostValidateMode, -   i830InitFBDev, -   i830HaltFBDev, -   NULL,//I830EngineShutdown, -   NULL, //I830EngineRestore,   -#ifndef _EMBEDDED -   0, -#else -   i810NotifyFocus,  -#endif -}; diff --git a/src/mesa/drivers/dri/mach64/Makefile b/src/mesa/drivers/dri/mach64/Makefile index a8f463e9fd..c20fdece29 100644 --- a/src/mesa/drivers/dri/mach64/Makefile +++ b/src/mesa/drivers/dri/mach64/Makefile @@ -5,9 +5,6 @@ include $(TOP)/configs/current  LIBNAME = mach64_dri.so -# Not yet -# MINIGLX_SOURCES = server/mach64_dri.c  -  DRIVER_SOURCES = \  	mach64_context.c \  	mach64_ioctl.c \ diff --git a/src/mesa/drivers/dri/mach64/mach64_context.c b/src/mesa/drivers/dri/mach64/mach64_context.c index 77e7e53ce0..73b1e08d4b 100644 --- a/src/mesa/drivers/dri/mach64/mach64_context.c +++ b/src/mesa/drivers/dri/mach64/mach64_context.c @@ -31,6 +31,7 @@  #include "main/glheader.h"  #include "main/context.h" +#include "main/extensions.h"  #include "main/simple_list.h"  #include "main/imports.h" diff --git a/src/mesa/drivers/dri/mga/Makefile b/src/mesa/drivers/dri/mga/Makefile index 0cc329fb22..92533bccc2 100644 --- a/src/mesa/drivers/dri/mga/Makefile +++ b/src/mesa/drivers/dri/mga/Makefile @@ -5,8 +5,6 @@ include $(TOP)/configs/current  LIBNAME = mga_dri.so -MINIGLX_SOURCES = server/mga_dri.c  -  DRIVER_SOURCES = \  	mgadd.c \  	mgaioctl.c \ diff --git a/src/mesa/drivers/dri/mga/server/mga_dri.c b/src/mesa/drivers/dri/mga/server/mga_dri.c deleted file mode 100644 index bc575e62ee..0000000000 --- a/src/mesa/drivers/dri/mga/server/mga_dri.c +++ /dev/null @@ -1,1088 +0,0 @@ - -/* - * Copyright 2000 VA Linux Systems Inc., Fremont, California. - * All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES - * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - * - * Authors: - *    Keith Whitwell <keith@tungstengraphics.com> - *    Gareth Hughes <gareth@valinux.com> - */ - -#include <errno.h> -#include <unistd.h> -#include <string.h> -#include <stdio.h> -#include <stdlib.h> -#include <inttypes.h> - -#include "driver.h" -#include "drm.h" -#include "memops.h" - -#include "mga_reg.h" -#include "mga.h" -#include "mga_macros.h" -#include "mga_dri.h" - - -/* Quiescence, locking - */ -#define MGA_TIMEOUT		2048 - -static void MGAWaitForIdleDMA( struct DRIDriverContextRec *ctx, MGAPtr pMga ) -{ -   drm_lock_t lock; -   int ret; -   int i = 0; - -   memset( &lock, 0, sizeof(lock) ); - -   for (;;) { -      do { -         /* first ask for quiescent and flush */ -         lock.flags = DRM_LOCK_QUIESCENT | DRM_LOCK_FLUSH; -         do { -	    ret = drmCommandWrite( ctx->drmFD, DRM_MGA_FLUSH, -                                   &lock, sizeof( lock ) ); -         } while ( ret == -EBUSY && i++ < DRM_MGA_IDLE_RETRY ); - -         /* if it's still busy just try quiescent */ -         if ( ret == -EBUSY ) {  -            lock.flags = DRM_LOCK_QUIESCENT; -            do { -	       ret = drmCommandWrite( ctx->drmFD, DRM_MGA_FLUSH, -                                      &lock, sizeof( lock ) ); -            } while ( ret == -EBUSY && i++ < DRM_MGA_IDLE_RETRY ); -         } -      } while ( ( ret == -EBUSY ) && ( i++ < MGA_TIMEOUT ) ); - -      if ( ret == 0 ) -	 return; - -      fprintf( stderr, -               "[dri] Idle timed out, resetting engine...\n" ); - -      drmCommandNone( ctx->drmFD, DRM_MGA_RESET ); -   } -} - -static unsigned int mylog2( unsigned int n ) -{ -   unsigned int log2 = 1; -   while ( n > 1 ) n >>= 1, log2++; -   return log2; -} - -static int MGADRIAgpInit(struct DRIDriverContextRec *ctx, MGAPtr pMga) -{ -   unsigned long mode; -   unsigned int vendor, device; -   int ret, count, i; - -   if(pMga->agpSize < 12)pMga->agpSize = 12; -   if(pMga->agpSize > 64)pMga->agpSize = 64; /* cap */ - -   /* FIXME: Make these configurable... -    */ -   pMga->agp.size = pMga->agpSize * 1024 * 1024; - -   pMga->warp.offset = 0; -   pMga->warp.size = MGA_WARP_UCODE_SIZE; - -   pMga->primary.offset = (pMga->warp.offset + -				    pMga->warp.size); -   pMga->primary.size = 1024 * 1024; - -   pMga->buffers.offset = (pMga->primary.offset + -				    pMga->primary.size); -   pMga->buffers.size = MGA_NUM_BUFFERS * MGA_BUFFER_SIZE; - - -   pMga->agpTextures.offset = (pMga->buffers.offset + -                                    pMga->buffers.size); - -   pMga->agpTextures.size = pMga->agp.size - -                                     pMga->agpTextures.offset; - -   if ( drmAgpAcquire( ctx->drmFD ) < 0 ) { -     fprintf( stderr, "[agp] AGP not available\n" ); -      return 0; -   } - -   mode   = drmAgpGetMode( ctx->drmFD );        /* Default mode */ -   vendor = drmAgpVendorId( ctx->drmFD ); -   device = drmAgpDeviceId( ctx->drmFD ); - -   mode &= ~MGA_AGP_MODE_MASK; -   switch ( pMga->agpMode ) { -   case 4: -      mode |= MGA_AGP_4X_MODE; -   case 2: -      mode |= MGA_AGP_2X_MODE; -   case 1: -   default: -      mode |= MGA_AGP_1X_MODE; -   } - -#if 0 -   fprintf( stderr, -            "[agp] Mode 0x%08lx [AGP 0x%04x/0x%04x; Card 0x%04x/0x%04x]\n", -            mode, vendor, device, -            ctx->pciVendor, -            ctx->pciChipType ); -#endif - -   if ( drmAgpEnable( ctx->drmFD, mode ) < 0 ) { -     fprintf( stderr, "[agp] AGP not enabled\n" ); -      drmAgpRelease( ctx->drmFD ); -      return 0; -   } - -   if ( pMga->Chipset == PCI_CHIP_MGAG200 ) { -      switch ( pMga->agpMode ) { -      case 2: -	 fprintf( stderr, -		     "[drm] Enabling AGP 2x PLL encoding\n" ); -	 OUTREG( MGAREG_AGP_PLL, MGA_AGP2XPLL_ENABLE ); -	 break; - -      case 1: -      default: -	 fprintf( stderr, -		     "[drm] Disabling AGP 2x PLL encoding\n" ); -	 OUTREG( MGAREG_AGP_PLL, MGA_AGP2XPLL_DISABLE ); -	 pMga->agpMode = 1; -	 break; -      } -   } - -   ret = drmAgpAlloc( ctx->drmFD, pMga->agp.size, -		      0, NULL, &pMga->agp.handle ); -   if ( ret < 0 ) { -      fprintf( stderr, "[agp] Out of memory (%d)\n", ret ); -      drmAgpRelease( ctx->drmFD ); -      return 0; -   } -   fprintf( stderr, -	       "[agp] %d kB allocated with handle 0x%08x\n", -	       pMga->agp.size/1024, (unsigned int)pMga->agp.handle ); - -   if ( drmAgpBind( ctx->drmFD, pMga->agp.handle, 0 ) < 0 ) { -      fprintf( stderr, "[agp] Could not bind memory\n" ); -      drmAgpFree( ctx->drmFD, pMga->agp.handle ); -      drmAgpRelease( ctx->drmFD ); -      return 0; -   } - -   /* WARP microcode space -    */ -   if ( drmAddMap( ctx->drmFD, -		   pMga->warp.offset, -		   pMga->warp.size, -		   DRM_AGP, DRM_READ_ONLY, -		   &pMga->warp.handle ) < 0 ) { -      fprintf( stderr, -		  "[agp] Could not add WARP microcode mapping\n" ); -      return 0; -   } -   fprintf( stderr, - 	       "[agp] WARP microcode handle = 0x%08x\n", -	       pMga->warp.handle ); - -   if ( drmMap( ctx->drmFD, -		pMga->warp.handle, -		pMga->warp.size, -		&pMga->warp.map ) < 0 ) { -      fprintf( stderr, -		  "[agp] Could not map WARP microcode\n" ); -      return 0; -   } -   fprintf( stderr, -	       "[agp] WARP microcode mapped at 0x%08lx\n", -	       (unsigned long)pMga->warp.map ); - -   /* Primary DMA space -    */ -   if ( drmAddMap( ctx->drmFD, -		   pMga->primary.offset, -		   pMga->primary.size, -		   DRM_AGP, DRM_READ_ONLY, -		   &pMga->primary.handle ) < 0 ) { -      fprintf( stderr, -		  "[agp] Could not add primary DMA mapping\n" ); -      return 0; -   } -   fprintf( stderr, - 	       "[agp] Primary DMA handle = 0x%08x\n", -	       pMga->primary.handle ); - -   if ( drmMap( ctx->drmFD, -		pMga->primary.handle, -		pMga->primary.size, -		&pMga->primary.map ) < 0 ) { -      fprintf( stderr, -		  "[agp] Could not map primary DMA\n" ); -      return 0; -   } -   fprintf( stderr, -	       "[agp] Primary DMA mapped at 0x%08lx\n", -	       (unsigned long)pMga->primary.map ); - -   /* DMA buffers -    */ -   if ( drmAddMap( ctx->drmFD, -		   pMga->buffers.offset, -		   pMga->buffers.size, -		   DRM_AGP, 0, -		   &pMga->buffers.handle ) < 0 ) { -      fprintf( stderr, -		  "[agp] Could not add DMA buffers mapping\n" ); -      return 0; -   } -   fprintf( stderr, - 	       "[agp] DMA buffers handle = 0x%08x\n", -	       pMga->buffers.handle ); - -   if ( drmMap( ctx->drmFD, -		pMga->buffers.handle, -		pMga->buffers.size, -		&pMga->buffers.map ) < 0 ) { -      fprintf( stderr, -		  "[agp] Could not map DMA buffers\n" ); -      return 0; -   } -   fprintf( stderr, -	       "[agp] DMA buffers mapped at 0x%08lx\n", -	       (unsigned long)pMga->buffers.map ); - -   count = drmAddBufs( ctx->drmFD, -		       MGA_NUM_BUFFERS, MGA_BUFFER_SIZE, -		       DRM_AGP_BUFFER, pMga->buffers.offset ); -   if ( count <= 0 ) { -      fprintf( stderr, -		  "[drm] failure adding %d %d byte DMA buffers\n", -		  MGA_NUM_BUFFERS, MGA_BUFFER_SIZE ); -      return 0; -   } -   fprintf( stderr, -	       "[drm] Added %d %d byte DMA buffers\n", -	       count, MGA_BUFFER_SIZE ); - -   i = mylog2(pMga->agpTextures.size / MGA_NR_TEX_REGIONS); -   if(i < MGA_LOG_MIN_TEX_REGION_SIZE) -      i = MGA_LOG_MIN_TEX_REGION_SIZE; -   pMga->agpTextures.size = (pMga->agpTextures.size >> i) << i; - -   if ( drmAddMap( ctx->drmFD, -                   pMga->agpTextures.offset, -                   pMga->agpTextures.size, -                   DRM_AGP, 0, -                   &pMga->agpTextures.handle ) < 0 ) { -      fprintf( stderr, -                  "[agp] Could not add agpTexture mapping\n" ); -      return 0; -   } -/* should i map it ? */ -   fprintf( stderr, -               "[agp] agpTexture handle = 0x%08x\n", -               pMga->agpTextures.handle ); -   fprintf( stderr, -               "[agp] agpTexture size: %d kb\n", pMga->agpTextures.size/1024 ); - -   return 1; -} - -static int MGADRIMapInit( struct DRIDriverContextRec *ctx, MGAPtr pMga ) -{ -   pMga->registers.size = MGAIOMAPSIZE; - -   if ( drmAddMap( ctx->drmFD, -		   (drm_handle_t)pMga->IOAddress, -		   pMga->registers.size, -		   DRM_REGISTERS, DRM_READ_ONLY, -		   &pMga->registers.handle ) < 0 ) { -      fprintf( stderr, -		  "[drm] Could not add MMIO registers mapping\n" ); -      return 0; -   } -   fprintf( stderr, -	       "[drm] Registers handle = 0x%08lx\n", -	       pMga->registers.handle ); - -   pMga->status.size = SAREA_MAX; - -   if ( drmAddMap( ctx->drmFD, 0, pMga->status.size, -		   DRM_SHM, DRM_READ_ONLY | DRM_LOCKED | DRM_KERNEL, -		   &pMga->status.handle ) < 0 ) { -      fprintf( stderr, -		  "[drm] Could not add status page mapping\n" ); -      return 0; -   } -   fprintf( stderr, - 	       "[drm] Status handle = 0x%08x\n", -	       pMga->status.handle ); - -   if ( drmMap( ctx->drmFD, -		pMga->status.handle, -		pMga->status.size, -		&pMga->status.map ) < 0 ) { -      fprintf( stderr, -		  "[agp] Could not map status page\n" ); -      return 0; -   } -   fprintf( stderr, -	       "[agp] Status page mapped at 0x%08lx\n", -	       (unsigned long)pMga->status.map ); - -   return 1; -} - -static int MGADRIKernelInit( struct DRIDriverContextRec *ctx, MGAPtr pMga ) -{ -   drm_mga_init_t init; -   int ret; - -   memset( &init, 0, sizeof(init) ); - -   init.func = MGA_INIT_DMA; -   init.sarea_priv_offset = sizeof(drm_sarea_t); - -   switch ( pMga->Chipset ) { -   case PCI_CHIP_MGAG550: -   case PCI_CHIP_MGAG400: -      init.chipset = MGA_CARD_TYPE_G400; -      break; -   case PCI_CHIP_MGAG200: -   case PCI_CHIP_MGAG200_PCI: -      init.chipset = MGA_CARD_TYPE_G200; -      break; -   default: -      return 0; -   } - -   init.sgram = 0; /* FIXME !pMga->HasSDRAM; */ - - -   switch (ctx->bpp) -     { -     case 16: -       init.maccess = MGA_MACCESS_PW16; -       break; -     case 32: -       init.maccess = MGA_MACCESS_PW32; -       break; -     default: -       fprintf( stderr, "[mga] invalid bpp (%d)\n", ctx->bpp ); -       return 0; -     } - - -   init.fb_cpp		= ctx->bpp / 8; -   init.front_offset	= pMga->frontOffset; -   init.front_pitch	= pMga->frontPitch / init.fb_cpp; -   init.back_offset	= pMga->backOffset; -   init.back_pitch	= pMga->backPitch / init.fb_cpp; - -   init.depth_cpp	= ctx->bpp / 8; -   init.depth_offset	= pMga->depthOffset; -   init.depth_pitch	= pMga->depthPitch / init.depth_cpp; - -   init.texture_offset[0] = pMga->textureOffset; -   init.texture_size[0] = pMga->textureSize; - -   init.fb_offset = ctx->shared.hFrameBuffer; -   init.mmio_offset = pMga->registers.handle; -   init.status_offset = pMga->status.handle; - -   init.warp_offset = pMga->warp.handle; -   init.primary_offset = pMga->primary.handle; -   init.buffers_offset = pMga->buffers.handle; - -   init.texture_offset[1] = pMga->agpTextures.handle; -   init.texture_size[1] = pMga->agpTextures.size; - -   ret = drmCommandWrite( ctx->drmFD, DRM_MGA_INIT, &init, sizeof(init)); -   if ( ret < 0 ) { -      fprintf( stderr, -		  "[drm] Failed to initialize DMA! (%d)\n", ret ); -      return 0; -   } - -   return 1; -} - -static void MGADRIIrqInit(struct DRIDriverContextRec *ctx, MGAPtr pMga) -{ -  if (!pMga->irq) -    { -      pMga->irq = drmGetInterruptFromBusID(ctx->drmFD, -                                           ctx->pciBus, -                                           ctx->pciDevice, -                                           ctx->pciFunc); - -      fprintf(stderr, "[drm] got IRQ %d\n", pMga->irq); - -    if((drmCtlInstHandler(ctx->drmFD, pMga->irq)) != 0) -      { -        fprintf(stderr, -                "[drm] failure adding irq handler, " -                "there is a device already using that irq\n" -                "[drm] falling back to irq-free operation\n"); -        pMga->irq = 0; -      } -    else -      { -        pMga->reg_ien = INREG( MGAREG_IEN ); -      } -    } - -  if (pMga->irq) -    fprintf(stderr, -            "[drm] dma control initialized, using IRQ %d\n", -            pMga->irq); -} - -static int MGADRIBuffersInit( struct DRIDriverContextRec *ctx, MGAPtr pMga ) -{ -   pMga->drmBuffers = drmMapBufs( ctx->drmFD ); -   if ( !pMga->drmBuffers ) -     { -       fprintf( stderr, -                "[drm] Failed to map DMA buffers list\n" ); -       return 0; -     } -    -   fprintf( stderr, -            "[drm] Mapped %d DMA buffers\n", -            pMga->drmBuffers->count ); - -   return 1; -} - -static int MGAMemoryInit( struct DRIDriverContextRec *ctx, MGAPtr pMga ) -{ -   int        width_bytes = ctx->shared.virtualWidth * ctx->cpp; -   int        bufferSize  = ((ctx->shared.virtualHeight * width_bytes -			      + MGA_BUFFER_ALIGN) -			     & ~MGA_BUFFER_ALIGN); -   int        depthSize   = ((((ctx->shared.virtualHeight+15) & ~15) * width_bytes -			      + MGA_BUFFER_ALIGN) -			     & ~MGA_BUFFER_ALIGN); -   int        l; - -   pMga->frontOffset = 0; -   pMga->frontPitch = ctx->shared.virtualWidth * ctx->cpp; - -   fprintf(stderr,  -	   "Using %d MB AGP aperture\n", pMga->agpSize); -   fprintf(stderr,  -	   "Using %d MB for vertex/indirect buffers\n", pMga->buffers.size>>20); -   fprintf(stderr,  -	   "Using %d MB for AGP textures\n", pMga->agpTextures.size>>20); - -   /* Front, back and depth buffers - everything else texture?? -    */ -   pMga->textureSize = ctx->shared.fbSize - 2 * bufferSize - depthSize; - -   if (pMga->textureSize < 0)  -      return 0; - -   l = mylog2( pMga->textureSize / MGA_NR_TEX_REGIONS ); -   if ( l < MGA_LOG_MIN_TEX_REGION_SIZE ) -      l = MGA_LOG_MIN_TEX_REGION_SIZE; - -   /* Round the texture size up to the nearest whole number of -    * texture regions.  Again, be greedy about this, don't -    * round down. -    */ -   pMga->logTextureGranularity = l; -   pMga->textureSize = (pMga->textureSize >> l) << l; - -   /* Set a minimum usable local texture heap size.  This will fit -    * two 256x256x32bpp textures. -    */ -   if (pMga->textureSize < 512 * 1024) { -      pMga->textureOffset = 0; -      pMga->textureSize = 0; -   } - -   /* Reserve space for textures */ -   pMga->textureOffset = ((ctx->shared.fbSize - pMga->textureSize + -			   MGA_BUFFER_ALIGN) & -			  ~MGA_BUFFER_ALIGN); - -   /* Reserve space for the shared depth -    * buffer. -    */ -   pMga->depthOffset = ((pMga->textureOffset - depthSize + -			 MGA_BUFFER_ALIGN) & -			~MGA_BUFFER_ALIGN); -   pMga->depthPitch = ctx->shared.virtualWidth * ctx->cpp; - -   pMga->backOffset = ((pMga->depthOffset - bufferSize + -			MGA_BUFFER_ALIGN) & -                        ~MGA_BUFFER_ALIGN); -   pMga->backPitch = ctx->shared.virtualWidth * ctx->cpp; - - -   fprintf(stderr,  -	   "Will use back buffer at offset 0x%x\n", -	   pMga->backOffset); -   fprintf(stderr,  -	   "Will use depth buffer at offset 0x%x\n", -	   pMga->depthOffset); -   fprintf(stderr,  -	   "Will use %d kb for textures at offset 0x%x\n", -	   pMga->textureSize/1024, pMga->textureOffset); - -   return 1; -}  - -static int MGACheckDRMVersion( struct DRIDriverContextRec *ctx, MGAPtr pMga ) -{ -  drmVersionPtr version; - -  /* Check the MGA DRM version */ -  version = drmGetVersion(ctx->drmFD); -  if ( version ) { -    if ( version->version_major != 3 || -         version->version_minor < 0 ) { -            /* incompatible drm version */ -      fprintf( stderr, -               "[dri] MGADRIScreenInit failed because of a version mismatch.\n" -               "[dri] mga.o kernel module version is %d.%d.%d but version 3.0.x is needed.\n" -               "[dri] Disabling DRI.\n", -               version->version_major, -               version->version_minor, -               version->version_patchlevel ); -      drmFreeVersion( version ); -      return 0; -    } -    drmFreeVersion( version ); -  } - -  return 1; -} - -static void print_client_msg( MGADRIPtr pMGADRI ) -{ -  fprintf( stderr, "chipset:                  %d\n", pMGADRI->chipset ); - -  fprintf( stderr, "width:                    %d\n", pMGADRI->width ); -  fprintf( stderr, "height:                   %d\n", pMGADRI->height ); -  fprintf( stderr, "mem:                      %d\n", pMGADRI->mem ); -  fprintf( stderr, "cpp:                      %d\n", pMGADRI->cpp ); - -  fprintf( stderr, "agpMode:                  %d\n", pMGADRI->agpMode ); - -  fprintf( stderr, "frontOffset:              %d\n", pMGADRI->frontOffset ); -  fprintf( stderr, "frontPitch:               %d\n", pMGADRI->frontPitch ); - -  fprintf( stderr, "backOffset:               %d\n", pMGADRI->backOffset ); -  fprintf( stderr, "backPitch:                %d\n", pMGADRI->backPitch ); - -  fprintf( stderr, "depthOffset:              %d\n", pMGADRI->depthOffset ); -  fprintf( stderr, "depthPitch:               %d\n", pMGADRI->depthPitch ); - -  fprintf( stderr, "textureOffset:            %d\n", pMGADRI->textureOffset ); -  fprintf( stderr, "textureSize:              %d\n", pMGADRI->textureSize ); - -  fprintf( stderr, "logTextureGranularity:    %d\n", pMGADRI->logTextureGranularity ); -  fprintf( stderr, "logAgpTextureGranularity: %d\n", pMGADRI->logAgpTextureGranularity ); - -  fprintf( stderr, "agpTextureHandle:         %u\n", (unsigned int)pMGADRI->agpTextureOffset ); -  fprintf( stderr, "agpTextureSize:           %u\n", (unsigned int)pMGADRI->agpTextureSize ); - -#if 0 -   pMGADRI->registers.handle	= pMga->registers.handle; -   pMGADRI->registers.size	= pMga->registers.size; -   pMGADRI->status.handle	= pMga->status.handle; -   pMGADRI->status.size		= pMga->status.size; -   pMGADRI->primary.handle	= pMga->primary.handle; -   pMGADRI->primary.size	= pMga->primary.size; -   pMGADRI->buffers.handle	= pMga->buffers.handle; -   pMGADRI->buffers.size	= pMga->buffers.size; -   pMGADRI->sarea_priv_offset = sizeof(drm_sarea_t); -#endif -} - -static int MGAScreenInit( struct DRIDriverContextRec *ctx, MGAPtr pMga ) -{ -  int       i; -  int       err; -  MGADRIPtr pMGADRI; - -  usleep(100); -  /*assert(!ctx->IsClient);*/ - -   { -      int  width_bytes = (ctx->shared.virtualWidth * ctx->cpp); -      int  maxy        = ctx->shared.fbSize / width_bytes; - - -      if (maxy <= ctx->shared.virtualHeight * 3) { -	 fprintf(stderr,  -		 "Static buffer allocation failed -- " -		 "need at least %d kB video memory (have %d kB)\n", -		 (ctx->shared.virtualWidth * ctx->shared.virtualHeight * -		  ctx->cpp * 3 + 1023) / 1024, -		 ctx->shared.fbSize / 1024); -	 return 0; -      }  -   } - -   switch(pMga->Chipset) { -   case PCI_CHIP_MGAG550: -   case PCI_CHIP_MGAG400: -   case PCI_CHIP_MGAG200: -#if 0 -   case PCI_CHIP_MGAG200_PCI: -#endif -      break; -   default: -      fprintf(stderr, "[drm] Direct rendering only supported with G200/G400/G550 AGP\n"); -      return 0; -   } - -   fprintf( stderr, -	       "[drm] bpp: %d depth: %d\n", -            ctx->bpp, ctx->bpp /* FIXME: depth */ ); - -   if ( (ctx->bpp / 8) != 2 && -	(ctx->bpp / 8) != 4 ) { -      fprintf( stderr, -		  "[dri] Direct rendering only supported in 16 and 32 bpp modes\n" ); -      return 0; -   } - -   ctx->shared.SAREASize = SAREA_MAX; - - -   /* Note that drmOpen will try to load the kernel module, if needed. */ -   ctx->drmFD = drmOpen("mga", NULL ); -   if (ctx->drmFD < 0) { -      fprintf(stderr, "[drm] drmOpen failed\n"); -      return 0; -   } - -   if ((err = drmSetBusid(ctx->drmFD, ctx->pciBusID)) < 0) { -      fprintf(stderr, "[drm] drmSetBusid failed (%d, %s), %s\n", -	      ctx->drmFD, ctx->pciBusID, strerror(-err)); -      return 0; -   } - -      -   if (drmAddMap( ctx->drmFD, -		  0, -		  ctx->shared.SAREASize, -		  DRM_SHM, -		  DRM_CONTAINS_LOCK, -		  &ctx->shared.hSAREA) < 0) -   { -      fprintf(stderr, "[drm] drmAddMap failed\n"); -      return 0; -   } -   fprintf(stderr, "[drm] added %d byte SAREA at 0x%08lx\n", -	   ctx->shared.SAREASize, ctx->shared.hSAREA); - -   if (drmMap( ctx->drmFD, -	       ctx->shared.hSAREA, -	       ctx->shared.SAREASize, -	       (drmAddressPtr)(&ctx->pSAREA)) < 0) -   { -      fprintf(stderr, "[drm] drmMap failed\n"); -      return 0; -   } -   memset(ctx->pSAREA, 0, ctx->shared.SAREASize); -   fprintf(stderr, "[drm] mapped SAREA 0x%08lx to %p, size %d\n", -	   ctx->shared.hSAREA, ctx->pSAREA, ctx->shared.SAREASize); -    -   /* Need to AddMap the framebuffer and mmio regions here: -    */ -   if (drmAddMap( ctx->drmFD, -		  (drm_handle_t)ctx->FBStart, -		  ctx->FBSize, -		  DRM_FRAME_BUFFER, -		  0, -		  &ctx->shared.hFrameBuffer) < 0) -   { -      fprintf(stderr, "[drm] drmAddMap framebuffer failed\n"); -      return 0; -   } -   fprintf(stderr, "[drm] framebuffer handle = 0x%08lx\n", -	   ctx->shared.hFrameBuffer); - - -#if 0 /* will be done in MGADRIMapInit */ -   if (drmAddMap(ctx->drmFD,  -		 ctx->FixedInfo.mmio_start, -		 ctx->FixedInfo.mmio_len, -		 DRM_REGISTERS,  -		 DRM_READ_ONLY,  -		 &pMga->registers.handle) < 0) { -      fprintf(stderr, "[drm] drmAddMap mmio failed\n");	 -      return 0; -   } -   fprintf(stderr, -	   "[drm] register handle = 0x%08lx\n", pMga->registers.handle); -#endif - - -   /* Check the mga DRM version */ -   if (!MGACheckDRMVersion(ctx, pMga)) { -      return 0; -   } - -   if ( !MGADRIAgpInit( ctx, pMga ) ) { -      return 0; -   } - -   if ( !MGADRIMapInit( ctx, pMga ) ) { -      return 0; -   } - -   /* Memory manager setup */ -   if (!MGAMemoryInit(ctx, pMga)) { -      return 0; -   } - - -   /* Create a 'server' context so we can grab the lock for -    * initialization ioctls. -    */ -   if ((err = drmCreateContext(ctx->drmFD, &ctx->serverContext)) != 0) { -      fprintf(stderr, "%s: drmCreateContext failed %d\n", __FUNCTION__, err); -      return 0; -   } - -   DRM_LOCK(ctx->drmFD, ctx->pSAREA, ctx->serverContext, 0);  - -   /* Initialize the kernel data structures */ -   if (!MGADRIKernelInit(ctx, pMga)) { -      fprintf(stderr, "MGADRIKernelInit failed\n"); -      DRM_UNLOCK(ctx->drmFD, ctx->pSAREA, ctx->serverContext); -      return 0; -   } - -   /* Initialize the vertex buffers list */ -   if (!MGADRIBuffersInit(ctx, pMga)) { -      fprintf(stderr, "MGADRIBuffersInit failed\n"); -      DRM_UNLOCK(ctx->drmFD, ctx->pSAREA, ctx->serverContext); -      return 0; -   } - -   /* Initialize IRQ */ -   MGADRIIrqInit(ctx, pMga); - - -   /* Initialize the SAREA private data structure */ -   { -      drm_mga_sarea_t *pSAREAPriv; -      pSAREAPriv = (drm_mga_sarea_t *)(((char*)ctx->pSAREA) +  -					sizeof(drm_sarea_t)); -      memset(pSAREAPriv, 0, sizeof(*pSAREAPriv)); -   } - -   /* Quick hack to clear the front & back buffers.  Could also use -    * the clear ioctl to do this, but would need to setup hw state -    * first. -    */ -   drimemsetio((char *)ctx->FBAddress + pMga->frontOffset, -	  0, -	  pMga->frontPitch * ctx->shared.virtualHeight ); - -   drimemsetio((char *)ctx->FBAddress + pMga->backOffset, -	  0, -	  pMga->backPitch * ctx->shared.virtualHeight ); - -   /* Can release the lock now */ -/*   DRM_UNLOCK(ctx->drmFD, ctx->pSAREA, ctx->serverContext);*/ - -   /* This is the struct passed to radeon_dri.so for its initialization */ -   ctx->driverClientMsg = malloc(sizeof(MGADRIRec)); -   ctx->driverClientMsgSize = sizeof(MGADRIRec); - -   pMGADRI                    = (MGADRIPtr)ctx->driverClientMsg; - - -   switch(pMga->Chipset) { -   case PCI_CHIP_MGAG550: -   case PCI_CHIP_MGAG400: -      pMGADRI->chipset = MGA_CARD_TYPE_G400; -      break; -   case PCI_CHIP_MGAG200: -   case PCI_CHIP_MGAG200_PCI: -      pMGADRI->chipset = MGA_CARD_TYPE_G200; -      break; -   default: -      return 0; -   } -   pMGADRI->width		= ctx->shared.virtualWidth; -   pMGADRI->height		= ctx->shared.virtualHeight; -   pMGADRI->mem			= ctx->shared.fbSize; -   pMGADRI->cpp			= ctx->bpp / 8; - -   pMGADRI->agpMode		= pMga->agpMode; - -   pMGADRI->frontOffset		= pMga->frontOffset; -   pMGADRI->frontPitch		= pMga->frontPitch; -   pMGADRI->backOffset		= pMga->backOffset; -   pMGADRI->backPitch		= pMga->backPitch; -   pMGADRI->depthOffset		= pMga->depthOffset; -   pMGADRI->depthPitch		= pMga->depthPitch; -   pMGADRI->textureOffset	= pMga->textureOffset; -   pMGADRI->textureSize		= pMga->textureSize; -   pMGADRI->logTextureGranularity = pMga->logTextureGranularity; - -   i = mylog2( pMga->agpTextures.size / MGA_NR_TEX_REGIONS ); -   if ( i < MGA_LOG_MIN_TEX_REGION_SIZE ) -      i = MGA_LOG_MIN_TEX_REGION_SIZE; - -   pMGADRI->logAgpTextureGranularity = i; -   pMGADRI->agpTextureOffset = (unsigned int)pMga->agpTextures.handle; -   pMGADRI->agpTextureSize = (unsigned int)pMga->agpTextures.size; - -   pMGADRI->registers.handle	= pMga->registers.handle; -   pMGADRI->registers.size	= pMga->registers.size; -   pMGADRI->status.handle	= pMga->status.handle; -   pMGADRI->status.size		= pMga->status.size; -   pMGADRI->primary.handle	= pMga->primary.handle; -   pMGADRI->primary.size	= pMga->primary.size; -   pMGADRI->buffers.handle	= pMga->buffers.handle; -   pMGADRI->buffers.size	= pMga->buffers.size; -   pMGADRI->sarea_priv_offset = sizeof(drm_sarea_t); - -   print_client_msg( pMGADRI ); - -   return 1; -} - - -/** - * \brief Validate the fbdev mode. - *  - * \param ctx display handle. - * - * \return one on success, or zero on failure. - * - * Saves some registers and returns 1. - * - * \sa mgaValidateMode(). - */ -static int mgaValidateMode( const DRIDriverContext *ctx ) -{ -   return 1; -} - - -/** - * \brief Examine mode returned by fbdev. - *  - * \param ctx display handle. - * - * \return one on success, or zero on failure. - * - * Restores registers that fbdev has clobbered and returns 1. - * - * \sa mgaValidateMode(). - */ -static int mgaPostValidateMode( const DRIDriverContext *ctx ) -{ -   return 1; -} - - -/** - * \brief Initialize the framebuffer device mode - * - * \param ctx display handle. - * - * \return one on success, or zero on failure. - * - * Fills in \p info with some default values and some information from \p ctx - * and then calls MGAScreenInit() for the screen initialization. - *  - * Before exiting clears the framebuffer memomry accessing it directly. - */ -static int mgaInitFBDev( struct DRIDriverContextRec *ctx ) -{ -   MGAPtr pMga = calloc(1, sizeof(*pMga)); - -   { -      int  dummy = ctx->shared.virtualWidth; - -      switch (ctx->bpp / 8) { -      case 1: dummy = (ctx->shared.virtualWidth + 127) & ~127; break; -      case 2: dummy = (ctx->shared.virtualWidth +  31) &  ~31; break; -      case 3: -      case 4: dummy = (ctx->shared.virtualWidth +  15) &  ~15; break; -      } - -      ctx->shared.virtualWidth = dummy; -   } - -   ctx->driverPrivate = (void *)pMga; -    -   pMga->agpMode       = MGA_DEFAULT_AGP_MODE; -   pMga->agpSize       = MGA_DEFAULT_AGP_SIZE; -   -   pMga->Chipset = ctx->chipset; - -   pMga->IOAddress = ctx->MMIOStart; -   pMga->IOBase    = ctx->MMIOAddress; - -   pMga->frontPitch = ctx->shared.virtualWidth * ctx->cpp; - -   if (!MGAScreenInit( ctx, pMga )) -      return 0; - -   return 1; -} - - -/** - * \brief The screen is being closed, so clean up any state and free any - * resources used by the DRI. - * - * \param ctx display handle. - * - * Unmaps the SAREA, closes the DRM device file descriptor and frees the driver - * private data. - */ -static void mgaHaltFBDev( struct DRIDriverContextRec *ctx ) -{ -    drmUnmap( ctx->pSAREA, ctx->shared.SAREASize ); -    drmClose(ctx->drmFD); - -    if (ctx->driverPrivate) { -       free(ctx->driverPrivate); -       ctx->driverPrivate = NULL; -    } -} - - -static int mgaEngineShutdown( const DRIDriverContext *ctx ) -{ -   fprintf(stderr, "%s() is not yet implemented!\n", __FUNCTION__); - -   return 1; -} - -static int mgaEngineRestore( const DRIDriverContext *ctx ) -{ -   fprintf(stderr, "%s() is not yet implemented!\n", __FUNCTION__); - -   return 1; -} - -/** - * \brief Exported driver interface for Mini GLX. - * - * \sa DRIDriverRec. - */ -struct DRIDriverRec __driDriver = { -   mgaValidateMode, -   mgaPostValidateMode, -   mgaInitFBDev, -   mgaHaltFBDev, -   mgaEngineShutdown, -   mgaEngineRestore, -   0 -}; - - - - -#if 0 -void MGADRICloseScreen( ScreenPtr pScreen ) -{ -   ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; -   MGAPtr pMga = MGAPTR(pScrn); -   MGADRIServerPrivatePtr pMga = pMga->DRIServerInfo; -   drmMGAInit init; - -   if ( pMga->drmBuffers ) { -      drmUnmapBufs( pMga->drmBuffers ); -      pMga->drmBuffers = NULL; -   } - -   if (pMga->irq) { -      drmCtlUninstHandler(ctx->drmFD); -      pMga->irq = 0; -   } - -   /* Cleanup DMA */ -   memset( &init, 0, sizeof(drmMGAInit) ); -   init.func = MGA_CLEANUP_DMA; -   drmCommandWrite( ctx->drmFD, DRM_MGA_INIT, &init, sizeof(drmMGAInit) ); - -   if ( pMga->status.map ) { -      drmUnmap( pMga->status.map, pMga->status.size ); -      pMga->status.map = NULL; -   } -   if ( pMga->buffers.map ) { -      drmUnmap( pMga->buffers.map, pMga->buffers.size ); -      pMga->buffers.map = NULL; -   } -   if ( pMga->primary.map ) { -      drmUnmap( pMga->primary.map, pMga->primary.size ); -      pMga->primary.map = NULL; -   } -   if ( pMga->warp.map ) { -      drmUnmap( pMga->warp.map, pMga->warp.size ); -      pMga->warp.map = NULL; -   } - -   if ( pMga->agpTextures.map ) { -      drmUnmap( pMga->agpTextures.map, pMga->agpTextures.size ); -      pMga->agpTextures.map = NULL; -   } - -   if ( pMga->agp.handle ) { -      drmAgpUnbind( ctx->drmFD, pMga->agp.handle ); -      drmAgpFree( ctx->drmFD, pMga->agp.handle ); -      pMga->agp.handle = 0; -      drmAgpRelease( ctx->drmFD ); -   } - -   DRICloseScreen( pScreen ); - -   if ( pMga->pDRIInfo ) { -      if ( pMga->pDRIpMga->devPrivate ) { -	 xfree( pMga->pDRIpMga->devPrivate ); -	 pMga->pDRIpMga->devPrivate = 0; -      } -      DRIDestroyInfoRec( pMga->pDRIInfo ); -      pMga->pDRIInfo = 0; -   } -   if ( pMga->DRIServerInfo ) { -      xfree( pMga->DRIServerInfo ); -      pMga->DRIServerInfo = 0; -   } -   if ( pMga->pVisualConfigs ) { -      xfree( pMga->pVisualConfigs ); -   } -   if ( pMga->pVisualConfigsPriv ) { -      xfree( pMga->pVisualConfigsPriv ); -   } -} -#endif diff --git a/src/mesa/drivers/dri/nouveau/Makefile b/src/mesa/drivers/dri/nouveau/Makefile index 49e8933561..7be19b26fd 100644 --- a/src/mesa/drivers/dri/nouveau/Makefile +++ b/src/mesa/drivers/dri/nouveau/Makefile @@ -8,8 +8,6 @@ DRI_LIB_DEPS += $(shell pkg-config libdrm_nouveau --libs)  LIBNAME = nouveau_vieux_dri.so -MINIGLX_SOURCES = -  DRIVER_SOURCES = \  	nouveau_screen.c \  	nouveau_context.c \ diff --git a/src/mesa/drivers/dri/nouveau/nouveau_context.c b/src/mesa/drivers/dri/nouveau/nouveau_context.c index 52185a2fb9..42bec659d7 100644 --- a/src/mesa/drivers/dri/nouveau/nouveau_context.c +++ b/src/mesa/drivers/dri/nouveau/nouveau_context.c @@ -43,19 +43,23 @@  #define need_GL_EXT_framebuffer_object  #define need_GL_EXT_fog_coord +#define need_GL_EXT_secondary_color  #include "main/remap_helper.h"  static const struct dri_extension nouveau_extensions[] = {  	{ "GL_ARB_multitexture",	NULL }, +	{ "GL_ARB_texture_env_add",	NULL },  	{ "GL_ARB_texture_env_combine",	NULL },  	{ "GL_ARB_texture_env_dot3",	NULL }, -	{ "GL_ARB_texture_env_add",	NULL }, -	{ "GL_EXT_texture_lod_bias",	NULL }, -	{ "GL_EXT_framebuffer_object",	GL_EXT_framebuffer_object_functions },  	{ "GL_ARB_texture_mirrored_repeat", NULL }, -	{ "GL_EXT_stencil_wrap",	NULL },  	{ "GL_EXT_fog_coord",		GL_EXT_fog_coord_functions }, +	{ "GL_EXT_framebuffer_blit",	NULL }, +	{ "GL_EXT_framebuffer_object",	GL_EXT_framebuffer_object_functions }, +	{ "GL_EXT_secondary_color",	GL_EXT_secondary_color_functions }, +	{ "GL_EXT_stencil_wrap",	NULL }, +	{ "GL_EXT_texture_lod_bias",	NULL }, +	{ "GL_NV_blend_square",         NULL },  	{ "GL_SGIS_generate_mipmap",	NULL },  	{ NULL,				NULL }  }; @@ -66,8 +70,8 @@ nouveau_channel_flush_notify(struct nouveau_channel *chan)  	struct nouveau_context *nctx = chan->user_private;  	GLcontext *ctx = &nctx->base; -	if (nctx->fallback < SWRAST && ctx->DrawBuffer) -		nouveau_state_emit(&nctx->base); +	if (nctx->fallback < SWRAST) +		nouveau_bo_state_emit(ctx);  }  GLboolean @@ -334,6 +338,8 @@ nouveau_validate_framebuffer(GLcontext *ctx)  		update_framebuffer(dri_ctx, dri_read,  				   &dri_ctx->dri2.read_stamp); -	if (nouveau_next_dirty_state(ctx) >= 0) +	if (nouveau_next_dirty_state(ctx) >= 0) { +		nouveau_state_emit(ctx);  		FIRE_RING(context_chan(ctx)); +	}  } diff --git a/src/mesa/drivers/dri/nouveau/nouveau_context.h b/src/mesa/drivers/dri/nouveau/nouveau_context.h index 682f8a414e..fe64fec930 100644 --- a/src/mesa/drivers/dri/nouveau/nouveau_context.h +++ b/src/mesa/drivers/dri/nouveau/nouveau_context.h @@ -85,6 +85,8 @@ struct nouveau_context {  	BITSET_SET(to_nouveau_context(ctx)->dirty, NOUVEAU_STATE_##s)  #define context_dirty_i(ctx, s, i) \  	BITSET_SET(to_nouveau_context(ctx)->dirty, NOUVEAU_STATE_##s##0 + i) +#define context_emit(ctx, s) \ +	context_drv(ctx)->emit[NOUVEAU_STATE_##s](ctx, NOUVEAU_STATE_##s)  GLboolean  nouveau_context_create(const __GLcontextModes *visual, __DRIcontext *dri_ctx, diff --git a/src/mesa/drivers/dri/nouveau/nouveau_driver.c b/src/mesa/drivers/dri/nouveau/nouveau_driver.c index 1d12f43741..4ec864c181 100644 --- a/src/mesa/drivers/dri/nouveau/nouveau_driver.c +++ b/src/mesa/drivers/dri/nouveau/nouveau_driver.c @@ -135,4 +135,8 @@ nouveau_driver_functions_init(struct dd_function_table *functions)  	functions->Flush = nouveau_flush;  	functions->Finish = nouveau_finish;  	functions->Clear = nouveau_clear; +	functions->DrawPixels = _mesa_meta_DrawPixels; +	functions->CopyPixels = _mesa_meta_CopyPixels; +	functions->Bitmap = _mesa_meta_Bitmap; +	functions->BlitFramebuffer = _mesa_meta_BlitFramebuffer;  } diff --git a/src/mesa/drivers/dri/nouveau/nouveau_fbo.c b/src/mesa/drivers/dri/nouveau/nouveau_fbo.c index 2ec3dc9242..8be7edb150 100644 --- a/src/mesa/drivers/dri/nouveau/nouveau_fbo.c +++ b/src/mesa/drivers/dri/nouveau/nouveau_fbo.c @@ -236,7 +236,7 @@ nouveau_render_texture(GLcontext *ctx, struct gl_framebuffer *fb,  	/* Allocate a renderbuffer object for the texture if we  	 * haven't already done so. */  	if (!rb) { -		rb = nouveau_renderbuffer_new(ctx, 0); +		rb = nouveau_renderbuffer_new(ctx, ~0);  		assert(rb);  		rb->AllocStorage = NULL; @@ -259,11 +259,7 @@ static void  nouveau_finish_render_texture(GLcontext *ctx,  			      struct gl_renderbuffer_attachment *att)  { -	struct nouveau_renderbuffer *nrb -		= to_nouveau_renderbuffer(att->Renderbuffer); -  	texture_dirty(att->Texture); -	nouveau_surface_ref(NULL, &nrb->surface);  }  void diff --git a/src/mesa/drivers/dri/nouveau/nouveau_gldefs.h b/src/mesa/drivers/dri/nouveau/nouveau_gldefs.h index 00007a9a35..fbeed3baea 100644 --- a/src/mesa/drivers/dri/nouveau/nouveau_gldefs.h +++ b/src/mesa/drivers/dri/nouveau/nouveau_gldefs.h @@ -260,4 +260,23 @@ nvgl_filter_mode(unsigned filter)  	}  } +static inline unsigned +nvgl_texgen_mode(unsigned mode) +{ +	switch (mode) { +	case GL_EYE_LINEAR: +		return 0x2400; +	case GL_OBJECT_LINEAR: +		return 0x2401; +	case GL_SPHERE_MAP: +		return 0x2402; +	case GL_NORMAL_MAP: +		return 0x8511; +	case GL_REFLECTION_MAP: +		return 0x8512; +	default: +		assert(0); +	} +} +  #endif diff --git a/src/mesa/drivers/dri/nouveau/nouveau_render.h b/src/mesa/drivers/dri/nouveau/nouveau_render.h index bff0ccfd76..923b79b2cf 100644 --- a/src/mesa/drivers/dri/nouveau/nouveau_render.h +++ b/src/mesa/drivers/dri/nouveau/nouveau_render.h @@ -32,8 +32,8 @@  struct nouveau_array_state;  typedef void (*dispatch_t)(GLcontext *, unsigned int, int, unsigned int); -typedef unsigned (*extract_u_t)(struct nouveau_array_state *a, int i, int j); -typedef float (*extract_f_t)(struct nouveau_array_state *a, int i, int j); +typedef unsigned (*extract_u_t)(struct nouveau_array_state *, int, int); +typedef float (*extract_f_t)(struct nouveau_array_state *, int, int);  struct nouveau_attr_info {  	int vbo_index; diff --git a/src/mesa/drivers/dri/nouveau/nouveau_render_t.c b/src/mesa/drivers/dri/nouveau/nouveau_render_t.c index c0505781cf..7ccd7e6416 100644 --- a/src/mesa/drivers/dri/nouveau/nouveau_render_t.c +++ b/src/mesa/drivers/dri/nouveau/nouveau_render_t.c @@ -254,7 +254,7 @@ get_scratch_vbo(GLcontext *ctx, unsigned size, struct nouveau_bo **bo,   */  static inline unsigned  get_max_vertices(GLcontext *ctx, const struct _mesa_index_buffer *ib, -		 unsigned n) +		 int n)  {  	struct nouveau_render_state *render = to_render_state(ctx); diff --git a/src/mesa/drivers/dri/nouveau/nouveau_span.c b/src/mesa/drivers/dri/nouveau/nouveau_span.c index f1a56dd03a..1bfdecc6a2 100644 --- a/src/mesa/drivers/dri/nouveau/nouveau_span.c +++ b/src/mesa/drivers/dri/nouveau/nouveau_span.c @@ -32,7 +32,6 @@  #include "swrast/swrast.h"  #define LOCAL_VARS							\ -	struct gl_framebuffer *fb = ctx->DrawBuffer;			\  	struct nouveau_surface *s = &to_nouveau_renderbuffer(rb)->surface; \  	GLuint p;							\  	(void)p; @@ -45,12 +44,12 @@  #define HW_CLIPLOOP() {							\  	int minx = 0;							\  	int miny = 0;							\ -	int maxx = fb->Width;						\ -	int maxy = fb->Height; +	int maxx = rb->Width;						\ +	int maxy = rb->Height;  #define HW_ENDCLIPLOOP() } -#define Y_FLIP(y) (fb->Name ? (y) : rb->Height - 1 - (y)) +#define Y_FLIP(y) (rb->Name ? (y) : rb->Height - 1 - (y))  /* RGB565 span functions */  #define SPANTMP_PIXEL_FMT GL_RGB @@ -144,17 +143,28 @@ texture_unit_map_unmap(GLcontext *ctx, struct gl_texture_unit *u, GLboolean map)  }  static void -span_map_unmap(GLcontext *ctx, GLboolean map) +framebuffer_map_unmap(struct gl_framebuffer *fb, GLboolean map)  {  	int i; -	for (i = 0; i < ctx->DrawBuffer->_NumColorDrawBuffers; i++) -		renderbuffer_map_unmap(ctx->DrawBuffer->_ColorDrawBuffers[i], map); +	for (i = 0; i < fb->_NumColorDrawBuffers; i++) +		renderbuffer_map_unmap(fb->_ColorDrawBuffers[i], map); + +	renderbuffer_map_unmap(fb->_ColorReadBuffer, map); + +	if (fb->_DepthBuffer) +		renderbuffer_map_unmap(fb->_DepthBuffer->Wrapped, map); +} + +static void +span_map_unmap(GLcontext *ctx, GLboolean map) +{ +	int i; -	renderbuffer_map_unmap(ctx->DrawBuffer->_ColorReadBuffer, map); +	framebuffer_map_unmap(ctx->DrawBuffer, map); -	if (ctx->DrawBuffer->_DepthBuffer) -		renderbuffer_map_unmap(ctx->DrawBuffer->_DepthBuffer->Wrapped, map); +	if (ctx->ReadBuffer != ctx->DrawBuffer) +		framebuffer_map_unmap(ctx->ReadBuffer, map);  	for (i = 0; i < ctx->Const.MaxTextureUnits; i++)  		texture_unit_map_unmap(ctx, &ctx->Texture.Unit[i], map); diff --git a/src/mesa/drivers/dri/nouveau/nouveau_state.c b/src/mesa/drivers/dri/nouveau/nouveau_state.c index e1871db0eb..a57df2d9dc 100644 --- a/src/mesa/drivers/dri/nouveau/nouveau_state.c +++ b/src/mesa/drivers/dri/nouveau/nouveau_state.c @@ -150,6 +150,7 @@ nouveau_enable(GLcontext *ctx, GLenum cap, GLboolean state)  		break;  	case GL_COLOR_SUM_EXT:  		context_dirty(ctx, FRAG); +		context_dirty(ctx, LIGHT_MODEL);  		break;  	case GL_CULL_FACE:  		context_dirty(ctx, CULL_FACE); @@ -188,6 +189,7 @@ nouveau_enable(GLcontext *ctx, GLenum cap, GLboolean state)  	case GL_LIGHTING:  		context_dirty(ctx, FRAG);  		context_dirty(ctx, MODELVIEW); +		context_dirty(ctx, LIGHT_MODEL);  		context_dirty(ctx, LIGHT_ENABLE);  		for (i = 0; i < MAX_LIGHTS; i++) { @@ -230,9 +232,17 @@ nouveau_enable(GLcontext *ctx, GLenum cap, GLboolean state)  	case GL_TEXTURE_1D:  	case GL_TEXTURE_2D:  	case GL_TEXTURE_3D: +	case GL_TEXTURE_RECTANGLE:  		context_dirty_i(ctx, TEX_ENV, ctx->Texture.CurrentUnit);  		context_dirty_i(ctx, TEX_OBJ, ctx->Texture.CurrentUnit);  		break; +	case GL_TEXTURE_GEN_S: +	case GL_TEXTURE_GEN_T: +	case GL_TEXTURE_GEN_R: +	case GL_TEXTURE_GEN_Q: +		context_dirty_i(ctx, TEX_GEN, ctx->Texture.CurrentUnit); +		context_dirty(ctx, MODELVIEW); +		break;  	}  } @@ -367,7 +377,15 @@ static void  nouveau_tex_gen(GLcontext *ctx, GLenum coord, GLenum pname,  		const GLfloat *params)  { -	context_dirty_i(ctx, TEX_GEN, ctx->Texture.CurrentUnit); +	switch (pname) { +	case GL_TEXTURE_GEN_MODE: +		context_dirty_i(ctx, TEX_GEN, ctx->Texture.CurrentUnit); +		context_dirty(ctx, MODELVIEW); +		break; +	default: +		context_dirty_i(ctx, TEX_GEN, ctx->Texture.CurrentUnit); +		break; +	}  }  static void @@ -453,12 +471,19 @@ nouveau_state_emit(GLcontext *ctx)  static void  nouveau_update_state(GLcontext *ctx, GLbitfield new_state)  { +	int i; +  	if (new_state & (_NEW_PROJECTION | _NEW_MODELVIEW))  		context_dirty(ctx, PROJECTION);  	if (new_state & _NEW_MODELVIEW)  		context_dirty(ctx, MODELVIEW); +	if (new_state & _NEW_TEXTURE_MATRIX) { +		for (i = 0; i < ctx->Const.MaxTextureCoordUnits; i++) +			context_dirty_i(ctx, TEX_MAT, i); +	} +  	if (new_state & _NEW_CURRENT_ATTRIB &&  	    new_state & _NEW_LIGHT) {  		context_dirty(ctx, MATERIAL_FRONT_AMBIENT); diff --git a/src/mesa/drivers/dri/nouveau/nouveau_state.h b/src/mesa/drivers/dri/nouveau/nouveau_state.h index d01d962c9f..38ac9753c8 100644 --- a/src/mesa/drivers/dri/nouveau/nouveau_state.h +++ b/src/mesa/drivers/dri/nouveau/nouveau_state.h @@ -89,6 +89,10 @@ enum {  	NOUVEAU_STATE_TEX_GEN1,  	NOUVEAU_STATE_TEX_GEN2,  	NOUVEAU_STATE_TEX_GEN3, +	NOUVEAU_STATE_TEX_MAT0, +	NOUVEAU_STATE_TEX_MAT1, +	NOUVEAU_STATE_TEX_MAT2, +	NOUVEAU_STATE_TEX_MAT3,  	NOUVEAU_STATE_TEX_OBJ0,  	NOUVEAU_STATE_TEX_OBJ1,  	NOUVEAU_STATE_TEX_OBJ2, diff --git a/src/mesa/drivers/dri/nouveau/nouveau_texture.c b/src/mesa/drivers/dri/nouveau/nouveau_texture.c index bf365bfca3..dbf9a5cc61 100644 --- a/src/mesa/drivers/dri/nouveau/nouveau_texture.c +++ b/src/mesa/drivers/dri/nouveau/nouveau_texture.c @@ -177,15 +177,15 @@ nouveau_choose_tex_format(GLcontext *ctx, GLint internalFormat,  }  static GLboolean -teximage_fits(struct gl_texture_object *t, int level, -	      struct gl_texture_image *ti) +teximage_fits(struct gl_texture_object *t, int level)  {  	struct nouveau_surface *s = &to_nouveau_texture(t)->surfaces[level]; +	struct gl_texture_image *ti = t->Image[0][level]; -	return t->Target == GL_TEXTURE_RECTANGLE || -		(s->bo && s->width == ti->Width && -		 s->height == ti->Height && -		 s->format == ti->TexFormat); +	return ti && (t->Target == GL_TEXTURE_RECTANGLE || +		      (s->bo && s->width == ti->Width && +		       s->height == ti->Height && +		       s->format == ti->TexFormat));  }  static GLboolean @@ -195,7 +195,7 @@ validate_teximage(GLcontext *ctx, struct gl_texture_object *t,  {  	struct gl_texture_image *ti = t->Image[0][level]; -	if (ti && teximage_fits(t, level, ti)) { +	if (teximage_fits(t, level)) {  		struct nouveau_surface *ss = to_nouveau_texture(t)->surfaces;  		struct nouveau_surface *s = &to_nouveau_teximage(ti)->surface; @@ -283,7 +283,8 @@ nouveau_texture_validate(GLcontext *ctx, struct gl_texture_object *t)  	struct nouveau_texture *nt = to_nouveau_texture(t);  	int i, last = get_last_level(t); -	if (!nt->surfaces[last].bo) +	if (!teximage_fits(t, t->BaseLevel) || +	    !teximage_fits(t, last))  		return GL_FALSE;  	if (nt->dirty) { @@ -296,6 +297,8 @@ nouveau_texture_validate(GLcontext *ctx, struct gl_texture_object *t)  			validate_teximage(ctx, t, i, 0, 0, 0,  					  s->width, s->height, 1);  		} + +		FIRE_RING(context_chan(ctx));  	}  	return GL_TRUE; @@ -304,9 +307,12 @@ nouveau_texture_validate(GLcontext *ctx, struct gl_texture_object *t)  void  nouveau_texture_reallocate(GLcontext *ctx, struct gl_texture_object *t)  { -	texture_dirty(t); -	relayout_texture(ctx, t); -	nouveau_texture_validate(ctx, t); +	if (!teximage_fits(t, t->BaseLevel) || +	    !teximage_fits(t, get_last_level(t))) { +		texture_dirty(t); +		relayout_texture(ctx, t); +		nouveau_texture_validate(ctx, t); +	}  }  static unsigned @@ -364,7 +370,7 @@ nouveau_teximage(GLcontext *ctx, GLint dims, GLenum target, GLint level,  	}  	if (level == t->BaseLevel) { -		if (!teximage_fits(t, level, ti)) +		if (!teximage_fits(t, level))  			relayout_texture(ctx, t);  		nouveau_texture_validate(ctx, t);  	} @@ -416,6 +422,40 @@ nouveau_teximage_3d(GLcontext *ctx, GLenum target, GLint level,  }  static void +nouveau_texsubimage(GLcontext *ctx, GLint dims, GLenum target, GLint level, +		    GLint xoffset, GLint yoffset, GLint zoffset, +		    GLint width, GLint height, GLint depth, +		    GLenum format, GLenum type, const void *pixels, +		    const struct gl_pixelstore_attrib *packing, +		    struct gl_texture_object *t, +		    struct gl_texture_image *ti) +{ +	struct nouveau_surface *s = &to_nouveau_teximage(ti)->surface; +	int ret; + +	pixels = _mesa_validate_pbo_teximage(ctx, dims, width, height, depth, +					     format, type, pixels, packing, +					     "glTexSubImage"); +	if (pixels) { +		nouveau_teximage_map(ctx, ti); + +		ret = _mesa_texstore(ctx, 3, ti->_BaseFormat, ti->TexFormat, +				     ti->Data, xoffset, yoffset, zoffset, +				     s->pitch, ti->ImageOffsets, +				     width, height, depth, format, type, +				     pixels, packing); +		assert(ret); + +		nouveau_teximage_unmap(ctx, ti); +		_mesa_unmap_teximage_pbo(ctx, packing); +	} + +	if (!to_nouveau_texture(t)->dirty) +		validate_teximage(ctx, t, level, xoffset, yoffset, zoffset, +				  width, height, depth); +} + +static void  nouveau_texsubimage_3d(GLcontext *ctx, GLenum target, GLint level,  		       GLint xoffset, GLint yoffset, GLint zoffset,  		       GLint width, GLint height, GLint depth, @@ -424,15 +464,9 @@ nouveau_texsubimage_3d(GLcontext *ctx, GLenum target, GLint level,  		       struct gl_texture_object *t,  		       struct gl_texture_image *ti)  { -	nouveau_teximage_map(ctx, ti); -	_mesa_store_texsubimage3d(ctx, target, level, xoffset, yoffset, zoffset, -				  width, height, depth, format, type, pixels, -				  packing, t, ti); -	nouveau_teximage_unmap(ctx, ti); - -	if (!to_nouveau_texture(t)->dirty) -		validate_teximage(ctx, t, level, xoffset, yoffset, zoffset, -				  width, height, depth); +	nouveau_texsubimage(ctx, 3, target, level, xoffset, yoffset, zoffset, +			    width, height, depth, format, type, pixels, +			    packing, t, ti);  }  static void @@ -444,15 +478,9 @@ nouveau_texsubimage_2d(GLcontext *ctx, GLenum target, GLint level,  		       struct gl_texture_object *t,  		       struct gl_texture_image *ti)  { -	nouveau_teximage_map(ctx, ti); -	_mesa_store_texsubimage2d(ctx, target, level, xoffset, yoffset, -				  width, height, format, type, pixels, -				  packing, t, ti); -	nouveau_teximage_unmap(ctx, ti); - -	if (!to_nouveau_texture(t)->dirty) -		validate_teximage(ctx, t, level, xoffset, yoffset, 0, -				  width, height, 1); +	nouveau_texsubimage(ctx, 2, target, level, xoffset, yoffset, 0, +			    width, height, 1, format, type, pixels, +			    packing, t, ti);  }  static void @@ -463,15 +491,9 @@ nouveau_texsubimage_1d(GLcontext *ctx, GLenum target, GLint level,  		       struct gl_texture_object *t,  		       struct gl_texture_image *ti)  { -	nouveau_teximage_map(ctx, ti); -	_mesa_store_texsubimage1d(ctx, target, level, xoffset, -				  width, format, type, pixels, -				  packing, t, ti); -	nouveau_teximage_unmap(ctx, ti); - -	if (!to_nouveau_texture(t)->dirty) -		validate_teximage(ctx, t, level, xoffset, 0, 0, -				  width, 1, 1); +	nouveau_texsubimage(ctx, 1, target, level, xoffset, 0, 0, +			    width, 1, 1, format, type, pixels, +			    packing, t, ti);  }  static void diff --git a/src/mesa/drivers/dri/nouveau/nouveau_texture.h b/src/mesa/drivers/dri/nouveau/nouveau_texture.h index b91facbdeb..251f537bba 100644 --- a/src/mesa/drivers/dri/nouveau/nouveau_texture.h +++ b/src/mesa/drivers/dri/nouveau/nouveau_texture.h @@ -41,7 +41,7 @@ struct nouveau_texture {  #define to_nouveau_texture(x) ((struct nouveau_texture *)(x))  #define texture_dirty(t) \ -	to_nouveau_texture(t)->dirty = GL_TRUE; +	to_nouveau_texture(t)->dirty = GL_TRUE  void  nouveau_set_texbuffer(__DRIcontext *dri_ctx, diff --git a/src/mesa/drivers/dri/nouveau/nouveau_util.h b/src/mesa/drivers/dri/nouveau/nouveau_util.h index d6007aba2b..584cb80ef6 100644 --- a/src/mesa/drivers/dri/nouveau/nouveau_util.h +++ b/src/mesa/drivers/dri/nouveau/nouveau_util.h @@ -191,4 +191,22 @@ is_texture_source(int s)  	return s == GL_TEXTURE || (s >= GL_TEXTURE0 && s <= GL_TEXTURE31);  } +static inline struct gl_texgen * +get_texgen_coord(struct gl_texture_unit *u, int i) +{ +	return ((struct gl_texgen *[]) +		{ &u->GenS, &u->GenT, &u->GenR, &u->GenQ }) [i]; +} + +static inline float * +get_texgen_coeff(struct gl_texgen *c) +{ +	if (c->Mode == GL_OBJECT_LINEAR) +		return c->ObjectPlane; +	else if (c->Mode == GL_EYE_LINEAR) +		return c->EyePlane; +	else +		return NULL; +} +  #endif diff --git a/src/mesa/drivers/dri/nouveau/nouveau_vbo_t.c b/src/mesa/drivers/dri/nouveau/nouveau_vbo_t.c index 69a9b96f0c..e5858f8268 100644 --- a/src/mesa/drivers/dri/nouveau/nouveau_vbo_t.c +++ b/src/mesa/drivers/dri/nouveau/nouveau_vbo_t.c @@ -85,6 +85,18 @@ vbo_deinit_array(struct nouveau_array_state *a)  	a->fields = 0;  } +static int +get_array_stride(GLcontext *ctx, const struct gl_client_array *a) +{ +	struct nouveau_render_state *render = to_render_state(ctx); + +	if (render->mode == VBO && !_mesa_is_bufferobj(a->BufferObj)) +		/* Pack client buffers. */ +		return align(_mesa_sizeof_type(a->Type) * a->Size, 4); +	else +		return a->StrideB; +} +  static void  vbo_init_arrays(GLcontext *ctx, const struct _mesa_index_buffer *ib,  		const struct gl_client_array **arrays) @@ -101,18 +113,10 @@ vbo_init_arrays(GLcontext *ctx, const struct _mesa_index_buffer *ib,  		if (attr >= 0) {  			const struct gl_client_array *array = arrays[attr]; -			int stride; - -			if (render->mode == VBO && -			    !_mesa_is_bufferobj(array->BufferObj)) -				/* Pack client buffers. */ -				stride = align(_mesa_sizeof_type(array->Type) -					       * array->Size, 4); -			else -				stride = array->StrideB;  			vbo_init_array(&render->attrs[attr], attr, -				       stride, array->Size, array->Type, +				       get_array_stride(ctx, array), +				       array->Size, array->Type,  				       array->BufferObj, array->Ptr,  				       render->mode == IMM);  		} @@ -224,9 +228,11 @@ vbo_choose_attrs(GLcontext *ctx, const struct gl_client_array **arrays)  	if (ctx->Fog.Enabled && ctx->Fog.FogCoordinateSource == GL_FOG_COORD)  		vbo_emit_attr(ctx, arrays, VERT_ATTRIB_FOG); -	if (ctx->Light.Enabled) { +	if (ctx->Light.Enabled || +	    (ctx->Texture._GenFlags & TEXGEN_NEED_NORMALS))  		vbo_emit_attr(ctx, arrays, VERT_ATTRIB_NORMAL); +	if (ctx->Light.Enabled) {  		vbo_emit_attr(ctx, arrays, MAT(FRONT_AMBIENT));  		vbo_emit_attr(ctx, arrays, MAT(FRONT_DIFFUSE));  		vbo_emit_attr(ctx, arrays, MAT(FRONT_SPECULAR)); @@ -243,18 +249,21 @@ vbo_choose_attrs(GLcontext *ctx, const struct gl_client_array **arrays)  	vbo_emit_attr(ctx, arrays, VERT_ATTRIB_POS);  } -static unsigned -get_max_client_stride(GLcontext *ctx) +static int +get_max_client_stride(GLcontext *ctx, const struct gl_client_array **arrays)  {  	struct nouveau_render_state *render = to_render_state(ctx);  	int i, s = 0;  	for (i = 0; i < render->attr_count; i++) {  		int attr = render->map[i]; -		struct nouveau_array_state *a = &render->attrs[attr]; -		if (attr >= 0 && !a->bo) -			s = MAX2(a->stride, s); +		if (attr >= 0) { +			const struct gl_client_array *a = arrays[attr]; + +			if (!_mesa_is_bufferobj(a->BufferObj)) +				s = MAX2(s, get_array_stride(ctx, a)); +		}  	}  	return s; @@ -275,20 +284,20 @@ vbo_maybe_split(GLcontext *ctx, const struct gl_client_array **arrays,  {  	struct nouveau_context *nctx = to_nouveau_context(ctx);  	struct nouveau_render_state *render = to_render_state(ctx); -	unsigned pushbuf_avail = PUSHBUF_DWORDS - 2 * nctx->bo.count, +	unsigned pushbuf_avail = PUSHBUF_DWORDS - 2 * (nctx->bo.count + +						       render->attr_count),  		vert_avail = get_max_vertices(ctx, NULL, pushbuf_avail),  		idx_avail = get_max_vertices(ctx, ib, pushbuf_avail);  	int stride;  	/* Try to keep client buffers smaller than the scratch BOs. */ -	if (!ib && render->mode == VBO && -	    (stride = get_max_client_stride(ctx))) +	if (render->mode == VBO && +	    (stride = get_max_client_stride(ctx, arrays)))  		    vert_avail = MIN2(vert_avail,  				      RENDER_SCRATCH_SIZE / stride); - -	if ((ib && ib->count > idx_avail) || -	    (!ib && max_index - min_index > vert_avail)) { +	if (max_index - min_index > vert_avail || +	    (ib && ib->count > idx_avail)) {  		struct split_limits limits = {  			.max_verts = vert_avail,  			.max_indices = idx_avail, @@ -322,6 +331,7 @@ vbo_bind_vertices(GLcontext *ctx, const struct gl_client_array **arrays,  				* array->StrideB;  			if (a->bo) { +				/* Array in a buffer obj. */  				a->offset = (intptr_t)array->Ptr + delta;  			} else {  				int j, n = max_index - min_index + 1; @@ -329,6 +339,8 @@ vbo_bind_vertices(GLcontext *ctx, const struct gl_client_array **arrays,  				char *dp = get_scratch_vbo(ctx, n * a->stride,  							   &a->bo, &a->offset); +				/* Array in client memory, move it to +				 * a scratch buffer obj. */  				for (j = 0; j < n; j++)  					memcpy(dp + j * a->stride,  					       sp + j * array->StrideB, @@ -372,8 +384,6 @@ vbo_draw_vbo(GLcontext *ctx, const struct gl_client_array **arrays,  		dispatch(ctx, start, delta, count);  		BATCH_END();  	} - -	FIRE_RING(chan);  }  /* Immediate rendering path. */ @@ -417,8 +427,6 @@ vbo_draw_imm(GLcontext *ctx, const struct gl_client_array **arrays,  		BATCH_END();  	} - -	FIRE_RING(chan);  }  /* draw_prims entry point when we're doing hw-tnl. */ diff --git a/src/mesa/drivers/dri/nouveau/nv04_context.c b/src/mesa/drivers/dri/nouveau/nv04_context.c index a442425e44..6834f7cd3d 100644 --- a/src/mesa/drivers/dri/nouveau/nv04_context.c +++ b/src/mesa/drivers/dri/nouveau/nv04_context.c @@ -75,18 +75,16 @@ nv04_channel_flush_notify(struct nouveau_channel *chan)  	struct nouveau_context *nctx = chan->user_private;  	GLcontext *ctx = &nctx->base; -	if (nctx->fallback < SWRAST && ctx->DrawBuffer) { -		GLcontext *ctx = &nctx->base; - +	if (nctx->fallback < SWRAST) {  		/* Flushing seems to clobber the engine context. */ -		context_dirty_i(ctx, TEX_OBJ, 0); -		context_dirty_i(ctx, TEX_OBJ, 1); -		context_dirty_i(ctx, TEX_ENV, 0); -		context_dirty_i(ctx, TEX_ENV, 1); -		context_dirty(ctx, CONTROL); -		context_dirty(ctx, BLEND); +		context_emit(ctx, TEX_OBJ0); +		context_emit(ctx, TEX_OBJ1); +		context_emit(ctx, TEX_ENV0); +		context_emit(ctx, TEX_ENV1); +		context_emit(ctx, CONTROL); +		context_emit(ctx, BLEND); -		nouveau_state_emit(ctx); +		nouveau_bo_state_emit(ctx);  	}  } @@ -200,9 +198,9 @@ nv04_context_create(struct nouveau_screen *screen, const GLvisual *visual,  	if (ret)  		goto fail; +	init_dummy_texture(ctx);  	nv04_hwctx_init(ctx);  	nv04_render_init(ctx); -	init_dummy_texture(ctx);  	return ctx; @@ -278,6 +276,10 @@ const struct nouveau_driver nv04_driver = {  		nouveau_emit_nothing,  		nouveau_emit_nothing,  		nouveau_emit_nothing, +		nouveau_emit_nothing, +		nouveau_emit_nothing, +		nouveau_emit_nothing, +		nouveau_emit_nothing,  		nv04_emit_tex_obj,  		nv04_emit_tex_obj,  		nouveau_emit_nothing, diff --git a/src/mesa/drivers/dri/nouveau/nv04_state_fb.c b/src/mesa/drivers/dri/nouveau/nv04_state_fb.c index aad1e491d2..5e5e0c5874 100644 --- a/src/mesa/drivers/dri/nouveau/nv04_state_fb.c +++ b/src/mesa/drivers/dri/nouveau/nv04_state_fb.c @@ -63,7 +63,7 @@ nv04_emit_framebuffer(GLcontext *ctx, int emit)  		return;  	/* Render target */ -	if (fb->_NumColorDrawBuffers) { +	if (fb->_ColorDrawBuffers[0]) {  		s = &to_nouveau_renderbuffer(  			fb->_ColorDrawBuffers[0])->surface; diff --git a/src/mesa/drivers/dri/nouveau/nv04_state_raster.c b/src/mesa/drivers/dri/nouveau/nv04_state_raster.c index 4314fc33cf..c191571a5f 100644 --- a/src/mesa/drivers/dri/nouveau/nv04_state_raster.c +++ b/src/mesa/drivers/dri/nouveau/nv04_state_raster.c @@ -275,6 +275,10 @@ nv04_emit_blend(GLcontext *ctx, int emit)  		else  			blend |= NV04_MULTITEX_TRIANGLE_BLEND_SHADE_MODE_FLAT; +		/* Secondary color */ +		if (NEED_SECONDARY_COLOR(ctx)) +			blend |= NV04_MULTITEX_TRIANGLE_BLEND_SPECULAR_ENABLE; +  		/* Fog. */  		if (ctx->Fog.Enabled)  			blend |= NV04_MULTITEX_TRIANGLE_BLEND_FOG_ENABLE; @@ -309,6 +313,10 @@ nv04_emit_blend(GLcontext *ctx, int emit)  		else  			blend |= get_texenv_mode(GL_MODULATE); +		/* Secondary color */ +		if (NEED_SECONDARY_COLOR(ctx)) +			blend |= NV04_TEXTURED_TRIANGLE_BLEND_SPECULAR_ENABLE; +  		/* Fog. */  		if (ctx->Fog.Enabled)  			blend |= NV04_TEXTURED_TRIANGLE_BLEND_FOG_ENABLE; diff --git a/src/mesa/drivers/dri/nouveau/nv10_context.c b/src/mesa/drivers/dri/nouveau/nv10_context.c index 860d0aeb8f..b6d10361de 100644 --- a/src/mesa/drivers/dri/nouveau/nv10_context.c +++ b/src/mesa/drivers/dri/nouveau/nv10_context.c @@ -212,7 +212,7 @@ nv10_hwctx_init(GLcontext *ctx)  	OUT_RING(chan, 0);  	BEGIN_RING(chan, celsius, NV10TCL_CULL_FACE_ENABLE, 1);  	OUT_RING(chan, 0); -	BEGIN_RING(chan, celsius, NV10TCL_TX_GEN_S(0), 8); +	BEGIN_RING(chan, celsius, NV10TCL_TX_GEN_MODE_S(0), 8);  	for (i = 0; i < 8; i++)  		OUT_RING(chan, 0); @@ -412,6 +412,10 @@ const struct nouveau_driver nv10_driver = {  		nv10_emit_tex_gen,  		nouveau_emit_nothing,  		nouveau_emit_nothing, +		nv10_emit_tex_mat, +		nv10_emit_tex_mat, +		nouveau_emit_nothing, +		nouveau_emit_nothing,  		nv10_emit_tex_obj,  		nv10_emit_tex_obj,  		nouveau_emit_nothing, diff --git a/src/mesa/drivers/dri/nouveau/nv10_driver.h b/src/mesa/drivers/dri/nouveau/nv10_driver.h index d662712533..cefd6c6fba 100644 --- a/src/mesa/drivers/dri/nouveau/nv10_driver.h +++ b/src/mesa/drivers/dri/nouveau/nv10_driver.h @@ -134,6 +134,9 @@ void  nv10_emit_tex_gen(GLcontext *ctx, int emit);  void +nv10_emit_tex_mat(GLcontext *ctx, int emit); + +void  nv10_emit_tex_obj(GLcontext *ctx, int emit);  /* nv10_state_tnl.c */ diff --git a/src/mesa/drivers/dri/nouveau/nv10_state_fb.c b/src/mesa/drivers/dri/nouveau/nv10_state_fb.c index 05c36b4f8f..a2fcb6b695 100644 --- a/src/mesa/drivers/dri/nouveau/nv10_state_fb.c +++ b/src/mesa/drivers/dri/nouveau/nv10_state_fb.c @@ -71,6 +71,7 @@ setup_lma_buffer(GLcontext *ctx)  	nouveau_bo_markl(bctx, celsius, NV17TCL_LMA_DEPTH_BUFFER_OFFSET,  			 nfb->lma_bo, 0, NOUVEAU_BO_VRAM | NOUVEAU_BO_RDWR); +	WAIT_RING(chan, 9);  	BEGIN_RING(chan, celsius, NV17TCL_LMA_DEPTH_WINDOW_X, 4);  	OUT_RINGf(chan, - 1792);  	OUT_RINGf(chan, - 2304 + fb->Height); @@ -111,7 +112,7 @@ nv10_emit_framebuffer(GLcontext *ctx, int emit)  	}  	/* Render target */ -	if (fb->_NumColorDrawBuffers) { +	if (fb->_ColorDrawBuffers[0]) {  		s = &to_nouveau_renderbuffer(  			fb->_ColorDrawBuffers[0])->surface; @@ -171,15 +172,13 @@ nv10_emit_viewport(GLcontext *ctx, int emit)  	struct nouveau_grobj *celsius = context_eng3d(ctx);  	struct gl_framebuffer *fb = ctx->DrawBuffer;  	float a[4] = {}; -	int i;  	get_viewport_translate(ctx, a);  	a[0] -= 2048;  	a[1] -= 2048;  	BEGIN_RING(chan, celsius, NV10TCL_VIEWPORT_TRANSLATE_X, 4); -	for (i = 0; i < 4; i++) -		OUT_RINGf(chan, a[i]); +	OUT_RINGp(chan, a, 4);  	BEGIN_RING(chan, celsius, NV10TCL_VIEWPORT_CLIP_HORIZ(0), 1);  	OUT_RING(chan, (fb->Width - 1) << 16 | 0x08000800); diff --git a/src/mesa/drivers/dri/nouveau/nv10_state_tex.c b/src/mesa/drivers/dri/nouveau/nv10_state_tex.c index 02a5ca797a..6dedb18c72 100644 --- a/src/mesa/drivers/dri/nouveau/nv10_state_tex.c +++ b/src/mesa/drivers/dri/nouveau/nv10_state_tex.c @@ -32,9 +32,64 @@  #include "nouveau_util.h"  #include "nv10_driver.h" +#define TX_GEN_MODE(i, j) (NV10TCL_TX_GEN_MODE_S(i) + 4 * (j)) +#define TX_GEN_COEFF(i, j) (NV10TCL_TX_GEN_COEFF_S_A(i) + 16 * (j)) +#define TX_MATRIX(i) (NV10TCL_TX0_MATRIX(0) + 64 * (i)) +  void  nv10_emit_tex_gen(GLcontext *ctx, int emit)  { +	const int i = emit - NOUVEAU_STATE_TEX_GEN0; +	struct nouveau_context *nctx = to_nouveau_context(ctx); +	struct nouveau_channel *chan = context_chan(ctx); +	struct nouveau_grobj *celsius = context_eng3d(ctx); +	struct gl_texture_unit *unit = &ctx->Texture.Unit[i]; +	int j; + +	for (j = 0; j < 4; j++) { +		if (nctx->fallback == HWTNL && (unit->TexGenEnabled & 1 << j)) { +			struct gl_texgen *coord = get_texgen_coord(unit, j); +			float *k = get_texgen_coeff(coord); + +			if (k) { +				BEGIN_RING(chan, celsius, +					   TX_GEN_COEFF(i, j), 4); +				OUT_RINGp(chan, k, 4); +			} + +			BEGIN_RING(chan, celsius, TX_GEN_MODE(i, j), 1); +			OUT_RING(chan, nvgl_texgen_mode(coord->Mode)); + +		} else { +			BEGIN_RING(chan, celsius, TX_GEN_MODE(i, j), 1); +			OUT_RING(chan, 0); +		} +	} + +	context_dirty_i(ctx, TEX_MAT, i); +} + +void +nv10_emit_tex_mat(GLcontext *ctx, int emit) +{ +	const int i = emit - NOUVEAU_STATE_TEX_MAT0; +	struct nouveau_context *nctx = to_nouveau_context(ctx); +	struct nouveau_channel *chan = context_chan(ctx); +	struct nouveau_grobj *celsius = context_eng3d(ctx); + +	if (nctx->fallback == HWTNL && +	    ((ctx->Texture._TexMatEnabled & 1 << i) || +	     ctx->Texture.Unit[i]._GenFlags)) { +		BEGIN_RING(chan, celsius, NV10TCL_TX_MATRIX_ENABLE(i), 1); +		OUT_RING(chan, 1); + +		BEGIN_RING(chan, celsius, TX_MATRIX(i), 16); +		OUT_RINGm(chan, ctx->TextureMatrixStack[i].Top->m); + +	} else { +		BEGIN_RING(chan, celsius, NV10TCL_TX_MATRIX_ENABLE(i), 1); +		OUT_RING(chan, 0); +	}  }  static uint32_t diff --git a/src/mesa/drivers/dri/nouveau/nv10_state_tnl.c b/src/mesa/drivers/dri/nouveau/nv10_state_tnl.c index 6db14d83b8..0e592a1629 100644 --- a/src/mesa/drivers/dri/nouveau/nv10_state_tnl.c +++ b/src/mesa/drivers/dri/nouveau/nv10_state_tnl.c @@ -140,9 +140,7 @@ nv10_emit_fog(GLcontext *ctx, int emit)  	OUT_RING(chan, pack_rgba_f(MESA_FORMAT_RGBA8888_REV, f->Color));  	BEGIN_RING(chan, celsius, NV10TCL_FOG_EQUATION_CONSTANT, 3); -	OUT_RINGf(chan, k[0]); -	OUT_RINGf(chan, k[1]); -	OUT_RINGf(chan, k[2]); +	OUT_RINGp(chan, k, 3);  	context_dirty(ctx, FRAG);  } @@ -201,8 +199,10 @@ nv10_emit_light_model(GLcontext *ctx, int emit)  	BEGIN_RING(chan, celsius, NV10TCL_LIGHT_MODEL, 1);  	OUT_RING(chan, ((m->LocalViewer ?  			 NV10TCL_LIGHT_MODEL_LOCAL_VIEWER : 0) | -			(m->ColorControl == GL_SEPARATE_SPECULAR_COLOR ? -			 NV10TCL_LIGHT_MODEL_SEPARATE_SPECULAR : 0))); +			(NEED_SECONDARY_COLOR(ctx) ? +			 NV10TCL_LIGHT_MODEL_SEPARATE_SPECULAR : 0) | +			(!ctx->Light.Enabled && ctx->Fog.ColorSumEnabled ? +			 NV10TCL_LIGHT_MODEL_VERTEX_SPECULAR : 0)));  }  static float @@ -282,9 +282,7 @@ nv10_emit_light_source(GLcontext *ctx, int emit)  	if (l->_Flags & LIGHT_POSITIONAL) {  		BEGIN_RING(chan, celsius, NV10TCL_LIGHT_POSITION_X(i), 3); -		OUT_RINGf(chan, l->_Position[0]); -		OUT_RINGf(chan, l->_Position[1]); -		OUT_RINGf(chan, l->_Position[2]); +		OUT_RINGp(chan, l->_Position, 3);  		BEGIN_RING(chan, celsius,  			   NV10TCL_LIGHT_ATTENUATION_CONSTANT(i), 3); @@ -294,14 +292,10 @@ nv10_emit_light_source(GLcontext *ctx, int emit)  	} else {  		BEGIN_RING(chan, celsius, NV10TCL_LIGHT_DIRECTION_X(i), 3); -		OUT_RINGf(chan, l->_VP_inf_norm[0]); -		OUT_RINGf(chan, l->_VP_inf_norm[1]); -		OUT_RINGf(chan, l->_VP_inf_norm[2]); +		OUT_RINGp(chan, l->_VP_inf_norm, 3);  		BEGIN_RING(chan, celsius, NV10TCL_LIGHT_HALF_VECTOR_X(i), 3); -		OUT_RINGf(chan, l->_h_inf_norm[0]); -		OUT_RINGf(chan, l->_h_inf_norm[1]); -		OUT_RINGf(chan, l->_h_inf_norm[2]); +		OUT_RINGp(chan, l->_h_inf_norm, 3);  	}  	if (l->_Flags & LIGHT_SPOT) { @@ -310,13 +304,7 @@ nv10_emit_light_source(GLcontext *ctx, int emit)  		nv10_get_spot_coeff(l, k);  		BEGIN_RING(chan, celsius, NV10TCL_LIGHT_SPOT_CUTOFF_A(i), 7); -		OUT_RINGf(chan, k[0]); -		OUT_RINGf(chan, k[1]); -		OUT_RINGf(chan, k[2]); -		OUT_RINGf(chan, k[3]); -		OUT_RINGf(chan, k[4]); -		OUT_RINGf(chan, k[5]); -		OUT_RINGf(chan, k[6]); +		OUT_RINGp(chan, k, 7);  	}  } @@ -348,15 +336,11 @@ nv10_emit_material_ambient(GLcontext *ctx, int emit)  	}  	BEGIN_RING(chan, celsius, NV10TCL_LIGHT_MODEL_AMBIENT_R, 3); -	OUT_RINGf(chan, c_scene[0]); -	OUT_RINGf(chan, c_scene[1]); -	OUT_RINGf(chan, c_scene[2]); +	OUT_RINGp(chan, c_scene, 3);  	if (ctx->Light.ColorMaterialEnabled) {  		BEGIN_RING(chan, celsius, NV10TCL_MATERIAL_FACTOR_R, 3); -		OUT_RINGf(chan, c_factor[0]); -		OUT_RINGf(chan, c_factor[1]); -		OUT_RINGf(chan, c_factor[2]); +		OUT_RINGp(chan, c_factor, 3);  	}  	foreach(l, &ctx->Light.EnabledList) { @@ -366,9 +350,7 @@ nv10_emit_material_ambient(GLcontext *ctx, int emit)  				  l->_MatAmbient[0]);  		BEGIN_RING(chan, celsius, NV10TCL_LIGHT_AMBIENT_R(i), 3); -		OUT_RINGf(chan, c_light[0]); -		OUT_RINGf(chan, c_light[1]); -		OUT_RINGf(chan, c_light[2]); +		OUT_RINGp(chan, c_light, 3);  	}  } @@ -390,9 +372,7 @@ nv10_emit_material_diffuse(GLcontext *ctx, int emit)  				  l->_MatDiffuse[0]);  		BEGIN_RING(chan, celsius, NV10TCL_LIGHT_DIFFUSE_R(i), 3); -		OUT_RINGf(chan, c_light[0]); -		OUT_RINGf(chan, c_light[1]); -		OUT_RINGf(chan, c_light[2]); +		OUT_RINGp(chan, c_light, 3);  	}  } @@ -410,9 +390,7 @@ nv10_emit_material_specular(GLcontext *ctx, int emit)  				  l->_MatSpecular[0]);  		BEGIN_RING(chan, celsius, NV10TCL_LIGHT_SPECULAR_R(i), 3); -		OUT_RINGf(chan, c_light[0]); -		OUT_RINGf(chan, c_light[1]); -		OUT_RINGf(chan, c_light[2]); +		OUT_RINGp(chan, c_light, 3);  	}  } @@ -453,12 +431,7 @@ nv10_emit_material_shininess(GLcontext *ctx, int emit)  		k);  	BEGIN_RING(chan, celsius, NV10TCL_MATERIAL_SHININESS(0), 6); -	OUT_RINGf(chan, k[0]); -	OUT_RINGf(chan, k[1]); -	OUT_RINGf(chan, k[2]); -	OUT_RINGf(chan, k[3]); -	OUT_RINGf(chan, k[4]); -	OUT_RINGf(chan, k[5]); +	OUT_RINGp(chan, k, 6);  }  void @@ -472,12 +445,14 @@ nv10_emit_modelview(GLcontext *ctx, int emit)  	if (nctx->fallback != HWTNL)  		return; -	if (ctx->Light._NeedEyeCoords || ctx->Fog.Enabled) { +	if (ctx->Light._NeedEyeCoords || ctx->Fog.Enabled || +	    (ctx->Texture._GenFlags & TEXGEN_NEED_EYE_COORD)) {  		BEGIN_RING(chan, celsius, NV10TCL_MODELVIEW0_MATRIX(0), 16);  		OUT_RINGm(chan, m->m);  	} -	if (ctx->Light.Enabled) { +	if (ctx->Light.Enabled || +	    (ctx->Texture._GenFlags & TEXGEN_NEED_EYE_COORD)) {  		int i, j;  		BEGIN_RING(chan, celsius, diff --git a/src/mesa/drivers/dri/nouveau/nv20_context.c b/src/mesa/drivers/dri/nouveau/nv20_context.c index db39ef7075..789dcaa6b4 100644 --- a/src/mesa/drivers/dri/nouveau/nv20_context.c +++ b/src/mesa/drivers/dri/nouveau/nv20_context.c @@ -297,9 +297,9 @@ nv20_hwctx_init(GLcontext *ctx)  	BEGIN_RING(chan, kelvin, NV20TCL_POLYGON_STIPPLE_ENABLE, 1);  	OUT_RING  (chan, 0); -	BEGIN_RING(chan, kelvin, NV20TCL_TX_GEN_S(0), -		   4 * NV20TCL_TX_GEN_S__SIZE); -	for (i=0; i < 4 * NV20TCL_TX_GEN_S__SIZE; i++) +	BEGIN_RING(chan, kelvin, NV20TCL_TX_GEN_MODE_S(0), +		   4 * NV20TCL_TX_GEN_MODE_S__SIZE); +	for (i=0; i < 4 * NV20TCL_TX_GEN_MODE_S__SIZE; i++)  		OUT_RING(chan, 0);  	BEGIN_RING(chan, kelvin, NV20TCL_FOG_EQUATION_CONSTANT, 3); @@ -497,10 +497,14 @@ const struct nouveau_driver nv20_driver = {  		nv20_emit_tex_env,  		nv20_emit_tex_env,  		nv20_emit_tex_env, -		nv10_emit_tex_gen, -		nv10_emit_tex_gen, -		nv10_emit_tex_gen, -		nv10_emit_tex_gen, +		nv20_emit_tex_gen, +		nv20_emit_tex_gen, +		nv20_emit_tex_gen, +		nv20_emit_tex_gen, +		nv20_emit_tex_mat, +		nv20_emit_tex_mat, +		nv20_emit_tex_mat, +		nv20_emit_tex_mat,  		nv20_emit_tex_obj,  		nv20_emit_tex_obj,  		nv20_emit_tex_obj, diff --git a/src/mesa/drivers/dri/nouveau/nv20_driver.h b/src/mesa/drivers/dri/nouveau/nv20_driver.h index 18574e9be6..8adecef2c4 100644 --- a/src/mesa/drivers/dri/nouveau/nv20_driver.h +++ b/src/mesa/drivers/dri/nouveau/nv20_driver.h @@ -68,6 +68,12 @@ nv20_emit_frag(GLcontext *ctx, int emit);  /* nv20_state_tex.c */  void +nv20_emit_tex_gen(GLcontext *ctx, int emit); + +void +nv20_emit_tex_mat(GLcontext *ctx, int emit); + +void  nv20_emit_tex_obj(GLcontext *ctx, int emit);  void diff --git a/src/mesa/drivers/dri/nouveau/nv20_state_fb.c b/src/mesa/drivers/dri/nouveau/nv20_state_fb.c index 869acd6e31..21da4f7af1 100644 --- a/src/mesa/drivers/dri/nouveau/nv20_state_fb.c +++ b/src/mesa/drivers/dri/nouveau/nv20_state_fb.c @@ -67,7 +67,7 @@ nv20_emit_framebuffer(GLcontext *ctx, int emit)  		return;  	/* Render target */ -	if (fb->_NumColorDrawBuffers) { +	if (fb->_ColorDrawBuffers[0]) {  		s = &to_nouveau_renderbuffer(  			fb->_ColorDrawBuffers[0])->surface; @@ -106,13 +106,11 @@ nv20_emit_viewport(GLcontext *ctx, int emit)  	struct nouveau_grobj *kelvin = context_eng3d(ctx);  	struct gl_framebuffer *fb = ctx->DrawBuffer;  	float a[4] = {}; -	int i;  	get_viewport_translate(ctx, a);  	BEGIN_RING(chan, kelvin, NV20TCL_VIEWPORT_TRANSLATE_X, 4); -	for (i = 0; i < 4; i++) -		OUT_RINGf(chan, a[i]); +	OUT_RINGp(chan, a, 4);  	BEGIN_RING(chan, kelvin, NV20TCL_VIEWPORT_CLIP_HORIZ(0), 1);  	OUT_RING(chan, (fb->Width - 1) << 16); diff --git a/src/mesa/drivers/dri/nouveau/nv20_state_tex.c b/src/mesa/drivers/dri/nouveau/nv20_state_tex.c index 92870105f9..e46118e4fc 100644 --- a/src/mesa/drivers/dri/nouveau/nv20_state_tex.c +++ b/src/mesa/drivers/dri/nouveau/nv20_state_tex.c @@ -32,6 +32,62 @@  #include "nouveau_util.h"  #include "nv20_driver.h" +#define TX_GEN_MODE(i, j) (NV20TCL_TX_GEN_MODE_S(i) + 4 * (j)) +#define TX_GEN_COEFF(i, j) (NV20TCL_TX_GEN_COEFF_S_A(i) + 16 * (j)) +#define TX_MATRIX(i) (NV20TCL_TX0_MATRIX(0) + 64 * (i)) + +void +nv20_emit_tex_gen(GLcontext *ctx, int emit) +{ +	const int i = emit - NOUVEAU_STATE_TEX_GEN0; +	struct nouveau_context *nctx = to_nouveau_context(ctx); +	struct nouveau_channel *chan = context_chan(ctx); +	struct nouveau_grobj *kelvin = context_eng3d(ctx); +	struct gl_texture_unit *unit = &ctx->Texture.Unit[i]; +	int j; + +	for (j = 0; j < 4; j++) { +		if (nctx->fallback == HWTNL && (unit->TexGenEnabled & 1 << j)) { +			struct gl_texgen *coord = get_texgen_coord(unit, j); +			float *k = get_texgen_coeff(coord); + +			if (k) { +				BEGIN_RING(chan, kelvin, TX_GEN_COEFF(i, j), 4); +				OUT_RINGp(chan, k, 4); +			} + +			BEGIN_RING(chan, kelvin, TX_GEN_MODE(i, j), 1); +			OUT_RING(chan, nvgl_texgen_mode(coord->Mode)); + +		} else { +			BEGIN_RING(chan, kelvin, TX_GEN_MODE(i, j), 1); +			OUT_RING(chan, 0); +		} +	} +} + +void +nv20_emit_tex_mat(GLcontext *ctx, int emit) +{ +	const int i = emit - NOUVEAU_STATE_TEX_MAT0; +	struct nouveau_context *nctx = to_nouveau_context(ctx); +	struct nouveau_channel *chan = context_chan(ctx); +	struct nouveau_grobj *kelvin = context_eng3d(ctx); + +	if (nctx->fallback == HWTNL && +	    (ctx->Texture._TexMatEnabled & 1 << i)) { +		BEGIN_RING(chan, kelvin, NV20TCL_TX_MATRIX_ENABLE(i), 1); +		OUT_RING(chan, 1); + +		BEGIN_RING(chan, kelvin, TX_MATRIX(i), 16); +		OUT_RINGm(chan, ctx->TextureMatrixStack[i].Top->m); + +	} else { +		BEGIN_RING(chan, kelvin, NV20TCL_TX_MATRIX_ENABLE(i), 1); +		OUT_RING(chan, 0); +	} +} +  static uint32_t  get_tex_format_pot(struct gl_texture_image *ti)  { diff --git a/src/mesa/drivers/dri/nouveau/nv20_state_tnl.c b/src/mesa/drivers/dri/nouveau/nv20_state_tnl.c index 0d566064f6..62efe80fe4 100644 --- a/src/mesa/drivers/dri/nouveau/nv20_state_tnl.c +++ b/src/mesa/drivers/dri/nouveau/nv20_state_tnl.c @@ -139,9 +139,7 @@ nv20_emit_fog(GLcontext *ctx, int emit)  	OUT_RING(chan, pack_rgba_f(MESA_FORMAT_RGBA8888_REV, f->Color));  	BEGIN_RING(chan, kelvin, NV20TCL_FOG_EQUATION_CONSTANT, 3); -	OUT_RINGf(chan, k[0]); -	OUT_RINGf(chan, k[1]); -	OUT_RINGf(chan, k[2]); +	OUT_RINGp(chan, k, 3);  }  void @@ -158,7 +156,7 @@ nv20_emit_light_model(GLcontext *ctx, int emit)  	OUT_RING(chan, ((m->LocalViewer ?  			 NV20TCL_LIGHT_MODEL_VIEWER_LOCAL :  			 NV20TCL_LIGHT_MODEL_VIEWER_NONLOCAL) | -			(m->ColorControl == GL_SEPARATE_SPECULAR_COLOR ? +			(NEED_SECONDARY_COLOR(ctx) ?  			 NV20TCL_LIGHT_MODEL_SEPARATE_SPECULAR :  			 0))); @@ -176,9 +174,7 @@ nv20_emit_light_source(GLcontext *ctx, int emit)  	if (l->_Flags & LIGHT_POSITIONAL) {  		BEGIN_RING(chan, kelvin, NV20TCL_LIGHT_POSITION_X(i), 3); -		OUT_RINGf(chan, l->_Position[0]); -		OUT_RINGf(chan, l->_Position[1]); -		OUT_RINGf(chan, l->_Position[2]); +		OUT_RINGp(chan, l->_Position, 3);  		BEGIN_RING(chan, kelvin, NV20TCL_LIGHT_ATTENUATION_CONSTANT(i), 3);  		OUT_RINGf(chan, l->ConstantAttenuation); @@ -187,14 +183,10 @@ nv20_emit_light_source(GLcontext *ctx, int emit)  	} else {  		BEGIN_RING(chan, kelvin, NV20TCL_LIGHT_DIRECTION_X(i), 3); -		OUT_RINGf(chan, l->_VP_inf_norm[0]); -		OUT_RINGf(chan, l->_VP_inf_norm[1]); -		OUT_RINGf(chan, l->_VP_inf_norm[2]); +		OUT_RINGp(chan, l->_VP_inf_norm, 3);  		BEGIN_RING(chan, kelvin, NV20TCL_LIGHT_HALF_VECTOR_X(i), 3); -		OUT_RINGf(chan, l->_h_inf_norm[0]); -		OUT_RINGf(chan, l->_h_inf_norm[1]); -		OUT_RINGf(chan, l->_h_inf_norm[2]); +		OUT_RINGp(chan, l->_h_inf_norm, 3);  	}  	if (l->_Flags & LIGHT_SPOT) { @@ -203,13 +195,7 @@ nv20_emit_light_source(GLcontext *ctx, int emit)  		nv10_get_spot_coeff(l, k);  		BEGIN_RING(chan, kelvin, NV20TCL_LIGHT_SPOT_CUTOFF_A(i), 7); -		OUT_RINGf(chan, k[0]); -		OUT_RINGf(chan, k[1]); -		OUT_RINGf(chan, k[2]); -		OUT_RINGf(chan, k[3]); -		OUT_RINGf(chan, k[4]); -		OUT_RINGf(chan, k[5]); -		OUT_RINGf(chan, k[6]); +		OUT_RINGp(chan, k, 7);  	}  } @@ -246,15 +232,11 @@ nv20_emit_material_ambient(GLcontext *ctx, int emit)  	}  	BEGIN_RING(chan, kelvin, m_scene[side], 3); -	OUT_RINGf(chan, c_scene[0]); -	OUT_RINGf(chan, c_scene[1]); -	OUT_RINGf(chan, c_scene[2]); +	OUT_RINGp(chan, c_scene, 3);  	if (ctx->Light.ColorMaterialEnabled) {  		BEGIN_RING(chan, kelvin, m_factor[side], 3); -		OUT_RINGf(chan, c_factor[0]); -		OUT_RINGf(chan, c_factor[1]); -		OUT_RINGf(chan, c_factor[2]); +		OUT_RINGp(chan, c_factor, 3);  	}  	foreach(l, &ctx->Light.EnabledList) { @@ -266,9 +248,7 @@ nv20_emit_material_ambient(GLcontext *ctx, int emit)  				  l->_MatAmbient[side]);  		BEGIN_RING(chan, kelvin, m_light[side], 3); -		OUT_RINGf(chan, c_light[0]); -		OUT_RINGf(chan, c_light[1]); -		OUT_RINGf(chan, c_light[2]); +		OUT_RINGp(chan, c_light, 3);  	}  } @@ -295,9 +275,7 @@ nv20_emit_material_diffuse(GLcontext *ctx, int emit)  				  l->_MatDiffuse[side]);  		BEGIN_RING(chan, kelvin, m_light[side], 3); -		OUT_RINGf(chan, c_light[0]); -		OUT_RINGf(chan, c_light[1]); -		OUT_RINGf(chan, c_light[2]); +		OUT_RINGp(chan, c_light, 3);  	}  } @@ -318,9 +296,7 @@ nv20_emit_material_specular(GLcontext *ctx, int emit)  				  l->_MatSpecular[side]);  		BEGIN_RING(chan, kelvin, m_light[side], 3); -		OUT_RINGf(chan, c_light[0]); -		OUT_RINGf(chan, c_light[1]); -		OUT_RINGf(chan, c_light[2]); +		OUT_RINGp(chan, c_light, 3);  	}  } @@ -340,12 +316,7 @@ nv20_emit_material_shininess(GLcontext *ctx, int emit)  		k);  	BEGIN_RING(chan, kelvin, mthd[side], 6); -	OUT_RINGf(chan, k[0]); -	OUT_RINGf(chan, k[1]); -	OUT_RINGf(chan, k[2]); -	OUT_RINGf(chan, k[3]); -	OUT_RINGf(chan, k[4]); -	OUT_RINGf(chan, k[5]); +	OUT_RINGp(chan, k, 6);  }  void @@ -359,12 +330,14 @@ nv20_emit_modelview(GLcontext *ctx, int emit)  	if (nctx->fallback != HWTNL)  		return; -	if (ctx->Light._NeedEyeCoords || ctx->Fog.Enabled) { +	if (ctx->Light._NeedEyeCoords || ctx->Fog.Enabled || +	    (ctx->Texture._GenFlags & TEXGEN_NEED_EYE_COORD)) {  		BEGIN_RING(chan, kelvin, NV20TCL_MODELVIEW0_MATRIX(0), 16);  		OUT_RINGm(chan, m->m);  	} -	if (ctx->Light.Enabled) { +	if (ctx->Light.Enabled || +	    (ctx->Texture._GenFlags & TEXGEN_NEED_EYE_COORD)) {  		int i, j;  		BEGIN_RING(chan, kelvin, diff --git a/src/mesa/drivers/dri/r128/Makefile b/src/mesa/drivers/dri/r128/Makefile index 52c5a38a70..8144c9b43f 100644 --- a/src/mesa/drivers/dri/r128/Makefile +++ b/src/mesa/drivers/dri/r128/Makefile @@ -5,8 +5,6 @@ include $(TOP)/configs/current  LIBNAME = r128_dri.so -MINIGLX_SOURCES = server/r128_dri.c  -  DRIVER_SOURCES = \  	r128_context.c \  	r128_lock.c \ diff --git a/src/mesa/drivers/dri/r128/server/r128_dri.c b/src/mesa/drivers/dri/r128/server/r128_dri.c deleted file mode 100644 index 6e3db948af..0000000000 --- a/src/mesa/drivers/dri/r128/server/r128_dri.c +++ /dev/null @@ -1,1112 +0,0 @@ -/* - * Copyright 1999, 2000 ATI Technologies Inc., Markham, Ontario, - *                      Precision Insight, Inc., Cedar Park, Texas, and - *                      VA Linux Systems Inc., Fremont, California. - * - * All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation on the rights to use, copy, modify, merge, - * publish, distribute, sublicense, and/or sell copies of the Software, - * and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice (including the - * next paragraph) shall be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NON-INFRINGEMENT.  IN NO EVENT SHALL ATI, PRECISION INSIGHT, VA LINUX - * SYSTEMS AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -/* - * Authors: - *   Kevin E. Martin <martin@valinux.com> - *   Rickard E. Faith <faith@valinux.com> - *   Daryll Strauss <daryll@valinux.com> - *   Gareth Hughes <gareth@valinux.com> - * - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <errno.h> -#include <unistd.h> -// Fix this to use kernel pci_ids.h when all of these IDs make it into the kernel  -#include "pci_ids.h" - -#include "driver.h" -#include "drm.h" -#include "memops.h" - -#include "r128.h" -#include "r128_dri.h" -#include "r128_macros.h" -#include "r128_reg.h" -#include "r128_version.h" -#include "r128_drm.h" - -static size_t r128_drm_page_size; - -/* Compute log base 2 of val. */ -static int R128MinBits(int val) -{ -    int bits; - -    if (!val) return 1; -    for (bits = 0; val; val >>= 1, ++bits); -    return bits; -} - -/* Initialize the AGP state.  Request memory for use in AGP space, and -   initialize the Rage 128 registers to point to that memory. */ -static GLboolean R128DRIAgpInit(const DRIDriverContext *ctx) -{ -    unsigned char *R128MMIO = ctx->MMIOAddress; -    R128InfoPtr info = ctx->driverPrivate; -    unsigned long mode; -    unsigned int  vendor, device; -    int           ret; -    unsigned long cntl, chunk; -    int           s, l; -    int           flags; -    unsigned long agpBase; - -    if (drmAgpAcquire(ctx->drmFD) < 0) { -	fprintf(stderr, "[agp] AGP not available\n"); -	return GL_FALSE; -    } - -				/* Modify the mode if the default mode is -				   not appropriate for this particular -				   combination of graphics card and AGP -				   chipset. */ - -    mode   = drmAgpGetMode(ctx->drmFD);        /* Default mode */ -    vendor = drmAgpVendorId(ctx->drmFD); -    device = drmAgpDeviceId(ctx->drmFD); - -    mode &= ~R128_AGP_MODE_MASK; -    switch (info->agpMode) { -    case 4:          mode |= R128_AGP_4X_MODE; -    case 2:          mode |= R128_AGP_2X_MODE; -    case 1: default: mode |= R128_AGP_1X_MODE; -    } - -    fprintf(stderr, -	       "[agp] Mode 0x%08lx [AGP 0x%04x/0x%04x; Card 0x%04x/0x%04x]\n", -	       mode, vendor, device, -	       0x1002, -	       info->Chipset); - -    if (drmAgpEnable(ctx->drmFD, mode) < 0) { -	fprintf(stderr, "[agp] AGP not enabled\n"); -	drmAgpRelease(ctx->drmFD); -	return GL_FALSE; -    } - -    info->agpOffset = 0; - -    if ((ret = drmAgpAlloc(ctx->drmFD, info->agpSize*1024*1024, 0, NULL, -			   &info->agpMemHandle)) < 0) { -	fprintf(stderr, "[agp] Out of memory (%d)\n", ret); -	drmAgpRelease(ctx->drmFD); -	return GL_FALSE; -    } -    fprintf(stderr, -	       "[agp] %d kB allocated with handle 0x%08x\n", -	       info->agpSize*1024, info->agpMemHandle); - -    if (drmAgpBind(ctx->drmFD, info->agpMemHandle, info->agpOffset) < 0) { -	fprintf(stderr, "[agp] Could not bind\n"); -	drmAgpFree(ctx->drmFD, info->agpMemHandle); -	drmAgpRelease(ctx->drmFD); -	return GL_FALSE; -    } - -				/* Initialize the CCE ring buffer data */ -    info->ringStart       = info->agpOffset; -    info->ringMapSize     = info->ringSize*1024*1024 + r128_drm_page_size; -    info->ringSizeLog2QW  = R128MinBits(info->ringSize*1024*1024/8) - 1; - -    info->ringReadOffset  = info->ringStart + info->ringMapSize; -    info->ringReadMapSize = r128_drm_page_size; - -				/* Reserve space for vertex/indirect buffers */ -    info->bufStart        = info->ringReadOffset + info->ringReadMapSize; -    info->bufMapSize      = info->bufSize*1024*1024; - -				/* Reserve the rest for AGP textures */ -    info->agpTexStart     = info->bufStart + info->bufMapSize; -    s = (info->agpSize*1024*1024 - info->agpTexStart); -    l = R128MinBits((s-1) / R128_NR_TEX_REGIONS); -    if (l < R128_LOG_TEX_GRANULARITY) l = R128_LOG_TEX_GRANULARITY; -    info->agpTexMapSize   = (s >> l) << l; -    info->log2AGPTexGran  = l; - -    if (info->CCESecure) flags = DRM_READ_ONLY; -    else                  flags = 0; - -    if (drmAddMap(ctx->drmFD, info->ringStart, info->ringMapSize, -		  DRM_AGP, flags, &info->ringHandle) < 0) { -	fprintf(stderr, -		   "[agp] Could not add ring mapping\n"); -	return GL_FALSE; -    } -    fprintf(stderr, -	       "[agp] ring handle = 0x%08x\n", info->ringHandle); - -    if (drmMap(ctx->drmFD, info->ringHandle, info->ringMapSize, -	       (drmAddressPtr)&info->ring) < 0) { -	fprintf(stderr, "[agp] Could not map ring\n"); -	return GL_FALSE; -    } -    fprintf(stderr, -	       "[agp] Ring mapped at 0x%08lx\n", -	       (unsigned long)info->ring); - -    if (drmAddMap(ctx->drmFD, info->ringReadOffset, info->ringReadMapSize, -		  DRM_AGP, flags, &info->ringReadPtrHandle) < 0) { -	fprintf(stderr, -		   "[agp] Could not add ring read ptr mapping\n"); -	return GL_FALSE; -    } -    fprintf(stderr, - 	       "[agp] ring read ptr handle = 0x%08x\n", -	       info->ringReadPtrHandle); - -    if (drmMap(ctx->drmFD, info->ringReadPtrHandle, info->ringReadMapSize, -	       (drmAddressPtr)&info->ringReadPtr) < 0) { -	fprintf(stderr, -		   "[agp] Could not map ring read ptr\n"); -	return GL_FALSE; -    } -    fprintf(stderr, -	       "[agp] Ring read ptr mapped at 0x%08lx\n", -	       (unsigned long)info->ringReadPtr); - -    if (drmAddMap(ctx->drmFD, info->bufStart, info->bufMapSize, -		  DRM_AGP, 0, &info->bufHandle) < 0) { -	fprintf(stderr, -		   "[agp] Could not add vertex/indirect buffers mapping\n"); -	return GL_FALSE; -    } -    fprintf(stderr, -	       "[agp] vertex/indirect buffers handle = 0x%08lx\n", -	       info->bufHandle); - -    if (drmMap(ctx->drmFD, info->bufHandle, info->bufMapSize, -	       (drmAddressPtr)&info->buf) < 0) { -	fprintf(stderr, -		   "[agp] Could not map vertex/indirect buffers\n"); -	return GL_FALSE; -    } -    fprintf(stderr, -	       "[agp] Vertex/indirect buffers mapped at 0x%08lx\n", -	       (unsigned long)info->buf); - -    if (drmAddMap(ctx->drmFD, info->agpTexStart, info->agpTexMapSize, -		  DRM_AGP, 0, &info->agpTexHandle) < 0) { -	fprintf(stderr, -		   "[agp] Could not add AGP texture map mapping\n"); -	return GL_FALSE; -    } -    fprintf(stderr, -	       "[agp] AGP texture map handle = 0x%08lx\n", -	       info->agpTexHandle); - -    if (drmMap(ctx->drmFD, info->agpTexHandle, info->agpTexMapSize, -	       (drmAddressPtr)&info->agpTex) < 0) { -	fprintf(stderr, -		   "[agp] Could not map AGP texture map\n"); -	return GL_FALSE; -    } -    fprintf(stderr, -	       "[agp] AGP Texture map mapped at 0x%08lx\n", -	       (unsigned long)info->agpTex); - -				/* Initialize Rage 128's AGP registers */ -    cntl  = INREG(R128_AGP_CNTL); -    cntl &= ~R128_AGP_APER_SIZE_MASK; -    switch (info->agpSize) { -    case 256: cntl |= R128_AGP_APER_SIZE_256MB; break; -    case 128: cntl |= R128_AGP_APER_SIZE_128MB; break; -    case  64: cntl |= R128_AGP_APER_SIZE_64MB;  break; -    case  32: cntl |= R128_AGP_APER_SIZE_32MB;  break; -    case  16: cntl |= R128_AGP_APER_SIZE_16MB;  break; -    case   8: cntl |= R128_AGP_APER_SIZE_8MB;   break; -    case   4: cntl |= R128_AGP_APER_SIZE_4MB;   break; -    default: -	fprintf(stderr, -		   "[agp] Illegal aperture size %d kB\n", -		   info->agpSize*1024); -	return GL_FALSE; -    } -    agpBase = drmAgpBase(ctx->drmFD); -    OUTREG(R128_AGP_BASE, agpBase);  -    OUTREG(R128_AGP_CNTL, cntl); - -				/* Disable Rage 128's PCIGART registers */ -    chunk = INREG(R128_BM_CHUNK_0_VAL); -    chunk &= ~(R128_BM_PTR_FORCE_TO_PCI | -	       R128_BM_PM4_RD_FORCE_TO_PCI | -	       R128_BM_GLOBAL_FORCE_TO_PCI); -    OUTREG(R128_BM_CHUNK_0_VAL, chunk); - -    OUTREG(R128_PCI_GART_PAGE, 1); /* Ensure AGP GART is used (for now) */ - -    return GL_TRUE; -} - -static GLboolean R128DRIPciInit(const DRIDriverContext *ctx) -{ -    R128InfoPtr info = ctx->driverPrivate; -    unsigned char *R128MMIO = ctx->MMIOAddress; -    uint32_t chunk; -    int ret; -    int flags; - -    info->agpOffset = 0; - -    ret = drmScatterGatherAlloc(ctx->drmFD, info->agpSize*1024*1024, -				&info->pciMemHandle); -    if (ret < 0) { -	fprintf(stderr, "[pci] Out of memory (%d)\n", ret); -	return GL_FALSE; -    } -    fprintf(stderr, -	       "[pci] %d kB allocated with handle 0x%08x\n", -	       info->agpSize*1024, info->pciMemHandle); - -				/* Initialize the CCE ring buffer data */ -    info->ringStart       = info->agpOffset; -    info->ringMapSize     = info->ringSize*1024*1024 + r128_drm_page_size; -    info->ringSizeLog2QW  = R128MinBits(info->ringSize*1024*1024/8) - 1; - -    info->ringReadOffset  = info->ringStart + info->ringMapSize; -    info->ringReadMapSize = r128_drm_page_size; - -				/* Reserve space for vertex/indirect buffers */ -    info->bufStart        = info->ringReadOffset + info->ringReadMapSize; -    info->bufMapSize      = info->bufSize*1024*1024; - -    flags = DRM_READ_ONLY | DRM_LOCKED | DRM_KERNEL; - -    if (drmAddMap(ctx->drmFD, info->ringStart, info->ringMapSize, -		  DRM_SCATTER_GATHER, flags, &info->ringHandle) < 0) { -	fprintf(stderr, -		   "[pci] Could not add ring mapping\n"); -	return GL_FALSE; -    } -    fprintf(stderr, -	       "[pci] ring handle = 0x%08lx\n", info->ringHandle); - -    if (drmMap(ctx->drmFD, info->ringHandle, info->ringMapSize, -	       (drmAddressPtr)&info->ring) < 0) { -	fprintf(stderr, "[pci] Could not map ring\n"); -	return GL_FALSE; -    } -    fprintf(stderr, -	       "[pci] Ring mapped at 0x%08lx\n", -	       (unsigned long)info->ring); -    fprintf(stderr, -	       "[pci] Ring contents 0x%08lx\n", -	       *(unsigned long *)info->ring); - -    if (drmAddMap(ctx->drmFD, info->ringReadOffset, info->ringReadMapSize, -		  DRM_SCATTER_GATHER, flags, &info->ringReadPtrHandle) < 0) { -	fprintf(stderr, -		   "[pci] Could not add ring read ptr mapping\n"); -	return GL_FALSE; -    } -    fprintf(stderr, -	       "[pci] ring read ptr handle = 0x%08lx\n", -	       info->ringReadPtrHandle); - -    if (drmMap(ctx->drmFD, info->ringReadPtrHandle, info->ringReadMapSize, -	       (drmAddressPtr)&info->ringReadPtr) < 0) { -	fprintf(stderr, -		   "[pci] Could not map ring read ptr\n"); -	return GL_FALSE; -    } -    fprintf(stderr, -	       "[pci] Ring read ptr mapped at 0x%08lx\n", -	       (unsigned long)info->ringReadPtr); -    fprintf(stderr, -	       "[pci] Ring read ptr contents 0x%08lx\n", -	       *(unsigned long *)info->ringReadPtr); - -    if (drmAddMap(ctx->drmFD, info->bufStart, info->bufMapSize, -		  DRM_SCATTER_GATHER, 0, &info->bufHandle) < 0) { -	fprintf(stderr, -		   "[pci] Could not add vertex/indirect buffers mapping\n"); -	return GL_FALSE; -    } -    fprintf(stderr, -	       "[pci] vertex/indirect buffers handle = 0x%08lx\n", -	       info->bufHandle); - -    if (drmMap(ctx->drmFD, info->bufHandle, info->bufMapSize, -	       (drmAddressPtr)&info->buf) < 0) { -	fprintf(stderr, -		   "[pci] Could not map vertex/indirect buffers\n"); -	return GL_FALSE; -    } -    fprintf(stderr, -	       "[pci] Vertex/indirect buffers mapped at 0x%08lx\n", -	       (unsigned long)info->buf); -    fprintf(stderr, -	       "[pci] Vertex/indirect buffers contents 0x%08lx\n", -	       *(unsigned long *)info->buf); - -    if (!info->IsPCI) { -	/* This is really an AGP card, force PCI GART mode */ -        chunk = INREG(R128_BM_CHUNK_0_VAL); -        chunk |= (R128_BM_PTR_FORCE_TO_PCI | -		  R128_BM_PM4_RD_FORCE_TO_PCI | -		  R128_BM_GLOBAL_FORCE_TO_PCI); -        OUTREG(R128_BM_CHUNK_0_VAL, chunk); -        OUTREG(R128_PCI_GART_PAGE, 0); /* Ensure PCI GART is used */ -    } - -    return GL_TRUE; -} - -/* Add a map for the MMIO registers that will be accessed by any -   DRI-based clients. */ -static GLboolean R128DRIMapInit(const DRIDriverContext *ctx) -{ -    R128InfoPtr info = ctx->driverPrivate; -    int flags; - -    if (info->CCESecure) flags = DRM_READ_ONLY; -    else                 flags = 0; - -				/* Map registers */ -    if (drmAddMap(ctx->drmFD, ctx->MMIOStart, ctx->MMIOSize, -		  DRM_REGISTERS, flags, &info->registerHandle) < 0) { -	return GL_FALSE; -    } -    fprintf(stderr, -	       "[drm] register handle = 0x%08x\n", info->registerHandle); - -    return GL_TRUE; -} - -/* Initialize the kernel data structures. */ -static int R128DRIKernelInit(const DRIDriverContext *ctx) -{ -    R128InfoPtr info = ctx->driverPrivate; -    drm_r128_init_t drmInfo; - -    memset( &drmInfo, 0, sizeof(&drmInfo) ); - -    drmInfo.func                = R128_INIT_CCE; -    drmInfo.sarea_priv_offset   = sizeof(drm_sarea_t); -    drmInfo.is_pci              = info->IsPCI; -    drmInfo.cce_mode            = info->CCEMode; -    drmInfo.cce_secure          = info->CCESecure; -    drmInfo.ring_size           = info->ringSize*1024*1024; -    drmInfo.usec_timeout        = info->CCEusecTimeout; - -    drmInfo.fb_bpp              = ctx->bpp; -    drmInfo.depth_bpp           = ctx->bpp; - -    drmInfo.front_offset        = info->frontOffset; -    drmInfo.front_pitch         = info->frontPitch; - -    drmInfo.back_offset         = info->backOffset; -    drmInfo.back_pitch          = info->backPitch; - -    drmInfo.depth_offset        = info->depthOffset; -    drmInfo.depth_pitch         = info->depthPitch; -    drmInfo.span_offset         = info->spanOffset; - -    drmInfo.fb_offset           = info->LinearAddr; -    drmInfo.mmio_offset         = info->registerHandle; -    drmInfo.ring_offset         = info->ringHandle; -    drmInfo.ring_rptr_offset    = info->ringReadPtrHandle; -    drmInfo.buffers_offset      = info->bufHandle; -    drmInfo.agp_textures_offset = info->agpTexHandle; - -    if (drmCommandWrite(ctx->drmFD, DRM_R128_INIT, -                        &drmInfo, sizeof(drmInfo)) < 0) -        return GL_FALSE; - -    return GL_TRUE; -} - -/* Add a map for the vertex buffers that will be accessed by any -   DRI-based clients. */ -static GLboolean R128DRIBufInit(const DRIDriverContext *ctx) -{ -    R128InfoPtr info = ctx->driverPrivate; -				/* Initialize vertex buffers */ -    if (info->IsPCI) { -	info->bufNumBufs = drmAddBufs(ctx->drmFD, -				      info->bufMapSize / R128_BUFFER_SIZE, -				      R128_BUFFER_SIZE, -				      DRM_SG_BUFFER, -				      info->bufStart); -    } else { -	info->bufNumBufs = drmAddBufs(ctx->drmFD, -				      info->bufMapSize / R128_BUFFER_SIZE, -				      R128_BUFFER_SIZE, -				      DRM_AGP_BUFFER, -				      info->bufStart); -    } -    if (info->bufNumBufs <= 0) { -	fprintf(stderr, -		   "[drm] Could not create vertex/indirect buffers list\n"); -	return GL_FALSE; -    } -    fprintf(stderr, -	       "[drm] Added %d %d byte vertex/indirect buffers\n", -	       info->bufNumBufs, R128_BUFFER_SIZE); - -    if (!(info->buffers = drmMapBufs(ctx->drmFD))) { -	fprintf(stderr, -		   "[drm] Failed to map vertex/indirect buffers list\n"); -	return GL_FALSE; -    } -    fprintf(stderr, -	       "[drm] Mapped %d vertex/indirect buffers\n", -	       info->buffers->count); - -    return GL_TRUE; -} - -static void R128DRIIrqInit(const DRIDriverContext *ctx) -{ -   R128InfoPtr info = ctx->driverPrivate; -   unsigned char *R128MMIO = ctx->MMIOAddress; -    -   if (!info->irq) { -       info->irq = drmGetInterruptFromBusID( -	   ctx->drmFD, -	   ctx->pciBus, -	   ctx->pciDevice, -	   ctx->pciFunc); - -      if((drmCtlInstHandler(ctx->drmFD, info->irq)) != 0) { -	 fprintf(stderr, -		    "[drm] failure adding irq handler, " -		    "there is a device already using that irq\n" -		    "[drm] falling back to irq-free operation\n"); -	 info->irq = 0; -      } else { -          info->gen_int_cntl = INREG( R128_GEN_INT_CNTL ); -      } -   } - -   if (info->irq) -      fprintf(stderr, -		 "[drm] dma control initialized, using IRQ %d\n", -		 info->irq); -} - -static int R128CCEStop(const DRIDriverContext *ctx) -{ -    R128InfoPtr info = ctx->driverPrivate; -    drm_r128_cce_stop_t stop; -    int            ret, i; - -    stop.flush = 1; -    stop.idle  = 1; - -    ret = drmCommandWrite( ctx->drmFD, DRM_R128_CCE_STOP, -                           &stop, sizeof(stop) ); - -    if ( ret == 0 ) { -        return 0; -    } else if ( errno != EBUSY ) { -        return -errno; -    } - -    stop.flush = 0; - -    i = 0; -    do { -        ret = drmCommandWrite( ctx->drmFD, DRM_R128_CCE_STOP, -                               &stop, sizeof(stop) ); -    } while ( ret && errno == EBUSY && i++ < R128_IDLE_RETRY ); - -    if ( ret == 0 ) { -        return 0; -    } else if ( errno != EBUSY ) { -        return -errno; -    } - -    stop.idle = 0; - -    if ( drmCommandWrite( ctx->drmFD, DRM_R128_CCE_STOP, -                          &stop, sizeof(stop) )) { -        return -errno; -    } else { -        return 0; -    } -} - -/* Initialize the CCE state, and start the CCE (if used by the X server) */ -static void R128DRICCEInit(const DRIDriverContext *ctx) -{ -   R128InfoPtr info = ctx->driverPrivate; - -				/* Turn on bus mastering */ -    info->BusCntl &= ~R128_BUS_MASTER_DIS; - -				/* CCEMode is initialized in r128_driver.c */ -    switch (info->CCEMode) { -    case R128_PM4_NONPM4:                 info->CCEFifoSize = 0;   break; -    case R128_PM4_192PIO:                 info->CCEFifoSize = 192; break; -    case R128_PM4_192BM:                  info->CCEFifoSize = 192; break; -    case R128_PM4_128PIO_64INDBM:         info->CCEFifoSize = 128; break; -    case R128_PM4_128BM_64INDBM:          info->CCEFifoSize = 128; break; -    case R128_PM4_64PIO_128INDBM:         info->CCEFifoSize = 64;  break; -    case R128_PM4_64BM_128INDBM:          info->CCEFifoSize = 64;  break; -    case R128_PM4_64PIO_64VCBM_64INDBM:   info->CCEFifoSize = 64;  break; -    case R128_PM4_64BM_64VCBM_64INDBM:    info->CCEFifoSize = 64;  break; -    case R128_PM4_64PIO_64VCPIO_64INDPIO: info->CCEFifoSize = 64;  break; -    } - -    /* Make sure the CCE is on for the X server */ -    R128CCE_START(ctx, info); -} - - -static int R128MemoryInit(const DRIDriverContext *ctx) -{ -   R128InfoPtr info = ctx->driverPrivate; -   int        width_bytes = ctx->shared.virtualWidth * ctx->cpp; -   int        cpp         = ctx->cpp; -   int        bufferSize  = ((ctx->shared.virtualHeight * width_bytes -			      + R128_BUFFER_ALIGN) -			     & ~R128_BUFFER_ALIGN); -   int        depthSize   = ((((ctx->shared.virtualHeight+15) & ~15) * width_bytes -			      + R128_BUFFER_ALIGN) -			     & ~R128_BUFFER_ALIGN); -   int        l; - -   info->frontOffset = 0; -   info->frontPitch = ctx->shared.virtualWidth; - -   fprintf(stderr,  -	   "Using %d MB AGP aperture\n", info->agpSize); -   fprintf(stderr,  -	   "Using %d MB for the ring buffer\n", info->ringSize); -   fprintf(stderr,  -	   "Using %d MB for vertex/indirect buffers\n", info->bufSize); -   fprintf(stderr,  -	   "Using %d MB for AGP textures\n", info->agpTexSize); - -   /* Front, back and depth buffers - everything else texture?? -    */ -   info->textureSize = ctx->shared.fbSize - 2 * bufferSize - depthSize; - -   if (info->textureSize < 0)  -      return 0; - -   l = R128MinBits((info->textureSize-1) / R128_NR_TEX_REGIONS); -   if (l < R128_LOG_TEX_GRANULARITY) l = R128_LOG_TEX_GRANULARITY; - -   /* Round the texture size up to the nearest whole number of -    * texture regions.  Again, be greedy about this, don't -    * round down. -    */ -   info->log2TexGran = l; -   info->textureSize = (info->textureSize >> l) << l; - -   /* Set a minimum usable local texture heap size.  This will fit -    * two 256x256x32bpp textures. -    */ -   if (info->textureSize < 512 * 1024) { -      info->textureOffset = 0; -      info->textureSize = 0; -   } - -   /* Reserve space for textures */ -   info->textureOffset = ((ctx->shared.fbSize - info->textureSize + -			   R128_BUFFER_ALIGN) & -			  ~R128_BUFFER_ALIGN); - -   /* Reserve space for the shared depth -    * buffer. -    */ -   info->depthOffset = ((info->textureOffset - depthSize + -			 R128_BUFFER_ALIGN) & -			~R128_BUFFER_ALIGN); -   info->depthPitch = ctx->shared.virtualWidth; - -   info->backOffset = ((info->depthOffset - bufferSize + -			R128_BUFFER_ALIGN) & -		       ~R128_BUFFER_ALIGN); -   info->backPitch = ctx->shared.virtualWidth; - - -   fprintf(stderr,  -	   "Will use back buffer at offset 0x%x\n", -	   info->backOffset); -   fprintf(stderr,  -	   "Will use depth buffer at offset 0x%x\n", -	   info->depthOffset); -   fprintf(stderr,  -	   "Will use %d kb for textures at offset 0x%x\n", -	   info->textureSize/1024, info->textureOffset); - -   return 1; -}  - - -/* Initialize the screen-specific data structures for the DRI and the -   Rage 128.  This is the main entry point to the device-specific -   initialization code.  It calls device-independent DRI functions to -   create the DRI data structures and initialize the DRI state. */ -static GLboolean R128DRIScreenInit(DRIDriverContext *ctx) -{ -    R128InfoPtr info = ctx->driverPrivate; -    R128DRIPtr    pR128DRI; -    int           err, major, minor, patch; -    drmVersionPtr version; -    drm_r128_sarea_t *pSAREAPriv; - -    switch (ctx->bpp) { -    case 8: -	/* These modes are not supported (yet). */ -    case 15: -    case 24: -	fprintf(stderr, -		   "[dri] R128DRIScreenInit failed (depth %d not supported).  " -		   "[dri] Disabling DRI.\n", ctx->bpp); -	return GL_FALSE; - -	/* Only 16 and 32 color depths are supports currently. */ -    case 16: -    case 32: -	break; -    } -    r128_drm_page_size = getpagesize(); -     -    info->registerSize = ctx->MMIOSize; -    ctx->shared.SAREASize = SAREA_MAX; - -    /* Note that drmOpen will try to load the kernel module, if needed. */ -    ctx->drmFD = drmOpen("r128", NULL ); -    if (ctx->drmFD < 0) { -	fprintf(stderr, "[drm] drmOpen failed\n"); -	return 0; -    } -     -    /* Check the r128 DRM version */ -    version = drmGetVersion(ctx->drmFD); -    if (version) { -	if (version->version_major != 2 || -	    version->version_minor < 2) { -	    /* incompatible drm version */ -	    fprintf(stderr, -		"[dri] R128DRIScreenInit failed because of a version mismatch.\n" -		"[dri] r128.o kernel module version is %d.%d.%d but version 2.2 or greater is needed.\n" -		"[dri] Disabling the DRI.\n", -		version->version_major, -		version->version_minor, -		version->version_patchlevel); -	    drmFreeVersion(version); -	    return GL_FALSE; -	} -	info->drmMinor = version->version_minor; -	drmFreeVersion(version); -    } -     -    if ((err = drmSetBusid(ctx->drmFD, ctx->pciBusID)) < 0) { -	fprintf(stderr, "[drm] drmSetBusid failed (%d, %s), %s\n", -		ctx->drmFD, ctx->pciBusID, strerror(-err)); -	return 0; -    } -     -   if (drmAddMap( ctx->drmFD, -		  0, -		  ctx->shared.SAREASize, -		  DRM_SHM, -		  DRM_CONTAINS_LOCK, -		  &ctx->shared.hSAREA) < 0) -   { -      fprintf(stderr, "[drm] drmAddMap failed\n"); -      return 0; -   } -   fprintf(stderr, "[drm] added %d byte SAREA at 0x%08lx\n", -	   ctx->shared.SAREASize, ctx->shared.hSAREA); - -   if (drmMap( ctx->drmFD, -	       ctx->shared.hSAREA, -	       ctx->shared.SAREASize, -	       (drmAddressPtr)(&ctx->pSAREA)) < 0) -   { -      fprintf(stderr, "[drm] drmMap failed\n"); -      return 0; -   } -   memset(ctx->pSAREA, 0, ctx->shared.SAREASize); -   fprintf(stderr, "[drm] mapped SAREA 0x%08lx to %p, size %d\n", -	   ctx->shared.hSAREA, ctx->pSAREA, ctx->shared.SAREASize); -    -   /* Need to AddMap the framebuffer and mmio regions here: -    */ -   if (drmAddMap( ctx->drmFD, -		  (drm_handle_t)ctx->FBStart, -		  ctx->FBSize, -		  DRM_FRAME_BUFFER, -		  0, -		  &ctx->shared.hFrameBuffer) < 0) -   { -      fprintf(stderr, "[drm] drmAddMap framebuffer failed\n"); -      return 0; -   } - -   fprintf(stderr, "[drm] framebuffer handle = 0x%08lx\n", -	   ctx->shared.hFrameBuffer); - -   if (!R128MemoryInit(ctx)) -	return GL_FALSE; -    -				/* Initialize AGP */ -    if (!info->IsPCI && !R128DRIAgpInit(ctx)) { -	info->IsPCI = GL_TRUE; -	fprintf(stderr, -		   "[agp] AGP failed to initialize -- falling back to PCI mode.\n"); -	fprintf(stderr, -		   "[agp] Make sure you have the agpgart kernel module loaded.\n"); -    } - -				/* Initialize PCIGART */ -    if (info->IsPCI && !R128DRIPciInit(ctx)) { -	return GL_FALSE; -    } - -				/* DRIScreenInit doesn't add all the -				   common mappings.  Add additional -				   mappings here. */ -    if (!R128DRIMapInit(ctx)) { -	return GL_FALSE; -    } - -   /* Create a 'server' context so we can grab the lock for -    * initialization ioctls. -    */ -   if ((err = drmCreateContext(ctx->drmFD, &ctx->serverContext)) != 0) { -      fprintf(stderr, "%s: drmCreateContext failed %d\n", __FUNCTION__, err); -      return 0; -   } - -   DRM_LOCK(ctx->drmFD, ctx->pSAREA, ctx->serverContext, 0);  - -    /* Initialize the kernel data structures */ -    if (!R128DRIKernelInit(ctx)) { -	return GL_FALSE; -    } - -    /* Initialize the vertex buffers list */ -    if (!R128DRIBufInit(ctx)) { -	return GL_FALSE; -    } - -    /* Initialize IRQ */ -    R128DRIIrqInit(ctx); - -    /* Initialize and start the CCE if required */ -    R128DRICCEInit(ctx); - -   /* Quick hack to clear the front & back buffers.  Could also use -    * the clear ioctl to do this, but would need to setup hw state -    * first. -    */ -   drimemsetio((char *)ctx->FBAddress + info->frontOffset, -	  0, -	  info->frontPitch * ctx->cpp * ctx->shared.virtualHeight ); - -   drimemsetio((char *)ctx->FBAddress + info->backOffset, -	  0, -	  info->backPitch * ctx->cpp * ctx->shared.virtualHeight ); -     -    pSAREAPriv = (drm_r128_sarea_t *)(((char*)ctx->pSAREA) +  -					sizeof(drm_sarea_t)); -    memset(pSAREAPriv, 0, sizeof(*pSAREAPriv)); - -   /* This is the struct passed to radeon_dri.so for its initialization */ -   ctx->driverClientMsg = malloc(sizeof(R128DRIRec)); -   ctx->driverClientMsgSize = sizeof(R128DRIRec); -    -    pR128DRI                    = (R128DRIPtr)ctx->driverClientMsg; -    pR128DRI->deviceID          = info->Chipset; -    pR128DRI->width             = ctx->shared.virtualWidth; -    pR128DRI->height            = ctx->shared.virtualHeight; -    pR128DRI->depth             = ctx->bpp; -    pR128DRI->bpp               = ctx->bpp; - -    pR128DRI->IsPCI             = info->IsPCI; -    pR128DRI->AGPMode           = info->agpMode; - -    pR128DRI->frontOffset       = info->frontOffset; -    pR128DRI->frontPitch        = info->frontPitch; -    pR128DRI->backOffset        = info->backOffset; -    pR128DRI->backPitch         = info->backPitch; -    pR128DRI->depthOffset       = info->depthOffset; -    pR128DRI->depthPitch        = info->depthPitch; -    pR128DRI->spanOffset        = info->spanOffset; -    pR128DRI->textureOffset     = info->textureOffset; -    pR128DRI->textureSize       = info->textureSize; -    pR128DRI->log2TexGran       = info->log2TexGran; - -    pR128DRI->registerHandle    = info->registerHandle; -    pR128DRI->registerSize      = info->registerSize; - -    pR128DRI->agpTexHandle      = info->agpTexHandle; -    pR128DRI->agpTexMapSize     = info->agpTexMapSize; -    pR128DRI->log2AGPTexGran    = info->log2AGPTexGran; -    pR128DRI->agpTexOffset      = info->agpTexStart; -    pR128DRI->sarea_priv_offset = sizeof(drm_sarea_t); - -    return GL_TRUE; -} - -/* The screen is being closed, so clean up any state and free any -   resources used by the DRI. */ -void R128DRICloseScreen(const DRIDriverContext *ctx) -{ -    R128InfoPtr info = ctx->driverPrivate; -    drm_r128_init_t drmInfo; - -    /* Stop the CCE if it is still in use */ -    R128CCE_STOP(ctx, info); - -    if (info->irq) { -	drmCtlUninstHandler(ctx->drmFD); -	info->irq = 0; -    } - -    /* De-allocate vertex buffers */ -    if (info->buffers) { -	drmUnmapBufs(info->buffers); -	info->buffers = NULL; -    } - -    /* De-allocate all kernel resources */ -    memset(&drmInfo, 0, sizeof(drmInfo)); -    drmInfo.func = R128_CLEANUP_CCE; -    drmCommandWrite(ctx->drmFD, DRM_R128_INIT, -                    &drmInfo, sizeof(drmInfo)); - -    /* De-allocate all AGP resources */ -    if (info->agpTex) { -	drmUnmap(info->agpTex, info->agpTexMapSize); -	info->agpTex = NULL; -    } -    if (info->buf) { -	drmUnmap(info->buf, info->bufMapSize); -	info->buf = NULL; -    } -    if (info->ringReadPtr) { -	drmUnmap(info->ringReadPtr, info->ringReadMapSize); -	info->ringReadPtr = NULL; -    } -    if (info->ring) { -	drmUnmap(info->ring, info->ringMapSize); -	info->ring = NULL; -    } -    if (info->agpMemHandle != DRM_AGP_NO_HANDLE) { -	drmAgpUnbind(ctx->drmFD, info->agpMemHandle); -	drmAgpFree(ctx->drmFD, info->agpMemHandle); -	info->agpMemHandle = 0; -	drmAgpRelease(ctx->drmFD); -    } -    if (info->pciMemHandle) { -	drmScatterGatherFree(ctx->drmFD, info->pciMemHandle); -	info->pciMemHandle = 0; -    } -} - -static GLboolean R128PreInitDRI(const DRIDriverContext *ctx) -{ -    R128InfoPtr info = ctx->driverPrivate; - -    /*info->CCEMode = R128_DEFAULT_CCE_PIO_MODE;*/ -    info->CCEMode = R128_DEFAULT_CCE_BM_MODE; -    info->CCESecure = GL_TRUE; - -    info->agpMode        = R128_DEFAULT_AGP_MODE; -    info->agpSize        = R128_DEFAULT_AGP_SIZE; -    info->ringSize       = R128_DEFAULT_RING_SIZE; -    info->bufSize        = R128_DEFAULT_BUFFER_SIZE; -    info->agpTexSize     = R128_DEFAULT_AGP_TEX_SIZE; - -    info->CCEusecTimeout = R128_DEFAULT_CCE_TIMEOUT; - -    return GL_TRUE; -} - -/** - * \brief Initialize the framebuffer device mode - * - * \param ctx display handle. - * - * \return one on success, or zero on failure. - * - * Fills in \p info with some default values and some information from \p ctx - * and then calls R128ScreenInit() for the screen initialization. - *  - * Before exiting clears the framebuffer memory accessing it directly. - */ -static int R128InitFBDev( DRIDriverContext *ctx ) -{ -   R128InfoPtr info = calloc(1, sizeof(*info)); - -   { -      int  dummy = ctx->shared.virtualWidth; - -      switch (ctx->bpp / 8) { -      case 1: dummy = (ctx->shared.virtualWidth + 127) & ~127; break; -      case 2: dummy = (ctx->shared.virtualWidth +  31) &  ~31; break; -      case 3: -      case 4: dummy = (ctx->shared.virtualWidth +  15) &  ~15; break; -      } - -      ctx->shared.virtualWidth = dummy; -   } - -   ctx->driverPrivate = (void *)info; -    -   info->Chipset = ctx->chipset; - -   switch (info->Chipset) { -   case PCI_DEVICE_ID_ATI_RAGE128_LE: -   case PCI_DEVICE_ID_ATI_RAGE128_RE: -   case PCI_DEVICE_ID_ATI_RAGE128_RK: -   case PCI_DEVICE_ID_ATI_RAGE128_PD: -   case PCI_DEVICE_ID_ATI_RAGE128_PP: -   case PCI_DEVICE_ID_ATI_RAGE128_PR: -       /* This is a PCI card */ -       info->IsPCI = GL_TRUE; -       break; -   default: -       /* This is an AGP card */ -       info->IsPCI = GL_FALSE; -       break; -   } - -   info->frontPitch = ctx->shared.virtualWidth; -   info->LinearAddr = ctx->FBStart & 0xfc000000; -    -   if (!R128PreInitDRI(ctx)) -       return 0; - -   if (!R128DRIScreenInit(ctx)) -      return 0; - -   return 1; -} - - -/** - * \brief The screen is being closed, so clean up any state and free any - * resources used by the DRI. - * - * \param ctx display handle. - * - * Unmaps the SAREA, closes the DRM device file descriptor and frees the driver - * private data. - */ -static void R128HaltFBDev( DRIDriverContext *ctx ) -{ -    drmUnmap( ctx->pSAREA, ctx->shared.SAREASize ); -    drmClose(ctx->drmFD); - -    if (ctx->driverPrivate) { -       free(ctx->driverPrivate); -       ctx->driverPrivate = 0; -    } -} - - -/** - * \brief Validate the fbdev mode. - *  - * \param ctx display handle. - * - * \return one on success, or zero on failure. - * - * Saves some registers and returns 1. - * - * \sa R128PostValidateMode(). - */ -static int R128ValidateMode( const DRIDriverContext *ctx ) -{ -   return 1; -} - - -/** - * \brief Examine mode returned by fbdev. - *  - * \param ctx display handle. - * - * \return one on success, or zero on failure. - * - * Restores registers that fbdev has clobbered and returns 1. - * - * \sa R128ValidateMode(). - */ -static int R128PostValidateMode( const DRIDriverContext *ctx ) -{ -   return 1; -} - - -/** - * \brief Shutdown the drawing engine. - * - * \param ctx display handle - * - * Turns off the command processor engine & restores the graphics card - * to a state that fbdev understands. - */ -static int R128EngineShutdown( const DRIDriverContext *ctx ) -{ -    return 1; -} - -/** - * \brief Restore the drawing engine. - * - * \param ctx display handle - * - * Resets the graphics card and sets initial values for several registers of - * the card's drawing engine. - * - * Turns on the R128 command processor engine (i.e., the ringbuffer). - */ -static int R128EngineRestore( const DRIDriverContext *ctx ) -{ -   return 1; -} - - -/** - * \brief Exported driver interface for Mini GLX. - * - * \sa DRIDriverRec. - */ -const struct DRIDriverRec __driDriver = { -   R128ValidateMode, -   R128PostValidateMode, -   R128InitFBDev, -   R128HaltFBDev, -   R128EngineShutdown, -   R128EngineRestore,   -   0, -}; diff --git a/src/mesa/drivers/dri/r200/Makefile b/src/mesa/drivers/dri/r200/Makefile index 14eb96c1ba..c9c1346c3a 100644 --- a/src/mesa/drivers/dri/r200/Makefile +++ b/src/mesa/drivers/dri/r200/Makefile @@ -7,8 +7,6 @@ CFLAGS += $(RADEON_CFLAGS)  LIBNAME = r200_dri.so -MINIGLX_SOURCES = server/radeon_dri.c  -  ifeq ($(RADEON_LDFLAGS),)  CS_SOURCES = radeon_cs_space_drm.c radeon_bo.c radeon_cs.c  endif @@ -23,17 +21,19 @@ RADEON_COMMON_SOURCES = \  	radeon_fbo.c \  	radeon_lock.c \  	radeon_mipmap_tree.c \ +	radeon_pixel_read.c \  	radeon_queryobj.c \  	radeon_span.c \  	radeon_texture.c \ -	radeon_tex_copy.c +	radeon_tex_copy.c \ +	radeon_tex_getimage.c \ +	radeon_tile.c  DRIVER_SOURCES = r200_context.c \  		 r200_ioctl.c \  		 r200_state.c \  		 r200_state_init.c \  		 r200_cmdbuf.c \ -		 r200_pixel.c \  		 r200_tex.c \  		 r200_texstate.c \  		 r200_tcl.c \ diff --git a/src/mesa/drivers/dri/r200/r200_blit.c b/src/mesa/drivers/dri/r200/r200_blit.c index 3075760093..e187fc0f61 100644 --- a/src/mesa/drivers/dri/r200/r200_blit.c +++ b/src/mesa/drivers/dri/r200/r200_blit.c @@ -48,6 +48,11 @@ unsigned r200_check_blit(gl_format mesa_format)      case MESA_FORMAT_ARGB4444:      case MESA_FORMAT_ARGB1555:      case MESA_FORMAT_A8: +    case MESA_FORMAT_L8: +    case MESA_FORMAT_I8: +    /* swizzled */ +    case MESA_FORMAT_RGBA8888: +    case MESA_FORMAT_RGBA8888_REV:  	    break;      default:  	    return 0; @@ -86,7 +91,8 @@ static inline void emit_vtx_state(struct r200_context *r200)  }  static void inline emit_tx_setup(struct r200_context *r200, -				 gl_format mesa_format, +				 gl_format src_mesa_format, +				 gl_format dst_mesa_format,  				 struct radeon_bo *bo,  				 intptr_t offset,  				 unsigned width, @@ -101,10 +107,16 @@ static void inline emit_tx_setup(struct r200_context *r200,      assert(offset % 32 == 0);      /* XXX others?  BE/LE? */ -    switch (mesa_format) { +    switch (src_mesa_format) {      case MESA_FORMAT_ARGB8888:  	    txformat |= R200_TXFORMAT_ARGB8888 | R200_TXFORMAT_ALPHA_IN_MAP;  	    break; +    case MESA_FORMAT_RGBA8888: +	    txformat |= R200_TXFORMAT_RGBA8888 | R200_TXFORMAT_ALPHA_IN_MAP; +	    break; +    case MESA_FORMAT_RGBA8888_REV: +	    txformat |= R200_TXFORMAT_ABGR8888 | R200_TXFORMAT_ALPHA_IN_MAP; +	    break;      case MESA_FORMAT_XRGB8888:  	    txformat |= R200_TXFORMAT_ARGB8888;  	    break; @@ -118,26 +130,143 @@ static void inline emit_tx_setup(struct r200_context *r200,  	    txformat |= R200_TXFORMAT_ARGB1555 | R200_TXFORMAT_ALPHA_IN_MAP;  	    break;      case MESA_FORMAT_A8: +    case MESA_FORMAT_I8:  	    txformat |= R200_TXFORMAT_I8 | R200_TXFORMAT_ALPHA_IN_MAP;  	    break; +    case MESA_FORMAT_L8: +	    txformat |= R200_TXFORMAT_I8; +	    break; +    case MESA_FORMAT_AL88: +	    txformat |= R200_TXFORMAT_AI88 | R200_TXFORMAT_ALPHA_IN_MAP; +	    break; +    default: +	    break; +    } + +    switch (dst_mesa_format) { +    case MESA_FORMAT_ARGB8888: +    case MESA_FORMAT_XRGB8888: +    case MESA_FORMAT_RGB565: +    case MESA_FORMAT_ARGB4444: +    case MESA_FORMAT_ARGB1555: +    case MESA_FORMAT_A8: +    case MESA_FORMAT_L8: +    case MESA_FORMAT_I8:      default: +	    /* no swizzle required */ +	    BEGIN_BATCH(10); +	    OUT_BATCH_REGVAL(RADEON_PP_CNTL, (RADEON_TEX_0_ENABLE | +					      RADEON_TEX_BLEND_0_ENABLE)); +	    OUT_BATCH_REGVAL(R200_PP_TXCBLEND_0, (R200_TXC_ARG_A_ZERO | +						  R200_TXC_ARG_B_ZERO | +						  R200_TXC_ARG_C_R0_COLOR | +						  R200_TXC_OP_MADD)); +	    OUT_BATCH_REGVAL(R200_PP_TXCBLEND2_0, (R200_TXC_CLAMP_0_1 | +						   R200_TXC_OUTPUT_REG_R0)); +	    OUT_BATCH_REGVAL(R200_PP_TXABLEND_0, (R200_TXA_ARG_A_ZERO | +						  R200_TXA_ARG_B_ZERO | +						  R200_TXA_ARG_C_R0_ALPHA | +						  R200_TXA_OP_MADD)); +	    OUT_BATCH_REGVAL(R200_PP_TXABLEND2_0, (R200_TXA_CLAMP_0_1 | +						   R200_TXA_OUTPUT_REG_R0)); +	    END_BATCH(); +	    break; +    case MESA_FORMAT_RGBA8888: +	    BEGIN_BATCH(10); +	    OUT_BATCH_REGVAL(RADEON_PP_CNTL, (RADEON_TEX_0_ENABLE | +					      RADEON_TEX_BLEND_0_ENABLE)); +	    OUT_BATCH_REGVAL(R200_PP_TXCBLEND_0, (R200_TXC_ARG_A_ZERO | +						  R200_TXC_ARG_B_ZERO | +						  R200_TXC_ARG_C_R0_COLOR | +						  R200_TXC_OP_MADD)); +	    OUT_BATCH_REGVAL(R200_PP_TXCBLEND2_0, (R200_TXC_CLAMP_0_1 | +						   R200_TXC_OUTPUT_ROTATE_GBA | +						   R200_TXC_OUTPUT_REG_R0)); +	    OUT_BATCH_REGVAL(R200_PP_TXABLEND_0, (R200_TXA_ARG_A_ZERO | +						  R200_TXA_ARG_B_ZERO | +						  R200_TXA_ARG_C_R0_ALPHA | +						  R200_TXA_OP_MADD)); +	    OUT_BATCH_REGVAL(R200_PP_TXABLEND2_0, (R200_TXA_CLAMP_0_1 | +						   (R200_TXA_REPL_RED << R200_TXA_REPL_ARG_C_SHIFT) | +						   R200_TXA_OUTPUT_REG_R0)); +	    END_BATCH(); +	    break; +    case MESA_FORMAT_RGBA8888_REV: +	    BEGIN_BATCH(34); +	    OUT_BATCH_REGVAL(RADEON_PP_CNTL, (RADEON_TEX_0_ENABLE | +					      RADEON_TEX_BLEND_0_ENABLE | +					      RADEON_TEX_BLEND_1_ENABLE | +					      RADEON_TEX_BLEND_2_ENABLE | +					      RADEON_TEX_BLEND_3_ENABLE)); +	    /* r1.r = r0.b */ +	    OUT_BATCH_REGVAL(R200_PP_TXCBLEND_0, (R200_TXC_ARG_A_ZERO | +						  R200_TXC_ARG_B_ZERO | +						  R200_TXC_ARG_C_R0_COLOR | +						  R200_TXC_OP_MADD)); +	    OUT_BATCH_REGVAL(R200_PP_TXCBLEND2_0, (R200_TXC_CLAMP_0_1 | +						   R200_TXC_OUTPUT_MASK_R | +						   (R200_TXC_REPL_BLUE << R200_TXC_REPL_ARG_C_SHIFT) | +						   R200_TXC_OUTPUT_REG_R1)); +	    /* r1.a = r0.a */ +	    OUT_BATCH_REGVAL(R200_PP_TXABLEND_0, (R200_TXA_ARG_A_ZERO | +						  R200_TXA_ARG_B_ZERO | +						  R200_TXA_ARG_C_R0_ALPHA | +						  R200_TXA_OP_MADD)); +	    OUT_BATCH_REGVAL(R200_PP_TXABLEND2_0, (R200_TXA_CLAMP_0_1 | +						   R200_TXA_OUTPUT_REG_R1)); +	    /* r1.g = r0.g */ +	    OUT_BATCH_REGVAL(R200_PP_TXCBLEND_1, (R200_TXC_ARG_A_ZERO | +						  R200_TXC_ARG_B_ZERO | +						  R200_TXC_ARG_C_R0_COLOR | +						  R200_TXC_OP_MADD)); +	    OUT_BATCH_REGVAL(R200_PP_TXCBLEND2_1, (R200_TXC_CLAMP_0_1 | +						   R200_TXC_OUTPUT_MASK_G | +						   (R200_TXC_REPL_GREEN << R200_TXC_REPL_ARG_C_SHIFT) | +						   R200_TXC_OUTPUT_REG_R1)); +	    /* r1.a = r0.a */ +	    OUT_BATCH_REGVAL(R200_PP_TXABLEND_1, (R200_TXA_ARG_A_ZERO | +						  R200_TXA_ARG_B_ZERO | +						  R200_TXA_ARG_C_R0_ALPHA | +						  R200_TXA_OP_MADD)); +	    OUT_BATCH_REGVAL(R200_PP_TXABLEND2_1, (R200_TXA_CLAMP_0_1 | +						   R200_TXA_OUTPUT_REG_R1)); +	    /* r1.b = r0.r */ +	    OUT_BATCH_REGVAL(R200_PP_TXCBLEND_2, (R200_TXC_ARG_A_ZERO | +						  R200_TXC_ARG_B_ZERO | +						  R200_TXC_ARG_C_R0_COLOR | +						  R200_TXC_OP_MADD)); +	    OUT_BATCH_REGVAL(R200_PP_TXCBLEND2_2, (R200_TXC_CLAMP_0_1 | +						   R200_TXC_OUTPUT_MASK_B | +						   (R200_TXC_REPL_RED << R200_TXC_REPL_ARG_C_SHIFT) | +						   R200_TXC_OUTPUT_REG_R1)); +	    /* r1.a = r0.a */ +	    OUT_BATCH_REGVAL(R200_PP_TXABLEND_2, (R200_TXA_ARG_A_ZERO | +						  R200_TXA_ARG_B_ZERO | +						  R200_TXA_ARG_C_R0_ALPHA | +						  R200_TXA_OP_MADD)); +	    OUT_BATCH_REGVAL(R200_PP_TXABLEND2_2, (R200_TXA_CLAMP_0_1 | +						   R200_TXA_OUTPUT_REG_R1)); +	    /* r0.rgb = r1.rgb */ +	    OUT_BATCH_REGVAL(R200_PP_TXCBLEND_3, (R200_TXC_ARG_A_ZERO | +						  R200_TXC_ARG_B_ZERO | +						  R200_TXC_ARG_C_R1_COLOR | +						  R200_TXC_OP_MADD)); +	    OUT_BATCH_REGVAL(R200_PP_TXCBLEND2_3, (R200_TXC_CLAMP_0_1 | +						   R200_TXC_OUTPUT_REG_R0)); +	    /* r0.a = r1.a */ +	    OUT_BATCH_REGVAL(R200_PP_TXABLEND_3, (R200_TXA_ARG_A_ZERO | +						  R200_TXA_ARG_B_ZERO | +						  R200_TXA_ARG_C_R1_ALPHA | +						  R200_TXA_OP_MADD)); +	    OUT_BATCH_REGVAL(R200_PP_TXABLEND2_3, (R200_TXA_CLAMP_0_1 | +						   R200_TXA_OUTPUT_REG_R0)); +	    END_BATCH();  	    break;      } -    BEGIN_BATCH(28); -    OUT_BATCH_REGVAL(RADEON_PP_CNTL, RADEON_TEX_0_ENABLE | RADEON_TEX_BLEND_0_ENABLE); +    BEGIN_BATCH(18);      OUT_BATCH_REGVAL(R200_PP_CNTL_X, 0);      OUT_BATCH_REGVAL(R200_PP_TXMULTI_CTL_0, 0); -    OUT_BATCH_REGVAL(R200_PP_TXCBLEND_0, (R200_TXC_ARG_A_ZERO | -					  R200_TXC_ARG_B_ZERO | -					  R200_TXC_ARG_C_R0_COLOR | -					  R200_TXC_OP_MADD)); -    OUT_BATCH_REGVAL(R200_PP_TXCBLEND2_0, R200_TXC_CLAMP_0_1 | R200_TXC_OUTPUT_REG_R0); -    OUT_BATCH_REGVAL(R200_PP_TXABLEND_0, (R200_TXA_ARG_A_ZERO | -					  R200_TXA_ARG_B_ZERO | -					  R200_TXA_ARG_C_R0_ALPHA | -					  R200_TXA_OP_MADD)); -    OUT_BATCH_REGVAL(R200_PP_TXABLEND2_0, R200_TXA_CLAMP_0_1 | R200_TXA_OUTPUT_REG_R0);      OUT_BATCH_REGVAL(R200_PP_TXFILTER_0, (R200_CLAMP_S_CLAMP_LAST |  					  R200_CLAMP_T_CLAMP_LAST |  					  R200_MAG_FILTER_NEAREST | @@ -146,7 +275,7 @@ static void inline emit_tx_setup(struct r200_context *r200,      OUT_BATCH_REGVAL(R200_PP_TXFORMAT_X_0, 0);      OUT_BATCH_REGVAL(R200_PP_TXSIZE_0, ((width - 1) |  					((height - 1) << RADEON_TEX_VSIZE_SHIFT))); -    OUT_BATCH_REGVAL(R200_PP_TXPITCH_0, pitch * _mesa_get_format_bytes(mesa_format) - 32); +    OUT_BATCH_REGVAL(R200_PP_TXPITCH_0, pitch * _mesa_get_format_bytes(src_mesa_format) - 32);      OUT_BATCH_REGSEQ(R200_PP_TXOFFSET_0, 1);      OUT_BATCH_RELOC(0, bo, 0, RADEON_GEM_DOMAIN_GTT|RADEON_GEM_DOMAIN_VRAM, 0, 0); @@ -170,6 +299,8 @@ static inline void emit_cb_setup(struct r200_context *r200,      switch (mesa_format) {      case MESA_FORMAT_ARGB8888:      case MESA_FORMAT_XRGB8888: +    case MESA_FORMAT_RGBA8888: +    case MESA_FORMAT_RGBA8888_REV:  	    dst_format = RADEON_COLOR_FORMAT_ARGB8888;  	    break;      case MESA_FORMAT_RGB565: @@ -182,6 +313,8 @@ static inline void emit_cb_setup(struct r200_context *r200,  	    dst_format = RADEON_COLOR_FORMAT_ARGB1555;  	    break;      case MESA_FORMAT_A8: +    case MESA_FORMAT_L8: +    case MESA_FORMAT_I8:  	    dst_format = RADEON_COLOR_FORMAT_RGB8;  	    break;      default: @@ -384,15 +517,15 @@ unsigned r200_blit(GLcontext *ctx,      /* Flush is needed to make sure that source buffer has correct data */      radeonFlush(r200->radeon.glCtx); -    rcommonEnsureCmdBufSpace(&r200->radeon, 78, __FUNCTION__); +    rcommonEnsureCmdBufSpace(&r200->radeon, 102, __FUNCTION__);      if (!validate_buffers(r200, src_bo, dst_bo))          return GL_FALSE;      /* 14 */      emit_vtx_state(r200); -    /* 28 */ -    emit_tx_setup(r200, src_mesaformat, src_bo, src_offset, src_width, src_height, src_pitch); +    /* 52 */ +    emit_tx_setup(r200, src_mesaformat, dst_mesaformat, src_bo, src_offset, src_width, src_height, src_pitch);      /* 22 */      emit_cb_setup(r200, dst_bo, dst_offset, dst_mesaformat, dst_pitch, dst_width, dst_height);      /* 14 */ diff --git a/src/mesa/drivers/dri/r200/r200_context.c b/src/mesa/drivers/dri/r200/r200_context.c index dad2580e08..36a29350cc 100644 --- a/src/mesa/drivers/dri/r200/r200_context.c +++ b/src/mesa/drivers/dri/r200/r200_context.c @@ -51,7 +51,6 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  #include "r200_context.h"  #include "r200_ioctl.h"  #include "r200_state.h" -#include "r200_pixel.h"  #include "r200_tex.h"  #include "r200_swtcl.h"  #include "r200_tcl.h" @@ -266,6 +265,7 @@ static void r200_init_vtbl(radeonContextPtr radeon)     radeon->vtbl.emit_query_finish = r200_emit_query_finish;     radeon->vtbl.check_blit = r200_check_blit;     radeon->vtbl.blit = r200_blit; +   radeon->vtbl.is_format_renderable = radeonIsFormatRenderable;  } @@ -324,7 +324,7 @@ GLboolean r200CreateContext( const __GLcontextModes *glVisual,     _mesa_init_driver_functions(&functions);     r200InitDriverFuncs(&functions);     r200InitIoctlFuncs(&functions); -   r200InitStateFuncs(&functions); +   r200InitStateFuncs(&rmesa->radeon, &functions);     r200InitTextureFuncs(&rmesa->radeon, &functions);     r200InitShaderFuncs(&functions);     radeonInitQueryObjFunctions(&functions); @@ -473,7 +473,6 @@ GLboolean r200CreateContext( const __GLcontextModes *glVisual,     /* XXX these should really go right after _mesa_init_driver_functions() */     radeon_fbo_init(&rmesa->radeon);     radeonInitSpanFuncs( ctx ); -   r200InitPixelFuncs( ctx );     r200InitTnlFuncs( ctx );     r200InitState( rmesa );     r200InitSwtcl( ctx ); diff --git a/src/mesa/drivers/dri/r200/r200_pixel.c b/src/mesa/drivers/dri/r200/r200_pixel.c deleted file mode 100644 index bfb7e2a2ed..0000000000 --- a/src/mesa/drivers/dri/r200/r200_pixel.c +++ /dev/null @@ -1,494 +0,0 @@ -/* -Copyright (C) The Weather Channel, Inc.  2002.  All Rights Reserved. - -The Weather Channel (TM) funded Tungsten Graphics to develop the -initial release of the Radeon 8500 driver under the XFree86 license. -This notice must be preserved. - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice (including the -next paragraph) shall be included in all copies or substantial -portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ - -/* - * Authors: - *   Keith Whitwell <keith@tungstengraphics.com> - */ - -#include "main/glheader.h" -#include "main/enums.h" -#include "main/mtypes.h" -#include "main/macros.h" -#include "swrast/swrast.h" - -#include "r200_context.h" -#include "r200_ioctl.h" -#include "r200_pixel.h" -#include "r200_swtcl.h" - -#include "drirenderbuffer.h" - - -static GLboolean -check_color( const GLcontext *ctx, GLenum type, GLenum format, -	     const struct gl_pixelstore_attrib *packing, -	     const void *pixels, GLint sz, GLint pitch ) -{ -   r200ContextPtr rmesa = R200_CONTEXT(ctx); -   GLuint cpp = rmesa->radeon.radeonScreen->cpp; - -   if (R200_DEBUG & RADEON_PIXEL) -      fprintf(stderr, "%s\n", __FUNCTION__); - -   if (	(pitch & 63) || -	ctx->_ImageTransferState || -	packing->SwapBytes || -	packing->LsbFirst) { -      if (R200_DEBUG & RADEON_PIXEL) -	 fprintf(stderr, "%s: failed 1\n", __FUNCTION__); -      return GL_FALSE; -   } - -   if ( type == GL_UNSIGNED_INT_8_8_8_8_REV && -	cpp == 4 && -	format == GL_BGRA ) { -      if (R200_DEBUG & RADEON_PIXEL) -	 fprintf(stderr, "%s: passed 2\n", __FUNCTION__); -      return GL_TRUE; -   } - -   if (R200_DEBUG & RADEON_PIXEL) -      fprintf(stderr, "%s: failed\n", __FUNCTION__); - -   return GL_FALSE; -} - -static GLboolean -check_color_per_fragment_ops( const GLcontext *ctx ) -{ -   int result; -   result = (!(     ctx->Color.AlphaEnabled || -		    ctx->Depth.Test || -		    ctx->Fog.Enabled || -		    ctx->Scissor.Enabled || -		    ctx->Stencil._Enabled || -		    !ctx->Color.ColorMask[0][0] || -		    !ctx->Color.ColorMask[0][1] || -		    !ctx->Color.ColorMask[0][2] || -		    !ctx->Color.ColorMask[0][3] || -		    ctx->Color.ColorLogicOpEnabled || -		    ctx->Texture._EnabledUnits -           ) && -	   ctx->Current.RasterPosValid); - -   return result; -} - - -#if 0 -static GLboolean -clip_pixelrect( const GLcontext *ctx, -		const GLframebuffer *buffer, -		GLint *x, GLint *y, -		GLsizei *width, GLsizei *height, -		GLint *size ) -{ -   r200ContextPtr rmesa = R200_CONTEXT(ctx); - -   /* left clipping */ -   if (*x < buffer->_Xmin) { -      *width -= (buffer->_Xmin - *x); -      *x = buffer->_Xmin; -   } - -   /* right clipping */ -   if (*x + *width > buffer->_Xmax) -      *width -= (*x + *width - buffer->_Xmax - 1); - -   if (*width <= 0) -      return GL_FALSE; - -   /* bottom clipping */ -   if (*y < buffer->_Ymin) { -      *height -= (buffer->_Ymin - *y); -      *y = buffer->_Ymin; -   } - -   /* top clipping */ -   if (*y + *height > buffer->_Ymax) -      *height -= (*y + *height - buffer->_Ymax - 1); - -   if (*height <= 0) -      return GL_FALSE; - -   *size = ((*y + *height - 1) * rmesa->radeon.radeonScreen->frontPitch + -	    (*x + *width - 1) * rmesa->radeon.radeonScreen->cpp); - -   return GL_TRUE; -} -#endif - -static GLboolean -r200TryReadPixels( GLcontext *ctx, -		  GLint x, GLint y, GLsizei width, GLsizei height, -		  GLenum format, GLenum type, -		  const struct gl_pixelstore_attrib *pack, -		  GLvoid *pixels ) -{ -   return GL_FALSE; -#if 0 -   r200ContextPtr rmesa = R200_CONTEXT(ctx); -   GLint pitch = pack->RowLength ? pack->RowLength : width; -   GLint blit_format; -   GLuint cpp = rmesa->radeon.radeonScreen->cpp; -   GLint size = width * height * cpp; - -   if (R200_DEBUG & RADEON_PIXEL) -      fprintf(stderr, "%s\n", __FUNCTION__); - -   /* Only accelerate reading to GART buffers. -    */ -   if ( !r200IsGartMemory(rmesa, pixels, -			 pitch * height * rmesa->radeon.radeonScreen->cpp ) ) { -      if (R200_DEBUG & RADEON_PIXEL) -	 fprintf(stderr, "%s: dest not GART\n", __FUNCTION__); -   } - -   /* Need GL_PACK_INVERT_MESA to cope with upsidedown results from -    * blitter: -    */ -   if (!pack->Invert) { -      if (R200_DEBUG & RADEON_PIXEL) -	 fprintf(stderr, "%s: MESA_PACK_INVERT not set\n", __FUNCTION__); -      return GL_FALSE; -   } - -   if (!check_color(ctx, type, format, pack, pixels, size, pitch)) -      return GL_FALSE; - -   switch ( rmesa->radeon.radeonScreen->cpp ) { -   case 4: -      blit_format = R200_CP_COLOR_FORMAT_ARGB8888; -      break; -   default: -      return GL_FALSE; -   } - - -   /* Although the blits go on the command buffer, need to do this and -    * fire with lock held to guarentee cliprects and drawOffset are -    * correct. -    * -    * This is an unusual situation however, as the code which flushes -    * a full command buffer expects to be called unlocked.  As a -    * workaround, immediately flush the buffer on aquiring the lock. -    */ -   LOCK_HARDWARE( &rmesa->radeon ); - -   if (rmesa->store.cmd_used) -      rcommonFlushCmdBufLocked( &rmesa->radeon, __FUNCTION__ ); - -   if (!clip_pixelrect(ctx, ctx->ReadBuffer, &x, &y, &width, &height, -		       &size)) { -      UNLOCK_HARDWARE( &rmesa->radeon ); -      if (R200_DEBUG & RADEON_PIXEL) -	 fprintf(stderr, "%s totally clipped -- nothing to do\n", -		 __FUNCTION__); -      return GL_TRUE; -   } - -   { -      __DRIdrawable *dPriv = rmesa->radeon.dri.drawable; -      driRenderbuffer *drb = (driRenderbuffer *) ctx->ReadBuffer->_ColorReadBuffer; -      int nbox = dPriv->numClipRects; -      int src_offset = drb->offset -		     + rmesa->radeon.radeonScreen->fbLocation; -      int src_pitch = drb->pitch * drb->cpp; -      int dst_offset = r200GartOffsetFromVirtual( rmesa, pixels ); -      int dst_pitch = pitch * rmesa->radeon.radeonScreen->cpp; -      drm_clip_rect_t *box = dPriv->pClipRects; -      int i; - -      r200EmitWait( rmesa, RADEON_WAIT_3D ); - -      y = dPriv->h - y - height; -      x += dPriv->x; -      y += dPriv->y; - - -      if (R200_DEBUG & RADEON_PIXEL) -	 fprintf(stderr, "readpixel blit src_pitch %d dst_pitch %d\n", -		 src_pitch, dst_pitch); - -      for (i = 0 ; i < nbox ; i++) -      { -	 GLint bx = box[i].x1; -	 GLint by = box[i].y1; -	 GLint bw = box[i].x2 - bx; -	 GLint bh = box[i].y2 - by; - -	 if (bx < x) bw -= x - bx, bx = x; -	 if (by < y) bh -= y - by, by = y; -	 if (bx + bw > x + width) bw = x + width - bx; -	 if (by + bh > y + height) bh = y + height - by; -	 if (bw <= 0) continue; -	 if (bh <= 0) continue; - -	 r200EmitBlit( rmesa, -		       blit_format, -		       src_pitch, src_offset, -		       dst_pitch, dst_offset, -		       bx, by, -		       bx - x, by - y, -		       bw, bh ); -      } - -      rcommonFlushCmdBufLocked( &rmesa->radeon, __FUNCTION__ ); -   } -   UNLOCK_HARDWARE( &rmesa->radeon ); - -   radeonFinish( ctx ); /* required by GL */ -#endif -   return GL_TRUE; -} - -static void -r200ReadPixels( GLcontext *ctx, -		 GLint x, GLint y, GLsizei width, GLsizei height, -		 GLenum format, GLenum type, -		 const struct gl_pixelstore_attrib *pack, -		 GLvoid *pixels ) -{ -   if (R200_DEBUG & RADEON_PIXEL) -      fprintf(stderr, "%s\n", __FUNCTION__); - -   if (!r200TryReadPixels( ctx, x, y, width, height, format, type, pack, -			   pixels)) -      _swrast_ReadPixels( ctx, x, y, width, height, format, type, pack, -			  pixels); -} - - - - -static void do_draw_pix( GLcontext *ctx, -			 GLint x, GLint y, GLsizei width, GLsizei height, -			 GLint pitch, -			 const void *pixels, -			 GLuint planemask) -{ -   if (R200_DEBUG & RADEON_PIXEL) -      fprintf(stderr, "%s\n", __FUNCTION__); - -#if 0 -   r200ContextPtr rmesa = R200_CONTEXT(ctx); -   __DRIdrawable *dPriv = radeon_get_drawable(&rmesa->radeon); -   drm_clip_rect_t *box = dPriv->pClipRects; -   struct gl_renderbuffer *rb = ctx->ReadBuffer->_ColorDrawBuffers[0]; -   driRenderbuffer *drb = (driRenderbuffer *) rb; -   int nbox = dPriv->numClipRects; -   int i; -   int blit_format; -   int size; -   int src_offset = r200GartOffsetFromVirtual( rmesa, pixels ); -   int src_pitch = pitch * rmesa->radeon.radeonScreen->cpp; - -   switch ( rmesa->radeon.radeonScreen->cpp ) { -   case 2: -      blit_format = R200_CP_COLOR_FORMAT_RGB565; -      break; -   case 4: -      blit_format = R200_CP_COLOR_FORMAT_ARGB8888; -      break; -   default: -      return; -   } - - -   LOCK_HARDWARE( &rmesa->radeon ); - -   if (rmesa->store.cmd_used) -      rcommonFlushCmdBufLocked( &rmesa->radeon, __FUNCTION__ ); - -   y -= height;			/* cope with pixel zoom */ - -   if (!clip_pixelrect(ctx, ctx->DrawBuffer, -		       &x, &y, &width, &height, -		       &size)) { -      UNLOCK_HARDWARE( &rmesa->radeon ); -      return; -   } - -   y = dPriv->h - y - height; 	/* convert from gl to hardware coords */ -   x += dPriv->x; -   y += dPriv->y; - - -   r200EmitWait( rmesa, RADEON_WAIT_3D ); - -   for (i = 0 ; i < nbox ; i++ ) -   { -      GLint bx = box[i].x1; -      GLint by = box[i].y1; -      GLint bw = box[i].x2 - bx; -      GLint bh = box[i].y2 - by; - -      if (bx < x) bw -= x - bx, bx = x; -      if (by < y) bh -= y - by, by = y; -      if (bx + bw > x + width) bw = x + width - bx; -      if (by + bh > y + height) bh = y + height - by; -      if (bw <= 0) continue; -      if (bh <= 0) continue; - -      r200EmitBlit( rmesa, -		    blit_format, -		    src_pitch, src_offset, -		    drb->pitch * drb->cpp, -		    drb->offset + rmesa->radeon.radeonScreen->fbLocation, -		    bx - x, by - y, -		    bx, by, -		    bw, bh ); -   } - -   rcommonFlushCmdBufLocked( &rmesa->radeon, __FUNCTION__ ); -   radeonWaitForIdleLocked( &rmesa->radeon ); /* required by GL */ -   UNLOCK_HARDWARE( &rmesa->radeon ); -#endif -} - - - - -static GLboolean -r200TryDrawPixels( GLcontext *ctx, -		  GLint x, GLint y, GLsizei width, GLsizei height, -		  GLenum format, GLenum type, -		  const struct gl_pixelstore_attrib *unpack, -		  const GLvoid *pixels ) -{ -   r200ContextPtr rmesa = R200_CONTEXT(ctx); -   GLint pitch = unpack->RowLength ? unpack->RowLength : width; -   GLuint planemask; -   GLuint cpp = rmesa->radeon.radeonScreen->cpp; -   GLint size = height * pitch * cpp; - -   if (R200_DEBUG & RADEON_PIXEL) -      fprintf(stderr, "%s\n", __FUNCTION__); - -   /* check that we're drawing to exactly one color buffer */ -   if (ctx->DrawBuffer->_NumColorDrawBuffers != 1) -     return GL_FALSE; - -   switch (format) { -   case GL_RGB: -   case GL_RGBA: -   case GL_BGRA: -      planemask = radeonPackColor(cpp, -				ctx->Color.ColorMask[0][RCOMP], -				ctx->Color.ColorMask[0][GCOMP], -				ctx->Color.ColorMask[0][BCOMP], -				ctx->Color.ColorMask[0][ACOMP]); - -      if (cpp == 2) -	 planemask |= planemask << 16; - -      if (planemask != ~0) -	 return GL_FALSE;	/* fix me -- should be possible */ - -      /* Can't do conversions on GART reads/draws. -       */ -      if ( !r200IsGartMemory( rmesa, pixels, size ) ) { -	 if (R200_DEBUG & RADEON_PIXEL) -	    fprintf(stderr, "%s: not GART memory\n", __FUNCTION__); -	 return GL_FALSE; -      } - -      if (!check_color(ctx, type, format, unpack, pixels, size, pitch)) { -	 return GL_FALSE; -      } -      if (!check_color_per_fragment_ops(ctx)) { -	 return GL_FALSE; -      } - -      if (ctx->Pixel.ZoomX != 1.0F || -	  ctx->Pixel.ZoomY != -1.0F) -	 return GL_FALSE; -      break; - -   default: -      return GL_FALSE; -   } - -   if (0)// r200IsGartMemory(rmesa, pixels, size) ) -   { -      do_draw_pix( ctx, x, y, width, height, pitch, pixels, planemask ); -      return GL_TRUE; -   } -   else if (0) -   { -      /* Pixels is in regular memory -- get dma buffers and perform -       * upload through them. -       */ -   } -   else -      return GL_FALSE; -} - -static void -r200DrawPixels( GLcontext *ctx, -		 GLint x, GLint y, GLsizei width, GLsizei height, -		 GLenum format, GLenum type, -		 const struct gl_pixelstore_attrib *unpack, -		 const GLvoid *pixels ) -{ -   if (R200_DEBUG & RADEON_PIXEL) -      fprintf(stderr, "%s\n", __FUNCTION__); - -   if (!r200TryDrawPixels( ctx, x, y, width, height, format, type, -			  unpack, pixels )) -      _swrast_DrawPixels( ctx, x, y, width, height, format, type, -			  unpack, pixels ); -} - - -static void -r200Bitmap( GLcontext *ctx, GLint px, GLint py, -		  GLsizei width, GLsizei height, -		  const struct gl_pixelstore_attrib *unpack, -		  const GLubyte *bitmap ) -{ -   r200ContextPtr rmesa = R200_CONTEXT(ctx); - -   if (rmesa->radeon.Fallback) -      _swrast_Bitmap( ctx, px, py, width, height, unpack, bitmap ); -   else -      r200PointsBitmap( ctx, px, py, width, height, unpack, bitmap ); -} - - - -void r200InitPixelFuncs( GLcontext *ctx ) -{ -   if (!getenv("R200_NO_BLITS")) { -      ctx->Driver.ReadPixels = r200ReadPixels; -      ctx->Driver.DrawPixels = r200DrawPixels; -      if (getenv("R200_HW_BITMAP")) -	 ctx->Driver.Bitmap = r200Bitmap; -   } -} diff --git a/src/mesa/drivers/dri/r200/r200_pixel.h b/src/mesa/drivers/dri/r200/r200_pixel.h deleted file mode 100644 index e62aa05d74..0000000000 --- a/src/mesa/drivers/dri/r200/r200_pixel.h +++ /dev/null @@ -1,39 +0,0 @@ -/* -Copyright (C) The Weather Channel, Inc.  2002.  All Rights Reserved. - -The Weather Channel (TM) funded Tungsten Graphics to develop the -initial release of the Radeon 8500 driver under the XFree86 license. -This notice must be preserved. - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice (including the -next paragraph) shall be included in all copies or substantial -portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ - -/* - * Authors: - *   Keith Whitwell <keith@tungstengraphics.com> - */ - -#ifndef __R200_PIXEL_H__ -#define __R200_PIXEL_H__ - -extern void r200InitPixelFuncs( GLcontext *ctx ); - -#endif diff --git a/src/mesa/drivers/dri/r200/r200_reg.h b/src/mesa/drivers/dri/r200/r200_reg.h index b3a4940a7a..e331be223b 100644 --- a/src/mesa/drivers/dri/r200/r200_reg.h +++ b/src/mesa/drivers/dri/r200/r200_reg.h @@ -1265,6 +1265,10 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  #define     R200_TXC_OUTPUT_MASK_G                 (5 << 20)  #define     R200_TXC_OUTPUT_MASK_B                 (6 << 20)  #define     R200_TXC_OUTPUT_MASK_NONE              (7 << 20) +#define     R200_TXC_OUTPUT_ROTATE_RGB             (0 << 24) +#define     R200_TXC_OUTPUT_ROTATE_ARG             (1 << 24) +#define     R200_TXC_OUTPUT_ROTATE_GBA             (2 << 24) +#define     R200_TXC_OUTPUT_ROTATE_RGA             (3 << 24)  #define     R200_TXC_REPL_NORMAL                   0  #define     R200_TXC_REPL_RED                      1  #define     R200_TXC_REPL_GREEN                    2 diff --git a/src/mesa/drivers/dri/r200/r200_state.c b/src/mesa/drivers/dri/r200/r200_state.c index 050e5aa877..29d7bed8b6 100644 --- a/src/mesa/drivers/dri/r200/r200_state.c +++ b/src/mesa/drivers/dri/r200/r200_state.c @@ -46,6 +46,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  #include "tnl/tnl.h"  #include "tnl/t_pipeline.h"  #include "swrast_setup/swrast_setup.h" +#include "drivers/common/meta.h"  #include "radeon_common.h"  #include "radeon_mipmap_tree.h" @@ -2487,7 +2488,7 @@ static void r200PolygonStipple( GLcontext *ctx, const GLubyte *mask )  }  /* Initialize the driver's state functions.   */ -void r200InitStateFuncs( struct dd_function_table *functions ) +void r200InitStateFuncs( radeonContextPtr radeon, struct dd_function_table *functions )  {     functions->UpdateState		= r200InvalidateState;     functions->LightingSpaceChange	= r200LightingSpaceChange; @@ -2495,6 +2496,11 @@ void r200InitStateFuncs( struct dd_function_table *functions )     functions->DrawBuffer		= radeonDrawBuffer;     functions->ReadBuffer		= radeonReadBuffer; +   functions->CopyPixels                = _mesa_meta_CopyPixels; +   functions->DrawPixels                = _mesa_meta_DrawPixels; +   if (radeon->radeonScreen->kernel_mm) +	   functions->ReadPixels                = radeonReadPixels; +     functions->AlphaFunc			= r200AlphaFunc;     functions->BlendColor		= r200BlendColor;     functions->BlendEquationSeparate	= r200BlendEquationSeparate; diff --git a/src/mesa/drivers/dri/r200/r200_state.h b/src/mesa/drivers/dri/r200/r200_state.h index 7b9b0c106a..327ba837e2 100644 --- a/src/mesa/drivers/dri/r200/r200_state.h +++ b/src/mesa/drivers/dri/r200/r200_state.h @@ -38,7 +38,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  #include "r200_context.h"  extern void r200InitState( r200ContextPtr rmesa ); -extern void r200InitStateFuncs( struct dd_function_table *functions ); +extern void r200InitStateFuncs( radeonContextPtr radeon, struct dd_function_table *functions );  extern void r200InitTnlFuncs( GLcontext *ctx );  extern void r200UpdateMaterial( GLcontext *ctx ); diff --git a/src/mesa/drivers/dri/r200/radeon_pixel_read.c b/src/mesa/drivers/dri/r200/radeon_pixel_read.c new file mode 120000 index 0000000000..3b03803126 --- /dev/null +++ b/src/mesa/drivers/dri/r200/radeon_pixel_read.c @@ -0,0 +1 @@ +../radeon/radeon_pixel_read.c
\ No newline at end of file diff --git a/src/mesa/drivers/dri/r200/radeon_tex_getimage.c b/src/mesa/drivers/dri/r200/radeon_tex_getimage.c new file mode 120000 index 0000000000..d9836d7326 --- /dev/null +++ b/src/mesa/drivers/dri/r200/radeon_tex_getimage.c @@ -0,0 +1 @@ +../radeon/radeon_tex_getimage.c
\ No newline at end of file diff --git a/src/mesa/drivers/dri/r200/radeon_tile.c b/src/mesa/drivers/dri/r200/radeon_tile.c new file mode 120000 index 0000000000..d4bfe27da6 --- /dev/null +++ b/src/mesa/drivers/dri/r200/radeon_tile.c @@ -0,0 +1 @@ +../radeon/radeon_tile.c
\ No newline at end of file diff --git a/src/mesa/drivers/dri/r200/radeon_tile.h b/src/mesa/drivers/dri/r200/radeon_tile.h new file mode 120000 index 0000000000..31074c581e --- /dev/null +++ b/src/mesa/drivers/dri/r200/radeon_tile.h @@ -0,0 +1 @@ +../radeon/radeon_tile.h
\ No newline at end of file diff --git a/src/mesa/drivers/dri/r200/server/radeon_dri.c b/src/mesa/drivers/dri/r200/server/radeon_dri.c deleted file mode 120000 index d05847d650..0000000000 --- a/src/mesa/drivers/dri/r200/server/radeon_dri.c +++ /dev/null @@ -1 +0,0 @@ -../../radeon/server/radeon_dri.c
\ No newline at end of file diff --git a/src/mesa/drivers/dri/r300/Makefile b/src/mesa/drivers/dri/r300/Makefile index 04459c2ddf..2245998c95 100644 --- a/src/mesa/drivers/dri/r300/Makefile +++ b/src/mesa/drivers/dri/r300/Makefile @@ -7,8 +7,6 @@ CFLAGS += $(RADEON_CFLAGS)  LIBNAME = r300_dri.so -MINIGLX_SOURCES = server/radeon_dri.c -  ifeq ($(RADEON_LDFLAGS),)  CS_SOURCES = radeon_cs_space_drm.c radeon_bo.c radeon_cs.c  endif @@ -33,10 +31,13 @@ RADEON_COMMON_SOURCES = \  	radeon_fbo.c \  	radeon_lock.c \  	radeon_mipmap_tree.c \ -	radeon_span.c \ +	radeon_pixel_read.c \  	radeon_queryobj.c \ +	radeon_span.c \  	radeon_texture.c \ -	radeon_tex_copy.c +	radeon_tex_copy.c \ +	radeon_tex_getimage.c \ +	radeon_tile.c  DRIVER_SOURCES = \  		 radeon_screen.c \ diff --git a/src/mesa/drivers/dri/r300/compiler/r300_fragprog_emit.c b/src/mesa/drivers/dri/r300/compiler/r300_fragprog_emit.c index cc552aee17..37dafa7710 100644 --- a/src/mesa/drivers/dri/r300/compiler/r300_fragprog_emit.c +++ b/src/mesa/drivers/dri/r300/compiler/r300_fragprog_emit.c @@ -353,7 +353,7 @@ void r300BuildFragmentProgramHwCode(struct r300_fragment_program_compiler *compi  		}  	} -	if (code->pixsize >= R300_PFS_NUM_TEMP_REGS) +	if (code->pixsize >= compiler->max_temp_regs)  		rc_error(&compiler->Base, "Too many hardware temporaries used.\n");  	if (compiler->Base.Error) diff --git a/src/mesa/drivers/dri/r300/compiler/r3xx_fragprog.c b/src/mesa/drivers/dri/r300/compiler/r3xx_fragprog.c index c2d5dc27b4..d06429254d 100644 --- a/src/mesa/drivers/dri/r300/compiler/r3xx_fragprog.c +++ b/src/mesa/drivers/dri/r300/compiler/r3xx_fragprog.c @@ -156,10 +156,7 @@ void r3xx_compile_fragment_program(struct r300_fragment_program_compiler* c)  		fflush(stderr);  	} -	if (c->is_r500) -		rc_pair_regalloc(c, 128); -	else -		rc_pair_regalloc(c, R300_PFS_NUM_TEMP_REGS); +	rc_pair_regalloc(c, c->max_temp_regs);  	if (c->Base.Error)  		return; diff --git a/src/mesa/drivers/dri/r300/compiler/r500_fragprog.c b/src/mesa/drivers/dri/r300/compiler/r500_fragprog.c index b0fb8e970b..b78d7d5715 100644 --- a/src/mesa/drivers/dri/r300/compiler/r500_fragprog.c +++ b/src/mesa/drivers/dri/r300/compiler/r500_fragprog.c @@ -433,19 +433,20 @@ void r500FragmentProgramDump(struct rX00_fragment_program_code *c)  	      (inst >> 30));        fprintf(stderr,"\t3 RGB_INST:  0x%08x:", code->inst[n].inst3);        inst = code->inst[n].inst3; -      fprintf(stderr,"rgb_A_src:%d %s/%s/%s %d rgb_B_src:%d %s/%s/%s %d\n", +      fprintf(stderr,"rgb_A_src:%d %s/%s/%s %d rgb_B_src:%d %s/%s/%s %d targ: %d\n",  	      (inst) & 0x3, toswiz((inst >> 2) & 0x7), toswiz((inst >> 5) & 0x7), toswiz((inst >> 8) & 0x7),  	      (inst >> 11) & 0x3,  	      (inst >> 13) & 0x3, toswiz((inst >> 15) & 0x7), toswiz((inst >> 18) & 0x7), toswiz((inst >> 21) & 0x7), -	      (inst >> 24) & 0x3); +	      (inst >> 24) & 0x3, (inst >> 29) & 0x3);        fprintf(stderr,"\t4 ALPHA_INST:0x%08x:", code->inst[n].inst4);        inst = code->inst[n].inst4; -      fprintf(stderr,"%s dest:%d%s alp_A_src:%d %s %d alp_B_src:%d %s %d w:%d\n", to_alpha_op(inst & 0xf), +      fprintf(stderr,"%s dest:%d%s alp_A_src:%d %s %d alp_B_src:%d %s %d targ %d w:%d\n", to_alpha_op(inst & 0xf),  	      (inst >> 4) & 0x7f, inst & (1<<11) ? "(rel)":"",  	      (inst >> 12) & 0x3, toswiz((inst >> 14) & 0x7), (inst >> 17) & 0x3,  	      (inst >> 19) & 0x3, toswiz((inst >> 21) & 0x7), (inst >> 24) & 0x3, +	      (inst >> 29) & 0x3,  	      (inst >> 31) & 0x1);        fprintf(stderr,"\t5 RGBA_INST: 0x%08x:", code->inst[n].inst5); diff --git a/src/mesa/drivers/dri/r300/compiler/r500_fragprog_emit.c b/src/mesa/drivers/dri/r300/compiler/r500_fragprog_emit.c index 4e84eefd65..b6dfe28def 100644 --- a/src/mesa/drivers/dri/r300/compiler/r500_fragprog_emit.c +++ b/src/mesa/drivers/dri/r300/compiler/r500_fragprog_emit.c @@ -190,6 +190,17 @@ static unsigned int use_source(struct r500_fragment_program_code* code, struct r  	return 0;  } +/** + * NOP the specified instruction if it is not a texture lookup. + */ +static void alu_nop(struct r300_fragment_program_compiler *c, int ip) +{ +	PROG_CODE; + +	if ((code->inst[ip].inst0 & 0x3) != R500_INST_TYPE_TEX) { +		code->inst[ip].inst0 |= R500_INST_NOP; +	} +}  /**   * Emit a paired ALU instruction. @@ -205,6 +216,14 @@ static void emit_paired(struct r300_fragment_program_compiler *c, struct rc_pair  	int ip = ++code->inst_end; +	/* Quirk: MDH/MDV (DDX/DDY) need a NOP on previous non-TEX instructions. */ +	if (inst->RGB.Opcode == RC_OPCODE_DDX || inst->Alpha.Opcode == RC_OPCODE_DDX || +		inst->RGB.Opcode == RC_OPCODE_DDY || inst->Alpha.Opcode == RC_OPCODE_DDY) { +		if (ip > 0) { +			alu_nop(c, ip - 1); +		} +	} +  	code->inst[ip].inst5 = translate_rgb_op(c, inst->RGB.Opcode);  	code->inst[ip].inst4 = translate_alpha_op(c, inst->Alpha.Opcode); @@ -252,8 +271,8 @@ static void emit_paired(struct r300_fragment_program_compiler *c, struct rc_pair  	code->inst[ip].inst4 |= translate_arg_alpha(inst, 1) << R500_ALPHA_SEL_B_SHIFT;  	code->inst[ip].inst5 |= translate_arg_alpha(inst, 2) << R500_ALU_RGBA_ALPHA_SEL_C_SHIFT; -    code->inst[ip].inst3 |= R500_ALU_RGB_TARGET(inst->RGB.Target); -    code->inst[ip].inst4 |= R500_ALPHA_TARGET(inst->Alpha.Target); +	code->inst[ip].inst3 |= R500_ALU_RGB_TARGET(inst->RGB.Target); +	code->inst[ip].inst4 |= R500_ALPHA_TARGET(inst->Alpha.Target);  	if (inst->WriteALUResult) {  		code->inst[ip].inst3 |= R500_ALU_RGB_WMASK; diff --git a/src/mesa/drivers/dri/r300/compiler/radeon_compiler.h b/src/mesa/drivers/dri/r300/compiler/radeon_compiler.h index 6bfda0574f..934ae28da5 100644 --- a/src/mesa/drivers/dri/r300/compiler/radeon_compiler.h +++ b/src/mesa/drivers/dri/r300/compiler/radeon_compiler.h @@ -83,6 +83,7 @@ struct r300_fragment_program_compiler {  	struct rX00_fragment_program_code *code;  	struct r300_fragment_program_external_state state;  	unsigned is_r500; +	unsigned max_temp_regs;      /* Register corresponding to the depthbuffer. */  	unsigned OutputDepth;      /* Registers corresponding to the four colorbuffers. */ diff --git a/src/mesa/drivers/dri/r300/compiler/radeon_opcodes.c b/src/mesa/drivers/dri/r300/compiler/radeon_opcodes.c index c1c0181fac..9d289fce34 100644 --- a/src/mesa/drivers/dri/r300/compiler/radeon_opcodes.c +++ b/src/mesa/drivers/dri/r300/compiler/radeon_opcodes.c @@ -75,14 +75,14 @@ struct rc_opcode_info rc_opcodes[MAX_RC_OPCODE] = {  	{  		.Opcode = RC_OPCODE_DDX,  		.Name = "DDX", -		.NumSrcRegs = 1, +		.NumSrcRegs = 2,  		.HasDstReg = 1,  		.IsComponentwise = 1  	},  	{  		.Opcode = RC_OPCODE_DDY,  		.Name = "DDY", -		.NumSrcRegs = 1, +		.NumSrcRegs = 2,  		.HasDstReg = 1,  		.IsComponentwise = 1  	}, diff --git a/src/mesa/drivers/dri/r300/compiler/radeon_pair_translate.c b/src/mesa/drivers/dri/r300/compiler/radeon_pair_translate.c index fff5b0c217..3a26e7daaf 100644 --- a/src/mesa/drivers/dri/r300/compiler/radeon_pair_translate.c +++ b/src/mesa/drivers/dri/r300/compiler/radeon_pair_translate.c @@ -159,11 +159,6 @@ static void set_pair_instruction(struct r300_fragment_program_compiler *c,  	int nargs = opcode->NumSrcRegs;  	int i; -	/* Special case for DDX/DDY (MDH/MDV). */ -	if (inst->Opcode == RC_OPCODE_DDX || inst->Opcode == RC_OPCODE_DDY) { -		nargs++; -	} -  	for(i = 0; i < opcode->NumSrcRegs; ++i) {  		int source;  		if (needrgb && !istranscendent) { diff --git a/src/mesa/drivers/dri/r300/compiler/radeon_program_alu.c b/src/mesa/drivers/dri/r300/compiler/radeon_program_alu.c index b5c08aea49..f5b7d57eab 100644 --- a/src/mesa/drivers/dri/r300/compiler/radeon_program_alu.c +++ b/src/mesa/drivers/dri/r300/compiler/radeon_program_alu.c @@ -506,6 +506,46 @@ static void transform_r300_vertex_ABS(struct radeon_compiler* c,  	inst->U.I.SrcReg[1].Negate ^= RC_MASK_XYZW;  } +static void transform_r300_vertex_CMP(struct radeon_compiler* c, +	struct rc_instruction* inst) +{ +	/* There is no decent CMP available, so let's rig one up. +	 * CMP is defined as dst = src0 < 0.0 ? src1 : src2 +	 * The following sequence consumes two temps and three extra slots, +	 * but should be equivalent: +	 * +	 * SLT tmp0, src0, 0.0 +	 * SGE tmp1, src0, 0.0 +	 * MUL tmp0, tmp0, src1 +	 * MAD dst, src2, tmp1, tmp0 +	 * +	 * Yes, I know, I'm a mad scientist. ~ C. */ +	int tempreg0 = rc_find_free_temporary(c); +	int tempreg1 = rc_find_free_temporary(c); + +	/* SLT tmp0, src0, 0.0 */ +	emit2(c, inst->Prev, RC_OPCODE_SLT, 0, +		dstreg(RC_FILE_TEMPORARY, tempreg0), +		inst->U.I.SrcReg[0], builtin_zero); + +	/* SGE tmp1, src0, 0.0 */ +	emit2(c, inst->Prev, RC_OPCODE_SGE, 0, +		dstreg(RC_FILE_TEMPORARY, tempreg1), +		inst->U.I.SrcReg[0], builtin_zero); + +	/* MUL tmp0, tmp0, src1 */ +	emit2(c, inst->Prev, RC_OPCODE_MUL, 0, +		dstreg(RC_FILE_TEMPORARY, tempreg0), +		srcreg(RC_FILE_TEMPORARY, tempreg0), inst->U.I.SrcReg[1]); + +	/* MAD dst, src2, tmp1, tmp0 */ +	emit3(c, inst->Prev, RC_OPCODE_MAD, inst->U.I.SaturateMode, +		inst->U.I.DstReg, +		inst->U.I.SrcReg[2], srcreg(RC_FILE_TEMPORARY, tempreg1), srcreg(RC_FILE_TEMPORARY, tempreg0)); + +	rc_remove_instruction(inst); +} +  /**   * For use with radeonLocalTransform, this transforms non-native ALU   * instructions of the r300 up to r500 vertex engine. @@ -517,6 +557,7 @@ int r300_transform_vertex_alu(  {  	switch(inst->U.I.Opcode) {  	case RC_OPCODE_ABS: transform_r300_vertex_ABS(c, inst); return 1; +	case RC_OPCODE_CMP: transform_r300_vertex_CMP(c, inst); return 1;  	case RC_OPCODE_DP3: transform_DP3(c, inst); return 1;  	case RC_OPCODE_DPH: transform_DPH(c, inst); return 1;  	case RC_OPCODE_FLR: transform_FLR(c, inst); return 1; diff --git a/src/mesa/drivers/dri/r300/r300_blit.c b/src/mesa/drivers/dri/r300/r300_blit.c index d870c7f852..fa60628a5e 100644 --- a/src/mesa/drivers/dri/r300/r300_blit.c +++ b/src/mesa/drivers/dri/r300/r300_blit.c @@ -582,12 +582,6 @@ unsigned r300_blit(GLcontext *ctx,      if (dst_pitch % 2 > 0)          ++dst_pitch; -    /* Rendering to small buffer doesn't work. -     * Looks like a hw limitation. -     */ -    if (dst_pitch < 32) -        return 0; -      /* Need to clamp the region size to make sure       * we don't read outside of the source buffer       * or write outside of the destination buffer. diff --git a/src/mesa/drivers/dri/r300/r300_cmdbuf.c b/src/mesa/drivers/dri/r300/r300_cmdbuf.c index 788dc2f16e..c40802aec6 100644 --- a/src/mesa/drivers/dri/r300/r300_cmdbuf.c +++ b/src/mesa/drivers/dri/r300/r300_cmdbuf.c @@ -360,36 +360,37 @@ void r300_emit_cb_setup(struct r300_context *r300,      assert(offset % 32 == 0);      switch (format) { -        case MESA_FORMAT_RGB565: -            assert(_mesa_little_endian()); -            cbpitch |= R300_COLOR_FORMAT_RGB565; +        case MESA_FORMAT_SL8: +        case MESA_FORMAT_A8: +        case MESA_FORMAT_L8: +        case MESA_FORMAT_I8: +            cbpitch |= R300_COLOR_FORMAT_I8;              break; +        case MESA_FORMAT_RGB565:          case MESA_FORMAT_RGB565_REV: -            assert(!_mesa_little_endian());              cbpitch |= R300_COLOR_FORMAT_RGB565;              break;          case MESA_FORMAT_ARGB4444: -            assert(_mesa_little_endian()); -            cbpitch |= R300_COLOR_FORMAT_ARGB4444; -            break;          case MESA_FORMAT_ARGB4444_REV: -            assert(!_mesa_little_endian());              cbpitch |= R300_COLOR_FORMAT_ARGB4444;              break; +        case MESA_FORMAT_RGBA5551:          case MESA_FORMAT_ARGB1555: -            assert(_mesa_little_endian()); -            cbpitch |= R300_COLOR_FORMAT_ARGB1555; -            break;          case MESA_FORMAT_ARGB1555_REV: -            assert(!_mesa_little_endian());              cbpitch |= R300_COLOR_FORMAT_ARGB1555;              break; +        case MESA_FORMAT_RGBA8888: +        case MESA_FORMAT_RGBA8888_REV: +        case MESA_FORMAT_XRGB8888: +        case MESA_FORMAT_ARGB8888: +        case MESA_FORMAT_XRGB8888_REV: +        case MESA_FORMAT_ARGB8888_REV: +        case MESA_FORMAT_SRGBA8: +        case MESA_FORMAT_SARGB8: +            cbpitch |= R300_COLOR_FORMAT_ARGB8888; +            break;          default: -            if (cpp == 4) { -                cbpitch |= R300_COLOR_FORMAT_ARGB8888; -            } else { -                _mesa_problem(r300->radeon.glCtx, "unexpected format in emit_cb_offset()");; -            } +            _mesa_problem(r300->radeon.glCtx, "unexpected format in emit_cb_offset()");              break;      } diff --git a/src/mesa/drivers/dri/r300/r300_context.c b/src/mesa/drivers/dri/r300/r300_context.c index ff35cd5275..cfeb5407e9 100644 --- a/src/mesa/drivers/dri/r300/r300_context.c +++ b/src/mesa/drivers/dri/r300/r300_context.c @@ -321,6 +321,12 @@ static void r300_init_vtbl(radeonContextPtr radeon)  	radeon->vtbl.check_blit = r300_check_blit;  	radeon->vtbl.blit = r300_blit; + +	if (radeon->radeonScreen->chip_family >= CHIP_FAMILY_RV515) { +		radeon->vtbl.is_format_renderable = r500IsFormatRenderable; +	} else { +		radeon->vtbl.is_format_renderable = r300IsFormatRenderable; +	}  }  static void r300InitConstValues(GLcontext *ctx, radeonScreenPtr screen) @@ -494,7 +500,7 @@ GLboolean r300CreateContext(const __GLcontextModes * glVisual,  	_mesa_init_driver_functions(&functions);  	r300InitIoctlFuncs(&functions); -	r300InitStateFuncs(&functions); +	r300InitStateFuncs(&r300->radeon, &functions);  	r300InitTextureFuncs(&r300->radeon, &functions);  	r300InitShaderFuncs(&functions);  	radeonInitQueryObjFunctions(&functions); diff --git a/src/mesa/drivers/dri/r300/r300_fragprog_common.c b/src/mesa/drivers/dri/r300/r300_fragprog_common.c index 0646da4624..ba84122956 100644 --- a/src/mesa/drivers/dri/r300/r300_fragprog_common.c +++ b/src/mesa/drivers/dri/r300/r300_fragprog_common.c @@ -220,6 +220,7 @@ static void translate_fragment_program(GLcontext *ctx, struct r300_fragment_prog  	compiler.code = &fp->code;  	compiler.state = fp->state;  	compiler.is_r500 = (r300->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515) ? GL_TRUE : GL_FALSE; +	compiler.max_temp_regs = (compiler.is_r500) ? 128 : 32;  	compiler.OutputDepth = FRAG_RESULT_DEPTH;  	memset(compiler.OutputColor, 0, 4 * sizeof(unsigned));  	compiler.OutputColor[0] = FRAG_RESULT_COLOR; diff --git a/src/mesa/drivers/dri/r300/r300_state.c b/src/mesa/drivers/dri/r300/r300_state.c index 5979dedac4..e660b1fb3b 100644 --- a/src/mesa/drivers/dri/r300/r300_state.c +++ b/src/mesa/drivers/dri/r300/r300_state.c @@ -46,6 +46,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  #include "main/simple_list.h"  #include "main/api_arrayelt.h" +#include "drivers/common/meta.h"  #include "swrast/swrast.h"  #include "swrast_setup/swrast_setup.h"  #include "shader/prog_parameter.h" @@ -589,7 +590,7 @@ static void r300SetDepthState(GLcontext * ctx)  					    R500_STENCIL_REFMASK_FRONT_BACK);  	r300->hw.zs.cmd[R300_ZS_CNTL_1] &= ~(R300_ZS_MASK << R300_Z_FUNC_SHIFT); -	if (ctx->Depth.Test) { +	if (ctx->Depth.Test && ctx->DrawBuffer->_DepthBuffer) {  		r300->hw.zs.cmd[R300_ZS_CNTL_0] |= R300_Z_ENABLE;  		if (ctx->Depth.Mask)  			r300->hw.zs.cmd[R300_ZS_CNTL_0] |= R300_Z_WRITE_ENABLE; @@ -2237,6 +2238,68 @@ void r300UpdateShaderStates(r300ContextPtr rmesa)  	}  } +#define EASY_US_OUT_FMT(comps, c0, c1, c2, c3) \ +	(R500_OUT_FMT_##comps | R500_C0_SEL_##c0 | R500_C1_SEL_##c1 | \ +	 R500_C2_SEL_##c2 | R500_C3_SEL_##c3) +static void r300SetupUsOutputFormat(GLcontext *ctx) +{ +	r300ContextPtr rmesa = R300_CONTEXT(ctx); +	uint32_t hw_format; +	struct radeon_renderbuffer *rrb = radeon_get_colorbuffer(&rmesa->radeon); + +	if (!rrb) { +		return; +	} +	 +	switch (rrb->base.Format) +	{ +		case MESA_FORMAT_RGBA5551: +		case MESA_FORMAT_RGBA8888: +			hw_format = EASY_US_OUT_FMT(C4_8, A, B, G, R); +			break; +		case MESA_FORMAT_RGB565_REV: +		case MESA_FORMAT_RGBA8888_REV: +			hw_format = EASY_US_OUT_FMT(C4_8, R, G, B, A); +			break; +		case MESA_FORMAT_RGB565: +		case MESA_FORMAT_ARGB4444: +		case MESA_FORMAT_ARGB1555: +		case MESA_FORMAT_XRGB8888: +		case MESA_FORMAT_ARGB8888: +			hw_format = EASY_US_OUT_FMT(C4_8, B, G, R, A); +			break; +		case MESA_FORMAT_ARGB4444_REV: +		case MESA_FORMAT_ARGB1555_REV: +		case MESA_FORMAT_XRGB8888_REV: +		case MESA_FORMAT_ARGB8888_REV: +			hw_format = EASY_US_OUT_FMT(C4_8, A, R, G, B); +			break; +		case MESA_FORMAT_SRGBA8: +			hw_format = EASY_US_OUT_FMT(C4_10_GAMMA, A, B, G, R); +			break; +		case MESA_FORMAT_SARGB8: +			hw_format = EASY_US_OUT_FMT(C4_10_GAMMA, B, G, R, A); +			break; +		case MESA_FORMAT_SL8: +			hw_format = EASY_US_OUT_FMT(C4_10_GAMMA, A, A, R, A); +			break; +		case MESA_FORMAT_A8: +			hw_format = EASY_US_OUT_FMT(C4_8, A, A, A, A); +			break; +		case MESA_FORMAT_L8: +		case MESA_FORMAT_I8: +			hw_format = EASY_US_OUT_FMT(C4_8, A, A, R, A); +			break; +		default: +			assert(!"Unsupported format"); +			break; +	} + +	R300_STATECHANGE(rmesa, us_out_fmt); +	rmesa->hw.us_out_fmt.cmd[1] = hw_format; +} +#undef EASY_US_OUT_FMT +  /**   * Called by Mesa after an internal state update.   */ @@ -2266,6 +2329,10 @@ static void r300InvalidateState(GLcontext * ctx, GLuint new_state)  			r300->hw.shade2.cmd[1] &= ~R300_GA_COLOR_CONTROL_PROVOKING_VERTEX_LAST;  	} +	if (new_state & _NEW_BUFFERS) { +		r300SetupUsOutputFormat(ctx); +	} +  	r300->radeon.NewGLState |= new_state;  } @@ -2287,7 +2354,7 @@ static void r300RenderMode(GLcontext * ctx, GLenum mode)  /**   * Initialize driver's state callback functions   */ -void r300InitStateFuncs(struct dd_function_table *functions) +void r300InitStateFuncs(radeonContextPtr radeon, struct dd_function_table *functions)  {  	functions->UpdateState = r300InvalidateState; @@ -2326,8 +2393,13 @@ void r300InitStateFuncs(struct dd_function_table *functions)  	functions->ClipPlane = r300ClipPlane;  	functions->Scissor = radeonScissor; -	functions->DrawBuffer		= radeonDrawBuffer; -	functions->ReadBuffer		= radeonReadBuffer; +	functions->DrawBuffer = radeonDrawBuffer; +	functions->ReadBuffer = radeonReadBuffer; + +	functions->CopyPixels = _mesa_meta_CopyPixels; +	functions->DrawPixels = _mesa_meta_DrawPixels; +	if (radeon->radeonScreen->kernel_mm) +		functions->ReadPixels = radeonReadPixels;  }  void r300InitShaderFunctions(r300ContextPtr r300) diff --git a/src/mesa/drivers/dri/r300/r300_state.h b/src/mesa/drivers/dri/r300/r300_state.h index d46bf9f179..e70f84f4e4 100644 --- a/src/mesa/drivers/dri/r300/r300_state.h +++ b/src/mesa/drivers/dri/r300/r300_state.h @@ -55,7 +55,7 @@ void r300UpdateDrawBuffer (GLcontext * ctx);  void r300UpdateShaders (r300ContextPtr rmesa);  void r300UpdateShaderStates (r300ContextPtr rmesa);  void r300InitState (r300ContextPtr r300); -void r300InitStateFuncs (struct dd_function_table *functions); +void r300InitStateFuncs (radeonContextPtr radeon, struct dd_function_table *functions);  void r300VapCntl(r300ContextPtr rmesa, GLuint input_count, GLuint output_count, GLuint temp_count);  void r300SetupVAP(GLcontext *ctx, GLuint InputsRead, GLuint OutputsWritten); diff --git a/src/mesa/drivers/dri/r300/r300_tex.c b/src/mesa/drivers/dri/r300/r300_tex.c index 8dd8507395..baef206bc2 100644 --- a/src/mesa/drivers/dri/r300/r300_tex.c +++ b/src/mesa/drivers/dri/r300/r300_tex.c @@ -308,6 +308,45 @@ static struct gl_texture_object *r300NewTextureObject(GLcontext * ctx,  	return &t->base;  } +unsigned r300IsFormatRenderable(gl_format mesa_format) +{ +	switch (mesa_format) +	{ +		case MESA_FORMAT_RGB565: +		case MESA_FORMAT_RGBA5551: +		case MESA_FORMAT_RGBA8888: +		case MESA_FORMAT_RGB565_REV: +		case MESA_FORMAT_RGBA8888_REV: +		case MESA_FORMAT_ARGB4444: +		case MESA_FORMAT_ARGB1555: +		case MESA_FORMAT_XRGB8888: +		case MESA_FORMAT_ARGB8888: +		case MESA_FORMAT_ARGB4444_REV: +		case MESA_FORMAT_ARGB1555_REV: +		case MESA_FORMAT_XRGB8888_REV: +		case MESA_FORMAT_ARGB8888_REV: +		case MESA_FORMAT_SRGBA8: +		case MESA_FORMAT_SARGB8: +		case MESA_FORMAT_SL8: +		case MESA_FORMAT_A8: +		case MESA_FORMAT_L8: +		case MESA_FORMAT_I8: +		case MESA_FORMAT_Z16: +			return 1; +		default: +			return 0; +	} +} + +unsigned r500IsFormatRenderable(gl_format mesa_format) +{ +	if (mesa_format == MESA_FORMAT_S8_Z24) { +		return 1; +	} else { +		return r300IsFormatRenderable(mesa_format); +	} +} +  void r300InitTextureFuncs(radeonContextPtr radeon, struct dd_function_table *functions)  {  	/* Note: we only plug in the functions we implement in the driver diff --git a/src/mesa/drivers/dri/r300/r300_tex.h b/src/mesa/drivers/dri/r300/r300_tex.h index 9694e703b8..aca44cd766 100644 --- a/src/mesa/drivers/dri/r300/r300_tex.h +++ b/src/mesa/drivers/dri/r300/r300_tex.h @@ -53,4 +53,7 @@ extern void r300InitTextureFuncs(radeonContextPtr radeon, struct dd_function_tab  int32_t r300TranslateTexFormat(gl_format mesaFormat); +unsigned r300IsFormatRenderable(gl_format mesaFormat); +unsigned r500IsFormatRenderable(gl_format mesaFormat); +  #endif				/* __r300_TEX_H__ */ diff --git a/src/mesa/drivers/dri/r300/radeon_pixel_read.c b/src/mesa/drivers/dri/r300/radeon_pixel_read.c new file mode 120000 index 0000000000..3b03803126 --- /dev/null +++ b/src/mesa/drivers/dri/r300/radeon_pixel_read.c @@ -0,0 +1 @@ +../radeon/radeon_pixel_read.c
\ No newline at end of file diff --git a/src/mesa/drivers/dri/r300/radeon_tex_getimage.c b/src/mesa/drivers/dri/r300/radeon_tex_getimage.c new file mode 120000 index 0000000000..d9836d7326 --- /dev/null +++ b/src/mesa/drivers/dri/r300/radeon_tex_getimage.c @@ -0,0 +1 @@ +../radeon/radeon_tex_getimage.c
\ No newline at end of file diff --git a/src/mesa/drivers/dri/r300/radeon_tile.c b/src/mesa/drivers/dri/r300/radeon_tile.c new file mode 120000 index 0000000000..d4bfe27da6 --- /dev/null +++ b/src/mesa/drivers/dri/r300/radeon_tile.c @@ -0,0 +1 @@ +../radeon/radeon_tile.c
\ No newline at end of file diff --git a/src/mesa/drivers/dri/r300/radeon_tile.h b/src/mesa/drivers/dri/r300/radeon_tile.h new file mode 120000 index 0000000000..31074c581e --- /dev/null +++ b/src/mesa/drivers/dri/r300/radeon_tile.h @@ -0,0 +1 @@ +../radeon/radeon_tile.h
\ No newline at end of file diff --git a/src/mesa/drivers/dri/r300/server/radeon_dri.c b/src/mesa/drivers/dri/r300/server/radeon_dri.c deleted file mode 120000 index d05847d650..0000000000 --- a/src/mesa/drivers/dri/r300/server/radeon_dri.c +++ /dev/null @@ -1 +0,0 @@ -../../radeon/server/radeon_dri.c
\ No newline at end of file diff --git a/src/mesa/drivers/dri/r600/Makefile b/src/mesa/drivers/dri/r600/Makefile index 5d50941539..17915621ee 100644 --- a/src/mesa/drivers/dri/r600/Makefile +++ b/src/mesa/drivers/dri/r600/Makefile @@ -7,8 +7,6 @@ CFLAGS += $(RADEON_CFLAGS)  LIBNAME = r600_dri.so -MINIGLX_SOURCES = server/radeon_dri.c -  ifeq ($(RADEON_LDFLAGS),)  CS_SOURCES = radeon_cs_space_drm.c radeon_bo.c radeon_cs.c  endif @@ -33,10 +31,13 @@ RADEON_COMMON_SOURCES = \  	radeon_fbo.c \  	radeon_lock.c \  	radeon_mipmap_tree.c \ +	radeon_pixel_read.c \ +	radeon_queryobj.c \  	radeon_span.c \  	radeon_texture.c \ -	radeon_queryobj.c \ -	radeon_tex_copy.c +	radeon_tex_copy.c \ +	radeon_tex_getimage.c \ +	radeon_tile.c  DRIVER_SOURCES = \  		 radeon_screen.c \ diff --git a/src/mesa/drivers/dri/r600/r600_context.c b/src/mesa/drivers/dri/r600/r600_context.c index 134e97e7c3..fddac2f9bd 100644 --- a/src/mesa/drivers/dri/r600/r600_context.c +++ b/src/mesa/drivers/dri/r600/r600_context.c @@ -239,6 +239,7 @@ static void r600_init_vtbl(radeonContextPtr radeon)  	radeon->vtbl.emit_query_finish = r600_emit_query_finish;  	radeon->vtbl.check_blit = r600_check_blit;  	radeon->vtbl.blit = r600_blit; +	radeon->vtbl.is_format_renderable = radeonIsFormatRenderable;  }  static void r600InitConstValues(GLcontext *ctx, radeonScreenPtr screen) @@ -383,7 +384,7 @@ GLboolean r600CreateContext(const __GLcontextModes * glVisual,  	 */  	_mesa_init_driver_functions(&functions); -	r700InitStateFuncs(&functions); +	r700InitStateFuncs(&r600->radeon, &functions);  	r600InitTextureFuncs(&r600->radeon, &functions);  	r700InitShaderFuncs(&functions);  	radeonInitQueryObjFunctions(&functions); diff --git a/src/mesa/drivers/dri/r600/r700_state.c b/src/mesa/drivers/dri/r600/r700_state.c index 12eaebbc16..1da31e7b2b 100644 --- a/src/mesa/drivers/dri/r600/r700_state.c +++ b/src/mesa/drivers/dri/r600/r700_state.c @@ -39,6 +39,7 @@  #include "swrast_setup/swrast_setup.h"  #include "main/api_arrayelt.h"  #include "main/framebuffer.h" +#include "drivers/common/meta.h"  #include "shader/prog_parameter.h"  #include "shader/prog_statevars.h" @@ -1816,7 +1817,7 @@ void r700InitState(GLcontext * ctx) //-------------------  } -void r700InitStateFuncs(struct dd_function_table *functions) //----------------- +void r700InitStateFuncs(radeonContextPtr radeon, struct dd_function_table *functions)  {  	functions->UpdateState = r700InvalidateState;  	functions->AlphaFunc = r700AlphaFunc; @@ -1857,8 +1858,12 @@ void r700InitStateFuncs(struct dd_function_table *functions) //-----------------  	functions->Scissor = radeonScissor; -	functions->DrawBuffer		= radeonDrawBuffer; -	functions->ReadBuffer		= radeonReadBuffer; +	functions->DrawBuffer = radeonDrawBuffer; +	functions->ReadBuffer = radeonReadBuffer; +	functions->CopyPixels = _mesa_meta_CopyPixels; +	functions->DrawPixels = _mesa_meta_DrawPixels; +	if (radeon->radeonScreen->kernel_mm) +		functions->ReadPixels = radeonReadPixels;  } diff --git a/src/mesa/drivers/dri/r600/r700_state.h b/src/mesa/drivers/dri/r600/r700_state.h index 60c6a7f23c..56885e0b15 100644 --- a/src/mesa/drivers/dri/r600/r700_state.h +++ b/src/mesa/drivers/dri/r600/r700_state.h @@ -40,7 +40,7 @@ extern void r700UpdateShaderStates(GLcontext * ctx);  extern void r700UpdateViewportOffset(GLcontext * ctx);  extern void r700InitState (GLcontext * ctx); -extern void r700InitStateFuncs (struct dd_function_table *functions); +extern void r700InitStateFuncs (radeonContextPtr radeon, struct dd_function_table *functions);  extern void r700SetScissor(context_t *context); diff --git a/src/mesa/drivers/dri/r600/radeon_pixel_read.c b/src/mesa/drivers/dri/r600/radeon_pixel_read.c new file mode 120000 index 0000000000..3b03803126 --- /dev/null +++ b/src/mesa/drivers/dri/r600/radeon_pixel_read.c @@ -0,0 +1 @@ +../radeon/radeon_pixel_read.c
\ No newline at end of file diff --git a/src/mesa/drivers/dri/r600/radeon_tex_getimage.c b/src/mesa/drivers/dri/r600/radeon_tex_getimage.c new file mode 120000 index 0000000000..d9836d7326 --- /dev/null +++ b/src/mesa/drivers/dri/r600/radeon_tex_getimage.c @@ -0,0 +1 @@ +../radeon/radeon_tex_getimage.c
\ No newline at end of file diff --git a/src/mesa/drivers/dri/r600/radeon_tile.c b/src/mesa/drivers/dri/r600/radeon_tile.c new file mode 120000 index 0000000000..d4bfe27da6 --- /dev/null +++ b/src/mesa/drivers/dri/r600/radeon_tile.c @@ -0,0 +1 @@ +../radeon/radeon_tile.c
\ No newline at end of file diff --git a/src/mesa/drivers/dri/r600/radeon_tile.h b/src/mesa/drivers/dri/r600/radeon_tile.h new file mode 120000 index 0000000000..31074c581e --- /dev/null +++ b/src/mesa/drivers/dri/r600/radeon_tile.h @@ -0,0 +1 @@ +../radeon/radeon_tile.h
\ No newline at end of file diff --git a/src/mesa/drivers/dri/r600/server/radeon_dri.c b/src/mesa/drivers/dri/r600/server/radeon_dri.c deleted file mode 120000 index d05847d650..0000000000 --- a/src/mesa/drivers/dri/r600/server/radeon_dri.c +++ /dev/null @@ -1 +0,0 @@ -../../radeon/server/radeon_dri.c
\ No newline at end of file diff --git a/src/mesa/drivers/dri/radeon/Makefile b/src/mesa/drivers/dri/radeon/Makefile index a54ea16ec6..19df62742e 100644 --- a/src/mesa/drivers/dri/radeon/Makefile +++ b/src/mesa/drivers/dri/radeon/Makefile @@ -8,8 +8,6 @@ CFLAGS += $(RADEON_CFLAGS)  LIBNAME = radeon_dri.so -MINIGLX_SOURCES = server/radeon_dri.c  -  ifeq ($(RADEON_LDFLAGS),)  CS_SOURCES = radeon_cs_space_drm.c radeon_bo.c radeon_cs.c  endif @@ -24,10 +22,13 @@ RADEON_COMMON_SOURCES = \  	radeon_fbo.c \  	radeon_lock.c \  	radeon_mipmap_tree.c \ +	radeon_pixel_read.c \  	radeon_queryobj.c \  	radeon_span.c \  	radeon_texture.c \ -	radeon_tex_copy.c +	radeon_tex_copy.c \ +	radeon_tex_getimage.c \ +	radeon_tile.c  DRIVER_SOURCES = \  	radeon_context.c \ diff --git a/src/mesa/drivers/dri/radeon/radeon_blit.c b/src/mesa/drivers/dri/radeon/radeon_blit.c index e1e1f21550..143822361e 100644 --- a/src/mesa/drivers/dri/radeon/radeon_blit.c +++ b/src/mesa/drivers/dri/radeon/radeon_blit.c @@ -48,6 +48,8 @@ unsigned r100_check_blit(gl_format mesa_format)      case MESA_FORMAT_ARGB4444:      case MESA_FORMAT_ARGB1555:      case MESA_FORMAT_A8: +    case MESA_FORMAT_L8: +    case MESA_FORMAT_I8:  	    break;      default:  	    return 0; @@ -103,6 +105,9 @@ static void inline emit_tx_setup(struct r100_context *r100,      case MESA_FORMAT_ARGB8888:  	    txformat |= RADEON_TXFORMAT_ARGB8888 | RADEON_TXFORMAT_ALPHA_IN_MAP;  	    break; +    case MESA_FORMAT_RGBA8888: +            txformat |= RADEON_TXFORMAT_RGBA8888 | RADEON_TXFORMAT_ALPHA_IN_MAP; +            break;      case MESA_FORMAT_XRGB8888:  	    txformat |= RADEON_TXFORMAT_ARGB8888;  	    break; @@ -116,8 +121,15 @@ static void inline emit_tx_setup(struct r100_context *r100,  	    txformat |= RADEON_TXFORMAT_ARGB1555 | RADEON_TXFORMAT_ALPHA_IN_MAP;  	    break;      case MESA_FORMAT_A8: +    case MESA_FORMAT_I8:  	    txformat |= RADEON_TXFORMAT_I8 | RADEON_TXFORMAT_ALPHA_IN_MAP;  	    break; +    case MESA_FORMAT_L8: +            txformat |= RADEON_TXFORMAT_I8; +            break; +    case MESA_FORMAT_AL88: +            txformat |= RADEON_TXFORMAT_AI88 | RADEON_TXFORMAT_ALPHA_IN_MAP; +            break;      default:  	    break;      } @@ -177,6 +189,8 @@ static inline void emit_cb_setup(struct r100_context *r100,  	    dst_format = RADEON_COLOR_FORMAT_ARGB1555;  	    break;      case MESA_FORMAT_A8: +    case MESA_FORMAT_L8: +    case MESA_FORMAT_I8:  	    dst_format = RADEON_COLOR_FORMAT_RGB8;  	    break;      default: diff --git a/src/mesa/drivers/dri/radeon/radeon_common.h b/src/mesa/drivers/dri/radeon/radeon_common.h index cd01c9984e..35b3f08fff 100644 --- a/src/mesa/drivers/dri/radeon/radeon_common.h +++ b/src/mesa/drivers/dri/radeon/radeon_common.h @@ -44,6 +44,12 @@ radeon_renderbuffer_set_bo(struct radeon_renderbuffer *rb,  struct radeon_renderbuffer *  radeon_create_renderbuffer(gl_format format, __DRIdrawable *driDrawPriv); +void +radeonReadPixels(GLcontext * ctx, +				GLint x, GLint y, GLsizei width, GLsizei height, +				GLenum format, GLenum type, +				const struct gl_pixelstore_attrib *pack, GLvoid * pixels); +  void radeon_check_front_buffer_rendering(GLcontext *ctx);  static inline struct radeon_renderbuffer *radeon_renderbuffer(struct gl_renderbuffer *rb)  { diff --git a/src/mesa/drivers/dri/radeon/radeon_common_context.h b/src/mesa/drivers/dri/radeon/radeon_common_context.h index d1a24e265f..5156c5d0d0 100644 --- a/src/mesa/drivers/dri/radeon/radeon_common_context.h +++ b/src/mesa/drivers/dri/radeon/radeon_common_context.h @@ -539,6 +539,7 @@ struct radeon_context {                          unsigned reg_width,                          unsigned reg_height,                          unsigned flip_y); +	   unsigned (*is_format_renderable)(gl_format mesa_format);     } vtbl;  }; diff --git a/src/mesa/drivers/dri/radeon/radeon_context.c b/src/mesa/drivers/dri/radeon/radeon_context.c index 878a453bd5..56aba16e9e 100644 --- a/src/mesa/drivers/dri/radeon/radeon_context.c +++ b/src/mesa/drivers/dri/radeon/radeon_context.c @@ -200,6 +200,7 @@ static void r100_init_vtbl(radeonContextPtr radeon)     radeon->vtbl.emit_query_finish = r100_emit_query_finish;     radeon->vtbl.check_blit = r100_check_blit;     radeon->vtbl.blit = r100_blit; +   radeon->vtbl.is_format_renderable = radeonIsFormatRenderable;  }  /* Create the device specific context. diff --git a/src/mesa/drivers/dri/radeon/radeon_fbo.c b/src/mesa/drivers/dri/radeon/radeon_fbo.c index 46664a1755..6398605835 100644 --- a/src/mesa/drivers/dri/radeon/radeon_fbo.c +++ b/src/mesa/drivers/dri/radeon/radeon_fbo.c @@ -409,82 +409,51 @@ radeon_framebuffer_renderbuffer(GLcontext * ctx,     radeon_draw_buffer(ctx, fb);  } - -/* TODO: According to EXT_fbo spec internal format of texture image - * once set during glTexImage call, should be preserved when - * attaching image to renderbuffer. When HW doesn't support - * rendering to format of attached image, set framebuffer - * completeness accordingly in radeon_validate_framebuffer (issue #79). - */  static GLboolean  radeon_update_wrapper(GLcontext *ctx, struct radeon_renderbuffer *rrb,   		     struct gl_texture_image *texImage)  { -	int retry = 0; -	gl_format texFormat; -  	radeon_print(RADEON_TEXTURE, RADEON_TRACE, -		"%s(%p, rrb %p, texImage %p) \n", -		__func__, ctx, rrb, texImage); - -restart: -	if (texImage->TexFormat == _dri_texformat_argb8888) { -		rrb->base.DataType = GL_UNSIGNED_BYTE; -		DBG("Render to RGBA8 texture OK\n"); -	} -	else if (texImage->TexFormat == _dri_texformat_rgb565) { -		rrb->base.DataType = GL_UNSIGNED_BYTE; -		DBG("Render to RGB5 texture OK\n"); -	} -	else if (texImage->TexFormat == _dri_texformat_argb1555) { -		rrb->base.DataType = GL_UNSIGNED_BYTE; -		DBG("Render to ARGB1555 texture OK\n"); -	} -	else if (texImage->TexFormat == _dri_texformat_argb4444) { -		rrb->base.DataType = GL_UNSIGNED_BYTE; -		DBG("Render to ARGB4444 texture OK\n"); -	} -	else if (texImage->TexFormat == MESA_FORMAT_Z16) { -		rrb->base.DataType = GL_UNSIGNED_SHORT; -		DBG("Render to DEPTH16 texture OK\n"); -	} -	else if (texImage->TexFormat == MESA_FORMAT_S8_Z24) { -		rrb->base.DataType = GL_UNSIGNED_INT_24_8_EXT; -		DBG("Render to DEPTH_STENCIL texture OK\n"); -	} -	else { -		/* try redoing the FBO */ -		if (retry == 1) { -			DBG("Render to texture BAD FORMAT %d\n", -			    texImage->TexFormat); -			return GL_FALSE; -		} -                /* XXX why is the tex format being set here? -                 * I think this can be removed. -                 */ -		texImage->TexFormat = radeonChooseTextureFormat(ctx, texImage->InternalFormat, 0, -								_mesa_get_format_datatype(texImage->TexFormat), -								1); +		"%s(%p, rrb %p, texImage %p, texFormat %s) \n", +		__func__, ctx, rrb, texImage, _mesa_get_format_name(texImage->TexFormat)); -		retry++; -		goto restart; +	switch (texImage->TexFormat) { +		case MESA_FORMAT_RGBA8888: +		case MESA_FORMAT_RGBA8888_REV: +		case MESA_FORMAT_ARGB8888: +		case MESA_FORMAT_ARGB8888_REV: +		case MESA_FORMAT_XRGB8888: +		case MESA_FORMAT_XRGB8888_REV: +		case MESA_FORMAT_RGB565: +		case MESA_FORMAT_RGB565_REV: +		case MESA_FORMAT_RGBA5551: +		case MESA_FORMAT_ARGB1555: +		case MESA_FORMAT_ARGB1555_REV: +		case MESA_FORMAT_ARGB4444: +		case MESA_FORMAT_ARGB4444_REV: +			rrb->base.DataType = GL_UNSIGNED_BYTE; +			break; +		case MESA_FORMAT_Z16: +			rrb->base.DataType = GL_UNSIGNED_SHORT; +			break; +		case MESA_FORMAT_X8_Z24: +			rrb->base.DataType = GL_UNSIGNED_INT; +			break; +		case MESA_FORMAT_S8_Z24: +			rrb->base.DataType = GL_UNSIGNED_INT_24_8_EXT; +			break;  	} -	 -	texFormat = texImage->TexFormat; - -	rrb->base.Format = texFormat; - -        rrb->cpp = _mesa_get_format_bytes(texFormat); +		 +	rrb->cpp = _mesa_get_format_bytes(texImage->TexFormat);  	rrb->pitch = texImage->Width * rrb->cpp; +	rrb->base.Format = texImage->TexFormat;  	rrb->base.InternalFormat = texImage->InternalFormat; -        rrb->base._BaseFormat = _mesa_base_fbo_format(ctx, rrb->base.InternalFormat); - +	rrb->base._BaseFormat = _mesa_base_fbo_format(ctx, rrb->base.InternalFormat);  	rrb->base.Width = texImage->Width;  	rrb->base.Height = texImage->Height; -	  	rrb->base.Delete = radeon_delete_renderbuffer;  	rrb->base.AllocStorage = radeon_nop_alloc_storage; -	 +  	return GL_TRUE;  } @@ -607,6 +576,35 @@ radeon_finish_render_texture(GLcontext * ctx,  static void  radeon_validate_framebuffer(GLcontext *ctx, struct gl_framebuffer *fb)  { +	radeonContextPtr radeon = RADEON_CONTEXT(ctx); +	gl_format mesa_format; +	int i; + +	for (i = -2; i < (GLint) ctx->Const.MaxColorAttachments; i++) { +		struct gl_renderbuffer_attachment *att; +		if (i == -2) { +			att = &fb->Attachment[BUFFER_DEPTH]; +		} else if (i == -1) { +			att = &fb->Attachment[BUFFER_STENCIL]; +		} else { +			att = &fb->Attachment[BUFFER_COLOR0 + i]; +		} + +		if (att->Type == GL_TEXTURE) { +			mesa_format = att->Texture->Image[att->CubeMapFace][att->TextureLevel]->TexFormat; +		} else { +			/* All renderbuffer formats are renderable, but not sampable */ +			continue; +		} + +		if (!radeon->vtbl.is_format_renderable(mesa_format)){ +			fb->_Status = GL_FRAMEBUFFER_UNSUPPORTED; +			radeon_print(RADEON_TEXTURE, RADEON_TRACE, +						"%s: HW doesn't support format %s as output format of attachment %d\n", +						__FUNCTION__, _mesa_get_format_name(mesa_format), i); +			return; +		} +	}  }  void radeon_fbo_init(struct radeon_context *radeon) diff --git a/src/mesa/drivers/dri/radeon/radeon_mipmap_tree.c b/src/mesa/drivers/dri/radeon/radeon_mipmap_tree.c index e0e271b771..7f5fb99fa4 100644 --- a/src/mesa/drivers/dri/radeon/radeon_mipmap_tree.c +++ b/src/mesa/drivers/dri/radeon/radeon_mipmap_tree.c @@ -36,6 +36,7 @@  #include "main/texobj.h"  #include "main/enums.h"  #include "radeon_texture.h" +#include "radeon_tile.h"  static unsigned get_aligned_compressed_row_stride(  		gl_format format, @@ -69,16 +70,51 @@ static unsigned get_aligned_compressed_row_stride(  	return stride;  } -static unsigned get_compressed_image_size( +unsigned get_texture_image_size(  		gl_format format,  		unsigned rowStride, -		unsigned height) +		unsigned height, +		unsigned depth, +		unsigned tiling)  { -	unsigned blockWidth, blockHeight; +	if (_mesa_is_format_compressed(format)) { +		unsigned blockWidth, blockHeight; -	_mesa_get_format_block_size(format, &blockWidth, &blockHeight); +		_mesa_get_format_block_size(format, &blockWidth, &blockHeight); + +		return rowStride * ((height + blockHeight - 1) / blockHeight) * depth; +	} else if (tiling) { +		/* Need to align height to tile height */ +		unsigned tileWidth, tileHeight; + +		get_tile_size(format, &tileWidth, &tileHeight); +		tileHeight--; + +		height = (height + tileHeight) & ~tileHeight; +	} + +	return rowStride * height * depth; +} + +unsigned get_texture_image_row_stride(radeonContextPtr rmesa, gl_format format, unsigned width, unsigned tiling) +{ +	if (_mesa_is_format_compressed(format)) { +		return get_aligned_compressed_row_stride(format, width, rmesa->texture_compressed_row_align); +	} else { +		unsigned row_align; + +		if (!_mesa_is_pow_two(width)) { +			row_align = rmesa->texture_rect_row_align - 1; +		} else if (tiling) { +			unsigned tileWidth, tileHeight; +			get_tile_size(format, &tileWidth, &tileHeight); +			row_align = tileWidth * _mesa_get_format_bytes(format) - 1; +		} else { +			row_align = rmesa->texture_row_align - 1; +		} -	return rowStride * ((height + blockHeight - 1) / blockHeight); +		return (_mesa_format_row_stride(format, width) + row_align) & ~row_align; +	}  }  /** @@ -92,34 +128,15 @@ static void compute_tex_image_offset(radeonContextPtr rmesa, radeon_mipmap_tree  	GLuint face, GLuint level, GLuint* curOffset)  {  	radeon_mipmap_level *lvl = &mt->levels[level]; -	uint32_t row_align;  	GLuint height;  	height = _mesa_next_pow_two_32(lvl->height); -	/* Find image size in bytes */ -	if (_mesa_is_format_compressed(mt->mesaFormat)) { -		lvl->rowstride = get_aligned_compressed_row_stride(mt->mesaFormat, lvl->width, rmesa->texture_compressed_row_align); -		lvl->size = get_compressed_image_size(mt->mesaFormat, lvl->rowstride, height); -	} else if (mt->target == GL_TEXTURE_RECTANGLE_NV) { -		row_align = rmesa->texture_rect_row_align - 1; -		lvl->rowstride = (_mesa_format_row_stride(mt->mesaFormat, lvl->width) + row_align) & ~row_align; -		lvl->size = lvl->rowstride * height; -	} else if (mt->tilebits & RADEON_TXO_MICRO_TILE) { -		/* tile pattern is 16 bytes x2. mipmaps stay 32 byte aligned, -		 * though the actual offset may be different (if texture is less than -		 * 32 bytes width) to the untiled case */ -		lvl->rowstride = (_mesa_format_row_stride(mt->mesaFormat, lvl->width) * 2 + 31) & ~31; -		lvl->size = lvl->rowstride * ((height + 1) / 2) * lvl->depth; -	} else { -		row_align = rmesa->texture_row_align - 1; -		lvl->rowstride = (_mesa_format_row_stride(mt->mesaFormat, lvl->width) + row_align) & ~row_align; -		lvl->size = lvl->rowstride * height * lvl->depth; -	} +	lvl->rowstride = get_texture_image_row_stride(rmesa, mt->mesaFormat, lvl->width, mt->tilebits); +	lvl->size = get_texture_image_size(mt->mesaFormat, lvl->rowstride, lvl->height, lvl->depth, mt->tilebits); +  	assert(lvl->size > 0); -	/* All images are aligned to a 32-byte offset */ -	*curOffset = (*curOffset + 0x1f) & ~0x1f;  	lvl->faces[face].offset = *curOffset;  	*curOffset += lvl->size; @@ -451,12 +468,9 @@ static void migrate_image_to_miptree(radeon_mipmap_tree *mt,  		radeon_mipmap_level *srclvl = &image->mt->levels[image->mtlevel]; -		/* TODO: bring back these assertions once the FBOs are fixed */ -#if 0  		assert(image->mtlevel == level);  		assert(srclvl->size == dstlvl->size);  		assert(srclvl->rowstride == dstlvl->rowstride); -#endif  		radeon_bo_map(image->mt->bo, GL_FALSE); diff --git a/src/mesa/drivers/dri/radeon/radeon_mipmap_tree.h b/src/mesa/drivers/dri/radeon/radeon_mipmap_tree.h index c911688c1a..088f970172 100644 --- a/src/mesa/drivers/dri/radeon/radeon_mipmap_tree.h +++ b/src/mesa/drivers/dri/radeon/radeon_mipmap_tree.h @@ -89,4 +89,13 @@ void radeon_try_alloc_miptree(radeonContextPtr rmesa, radeonTexObj *t);  GLuint radeon_miptree_image_offset(radeon_mipmap_tree *mt,  				   GLuint face, GLuint level);  uint32_t get_base_teximage_offset(radeonTexObj *texObj); + +unsigned get_texture_image_row_stride(radeonContextPtr rmesa, gl_format format, unsigned width, unsigned tiling); + +unsigned get_texture_image_size( +		gl_format format, +		unsigned rowStride, +		unsigned height, +		unsigned depth, +		unsigned tiling);  #endif /* __RADEON_MIPMAP_TREE_H_ */ diff --git a/src/mesa/drivers/dri/radeon/radeon_pixel_read.c b/src/mesa/drivers/dri/radeon/radeon_pixel_read.c new file mode 100644 index 0000000000..dadb8002c7 --- /dev/null +++ b/src/mesa/drivers/dri/radeon/radeon_pixel_read.c @@ -0,0 +1,199 @@ +/* + * Copyright (C) 2010 Maciej Cencora <m.cencora@gmail.com> + * + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +#include "stdint.h" +#include "main/bufferobj.h" +#include "main/enums.h" +#include "main/image.h" +#include "main/state.h" +#include "swrast/swrast.h" + +#include "radeon_common_context.h" +#include "radeon_debug.h" +#include "radeon_mipmap_tree.h" + +static gl_format gl_format_and_type_to_mesa_format(GLenum format, GLenum type) +{ +    switch (format) +    { +        case GL_RGB: +            switch (type) { +                case GL_UNSIGNED_SHORT_5_6_5: +                    return MESA_FORMAT_RGB565; +                case GL_UNSIGNED_SHORT_5_6_5_REV: +                    return MESA_FORMAT_RGB565_REV; +            } +            break; +        case GL_RGBA: +            switch (type) { +                case GL_FLOAT: +                    return MESA_FORMAT_RGBA_FLOAT32; +                case GL_UNSIGNED_SHORT_5_5_5_1: +                    return MESA_FORMAT_RGBA5551; +                case GL_UNSIGNED_INT_8_8_8_8: +                    return MESA_FORMAT_RGBA8888; +                case GL_UNSIGNED_BYTE: +                case GL_UNSIGNED_INT_8_8_8_8_REV: +                    return MESA_FORMAT_RGBA8888_REV; +            } +            break; +        case GL_BGRA: +            switch (type) { +                case GL_UNSIGNED_SHORT_4_4_4_4: +                    return MESA_FORMAT_ARGB4444_REV; +                case GL_UNSIGNED_SHORT_4_4_4_4_REV: +                    return MESA_FORMAT_ARGB4444; +                case GL_UNSIGNED_SHORT_5_5_5_1: +                    return MESA_FORMAT_ARGB1555_REV; +                case GL_UNSIGNED_SHORT_1_5_5_5_REV: +                    return MESA_FORMAT_ARGB1555; +                case GL_UNSIGNED_INT_8_8_8_8: +                    return MESA_FORMAT_ARGB8888_REV; +                case GL_UNSIGNED_BYTE: +                case GL_UNSIGNED_INT_8_8_8_8_REV: +                    return MESA_FORMAT_ARGB8888; + +            } +            break; +    } + +    return MESA_FORMAT_NONE; +} + +static GLboolean +do_blit_readpixels(GLcontext * ctx, +                   GLint x, GLint y, GLsizei width, GLsizei height, +                   GLenum format, GLenum type, +                   const struct gl_pixelstore_attrib *pack, GLvoid * pixels) +{ +    radeonContextPtr radeon = RADEON_CONTEXT(ctx); +    const struct radeon_renderbuffer *rrb = radeon_renderbuffer(ctx->ReadBuffer->_ColorReadBuffer); +    const gl_format dst_format = gl_format_and_type_to_mesa_format(format, type); +    unsigned dst_rowstride, dst_imagesize, aligned_rowstride, flip_y; +    struct radeon_bo *dst_buffer; +    GLint dst_x = 0, dst_y = 0; + +    /* It's not worth if number of pixels to copy is really small */ +    if (width * height < 100) { +        return GL_FALSE; +    } + +    if (dst_format == MESA_FORMAT_NONE || +        !radeon->vtbl.check_blit(dst_format) || !radeon->vtbl.blit) { +        return GL_FALSE; +    } + +    if (ctx->_ImageTransferState || ctx->Color._LogicOpEnabled) { +        return GL_FALSE; +    } + +    if (pack->SwapBytes || pack->LsbFirst) { +        return GL_FALSE; +    } + +    if (pack->RowLength > 0) { +        dst_rowstride = pack->RowLength; +    } else { +        dst_rowstride = width; +    } + +    if (!_mesa_clip_copytexsubimage(ctx, &dst_x, &dst_y, &x, &y, &width, &height)) { +        return GL_TRUE; +    } +    assert(x >= 0 && y >= 0); + +    aligned_rowstride = get_texture_image_row_stride(radeon, dst_format, dst_rowstride, 0); +    dst_imagesize = get_texture_image_size(dst_format, +                                           aligned_rowstride, +                                           height, 1, 0); +    dst_buffer = radeon_bo_open(radeon->radeonScreen->bom, 0, dst_imagesize, 1024, RADEON_GEM_DOMAIN_GTT, 0); + +    /* Disable source Y flipping for FBOs */ +    flip_y = (ctx->ReadBuffer->Name == 0); +    if (pack->Invert) { +        y = rrb->base.Height - height - y; +        flip_y = !flip_y; +    } + +    if (radeon->vtbl.blit(ctx, +                          rrb->bo, +                          rrb->draw_offset, +                          rrb->base.Format, +                          rrb->pitch / rrb->cpp, +                          rrb->base.Width, +                          rrb->base.Height, +                          x, +                          y, +                          dst_buffer, +                          0, /* dst_offset */ +                          dst_format, +                          aligned_rowstride / _mesa_get_format_bytes(dst_format), +                          width, +                          height, +                          0, /* dst_x */ +                          0, /* dst_y */ +                          width, +                          height, +                          flip_y)) +    { +        radeon_bo_map(dst_buffer, 0); +        dst_rowstride *= _mesa_get_format_bytes(dst_format); +        copy_rows(pixels, dst_rowstride, dst_buffer->ptr, +                  aligned_rowstride, height, dst_rowstride); +        radeon_bo_unmap(dst_buffer); +        radeon_bo_unref(dst_buffer); +        return GL_TRUE; +    } else { +        radeon_bo_unref(dst_buffer); +        return GL_FALSE; +    } +} + +void +radeonReadPixels(GLcontext * ctx, +                 GLint x, GLint y, GLsizei width, GLsizei height, +                 GLenum format, GLenum type, +                 const struct gl_pixelstore_attrib *pack, GLvoid * pixels) +{ +    if (do_blit_readpixels(ctx, x, y, width, height, format, type, pack, pixels)) +        return; + +    /* Update Mesa state before calling down into _swrast_ReadPixels, as +     * the spans code requires the computed buffer states to be up to date, +     * but _swrast_ReadPixels only updates Mesa state after setting up +     * the spans code. +     */ + +    radeon_print(RADEON_FALLBACKS, RADEON_NORMAL, +                 "Falling back to sw for ReadPixels (format %s, type %s)\n", +                 _mesa_lookup_enum_by_nr(format), _mesa_lookup_enum_by_nr(type)); + +    if (ctx->NewState) +        _mesa_update_state(ctx); + +    _swrast_ReadPixels(ctx, x, y, width, height, format, type, pack, pixels); +} diff --git a/src/mesa/drivers/dri/radeon/radeon_state.c b/src/mesa/drivers/dri/radeon/radeon_state.c index 583751d64d..539b067742 100644 --- a/src/mesa/drivers/dri/radeon/radeon_state.c +++ b/src/mesa/drivers/dri/radeon/radeon_state.c @@ -45,6 +45,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  #include "tnl/tnl.h"  #include "tnl/t_pipeline.h"  #include "swrast_setup/swrast_setup.h" +#include "drivers/common/meta.h"  #include "radeon_context.h"  #include "radeon_mipmap_tree.h" @@ -2248,6 +2249,10 @@ void radeonInitStateFuncs( GLcontext *ctx , GLboolean dri2 )     ctx->Driver.DrawBuffer		= radeonDrawBuffer;     ctx->Driver.ReadBuffer		= radeonReadBuffer; +   ctx->Driver.CopyPixels               = _mesa_meta_CopyPixels; +   ctx->Driver.DrawPixels               = _mesa_meta_DrawPixels; +   if (dri2) +	   ctx->Driver.ReadPixels               = radeonReadPixels;     ctx->Driver.AlphaFunc		= radeonAlphaFunc;     ctx->Driver.BlendEquationSeparate	= radeonBlendEquationSeparate; diff --git a/src/mesa/drivers/dri/radeon/radeon_tex_copy.c b/src/mesa/drivers/dri/radeon/radeon_tex_copy.c index 5cfad6fc3c..29fd31ac23 100644 --- a/src/mesa/drivers/dri/radeon/radeon_tex_copy.c +++ b/src/mesa/drivers/dri/radeon/radeon_tex_copy.c @@ -28,6 +28,7 @@  #include "radeon_common.h"  #include "radeon_texture.h" +#include "main/enums.h"  #include "main/image.h"  #include "main/teximage.h"  #include "main/texstate.h" @@ -52,22 +53,34 @@ do_copy_texsubimage(GLcontext *ctx,      gl_format dst_mesaformat;      unsigned src_width;      unsigned dst_width; +    unsigned flip_y;      if (!radeon->vtbl.blit) {          return GL_FALSE;      }      if (_mesa_get_format_bits(timg->base.TexFormat, GL_DEPTH_BITS) > 0) { -        rrb = radeon_get_depthbuffer(radeon); +        if (ctx->ReadBuffer->_DepthBuffer && ctx->ReadBuffer->_DepthBuffer->Wrapped) { +            rrb = radeon_renderbuffer(ctx->ReadBuffer->_DepthBuffer->Wrapped); +        } else { +            rrb = radeon_renderbuffer(ctx->ReadBuffer->_DepthBuffer); +        } +        flip_y = ctx->ReadBuffer->Attachment[BUFFER_DEPTH].Type == GL_NONE;      } else { -        rrb = radeon_get_colorbuffer(radeon); +        rrb = radeon_renderbuffer(ctx->ReadBuffer->_ColorReadBuffer); +        flip_y = ctx->ReadBuffer->Attachment[BUFFER_COLOR0].Type == GL_NONE; +    } + +    // This is software renderbuffer, fallback to swrast +    if (!rrb) { +        return GL_FALSE;      }      if (!timg->mt) {          radeon_validate_texture_miptree(ctx, &tobj->base);      } -    assert(rrb && rrb->bo); +    assert(rrb->bo);      assert(timg->mt);      assert(timg->mt->bo);      assert(timg->base.Width >= dstx + width); @@ -124,7 +137,7 @@ do_copy_texsubimage(GLcontext *ctx,                               timg->mt->bo, dst_offset, dst_mesaformat,                               timg->mt->levels[level].rowstride / dst_bpp,                               dst_width, timg->base.Height, -                             dstx, dsty, width, height, 1); +                             dstx, dsty, width, height, flip_y);  }  void @@ -171,6 +184,10 @@ radeonCopyTexImage2D(GLcontext *ctx, GLenum target, GLint level,      return;  fail: +    radeon_print(RADEON_FALLBACKS, RADEON_NORMAL, +                 "Falling back to sw for glCopyTexImage2D (internalFormat %s, border %d)\n", +                 _mesa_lookup_enum_by_nr(internalFormat), border); +      _mesa_meta_CopyTexImage2D(ctx, target, level, internalFormat, x, y,                                width, height, border);  } @@ -189,7 +206,8 @@ radeonCopyTexSubImage2D(GLcontext *ctx, GLenum target, GLint level,                               radeon_tex_obj(texObj), (radeon_texture_image *)texImage,                               xoffset, yoffset, x, y, width, height)) { -       //DEBUG_FALLBACKS +        radeon_print(RADEON_FALLBACKS, RADEON_NORMAL, +                     "Falling back to sw for glCopyTexSubImage2D\n");          _mesa_meta_CopyTexSubImage2D(ctx, target, level,                                       xoffset, yoffset, x, y, width, height); diff --git a/src/mesa/drivers/dri/radeon/radeon_tex_getimage.c b/src/mesa/drivers/dri/radeon/radeon_tex_getimage.c new file mode 100644 index 0000000000..7bf6dcc2e3 --- /dev/null +++ b/src/mesa/drivers/dri/radeon/radeon_tex_getimage.c @@ -0,0 +1,95 @@ +/* + * Copyright (C) 2009 Maciej Cencora. + * Copyright (C) 2008 Nicolai Haehnle. + * Copyright (C) The Weather Channel, Inc.  2002.  All Rights Reserved. + * + * The Weather Channel (TM) funded Tungsten Graphics to develop the + * initial release of the Radeon 8500 driver under the XFree86 license. + * This notice must be preserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +#include "radeon_common_context.h" +#include "radeon_texture.h" +#include "radeon_mipmap_tree.h" + +#include "main/texgetimage.h" + +/** + * Need to map texture image into memory before copying image data, + * then unmap it. + */ +static void +radeon_get_tex_image(GLcontext * ctx, GLenum target, GLint level, +             GLenum format, GLenum type, GLvoid * pixels, +             struct gl_texture_object *texObj, +             struct gl_texture_image *texImage, int compressed) +{ +    radeon_texture_image *image = get_radeon_texture_image(texImage); + +    radeon_print(RADEON_TEXTURE, RADEON_NORMAL, +                 "%s(%p, tex %p, image %p) compressed %d.\n", +                 __func__, ctx, texObj, image, compressed); + +    if (image->mt) { +        /* Map the texture image read-only */ +        radeon_teximage_map(image, GL_FALSE); +    } else { +        /* Image hasn't been uploaded to a miptree yet */ +        assert(image->base.Data); +    } + +    if (compressed) { +        /* FIXME: this can't work for small textures (mips) which +                 use different hw stride */ +        _mesa_get_compressed_teximage(ctx, target, level, pixels, +                          texObj, texImage); +    } else { +        _mesa_get_teximage(ctx, target, level, format, type, pixels, +                   texObj, texImage); +    } + +    if (image->mt) { +        radeon_teximage_unmap(image); +    } +} + +void +radeonGetTexImage(GLcontext * ctx, GLenum target, GLint level, +          GLenum format, GLenum type, GLvoid * pixels, +          struct gl_texture_object *texObj, +          struct gl_texture_image *texImage) +{ +    radeon_get_tex_image(ctx, target, level, format, type, pixels, +                 texObj, texImage, 0); +} + +void +radeonGetCompressedTexImage(GLcontext *ctx, GLenum target, GLint level, +                GLvoid *pixels, +                struct gl_texture_object *texObj, +                struct gl_texture_image *texImage) +{ +    radeon_get_tex_image(ctx, target, level, 0, 0, pixels, +                 texObj, texImage, 1); +} diff --git a/src/mesa/drivers/dri/radeon/radeon_texture.c b/src/mesa/drivers/dri/radeon/radeon_texture.c index ff37fd3e86..2b655fbd95 100644 --- a/src/mesa/drivers/dri/radeon/radeon_texture.c +++ b/src/mesa/drivers/dri/radeon/radeon_texture.c @@ -39,7 +39,6 @@  #include "main/texstore.h"  #include "main/teximage.h"  #include "main/texobj.h" -#include "main/texgetimage.h"  #include "xmlpool.h"		/* for symbolic values of enum-type options */ @@ -559,6 +558,15 @@ gl_format radeonChooseTextureFormat(GLcontext * ctx,  	case GL_COMPRESSED_SLUMINANCE_ALPHA:  		return MESA_FORMAT_SLA8; +	case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT: +		return MESA_FORMAT_SRGB_DXT1; +	case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: +		return MESA_FORMAT_SRGBA_DXT1; +	case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: +		return MESA_FORMAT_SRGBA_DXT3; +	case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: +		return MESA_FORMAT_SRGBA_DXT5; +  	default:  		_mesa_problem(ctx,  			      "unexpected internalFormat 0x%x in %s", @@ -664,6 +672,7 @@ static void radeon_store_teximage(GLcontext* ctx, int dims,  		struct gl_texture_image *texImage,  		int compressed)  { +	radeonContextPtr rmesa = RADEON_CONTEXT(ctx);  	radeonTexObj *t = radeon_tex_obj(texObj);  	radeon_texture_image* image = get_radeon_texture_image(texImage); @@ -678,8 +687,7 @@ static void radeon_store_teximage(GLcontext* ctx, int dims,  		dstRowStride = image->mt->levels[image->mtlevel].rowstride;  	} else if (t->bo) {  		/* TFP case */ -		/* TODO */ -		assert(0); +		dstRowStride = get_texture_image_row_stride(rmesa, texImage->TexFormat, width, 0);  	} else {  		dstRowStride = _mesa_format_row_stride(texImage->TexFormat, texImage->Width);  	} @@ -999,61 +1007,18 @@ void radeonTexSubImage3D(GLcontext * ctx, GLenum target, GLint level,  		format, type, pixels, packing, texObj, texImage, 0);  } -/** - * Need to map texture image into memory before copying image data, - * then unmap it. - */ -static void -radeon_get_tex_image(GLcontext * ctx, GLenum target, GLint level, -		     GLenum format, GLenum type, GLvoid * pixels, -		     struct gl_texture_object *texObj, -		     struct gl_texture_image *texImage, int compressed) +unsigned radeonIsFormatRenderable(gl_format mesa_format)  { -	radeon_texture_image *image = get_radeon_texture_image(texImage); - -	radeon_print(RADEON_TEXTURE, RADEON_NORMAL, -			"%s(%p, tex %p, image %p) compressed %d.\n", -			__func__, ctx, texObj, image, compressed); +	if (mesa_format == _dri_texformat_argb8888 || mesa_format == _dri_texformat_rgb565 || +		mesa_format == _dri_texformat_argb1555 || mesa_format == _dri_texformat_argb4444) +		return 1; -	if (image->mt) { -		/* Map the texture image read-only */ -		radeon_teximage_map(image, GL_FALSE); -	} else { -		/* Image hasn't been uploaded to a miptree yet */ -		assert(image->base.Data); -	} - -	if (compressed) { -		/* FIXME: this can't work for small textures (mips) which -		         use different hw stride */ -		_mesa_get_compressed_teximage(ctx, target, level, pixels, -					      texObj, texImage); -	} else { -		_mesa_get_teximage(ctx, target, level, format, type, pixels, -				   texObj, texImage); -	} -      -	if (image->mt) { -		radeon_teximage_unmap(image); +	switch (mesa_format) +	{ +		case MESA_FORMAT_Z16: +		case MESA_FORMAT_S8_Z24: +			return 1; +		default: +			return 0;  	}  } - -void -radeonGetTexImage(GLcontext * ctx, GLenum target, GLint level, -		  GLenum format, GLenum type, GLvoid * pixels, -		  struct gl_texture_object *texObj, -		  struct gl_texture_image *texImage) -{ -	radeon_get_tex_image(ctx, target, level, format, type, pixels, -			     texObj, texImage, 0); -} - -void -radeonGetCompressedTexImage(GLcontext *ctx, GLenum target, GLint level, -			    GLvoid *pixels, -			    struct gl_texture_object *texObj, -			    struct gl_texture_image *texImage) -{ -	radeon_get_tex_image(ctx, target, level, 0, 0, pixels, -			     texObj, texImage, 1); -} diff --git a/src/mesa/drivers/dri/radeon/radeon_texture.h b/src/mesa/drivers/dri/radeon/radeon_texture.h index f09dd65214..4ce639ea34 100644 --- a/src/mesa/drivers/dri/radeon/radeon_texture.h +++ b/src/mesa/drivers/dri/radeon/radeon_texture.h @@ -135,4 +135,6 @@ void radeonCopyTexSubImage2D(GLcontext *ctx, GLenum target, GLint level,  			GLint x, GLint y,  			GLsizei width, GLsizei height); +unsigned radeonIsFormatRenderable(gl_format mesa_format); +  #endif diff --git a/src/mesa/drivers/dri/radeon/radeon_tile.c b/src/mesa/drivers/dri/radeon/radeon_tile.c new file mode 100644 index 0000000000..403da11010 --- /dev/null +++ b/src/mesa/drivers/dri/radeon/radeon_tile.c @@ -0,0 +1,512 @@ +/* + * Copyright (C) 2010 Maciej Cencora <m.cencora@gmail.com> + * + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +#include "radeon_tile.h" + +#include <stdint.h> +#include <string.h> + +#include "main/macros.h" +#include "radeon_debug.h" + +#define MICRO_TILE_SIZE 32 + +static void micro_tile_8_x_4_8bit(const void * const src, unsigned src_pitch, +                                  void * const dst, unsigned dst_pitch, +                                  unsigned width, unsigned height) +{ +    unsigned row; /* current source row */ +    unsigned col; /* current source column */ +    unsigned k; /* number of processed tiles */ +    const unsigned tile_width = 8, tile_height = 4; +    const unsigned tiles_in_row = (width + (tile_width - 1)) / tile_width; + +    k = 0; +    for (row = 0; row < height; row += tile_height) +    { +        for (col = 0; col < width; col += tile_width, ++k) +        { +            uint8_t *src2 = (uint8_t *)src + src_pitch * row + col; +            uint8_t *dst2 = (uint8_t *)dst + row * dst_pitch + +                             (k % tiles_in_row) * MICRO_TILE_SIZE / sizeof(uint8_t); +            unsigned j; + +            for (j = 0; j < MIN2(tile_height, height - row); ++j) +            { +                unsigned columns = MIN2(tile_width, width - col); +                memcpy(dst2, src2, columns * sizeof(uint8_t)); +                dst2 += tile_width; +                src2 += src_pitch; +            } +        } +    } +} + +static void micro_tile_4_x_4_16bit(const void * const src, unsigned src_pitch, +                                   void * const dst, unsigned dst_pitch, +                                   unsigned width, unsigned height) +{ +    unsigned row; /* current source row */ +    unsigned col; /* current source column */ +    unsigned k; /* number of processed tiles */ +    const unsigned tile_width = 4, tile_height = 4; +    const unsigned tiles_in_row = (width + (tile_width - 1)) / tile_width; + +    k = 0; +    for (row = 0; row < height; row += tile_height) +    { +        for (col = 0; col < width; col += tile_width, ++k) +        { +            uint16_t *src2 = (uint16_t *)src + src_pitch * row + col; +            uint16_t *dst2 = (uint16_t *)dst + row * dst_pitch + +                             (k % tiles_in_row) * MICRO_TILE_SIZE / sizeof(uint16_t); +            unsigned j; + +            for (j = 0; j < MIN2(tile_height, height - row); ++j) +            { +                unsigned columns = MIN2(tile_width, width - col); +                memcpy(dst2, src2, columns * sizeof(uint16_t)); +                dst2 += tile_width; +                src2 += src_pitch; +            } +        } +    } +} + +static void micro_tile_8_x_2_16bit(const void * const src, unsigned src_pitch, +                                   void * const dst, unsigned dst_pitch, +                                   unsigned width, unsigned height) +{ +    unsigned row; /* current source row */ +    unsigned col; /* current source column */ +    unsigned k; /* number of processed tiles */ +    const unsigned tile_width = 8, tile_height = 2; +    const unsigned tiles_in_row = (width + (tile_width - 1)) / tile_width; + +    k = 0; +    for (row = 0; row < height; row += tile_height) +    { +        for (col = 0; col < width; col += tile_width, ++k) +        { +            uint16_t *src2 = (uint16_t *)src + src_pitch * row + col; +            uint16_t *dst2 = (uint16_t *)dst + row * dst_pitch + +                             (k % tiles_in_row) * MICRO_TILE_SIZE / sizeof(uint16_t); +            unsigned j; + +            for (j = 0; j < MIN2(tile_height, height - row); ++j) +            { +                unsigned columns = MIN2(tile_width, width - col); +                memcpy(dst2, src2, columns * sizeof(uint16_t)); +                dst2 += tile_width; +                src2 += src_pitch; +            } +        } +    } +} + +static void micro_tile_4_x_2_32bit(const void * const src, unsigned src_pitch, +                                   void * const dst, unsigned dst_pitch, +                                   unsigned width, unsigned height) +{ +    unsigned row; /* current source row */ +    unsigned col; /* current source column */ +    unsigned k; /* number of processed tiles */ +    const unsigned tile_width = 4, tile_height = 2; +    const unsigned tiles_in_row = (width + (tile_width - 1)) / tile_width; + +    k = 0; +    for (row = 0; row < height; row += tile_height) +    { +        for (col = 0; col < width; col += tile_width, ++k) +        { +            uint32_t *src2 = (uint32_t *)src + src_pitch * row + col; +            uint32_t *dst2 = (uint32_t *)dst + row * dst_pitch + +                             (k % tiles_in_row) * MICRO_TILE_SIZE / sizeof(uint32_t); +            unsigned j; + +            for (j = 0; j < MIN2(tile_height, height - row); ++j) +            { +                unsigned columns = MIN2(tile_width, width - col); +                memcpy(dst2, src2, columns * sizeof(uint32_t)); +                dst2 += tile_width; +                src2 += src_pitch; +            } +        } +    } +} + +static void micro_tile_2_x_2_64bit(const void * const src, unsigned src_pitch, +                                   void * const dst, unsigned dst_pitch, +                                   unsigned width, unsigned height) +{ +    unsigned row; /* current source row */ +    unsigned col; /* current source column */ +    unsigned k; /* number of processed tiles */ +    const unsigned tile_width = 2, tile_height = 2; +    const unsigned tiles_in_row = (width + (tile_width - 1)) / tile_width; + +    k = 0; +    for (row = 0; row < height; row += tile_height) +    { +        for (col = 0; col < width; col += tile_width, ++k) +        { +            uint64_t *src2 = (uint64_t *)src + src_pitch * row + col; +            uint64_t *dst2 = (uint64_t *)dst + row * dst_pitch + +                             (k % tiles_in_row) * MICRO_TILE_SIZE / sizeof(uint64_t); +            unsigned j; + +            for (j = 0; j < MIN2(tile_height, height - row); ++j) +            { +                unsigned columns = MIN2(tile_width, width - col); +                memcpy(dst2, src2, columns * sizeof(uint64_t)); +                dst2 += tile_width; +                src2 += src_pitch; +            } +        } +    } +} + +static void micro_tile_1_x_1_128bit(const void * src, unsigned src_pitch, +                                    void * dst, unsigned dst_pitch, +                                    unsigned width, unsigned height) +{ +    unsigned i, j; +    const unsigned elem_size = 16; /* sizeof(uint128_t) */ + +    for (j = 0; j < height; ++j) +    { +        for (i = 0; i < width; ++i) +        { +            memcpy(dst, src, width * elem_size); +            dst += dst_pitch * elem_size; +            src += src_pitch * elem_size; +        } +    } +} + +void tile_image(const void * src, unsigned src_pitch, +                void *dst, unsigned dst_pitch, +                gl_format format, unsigned width, unsigned height) +{ +    assert(src_pitch >= width); +    assert(dst_pitch >= width); + +    radeon_print(RADEON_TEXTURE, RADEON_TRACE, +                 "Software tiling: src_pitch %d, dst_pitch %d, width %d, height %d, bpp %d\n", +                 src_pitch, dst_pitch, width, height, _mesa_get_format_bytes(format)); + +    switch (_mesa_get_format_bytes(format)) +    { +        case 16: +            micro_tile_1_x_1_128bit(src, src_pitch, dst, dst_pitch, width, height); +            break; +        case 8: +            micro_tile_2_x_2_64bit(src, src_pitch, dst, dst_pitch, width, height); +            break; +        case 4: +            micro_tile_4_x_2_32bit(src, src_pitch, dst, dst_pitch, width, height); +            break; +        case 2: +            if (_mesa_get_format_bits(format, GL_DEPTH_BITS)) +            { +                micro_tile_4_x_4_16bit(src, src_pitch, dst, dst_pitch, width, height); +            } +            else +            { +                micro_tile_8_x_2_16bit(src, src_pitch, dst, dst_pitch, width, height); +            } +            break; +        case 1: +            micro_tile_8_x_4_8bit(src, src_pitch, dst, dst_pitch, width, height); +            break; +        default: +            assert(0); +            break; +    } +} + +static void micro_untile_8_x_4_8bit(const void * const src, unsigned src_pitch, +                                    void * const dst, unsigned dst_pitch, +                                    unsigned width, unsigned height) +{ +    unsigned row; /* current destination row */ +    unsigned col; /* current destination column */ +    unsigned k; /* current tile number */ +    const unsigned tile_width = 8, tile_height = 4; +    const unsigned tiles_in_row = (width + (tile_width - 1)) / tile_width; + +    assert(src_pitch % tile_width == 0); + +    k = 0; +    for (row = 0; row < height; row += tile_height) +    { +        for (col = 0; col < width; col += tile_width, ++k) +        { +            uint8_t *src2 = (uint8_t *)src + row * src_pitch + +                             (k % tiles_in_row) * MICRO_TILE_SIZE / sizeof(uint8_t); +            uint8_t *dst2 = (uint8_t *)dst + dst_pitch * row + col; +            unsigned j; + +            for (j = 0; j < MIN2(tile_height, height - row); ++j) +            { +                unsigned columns = MIN2(tile_width, width - col); +                memcpy(dst2, src2, columns * sizeof(uint8_t)); +                dst2 += dst_pitch; +                src2 += tile_width; +            } +        } +    } +} + +static void micro_untile_8_x_2_16bit(const void * const src, unsigned src_pitch, +                                     void * const dst, unsigned dst_pitch, +                                     unsigned width, unsigned height) +{ +    unsigned row; /* current destination row */ +    unsigned col; /* current destination column */ +    unsigned k; /* current tile number */ +    const unsigned tile_width = 8, tile_height = 2; +    const unsigned tiles_in_row = (width + (tile_width - 1)) / tile_width; + +    assert(src_pitch % tile_width == 0); + +    k = 0; +    for (row = 0; row < height; row += tile_height) +    { +        for (col = 0; col < width; col += tile_width, ++k) +        { +            uint16_t *src2 = (uint16_t *)src + row * src_pitch + +                             (k % tiles_in_row) * MICRO_TILE_SIZE / sizeof(uint16_t); +            uint16_t *dst2 = (uint16_t *)dst + dst_pitch * row + col; +            unsigned j; + +            for (j = 0; j < MIN2(tile_height, height - row); ++j) +            { +                unsigned columns = MIN2(tile_width, width - col); +                memcpy(dst2, src2, columns * sizeof(uint16_t)); +                dst2 += dst_pitch; +                src2 += tile_width; +            } +        } +    } +} + +static void micro_untile_4_x_4_16bit(const void * const src, unsigned src_pitch, +                                     void * const dst, unsigned dst_pitch, +                                     unsigned width, unsigned height) +{ +    unsigned row; /* current destination row */ +    unsigned col; /* current destination column */ +    unsigned k; /* current tile number */ +    const unsigned tile_width = 4, tile_height = 4; +    const unsigned tiles_in_row = (width + (tile_width - 1)) / tile_width; + +    assert(src_pitch % tile_width == 0); + +    k = 0; +    for (row = 0; row < height; row += tile_height) +    { +        for (col = 0; col < width; col += tile_width, ++k) +        { +            uint16_t *src2 = (uint16_t *)src + row * src_pitch + +                             (k % tiles_in_row) * MICRO_TILE_SIZE / sizeof(uint16_t); +            uint16_t *dst2 = (uint16_t *)dst + dst_pitch * row + col; +            unsigned j; + +            for (j = 0; j < MIN2(tile_height, height - row); ++j) +            { +                unsigned columns = MIN2(tile_width, width - col); +                memcpy(dst2, src2, columns * sizeof(uint16_t)); +                dst2 += dst_pitch; +                src2 += tile_width; +            } +        } +    } +} + +static void micro_untile_4_x_2_32bit(const void * const src, unsigned src_pitch, +                                     void * const dst, unsigned dst_pitch, +                                     unsigned width, unsigned height) +{ +    unsigned row; /* current destination row */ +    unsigned col; /* current destination column */ +    unsigned k; /* current tile number */ +    const unsigned tile_width = 4, tile_height = 2; +    const unsigned tiles_in_row = (width + (tile_width - 1)) / tile_width; + +    assert(src_pitch % tile_width == 0); + +    k = 0; +    for (row = 0; row < height; row += tile_height) +    { +        for (col = 0; col < width; col += tile_width, ++k) +        { +            uint32_t *src2 = (uint32_t *)src + row * src_pitch + +                             (k % tiles_in_row) * MICRO_TILE_SIZE / sizeof(uint32_t); +            uint32_t *dst2 = (uint32_t *)dst + dst_pitch * row + col; +            unsigned j; + +            for (j = 0; j < MIN2(tile_height, height - row); ++j) +            { +                unsigned columns = MIN2(tile_width, width - col); +                memcpy(dst2, src2, columns * sizeof(uint32_t)); +                dst2 += dst_pitch; +                src2 += tile_width; +            } +        } +    } +} + +static void micro_untile_2_x_2_64bit(const void * const src, unsigned src_pitch, +                                     void * const dst, unsigned dst_pitch, +                                     unsigned width, unsigned height) +{ +    unsigned row; /* current destination row */ +    unsigned col; /* current destination column */ +    unsigned k; /* current tile number */ +    const unsigned tile_width = 2, tile_height = 2; +    const unsigned tiles_in_row = (width + (tile_width - 1)) / tile_width; + +    assert(src_pitch % tile_width == 0); + +    k = 0; +    for (row = 0; row < height; row += tile_height) +    { +        for (col = 0; col < width; col += tile_width, ++k) +        { +            uint64_t *src2 = (uint64_t *)src + row * src_pitch + +                             (k % tiles_in_row) * MICRO_TILE_SIZE / sizeof(uint64_t); +            uint64_t *dst2 = (uint64_t *)dst + dst_pitch * row + col; +            unsigned j; + +            for (j = 0; j < MIN2(tile_height, height - row); ++j) +            { +                unsigned columns = MIN2(tile_width, width - col); +                memcpy(dst2, src2, columns * sizeof(uint64_t)); +                dst2 += dst_pitch; +                src2 += tile_width; +            } +        } +    } +} + +static void micro_untile_1_x_1_128bit(const void * src, unsigned src_pitch, +                                      void * dst, unsigned dst_pitch, +                                      unsigned width, unsigned height) +{ +    unsigned i, j; +    const unsigned elem_size = 16; /* sizeof(uint128_t) */ + +    for (j = 0; j < height; ++j) +    { +        for (i = 0; i < width; ++i) +        { +            memcpy(dst, src, width * elem_size); +            dst += dst_pitch * elem_size; +            src += src_pitch * elem_size; +        } +    } +} + +void untile_image(const void * src, unsigned src_pitch, +                  void *dst, unsigned dst_pitch, +                  gl_format format, unsigned width, unsigned height) +{ +    assert(src_pitch >= width); +    assert(dst_pitch >= width); + +    radeon_print(RADEON_TEXTURE, RADEON_TRACE, +                 "Software untiling: src_pitch %d, dst_pitch %d, width %d, height %d, bpp %d\n", +                 src_pitch, dst_pitch, width, height, _mesa_get_format_bytes(format)); + +    switch (_mesa_get_format_bytes(format)) +    { +        case 16: +            micro_untile_1_x_1_128bit(src, src_pitch, dst, dst_pitch, width, height); +            break; +        case 8: +            micro_untile_2_x_2_64bit(src, src_pitch, dst, dst_pitch, width, height); +            break; +        case 4: +            micro_untile_4_x_2_32bit(src, src_pitch, dst, dst_pitch, width, height); +            break; +        case 2: +            if (_mesa_get_format_bits(format, GL_DEPTH_BITS)) +            { +                micro_untile_4_x_4_16bit(src, src_pitch, dst, dst_pitch, width, height); +            } +            else +            { +                micro_untile_8_x_2_16bit(src, src_pitch, dst, dst_pitch, width, height); +            } +            break; +        case 1: +            micro_untile_8_x_4_8bit(src, src_pitch, dst, dst_pitch, width, height); +            break; +        default: +            assert(0); +            break; +    } +} + +void get_tile_size(gl_format format, unsigned *block_width, unsigned *block_height) +{ +    switch (_mesa_get_format_bytes(format)) +    { +        case 16: +            *block_width = 1; +            *block_height = 1; +            break; +        case 8: +            *block_width = 2; +            *block_height = 2; +            break; +        case 4: +            *block_width = 4; +            *block_height = 2; +            break; +        case 2: +            if (_mesa_get_format_bits(format, GL_DEPTH_BITS)) +            { +                *block_width = 4; +                *block_height = 4; +            } +            else +            { +                *block_width = 8; +                *block_height = 2; +            } +            break; +        case 1: +            *block_width = 8; +            *block_height = 4; +            break; +        default: +            assert(0); +            break; +    } +} diff --git a/src/mesa/drivers/dri/radeon/radeon_tile.h b/src/mesa/drivers/dri/radeon/radeon_tile.h new file mode 100644 index 0000000000..31d9c5611c --- /dev/null +++ b/src/mesa/drivers/dri/radeon/radeon_tile.h @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2010 Maciej Cencora <m.cencora@gmail.com> + * + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +#include <main/formats.h> + +void tile_image(const void * src, unsigned src_pitch, +                void *dst, unsigned dst_pitch, +                gl_format format, unsigned width, unsigned height); + +void untile_image(const void * src, unsigned src_pitch, +                  void *dst, unsigned dst_pitch, +                  gl_format format, unsigned width, unsigned height); + +void get_tile_size(gl_format format, unsigned *block_width, unsigned *block_height); diff --git a/src/mesa/drivers/dri/radeon/server/radeon_dri.c b/src/mesa/drivers/dri/radeon/server/radeon_dri.c deleted file mode 100644 index 7ead588dac..0000000000 --- a/src/mesa/drivers/dri/radeon/server/radeon_dri.c +++ /dev/null @@ -1,1337 +0,0 @@ -/** - * \file server/radeon_dri.c - * \brief File to perform the device-specific initialization tasks typically - * done in the X server. - * - * Here they are converted to run in the client (or perhaps a standalone - * process), and to work with the frame buffer device rather than the X - * server infrastructure. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <errno.h> -#include <unistd.h> - -#include "driver.h" -#include "drm.h" -#include "memops.h" - -#include "radeon.h" -#include "radeon_dri.h" -#include "radeon_macros.h" -#include "radeon_reg.h" -#include "drm_sarea.h" - -static size_t radeon_drm_page_size; - -static int RadeonSetParam(const DRIDriverContext *ctx, int param, int value) -{ -   drm_radeon_setparam_t sp; - -   memset(&sp, 0, sizeof(sp)); -   sp.param = param; -   sp.value = value; - -   if (drmCommandWrite(ctx->drmFD, DRM_RADEON_SETPARAM, &sp, sizeof(sp))) { -     return -1; -   } - -   return 0; -} - -/** - * \brief Wait for free FIFO entries. - * - * \param ctx display handle. - * \param entries number of free entries to wait. - * - * It polls the free entries from the chip until it reaches the requested value - * or a timeout (3000 tries) occurs. Aborts the program if the FIFO times out. - */ -static void RADEONWaitForFifo( const DRIDriverContext *ctx, -			       int entries ) -{ -   unsigned char *RADEONMMIO = ctx->MMIOAddress; -   int i; - -   for (i = 0; i < 3000; i++) { -      int fifo_slots = -	 INREG(RADEON_RBBM_STATUS) & RADEON_RBBM_FIFOCNT_MASK; -      if (fifo_slots >= entries) return; -   } - -   /* There are recoveries possible, but I haven't seen them work -    * in practice: -    */ -   fprintf(stderr, "FIFO timed out: %d entries, stat=0x%08x\n", -	   INREG(RADEON_RBBM_STATUS) & RADEON_RBBM_FIFOCNT_MASK, -	   INREG(RADEON_RBBM_STATUS)); -   exit(1); -} - -/** - * \brief Read a PLL register. - * - * \param ctx display handle. - * \param addr PLL register index. - * - * \return value of the PLL register. - */ -static unsigned int RADEONINPLL( const DRIDriverContext *ctx, int addr) -{ -    unsigned char *RADEONMMIO = ctx->MMIOAddress; -    unsigned int data; - -    OUTREG8(RADEON_CLOCK_CNTL_INDEX, addr & 0x3f); -    data = INREG(RADEON_CLOCK_CNTL_DATA); - -    return data; -} - -/** - * \brief Reset graphics card to known state. - * - * \param ctx display handle. - * - * Resets the values of several Radeon registers. - */ -static void RADEONEngineReset( const DRIDriverContext *ctx ) -{ -   unsigned char *RADEONMMIO = ctx->MMIOAddress; -   unsigned int clock_cntl_index; -   unsigned int mclk_cntl; -   unsigned int rbbm_soft_reset; -   unsigned int host_path_cntl; -   int i; - -   OUTREGP(RADEON_RB2D_DSTCACHE_CTLSTAT, -	   RADEON_RB2D_DC_FLUSH_ALL, -	   ~RADEON_RB2D_DC_FLUSH_ALL); -   for (i = 0; i < 512; i++) { -      if (!(INREG(RADEON_RB2D_DSTCACHE_CTLSTAT) & RADEON_RB2D_DC_BUSY)) -	 break; -   } - -   clock_cntl_index = INREG(RADEON_CLOCK_CNTL_INDEX); - -   mclk_cntl = INPLL(ctx, RADEON_MCLK_CNTL); -   OUTPLL(RADEON_MCLK_CNTL, (mclk_cntl | -			     RADEON_FORCEON_MCLKA | -			     RADEON_FORCEON_MCLKB | -			     RADEON_FORCEON_YCLKA | -			     RADEON_FORCEON_YCLKB | -			     RADEON_FORCEON_MC | -			     RADEON_FORCEON_AIC)); - -   /* Soft resetting HDP thru RBBM_SOFT_RESET register can cause some -    * unexpected behaviour on some machines.  Here we use -    * RADEON_HOST_PATH_CNTL to reset it. -    */ -   host_path_cntl = INREG(RADEON_HOST_PATH_CNTL); -   rbbm_soft_reset = INREG(RADEON_RBBM_SOFT_RESET); - -   OUTREG(RADEON_RBBM_SOFT_RESET, (rbbm_soft_reset | -				   RADEON_SOFT_RESET_CP | -				   RADEON_SOFT_RESET_HI | -				   RADEON_SOFT_RESET_SE | -				   RADEON_SOFT_RESET_RE | -				   RADEON_SOFT_RESET_PP | -				   RADEON_SOFT_RESET_E2 | -				   RADEON_SOFT_RESET_RB)); -   INREG(RADEON_RBBM_SOFT_RESET); -   OUTREG(RADEON_RBBM_SOFT_RESET, (rbbm_soft_reset &  -				   (unsigned int) ~(RADEON_SOFT_RESET_CP | -						    RADEON_SOFT_RESET_HI | -						    RADEON_SOFT_RESET_SE | -						    RADEON_SOFT_RESET_RE | -						    RADEON_SOFT_RESET_PP | -						    RADEON_SOFT_RESET_E2 | -						    RADEON_SOFT_RESET_RB))); -   INREG(RADEON_RBBM_SOFT_RESET); - -   OUTREG(RADEON_HOST_PATH_CNTL, host_path_cntl | RADEON_HDP_SOFT_RESET); -   INREG(RADEON_HOST_PATH_CNTL); -   OUTREG(RADEON_HOST_PATH_CNTL, host_path_cntl); - -   OUTREG(RADEON_RBBM_SOFT_RESET, rbbm_soft_reset); - -   OUTREG(RADEON_CLOCK_CNTL_INDEX, clock_cntl_index); -   OUTPLL(RADEON_MCLK_CNTL, mclk_cntl); -} - -/** - * \brief Restore the drawing engine. - * - * \param ctx display handle - * - * Resets the graphics card and sets initial values for several registers of - * the card's drawing engine. - * - * Turns on the radeon command processor engine (i.e., the ringbuffer). - */ -static int RADEONEngineRestore( const DRIDriverContext *ctx ) -{ -   RADEONInfoPtr info = ctx->driverPrivate; -   unsigned char *RADEONMMIO = ctx->MMIOAddress; -   int pitch64, datatype, dp_gui_master_cntl, err; - -   fprintf(stderr, "%s\n", __FUNCTION__); - -   OUTREG(RADEON_RB3D_CNTL, 0); -   RADEONEngineReset( ctx ); - -   switch (ctx->bpp) { -   case 16: datatype = 4; break; -   case 32: datatype = 6; break; -   default: return 0; -   } - -   dp_gui_master_cntl = -      ((datatype << RADEON_GMC_DST_DATATYPE_SHIFT) -       | RADEON_GMC_CLR_CMP_CNTL_DIS); - -   pitch64 = ((ctx->shared.virtualWidth * (ctx->bpp / 8) + 0x3f)) >> 6; - -   RADEONWaitForFifo(ctx, 1); -   OUTREG(RADEON_DEFAULT_OFFSET, ((INREG(RADEON_DEFAULT_OFFSET) & 0xC0000000) -				  | (pitch64 << 22))); - -   RADEONWaitForFifo(ctx, 1); -   OUTREG(RADEON_SURFACE_CNTL, RADEON_SURF_TRANSLATION_DIS);  - -   RADEONWaitForFifo(ctx, 1); -   OUTREG(RADEON_DEFAULT_SC_BOTTOM_RIGHT, (RADEON_DEFAULT_SC_RIGHT_MAX -					   | RADEON_DEFAULT_SC_BOTTOM_MAX)); - -   RADEONWaitForFifo(ctx, 1); -   OUTREG(RADEON_DP_GUI_MASTER_CNTL, (dp_gui_master_cntl -				      | RADEON_GMC_BRUSH_SOLID_COLOR -				      | RADEON_GMC_SRC_DATATYPE_COLOR)); - -   RADEONWaitForFifo(ctx, 7); -   OUTREG(RADEON_DST_LINE_START,    0); -   OUTREG(RADEON_DST_LINE_END,      0); -   OUTREG(RADEON_DP_BRUSH_FRGD_CLR, 0xffffffff); -   OUTREG(RADEON_DP_BRUSH_BKGD_CLR, 0); -   OUTREG(RADEON_DP_SRC_FRGD_CLR,   0xffffffff); -   OUTREG(RADEON_DP_SRC_BKGD_CLR,   0); -   OUTREG(RADEON_DP_WRITE_MASK,     0xffffffff); -   OUTREG(RADEON_AUX_SC_CNTL,       0); - -/*    RADEONWaitForIdleMMIO(ctx); */ -   usleep(100);  - - -   OUTREG(RADEON_GEN_INT_CNTL, info->gen_int_cntl); -   if (info->colorTiling) -	   info->crtc_offset_cntl |= RADEON_CRTC_TILE_EN; -   OUTREG(RADEON_CRTC_OFFSET_CNTL, info->crtc_offset_cntl); - -   /* Initialize and start the CP if required */ -   if ((err = drmCommandNone(ctx->drmFD, DRM_RADEON_CP_START)) != 0) { -      fprintf(stderr, "%s: CP start %d\n", __FUNCTION__, err); -      return 0; -   } - -   return 1; -} - - -/** - * \brief Shutdown the drawing engine. - * - * \param ctx display handle - * - * Turns off the command processor engine & restores the graphics card - * to a state that fbdev understands. - */ -static int RADEONEngineShutdown( const DRIDriverContext *ctx ) -{ -   drm_radeon_cp_stop_t  stop; -   int              ret, i; - -   stop.flush = 1; -   stop.idle  = 1; - -   ret = drmCommandWrite(ctx->drmFD, DRM_RADEON_CP_STOP, &stop,  -			 sizeof(drm_radeon_cp_stop_t)); - -   if (ret == 0) { -      return 0; -   } else if (errno != EBUSY) { -      return -errno; -   } - -   stop.flush = 0; -  -   i = 0; -   do { -      ret = drmCommandWrite(ctx->drmFD, DRM_RADEON_CP_STOP, &stop,  -			    sizeof(drm_radeon_cp_stop_t)); -   } while (ret && errno == EBUSY && i++ < 10); - -   if (ret == 0) { -      return 0; -   } else if (errno != EBUSY) { -      return -errno; -   } - -   stop.idle = 0; - -   if (drmCommandWrite(ctx->drmFD, DRM_RADEON_CP_STOP, -		       &stop, sizeof(drm_radeon_cp_stop_t))) { -      return -errno; -   } else { -      return 0; -   } -} - -/** - * \brief Compute base 2 logarithm. - * - * \param val value. - *  - * \return base 2 logarithm of \p val. - */ -static int RADEONMinBits(int val) -{ -   int  bits; - -   if (!val) return 1; -   for (bits = 0; val; val >>= 1, ++bits); -   return bits; -} - -/** - * \brief Initialize the AGP state - * - * \param ctx display handle. - * \param info driver private data. - * - * \return one on success, or zero on failure. - *  - * Acquires and enables the AGP device. Reserves memory in the AGP space for - * the ring buffer, vertex buffers and textures. Initialize the Radeon - * registers to point to that memory and add client mappings. - */ -static int RADEONDRIAgpInit( const DRIDriverContext *ctx, RADEONInfoPtr info) -{ -   unsigned char *RADEONMMIO = ctx->MMIOAddress; -   unsigned long  mode; -   int            ret; -   int            s, l; - -   if (drmAgpAcquire(ctx->drmFD) < 0) { -      fprintf(stderr, "[gart] AGP not available\n"); -      return 0; -   } -     -   /* Modify the mode if the default mode is not appropriate for this -    * particular combination of graphics card and AGP chipset. -    */ -   mode   = drmAgpGetMode(ctx->drmFD);	/* Default mode */ - -   /* Disable fast write entirely - too many lockups. -    */ -   mode &= ~RADEON_AGP_MODE_MASK; -   switch (ctx->agpmode) { -   case 4:          mode |= RADEON_AGP_4X_MODE; -   case 2:          mode |= RADEON_AGP_2X_MODE; -   case 1: default: mode |= RADEON_AGP_1X_MODE; -   } - -   if (drmAgpEnable(ctx->drmFD, mode) < 0) { -      fprintf(stderr, "[gart] AGP not enabled\n"); -      drmAgpRelease(ctx->drmFD); -      return 0; -   } -   else -     fprintf(stderr, "[gart] AGP enabled at %dx\n", ctx->agpmode); - -   /* Workaround for some hardware bugs */ -   if (info->ChipFamily < CHIP_FAMILY_R200) -      OUTREG(RADEON_AGP_CNTL, INREG(RADEON_AGP_CNTL) | 0x000e0000); - -   info->gartOffset = 0; - -   if ((ret = drmAgpAlloc(ctx->drmFD, info->gartSize*1024*1024, 0, NULL, -			  &info->gartMemHandle)) < 0) { -      fprintf(stderr, "[gart] Out of memory (%d)\n", ret); -      drmAgpRelease(ctx->drmFD); -      return 0; -   } -   fprintf(stderr, -	   "[gart] %d kB allocated with handle 0x%08x\n", -	   info->gartSize*1024, (unsigned)info->gartMemHandle); -     -   if (drmAgpBind(ctx->drmFD, -		  info->gartMemHandle, info->gartOffset) < 0) { -      fprintf(stderr, "[gart] Could not bind\n"); -      drmAgpFree(ctx->drmFD, info->gartMemHandle); -      drmAgpRelease(ctx->drmFD); -      return 0; -   } - -   /* Initialize the CP ring buffer data */ -   info->ringStart       = info->gartOffset; -   info->ringMapSize     = info->ringSize*1024*1024 + radeon_drm_page_size; - -   info->ringReadOffset  = info->ringStart + info->ringMapSize; -   info->ringReadMapSize = radeon_drm_page_size; - -   /* Reserve space for vertex/indirect buffers */ -   info->bufStart        = info->ringReadOffset + info->ringReadMapSize; -   info->bufMapSize      = info->bufSize*1024*1024; - -   /* Reserve the rest for AGP textures */ -   info->gartTexStart     = info->bufStart + info->bufMapSize; -   s = (info->gartSize*1024*1024 - info->gartTexStart); -   l = RADEONMinBits((s-1) / RADEON_NR_TEX_REGIONS); -   if (l < RADEON_LOG_TEX_GRANULARITY) l = RADEON_LOG_TEX_GRANULARITY; -   info->gartTexMapSize   = (s >> l) << l; -   info->log2GARTTexGran  = l; - -   if (drmAddMap(ctx->drmFD, info->ringStart, info->ringMapSize, -		 DRM_AGP, DRM_READ_ONLY, &info->ringHandle) < 0) { -      fprintf(stderr, "[gart] Could not add ring mapping\n"); -      return 0; -   } -   fprintf(stderr, "[gart] ring handle = 0x%08x\n", info->ringHandle); -     - -   if (drmAddMap(ctx->drmFD, info->ringReadOffset, info->ringReadMapSize, -		 DRM_AGP, DRM_READ_ONLY, &info->ringReadPtrHandle) < 0) { -      fprintf(stderr, -	      "[gart] Could not add ring read ptr mapping\n"); -      return 0; -   } -     -   fprintf(stderr, - 	   "[gart] ring read ptr handle = 0x%08lx\n", -	   info->ringReadPtrHandle); -     -   if (drmAddMap(ctx->drmFD, info->bufStart, info->bufMapSize, -		 DRM_AGP, 0, &info->bufHandle) < 0) { -      fprintf(stderr, -	      "[gart] Could not add vertex/indirect buffers mapping\n"); -      return 0; -   } -   fprintf(stderr, - 	   "[gart] vertex/indirect buffers handle = 0x%08x\n", -	   info->bufHandle); - -   if (drmAddMap(ctx->drmFD, info->gartTexStart, info->gartTexMapSize, -		 DRM_AGP, 0, &info->gartTexHandle) < 0) { -      fprintf(stderr, -	      "[gart] Could not add AGP texture map mapping\n"); -      return 0; -   } -   fprintf(stderr, - 	   "[gart] AGP texture map handle = 0x%08lx\n", -	   info->gartTexHandle); - -   /* Initialize Radeon's AGP registers */ -   /* Ring buffer is at AGP offset 0 */ -   OUTREG(RADEON_AGP_BASE, info->ringHandle); - -   return 1; -} - -/* Initialize the PCI GART state.  Request memory for use in PCI space, - * and initialize the Radeon registers to point to that memory. - */ -static int RADEONDRIPciInit(const DRIDriverContext *ctx, RADEONInfoPtr info) -{ -    int  ret; -    int  flags = DRM_READ_ONLY | DRM_LOCKED | DRM_KERNEL; -    int            s, l; - -    ret = drmScatterGatherAlloc(ctx->drmFD, info->gartSize*1024*1024, -				&info->gartMemHandle); -    if (ret < 0) { -	fprintf(stderr, "[pci] Out of memory (%d)\n", ret); -	return 0; -    } -    fprintf(stderr, -	       "[pci] %d kB allocated with handle 0x%08lx\n", -	       info->gartSize*1024, info->gartMemHandle); - -   info->gartOffset = 0; -    -   /* Initialize the CP ring buffer data */ -   info->ringStart       = info->gartOffset; -   info->ringMapSize     = info->ringSize*1024*1024 + radeon_drm_page_size; - -   info->ringReadOffset  = info->ringStart + info->ringMapSize; -   info->ringReadMapSize = radeon_drm_page_size; - -   /* Reserve space for vertex/indirect buffers */ -   info->bufStart        = info->ringReadOffset + info->ringReadMapSize; -   info->bufMapSize      = info->bufSize*1024*1024; - -   /* Reserve the rest for AGP textures */ -   info->gartTexStart     = info->bufStart + info->bufMapSize; -   s = (info->gartSize*1024*1024 - info->gartTexStart); -   l = RADEONMinBits((s-1) / RADEON_NR_TEX_REGIONS); -   if (l < RADEON_LOG_TEX_GRANULARITY) l = RADEON_LOG_TEX_GRANULARITY; -   info->gartTexMapSize   = (s >> l) << l; -   info->log2GARTTexGran  = l; - -    if (drmAddMap(ctx->drmFD, info->ringStart, info->ringMapSize, -		  DRM_SCATTER_GATHER, flags, &info->ringHandle) < 0) { -	fprintf(stderr, -		   "[pci] Could not add ring mapping\n"); -	return 0; -    } -    fprintf(stderr, -	       "[pci] ring handle = 0x%08x\n", info->ringHandle); - -    if (drmAddMap(ctx->drmFD, info->ringReadOffset, info->ringReadMapSize, -		  DRM_SCATTER_GATHER, flags, &info->ringReadPtrHandle) < 0) { -	fprintf(stderr, -		   "[pci] Could not add ring read ptr mapping\n"); -	return 0; -    } -    fprintf(stderr, - 	       "[pci] ring read ptr handle = 0x%08lx\n", -	       info->ringReadPtrHandle); - -    if (drmAddMap(ctx->drmFD, info->bufStart, info->bufMapSize, -		  DRM_SCATTER_GATHER, 0, &info->bufHandle) < 0) { -	fprintf(stderr, -		   "[pci] Could not add vertex/indirect buffers mapping\n"); -	return 0; -    } -    fprintf(stderr, - 	       "[pci] vertex/indirect buffers handle = 0x%08lx\n", -	       info->bufHandle); - -    if (drmAddMap(ctx->drmFD, info->gartTexStart, info->gartTexMapSize, -		  DRM_SCATTER_GATHER, 0, &info->gartTexHandle) < 0) { -	fprintf(stderr, -		   "[pci] Could not add GART texture map mapping\n"); -	return 0; -    } -    fprintf(stderr, - 	       "[pci] GART texture map handle = 0x%08x\n", -	       info->gartTexHandle); - -    return 1; -} - - -/** - * \brief Initialize the kernel data structures and enable the CP engine. - * - * \param ctx display handle. - * \param info driver private data. - * - * \return non-zero on success, or zero on failure. - * - * This function is a wrapper around the DRM_RADEON_CP_INIT command, passing - * all the parameters in a drm_radeon_init_t structure. - */ -static int RADEONDRIKernelInit( const DRIDriverContext *ctx, -			       RADEONInfoPtr info) -{ -   int cpp = ctx->bpp / 8; -   drm_radeon_init_t  drmInfo; -   int ret; - -   memset(&drmInfo, 0, sizeof(drm_radeon_init_t)); - -   if ( (info->ChipFamily == CHIP_FAMILY_R200) || -	(info->ChipFamily == CHIP_FAMILY_RV250) || -	(info->ChipFamily == CHIP_FAMILY_M9) || -	(info->ChipFamily == CHIP_FAMILY_RV280) ) -      drmInfo.func             = RADEON_INIT_R200_CP; -   else -      drmInfo.func             = RADEON_INIT_CP; - -   /* This is the struct passed to the kernel module for its initialization */ -   drmInfo.sarea_priv_offset   = sizeof(drm_sarea_t); -   drmInfo.is_pci              = ctx->isPCI; -   drmInfo.cp_mode             = RADEON_DEFAULT_CP_BM_MODE; -   drmInfo.gart_size            = info->gartSize*1024*1024; -   drmInfo.ring_size           = info->ringSize*1024*1024; -   drmInfo.usec_timeout        = 1000; -   drmInfo.fb_bpp              = ctx->bpp; -   drmInfo.depth_bpp           = ctx->bpp; -   drmInfo.front_offset        = info->frontOffset; -   drmInfo.front_pitch         = info->frontPitch * cpp; -   drmInfo.back_offset         = info->backOffset; -   drmInfo.back_pitch          = info->backPitch * cpp; -   drmInfo.depth_offset        = info->depthOffset; -   drmInfo.depth_pitch         = info->depthPitch * cpp; -   drmInfo.fb_offset           = info->LinearAddr; -   drmInfo.mmio_offset         = info->registerHandle; -   drmInfo.ring_offset         = info->ringHandle; -   drmInfo.ring_rptr_offset    = info->ringReadPtrHandle; -   drmInfo.buffers_offset      = info->bufHandle; -   drmInfo.gart_textures_offset = info->gartTexHandle; - -   ret = drmCommandWrite(ctx->drmFD, DRM_RADEON_CP_INIT, &drmInfo,  -			 sizeof(drm_radeon_init_t)); - -   return ret >= 0; -} - - -/** - * \brief Initialize the AGP heap. - * - * \param ctx display handle. - * \param info driver private data. - * - * This function is a wrapper around the DRM_RADEON_INIT_HEAP command, passing - * all the parameters in a drm_radeon_mem_init_heap structure. - */ -static void RADEONDRIAgpHeapInit(const DRIDriverContext *ctx, -				 RADEONInfoPtr info) -{ -   drm_radeon_mem_init_heap_t drmHeap; - -   /* Start up the simple memory manager for gart space */ -   drmHeap.region = RADEON_MEM_REGION_GART; -   drmHeap.start  = 0; -   drmHeap.size   = info->gartTexMapSize; -     -   if (drmCommandWrite(ctx->drmFD, DRM_RADEON_INIT_HEAP, -		       &drmHeap, sizeof(drmHeap))) { -      fprintf(stderr, -	      "[drm] Failed to initialized gart heap manager\n"); -   } else { -      fprintf(stderr, -	      "[drm] Initialized kernel gart heap manager, %d\n", -	      info->gartTexMapSize); -   } -} - -/** - * \brief Add a map for the vertex buffers that will be accessed by any - * DRI-based clients. - *  - * \param ctx display handle. - * \param info driver private data. - * - * \return one on success, or zero on failure. - * - * Calls drmAddBufs() with the previously allocated vertex buffers. - */ -static int RADEONDRIBufInit( const DRIDriverContext *ctx, RADEONInfoPtr info ) -{ -   /* Initialize vertex buffers */ -   info->bufNumBufs = drmAddBufs(ctx->drmFD, -				 info->bufMapSize / RADEON_BUFFER_SIZE, -				 RADEON_BUFFER_SIZE, -				 ctx->isPCI ? DRM_SG_BUFFER : DRM_AGP_BUFFER, -				 info->bufStart); - -   if (info->bufNumBufs <= 0) { -      fprintf(stderr, -	      "[drm] Could not create vertex/indirect buffers list\n"); -      return 0; -   } -   fprintf(stderr, -	   "[drm] Added %d %d byte vertex/indirect buffers\n", -	   info->bufNumBufs, RADEON_BUFFER_SIZE); -    -   return 1; -} - -/** - * \brief Install an IRQ handler. - *  - * \param ctx display handle. - * \param info driver private data. - * - * Attempts to install an IRQ handler via drmCtlInstHandler(), falling back to - * IRQ-free operation on failure. - */ -static void RADEONDRIIrqInit(const DRIDriverContext *ctx, -			     RADEONInfoPtr info) -{ -   if (!info->irq) { -      info->irq = drmGetInterruptFromBusID(ctx->drmFD, -					   ctx->pciBus, -					   ctx->pciDevice, -					   ctx->pciFunc); - -      if ((drmCtlInstHandler(ctx->drmFD, info->irq)) != 0) { -	 fprintf(stderr, -		 "[drm] failure adding irq handler, " -		 "there is a device already using that irq\n" -		 "[drm] falling back to irq-free operation\n"); -	 info->irq = 0; -      } -   } - -   if (info->irq) -      fprintf(stderr, -	      "[drm] dma control initialized, using IRQ %d\n", -	      info->irq); -} - -static int RADEONCheckDRMVersion( const DRIDriverContext *ctx, -				  RADEONInfoPtr info ) -{ -   drmVersionPtr  version; - -   version = drmGetVersion(ctx->drmFD); -   if (version) { -      int req_minor, req_patch; - -      /* Need 1.8.x for proper cleanup-on-client-exit behaviour. -       */ -      req_minor = 8; -      req_patch = 0;	 - -      if (version->version_major != 1 || -	  version->version_minor < req_minor || -	  (version->version_minor == req_minor &&  -	   version->version_patchlevel < req_patch)) { -	 /* Incompatible drm version */ -	 fprintf(stderr, -		 "[dri] RADEONDRIScreenInit failed because of a version " -		 "mismatch.\n" -		 "[dri] radeon.o kernel module version is %d.%d.%d " -		 "but version 1.%d.%d or newer is needed.\n" -		 "[dri] Disabling DRI.\n", -		 version->version_major, -		 version->version_minor, -		 version->version_patchlevel, -		 req_minor, -		 req_patch); -	 drmFreeVersion(version); -	 return 0; -      } - -      info->drmMinor = version->version_minor; -      drmFreeVersion(version); -   } - -   return 1; -} - -static int RADEONMemoryInit( const DRIDriverContext *ctx, RADEONInfoPtr info ) -{ -   int        width_bytes = ctx->shared.virtualWidth * ctx->cpp; -   int        cpp         = ctx->cpp; -   int        bufferSize  = ((((ctx->shared.virtualHeight+15) & ~15) * width_bytes			     + RADEON_BUFFER_ALIGN) & ~RADEON_BUFFER_ALIGN); -   int        depthSize   = ((((ctx->shared.virtualHeight+15) & ~15) * width_bytes -			     + RADEON_BUFFER_ALIGN) & ~RADEON_BUFFER_ALIGN); -   int        l; - -   info->frontOffset = 0; -   info->frontPitch = ctx->shared.virtualWidth; - -   fprintf(stderr,  -	   "Using %d MB AGP aperture\n", info->gartSize); -   fprintf(stderr,  -	   "Using %d MB for the ring buffer\n", info->ringSize); -   fprintf(stderr,  -	   "Using %d MB for vertex/indirect buffers\n", info->bufSize); -   fprintf(stderr,  -	   "Using %d MB for AGP textures\n", info->gartTexSize); - -   /* Front, back and depth buffers - everything else texture?? -    */ -   info->textureSize = ctx->shared.fbSize - 2 * bufferSize - depthSize; - -   if (ctx->colorTiling==1) -   { -	info->textureSize = ctx->shared.fbSize - ((ctx->shared.fbSize - info->textureSize + width_bytes * 16 - 1) / (width_bytes * 16)) * (width_bytes*16); -   } - -   if (info->textureSize < 0)  -      return 0; - -   l = RADEONMinBits((info->textureSize-1) / RADEON_NR_TEX_REGIONS); -   if (l < RADEON_LOG_TEX_GRANULARITY) l = RADEON_LOG_TEX_GRANULARITY; - -   /* Round the texture size up to the nearest whole number of -    * texture regions.  Again, be greedy about this, don't -    * round down. -    */ -   info->log2TexGran = l; -   info->textureSize = (info->textureSize >> l) << l; - -   /* Set a minimum usable local texture heap size.  This will fit -    * two 256x256x32bpp textures. -    */ -   if (info->textureSize < 512 * 1024) { -      info->textureOffset = 0; -      info->textureSize = 0; -   } - -   /* Reserve space for textures */ -   if (ctx->colorTiling==1) -   { -      info->textureOffset = ((ctx->shared.fbSize - info->textureSize) /  -			(width_bytes * 16)) * (width_bytes*16); -   } -   else -   { -      info->textureOffset = ((ctx->shared.fbSize - info->textureSize + -   	 		   RADEON_BUFFER_ALIGN) & -			  ~RADEON_BUFFER_ALIGN); -   } -   /* Reserve space for the shared depth -    * buffer. -    */ -   info->depthOffset = ((info->textureOffset - depthSize + -			 RADEON_BUFFER_ALIGN) & -			~RADEON_BUFFER_ALIGN); -   info->depthPitch = ctx->shared.virtualWidth; - -   info->backOffset = ((info->depthOffset - bufferSize + -			RADEON_BUFFER_ALIGN) & -		       ~RADEON_BUFFER_ALIGN); -   info->backPitch = ctx->shared.virtualWidth; - - -   fprintf(stderr,  -	   "Will use back buffer at offset 0x%x\n", -	   info->backOffset); -   fprintf(stderr,  -	   "Will use depth buffer at offset 0x%x\n", -	   info->depthOffset); -   fprintf(stderr,  -	   "Will use %d kb for textures at offset 0x%x\n", -	   info->textureSize/1024, info->textureOffset); - -   info->frontPitchOffset = (((info->frontPitch * cpp / 64) << 22) | -			     (info->frontOffset >> 10)); - -   info->backPitchOffset = (((info->backPitch * cpp / 64) << 22) | -			    (info->backOffset >> 10)); - -   info->depthPitchOffset = (((info->depthPitch * cpp / 64) << 22) | -			     (info->depthOffset >> 10)); - -   return 1; -} - -static int RADEONColorTilingInit( const DRIDriverContext *ctx, RADEONInfoPtr info ) -{ -   int        width_bytes = ctx->shared.virtualWidth * ctx->cpp; -   int        bufferSize  = ((((ctx->shared.virtualHeight+15) & ~15) * width_bytes			     + RADEON_BUFFER_ALIGN) -			     & ~RADEON_BUFFER_ALIGN); -   /* Setup color tiling */ -   if (info->drmMinor<14) -      info->colorTiling=0; - -   if (info->colorTiling) -   { - -      int colorTilingFlag; -      drm_radeon_surface_alloc_t front,back; - -      RadeonSetParam(ctx, RADEON_SETPARAM_SWITCH_TILING, info->colorTiling ? 1 : 0); -       -      /* Setup the surfaces */ -      if (info->ChipFamily < CHIP_FAMILY_R200) -         colorTilingFlag=RADEON_SURF_TILE_COLOR_MACRO; -      else -         colorTilingFlag=R200_SURF_TILE_COLOR_MACRO; - -      front.address = info->frontOffset; -      front.size = bufferSize; -      front.flags = (width_bytes) | colorTilingFlag; -      drmCommandWrite(ctx->drmFD, DRM_RADEON_SURF_ALLOC, &front,sizeof(front));  -  -      back.address = info->backOffset; -      back.size = bufferSize; -      back.flags = (width_bytes) | colorTilingFlag; -      drmCommandWrite(ctx->drmFD, DRM_RADEON_SURF_ALLOC, &back,sizeof(back));  - -   } -   return 1; -}  - - - -/** - * Called at the start of each server generation. - * - * \param ctx display handle. - * \param info driver private data. - * - * \return non-zero on success, or zero on failure. - * - * Performs static frame buffer allocation. Opens the DRM device and add maps - * to the SAREA, framebuffer and MMIO regions. Fills in \p info with more - * information. Creates a \e server context to grab the lock for the - * initialization ioctls and calls the other initilization functions in this - * file. Starts the CP engine via the DRM_RADEON_CP_START command. - * - * Setups a RADEONDRIRec structure to be passed to radeon_dri.so for its - * initialization. - */ -static int RADEONScreenInit( DRIDriverContext *ctx, RADEONInfoPtr info ) -{ -   RADEONDRIPtr   pRADEONDRI; -   int err; - -   usleep(100); -   /*assert(!ctx->IsClient);*/ - -   { -      int  width_bytes = (ctx->shared.virtualWidth * ctx->cpp); -      int  maxy        = ctx->shared.fbSize / width_bytes; - - -      if (maxy <= ctx->shared.virtualHeight * 3) { -	 fprintf(stderr,  -		 "Static buffer allocation failed -- " -		 "need at least %d kB video memory (have %d kB)\n", -		 (ctx->shared.virtualWidth * ctx->shared.virtualHeight * -		  ctx->cpp * 3 + 1023) / 1024, -		 ctx->shared.fbSize / 1024); -	 return 0; -      }  -   } - - -   if (info->ChipFamily >= CHIP_FAMILY_R300) { -      fprintf(stderr,  -	      "Direct rendering not yet supported on " -	      "Radeon 9700 and newer cards\n"); -      return 0; -   } -    -   radeon_drm_page_size = getpagesize();    - -   info->registerSize = ctx->MMIOSize; -   ctx->shared.SAREASize = SAREA_MAX; - -   /* Note that drmOpen will try to load the kernel module, if needed. */ -   ctx->drmFD = drmOpen("radeon", NULL ); -   if (ctx->drmFD < 0) { -      fprintf(stderr, "[drm] drmOpen failed\n"); -      return 0; -   } - -   if ((err = drmSetBusid(ctx->drmFD, ctx->pciBusID)) < 0) { -      fprintf(stderr, "[drm] drmSetBusid failed (%d, %s), %s\n", -	      ctx->drmFD, ctx->pciBusID, strerror(-err)); -      return 0; -   } - -   if (drmAddMap( ctx->drmFD, -		  0, -		  ctx->shared.SAREASize, -		  DRM_SHM, -		  DRM_CONTAINS_LOCK, -		  &ctx->shared.hSAREA) < 0) -   { -      fprintf(stderr, "[drm] drmAddMap failed\n"); -      return 0; -   } -   fprintf(stderr, "[drm] added %d byte SAREA at 0x%08lx\n", -	   ctx->shared.SAREASize, ctx->shared.hSAREA); - -   if (drmMap( ctx->drmFD, -	       ctx->shared.hSAREA, -	       ctx->shared.SAREASize, -	       (drmAddressPtr)(&ctx->pSAREA)) < 0) -   { -      fprintf(stderr, "[drm] drmMap failed\n"); -      return 0; -   } -   memset(ctx->pSAREA, 0, ctx->shared.SAREASize); -   fprintf(stderr, "[drm] mapped SAREA 0x%08lx to %p, size %d\n", -	   ctx->shared.hSAREA, ctx->pSAREA, ctx->shared.SAREASize); -    -   /* Need to AddMap the framebuffer and mmio regions here: -    */ -   if (drmAddMap( ctx->drmFD, -		  (drm_handle_t)ctx->FBStart, -		  ctx->FBSize, -		  DRM_FRAME_BUFFER, -#ifndef _EMBEDDED -		  0, -#else -		  DRM_READ_ONLY, -#endif -		  &ctx->shared.hFrameBuffer) < 0) -   { -      fprintf(stderr, "[drm] drmAddMap framebuffer failed\n"); -      return 0; -   } - -   fprintf(stderr, "[drm] framebuffer handle = 0x%08lx\n", -	   ctx->shared.hFrameBuffer); - - - -   if (drmAddMap(ctx->drmFD,  -		 ctx->MMIOStart, -		 ctx->MMIOSize, -		 DRM_REGISTERS,  -		 DRM_READ_ONLY,  -		 &info->registerHandle) < 0) { -      fprintf(stderr, "[drm] drmAddMap mmio failed\n");	 -      return 0; -   } -   fprintf(stderr, -	   "[drm] register handle = 0x%08lx\n", info->registerHandle); - -   /* Check the radeon DRM version */ -   if (!RADEONCheckDRMVersion(ctx, info)) { -      return 0; -   } - -   if (ctx->isPCI) { -      /* Initialize PCI */ -      if (!RADEONDRIPciInit(ctx, info)) -         return 0; -   } -   else { -      /* Initialize AGP */ -      if (!RADEONDRIAgpInit(ctx, info)) -         return 0; -   } - -   /* Memory manager setup */ -   if (!RADEONMemoryInit(ctx, info)) { -      return 0; -   } - -   /* Create a 'server' context so we can grab the lock for -    * initialization ioctls. -    */ -   if ((err = drmCreateContext(ctx->drmFD, &ctx->serverContext)) != 0) { -      fprintf(stderr, "%s: drmCreateContext failed %d\n", __FUNCTION__, err); -      return 0; -   } - -   DRM_LOCK(ctx->drmFD, ctx->pSAREA, ctx->serverContext, 0);  - -   /* Initialize the kernel data structures */ -   if (!RADEONDRIKernelInit(ctx, info)) { -      fprintf(stderr, "RADEONDRIKernelInit failed\n"); -      DRM_UNLOCK(ctx->drmFD, ctx->pSAREA, ctx->serverContext); -      return 0; -   } - -   /* Initialize the vertex buffers list */ -   if (!RADEONDRIBufInit(ctx, info)) { -      fprintf(stderr, "RADEONDRIBufInit failed\n"); -      DRM_UNLOCK(ctx->drmFD, ctx->pSAREA, ctx->serverContext); -      return 0; -   } - -   RADEONColorTilingInit(ctx, info); - -   /* Initialize IRQ */ -   RADEONDRIIrqInit(ctx, info); - -   /* Initialize kernel gart memory manager */ -   RADEONDRIAgpHeapInit(ctx, info); - -   fprintf(stderr,"color tiling %sabled\n", info->colorTiling?"en":"dis"); -   fprintf(stderr,"page flipping %sabled\n", info->page_flip_enable?"en":"dis"); -   /* Initialize the SAREA private data structure */ -   { -      drm_radeon_sarea_t *pSAREAPriv; -      pSAREAPriv = (drm_radeon_sarea_t *)(((char*)ctx->pSAREA) +  -					sizeof(drm_sarea_t)); -      memset(pSAREAPriv, 0, sizeof(*pSAREAPriv)); -      pSAREAPriv->pfState = info->page_flip_enable; -   } - - -   /* Quick hack to clear the front & back buffers.  Could also use -    * the clear ioctl to do this, but would need to setup hw state -    * first. -    */ -   drimemsetio((char *)ctx->FBAddress + info->frontOffset, -	  0, -	  info->frontPitch * ctx->cpp * ctx->shared.virtualHeight ); - -   drimemsetio((char *)ctx->FBAddress + info->backOffset, -	  0, -	  info->backPitch * ctx->cpp * ctx->shared.virtualHeight ); - -   /* This is the struct passed to radeon_dri.so for its initialization */ -   ctx->driverClientMsg = malloc(sizeof(RADEONDRIRec)); -   ctx->driverClientMsgSize = sizeof(RADEONDRIRec); -   pRADEONDRI                    = (RADEONDRIPtr)ctx->driverClientMsg; -   pRADEONDRI->deviceID          = info->Chipset; -   pRADEONDRI->width             = ctx->shared.virtualWidth; -   pRADEONDRI->height            = ctx->shared.virtualHeight; -   pRADEONDRI->depth             = ctx->bpp; /* XXX: depth */ -   pRADEONDRI->bpp               = ctx->bpp; -   pRADEONDRI->IsPCI             = ctx->isPCI; -   pRADEONDRI->AGPMode           = ctx->agpmode; -   pRADEONDRI->frontOffset       = info->frontOffset; -   pRADEONDRI->frontPitch        = info->frontPitch; -   pRADEONDRI->backOffset        = info->backOffset; -   pRADEONDRI->backPitch         = info->backPitch; -   pRADEONDRI->depthOffset       = info->depthOffset; -   pRADEONDRI->depthPitch        = info->depthPitch; -   pRADEONDRI->textureOffset     = info->textureOffset; -   pRADEONDRI->textureSize       = info->textureSize; -   pRADEONDRI->log2TexGran       = info->log2TexGran; -   pRADEONDRI->registerHandle    = info->registerHandle; -   pRADEONDRI->registerSize      = info->registerSize;  -   pRADEONDRI->statusHandle      = info->ringReadPtrHandle; -   pRADEONDRI->statusSize        = info->ringReadMapSize; -   pRADEONDRI->gartTexHandle      = info->gartTexHandle; -   pRADEONDRI->gartTexMapSize     = info->gartTexMapSize; -   pRADEONDRI->log2GARTTexGran    = info->log2GARTTexGran; -   pRADEONDRI->gartTexOffset      = info->gartTexStart; -   pRADEONDRI->sarea_priv_offset = sizeof(drm_sarea_t); - -   /* Don't release the lock now - let the VT switch handler do it. */ - -   return 1; -} - - -/** - * \brief Get Radeon chip family from chipset number. - *  - * \param info driver private data. - * - * \return non-zero on success, or zero on failure. - * - * Called by radeonInitFBDev() to set RADEONInfoRec::ChipFamily - * according to the value of RADEONInfoRec::Chipset.  Fails if the - * chipset is unrecognized or not appropriate for this driver (i.e., not - * an r100 style radeon) - */ -static int get_chipfamily_from_chipset( RADEONInfoPtr info ) -{ -    switch (info->Chipset) { -    case PCI_CHIP_RADEON_LY: -    case PCI_CHIP_RADEON_LZ: -	info->ChipFamily = CHIP_FAMILY_M6; -	break; - -    case PCI_CHIP_RADEON_QY: -    case PCI_CHIP_RADEON_QZ: -	info->ChipFamily = CHIP_FAMILY_VE; -	break; - -    case PCI_CHIP_R200_QL: -    case PCI_CHIP_R200_QN: -    case PCI_CHIP_R200_QO: -    case PCI_CHIP_R200_Ql: -    case PCI_CHIP_R200_BB: -	info->ChipFamily = CHIP_FAMILY_R200; -	break; - -    case PCI_CHIP_RV200_QW: /* RV200 desktop */ -    case PCI_CHIP_RV200_QX: -	info->ChipFamily = CHIP_FAMILY_RV200; -	break; - -    case PCI_CHIP_RADEON_LW: -    case PCI_CHIP_RADEON_LX: -	info->ChipFamily = CHIP_FAMILY_M7; -	break; - -    case PCI_CHIP_RV250_Id: -    case PCI_CHIP_RV250_Ie: -    case PCI_CHIP_RV250_If: -    case PCI_CHIP_RV250_Ig: -	info->ChipFamily = CHIP_FAMILY_RV250; -	break; - -    case PCI_CHIP_RV250_Ld: -    case PCI_CHIP_RV250_Le: -    case PCI_CHIP_RV250_Lf: -    case PCI_CHIP_RV250_Lg: -	info->ChipFamily = CHIP_FAMILY_M9; -	break; - -    case PCI_CHIP_RV280_Y_: -    case PCI_CHIP_RV280_Ya: -    case PCI_CHIP_RV280_Yb: -    case PCI_CHIP_RV280_Yc: -	info->ChipFamily = CHIP_FAMILY_RV280; -        break; - -    case PCI_CHIP_R300_ND: -    case PCI_CHIP_R300_NE: -    case PCI_CHIP_R300_NF: -    case PCI_CHIP_R300_NG: -	info->ChipFamily = CHIP_FAMILY_R300; -        break; - -    default: -	/* Original Radeon/7200 */ -	info->ChipFamily = CHIP_FAMILY_RADEON; -    } - -    return 1; -} - - -/** - * \brief Validate the fbdev mode. - *  - * \param ctx display handle. - * - * \return one on success, or zero on failure. - * - * Saves some registers and returns 1. - * - * \sa radeonValidateMode(). - */ -static int radeonValidateMode( const DRIDriverContext *ctx ) -{ -   unsigned char *RADEONMMIO = ctx->MMIOAddress; -   RADEONInfoPtr info = ctx->driverPrivate; - -   info->gen_int_cntl = INREG(RADEON_GEN_INT_CNTL); -   info->crtc_offset_cntl = INREG(RADEON_CRTC_OFFSET_CNTL); - -   if (info->colorTiling) -	   info->crtc_offset_cntl |= RADEON_CRTC_TILE_EN; -   return 1; -} - - -/** - * \brief Examine mode returned by fbdev. - *  - * \param ctx display handle. - * - * \return one on success, or zero on failure. - * - * Restores registers that fbdev has clobbered and returns 1. - * - * \sa radeonValidateMode(). - */ -static int radeonPostValidateMode( const DRIDriverContext *ctx ) -{ -   unsigned char *RADEONMMIO = ctx->MMIOAddress; -   RADEONInfoPtr info = ctx->driverPrivate; - -   RADEONColorTilingInit( ctx, info); -   OUTREG(RADEON_GEN_INT_CNTL, info->gen_int_cntl); -   if (info->colorTiling) -	   info->crtc_offset_cntl |= RADEON_CRTC_TILE_EN; -   OUTREG(RADEON_CRTC_OFFSET_CNTL, info->crtc_offset_cntl); -    -   return 1; -} - - -/** - * \brief Initialize the framebuffer device mode - * - * \param ctx display handle. - * - * \return one on success, or zero on failure. - * - * Fills in \p info with some default values and some information from \p ctx - * and then calls RADEONScreenInit() for the screen initialization. - *  - * Before exiting clears the framebuffer memory accessing it directly. - */ -static int radeonInitFBDev( DRIDriverContext *ctx ) -{ -   RADEONInfoPtr info = calloc(1, sizeof(*info)); - -   { -      int  dummy = ctx->shared.virtualWidth; - -      if (ctx->colorTiling==1) -      { -         switch (ctx->bpp / 8) { -         case 1: dummy = (ctx->shared.virtualWidth + 255) & ~255; break; -         case 2: dummy = (ctx->shared.virtualWidth + 127) & ~127; break; -         case 3: -         case 4: dummy = (ctx->shared.virtualWidth +  63) &  ~63; break; -         } -      } else { -	 switch (ctx->bpp / 8) { -         case 1: dummy = (ctx->shared.virtualWidth + 127) & ~127; break; -         case 2: dummy = (ctx->shared.virtualWidth +  31) &  ~31; break; -         case 3: -         case 4: dummy = (ctx->shared.virtualWidth +  15) &  ~15; break; -         } -      } - -      ctx->shared.virtualWidth = dummy; -      ctx->shared.Width = dummy; -   } - -   fprintf(stderr,"shared virtual width is %d\n", ctx->shared.virtualWidth); -   ctx->driverPrivate = (void *)info; -    -   info->gartFastWrite  = RADEON_DEFAULT_AGP_FAST_WRITE; -   info->gartSize       = RADEON_DEFAULT_AGP_SIZE; -   info->gartTexSize    = RADEON_DEFAULT_AGP_TEX_SIZE; -   info->bufSize       = RADEON_DEFAULT_BUFFER_SIZE; -   info->ringSize      = RADEON_DEFAULT_RING_SIZE; -   info->page_flip_enable = RADEON_DEFAULT_PAGE_FLIP; -   info->colorTiling = ctx->colorTiling; -   -   info->Chipset = ctx->chipset; - -   if (!get_chipfamily_from_chipset( info )) { -      fprintf(stderr, "Unknown or non-radeon chipset -- cannot continue\n"); -      fprintf(stderr, "==> Verify PCI BusID is correct in miniglx.conf\n"); -      return 0; -   } - -   info->frontPitch = ctx->shared.virtualWidth; -   info->LinearAddr = ctx->FBStart & 0xfc000000; -     - -   if (!RADEONScreenInit( ctx, info )) -      return 0; - - -   return 1; -} - - -/** - * \brief The screen is being closed, so clean up any state and free any - * resources used by the DRI. - * - * \param ctx display handle. - * - * Unmaps the SAREA, closes the DRM device file descriptor and frees the driver - * private data. - */ -static void radeonHaltFBDev( DRIDriverContext *ctx ) -{ -    drmUnmap( ctx->pSAREA, ctx->shared.SAREASize ); -    drmClose(ctx->drmFD); - -    if (ctx->driverPrivate) { -       free(ctx->driverPrivate); -       ctx->driverPrivate = 0; -    } -} - - -extern void radeonNotifyFocus( int ); - -/** - * \brief Exported driver interface for Mini GLX. - * - * \sa DRIDriverRec. - */ -const struct DRIDriverRec __driDriver = { -   radeonValidateMode, -   radeonPostValidateMode, -   radeonInitFBDev, -   radeonHaltFBDev, -   RADEONEngineShutdown, -   RADEONEngineRestore,   -#ifndef _EMBEDDED -   0, -#else -   radeonNotifyFocus,  -#endif -}; diff --git a/src/mesa/drivers/dri/savage/Makefile b/src/mesa/drivers/dri/savage/Makefile index 2e5c40802c..53511552c6 100644 --- a/src/mesa/drivers/dri/savage/Makefile +++ b/src/mesa/drivers/dri/savage/Makefile @@ -5,9 +5,6 @@ include $(TOP)/configs/current  LIBNAME = savage_dri.so -# Doesn't exist yet. -#MINIGLX_SOURCES = server/savage_dri.c  -  DRIVER_SOURCES = \  	savage_xmesa.c \  	savagedd.c \ diff --git a/src/mesa/drivers/dri/sis/Makefile b/src/mesa/drivers/dri/sis/Makefile index ad009fc239..6b4f938bab 100644 --- a/src/mesa/drivers/dri/sis/Makefile +++ b/src/mesa/drivers/dri/sis/Makefile @@ -5,10 +5,6 @@ include $(TOP)/configs/current  LIBNAME = sis_dri.so - -# Not yet -# MINIGLX_SOURCES = server/sis_dri.c  -  DRIVER_SOURCES = \  	sis6326_state.c \  	sis6326_clear.c \ diff --git a/src/mesa/drivers/dri/swrast/Makefile b/src/mesa/drivers/dri/swrast/Makefile index 771169c1ff..d2cf6dbc55 100644 --- a/src/mesa/drivers/dri/swrast/Makefile +++ b/src/mesa/drivers/dri/swrast/Makefile @@ -5,6 +5,8 @@ include $(TOP)/configs/current  LIBNAME = swrast_dri.so +DRIVER_DEFINES = -D__NOT_HAVE_DRM_H +  DRIVER_SOURCES = \  	swrast.c \  	swrast_span.c @@ -17,7 +19,8 @@ ASM_SOURCES =  SWRAST_COMMON_SOURCES = \  	../../common/driverfuncs.c \ -	../common/utils.c +	../common/utils.c \ +	../common/drisw_util.c  include ../Makefile.template diff --git a/src/mesa/drivers/dri/swrast/swrast.c b/src/mesa/drivers/dri/swrast/swrast.c index 03c672ecf1..8b68281fab 100644 --- a/src/mesa/drivers/dri/swrast/swrast.c +++ b/src/mesa/drivers/dri/swrast/swrast.c @@ -1,5 +1,5 @@  /* - * Copyright (C) 2008 George Sapountzis <gsap7@yahoo.gr> + * Copyright 2008, 2010 George Sapountzis <gsapountzis@gmail.com>   *   * Permission is hereby granted, free of charge, to any person obtaining a   * copy of this software and associated documentation files (the "Software"), @@ -54,17 +54,9 @@   * Screen and config-related functions   */ -static void -setupLoaderExtensions(__DRIscreen *psp, -		      const __DRIextension **extensions) -{ -    int i; - -    for (i = 0; extensions[i]; i++) { -	if (strcmp(extensions[i]->name, __DRI_SWRAST_LOADER) == 0) -	    psp->swrast_loader = (__DRIswrastLoaderExtension *) extensions[i]; -    } -} +static const __DRIextension *dri_screen_extensions[] = { +    NULL +};  static __DRIconfig **  swrastFillInModes(__DRIscreen *psp, @@ -143,26 +135,14 @@ swrastFillInModes(__DRIscreen *psp,      return configs;  } -static __DRIscreen * -driCreateNewScreen(int scrn, const __DRIextension **extensions, -		   const __DRIconfig ***driver_configs, void *data) +static const __DRIconfig ** +dri_init_screen(__DRIscreen * psp)  { -    static const __DRIextension *emptyExtensionList[] = { NULL }; -    __DRIscreen *psp;      __DRIconfig **configs8, **configs16, **configs24, **configs32; -    (void) data; -      TRACE; -    psp = calloc(1, sizeof(*psp)); -    if (!psp) -	return NULL; - -    setupLoaderExtensions(psp, extensions); - -    psp->num = scrn; -    psp->extensions = emptyExtensionList; +    psp->extensions = dri_screen_extensions;      configs8  = swrastFillInModes(psp,  8,  8, 0, 1);      configs16 = swrastFillInModes(psp, 16, 16, 0, 1); @@ -171,28 +151,15 @@ driCreateNewScreen(int scrn, const __DRIextension **extensions,      configs16 = driConcatConfigs(configs8, configs16);      configs24 = driConcatConfigs(configs16, configs24); -    *driver_configs = (const __DRIconfig **) -       driConcatConfigs(configs24, configs32); - -    driInitExtensions( NULL, NULL, GL_FALSE ); - -    return psp; -} - -static void driDestroyScreen(__DRIscreen *psp) -{ -    TRACE; +    configs32 = driConcatConfigs(configs24, configs32); -    if (psp) { -	free(psp); -    } +    return (const __DRIconfig **)configs32;  } -static const __DRIextension **driGetExtensions(__DRIscreen *psp) +static void +dri_destroy_screen(__DRIscreen * sPriv)  {      TRACE; - -    return psp->extensions;  } @@ -239,12 +206,20 @@ swrast_delete_renderbuffer(struct gl_renderbuffer *rb)      free(rb);  } +/* see bytes_per_line in libGL */ +static INLINE int +bytes_per_line(unsigned pitch_bits, unsigned mul) +{ +   unsigned mask = mul - 1; + +   return ((pitch_bits + mask) & ~mask) / 8; +} +  static GLboolean  swrast_alloc_front_storage(GLcontext *ctx, struct gl_renderbuffer *rb,  			   GLenum internalFormat, GLuint width, GLuint height)  {      struct swrast_renderbuffer *xrb = swrast_renderbuffer(rb); -    unsigned mask = PITCH_ALIGN_BITS - 1;      TRACE; @@ -252,8 +227,7 @@ swrast_alloc_front_storage(GLcontext *ctx, struct gl_renderbuffer *rb,      rb->Width = width;      rb->Height = height; -    /* always pad to PITCH_ALIGN_BITS */ -    xrb->pitch = ((width * xrb->bpp + mask) & ~mask) / 8; +    xrb->pitch = bytes_per_line(width * xrb->bpp, 32);      return GL_TRUE;  } @@ -336,94 +310,118 @@ swrast_new_renderbuffer(const GLvisual *visual, GLboolean front)      return xrb;  } -static __DRIdrawable * -driCreateNewDrawable(__DRIscreen *screen, -		     const __DRIconfig *config, void *data) +static GLboolean +dri_create_buffer(__DRIscreen * sPriv, +		  __DRIdrawable * dPriv, +		  const __GLcontextModes * visual, GLboolean isPixmap)  { -    __DRIdrawable *buf; +    struct dri_drawable *drawable = NULL; +    GLframebuffer *fb;      struct swrast_renderbuffer *frontrb, *backrb;      TRACE; -    buf = calloc(1, sizeof *buf); -    if (!buf) -	return NULL; +    drawable = CALLOC_STRUCT(dri_drawable); +    if (drawable == NULL) +	goto drawable_fail; -    buf->loaderPrivate = data; +    dPriv->driverPrivate = drawable; +    drawable->dPriv = dPriv; -    buf->driScreenPriv = screen; +    drawable->row = malloc(MAX_WIDTH * 4); +    if (drawable->row == NULL) +	goto drawable_fail; -    buf->row = malloc(MAX_WIDTH * 4); +    fb = &drawable->Base;      /* basic framebuffer setup */ -    _mesa_initialize_window_framebuffer(&buf->Base, &config->modes); +    _mesa_initialize_window_framebuffer(fb, visual);      /* add front renderbuffer */ -    frontrb = swrast_new_renderbuffer(&config->modes, GL_TRUE); -    _mesa_add_renderbuffer(&buf->Base, BUFFER_FRONT_LEFT, &frontrb->Base); +    frontrb = swrast_new_renderbuffer(visual, GL_TRUE); +    _mesa_add_renderbuffer(fb, BUFFER_FRONT_LEFT, &frontrb->Base);      /* add back renderbuffer */ -    if (config->modes.doubleBufferMode) { -	backrb = swrast_new_renderbuffer(&config->modes, GL_FALSE); -	_mesa_add_renderbuffer(&buf->Base, BUFFER_BACK_LEFT, &backrb->Base); +    if (visual->doubleBufferMode) { +	backrb = swrast_new_renderbuffer(visual, GL_FALSE); +	_mesa_add_renderbuffer(fb, BUFFER_BACK_LEFT, &backrb->Base);      }      /* add software renderbuffers */ -    _mesa_add_soft_renderbuffers(&buf->Base, +    _mesa_add_soft_renderbuffers(fb,  				 GL_FALSE, /* color */ -				 config->modes.haveDepthBuffer, -				 config->modes.haveStencilBuffer, -				 config->modes.haveAccumBuffer, +				 visual->haveDepthBuffer, +				 visual->haveStencilBuffer, +				 visual->haveAccumBuffer,  				 GL_FALSE, /* alpha */  				 GL_FALSE /* aux bufs */); -    return buf; +    return GL_TRUE; + +drawable_fail: + +    if (drawable) +	free(drawable->row); + +    FREE(drawable); + +    return GL_FALSE;  }  static void -driDestroyDrawable(__DRIdrawable *buf) +dri_destroy_buffer(__DRIdrawable * dPriv)  {      TRACE; -    if (buf) { -	struct gl_framebuffer *fb = &buf->Base; +    if (dPriv) { +	struct dri_drawable *drawable = dri_drawable(dPriv); +	GLframebuffer *fb; + +	free(drawable->row); -	free(buf->row); +	fb = &drawable->Base;  	fb->DeletePending = GL_TRUE;  	_mesa_reference_framebuffer(&fb, NULL);      }  } -static void driSwapBuffers(__DRIdrawable *buf) +static void +dri_swap_buffers(__DRIdrawable * dPriv)  { -    GET_CURRENT_CONTEXT(ctx); +    __DRIscreen *sPriv = dPriv->driScreenPriv; -    struct swrast_renderbuffer *frontrb = -	swrast_renderbuffer(buf->Base.Attachment[BUFFER_FRONT_LEFT].Renderbuffer); -    struct swrast_renderbuffer *backrb = -	swrast_renderbuffer(buf->Base.Attachment[BUFFER_BACK_LEFT].Renderbuffer); +    GET_CURRENT_CONTEXT(ctx); -    __DRIscreen *screen = buf->driScreenPriv; +    struct dri_drawable *drawable = dri_drawable(dPriv); +    GLframebuffer *fb; +    struct swrast_renderbuffer *frontrb, *backrb;      TRACE; +    fb = &drawable->Base; + +    frontrb = +	swrast_renderbuffer(fb->Attachment[BUFFER_FRONT_LEFT].Renderbuffer); +    backrb = +	swrast_renderbuffer(fb->Attachment[BUFFER_BACK_LEFT].Renderbuffer); +      /* check for signle-buffered */      if (backrb == NULL)  	return;      /* check if swapping currently bound buffer */ -    if (ctx && ctx->DrawBuffer == &(buf->Base)) { +    if (ctx && ctx->DrawBuffer == fb) {  	/* flush pending rendering */  	_mesa_notifySwapBuffers(ctx);      } -    screen->swrast_loader->putImage(buf, __DRI_SWRAST_IMAGE_OP_SWAP, -				    0, 0, -				    frontrb->Base.Width, -				    frontrb->Base.Height, -				    backrb->Base.Data, -				    buf->loaderPrivate); +    sPriv->swrast_loader->putImage(dPriv, __DRI_SWRAST_IMAGE_OP_SWAP, +				   0, 0, +				   frontrb->Base.Width, +				   frontrb->Base.Height, +				   backrb->Base.Data, +				   dPriv->loaderPrivate);  } @@ -434,13 +432,13 @@ static void driSwapBuffers(__DRIdrawable *buf)  static void  get_window_size( GLframebuffer *fb, GLsizei *w, GLsizei *h )  { -    __DRIdrawable *buf = swrast_drawable(fb); -    __DRIscreen *screen = buf->driScreenPriv; +    __DRIdrawable *dPriv = swrast_drawable(fb)->dPriv; +    __DRIscreen *sPriv = dPriv->driScreenPriv;      int x, y; -    screen->swrast_loader->getDrawableInfo(buf, -					   &x, &y, w, h, -					   buf->loaderPrivate); +    sPriv->swrast_loader->getDrawableInfo(dPriv, +					  &x, &y, w, h, +					  dPriv->loaderPrivate);  }  static void @@ -502,37 +500,40 @@ swrast_init_driver_functions(struct dd_function_table *driver)   * Context-related functions.   */ -static __DRIcontext * -driCreateNewContext(__DRIscreen *screen, const __DRIconfig *config, -		    __DRIcontext *shared, void *data) +static GLboolean +dri_create_context(const __GLcontextModes * visual, +		   __DRIcontext * cPriv, void *sharedContextPrivate)  { -    __DRIcontext *ctx; -    GLcontext *mesaCtx; +    struct dri_context *ctx = NULL; +    struct dri_context *share = (struct dri_context *)sharedContextPrivate; +    GLcontext *mesaCtx = NULL; +    GLcontext *sharedCtx = NULL;      struct dd_function_table functions;      TRACE; -    ctx = calloc(1, sizeof *ctx); -    if (!ctx) -	return NULL; - -    ctx->loaderPrivate = data; +    ctx = CALLOC_STRUCT(dri_context); +    if (ctx == NULL) +	goto context_fail; -    ctx->driScreenPriv = screen; +    cPriv->driverPrivate = ctx; +    ctx->cPriv = cPriv;      /* build table of device driver functions */      _mesa_init_driver_functions(&functions);      swrast_init_driver_functions(&functions); -    if (!_mesa_initialize_context(&ctx->Base, &config->modes, -				  shared ? &shared->Base : NULL, -				  &functions, (void *) ctx)) { -      free(ctx); -      return NULL; +    if (share) { +	sharedCtx = &share->Base;      }      mesaCtx = &ctx->Base; +    /* basic context setup */ +    if (!_mesa_initialize_context(mesaCtx, visual, sharedCtx, &functions, (void *) cPriv)) { +	goto context_fail; +    } +      /* do bounds checking to prevent segfaults and server crashes! */      mesaCtx->Const.CheckArrayBounds = GL_TRUE; @@ -558,17 +559,28 @@ driCreateNewContext(__DRIscreen *screen, const __DRIconfig *config,      _mesa_meta_init(mesaCtx); -    return ctx; +    driInitExtensions( mesaCtx, NULL, GL_FALSE ); + +    return GL_TRUE; + +context_fail: + +    FREE(ctx); + +    return GL_FALSE;  }  static void -driDestroyContext(__DRIcontext *ctx) +dri_destroy_context(__DRIcontext * cPriv)  { -    GLcontext *mesaCtx;      TRACE; -    if (ctx) { +    if (cPriv) { +	struct dri_context *ctx = dri_context(cPriv); +	GLcontext *mesaCtx; +  	mesaCtx = &ctx->Base; +          _mesa_meta_free(mesaCtx);  	_swsetup_DestroyContext( mesaCtx );  	_swrast_DestroyContext( mesaCtx ); @@ -578,26 +590,22 @@ driDestroyContext(__DRIcontext *ctx)      }  } -static int -driCopyContext(__DRIcontext *dst, __DRIcontext *src, unsigned long mask) -{ -    TRACE; - -    _mesa_copy_context(&src->Base, &dst->Base, mask); -    return GL_TRUE; -} - -static int driBindContext(__DRIcontext *ctx, -			  __DRIdrawable *draw, -			  __DRIdrawable *read) +static GLboolean +dri_make_current(__DRIcontext * cPriv, +		 __DRIdrawable * driDrawPriv, +		 __DRIdrawable * driReadPriv)  {      GLcontext *mesaCtx;      GLframebuffer *mesaDraw;      GLframebuffer *mesaRead;      TRACE; -    if (ctx) { -	if (!draw || !read) +    if (cPriv) { +	struct dri_context *ctx = dri_context(cPriv); +	struct dri_drawable *draw = dri_drawable(driDrawPriv); +	struct dri_drawable *read = dri_drawable(driReadPriv); + +	if (!driDrawPriv || !driReadPriv)  	    return GL_FALSE;  	mesaCtx = &ctx->Base; @@ -614,7 +622,7 @@ static int driBindContext(__DRIcontext *ctx,  	_glapi_check_multithread();  	swrast_check_and_update_window_size(mesaCtx, mesaDraw); -	if (read != draw) +	if (mesaRead != mesaDraw)  	    swrast_check_and_update_window_size(mesaCtx, mesaRead);  	_mesa_make_current( mesaCtx, @@ -629,35 +637,25 @@ static int driBindContext(__DRIcontext *ctx,      return GL_TRUE;  } -static int driUnbindContext(__DRIcontext *ctx) +static GLboolean +dri_unbind_context(__DRIcontext * cPriv)  {      TRACE; -    (void) ctx; +    (void) cPriv;      return GL_TRUE;  } -static const __DRIcoreExtension driCoreExtension = { -    { __DRI_CORE, __DRI_CORE_VERSION }, -    NULL, /* driCreateNewScreen */ -    driDestroyScreen, -    driGetExtensions, -    driGetConfigAttrib, -    driIndexConfigAttrib, -    NULL, /* driCreateNewDrawable */ -    driDestroyDrawable, -    driSwapBuffers, -    driCreateNewContext, -    driCopyContext, -    driDestroyContext, -    driBindContext, -    driUnbindContext -}; - -static const __DRIswrastExtension driSWRastExtension = { -    { __DRI_SWRAST, __DRI_SWRAST_VERSION }, -    driCreateNewScreen, -    driCreateNewDrawable +const struct __DriverAPIRec driDriverAPI = { +    .InitScreen = dri_init_screen, +    .DestroyScreen = dri_destroy_screen, +    .CreateContext = dri_create_context, +    .DestroyContext = dri_destroy_context, +    .CreateBuffer = dri_create_buffer, +    .DestroyBuffer = dri_destroy_buffer, +    .SwapBuffers = dri_swap_buffers, +    .MakeCurrent = dri_make_current, +    .UnbindContext = dri_unbind_context,  };  /* This is the table of extensions that the loader will dlsym() for. */ diff --git a/src/mesa/drivers/dri/swrast/swrast_priv.h b/src/mesa/drivers/dri/swrast/swrast_priv.h index 4722007f95..6679061a98 100644 --- a/src/mesa/drivers/dri/swrast/swrast_priv.h +++ b/src/mesa/drivers/dri/swrast/swrast_priv.h @@ -3,6 +3,7 @@   * Version:  7.1   *   * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved. + * Copyright 2008, 2010 George Sapountzis <gsapountzis@gmail.com>   *   * Permission is hereby granted, free of charge, to any person obtaining a   * copy of this software and associated documentation files (the "Software"), @@ -22,11 +23,6 @@   * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.   */ -/* - * Authors: - *    George Sapountzis <gsap7@yahoo.gr> - */ -  #ifndef _SWRAST_PRIV_H  #define _SWRAST_PRIV_H @@ -34,6 +30,7 @@  #include <GL/gl.h>  #include <GL/internal/dri_interface.h>  #include "main/mtypes.h" +#include "drisw_util.h"  /** @@ -58,33 +55,51 @@  /**   * Data types   */ -struct __DRIscreenRec { -    int num; - -    const __DRIextension **extensions; +struct dri_context +{ +    /* mesa, base class, must be first */ +    GLcontext Base; -    const __DRIswrastLoaderExtension *swrast_loader; +    /* dri */ +    __DRIcontext *cPriv;  }; -struct __DRIcontextRec { -    GLcontext Base; - -    void *loaderPrivate; +static INLINE struct dri_context * +dri_context(__DRIcontext * driContextPriv) +{ +    return (struct dri_context *)driContextPriv->driverPrivate; +} -    __DRIscreen *driScreenPriv; -}; +static INLINE struct dri_context * +swrast_context(GLcontext *ctx) +{ +    return (struct dri_context *) ctx; +} -struct __DRIdrawableRec { +struct dri_drawable +{ +    /* mesa, base class, must be first */      GLframebuffer Base; -    void *loaderPrivate; - -    __DRIscreen *driScreenPriv; +    /* dri */ +    __DRIdrawable *dPriv;      /* scratch row for optimized front-buffer rendering */      char *row;  }; +static INLINE struct dri_drawable * +dri_drawable(__DRIdrawable * driDrawPriv) +{ +    return (struct dri_drawable *)driDrawPriv->driverPrivate; +} + +static INLINE struct dri_drawable * +swrast_drawable(GLframebuffer *fb) +{ +    return (struct dri_drawable *) fb; +} +  struct swrast_renderbuffer {      struct gl_renderbuffer Base; @@ -94,18 +109,6 @@ struct swrast_renderbuffer {      GLuint bpp;  }; -static INLINE __DRIcontext * -swrast_context(GLcontext *ctx) -{ -    return (__DRIcontext *) ctx; -} - -static INLINE __DRIdrawable * -swrast_drawable(GLframebuffer *fb) -{ -    return (__DRIdrawable *) fb; -} -  static INLINE struct swrast_renderbuffer *  swrast_renderbuffer(struct gl_renderbuffer *rb)  { @@ -121,14 +124,6 @@ swrast_renderbuffer(struct gl_renderbuffer *rb)  #define PF_R3G3B2     3		/**<  8bpp TrueColor:  3-R, 3-G, 2-B bits */  #define PF_X8R8G8B8   4		/**< 32bpp TrueColor:  8-R, 8-G, 8-B bits */ -/** - * Renderbuffer pitch alignment (in bits). - * - * The xorg loader requires padding images to 32 bits. However, this should - * become a screen/drawable parameter XXX - */ -#define PITCH_ALIGN_BITS 32 -  /* swrast_span.c */ diff --git a/src/mesa/drivers/dri/swrast/swrast_span.c b/src/mesa/drivers/dri/swrast/swrast_span.c index d896e154f7..c7d0bfdac7 100644 --- a/src/mesa/drivers/dri/swrast/swrast_span.c +++ b/src/mesa/drivers/dri/swrast/swrast_span.c @@ -3,6 +3,7 @@   * Version:  7.1   *   * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved. + * Copyright 2008, 2010 George Sapountzis <gsapountzis@gmail.com>   *   * Permission is hereby granted, free of charge, to any person obtaining a   * copy of this software and associated documentation files (the "Software"), @@ -22,11 +23,6 @@   * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.   */ -/* - * Authors: - *    George Sapountzis <gsap7@yahoo.gr> - */ -  #include "swrast_priv.h"  #define YFLIP(_xrb, Y) ((_xrb)->Base.Height - (Y) - 1) diff --git a/src/mesa/drivers/dri/swrast/swrast_spantemp.h b/src/mesa/drivers/dri/swrast/swrast_spantemp.h index 8487361714..1e9405eebf 100644 --- a/src/mesa/drivers/dri/swrast/swrast_spantemp.h +++ b/src/mesa/drivers/dri/swrast/swrast_spantemp.h @@ -39,8 +39,8 @@  static INLINE void  PUT_PIXEL( GLcontext *glCtx, GLint x, GLint y, GLvoid *p )  { -    __DRIcontext *ctx = swrast_context(glCtx); -    __DRIdrawable *draw = swrast_drawable(glCtx->DrawBuffer); +    __DRIcontext *ctx = swrast_context(glCtx)->cPriv; +    __DRIdrawable *draw = swrast_drawable(glCtx->DrawBuffer)->dPriv;      __DRIscreen *screen = ctx->driScreenPriv; @@ -53,8 +53,8 @@ PUT_PIXEL( GLcontext *glCtx, GLint x, GLint y, GLvoid *p )  static INLINE void  GET_PIXEL( GLcontext *glCtx, GLint x, GLint y, GLubyte *p )  { -    __DRIcontext *ctx = swrast_context(glCtx); -    __DRIdrawable *read = swrast_drawable(glCtx->ReadBuffer); +    __DRIcontext *ctx = swrast_context(glCtx)->cPriv; +    __DRIdrawable *read = swrast_drawable(glCtx->ReadBuffer)->dPriv;      __DRIscreen *screen = ctx->driScreenPriv; @@ -65,8 +65,8 @@ GET_PIXEL( GLcontext *glCtx, GLint x, GLint y, GLubyte *p )  static INLINE void  PUT_ROW( GLcontext *glCtx, GLint x, GLint y, GLuint n, char *row )  { -    __DRIcontext *ctx = swrast_context(glCtx); -    __DRIdrawable *draw = swrast_drawable(glCtx->DrawBuffer); +    __DRIcontext *ctx = swrast_context(glCtx)->cPriv; +    __DRIdrawable *draw = swrast_drawable(glCtx->DrawBuffer)->dPriv;      __DRIscreen *screen = ctx->driScreenPriv; @@ -78,8 +78,8 @@ PUT_ROW( GLcontext *glCtx, GLint x, GLint y, GLuint n, char *row )  static INLINE void  GET_ROW( GLcontext *glCtx, GLint x, GLint y, GLuint n, char *row )  { -    __DRIcontext *ctx = swrast_context(glCtx); -    __DRIdrawable *read = swrast_drawable(glCtx->ReadBuffer); +    __DRIcontext *ctx = swrast_context(glCtx)->cPriv; +    __DRIdrawable *read = swrast_drawable(glCtx->ReadBuffer)->dPriv;      __DRIscreen *screen = ctx->driScreenPriv; diff --git a/src/mesa/drivers/dri/tdfx/Makefile b/src/mesa/drivers/dri/tdfx/Makefile index b9f25db4fe..96bd8f8202 100644 --- a/src/mesa/drivers/dri/tdfx/Makefile +++ b/src/mesa/drivers/dri/tdfx/Makefile @@ -5,9 +5,6 @@ include $(TOP)/configs/current  LIBNAME = tdfx_dri.so -# not yet -# MINIGLX_SOURCES = server/tdfx_dri.c  -  DRIVER_SOURCES = \  	tdfx_context.c \  	tdfx_dd.c \ diff --git a/src/mesa/drivers/dri/tdfx/server/tdfx_dri.c b/src/mesa/drivers/dri/tdfx/server/tdfx_dri.c deleted file mode 100644 index 63fe875f59..0000000000 --- a/src/mesa/drivers/dri/tdfx/server/tdfx_dri.c +++ /dev/null @@ -1,471 +0,0 @@ -/* - * Mesa 3-D graphics library - * Version:  5.1 - * - * Copyright (C) 1999-2003  Brian Paul   All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL - * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN - * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -/* Authors: - *    Keith Whitwell - *    Daniel Borca - */ - - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <errno.h> -#include <unistd.h> -  -#include "driver.h" -#include "drm.h" -#include "imports.h" - -#include "dri_util.h" - -#include "tdfx_context.h" -#include "tdfx_dri.h" -#include "xf86drm.h" - - -#define TILE_WIDTH 128 -#define TILE_HEIGHT 32 - -#define CMDFIFO_PAGES 64 - - -static int -calcBufferStride (int xres, int tiled, int cpp) -{ -  int strideInTiles; - -  if (tiled) { -    /* Calculate tile width stuff */ -    strideInTiles = (xres+TILE_WIDTH-1)/TILE_WIDTH; - -    return strideInTiles*cpp*TILE_WIDTH; -  } else { -    return xres*cpp; -  } -} /* calcBufferStride */ - - -static int -calcBufferHeightInTiles (int yres) -{ -  int heightInTiles;            /* Height of buffer in tiles */ - -  /* Calculate tile height stuff */ -  heightInTiles = yres >> 5; - -  if (yres & (TILE_HEIGHT - 1)) -    heightInTiles++; - -  return heightInTiles; - -} /* calcBufferHeightInTiles */ - - -static int -calcBufferSize (int xres, int yres, int tiled, int cpp) -{ -  int stride, height, bufSize; - -  if (tiled) { -    stride = calcBufferStride(xres, tiled, cpp); -    height = TILE_HEIGHT * calcBufferHeightInTiles(yres); -  } else { -    stride = xres*cpp; -    height = yres; -  } - -  bufSize = stride * height; - -  return bufSize; -} /* calcBufferSize */ - - -static void allocateMemory (const DRIDriverContext *ctx, TDFXDRIPtr pTDFX) -{ -  int memRemaining, fifoSize, screenSizeInTiles; -  int fbSize; -  char *str; -  int pixmapCacheLinesMin; -  int cursorOffset, cursorSize; - -  pTDFX->stride = calcBufferStride(pTDFX->width, !0, pTDFX->cpp); - -  /* enough to do DVD */ -  pixmapCacheLinesMin = ((720*480*pTDFX->cpp) +  -					pTDFX->stride - 1)/pTDFX->stride; - -  if (pTDFX->deviceID > PCI_CHIP_VOODOO3) { -  	if ((pixmapCacheLinesMin + pTDFX->height) > 4095) -		pixmapCacheLinesMin = 4095 - pTDFX->height; -  } else { -  	if ((pixmapCacheLinesMin + pTDFX->height) > 2047) -		pixmapCacheLinesMin = 2047 - pTDFX->height; -  } - -  if (pTDFX->cpp!=3) { -    screenSizeInTiles=calcBufferSize(pTDFX->width, pTDFX->height, -				     !0, pTDFX->cpp); -  } -  else { -    /* cpp==3 needs to bump up to 4 */ -    screenSizeInTiles=calcBufferSize(pTDFX->width, pTDFX->height, -				     !0, 4); -  } - -  /* -   * Layout is: -   *    cursor, fifo, fb, tex, bb, db -   */ - -  fbSize = (pTDFX->height + pixmapCacheLinesMin) * pTDFX->stride; - -  memRemaining=(pTDFX->mem - 1) &~ 0xFFF; -  /* Note that a page is 4096 bytes, and a  */ -  /* tile is 32 x 128 = 4096 bytes.  So,    */ -  /* page and tile boundaries are the same  */ -  /* Place the depth offset first, forcing  */ -  /* it to be on an *odd* page boundary.    */ -  pTDFX->depthOffset = (memRemaining - screenSizeInTiles) &~ 0xFFF; -  if ((pTDFX->depthOffset & (0x1 << 12)) == 0) { -      pTDFX->depthOffset -= (0x1 << 12); -  } -  /* Now, place the back buffer, forcing it */ -  /* to be on an *even* page boundary.      */ -  pTDFX->backOffset = (pTDFX->depthOffset - screenSizeInTiles) &~ 0xFFF; -  if (pTDFX->backOffset & (0x1 << 12)) { -      pTDFX->backOffset -= (0x1 << 12); -  } -  /* Give the cmd fifo at least             */ -  /* CMDFIFO_PAGES pages, but no more than  */ -  /* 64. NOTE: Don't go higher than 64, as  */ -  /* there is suspect code in Glide3 !      */ -  fifoSize = ((64 <= CMDFIFO_PAGES) ? 64 : CMDFIFO_PAGES) << 12; - -  /* We give 4096 bytes to the cursor  */ -  cursorSize = 0/*4096*/; -  cursorOffset = 0; - -  pTDFX->fifoOffset = cursorOffset + cursorSize; -  pTDFX->fifoSize = fifoSize; -  /* Now, place the front buffer, forcing   */ -  /* it to be on a page boundary too, just  */ -  /* for giggles.                           */ -  pTDFX->fbOffset = pTDFX->fifoOffset + pTDFX->fifoSize; -  pTDFX->textureOffset = pTDFX->fbOffset + fbSize; -  if (pTDFX->depthOffset <= pTDFX->textureOffset || -	pTDFX->backOffset <= pTDFX->textureOffset) { -    /* -     * pTDFX->textureSize < 0 means that the DRI is disabled.  pTDFX->backOffset -     * is used to calculate the maximum amount of memory available for -     * 2D offscreen use.  With DRI disabled, set this to the top of memory. -     */ - -    pTDFX->textureSize = -1; -    pTDFX->backOffset = pTDFX->mem; -    pTDFX->depthOffset = -1; -    fprintf(stderr,  -        "Not enough video memory available for textures and depth buffer\n" -	"\tand/or back buffer.  Disabling DRI.  To use DRI try lower\n" -	"\tresolution modes and/or a smaller virtual screen size\n"); -  } else { -    pTDFX->textureSize = pTDFX->backOffset - pTDFX->textureOffset; -  } -} - - -static int createScreen (DRIDriverContext *ctx, TDFXDRIPtr pTDFX) -{ -   int err; -    -   { -      int  width_bytes = (ctx->shared.virtualWidth * ctx->cpp); -      int  maxy        = ctx->shared.fbSize / width_bytes; - - -      if (maxy <= ctx->shared.virtualHeight * 3) { -	 fprintf(stderr,  -		 "Static buffer allocation failed -- " -		 "need at least %d kB video memory (have %d kB)\n", -		 (ctx->shared.virtualWidth * ctx->shared.virtualHeight * -		  ctx->cpp * 3 + 1023) / 1024, -		 ctx->shared.fbSize / 1024); -	 return 0; -      }  -   } - -   ctx->shared.SAREASize = SAREA_MAX; -   pTDFX->regsSize = ctx->MMIOSize; - -   /* Note that drmOpen will try to load the kernel module, if needed. */ -   ctx->drmFD = drmOpen("tdfx", NULL ); -   if (ctx->drmFD < 0) { -      fprintf(stderr, "[drm] drmOpen failed\n"); -      return 0; -   } - -   if ((err = drmSetBusid(ctx->drmFD, ctx->pciBusID)) < 0) { -      fprintf(stderr, "[drm] drmSetBusid failed (%d, %s), %s\n", -	      ctx->drmFD, ctx->pciBusID, strerror(-err)); -      return 0; -   } - -   if (drmAddMap( ctx->drmFD, -		  0, -		  ctx->shared.SAREASize, -		  DRM_SHM, -		  DRM_CONTAINS_LOCK, -		  &ctx->shared.hSAREA) < 0) -   { -      fprintf(stderr, "[drm] drmAddMap failed\n"); -      return 0; -   } -   fprintf(stderr, "[drm] added %d byte SAREA at 0x%08lx\n", -	   ctx->shared.SAREASize, ctx->shared.hSAREA); - -   if (drmMap( ctx->drmFD, -	       ctx->shared.hSAREA, -	       ctx->shared.SAREASize, -	       (drmAddressPtr)(&ctx->pSAREA)) < 0) -   { -      fprintf(stderr, "[drm] drmMap failed\n"); -      return 0; -   } -   memset(ctx->pSAREA, 0, ctx->shared.SAREASize); -   fprintf(stderr, "[drm] mapped SAREA 0x%08lx to %p, size %d\n", -	   ctx->shared.hSAREA, ctx->pSAREA, ctx->shared.SAREASize); -    -   /* Need to AddMap the framebuffer and mmio regions here: -    */ -   if (drmAddMap( ctx->drmFD, -		  (drm_handle_t)ctx->FBStart, -		  ctx->FBSize, -		  DRM_FRAME_BUFFER, -#ifndef _EMBEDDED -		  0, -#else -		  DRM_READ_ONLY, -#endif -		  &ctx->shared.hFrameBuffer) < 0) -   { -      fprintf(stderr, "[drm] drmAddMap framebuffer failed\n"); -      return 0; -   } - -   fprintf(stderr, "[drm] framebuffer handle = 0x%08lx\n", -	   ctx->shared.hFrameBuffer); - - -   if (drmAddMap(ctx->drmFD,  -		 ctx->MMIOStart, -		 ctx->MMIOSize, -		 DRM_REGISTERS,  -		 DRM_READ_ONLY,  -		 &pTDFX->regs) < 0) { -      fprintf(stderr, "[drm] drmAddMap mmio failed\n");	 -      return 0; -   } -   fprintf(stderr, -	   "[drm] register handle = 0x%08lx\n", pTDFX->regs); - - -   /* Create a 'server' context so we can grab the lock for -    * initialization ioctls. -    */ -   if ((err = drmCreateContext(ctx->drmFD, &ctx->serverContext)) != 0) { -      fprintf(stderr, "%s: drmCreateContext failed %d\n", __FUNCTION__, err); -      return 0; -   } - -   DRM_LOCK(ctx->drmFD, ctx->pSAREA, ctx->serverContext, 0);  - -   /* Initialize the kernel data structures */ - -   /* Initialize kernel gart memory manager */ -   allocateMemory(ctx, pTDFX); - -   /* Initialize the SAREA private data structure */ - - -   /* Quick hack to clear the front & back buffers.  Could also use -    * the clear ioctl to do this, but would need to setup hw state -    * first. -    */ - - -   /* This is the struct passed to tdfx_dri.so for its initialization */ -   ctx->driverClientMsg = malloc(sizeof(TDFXDRIRec)); -   ctx->driverClientMsgSize = sizeof(TDFXDRIRec); -   memcpy(ctx->driverClientMsg, pTDFX, ctx->driverClientMsgSize); -   pTDFX = (TDFXDRIPtr)ctx->driverClientMsg; - -   /* Don't release the lock now - let the VT switch handler do it. */ - -   return 1; -} - - -/** - * \brief Validate the fbdev mode. - *  - * \param ctx display handle. - * - * \return one on success, or zero on failure. - * - * Saves some registers and returns 1. - * - * \sa tdfxValidateMode(). - */ -static int tdfxValidateMode( const DRIDriverContext *ctx ) -{ -   return 1; -} - - -/** - * \brief Examine mode returned by fbdev. - *  - * \param ctx display handle. - * - * \return one on success, or zero on failure. - * - * Restores registers that fbdev has clobbered and returns 1. - * - * \sa tdfxValidateMode(). - */ -static int tdfxPostValidateMode( const DRIDriverContext *ctx ) -{ -   return 1; -} - - -/** - * \brief Initialize the framebuffer device mode - * - * \param ctx display handle. - * - * \return one on success, or zero on failure. - * - * Before exiting clears the framebuffer memory accessing it directly. - */ -static int tdfxInitFBDev( DRIDriverContext *ctx ) -{ -   TDFXDRIPtr pTDFX = calloc(1, sizeof(TDFXDRIRec)); - -   { -      int  dummy = ctx->shared.virtualWidth; - -      switch (ctx->bpp / 8) { -      case 1: dummy = (ctx->shared.virtualWidth + 127) & ~127; break; -      case 2: dummy = (ctx->shared.virtualWidth +  31) &  ~31; break; -      case 3: -      case 4: dummy = (ctx->shared.virtualWidth +  15) &  ~15; break; -      } - -      ctx->shared.virtualWidth = dummy; -   } - -   ctx->driverPrivate = (void *)pTDFX; - -   pTDFX->deviceID = ctx->chipset; -   pTDFX->width    = ctx->shared.virtualWidth; -   pTDFX->height   = ctx->shared.virtualHeight; -   pTDFX->cpp      = ctx->cpp; -   pTDFX->mem      = ctx->FBSize; /* ->shared.fbSize? mem probe? */ -   pTDFX->sarea_priv_offset = sizeof(drm_sarea_t); - -   if (!createScreen(ctx, pTDFX)) -      return 0; - -   return 1; -} - - -/** - * \brief The screen is being closed, so clean up any state and free any - * resources used by the DRI. - * - * \param ctx display handle. - * - * Unmaps the SAREA, closes the DRM device file descriptor and frees the driver - * private data. - */ -static void tdfxHaltFBDev( DRIDriverContext *ctx ) -{ -    drmUnmap( ctx->pSAREA, ctx->shared.SAREASize ); -    drmClose(ctx->drmFD); - -    if (ctx->driverPrivate) { -       free(ctx->driverPrivate); -       ctx->driverPrivate = 0; -    } -} - - -/** - * \brief Shutdown the drawing engine. - * - * \param ctx display handle - * - * Turns off the 3D engine & restores the graphics card - * to a state that fbdev understands. - */ -static int tdfxEngineShutdown( const DRIDriverContext *ctx ) -{ -   fprintf(stderr, "%s: not implemented\n", __FUNCTION__); -   return 1; -} - - -/** - * \brief Restore the drawing engine. - * - * \param ctx display handle - * - * Resets the graphics card and sets initial values for several registers of - * the card's drawing engine. - * - * Turns on 3dfx - */ -static int tdfxEngineRestore( const DRIDriverContext *ctx ) -{ -   fprintf(stderr, "%s: not implemented\n", __FUNCTION__); -   return 1; -} - - -/** - * \brief Exported driver interface for Mini GLX. - * - * \sa DRIDriverRec. - */ -struct DRIDriverRec __driDriver = { -   tdfxValidateMode, -   tdfxPostValidateMode, -   tdfxInitFBDev, -   tdfxHaltFBDev, -   tdfxEngineShutdown, -   tdfxEngineRestore, -   0 -}; diff --git a/src/mesa/drivers/dri/unichrome/Makefile b/src/mesa/drivers/dri/unichrome/Makefile index 344d34fce3..14cf9f3038 100644 --- a/src/mesa/drivers/dri/unichrome/Makefile +++ b/src/mesa/drivers/dri/unichrome/Makefile @@ -5,8 +5,6 @@ include $(TOP)/configs/current  LIBNAME = unichrome_dri.so -MINIGLX_SOURCES = server/via_dri.c  -  DRIVER_SOURCES = \  	via_context.c \  	via_fb.c \ diff --git a/src/mesa/drivers/dri/unichrome/server/via_dri.c b/src/mesa/drivers/dri/unichrome/server/via_dri.c deleted file mode 100644 index 74034485e2..0000000000 --- a/src/mesa/drivers/dri/unichrome/server/via_dri.c +++ /dev/null @@ -1,1251 +0,0 @@ -/* - * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. - * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sub license, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the - * next paragraph) shall be included in all copies or substantial portions - * of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL - * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <errno.h> -#include <unistd.h> -  -#include "driver.h" -#include "drm.h" -#include "imports.h" - -#include "dri_util.h" - -#include "via_context.h" -#include "via_dri.h" -#include "via_driver.h" -#include "xf86drm.h" - -static void VIAEnableMMIO(DRIDriverContext * ctx); -static void VIADisableMMIO(DRIDriverContext * ctx); -static void VIADisableExtendedFIFO(DRIDriverContext *ctx); -static void VIAEnableExtendedFIFO(DRIDriverContext *ctx); -static void VIAInitialize2DEngine(DRIDriverContext *ctx); -static void VIAInitialize3DEngine(DRIDriverContext *ctx); - -static int VIADRIScreenInit(DRIDriverContext * ctx); -static void VIADRICloseScreen(DRIDriverContext * ctx); -static int VIADRIFinishScreenInit(DRIDriverContext * ctx); - -/* _SOLO : missing macros normally defined by X code */ -#define xf86DrvMsg(a, b, ...) fprintf(stderr, __VA_ARGS__) -#define MMIO_IN8(base, addr) ((*(((volatile uint8_t*)base)+(addr)))+0) -#define MMIO_OUT8(base, addr, val) ((*(((volatile uint8_t*)base)+(addr)))=((uint8_t)val)) -#define MMIO_OUT16(base, addr, val) ((*(volatile uint16_t*)(((uint8_t*)base)+(addr)))=((uint16_t)val)) - -#define VIDEO	0  -#define AGP		1 -#define AGP_PAGE_SIZE 4096 -#define AGP_PAGES 8192 -#define AGP_SIZE (AGP_PAGE_SIZE * AGP_PAGES) -#define AGP_CMDBUF_PAGES 512 -#define AGP_CMDBUF_SIZE (AGP_PAGE_SIZE * AGP_CMDBUF_PAGES) - -static char VIAKernelDriverName[] = "via"; -static char VIAClientDriverName[] = "unichrome"; - -static int VIADRIAgpInit(const DRIDriverContext *ctx, VIAPtr pVia); -static int VIADRIPciInit(DRIDriverContext * ctx, VIAPtr pVia); -static int VIADRIFBInit(DRIDriverContext * ctx, VIAPtr pVia); -static int VIADRIKernelInit(DRIDriverContext * ctx, VIAPtr pVia); -static int VIADRIMapInit(DRIDriverContext * ctx, VIAPtr pVia); - -static void VIADRIIrqInit( DRIDriverContext *ctx ) -{ -    VIAPtr pVia = VIAPTR(ctx); -    VIADRIPtr pVIADRI = pVia->devPrivate; - -    pVIADRI->irqEnabled = drmGetInterruptFromBusID(pVia->drmFD, -					   ctx->pciBus, -					   ctx->pciDevice, -					   ctx->pciFunc); - -    if ((drmCtlInstHandler(pVia->drmFD, pVIADRI->irqEnabled))) { -	xf86DrvMsg(pScreen->myNum, X_WARNING, -		   "[drm] Failure adding irq handler. " -		   "Falling back to irq-free operation.\n"); -	pVIADRI->irqEnabled = 0; -    } - -    if (pVIADRI->irqEnabled) -	xf86DrvMsg(pScreen->myNum, X_INFO, -		   "[drm] Irq handler installed, using IRQ %d.\n", -		   pVIADRI->irqEnabled); -} - -static void VIADRIIrqExit( DRIDriverContext *ctx ) { -    VIAPtr pVia = VIAPTR(ctx); -    VIADRIPtr pVIADRI = pVia->devPrivate; - -    if (pVIADRI->irqEnabled) { -	if (drmCtlUninstHandler(pVia->drmFD)) { -	    xf86DrvMsg(pScreen-myNum, X_INFO,"[drm] Irq handler uninstalled.\n"); -	} else { -	    xf86DrvMsg(pScreen->myNum, X_ERROR, -		       "[drm] Could not uninstall irq handler.\n"); -	} -    } -} -	     -static void VIADRIRingBufferCleanup(DRIDriverContext *ctx) -{ -    VIAPtr pVia = VIAPTR(ctx); -    VIADRIPtr pVIADRI = pVia->devPrivate; -    drm_via_dma_init_t ringBufInit; - -    if (pVIADRI->ringBufActive) { -	xf86DrvMsg(pScreen->myNum, X_INFO,  -		   "[drm] Cleaning up DMA ring-buffer.\n"); -	ringBufInit.func = VIA_CLEANUP_DMA; -	if (drmCommandWrite(pVia->drmFD, DRM_VIA_DMA_INIT, &ringBufInit, -			    sizeof(ringBufInit))) { -	    xf86DrvMsg(pScreen->myNum, X_WARNING,  -		       "[drm] Failed to clean up DMA ring-buffer: %d\n", errno); -	} -	pVIADRI->ringBufActive = 0; -    } -} - -static int VIADRIRingBufferInit(DRIDriverContext *ctx) -{ -    VIAPtr pVia = VIAPTR(ctx); -    VIADRIPtr pVIADRI = pVia->devPrivate; -    drm_via_dma_init_t ringBufInit; -    drmVersionPtr drmVer; - -    pVIADRI->ringBufActive = 0; - -    if (NULL == (drmVer = drmGetVersion(pVia->drmFD))) { -	return GL_FALSE; -    } - -    if (((drmVer->version_major <= 1) && (drmVer->version_minor <= 3))) { -	return GL_FALSE; -    }  - -    /* -     * Info frome code-snippet on DRI-DEVEL list; Erdi Chen. -     */ - -    switch (pVia->ChipId) { -    case PCI_CHIP_VT3259: -    	ringBufInit.reg_pause_addr = 0x40c; -	break; -    default: -    	ringBufInit.reg_pause_addr = 0x418; -	break; -    } -    -    ringBufInit.offset = pVia->agpSize; -    ringBufInit.size = AGP_CMDBUF_SIZE; -    ringBufInit.func = VIA_INIT_DMA; -    if (drmCommandWrite(pVia->drmFD, DRM_VIA_DMA_INIT, &ringBufInit, -			sizeof(ringBufInit))) { -	xf86DrvMsg(pScreen->myNum, X_ERROR,  -		   "[drm] Failed to initialize DMA ring-buffer: %d\n", errno); -	return GL_FALSE; -    } -    xf86DrvMsg(pScreen->myNum, X_INFO,  -	       "[drm] Initialized AGP ring-buffer, size 0x%lx at AGP offset 0x%lx.\n", -	       ringBufInit.size, ringBufInit.offset); -    -    pVIADRI->ringBufActive = 1; -    return GL_TRUE; -}	     - -static int VIADRIAgpInit(const DRIDriverContext *ctx, VIAPtr pVia) -{ -    unsigned long  agp_phys; -    drmAddress agpaddr; -    VIADRIPtr pVIADRI; -    pVIADRI = pVia->devPrivate; -    pVia->agpSize = 0; - -    if (drmAgpAcquire(pVia->drmFD) < 0) { -        xf86DrvMsg(pScreen->myNum, X_ERROR, "[drm] drmAgpAcquire failed %d\n", errno); -        return GL_FALSE; -    } - -    if (drmAgpEnable(pVia->drmFD, drmAgpGetMode(pVia->drmFD)&~0x0) < 0) { -         xf86DrvMsg(pScreen->myNum, X_ERROR, "[drm] drmAgpEnable failed\n"); -        return GL_FALSE; -    } -     -    xf86DrvMsg(pScreen->myNum, X_INFO, "[drm] drmAgpEnabled succeeded\n"); - -    if (drmAgpAlloc(pVia->drmFD, AGP_SIZE, 0, &agp_phys, &pVia->agpHandle) < 0) { -        xf86DrvMsg(pScreen->myNum, X_ERROR, -                 "[drm] drmAgpAlloc failed\n"); -        drmAgpRelease(pVia->drmFD); -        return GL_FALSE; -    } -    -    if (drmAgpBind(pVia->drmFD, pVia->agpHandle, 0) < 0) { -        xf86DrvMsg(pScreen->myNum, X_ERROR, -                 "[drm] drmAgpBind failed\n"); -        drmAgpFree(pVia->drmFD, pVia->agpHandle); -        drmAgpRelease(pVia->drmFD); - -        return GL_FALSE; -    } - -    /* -     * Place the ring-buffer last in the AGP region, and restrict the -     * public map not to include the buffer for security reasons. -     */ - -    pVia->agpSize = AGP_SIZE - AGP_CMDBUF_SIZE; -    pVia->agpAddr = drmAgpBase(pVia->drmFD); -    xf86DrvMsg(pScreen->myNum, X_INFO, -                 "[drm] agpAddr = 0x%08lx\n",pVia->agpAddr); -		  -    pVIADRI->agp.size = pVia->agpSize; -    if (drmAddMap(pVia->drmFD, (drm_handle_t)0, -                 pVIADRI->agp.size, DRM_AGP, 0,  -                 &pVIADRI->agp.handle) < 0) { -	xf86DrvMsg(pScreen->myNum, X_ERROR, -	    "[drm] Failed to map public agp area\n"); -        pVIADRI->agp.size = 0; -        return GL_FALSE; -    }   -    /* Map AGP from kernel to Xserver - Not really needed */ -    drmMap(pVia->drmFD, pVIADRI->agp.handle,pVIADRI->agp.size, &agpaddr); - -    xf86DrvMsg(pScreen->myNum, X_INFO,  -                "[drm] agpAddr = 0x%08lx\n", pVia->agpAddr); -    xf86DrvMsg(pScreen->myNum, X_INFO,  -                "[drm] agpSize = 0x%08lx\n", pVia->agpSize); -    xf86DrvMsg(pScreen->myNum, X_INFO,  -                "[drm] agp physical addr = 0x%08lx\n", agp_phys); - -    { -	drm_via_agp_t agp; -	agp.offset = 0; -	agp.size = AGP_SIZE-AGP_CMDBUF_SIZE; -	if (drmCommandWrite(pVia->drmFD, DRM_VIA_AGP_INIT, &agp, -			    sizeof(drm_via_agp_t)) < 0) { -	    drmUnmap(&agpaddr,pVia->agpSize); -	    drmRmMap(pVia->drmFD,pVIADRI->agp.handle); -	    drmAgpUnbind(pVia->drmFD, pVia->agpHandle); -	    drmAgpFree(pVia->drmFD, pVia->agpHandle); -	    drmAgpRelease(pVia->drmFD); -	    return GL_FALSE; -	} -    } - -    return GL_TRUE; -} - -static int VIADRIFBInit(DRIDriverContext * ctx, VIAPtr pVia) -{    -    int FBSize = pVia->FBFreeEnd-pVia->FBFreeStart; -    int FBOffset = pVia->FBFreeStart;  -    VIADRIPtr pVIADRI = pVia->devPrivate; -    pVIADRI->fbOffset = FBOffset; -    pVIADRI->fbSize = pVia->videoRambytes; - -    { -	drm_via_fb_t fb; -	fb.offset = FBOffset; -	fb.size = FBSize; -	 -	if (drmCommandWrite(pVia->drmFD, DRM_VIA_FB_INIT, &fb, -			    sizeof(drm_via_fb_t)) < 0) { -	    xf86DrvMsg(pScreen->myNum, X_ERROR, -		       "[drm] failed to init frame buffer area\n"); -	    return GL_FALSE; -	} else { -	    xf86DrvMsg(pScreen->myNum, X_INFO, -		       "[drm] FBFreeStart= 0x%08x FBFreeEnd= 0x%08x " -		       "FBSize= 0x%08x\n", -		       pVia->FBFreeStart, pVia->FBFreeEnd, FBSize); -	    return GL_TRUE;	 -	}    -    } -} - -static int VIADRIPciInit(DRIDriverContext * ctx, VIAPtr pVia) -{ -    return GL_TRUE;	 -} - -static int VIADRIScreenInit(DRIDriverContext * ctx) -{ -    VIAPtr pVia = VIAPTR(ctx); -    VIADRIPtr pVIADRI; -    int err; - -#if 0 -    ctx->shared.SAREASize = ((sizeof(drm_sarea_t) + 0xfff) & 0x1000); -#else -    if (sizeof(drm_sarea_t)+sizeof(drm_via_sarea_t) > SAREA_MAX) { -	xf86DrvMsg(pScrn->scrnIndex, X_ERROR, -			"Data does not fit in SAREA\n"); -	return GL_FALSE; -    } -    ctx->shared.SAREASize = SAREA_MAX; -#endif - -    ctx->drmFD = drmOpen(VIAKernelDriverName, NULL); -    if (ctx->drmFD < 0) { -        fprintf(stderr, "[drm] drmOpen failed\n"); -        return 0; -    } -    pVia->drmFD = ctx->drmFD; - -    err = drmSetBusid(ctx->drmFD, ctx->pciBusID); -    if (err < 0) { -        fprintf(stderr, "[drm] drmSetBusid failed (%d, %s), %s\n", -                ctx->drmFD, ctx->pciBusID, strerror(-err)); -        return 0; -    } - -    err = drmAddMap(ctx->drmFD, 0, ctx->shared.SAREASize, DRM_SHM, -                  DRM_CONTAINS_LOCK, &ctx->shared.hSAREA); -    if (err < 0) { -        fprintf(stderr, "[drm] drmAddMap failed\n"); -        return 0; -    } -    fprintf(stderr, "[drm] added %d byte SAREA at 0x%08lx\n", -            ctx->shared.SAREASize, ctx->shared.hSAREA); - -    if (drmMap(ctx->drmFD, -               ctx->shared.hSAREA, -               ctx->shared.SAREASize, -               (drmAddressPtr)(&ctx->pSAREA)) < 0) -    { -        fprintf(stderr, "[drm] drmMap failed\n"); -        return 0; -    } -    memset(ctx->pSAREA, 0, ctx->shared.SAREASize); -    fprintf(stderr, "[drm] mapped SAREA 0x%08lx to %p, size %d\n", -            ctx->shared.hSAREA, ctx->pSAREA, ctx->shared.SAREASize); - -    /* Need to AddMap the framebuffer and mmio regions here: -     */ -    if (drmAddMap(ctx->drmFD, -                  (drm_handle_t)ctx->FBStart, -                  ctx->FBSize, -                  DRM_FRAME_BUFFER, -#ifndef _EMBEDDED -                   0, -#else -                   DRM_READ_ONLY, -#endif -                   &ctx->shared.hFrameBuffer) < 0) -    { -        fprintf(stderr, "[drm] drmAddMap framebuffer failed\n"); -        return 0; -    } - -    fprintf(stderr, "[drm] framebuffer handle = 0x%08lx\n", -            ctx->shared.hFrameBuffer); - -    pVIADRI = (VIADRIPtr) CALLOC(sizeof(VIADRIRec)); -    if (!pVIADRI) { -        drmClose(ctx->drmFD); -        return GL_FALSE; -    } -    pVia->devPrivate = pVIADRI; -    ctx->driverClientMsg = pVIADRI; -    ctx->driverClientMsgSize = sizeof(*pVIADRI); - -    /* DRIScreenInit doesn't add all the common mappings.  Add additional mappings here. */ -    if (!VIADRIMapInit(ctx, pVia)) { -	VIADRICloseScreen(ctx); -	return GL_FALSE; -    } - -    pVIADRI->regs.size = VIA_MMIO_REGSIZE; -    pVIADRI->regs.handle = pVia->registerHandle; -    xf86DrvMsg(pScreen->myNum, X_INFO, "[drm] mmio Registers = 0x%08lx\n", -	pVIADRI->regs.handle); - -    if (drmMap(pVia->drmFD, -               pVIADRI->regs.handle, -               pVIADRI->regs.size, -               (drmAddress *)&pVia->MapBase) != 0) -    { -        VIADRICloseScreen(ctx); -        return GL_FALSE; -    } - -    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[dri] mmio mapped.\n" ); - -    VIAEnableMMIO(ctx); - -    /* Get video memory clock. */ -    VGAOUT8(0x3D4, 0x3D); -    pVia->MemClk = (VGAIN8(0x3D5) & 0xF0) >> 4; -    xf86DrvMsg(0, X_INFO, "[dri] MemClk (0x%x)\n", pVia->MemClk); - -    /* 3D rendering has noise if not enabled. */ -    VIAEnableExtendedFIFO(ctx); - -    VIAInitialize2DEngine(ctx); - -    /* Must disable MMIO or 3D won't work. */ -    VIADisableMMIO(ctx); - -    VIAInitialize3DEngine(ctx); - -    pVia->IsPCI = !VIADRIAgpInit(ctx, pVia); - -    if (pVia->IsPCI) { -        VIADRIPciInit(ctx, pVia); -	xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[dri] use pci.\n" ); -    } -    else -        xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[dri] use agp.\n" ); - -    if (!(VIADRIFBInit(ctx, pVia))) { -	VIADRICloseScreen(ctx); -        xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[dri] frame buffer initialize fail .\n" ); -        return GL_FALSE; -    } -     -    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[dri] frame buffer initialized.\n" ); -  -    return VIADRIFinishScreenInit(ctx); -} - -static void -VIADRICloseScreen(DRIDriverContext * ctx) -{ -    VIAPtr pVia = VIAPTR(ctx); -    VIADRIPtr pVIADRI=(VIADRIPtr)pVia->devPrivate; - -    VIADRIRingBufferCleanup(ctx); - -    if (pVia->MapBase) { -	xf86DrvMsg(pScreen->myNum, X_INFO, "[drm] Unmapping MMIO registers\n"); -        drmUnmap(pVia->MapBase, pVIADRI->regs.size); -    } - -    if (pVia->agpSize) { -	xf86DrvMsg(pScreen->myNum, X_INFO, "[drm] Freeing agp memory\n"); -        drmAgpFree(pVia->drmFD, pVia->agpHandle); -	xf86DrvMsg(pScreen->myNum, X_INFO, "[drm] Releasing agp module\n"); -    	drmAgpRelease(pVia->drmFD); -    } - -#if 0 -    if (pVia->DRIIrqEnable)  -#endif -        VIADRIIrqExit(ctx); -} - -static int -VIADRIFinishScreenInit(DRIDriverContext * ctx) -{ -    VIAPtr pVia = VIAPTR(ctx); -    VIADRIPtr pVIADRI; -    int err; - -    err = drmCreateContext(ctx->drmFD, &ctx->serverContext); -    if (err != 0) { -        fprintf(stderr, "%s: drmCreateContext failed %d\n", __FUNCTION__, err); -        return GL_FALSE; -    } - -    DRM_LOCK(ctx->drmFD, ctx->pSAREA, ctx->serverContext, 0); - - -    if (!VIADRIKernelInit(ctx, pVia)) { -	VIADRICloseScreen(ctx); -	return GL_FALSE; -    } -    xf86DrvMsg(pScreen->myNum, X_INFO, "[dri] kernel data initialized.\n"); - -    /* set SAREA value */ -    { -	drm_via_sarea_t *saPriv; - -	saPriv=(drm_via_sarea_t*)(((char*)ctx->pSAREA) + -                               sizeof(drm_sarea_t)); -	assert(saPriv); -	memset(saPriv, 0, sizeof(*saPriv)); -	saPriv->ctxOwner = -1; -    } -    pVIADRI=(VIADRIPtr)pVia->devPrivate; -    pVIADRI->deviceID=pVia->Chipset;   -    pVIADRI->width=ctx->shared.virtualWidth; -    pVIADRI->height=ctx->shared.virtualHeight; -    pVIADRI->mem=ctx->shared.fbSize; -    pVIADRI->bytesPerPixel= (ctx->bpp+7) / 8;  -    pVIADRI->sarea_priv_offset = sizeof(drm_sarea_t); -    /* TODO */ -    pVIADRI->scrnX=pVIADRI->width; -    pVIADRI->scrnY=pVIADRI->height; - -    /* Initialize IRQ */ -#if 0 -    if (pVia->DRIIrqEnable)  -#endif -	VIADRIIrqInit(ctx); -     -    pVIADRI->ringBufActive = 0; -    VIADRIRingBufferInit(ctx); - -    return GL_TRUE; -} - -/* Initialize the kernel data structures. */ -static int VIADRIKernelInit(DRIDriverContext * ctx, VIAPtr pVia) -{ -    drm_via_init_t drmInfo; -    memset(&drmInfo, 0, sizeof(drm_via_init_t)); -    drmInfo.sarea_priv_offset   = sizeof(drm_sarea_t); -    drmInfo.func = VIA_INIT_MAP; -    drmInfo.fb_offset           = pVia->FrameBufferBase; -    drmInfo.mmio_offset         = pVia->registerHandle; -    if (pVia->IsPCI) -	drmInfo.agpAddr = (uint32_t)NULL; -    else -	drmInfo.agpAddr = (uint32_t)pVia->agpAddr; - -    if ((drmCommandWrite(pVia->drmFD, DRM_VIA_MAP_INIT,&drmInfo, -			     sizeof(drm_via_init_t))) < 0) -	    return GL_FALSE; - -    return GL_TRUE; -} -/* Add a map for the MMIO registers */ -static int VIADRIMapInit(DRIDriverContext * ctx, VIAPtr pVia) -{ -    int flags = 0; - -    if (drmAddMap(pVia->drmFD, pVia->MmioBase, VIA_MMIO_REGSIZE, -		  DRM_REGISTERS, flags, &pVia->registerHandle) < 0) { -	return GL_FALSE; -    } - -    xf86DrvMsg(pScreen->myNum, X_INFO, -	"[drm] register handle = 0x%08lx\n", pVia->registerHandle); - -    return GL_TRUE; -} - -static int viaValidateMode(const DRIDriverContext *ctx) -{ -    VIAPtr pVia = VIAPTR(ctx); - -    return 1; -} - -static int viaPostValidateMode(const DRIDriverContext *ctx) -{ -    VIAPtr pVia = VIAPTR(ctx); - -    return 1; -} - -static void VIAEnableMMIO(DRIDriverContext * ctx) -{ -    /*vgaHWPtr hwp = VGAHWPTR(ctx);*/ -    VIAPtr pVia = VIAPTR(ctx); -    unsigned char val; - -#if 0 -    if (xf86IsPrimaryPci(pVia->PciInfo)) { -        /* If we are primary card, we still use std vga port. If we use -         * MMIO, system will hang in vgaHWSave when our card used in -         * PLE and KLE (integrated Trident MVP4) -         */ -        vgaHWSetStdFuncs(hwp); -    } -    else { -        vgaHWSetMmioFuncs(hwp, pVia->MapBase, 0x8000); -    } -#endif - -    val = VGAIN8(0x3c3); -    VGAOUT8(0x3c3, val | 0x01); -    val = VGAIN8(0x3cc); -    VGAOUT8(0x3c2, val | 0x01); - -    /* Unlock Extended IO Space */ -    VGAOUT8(0x3c4, 0x10); -    VGAOUT8(0x3c5, 0x01); - -    /* Enable MMIO */ -    if(!pVia->IsSecondary) { -	VGAOUT8(0x3c4, 0x1a); -	val = VGAIN8(0x3c5); -#ifdef DEBUG -	xf86DrvMsg(pScrn->scrnIndex, X_INFO, "primary val = %x\n", val); -#endif -	VGAOUT8(0x3c5, val | 0x68); -    } -    else { -	VGAOUT8(0x3c4, 0x1a); -	val = VGAIN8(0x3c5); -#ifdef DEBUG -	xf86DrvMsg(pScrn->scrnIndex, X_INFO, "secondary val = %x\n", val); -#endif -	VGAOUT8(0x3c5, val | 0x38); -    } - -    /* Unlock CRTC registers */ -    VGAOUT8(0x3d4, 0x47); -    VGAOUT8(0x3d5, 0x00); - -    return; -} - -static void VIADisableMMIO(DRIDriverContext * ctx) -{ -    VIAPtr pVia = VIAPTR(ctx); -    unsigned char val; - -    VGAOUT8(0x3c4, 0x1a); -    val = VGAIN8(0x3c5); -    VGAOUT8(0x3c5, val & 0x97); - -    return; -} - -static void VIADisableExtendedFIFO(DRIDriverContext *ctx) -{ -    VIAPtr  pVia = VIAPTR(ctx); -    uint32_t  dwGE230, dwGE298; - -    /* Cause of exit XWindow will dump back register value, others chipset no -     * need to set extended fifo value */ -    if (pVia->Chipset == VIA_CLE266 && pVia->ChipRev < 15 && -        (ctx->shared.virtualWidth > 1024 || pVia->HasSecondary)) { -        /* Turn off Extend FIFO */ -        /* 0x298[29] */ -        dwGE298 = VIAGETREG(0x298); -        VIASETREG(0x298, dwGE298 | 0x20000000); -        /* 0x230[21] */ -        dwGE230 = VIAGETREG(0x230); -        VIASETREG(0x230, dwGE230 & ~0x00200000); -        /* 0x298[29] */ -        dwGE298 = VIAGETREG(0x298); -        VIASETREG(0x298, dwGE298 & ~0x20000000); -    } -} - -static void VIAEnableExtendedFIFO(DRIDriverContext *ctx) -{ -    VIAPtr  pVia = VIAPTR(ctx); -    uint8_t   bRegTemp; -    uint32_t  dwGE230, dwGE298; - -    switch (pVia->Chipset) { -    case VIA_CLE266: -        if (pVia->ChipRev > 14) {  /* For 3123Cx */ -            if (pVia->HasSecondary) {  /* SAMM or DuoView case */ -                if (ctx->shared.virtualWidth >= 1024) -    	        { -    	            /* 3c5.16[0:5] */ -        	        VGAOUT8(0x3C4, 0x16); -            	    bRegTemp = VGAIN8(0x3C5); -    	            bRegTemp &= ~0x3F; -        	        bRegTemp |= 0x1C; -            	    VGAOUT8(0x3C5, bRegTemp); -        	        /* 3c5.17[0:6] */ -            	    VGAOUT8(0x3C4, 0x17); -                	bRegTemp = VGAIN8(0x3C5); -    	            bRegTemp &= ~0x7F; -        	        bRegTemp |= 0x3F; -            	    VGAOUT8(0x3C5, bRegTemp); -            	    pVia->EnableExtendedFIFO = GL_TRUE; -    	        } -            } -            else   /* Single view or Simultaneoue case */ -            { -                if (ctx->shared.virtualWidth > 1024) -    	        { -    	            /* 3c5.16[0:5] */ -        	        VGAOUT8(0x3C4, 0x16); -            	    bRegTemp = VGAIN8(0x3C5); -    	            bRegTemp &= ~0x3F; -        	        bRegTemp |= 0x17; -            	    VGAOUT8(0x3C5, bRegTemp); -        	        /* 3c5.17[0:6] */ -            	    VGAOUT8(0x3C4, 0x17); -                	bRegTemp = VGAIN8(0x3C5); -    	            bRegTemp &= ~0x7F; -        	        bRegTemp |= 0x2F; -            	    VGAOUT8(0x3C5, bRegTemp); -            	    pVia->EnableExtendedFIFO = GL_TRUE; -    	        } -            } -            /* 3c5.18[0:5] */ -            VGAOUT8(0x3C4, 0x18); -            bRegTemp = VGAIN8(0x3C5); -            bRegTemp &= ~0x3F; -            bRegTemp |= 0x17; -            bRegTemp |= 0x40;  /* force the preq always higher than treq */ -            VGAOUT8(0x3C5, bRegTemp); -        } -        else {      /* for 3123Ax */ -            if (ctx->shared.virtualWidth > 1024 || pVia->HasSecondary) { -                /* Turn on Extend FIFO */ -                /* 0x298[29] */ -                dwGE298 = VIAGETREG(0x298); -                VIASETREG(0x298, dwGE298 | 0x20000000); -                /* 0x230[21] */ -                dwGE230 = VIAGETREG(0x230); -                VIASETREG(0x230, dwGE230 | 0x00200000); -                /* 0x298[29] */ -                dwGE298 = VIAGETREG(0x298); -                VIASETREG(0x298, dwGE298 & ~0x20000000); - -                /* 3c5.16[0:5] */ -                VGAOUT8(0x3C4, 0x16); -                bRegTemp = VGAIN8(0x3C5); -                bRegTemp &= ~0x3F; -                bRegTemp |= 0x17; -                /* bRegTemp |= 0x10; */ -                VGAOUT8(0x3C5, bRegTemp); -                /* 3c5.17[0:6] */ -                VGAOUT8(0x3C4, 0x17); -                bRegTemp = VGAIN8(0x3C5); -                bRegTemp &= ~0x7F; -                bRegTemp |= 0x2F; -                /*bRegTemp |= 0x1F;*/ -                VGAOUT8(0x3C5, bRegTemp); -                /* 3c5.18[0:5] */ -                VGAOUT8(0x3C4, 0x18); -                bRegTemp = VGAIN8(0x3C5); -                bRegTemp &= ~0x3F; -                bRegTemp |= 0x17; -                bRegTemp |= 0x40;  /* force the preq always higher than treq */ -                VGAOUT8(0x3C5, bRegTemp); -          	    pVia->EnableExtendedFIFO = GL_TRUE; -            } -        } -        break; -    case VIA_KM400: -        if (pVia->HasSecondary) {  /* SAMM or DuoView case */ -            if ((ctx->shared.virtualWidth >= 1600) && -                (pVia->MemClk <= VIA_MEM_DDR200)) { -        	    /* enable CRT extendded FIFO */ -            	VGAOUT8(0x3C4, 0x17); -                VGAOUT8(0x3C5, 0x1C); -    	        /* revise second display queue depth and read threshold */ -        	    VGAOUT8(0x3C4, 0x16); -            	bRegTemp = VGAIN8(0x3C5); -    	        bRegTemp &= ~0x3F; -    	        bRegTemp = (bRegTemp) | (0x09); -                VGAOUT8(0x3C5, bRegTemp); -            } -            else { -                /* enable CRT extendded FIFO */ -                VGAOUT8(0x3C4, 0x17); -                VGAOUT8(0x3C5,0x3F); -                /* revise second display queue depth and read threshold */ -                VGAOUT8(0x3C4, 0x16); -                bRegTemp = VGAIN8(0x3C5); -                bRegTemp &= ~0x3F; -                bRegTemp = (bRegTemp) | (0x1C); -                VGAOUT8(0x3C5, bRegTemp); -            } -            /* 3c5.18[0:5] */ -            VGAOUT8(0x3C4, 0x18); -            bRegTemp = VGAIN8(0x3C5); -            bRegTemp &= ~0x3F; -            bRegTemp |= 0x17; -            bRegTemp |= 0x40;  /* force the preq always higher than treq */ -            VGAOUT8(0x3C5, bRegTemp); -       	    pVia->EnableExtendedFIFO = GL_TRUE; -        } -        else { -            if ( (ctx->shared.virtualWidth > 1024) && (ctx->shared.virtualWidth <= 1280) ) -            { -                /* enable CRT extendded FIFO */ -                VGAOUT8(0x3C4, 0x17); -                VGAOUT8(0x3C5, 0x3F); -                /* revise second display queue depth and read threshold */ -                VGAOUT8(0x3C4, 0x16); -                bRegTemp = VGAIN8(0x3C5); -                bRegTemp &= ~0x3F; -                bRegTemp = (bRegTemp) | (0x17); -                VGAOUT8(0x3C5, bRegTemp); -           	    pVia->EnableExtendedFIFO = GL_TRUE; -            } -            else if ((ctx->shared.virtualWidth > 1280)) -            { -                /* enable CRT extendded FIFO */ -                VGAOUT8(0x3C4, 0x17); -                VGAOUT8(0x3C5, 0x3F); -                /* revise second display queue depth and read threshold */ -                VGAOUT8(0x3C4, 0x16); -                bRegTemp = VGAIN8(0x3C5); -                bRegTemp &= ~0x3F; -                bRegTemp = (bRegTemp) | (0x1C); -                VGAOUT8(0x3C5, bRegTemp); -           	    pVia->EnableExtendedFIFO = GL_TRUE; -            } -            else -            { -                /* enable CRT extendded FIFO */ -                VGAOUT8(0x3C4, 0x17); -                VGAOUT8(0x3C5, 0x3F); -                /* revise second display queue depth and read threshold */ -                VGAOUT8(0x3C4, 0x16); -                bRegTemp = VGAIN8(0x3C5); -                bRegTemp &= ~0x3F; -                bRegTemp = (bRegTemp) | (0x10); -                VGAOUT8(0x3C5, bRegTemp); -            } -            /* 3c5.18[0:5] */ -            VGAOUT8(0x3C4, 0x18); -            bRegTemp = VGAIN8(0x3C5); -            bRegTemp &= ~0x3F; -            bRegTemp |= 0x17; -            bRegTemp |= 0x40;  /* force the preq always higher than treq */ -            VGAOUT8(0x3C5, bRegTemp); -        } -        break; -    case VIA_K8M800: -        /*=* R1 Display FIFO depth (384 /8 -1 -> 0xbf) SR17[7:0] (8bits) *=*/ -        VGAOUT8(0x3c4, 0x17); -        VGAOUT8(0x3c5, 0xbf); - -        /*=* R2 Display fetch datum threshold value (328/4 -> 0x52) -             SR16[5:0], SR16[7] (7bits) *=*/ -        VGAOUT8(0x3c4, 0x16); -        bRegTemp = VGAIN8(0x3c5) & ~0xBF; -        bRegTemp |= (0x52 & 0x3F); -        bRegTemp |= ((0x52 & 0x40) << 1); -        VGAOUT8(0x3c5, bRegTemp); - -        /*=* R3 Switch to the highest agent threshold value (74 -> 0x4a) -             SR18[5:0], SR18[7] (7bits) *=*/ -        VGAOUT8(0x3c4, 0x18); -        bRegTemp = VGAIN8(0x3c5) & ~0xBF; -        bRegTemp |= (0x4a & 0x3F); -        bRegTemp |= ((0x4a & 0x40) << 1); -        VGAOUT8(0x3c5, bRegTemp); -#if 0 -        /*=* R4 Fetch Number for a scan line (unit: 8 bytes) -             SR1C[7:0], SR1D[1:0] (10bits) *=*/ -        wRegTemp = (pBIOSInfo->offsetWidthByQWord >> 1) + 4; -        VGAOUT8(0x3c4, 0x1c); -        VGAOUT8(0x3c5, (uint8_t)(wRegTemp & 0xFF)); -        VGAOUT8(0x3c4, 0x1d); -        bRegTemp = VGAIN8(0x3c5) & ~0x03; -        VGAOUT8(0x3c5, bRegTemp | ((wRegTemp & 0x300) >> 8)); -#endif -        if (ctx->shared.virtualWidth >= 1400 && ctx->bpp == 32) -        { -            /*=* Max. length for a request SR22[4:0] (64/4 -> 0x10) *=*/ -            VGAOUT8(0x3c4, 0x22); -            bRegTemp = VGAIN8(0x3c5) & ~0x1F; -            VGAOUT8(0x3c5, bRegTemp | 0x10); -        } -        else -        { -            /*=* Max. length for a request SR22[4:0] -                 (128/4 -> over flow 0x0) *=*/ -            VGAOUT8(0x3c4, 0x22); -            bRegTemp = VGAIN8(0x3c5) & ~0x1F; -            VGAOUT8(0x3c5, bRegTemp); -        } -        break; -    case VIA_PM800: -        /*=* R1 Display FIFO depth (96-1 -> 0x5f) SR17[7:0] (8bits) *=*/ -        VGAOUT8(0x3c4, 0x17); -        VGAOUT8(0x3c5, 0x5f); - -        /*=* R2 Display fetch datum threshold value (32 -> 0x20) -             SR16[5:0], SR16[7] (7bits) *=*/ -        VGAOUT8(0x3c4, 0x16); -        bRegTemp = VGAIN8(0x3c5) & ~0xBF; -        bRegTemp |= (0x20 & 0x3F); -        bRegTemp |= ((0x20 & 0x40) << 1); -        VGAOUT8(0x3c5, bRegTemp); - -        /*=* R3 Switch to the highest agent threshold value (16 -> 0x10) -             SR18[5:0], SR18[7] (7bits) *=*/ -        VGAOUT8(0x3c4, 0x18); -        bRegTemp = VGAIN8(0x3c5) & ~0xBF; -        bRegTemp |= (0x10 & 0x3F); -        bRegTemp |= ((0x10 & 0x40) << 1); -        VGAOUT8(0x3c5, bRegTemp); -#if 0 -        /*=* R4 Fetch Number for a scan line (unit: 8 bytes) -             SR1C[7:0], SR1D[1:0] (10bits) *=*/ -        wRegTemp = (pBIOSInfo->offsetWidthByQWord >> 1) + 4; -        VGAOUT8(0x3c4, 0x1c); -        VGAOUT8(0x3c5, (uint8_t)(wRegTemp & 0xFF)); -        VGAOUT8(0x3c4, 0x1d); -        bRegTemp = VGAIN8(0x3c5) & ~0x03; -        VGAOUT8(0x3c5, bRegTemp | ((wRegTemp & 0x300) >> 8)); -#endif -        if (ctx->shared.virtualWidth >= 1400 && ctx->bpp == 32) -        { -            /*=* Max. length for a request SR22[4:0] (64/4 -> 0x10) *=*/ -            VGAOUT8(0x3c4, 0x22); -            bRegTemp = VGAIN8(0x3c5) & ~0x1F; -            VGAOUT8(0x3c5, bRegTemp | 0x10); -        } -        else -        { -            /*=* Max. length for a request SR22[4:0] (0x1F) *=*/ -            VGAOUT8(0x3c4, 0x22); -            bRegTemp = VGAIN8(0x3c5) & ~0x1F; -            VGAOUT8(0x3c5, bRegTemp | 0x1F); -        } -        break; -    default: -        break; -    } -} - -static void VIAInitialize2DEngine(DRIDriverContext *ctx) -{ -    VIAPtr  pVia = VIAPTR(ctx); -    uint32_t  dwVQStartAddr, dwVQEndAddr; -    uint32_t  dwVQLen, dwVQStartL, dwVQEndL, dwVQStartEndH; -    uint32_t  dwGEMode; - -    /* init 2D engine regs to reset 2D engine */ -    VIASETREG(0x04, 0x0); -    VIASETREG(0x08, 0x0); -    VIASETREG(0x0c, 0x0); -    VIASETREG(0x10, 0x0); -    VIASETREG(0x14, 0x0); -    VIASETREG(0x18, 0x0); -    VIASETREG(0x1c, 0x0); -    VIASETREG(0x20, 0x0); -    VIASETREG(0x24, 0x0); -    VIASETREG(0x28, 0x0); -    VIASETREG(0x2c, 0x0); -    VIASETREG(0x30, 0x0); -    VIASETREG(0x34, 0x0); -    VIASETREG(0x38, 0x0); -    VIASETREG(0x3c, 0x0); -    VIASETREG(0x40, 0x0); - -    VIADisableMMIO(ctx); - -    /* Init AGP and VQ regs */ -    VIASETREG(0x43c, 0x00100000); -    VIASETREG(0x440, 0x00000000); -    VIASETREG(0x440, 0x00333004); -    VIASETREG(0x440, 0x60000000); -    VIASETREG(0x440, 0x61000000); -    VIASETREG(0x440, 0x62000000); -    VIASETREG(0x440, 0x63000000); -    VIASETREG(0x440, 0x64000000); -    VIASETREG(0x440, 0x7D000000); - -    VIASETREG(0x43c, 0xfe020000); -    VIASETREG(0x440, 0x00000000); - -    if (pVia->VQStart != 0) { -        /* Enable VQ */ -        dwVQStartAddr = pVia->VQStart; -        dwVQEndAddr = pVia->VQEnd; -        dwVQStartL = 0x50000000 | (dwVQStartAddr & 0xFFFFFF); -        dwVQEndL = 0x51000000 | (dwVQEndAddr & 0xFFFFFF); -        dwVQStartEndH = 0x52000000 | ((dwVQStartAddr & 0xFF000000) >> 24) | -                        ((dwVQEndAddr & 0xFF000000) >> 16); -        dwVQLen = 0x53000000 | (VIA_VQ_SIZE >> 3); - -        VIASETREG(0x43c, 0x00fe0000); -        VIASETREG(0x440, 0x080003fe); -        VIASETREG(0x440, 0x0a00027c); -        VIASETREG(0x440, 0x0b000260); -        VIASETREG(0x440, 0x0c000274); -        VIASETREG(0x440, 0x0d000264); -        VIASETREG(0x440, 0x0e000000); -        VIASETREG(0x440, 0x0f000020); -        VIASETREG(0x440, 0x1000027e); -        VIASETREG(0x440, 0x110002fe); -        VIASETREG(0x440, 0x200f0060); - -        VIASETREG(0x440, 0x00000006); -        VIASETREG(0x440, 0x40008c0f); -        VIASETREG(0x440, 0x44000000); -        VIASETREG(0x440, 0x45080c04); -        VIASETREG(0x440, 0x46800408); - -        VIASETREG(0x440, dwVQStartEndH); -        VIASETREG(0x440, dwVQStartL); -        VIASETREG(0x440, dwVQEndL); -        VIASETREG(0x440, dwVQLen); -    } -    else { -        /* Diable VQ */ -        VIASETREG(0x43c, 0x00fe0000); -        VIASETREG(0x440, 0x00000004); -        VIASETREG(0x440, 0x40008c0f); -        VIASETREG(0x440, 0x44000000); -        VIASETREG(0x440, 0x45080c04); -        VIASETREG(0x440, 0x46800408); -    } - -    dwGEMode = 0; - -    switch (ctx->bpp) { -    case 16: -        dwGEMode |= VIA_GEM_16bpp; -        break; -    case 32: -        dwGEMode |= VIA_GEM_32bpp; -        break; -    default: -        dwGEMode |= VIA_GEM_8bpp; -        break; -    } - -#if 0 -    switch (ctx->shared.virtualWidth) { -    case 800: -        dwGEMode |= VIA_GEM_800; -        break; -    case 1024: -        dwGEMode |= VIA_GEM_1024; -        break; -    case 1280: -        dwGEMode |= VIA_GEM_1280; -        break; -    case 1600: -        dwGEMode |= VIA_GEM_1600; -        break; -    case 2048: -        dwGEMode |= VIA_GEM_2048; -        break; -    default: -        dwGEMode |= VIA_GEM_640; -        break; -    } -#endif -     -    VIAEnableMMIO(ctx); - -    /* Set BPP and Pitch */ -    VIASETREG(VIA_REG_GEMODE, dwGEMode); - -    /* Set Src and Dst base address and pitch, pitch is qword */ -    VIASETREG(VIA_REG_SRCBASE, 0x0); -    VIASETREG(VIA_REG_DSTBASE, 0x0); -    VIASETREG(VIA_REG_PITCH, VIA_PITCH_ENABLE | -              ((ctx->shared.virtualWidth * ctx->bpp >> 3) >> 3) | -              (((ctx->shared.virtualWidth * ctx->bpp >> 3) >> 3) << 16)); -} - -static int b3DRegsInitialized = 0; - -static void VIAInitialize3DEngine(DRIDriverContext *ctx) -{ -    VIAPtr  pVia = VIAPTR(ctx); -    int i; - -    if (!b3DRegsInitialized) -    { - -        VIASETREG(0x43C, 0x00010000); - -        for (i = 0; i <= 0x7D; i++) -        { -            VIASETREG(0x440, (uint32_t) i << 24); -        } - -        VIASETREG(0x43C, 0x00020000); - -        for (i = 0; i <= 0x94; i++) -        { -            VIASETREG(0x440, (uint32_t) i << 24); -        } - -        VIASETREG(0x440, 0x82400000); - -        VIASETREG(0x43C, 0x01020000); - - -        for (i = 0; i <= 0x94; i++) -        { -            VIASETREG(0x440, (uint32_t) i << 24); -        } - -        VIASETREG(0x440, 0x82400000); -        VIASETREG(0x43C, 0xfe020000); - -        for (i = 0; i <= 0x03; i++) -        { -            VIASETREG(0x440, (uint32_t) i << 24); -        } - -        VIASETREG(0x43C, 0x00030000); - -        for (i = 0; i <= 0xff; i++) -        { -            VIASETREG(0x440, 0); -        } -        VIASETREG(0x43C, 0x00100000); -        VIASETREG(0x440, 0x00333004); -        VIASETREG(0x440, 0x10000002); -        VIASETREG(0x440, 0x60000000); -        VIASETREG(0x440, 0x61000000); -        VIASETREG(0x440, 0x62000000); -        VIASETREG(0x440, 0x63000000); -        VIASETREG(0x440, 0x64000000); - -        VIASETREG(0x43C, 0x00fe0000); - -        if (pVia->ChipRev >= 3 ) -            VIASETREG(0x440,0x40008c0f); -        else -            VIASETREG(0x440,0x4000800f); - -        VIASETREG(0x440,0x44000000); -        VIASETREG(0x440,0x45080C04); -        VIASETREG(0x440,0x46800408); -        VIASETREG(0x440,0x50000000); -        VIASETREG(0x440,0x51000000); -        VIASETREG(0x440,0x52000000); -        VIASETREG(0x440,0x53000000); - -        b3DRegsInitialized = 1; -        xf86DrvMsg(pScrn->scrnIndex, X_INFO, -                   "3D Engine has been initialized.\n"); -    } - -    VIASETREG(0x43C,0x00fe0000); -    VIASETREG(0x440,0x08000001); -    VIASETREG(0x440,0x0A000183); -    VIASETREG(0x440,0x0B00019F); -    VIASETREG(0x440,0x0C00018B); -    VIASETREG(0x440,0x0D00019B); -    VIASETREG(0x440,0x0E000000); -    VIASETREG(0x440,0x0F000000); -    VIASETREG(0x440,0x10000000); -    VIASETREG(0x440,0x11000000); -    VIASETREG(0x440,0x20000000); -} - -static int -WaitIdleCLE266(VIAPtr pVia) -{ -    int loop = 0; - -    /*mem_barrier();*/ - -    while (!(VIAGETREG(VIA_REG_STATUS) & VIA_VR_QUEUE_BUSY) && (loop++ < MAXLOOP)) -        ; - -    while ((VIAGETREG(VIA_REG_STATUS) & -          (VIA_CMD_RGTR_BUSY | VIA_2D_ENG_BUSY | VIA_3D_ENG_BUSY)) && -          (loop++ < MAXLOOP)) -        ; - -    return loop >= MAXLOOP; -} - -static int viaInitFBDev(DRIDriverContext *ctx) -{ -    VIAPtr pVia = CALLOC(sizeof(*pVia)); - -    ctx->driverPrivate = (void *)pVia; - -    switch (ctx->chipset) { -    case PCI_CHIP_CLE3122: -    case PCI_CHIP_CLE3022: -        pVia->Chipset = VIA_CLE266; -        break; -    case PCI_CHIP_VT7205: -    case PCI_CHIP_VT3205: -        pVia->Chipset = VIA_KM400; -        break; -    case PCI_CHIP_VT3204: -    case PCI_CHIP_VT3344: -        pVia->Chipset = VIA_K8M800; -        break; -    case PCI_CHIP_VT3259: -        pVia->Chipset = VIA_PM800; -        break; -    default: -        xf86DrvMsg(0, X_ERROR, "VIA: Unknown device ID (0x%x)\n", ctx->chipset); -    } - -    /* _SOLO TODO XXX need to read ChipRev too */ -    pVia->ChipRev = 0; - -    pVia->videoRambytes = ctx->shared.fbSize; -    pVia->MmioBase = ctx->MMIOStart; -    pVia->FrameBufferBase = ctx->FBStart & 0xfc000000; - -    pVia->FBFreeStart = ctx->shared.virtualWidth * ctx->cpp * -        ctx->shared.virtualHeight; - -#if 1 -    /* Alloc a second framebuffer for the second head */ -    pVia->FBFreeStart += ctx->shared.virtualWidth * ctx->cpp * -	ctx->shared.virtualHeight; -#endif - -    pVia->VQStart = pVia->FBFreeStart; -    pVia->VQEnd = pVia->FBFreeStart + VIA_VQ_SIZE - 1; - -    pVia->FBFreeStart += VIA_VQ_SIZE; - -    pVia->FBFreeEnd = pVia->videoRambytes; - -    if (!VIADRIScreenInit(ctx)) -        return 0; - -    return 1; -} - -static void viaHaltFBDev(DRIDriverContext *ctx) -{ -    drmUnmap( ctx->pSAREA, ctx->shared.SAREASize ); -    drmClose(ctx->drmFD); - -    if (ctx->driverPrivate) { -        free(ctx->driverPrivate); -        ctx->driverPrivate = 0; -    } -} - -static int viaEngineShutdown(const DRIDriverContext *ctx) -{ -    return 1; -} - -static int viaEngineRestore(const DRIDriverContext *ctx) -{ -    return 1; -} - -const struct DRIDriverRec __driDriver = -{ -    viaValidateMode, -    viaPostValidateMode, -    viaInitFBDev, -    viaHaltFBDev, -    viaEngineShutdown, -    viaEngineRestore,   -    0, -}; - diff --git a/src/mesa/drivers/glslcompiler/glslcompiler.c b/src/mesa/drivers/glslcompiler/glslcompiler.c index 66035a4a43..d58f32b293 100644 --- a/src/mesa/drivers/glslcompiler/glslcompiler.c +++ b/src/mesa/drivers/glslcompiler/glslcompiler.c @@ -68,6 +68,7 @@ static const char *Prog = "glslcompiler";  struct options {     GLboolean LineNumbers; +   GLboolean Link;     gl_prog_print_mode Mode;     const char *VertFile;     const char *FragFile; @@ -207,23 +208,29 @@ ReadShader(GLuint shader, const char *filename)  } -#if 0  static void -CheckLink(GLuint prog) +CheckLink(GLuint v_shader, GLuint f_shader)  { +   GLuint prog;     GLint stat; + +   prog = _mesa_CreateProgram(); + +   _mesa_AttachShader(prog, v_shader); +   _mesa_AttachShader(prog, f_shader); + +   _mesa_LinkProgramARB(prog);     _mesa_GetProgramiv(prog, GL_LINK_STATUS, &stat);     if (!stat) {        GLchar log[1000];        GLsizei len;        _mesa_GetProgramInfoLog(prog, 1000, &len, log); -      fprintf(stderr, "%s: Linker error:\n%s\n", Prog, log); +      fprintf(stderr, "Linker error:\n%s\n", log);     }     else { -      fprintf(stderr, "%s: Link success!\n", Prog); +      fprintf(stderr, "Link success!\n");     }  } -#endif  static void @@ -262,6 +269,7 @@ Usage(void)     printf("  --fs FILE          fragment shader input filename\n");     printf("  --arb              emit ARB-style instructions\n");     printf("  --nv               emit NV-style instructions\n"); +   printf("  --link             run linker\n");     printf("  --debug            force #pragma debug(on)\n");     printf("  --nodebug          force #pragma debug(off)\n");     printf("  --opt              force #pragma optimize(on)\n"); @@ -309,6 +317,9 @@ ParseOptions(int argc, char *argv[])        else if (strcmp(argv[i], "--nv") == 0) {           Options.Mode = PROG_PRINT_NV;        } +      else if (strcmp(argv[i], "--link") == 0) { +         Options.Link = GL_TRUE; +      }        else if (strcmp(argv[i], "--debug") == 0) {           Options.Pragmas.IgnoreDebug = GL_TRUE;           Options.Pragmas.Debug = GL_TRUE; @@ -358,7 +369,7 @@ ParseOptions(int argc, char *argv[])  int  main(int argc, char *argv[])  { -   GLuint shader = 0; +   GLuint v_shader = 0, f_shader = 0;     ParseOptions(argc, argv); @@ -368,24 +379,38 @@ main(int argc, char *argv[])     }     if (Options.VertFile) { -      shader = CompileShader(Options.VertFile, GL_VERTEX_SHADER); +      v_shader = CompileShader(Options.VertFile, GL_VERTEX_SHADER);     } -   else if (Options.FragFile) { -      shader = CompileShader(Options.FragFile, GL_FRAGMENT_SHADER); + +   if (Options.FragFile) { +      f_shader = CompileShader(Options.FragFile, GL_FRAGMENT_SHADER);     } -   if (shader) { +   if (v_shader || f_shader) {        if (Options.OutputFile) {           fclose(stdout);           /*stdout =*/ freopen(Options.OutputFile, "w", stdout);        } -      if (stdout) { -         PrintShaderInstructions(shader, stdout); +      if (stdout && v_shader) { +         PrintShaderInstructions(v_shader, stdout); +      } +      if (stdout && f_shader) { +         PrintShaderInstructions(f_shader, stdout);        }        if (Options.OutputFile) {           fclose(stdout);        }     } +   if (Options.Link) { +      if (!v_shader || !f_shader) { +         fprintf(stderr, +                 "--link option requires both a vertex and fragment shader.\n"); +         exit(1); +      } + +      CheckLink(v_shader, f_shader); +   } +     return 0;  }  | 
