diff options
Diffstat (limited to 'src/mesa/drivers/dri')
299 files changed, 6705 insertions, 33819 deletions
diff --git a/src/mesa/drivers/dri/Makefile.template b/src/mesa/drivers/dri/Makefile.template index 39d25ce3f47..a0c25d26cdf 100644 --- a/src/mesa/drivers/dri/Makefile.template +++ b/src/mesa/drivers/dri/Makefile.template @@ -14,28 +14,11 @@ COMMON_SOURCES = $(COMMON_GALLIUM_SOURCES) \ ../common/drirenderbuffer.c \ ../common/dri_metaops.c -ifeq ($(WINDOW_SYSTEM),dri) -WINOBJ= -WINLIB= INCLUDES = $(SHARED_INCLUDES) $(EXPAT_INCLUDES) OBJECTS = $(C_SOURCES:.c=.o) \ $(ASM_SOURCES:.S=.o) -else -# miniglx -WINOBJ= -WINLIB=-L$(MESA)/src/glx/mini -MINIGLX_INCLUDES = -I$(TOP)/src/glx/mini -INCLUDES = $(MINIGLX_INCLUDES) \ - $(SHARED_INCLUDES) \ - $(PCIACCESS_CFLAGS) - -OBJECTS = $(C_SOURCES:.c=.o) \ - $(MINIGLX_SOURCES:.c=.o) \ - $(ASM_SOURCES:.S=.o) -endif - ### Include directories SHARED_INCLUDES = \ @@ -55,7 +38,7 @@ SHARED_INCLUDES = \ $(CC) -c $(INCLUDES) $(CFLAGS) $(DRIVER_DEFINES) $< -o $@ .S.o: - $(CC) -c $(INCLUDES) $(CFLAGS) $(DRIVER_DEFINES) $< -o $@ + $(CC) -c $(INCLUDES) $(CFLAGS) $(DRIVER_DEFINES) $< -o $@ ##### TARGETS ##### @@ -67,11 +50,10 @@ default: subdirs lib lib: symlinks subdirs depend @$(MAKE) $(LIBNAME) $(TOP)/$(LIB_DIR)/$(LIBNAME) -$(LIBNAME): $(OBJECTS) $(MESA_MODULES) $(EXTRA_MODULES) $(WINOBJ) Makefile \ +$(LIBNAME): $(OBJECTS) $(MESA_MODULES) $(EXTRA_MODULES) Makefile \ $(TOP)/src/mesa/drivers/dri/Makefile.template $(MKLIB) -o $@ -noprefix -linker '$(CC)' -ldflags '$(LDFLAGS)' \ - $(OBJECTS) $(MESA_MODULES) $(EXTRA_MODULES) $(WINOBJ) \ - $(DRI_LIB_DEPS) + $(OBJECTS) $(MESA_MODULES) $(EXTRA_MODULES) $(DRI_LIB_DEPS) $(TOP)/$(LIB_DIR)/$(LIBNAME): $(LIBNAME) diff --git a/src/mesa/drivers/dri/common/dri_sw.c b/src/mesa/drivers/dri/common/dri_sw.c new file mode 100644 index 00000000000..b7f9036f473 --- /dev/null +++ b/src/mesa/drivers/dri/common/dri_sw.c @@ -0,0 +1,267 @@ +/* + * Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. + * All Rights Reserved. + * Copyright 2010 George Sapountzis <[email protected]> + * + * 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 dri_sw.c + * + * DRISW utility functions, i.e. dri_util.c stripped from drm-specific bits. + */ + +#include "dri_sw.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->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) { + 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; + + dri_get_drawable(pdp); + + if (!driDriverAPI.CreateBuffer(psp, pdp, &config->modes, GL_FALSE)) { + FREE(pdp); + return NULL; + } + + 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/dri_sw.h b/src/mesa/drivers/dri/common/dri_sw.h new file mode 100644 index 00000000000..e353e26b34d --- /dev/null +++ b/src/mesa/drivers/dri/common/dri_sw.h @@ -0,0 +1,112 @@ +/* + * Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. + * All Rights Reserved. + * Copyright 2010 George Sapountzis <[email protected]> + * + * 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. + */ + + +#ifndef _DRI_SW_H +#define _DRI_SW_H + +#include <GL/gl.h> +#include <GL/internal/glcore.h> +#include <GL/internal/dri_interface.h> + + +/** + * Extensions + */ +extern const __DRIcoreExtension driCoreExtension; +extern const __DRIswrastExtension driSWRastExtension; + + +/** + * 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; + + __DRIscreen *driScreenPriv; + + int refcount; +}; + + +/** + * 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; + +#endif /* _DRI_SW_H */ diff --git a/src/mesa/drivers/dri/common/dri_util.c b/src/mesa/drivers/dri/common/dri_util.c index 9142dd72f5a..badbb5ff824 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 ) { @@ -127,6 +105,7 @@ static int driUnbindContext(__DRIcontext *pcp) /* Let driver unbind drawable from context */ (*psp->DriverAPI.UnbindContext)(pcp); + assert(pdp); if (pdp->refcount == 0) { /* ERROR!!! */ return GL_FALSE; @@ -189,6 +168,7 @@ static int driBindContext(__DRIcontext *pcp, ** initialize the drawable information if has not been done before. */ + assert(psp); if (!psp->dri2.enabled) { if (pdp && !pdp->pStamp) { DRM_SPINLOCK(&psp->pSAREA->drawable_lock, psp->drawLockID); @@ -675,6 +655,8 @@ setupLoaderExtensions(__DRIscreen *psp, psp->systemTime = (__DRIsystemTimeExtension *) extensions[i]; if (strcmp(extensions[i]->name, __DRI_DRI2_LOADER) == 0) psp->dri2.loader = (__DRIdri2LoaderExtension *) extensions[i]; + if (strcmp(extensions[i]->name, __DRI_IMAGE_LOOKUP) == 0) + psp->dri2.image = (__DRIimageLookupExtension *) extensions[i]; } } @@ -694,7 +676,7 @@ setupLoaderExtensions(__DRIscreen *psp, * \param drm_version Version of the kernel DRM. * \param frame_buffer Data describing the location and layout of the * framebuffer. - * \param pSAREA Pointer the the SAREA. + * \param pSAREA Pointer to the SAREA. * \param fd Device handle for the DRM. * \param extensions ?? * \param driver_modes Returns modes suppoted by the driver diff --git a/src/mesa/drivers/dri/common/dri_util.h b/src/mesa/drivers/dri/common/dri_util.h index 2eadb9ac8c5..f63583cebc0 100644 --- a/src/mesa/drivers/dri/common/dri_util.h +++ b/src/mesa/drivers/dri/common/dri_util.h @@ -544,6 +544,7 @@ struct __DRIscreenRec { * fields will not be valid or initializaed in that case. */ int enabled; __DRIdri2LoaderExtension *loader; + __DRIimageLookupExtension *image; } dri2; /* The lock actually in use, old sarea or DRI2 */ @@ -551,10 +552,6 @@ struct __DRIscreenRec { }; extern void -__driUtilMessage(const char *f, ...); - - -extern void __driUtilUpdateDrawableInfo(__DRIdrawable *pdp); extern float diff --git a/src/mesa/drivers/dri/common/drirenderbuffer.c b/src/mesa/drivers/dri/common/drirenderbuffer.c index 48a2c662297..c9ce6e3cb64 100644 --- a/src/mesa/drivers/dri/common/drirenderbuffer.c +++ b/src/mesa/drivers/dri/common/drirenderbuffer.c @@ -59,14 +59,6 @@ driNewRenderbuffer(gl_format format, GLvoid *addr, { driRenderbuffer *drb; - assert(format == GL_RGBA || - format == GL_RGB5 || - format == GL_RGBA8 || - format == GL_DEPTH_COMPONENT16 || - format == GL_DEPTH_COMPONENT24 || - format == GL_DEPTH_COMPONENT32 || - format == GL_STENCIL_INDEX8_EXT); - assert(cpp > 0); assert(pitch > 0); diff --git a/src/mesa/drivers/dri/common/spantmp.h b/src/mesa/drivers/dri/common/spantmp.h index d5608b88065..cdc4f422ceb 100644 --- a/src/mesa/drivers/dri/common/spantmp.h +++ b/src/mesa/drivers/dri/common/spantmp.h @@ -288,7 +288,6 @@ static void TAG(ReadRGBAPixels)( GLcontext *ctx, HW_READ_LOCK() { GLubyte (*rgba)[4] = (GLubyte (*)[4]) values; - const GLubyte *mask = NULL; /* remove someday */ GLuint i; LOCAL_VARS; @@ -296,23 +295,11 @@ static void TAG(ReadRGBAPixels)( GLcontext *ctx, HW_READ_CLIPLOOP() { - if (mask) - { - for (i=0;i<n;i++) - if (mask[i]) { - int fy = Y_FLIP( y[i] ); - if (CLIPPIXEL( x[i], fy )) - READ_RGBA( rgba[i], x[i], fy ); - } - } - else - { - for (i=0;i<n;i++) { - int fy = Y_FLIP( y[i] ); - if (CLIPPIXEL( x[i], fy )) - READ_RGBA( rgba[i], x[i], fy ); - } - } + for (i=0;i<n;i++) { + int fy = Y_FLIP( y[i] ); + if (CLIPPIXEL( x[i], fy )) + READ_RGBA( rgba[i], x[i], fy ); + } } HW_ENDCLIPLOOP(); } diff --git a/src/mesa/drivers/dri/common/spantmp2.h b/src/mesa/drivers/dri/common/spantmp2.h index c1522269022..98422a85647 100644 --- a/src/mesa/drivers/dri/common/spantmp2.h +++ b/src/mesa/drivers/dri/common/spantmp2.h @@ -805,7 +805,6 @@ static void TAG(ReadRGBAPixels)( GLcontext *ctx, HW_READ_LOCK() { GLubyte (*rgba)[4] = (GLubyte (*)[4]) values; - GLubyte *mask = NULL; /* remove someday */ GLint i; LOCAL_VARS; @@ -813,23 +812,11 @@ static void TAG(ReadRGBAPixels)( GLcontext *ctx, HW_READ_CLIPLOOP() { - if (mask) - { - for (i=0;i<n;i++) - if (mask[i]) { - int fy = Y_FLIP( y[i] ); - if (CLIPPIXEL( x[i], fy )) - READ_RGBA( rgba[i], x[i], fy ); - } - } - else - { - for (i=0;i<n;i++) { - int fy = Y_FLIP( y[i] ); - if (CLIPPIXEL( x[i], fy )) - READ_RGBA( rgba[i], x[i], fy ); - } - } + for (i=0;i<n;i++) { + int fy = Y_FLIP( y[i] ); + if (CLIPPIXEL( x[i], fy )) + READ_RGBA( rgba[i], x[i], fy ); + } } HW_ENDCLIPLOOP(); } diff --git a/src/mesa/drivers/dri/common/utils.c b/src/mesa/drivers/dri/common/utils.c index 8c15cbbf735..0dd879abc96 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 @@ -275,10 +295,9 @@ driCheckDriDdxDrmVersions3(const char * driver_name, } /* Check that the DDX driver version is compatible */ - /* for miniglx we pass in -1 so we can ignore the DDX version */ - if ( (ddxActual->major != -1) && ((ddxActual->major < ddxExpected->major_min) + if ( (ddxActual->major < ddxExpected->major_min) || (ddxActual->major > ddxExpected->major_max) - || (ddxActual->minor < ddxExpected->minor)) ) { + || (ddxActual->minor < ddxExpected->minor) ) { fprintf(stderr, format2, driver_name, "DDX", ddxExpected->major_min, ddxExpected->major_max, ddxExpected->minor, ddxActual->major, ddxActual->minor, ddxActual->patch); @@ -626,11 +645,10 @@ driCreateConfigs(GLenum fb_format, GLenum fb_type, modes->bindToTextureRgb = GL_TRUE; modes->bindToTextureRgba = GL_TRUE; modes->bindToMipmapTexture = GL_FALSE; - modes->bindToTextureTargets = modes->rgbMode ? - __DRI_ATTRIB_TEXTURE_1D_BIT | - __DRI_ATTRIB_TEXTURE_2D_BIT | - __DRI_ATTRIB_TEXTURE_RECTANGLE_BIT : - 0; + modes->bindToTextureTargets = + __DRI_ATTRIB_TEXTURE_1D_BIT | + __DRI_ATTRIB_TEXTURE_2D_BIT | + __DRI_ATTRIB_TEXTURE_RECTANGLE_BIT; } } } @@ -727,10 +745,7 @@ driGetConfigAttribIndex(const __DRIconfig *config, { switch (attribMap[index].attrib) { case __DRI_ATTRIB_RENDER_TYPE: - if (config->modes.rgbMode) - *value = __DRI_ATTRIB_RGBA_BIT; - else - *value = __DRI_ATTRIB_COLOR_INDEX_BIT; + *value = __DRI_ATTRIB_RGBA_BIT; break; case __DRI_ATTRIB_CONFIG_CAVEAT: if (config->modes.visualRating == GLX_NON_CONFORMANT_CONFIG) diff --git a/src/mesa/drivers/dri/common/utils.h b/src/mesa/drivers/dri/common/utils.h index 02ca3feb739..de6070c3987 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 477259ea7e0..de4500a39b0 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/fb/Doxyfile b/src/mesa/drivers/dri/fb/Doxyfile deleted file mode 100644 index 31256db834a..00000000000 --- a/src/mesa/drivers/dri/fb/Doxyfile +++ /dev/null @@ -1,232 +0,0 @@ -# Doxyfile 1.3.2-Gideon - -#--------------------------------------------------------------------------- -# General configuration options -#--------------------------------------------------------------------------- -PROJECT_NAME = fb -PROJECT_NUMBER = $VERSION$ -OUTPUT_DIRECTORY = -OUTPUT_LANGUAGE = English -USE_WINDOWS_ENCODING = NO -EXTRACT_ALL = NO -EXTRACT_PRIVATE = NO -EXTRACT_STATIC = NO -EXTRACT_LOCAL_CLASSES = YES -HIDE_UNDOC_MEMBERS = NO -HIDE_UNDOC_CLASSES = NO -HIDE_FRIEND_COMPOUNDS = NO -HIDE_IN_BODY_DOCS = NO -BRIEF_MEMBER_DESC = YES -REPEAT_BRIEF = YES -ALWAYS_DETAILED_SEC = NO -INLINE_INHERITED_MEMB = NO -FULL_PATH_NAMES = NO -STRIP_FROM_PATH = -INTERNAL_DOCS = NO -CASE_SENSE_NAMES = YES -SHORT_NAMES = NO -HIDE_SCOPE_NAMES = NO -SHOW_INCLUDE_FILES = YES -JAVADOC_AUTOBRIEF = NO -MULTILINE_CPP_IS_BRIEF = NO -DETAILS_AT_TOP = NO -INHERIT_DOCS = YES -INLINE_INFO = YES -SORT_MEMBER_DOCS = YES -DISTRIBUTE_GROUP_DOC = NO -TAB_SIZE = 8 -GENERATE_TODOLIST = YES -GENERATE_TESTLIST = YES -GENERATE_BUGLIST = YES -GENERATE_DEPRECATEDLIST= YES -ALIASES = -ENABLED_SECTIONS = -MAX_INITIALIZER_LINES = 30 -OPTIMIZE_OUTPUT_FOR_C = NO -OPTIMIZE_OUTPUT_JAVA = NO -SHOW_USED_FILES = YES -#--------------------------------------------------------------------------- -# configuration options related to warning and progress messages -#--------------------------------------------------------------------------- -QUIET = NO -WARNINGS = YES -WARN_IF_UNDOCUMENTED = YES -WARN_IF_DOC_ERROR = YES -WARN_FORMAT = "$file:$line: $text" -WARN_LOGFILE = -#--------------------------------------------------------------------------- -# configuration options related to the input files -#--------------------------------------------------------------------------- -INPUT = /home/temp/Mesa/src/drv/fb -FILE_PATTERNS = *.c \ - *.cc \ - *.cxx \ - *.cpp \ - *.c++ \ - *.java \ - *.ii \ - *.ixx \ - *.ipp \ - *.i++ \ - *.inl \ - *.h \ - *.hh \ - *.hxx \ - *.hpp \ - *.h++ \ - *.idl \ - *.odl \ - *.cs \ - *.C \ - *.H \ - *.tlh \ - *.diff \ - *.patch \ - *.moc \ - *.xpm -RECURSIVE = yes -EXCLUDE = -EXCLUDE_SYMLINKS = NO -EXCLUDE_PATTERNS = -EXAMPLE_PATH = -EXAMPLE_PATTERNS = * -EXAMPLE_RECURSIVE = NO -IMAGE_PATH = -INPUT_FILTER = -FILTER_SOURCE_FILES = NO -#--------------------------------------------------------------------------- -# configuration options related to source browsing -#--------------------------------------------------------------------------- -SOURCE_BROWSER = NO -INLINE_SOURCES = NO -STRIP_CODE_COMMENTS = YES -REFERENCED_BY_RELATION = YES -REFERENCES_RELATION = YES -VERBATIM_HEADERS = YES -#--------------------------------------------------------------------------- -# configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- -ALPHABETICAL_INDEX = NO -COLS_IN_ALPHA_INDEX = 5 -IGNORE_PREFIX = -#--------------------------------------------------------------------------- -# configuration options related to the HTML output -#--------------------------------------------------------------------------- -GENERATE_HTML = YES -HTML_OUTPUT = html -HTML_FILE_EXTENSION = .html -HTML_HEADER = -HTML_FOOTER = -HTML_STYLESHEET = -HTML_ALIGN_MEMBERS = YES -GENERATE_HTMLHELP = NO -CHM_FILE = -HHC_LOCATION = -GENERATE_CHI = NO -BINARY_TOC = NO -TOC_EXPAND = NO -DISABLE_INDEX = NO -ENUM_VALUES_PER_LINE = 4 -GENERATE_TREEVIEW = NO -TREEVIEW_WIDTH = 250 -#--------------------------------------------------------------------------- -# configuration options related to the LaTeX output -#--------------------------------------------------------------------------- -GENERATE_LATEX = YES -LATEX_OUTPUT = latex -LATEX_CMD_NAME = latex -MAKEINDEX_CMD_NAME = makeindex -COMPACT_LATEX = NO -PAPER_TYPE = a4wide -EXTRA_PACKAGES = -LATEX_HEADER = -PDF_HYPERLINKS = NO -USE_PDFLATEX = NO -LATEX_BATCHMODE = NO -LATEX_HIDE_INDICES = NO -#--------------------------------------------------------------------------- -# configuration options related to the RTF output -#--------------------------------------------------------------------------- -GENERATE_RTF = NO -RTF_OUTPUT = rtf -COMPACT_RTF = NO -RTF_HYPERLINKS = NO -RTF_STYLESHEET_FILE = -RTF_EXTENSIONS_FILE = -#--------------------------------------------------------------------------- -# configuration options related to the man page output -#--------------------------------------------------------------------------- -GENERATE_MAN = NO -MAN_OUTPUT = man -MAN_EXTENSION = .3 -MAN_LINKS = NO -#--------------------------------------------------------------------------- -# configuration options related to the XML output -#--------------------------------------------------------------------------- -GENERATE_XML = yes -XML_OUTPUT = xml -XML_SCHEMA = -XML_DTD = -#--------------------------------------------------------------------------- -# configuration options for the AutoGen Definitions output -#--------------------------------------------------------------------------- -GENERATE_AUTOGEN_DEF = NO -#--------------------------------------------------------------------------- -# configuration options related to the Perl module output -#--------------------------------------------------------------------------- -GENERATE_PERLMOD = NO -PERLMOD_LATEX = NO -PERLMOD_PRETTY = YES -PERLMOD_MAKEVAR_PREFIX = -#--------------------------------------------------------------------------- -# Configuration options related to the preprocessor -#--------------------------------------------------------------------------- -ENABLE_PREPROCESSING = YES -MACRO_EXPANSION = NO -EXPAND_ONLY_PREDEF = NO -SEARCH_INCLUDES = YES -INCLUDE_PATH = -INCLUDE_FILE_PATTERNS = -PREDEFINED = -EXPAND_AS_DEFINED = -SKIP_FUNCTION_MACROS = YES -#--------------------------------------------------------------------------- -# Configuration::addtions related to external references -#--------------------------------------------------------------------------- -TAGFILES = -GENERATE_TAGFILE = -ALLEXTERNALS = NO -EXTERNAL_GROUPS = YES -PERL_PATH = /usr/bin/perl -#--------------------------------------------------------------------------- -# Configuration options related to the dot tool -#--------------------------------------------------------------------------- -CLASS_DIAGRAMS = YES -HIDE_UNDOC_RELATIONS = YES -HAVE_DOT = NO -CLASS_GRAPH = YES -COLLABORATION_GRAPH = YES -UML_LOOK = NO -TEMPLATE_RELATIONS = NO -INCLUDE_GRAPH = YES -INCLUDED_BY_GRAPH = YES -CALL_GRAPH = NO -GRAPHICAL_HIERARCHY = YES -DOT_IMAGE_FORMAT = png -DOT_PATH = -DOTFILE_DIRS = -MAX_DOT_GRAPH_WIDTH = 1024 -MAX_DOT_GRAPH_HEIGHT = 1024 -MAX_DOT_GRAPH_DEPTH = 1000 -GENERATE_LEGEND = YES -DOT_CLEANUP = YES -#--------------------------------------------------------------------------- -# Configuration::addtions related to the search engine -#--------------------------------------------------------------------------- -SEARCHENGINE = NO -CGI_NAME = search.cgi -CGI_URL = -DOC_URL = -DOC_ABSPATH = -BIN_ABSPATH = /usr/local/bin/ -EXT_DOC_PATHS = diff --git a/src/mesa/drivers/dri/fb/Makefile b/src/mesa/drivers/dri/fb/Makefile deleted file mode 100644 index 848e2041e27..00000000000 --- a/src/mesa/drivers/dri/fb/Makefile +++ /dev/null @@ -1,24 +0,0 @@ -# src/mesa/drivers/dri/fb/Makefile - -TOP = ../../../../.. -include $(TOP)/configs/current - -LIBNAME = fb_dri.so - - -DRIVER_SOURCES = \ - fb_dri.c \ - $(EGL_SOURCES) - - -C_SOURCES = \ - $(COMMON_SOURCES) \ - $(DRIVER_SOURCES) - -ASM_SOURCES = - -# XXX not 100% sure this is right -#WINDOW_SYSTEM = solo - -include ../Makefile.template - diff --git a/src/mesa/drivers/dri/fb/fb_dri.c b/src/mesa/drivers/dri/fb/fb_dri.c deleted file mode 100644 index ac07e57db13..00000000000 --- a/src/mesa/drivers/dri/fb/fb_dri.c +++ /dev/null @@ -1,792 +0,0 @@ -/* - * Mesa 3-D graphics library - * Version: 6.3 - * - * Copyright (C) 1999-2005 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. - */ - -/* Minimal swrast-based dri loadable driver. - * - * Todo: - * -- Use malloced (rather than framebuffer) memory for backbuffer - * -- 32bpp is hardwared -- fix - * - * NOTES: - * -- No mechanism for cliprects or resize notification -- - * assumes this is a fullscreen device. - * -- No locking -- assumes this is the only driver accessing this - * device. - * -- Doesn't (yet) make use of any acceleration or other interfaces - * provided by fb. Would be entirely happy working against any - * fullscreen interface. - * -- HOWEVER: only a small number of pixelformats are supported, and - * the mechanism for choosing between them makes some assumptions - * that may not be valid everywhere. - */ - -#include "driver.h" -#include "drm.h" -#include "utils.h" -#include "drirenderbuffer.h" - -#include "buffers.h" -#include "main/extensions.h" -#include "main/framebuffer.h" -#include "main/renderbuffer.h" -#include "vbo/vbo.h" -#include "swrast/swrast.h" -#include "swrast_setup/swrast_setup.h" -#include "tnl/tnl.h" -#include "tnl/tcontext.h" -#include "tnl/t_pipeline.h" -#include "drivers/common/driverfuncs.h" - -void fbSetSpanFunctions(driRenderbuffer *drb, const GLvisual *vis); - -typedef struct { - GLcontext *glCtx; /* Mesa context */ - - struct { - __DRIcontext *context; - __DRIscreen *screen; - __DRIdrawable *drawable; /* drawable bound to this ctx */ - } dri; - -} fbContext, *fbContextPtr; - -#define FB_CONTEXT(ctx) ((fbContextPtr)(ctx->DriverCtx)) - - -static const GLubyte * -get_string(GLcontext *ctx, GLenum pname) -{ - (void) ctx; - switch (pname) { - case GL_RENDERER: - return (const GLubyte *) "Mesa dumb framebuffer"; - default: - return NULL; - } -} - - -static void -update_state( GLcontext *ctx, GLuint new_state ) -{ - /* not much to do here - pass it on */ - _swrast_InvalidateState( ctx, new_state ); - _swsetup_InvalidateState( ctx, new_state ); - _vbo_InvalidateState( ctx, new_state ); - _tnl_InvalidateState( ctx, new_state ); -} - - -/** - * Called by ctx->Driver.GetBufferSize from in core Mesa to query the - * current framebuffer size. - */ -static void -get_buffer_size( GLframebuffer *buffer, GLuint *width, GLuint *height ) -{ - GET_CURRENT_CONTEXT(ctx); - fbContextPtr fbmesa = FB_CONTEXT(ctx); - - *width = fbmesa->dri.drawable->w; - *height = fbmesa->dri.drawable->h; -} - - -static void -updateFramebufferSize(GLcontext *ctx) -{ - fbContextPtr fbmesa = FB_CONTEXT(ctx); - struct gl_framebuffer *fb = ctx->WinSysDrawBuffer; - if (fbmesa->dri.drawable->w != fb->Width || - fbmesa->dri.drawable->h != fb->Height) { - driUpdateFramebufferSize(ctx, fbmesa->dri.drawable); - } -} - -static void -viewport(GLcontext *ctx, GLint x, GLint y, GLsizei w, GLsizei h) -{ - /* XXX this should be called after we acquire the DRI lock, not here */ - updateFramebufferSize(ctx); -} - - -static void -init_core_functions( struct dd_function_table *functions ) -{ - functions->GetString = get_string; - functions->UpdateState = update_state; - functions->GetBufferSize = get_buffer_size; - functions->Viewport = viewport; - - functions->Clear = _swrast_Clear; /* could accelerate with blits */ -} - - -/* - * Generate code for span functions. - */ - -/* 24-bit BGR */ -#define NAME(PREFIX) PREFIX##_B8G8R8 -#define FORMAT GL_RGBA8 -#define SPAN_VARS \ - driRenderbuffer *drb = (driRenderbuffer *) rb; -#define INIT_PIXEL_PTR(P, X, Y) \ - GLubyte *P = (GLubyte *)drb->Base.Data + (drb->Base.Height - (Y)) * drb->pitch + (X) * 3; -#define INC_PIXEL_PTR(P) P += 3 -#define STORE_PIXEL(DST, X, Y, VALUE) \ - DST[0] = VALUE[BCOMP]; \ - DST[1] = VALUE[GCOMP]; \ - DST[2] = VALUE[RCOMP] -#define FETCH_PIXEL(DST, SRC) \ - DST[RCOMP] = SRC[2]; \ - DST[GCOMP] = SRC[1]; \ - DST[BCOMP] = SRC[0]; \ - DST[ACOMP] = 0xff - -#include "swrast/s_spantemp.h" - - -/* 32-bit BGRA */ -#define NAME(PREFIX) PREFIX##_B8G8R8A8 -#define FORMAT GL_RGBA8 -#define SPAN_VARS \ - driRenderbuffer *drb = (driRenderbuffer *) rb; -#define INIT_PIXEL_PTR(P, X, Y) \ - GLubyte *P = (GLubyte *)drb->Base.Data + (drb->Base.Height - (Y)) * drb->pitch + (X) * 4; -#define INC_PIXEL_PTR(P) P += 4 -#define STORE_PIXEL(DST, X, Y, VALUE) \ - DST[0] = VALUE[BCOMP]; \ - DST[1] = VALUE[GCOMP]; \ - DST[2] = VALUE[RCOMP]; \ - DST[3] = VALUE[ACOMP] -#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \ - DST[0] = VALUE[BCOMP]; \ - DST[1] = VALUE[GCOMP]; \ - DST[2] = VALUE[RCOMP]; \ - DST[3] = 0xff -#define FETCH_PIXEL(DST, SRC) \ - DST[RCOMP] = SRC[2]; \ - DST[GCOMP] = SRC[1]; \ - DST[BCOMP] = SRC[0]; \ - DST[ACOMP] = SRC[3] - -#include "swrast/s_spantemp.h" - - -/* 16-bit BGR (XXX implement dithering someday) */ -#define NAME(PREFIX) PREFIX##_B5G6R5 -#define FORMAT GL_RGBA8 -#define SPAN_VARS \ - driRenderbuffer *drb = (driRenderbuffer *) rb; -#define INIT_PIXEL_PTR(P, X, Y) \ - GLushort *P = (GLushort *)drb->Base.Data + (drb->Base.Height - (Y)) * drb->pitch + (X) * 2; -#define INC_PIXEL_PTR(P) P += 1 -#define STORE_PIXEL(DST, X, Y, VALUE) \ - DST[0] = ( (((VALUE[RCOMP]) & 0xf8) << 8) | (((VALUE[GCOMP]) & 0xfc) << 3) | ((VALUE[BCOMP]) >> 3) ) -#define FETCH_PIXEL(DST, SRC) \ - DST[RCOMP] = ( (((SRC[0]) >> 8) & 0xf8) | (((SRC[0]) >> 11) & 0x7) ); \ - DST[GCOMP] = ( (((SRC[0]) >> 3) & 0xfc) | (((SRC[0]) >> 5) & 0x3) ); \ - DST[BCOMP] = ( (((SRC[0]) << 3) & 0xf8) | (((SRC[0]) ) & 0x7) ); \ - DST[ACOMP] = 0xff - -#include "swrast/s_spantemp.h" - - -/* 15-bit BGR (XXX implement dithering someday) */ -#define NAME(PREFIX) PREFIX##_B5G5R5 -#define FORMAT GL_RGBA8 -#define SPAN_VARS \ - driRenderbuffer *drb = (driRenderbuffer *) rb; -#define INIT_PIXEL_PTR(P, X, Y) \ - GLushort *P = (GLushort *)drb->Base.Data + (drb->Base.Height - (Y)) * drb->pitch + (X) * 2; -#define INC_PIXEL_PTR(P) P += 1 -#define STORE_PIXEL(DST, X, Y, VALUE) \ - DST[0] = ( (((VALUE[RCOMP]) & 0xf8) << 7) | (((VALUE[GCOMP]) & 0xf8) << 2) | ((VALUE[BCOMP]) >> 3) ) -#define FETCH_PIXEL(DST, SRC) \ - DST[RCOMP] = ( (((SRC[0]) >> 7) & 0xf8) | (((SRC[0]) >> 10) & 0x7) ); \ - DST[GCOMP] = ( (((SRC[0]) >> 2) & 0xf8) | (((SRC[0]) >> 5) & 0x7) ); \ - DST[BCOMP] = ( (((SRC[0]) << 3) & 0xf8) | (((SRC[0]) ) & 0x7) ); \ - DST[ACOMP] = 0xff - -#include "swrast/s_spantemp.h" - - -/* 8-bit color index */ -#define NAME(PREFIX) PREFIX##_CI8 -#define FORMAT GL_COLOR_INDEX8_EXT -#define SPAN_VARS \ - driRenderbuffer *drb = (driRenderbuffer *) rb; -#define INIT_PIXEL_PTR(P, X, Y) \ - GLubyte *P = (GLubyte *)drb->Base.Data + (drb->Base.Height - (Y)) * drb->pitch + (X); -#define INC_PIXEL_PTR(P) P += 1 -#define STORE_PIXEL(DST, X, Y, VALUE) \ - *DST = VALUE[0] -#define FETCH_PIXEL(DST, SRC) \ - DST = SRC[0] - -#include "swrast/s_spantemp.h" - - - -void -fbSetSpanFunctions(driRenderbuffer *drb, const GLvisual *vis) -{ - ASSERT(drb->Base.InternalFormat == GL_RGBA); - if (drb->Base.InternalFormat == GL_RGBA) { - if (vis->redBits == 5 && vis->greenBits == 6 && vis->blueBits == 5) { - drb->Base.GetRow = get_row_B5G6R5; - drb->Base.GetValues = get_values_B5G6R5; - drb->Base.PutRow = put_row_B5G6R5; - drb->Base.PutMonoRow = put_mono_row_B5G6R5; - drb->Base.PutRowRGB = put_row_rgb_B5G6R5; - drb->Base.PutValues = put_values_B5G6R5; - drb->Base.PutMonoValues = put_mono_values_B5G6R5; - } - else if (vis->redBits == 5 && vis->greenBits == 5 && vis->blueBits == 5) { - drb->Base.GetRow = get_row_B5G5R5; - drb->Base.GetValues = get_values_B5G5R5; - drb->Base.PutRow = put_row_B5G5R5; - drb->Base.PutMonoRow = put_mono_row_B5G5R5; - drb->Base.PutRowRGB = put_row_rgb_B5G5R5; - drb->Base.PutValues = put_values_B5G5R5; - drb->Base.PutMonoValues = put_mono_values_B5G5R5; - } - else if (vis->redBits == 8 && vis->greenBits == 8 && vis->blueBits == 8 - && vis->alphaBits == 8) { - drb->Base.GetRow = get_row_B8G8R8A8; - drb->Base.GetValues = get_values_B8G8R8A8; - drb->Base.PutRow = put_row_B8G8R8A8; - drb->Base.PutMonoRow = put_mono_row_B8G8R8A8; - drb->Base.PutRowRGB = put_row_rgb_B8G8R8A8; - drb->Base.PutValues = put_values_B8G8R8A8; - drb->Base.PutMonoValues = put_mono_values_B8G8R8A8; - } - else if (vis->redBits == 8 && vis->greenBits == 8 && vis->blueBits == 8 - && vis->alphaBits == 0) { - drb->Base.GetRow = get_row_B8G8R8; - drb->Base.GetValues = get_values_B8G8R8; - drb->Base.PutRow = put_row_B8G8R8; - drb->Base.PutMonoRow = put_mono_row_B8G8R8; - drb->Base.PutRowRGB = put_row_rgb_B8G8R8; - drb->Base.PutValues = put_values_B8G8R8; - drb->Base.PutMonoValues = put_mono_values_B8G8R8; - } - else if (vis->indexBits == 8) { - drb->Base.GetRow = get_row_CI8; - drb->Base.GetValues = get_values_CI8; - drb->Base.PutRow = put_row_CI8; - drb->Base.PutMonoRow = put_mono_row_CI8; - drb->Base.PutValues = put_values_CI8; - drb->Base.PutMonoValues = put_mono_values_CI8; - } - } - else { - /* hardware z/stencil/etc someday */ - } -} - - - -/* Initialize the driver specific screen private data. - */ -static GLboolean -fbInitDriver( __DRIscreen *sPriv ) -{ - sPriv->private = NULL; - return GL_TRUE; -} - -static void -fbDestroyScreen( __DRIscreen *sPriv ) -{ -} - - -/* Create the device specific context. - */ -static GLboolean -fbCreateContext( const __GLcontextModes *glVisual, - __DRIcontext *driContextPriv, - void *sharedContextPrivate) -{ - fbContextPtr fbmesa; - GLcontext *ctx, *shareCtx; - struct dd_function_table functions; - - assert(glVisual); - assert(driContextPriv); - - /* Allocate the Fb context */ - fbmesa = (fbContextPtr) calloc(1, sizeof(*fbmesa) ); - if ( !fbmesa ) - return GL_FALSE; - - /* Init default driver functions then plug in our FBdev-specific functions - */ - _mesa_init_driver_functions(&functions); - init_core_functions(&functions); - - /* Allocate the Mesa context */ - if (sharedContextPrivate) - shareCtx = ((fbContextPtr) sharedContextPrivate)->glCtx; - else - shareCtx = NULL; - - ctx = fbmesa->glCtx = _mesa_create_context(glVisual, shareCtx, - &functions, (void *) fbmesa); - if (!fbmesa->glCtx) { - free(fbmesa); - return GL_FALSE; - } - driContextPriv->driverPrivate = fbmesa; - - /* Create module contexts */ - _swrast_CreateContext( ctx ); - _vbo_CreateContext( ctx ); - _tnl_CreateContext( ctx ); - _swsetup_CreateContext( ctx ); - _swsetup_Wakeup( ctx ); - - - /* use default TCL pipeline */ - { - TNLcontext *tnl = TNL_CONTEXT(ctx); - tnl->Driver.RunPipeline = _tnl_run_pipeline; - } - - _mesa_enable_sw_extensions(ctx); - - return GL_TRUE; -} - - -static void -fbDestroyContext( __DRIcontext *driContextPriv ) -{ - GET_CURRENT_CONTEXT(ctx); - fbContextPtr fbmesa = (fbContextPtr) driContextPriv->driverPrivate; - fbContextPtr current = ctx ? FB_CONTEXT(ctx) : NULL; - - /* check if we're deleting the currently bound context */ - if (fbmesa == current) { - _mesa_make_current(NULL, NULL, NULL); - } - - /* Free fb context resources */ - if ( fbmesa ) { - _swsetup_DestroyContext( fbmesa->glCtx ); - _tnl_DestroyContext( fbmesa->glCtx ); - _vbo_DestroyContext( fbmesa->glCtx ); - _swrast_DestroyContext( fbmesa->glCtx ); - - /* free the Mesa context */ - fbmesa->glCtx->DriverCtx = NULL; - _mesa_destroy_context( fbmesa->glCtx ); - - free( fbmesa ); - } -} - - -/* Create and initialize the Mesa and driver specific pixmap buffer - * data. - */ -static GLboolean -fbCreateBuffer( __DRIscreen *driScrnPriv, - __DRIdrawable *driDrawPriv, - const __GLcontextModes *mesaVis, - GLboolean isPixmap ) -{ - struct gl_framebuffer *mesa_framebuffer; - - if (isPixmap) { - return GL_FALSE; /* not implemented */ - } - else { - const GLboolean swDepth = mesaVis->depthBits > 0; - const GLboolean swAlpha = mesaVis->alphaBits > 0; - const GLboolean swAccum = mesaVis->accumRedBits > 0; - const GLboolean swStencil = mesaVis->stencilBits > 0; - - mesa_framebuffer = _mesa_create_framebuffer(mesaVis); - if (!mesa_framebuffer) - return 0; - - /* XXX double-check these parameters (bpp vs cpp, etc) */ - { - driRenderbuffer *drb = driNewRenderbuffer(MESA_FORMAT_ARGB8888, - driScrnPriv->pFB, - driScrnPriv->fbBPP / 8, - driScrnPriv->fbOrigin, - driScrnPriv->fbStride, - driDrawPriv); - fbSetSpanFunctions(drb, mesaVis); - _mesa_add_renderbuffer(mesa_framebuffer, - BUFFER_FRONT_LEFT, &drb->Base); - } - if (mesaVis->doubleBufferMode) { - /* XXX what are the correct origin/stride values? */ - GLvoid *backBuf = malloc(driScrnPriv->fbStride - * driScrnPriv->fbHeight); - driRenderbuffer *drb = driNewRenderbuffer(MESA_FORMAT_ARGB8888, - backBuf, - driScrnPriv->fbBPP /8, - driScrnPriv->fbOrigin, - driScrnPriv->fbStride, - driDrawPriv); - fbSetSpanFunctions(drb, mesaVis); - _mesa_add_renderbuffer(mesa_framebuffer, - BUFFER_BACK_LEFT, &drb->Base); - } - - _mesa_add_soft_renderbuffers(mesa_framebuffer, - GL_FALSE, /* color */ - swDepth, - swStencil, - swAccum, - swAlpha, /* or always zero? */ - GL_FALSE /* aux */); - - driDrawPriv->driverPrivate = mesa_framebuffer; - - return 1; - } -} - - -static void -fbDestroyBuffer(__DRIdrawable *driDrawPriv) -{ - _mesa_reference_framebuffer((GLframebuffer **)(&(driDrawPriv->driverPrivate)), NULL); -} - - - -/* If the backbuffer is on a videocard, this is extraordinarily slow! - */ -static void -fbSwapBuffers( __DRIdrawable *dPriv ) -{ - struct gl_framebuffer *mesa_framebuffer = (struct gl_framebuffer *)dPriv->driverPrivate; - struct gl_renderbuffer * front_renderbuffer = mesa_framebuffer->Attachment[BUFFER_FRONT_LEFT].Renderbuffer; - void *frontBuffer = front_renderbuffer->Data; - int currentPitch = ((driRenderbuffer *)front_renderbuffer)->pitch; - void *backBuffer = mesa_framebuffer->Attachment[BUFFER_BACK_LEFT].Renderbuffer->Data; - - if (dPriv->driContextPriv && dPriv->driContextPriv->driverPrivate) { - fbContextPtr fbmesa = (fbContextPtr) dPriv->driContextPriv->driverPrivate; - GLcontext *ctx = fbmesa->glCtx; - - if (ctx->Visual.doubleBufferMode) { - int i; - int offset = 0; - char *tmp = malloc(currentPitch); - - _mesa_notifySwapBuffers( ctx ); /* flush pending rendering comands */ - - ASSERT(frontBuffer); - ASSERT(backBuffer); - - for (i = 0; i < dPriv->h; i++) { - memcpy(tmp, (char *) backBuffer + offset, currentPitch); - memcpy((char *) frontBuffer + offset, tmp, currentPitch); - offset += currentPitch; - } - - free(tmp); - } - } - else { - /* XXX this shouldn't be an error but we can't handle it for now */ - _mesa_problem(NULL, "fbSwapBuffers: drawable has no context!\n"); - } -} - - -/* Force the context `c' to be the current context and associate with it - * buffer `b'. - */ -static GLboolean -fbMakeCurrent( __DRIcontext *driContextPriv, - __DRIdrawable *driDrawPriv, - __DRIdrawable *driReadPriv ) -{ - if ( driContextPriv ) { - fbContextPtr newFbCtx = - (fbContextPtr) driContextPriv->driverPrivate; - - newFbCtx->dri.drawable = driDrawPriv; - - _mesa_make_current( newFbCtx->glCtx, - driDrawPriv->driverPrivate, - driReadPriv->driverPrivate); - } else { - _mesa_make_current( NULL, NULL, NULL ); - } - - return GL_TRUE; -} - - -/* Force the context `c' to be unbound from its buffer. - */ -static GLboolean -fbUnbindContext( __DRIcontext *driContextPriv ) -{ - return GL_TRUE; -} - -static struct __DriverAPIRec fbAPI = { - .InitDriver = fbInitDriver, - .DestroyScreen = fbDestroyScreen, - .CreateContext = fbCreateContext, - .DestroyContext = fbDestroyContext, - .CreateBuffer = fbCreateBuffer, - .DestroyBuffer = fbDestroyBuffer, - .SwapBuffers = fbSwapBuffers, - .MakeCurrent = fbMakeCurrent, - .UnbindContext = fbUnbindContext, -}; - - - -static int -__driValidateMode(const DRIDriverContext *ctx ) -{ - return 1; -} - -static int -__driInitFBDev( struct DRIDriverContextRec *ctx ) -{ - /* Note that drmOpen will try to load the kernel module, if needed. */ - /* we need a fbdev drm driver - it will only track maps */ - ctx->drmFD = drmOpen("radeon", NULL ); - if (ctx->drmFD < 0) { - fprintf(stderr, "[drm] drmOpen failed\n"); - return 0; - } - - ctx->shared.SAREASize = SAREA_MAX; - - 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, - (unsigned long) 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", - (unsigned long) 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", - (unsigned long) ctx->shared.hFrameBuffer); - - return 1; -} - -static void -__driHaltFBDev( struct DRIDriverContextRec *ctx ) -{ -} - -struct DRIDriverRec __driDriver = { - __driValidateMode, - __driValidateMode, - __driInitFBDev, - __driHaltFBDev -}; - -static __GLcontextModes * -fbFillInModes( __DRIscreen *psp, - unsigned pixel_bits, unsigned depth_bits, - unsigned stencil_bits, GLboolean have_back_buffer ) -{ - __GLcontextModes * modes; - __GLcontextModes * m; - unsigned num_modes; - unsigned depth_buffer_factor; - unsigned back_buffer_factor; - GLenum fb_format; - GLenum fb_type; - - /* Right now GLX_SWAP_COPY_OML isn't supported, but it would be easy - * enough to add support. Basically, if a context is created with an - * fbconfig where the swap method is GLX_SWAP_COPY_OML, pageflipping - * will never be used. - */ - static const GLenum back_buffer_modes[] = { - GLX_NONE, GLX_SWAP_UNDEFINED_OML /*, GLX_SWAP_COPY_OML */ - }; - - uint8_t depth_bits_array[2]; - uint8_t stencil_bits_array[2]; - - - depth_bits_array[0] = depth_bits; - depth_bits_array[1] = depth_bits; - - /* Just like with the accumulation buffer, always provide some modes - * with a stencil buffer. It will be a sw fallback, but some apps won't - * care about that. - */ - stencil_bits_array[0] = 0; - stencil_bits_array[1] = (stencil_bits == 0) ? 8 : stencil_bits; - - depth_buffer_factor = ((depth_bits != 0) || (stencil_bits != 0)) ? 2 : 1; - back_buffer_factor = (have_back_buffer) ? 2 : 1; - - num_modes = depth_buffer_factor * back_buffer_factor * 4; - - if ( pixel_bits == 16 ) { - fb_format = GL_RGB; - fb_type = GL_UNSIGNED_SHORT_5_6_5; - } - else { - fb_format = GL_RGBA; - fb_type = GL_UNSIGNED_INT_8_8_8_8_REV; - } - - modes = (*psp->contextModes->createContextModes)( num_modes, sizeof( __GLcontextModes ) ); - m = modes; - if ( ! driFillInModes( & m, fb_format, fb_type, - depth_bits_array, stencil_bits_array, depth_buffer_factor, - back_buffer_modes, back_buffer_factor, - GLX_TRUE_COLOR ) ) { - fprintf( stderr, "[%s:%u] Error creating FBConfig!\n", - __func__, __LINE__ ); - return NULL; - } - - if ( ! driFillInModes( & m, fb_format, fb_type, - depth_bits_array, stencil_bits_array, depth_buffer_factor, - back_buffer_modes, back_buffer_factor, - GLX_DIRECT_COLOR ) ) { - fprintf( stderr, "[%s:%u] Error creating FBConfig!\n", - __func__, __LINE__ ); - return NULL; - } - - /* Mark the visual as slow if there are "fake" stencil bits. - */ - for ( m = modes ; m != NULL ; m = m->next ) { - if ( (m->stencilBits != 0) && (m->stencilBits != stencil_bits) ) { - m->visualRating = GLX_SLOW_CONFIG; - } - } - - return modes; -} - - -/** - * This is the bootstrap function for the driver. libGL supplies all of the - * requisite information about the system, and the driver initializes itself. - * This routine also fills in the linked list pointed to by \c driver_modes - * with the \c __GLcontextModes that the driver can support for windows or - * pbuffers. - * - * \return A pointer to a \c __DRIscreen on success, or \c NULL on - * failure. - */ -PUBLIC -void * __driCreateNewScreen( __DRInativeDisplay *dpy, int scrn, __DRIscreen *psc, - const __GLcontextModes * modes, - const __DRIversion * ddx_version, - const __DRIversion * dri_version, - const __DRIversion * drm_version, - const __DRIframebuffer * frame_buffer, - drmAddress pSAREA, int fd, - int internal_api_version, - __GLcontextModes ** driver_modes ) -{ - __DRIscreen *psp; - static const __DRIversion ddx_expected = { 4, 0, 0 }; - static const __DRIversion dri_expected = { 4, 0, 0 }; - static const __DRIversion drm_expected = { 1, 5, 0 }; - - - if ( ! driCheckDriDdxDrmVersions2( "fb", - dri_version, & dri_expected, - ddx_version, & ddx_expected, - drm_version, & drm_expected ) ) { - return NULL; - } - - psp = __driUtilCreateNewScreen(dpy, scrn, psc, NULL, - ddx_version, dri_version, drm_version, - frame_buffer, pSAREA, fd, - internal_api_version, &fbAPI); - if ( psp != NULL ) { - *driver_modes = fbFillInModes( psp, psp->fbBPP, - (psp->fbBPP == 16) ? 16 : 24, - (psp->fbBPP == 16) ? 0 : 8, - 1); - } - - return (void *) psp; -} - -/* This is the table of extensions that the loader will dlsym() for. */ -PUBLIC const __DRIextension *__driDriverExtensions[] = { - &driCoreExtension.base, - &driLegacyExtension.base, - NULL -}; diff --git a/src/mesa/drivers/dri/ffb/Makefile b/src/mesa/drivers/dri/ffb/Makefile deleted file mode 100644 index e9da8f9066e..00000000000 --- a/src/mesa/drivers/dri/ffb/Makefile +++ /dev/null @@ -1,35 +0,0 @@ -# src/mesa/drivers/dri/ffb/Makefile - -TOP = ../../../../.. -include $(TOP)/configs/current - -LIBNAME = ffb_dri.so - -# not yet -# MINIGLX_SOURCES = server/ffb_dri.c - -DRIVER_SOURCES = \ - ffb_bitmap.c \ - ffb_clear.c \ - ffb_dd.c \ - ffb_depth.c \ - ffb_fog.c \ - ffb_lines.c \ - ffb_points.c \ - ffb_span.c \ - ffb_state.c \ - ffb_stencil.c \ - ffb_tex.c \ - ffb_tris.c \ - ffb_vb.c \ - ffb_xmesa.c - -C_SOURCES = \ - $(COMMON_SOURCES) \ - $(DRIVER_SOURCES) - - -ASM_SOURCES = - -include ../Makefile.template - diff --git a/src/mesa/drivers/dri/ffb/ffb_bitmap.c b/src/mesa/drivers/dri/ffb/ffb_bitmap.c deleted file mode 100644 index b71a552c9dc..00000000000 --- a/src/mesa/drivers/dri/ffb/ffb_bitmap.c +++ /dev/null @@ -1,158 +0,0 @@ -/* - * - * GLX Hardware Device Driver for Sun Creator/Creator3D - * Copyright (C) 2001 David S. Miller - * - * 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 - * DAVID MILLER, OR ANY OTHER CONTRIBUTORS 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. - * - * - * David S. Miller <[email protected]> - */ - -#include "ffb_context.h" -#include "ffb_state.h" -#include "ffb_lock.h" -#include "ffb_bitmap.h" -#include "swrast/swrast.h" -#include "main/macros.h" - -/* Compute ceiling of integer quotient of A divided by B: */ -#define CEILING( A, B ) ( (A) % (B) == 0 ? (A)/(B) : (A)/(B)+1 ) - -#undef FFB_BITMAP_TRACE - -static void -ffb_bitmap(GLcontext *ctx, GLint px, GLint py, - GLsizei width, GLsizei height, - const struct gl_pixelstore_attrib *unpack, - const GLubyte *bitmap) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - ffb_fbcPtr ffb = fmesa->regs; - __DRIdrawable *dPriv = fmesa->driDrawable; - unsigned int ppc, pixel; - GLint row, col, row_stride; - const GLubyte *src; - char *buf; - - if (fmesa->bad_fragment_attrs != 0) - _swrast_Bitmap(ctx, px, py, width, - height, unpack, bitmap); - - pixel = (((((GLuint)(ctx->Current.RasterColor[0] * 255.0f)) & 0xff) << 0) | - ((((GLuint)(ctx->Current.RasterColor[1] * 255.0f)) & 0xff) << 8) | - ((((GLuint)(ctx->Current.RasterColor[2] * 255.0f)) & 0xff) << 16) | - ((((GLuint)(ctx->Current.RasterColor[3] * 255.0f)) & 0xff) << 24)); - -#ifdef FFB_BITMAP_TRACE - fprintf(stderr, "ffb_bitmap: ppc(%08x) fbc(%08x) cmp(%08x) pixel(%08x)\n", - fmesa->ppc, fmesa->fbc, fmesa->cmp, pixel); -#endif - - LOCK_HARDWARE(fmesa); - fmesa->hw_locked = 1; - - if (fmesa->state_dirty) - ffbSyncHardware(fmesa); - - ppc = fmesa->ppc; - - FFBFifo(fmesa, 4); - ffb->ppc = ((ppc & - ~(FFB_PPC_TBE_MASK | FFB_PPC_ZS_MASK | FFB_PPC_CS_MASK | FFB_PPC_XS_MASK)) - | (FFB_PPC_TBE_TRANSPARENT | FFB_PPC_ZS_CONST | FFB_PPC_CS_CONST | - (ctx->Color.BlendEnabled ? FFB_PPC_XS_CONST : FFB_PPC_XS_WID))); - ffb->constz = ((GLuint) (ctx->Current.RasterPos[2] * 0x0fffffff)); - ffb->fg = pixel; - ffb->fontinc = (0 << 16) | 32; - - buf = (char *)(fmesa->sfb32 + (dPriv->x << 2) + (dPriv->y << 13)); - - row_stride = (unpack->Alignment * CEILING(width, 8 * unpack->Alignment)); - src = (const GLubyte *) (bitmap + - (unpack->SkipRows * row_stride) + - (unpack->SkipPixels / 8)); - if (unpack->LsbFirst == GL_TRUE) { - for (row = 0; row < height; row++, src += row_stride) { - const GLubyte *row_src = src; - GLuint base_x, base_y; - - base_x = dPriv->x + px; - base_y = dPriv->y + (dPriv->h - (py + row)); - - FFBFifo(fmesa, 1); - ffb->fontxy = (base_y << 16) | base_x; - - for (col = 0; col < width; col += 32, row_src += 4) { - GLint bitnum, font_w = (width - col); - GLuint font_data; - - if (font_w > 32) - font_w = 32; - font_data = 0; - for (bitnum = 0; bitnum < 32; bitnum++) { - const GLubyte val = row_src[bitnum >> 3]; - - if (val & (1 << (bitnum & (8 - 1)))) - font_data |= (1 << (31 - bitnum)); - } - - FFBFifo(fmesa, 2); - ffb->fontw = font_w; - ffb->font = font_data; - } - } - } else { - for (row = 0; row < height; row++, src += row_stride) { - const GLubyte *row_src = src; - GLuint base_x, base_y; - - base_x = dPriv->x + px; - base_y = dPriv->y + (dPriv->h - (py + row)); - - FFBFifo(fmesa, 1); - ffb->fontxy = (base_y << 16) | base_x; - - for (col = 0; col < width; col += 32, row_src += 4) { - GLint font_w = (width - col); - - if (font_w > 32) - font_w = 32; - FFBFifo(fmesa, 2); - ffb->fontw = font_w; - ffb->font = (((unsigned int)row_src[0]) << 24 | - ((unsigned int)row_src[1]) << 16 | - ((unsigned int)row_src[2]) << 8 | - ((unsigned int)row_src[3]) << 0); - } - } - } - - FFBFifo(fmesa, 1); - ffb->ppc = ppc; - fmesa->ffbScreen->rp_active = 1; - - UNLOCK_HARDWARE(fmesa); - fmesa->hw_locked = 0; -} - -void ffbDDInitBitmapFuncs(GLcontext *ctx) -{ - ctx->Driver.Bitmap = ffb_bitmap; -} diff --git a/src/mesa/drivers/dri/ffb/ffb_bitmap.h b/src/mesa/drivers/dri/ffb/ffb_bitmap.h deleted file mode 100644 index 0ccbc57bd09..00000000000 --- a/src/mesa/drivers/dri/ffb/ffb_bitmap.h +++ /dev/null @@ -1,7 +0,0 @@ - -#ifndef _FFB_BITMAP_H -#define _FFB_BITMAP_H - -extern void ffbDDInitBitmapFuncs(GLcontext *); - -#endif /* !(_FFB_BITMAP_H) */ diff --git a/src/mesa/drivers/dri/ffb/ffb_clear.c b/src/mesa/drivers/dri/ffb/ffb_clear.c deleted file mode 100644 index aa3fa0a86c5..00000000000 --- a/src/mesa/drivers/dri/ffb/ffb_clear.c +++ /dev/null @@ -1,335 +0,0 @@ -/* - * - * GLX Hardware Device Driver for Sun Creator/Creator3D - * Copyright (C) 2000 David S. Miller - * - * 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 - * DAVID MILLER, OR ANY OTHER CONTRIBUTORS 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. - * - * - * David S. Miller <[email protected]> - */ - -#include "main/mtypes.h" - -#include "main/mm.h" -#include "ffb_dd.h" -#include "ffb_span.h" -#include "ffb_context.h" -#include "ffb_vb.h" -#include "ffb_clear.h" -#include "ffb_lock.h" - -#undef CLEAR_TRACE - -#define BOX_AREA(__w, __h) ((int)(__w) * (int)(__h)) - -/* Compute the page aligned box for a page mode fast fill. - * In 'ework' this returns greater than zero if there are some odd - * edges to take care of which are outside of the page aligned area. - * It will place less than zero there if the box is too small, - * indicating that a different method must be used to fill it. - */ -#define CreatorPageFillParms(ffp, x, y, w, h, px, py, pw, ph, ework) \ -do { int xdiff, ydiff; \ - int pf_bh = ffp->pagefill_height; \ - int pf_bw = ffp->pagefill_width; \ - py = ((y + (pf_bh - 1)) & ~(pf_bh - 1)); \ - ydiff = py - y; \ - px = ffp->Pf_AlignTab[x + (pf_bw - 1)]; \ - xdiff = px - x; \ - ph = ((h - ydiff) & ~(pf_bh - 1)); \ - if(ph <= 0) \ - ework = -1; \ - else { \ - pw = ffp->Pf_AlignTab[w - xdiff]; \ - if(pw <= 0) { \ - ework = -1; \ - } else { \ - ework = (((xdiff > 0) || \ - (ydiff > 0) || \ - ((w - pw) > 0) || \ - ((h - ph) > 0))) ? 1 : 0; \ - } \ - } \ -} while(0); - -struct ff_fixups { - int x, y, width, height; -}; - -/* Compute fixups of non-page aligned areas after a page fill. - * Return the number of fixups needed. - */ -static INLINE int -CreatorComputePageFillFixups(struct ff_fixups *fixups, - int x, int y, int w, int h, - int paligned_x, int paligned_y, - int paligned_w, int paligned_h) -{ - int nfixups = 0; - - /* FastFill Left */ - if(paligned_x != x) { - fixups[nfixups].x = x; - fixups[nfixups].y = paligned_y; - fixups[nfixups].width = paligned_x - x; - fixups[nfixups].height = paligned_h; - nfixups++; - } - /* FastFill Top */ - if(paligned_y != y) { - fixups[nfixups].x = x; - fixups[nfixups].y = y; - fixups[nfixups].width = w; - fixups[nfixups].height = paligned_y - y; - nfixups++; - } - /* FastFill Right */ - if((x+w) != (paligned_x+paligned_w)) { - fixups[nfixups].x = (paligned_x+paligned_w); - fixups[nfixups].y = paligned_y; - fixups[nfixups].width = (x+w) - fixups[nfixups].x; - fixups[nfixups].height = paligned_h; - nfixups++; - } - /* FastFill Bottom */ - if((y+h) != (paligned_y+paligned_h)) { - fixups[nfixups].x = x; - fixups[nfixups].y = (paligned_y+paligned_h); - fixups[nfixups].width = w; - fixups[nfixups].height = (y+h) - fixups[nfixups].y; - nfixups++; - } - return nfixups; -} - -static void -ffb_do_clear(GLcontext *ctx, __DRIdrawable *dPriv) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - FFBDRIPtr gDRIPriv = (FFBDRIPtr) fmesa->driScreen->pDevPriv; - ffb_fbcPtr ffb = fmesa->regs; - drm_clip_rect_t *box = dPriv->pClipRects; - int nc = dPriv->numClipRects; - GLint cx, cy, cw, ch; - - /* compute region after locking: */ - cx = ctx->DrawBuffer->_Xmin; - cy = ctx->DrawBuffer->_Ymin; - cw = ctx->DrawBuffer->_Xmax - cx; - ch = ctx->DrawBuffer->_Ymax - cy; - - cy = dPriv->h - cy - ch; - cx += dPriv->x; - cy += dPriv->y; - - while (nc--) { - GLint x = box[nc].x1; - GLint y = box[nc].y1; - GLint width = box[nc].x2 - x; - GLint height = box[nc].y2 - y; - int paligned_y, paligned_x; - int paligned_h, paligned_w = 0; - int extra_work; - - if (BOX_AREA(width, height) < gDRIPriv->fastfill_small_area) { - FFBFifo(fmesa, 5); - ffb->drawop = FFB_DRAWOP_RECTANGLE; - ffb->by = y; - ffb->bx = x; - ffb->bh = height; - ffb->bw = width; - continue; - } - - FFBFifo(fmesa, 1); - ffb->drawop = FFB_DRAWOP_FASTFILL; - - if (gDRIPriv->disable_pagefill || - (width < (gDRIPriv->pagefill_width<<1)) || - (height < (gDRIPriv->pagefill_height<<1))) - goto do_fastfill; - - CreatorPageFillParms(gDRIPriv, - x, y, width, height, - paligned_x, paligned_y, - paligned_w, paligned_h, extra_work); - - if (extra_work < 0 || - BOX_AREA(paligned_w, paligned_h) < gDRIPriv->pagefill_small_area) { - do_fastfill: - FFBFifo(fmesa, 10); - ffb->by = FFB_FASTFILL_COLOR_BLK; - ffb->dy = 0; - ffb->dx = 0; - ffb->bh = gDRIPriv->fastfill_height; - ffb->bw = (gDRIPriv->fastfill_width * 4); - ffb->by = FFB_FASTFILL_BLOCK; - ffb->dy = y; - ffb->dx = x; - ffb->bh = (height + (y & (gDRIPriv->fastfill_height - 1))); - ffb->bx = (width + (x & (gDRIPriv->fastfill_width - 1))); - continue; - } - - /* Ok, page fill is possible and worth it. */ - FFBFifo(fmesa, 15); - ffb->by = FFB_FASTFILL_COLOR_BLK; - ffb->dy = 0; - ffb->dx = 0; - ffb->bh = gDRIPriv->fastfill_height; - ffb->bw = gDRIPriv->fastfill_width * 4; - ffb->by = FFB_FASTFILL_BLOCK_X; - ffb->dy = 0; - ffb->dx = 0; - ffb->bh = gDRIPriv->pagefill_height; - ffb->bw = gDRIPriv->pagefill_width * 4; - ffb->by = FFB_FASTFILL_PAGE; - ffb->dy = paligned_y; - ffb->dx = paligned_x; - ffb->bh = paligned_h; - ffb->bx = paligned_w; - - if (extra_work) { - struct ff_fixups local_fixups[4]; - int nfixups; - - nfixups = CreatorComputePageFillFixups(local_fixups, - x, y, width, height, - paligned_x, paligned_y, - paligned_w, paligned_h); - FFBFifo(fmesa, 5 + (nfixups * 5)); - ffb->by = FFB_FASTFILL_COLOR_BLK; - ffb->dy = 0; - ffb->dx = 0; - ffb->bh = gDRIPriv->fastfill_height; - ffb->bw = gDRIPriv->fastfill_width * 4; - - while (--nfixups >= 0) { - int xx, yy, ww, hh; - - xx = local_fixups[nfixups].x; - yy = local_fixups[nfixups].y; - ffb->dy = yy; - ffb->dx = xx; - ww = (local_fixups[nfixups].width + - (xx & (gDRIPriv->fastfill_width - 1))); - hh = (local_fixups[nfixups].height + - (yy & (gDRIPriv->fastfill_height - 1))); - if (nfixups != 0) { - ffb->by = FFB_FASTFILL_BLOCK; - ffb->bh = hh; - ffb->bw = ww; - } else { - ffb->bh = hh; - ffb->by = FFB_FASTFILL_BLOCK; - ffb->bx = ww; - } - } - } - } -} - -void ffbDDClear(GLcontext *ctx, GLbitfield mask) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - __DRIdrawable *dPriv = fmesa->driDrawable; - unsigned int stcmask = BUFFER_BIT_STENCIL; - -#ifdef CLEAR_TRACE - fprintf(stderr, "ffbDDClear: mask(%08x) \n", mask); -#endif - if (!(fmesa->ffb_sarea->flags & FFB_DRI_FFB2PLUS)) - stcmask = 0; - - if (mask & (BUFFER_BIT_FRONT_LEFT | BUFFER_BIT_BACK_LEFT | BUFFER_BIT_DEPTH | stcmask)) { - ffb_fbcPtr ffb = fmesa->regs; - unsigned int fbc, ppc; - - fbc = (FFB_FBC_XE_ON); - ppc = (FFB_PPC_ACE_DISABLE | FFB_PPC_DCE_DISABLE | - FFB_PPC_ABE_DISABLE | FFB_PPC_VCE_DISABLE | - FFB_PPC_APE_DISABLE | FFB_PPC_XS_WID | - FFB_PPC_ZS_CONST | FFB_PPC_CS_CONST); - - /* Y/X enables must be both on or both off. */ - if (mask & (BUFFER_BIT_DEPTH | stcmask)) { - fbc |= (FFB_FBC_ZE_ON | FFB_FBC_YE_ON | FFB_FBC_WB_C); - } else - fbc |= FFB_FBC_ZE_OFF | FFB_FBC_YE_OFF; - - /* All RGB enables must be both on or both off. */ - if (mask & (BUFFER_BIT_FRONT_LEFT | BUFFER_BIT_BACK_LEFT)) { - if (mask & BUFFER_BIT_FRONT_LEFT) { - if (fmesa->back_buffer == 0) - fbc |= FFB_FBC_WB_B; - else - fbc |= FFB_FBC_WB_A; - } - if (mask & BUFFER_BIT_BACK_LEFT) { - if (fmesa->back_buffer == 0) - fbc |= FFB_FBC_WB_A; - else - fbc |= FFB_FBC_WB_B; - } - fbc |= FFB_FBC_RGBE_ON; - } else - fbc |= FFB_FBC_RGBE_OFF; - - LOCK_HARDWARE(fmesa); - - if (dPriv->numClipRects) { - FFBFifo(fmesa, 8); - ffb->fbc = fbc; - ffb->ppc = ppc; - ffb->xclip = FFB_XCLIP_TEST_ALWAYS; - ffb->cmp = 0x80808080; - ffb->rop = FFB_ROP_NEW; - - if (mask & (BUFFER_BIT_FRONT_LEFT | BUFFER_BIT_BACK_LEFT)) - ffb->fg = fmesa->clear_pixel; - if (mask & BUFFER_BIT_DEPTH) - ffb->constz = fmesa->clear_depth; - if (mask & stcmask) - ffb->consty = fmesa->clear_stencil; - - ffb_do_clear(ctx, dPriv); - - FFBFifo(fmesa, 6); - ffb->ppc = fmesa->ppc; - ffb->fbc = fmesa->fbc; - ffb->xclip = fmesa->xclip; - ffb->cmp = fmesa->cmp; - ffb->rop = fmesa->rop; - ffb->drawop = fmesa->drawop; - if (mask & stcmask) - ffb->consty = fmesa->consty; - fmesa->ffbScreen->rp_active = 1; - } - - UNLOCK_HARDWARE(fmesa); - - mask &= ~(BUFFER_BIT_FRONT_LEFT | BUFFER_BIT_BACK_LEFT | - BUFFER_BIT_DEPTH | stcmask); - } - - if (mask) - _swrast_Clear(ctx, mask); -} - diff --git a/src/mesa/drivers/dri/ffb/ffb_clear.h b/src/mesa/drivers/dri/ffb/ffb_clear.h deleted file mode 100644 index c3b8ce714b3..00000000000 --- a/src/mesa/drivers/dri/ffb/ffb_clear.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef _FFB_CLEAR_H -#define _FFB_CLEAR_H - -extern void ffbDDClear(GLcontext *ctx, GLbitfield mask); - -#endif /* !(_FFB_CLEAR_H) */ diff --git a/src/mesa/drivers/dri/ffb/ffb_context.h b/src/mesa/drivers/dri/ffb/ffb_context.h deleted file mode 100644 index 4d1d53ff59f..00000000000 --- a/src/mesa/drivers/dri/ffb/ffb_context.h +++ /dev/null @@ -1,305 +0,0 @@ - -#ifndef _FFB_CONTEXT_H -#define _FFB_CONTEXT_H - -#include "dri_util.h" -#include "drm.h" - -#include "main/mtypes.h" - -#include "ffb_xmesa.h" - -typedef struct { - GLfloat alpha; - GLfloat red; - GLfloat green; - GLfloat blue; -} ffb_color; - -#define FFB_GET_ALPHA(VTX) \ - FFB_COLOR_FROM_FLOAT((VTX)->color[0].alpha) -#define FFB_GET_RED(VTX) \ - FFB_COLOR_FROM_FLOAT((VTX)->color[0].red) -#define FFB_GET_GREEN(VTX) \ - FFB_COLOR_FROM_FLOAT((VTX)->color[0].green) -#define FFB_GET_BLUE(VTX) \ - FFB_COLOR_FROM_FLOAT((VTX)->color[0].blue) - -typedef struct { - GLfloat x, y, z; - ffb_color color[2]; -} ffb_vertex; - -#define FFB_DELAYED_VIEWPORT_VARS \ - GLfloat VP_SX = fmesa->hw_viewport[MAT_SX]; \ - GLfloat VP_TX = fmesa->hw_viewport[MAT_TX]; \ - GLfloat VP_SY = fmesa->hw_viewport[MAT_SY]; \ - GLfloat VP_TY = fmesa->hw_viewport[MAT_TY]; \ - GLfloat VP_SZ = fmesa->hw_viewport[MAT_SZ]; \ - GLfloat VP_TZ = fmesa->hw_viewport[MAT_TZ]; \ - (void) VP_SX; (void) VP_SY; (void) VP_SZ; \ - (void) VP_TX; (void) VP_TY; (void) VP_TZ - -#define FFB_GET_Z(VTX) \ - FFB_Z_FROM_FLOAT(VP_SZ * (VTX)->z + VP_TZ) -#define FFB_GET_Y(VTX) \ - FFB_XY_FROM_FLOAT(VP_SY * (VTX)->y + VP_TY) -#define FFB_GET_X(VTX) \ - FFB_XY_FROM_FLOAT(VP_SX * (VTX)->x + VP_TX) - -typedef void (*ffb_point_func)(GLcontext *, ffb_vertex *); -typedef void (*ffb_line_func)(GLcontext *, ffb_vertex *, ffb_vertex *); -typedef void (*ffb_tri_func)(GLcontext *, ffb_vertex *, ffb_vertex *, - ffb_vertex *); -typedef void (*ffb_quad_func)(GLcontext *, ffb_vertex *, ffb_vertex *, - ffb_vertex *, ffb_vertex *); - -/* Immediate mode fast-path support. */ -typedef struct { - GLfloat obj[4]; - GLfloat normal[4]; - GLfloat clip[4]; - GLuint mask; - GLfloat color[4]; - GLfloat win[4]; - GLfloat eye[4]; -} ffbTnlVertex, *ffbTnlVertexPtr; - -typedef void (*ffb_interp_func)(GLfloat t, - ffbTnlVertex *O, - const ffbTnlVertex *I, - const ffbTnlVertex *J); - -struct ffb_current_state { - GLfloat color[4]; - GLfloat normal[4]; - GLfloat specular[4]; -}; - -struct ffb_light_state { - GLfloat base_color[3]; - GLfloat base_alpha; -}; - -struct ffb_vertex_state { - struct ffb_current_state current; - struct ffb_light_state light; -}; - -struct ffb_imm_vertex { - ffbTnlVertex vertices[8]; - ffbTnlVertex *v0; - ffbTnlVertex *v1; - ffbTnlVertex *v2; - ffbTnlVertex *v3; - - void (*save_vertex)(GLcontext *ctx, ffbTnlVertex *v); - void (*flush_vertex)(GLcontext *ctx, ffbTnlVertex *v); - - ffb_interp_func interp; - - GLuint prim, format; - - GLvertexformat vtxfmt; -}; - -typedef struct ffb_context_t { - GLcontext *glCtx; - GLframebuffer *glBuffer; - - ffb_fbcPtr regs; - volatile char *sfb32; - - int hw_locked; - - int back_buffer; /* 0 = bufferA, 1 = bufferB */ - - /* Viewport matrix. */ - GLfloat hw_viewport[16]; -#define SUBPIXEL_X (-0.5F) -#define SUBPIXEL_Y (-0.5F + 0.125) - - /* Vertices in driver format. */ - ffb_vertex *verts; - - /* Rasterization functions. */ - ffb_point_func draw_point; - ffb_line_func draw_line; - ffb_tri_func draw_tri; - ffb_quad_func draw_quad; - - GLenum raster_primitive; - GLenum render_primitive; - - GLfloat backface_sign; - GLfloat depth_scale; - - GLfloat ffb_2_30_fixed_scale; - GLfloat ffb_one_over_2_30_fixed_scale; - GLfloat ffb_16_16_fixed_scale; - GLfloat ffb_one_over_16_16_fixed_scale; - GLfloat ffb_ubyte_color_scale; - GLfloat ffb_zero; - - /* Immediate mode state. */ - struct ffb_vertex_state vtx_state; - struct ffb_imm_vertex imm; - - /* Debugging knobs. */ - GLboolean debugFallbacks; - - /* This records state bits when a per-fragment attribute has - * been set which prevents us from rendering in hardware. - * - * As attributes change, some of these bits may clear as - * we move back within the chips capabilities. If they - * all clear, we return to full hw rendering. - */ - unsigned int bad_fragment_attrs; -#define FFB_BADATTR_FOG 0x00000001 /* Bad fog possible only when < FFB2 */ -#define FFB_BADATTR_BLENDFUNC 0x00000002 /* Any non-const func based upon dst alpha */ -#define FFB_BADATTR_BLENDROP 0x00000004 /* Blend enabled and LogicOP != GL_COPY */ -#define FFB_BADATTR_BLENDEQN 0x00000008 /* Blend equation other than ADD */ -#define FFB_BADATTR_STENCIL 0x00000010 /* Stencil enabled when < FFB2+ */ -#define FFB_BADATTR_TEXTURE 0x00000020 /* Texture enabled */ -#define FFB_BADATTR_SWONLY 0x00000040 /* Environment var set */ - - unsigned int state_dirty; - unsigned int state_fifo_ents; -#define FFB_STATE_FBC 0x00000001 -#define FFB_STATE_PPC 0x00000002 -#define FFB_STATE_DRAWOP 0x00000004 -#define FFB_STATE_ROP 0x00000008 -#define FFB_STATE_LPAT 0x00000010 -#define FFB_STATE_PMASK 0x00000020 -#define FFB_STATE_XPMASK 0x00000040 -#define FFB_STATE_YPMASK 0x00000080 -#define FFB_STATE_ZPMASK 0x00000100 -#define FFB_STATE_XCLIP 0x00000200 -#define FFB_STATE_CMP 0x00000400 -#define FFB_STATE_MATCHAB 0x00000800 -#define FFB_STATE_MAGNAB 0x00001000 -#define FFB_STATE_MATCHC 0x00002000 -#define FFB_STATE_MAGNC 0x00004000 -#define FFB_STATE_DCUE 0x00008000 -#define FFB_STATE_BLEND 0x00010000 -#define FFB_STATE_CLIP 0x00020000 -#define FFB_STATE_STENCIL 0x00040000 -#define FFB_STATE_APAT 0x00080000 -#define FFB_STATE_WID 0x00100000 -#define FFB_STATE_ALL 0x001fffff - - unsigned int state_all_fifo_ents; - -#define FFB_MAKE_DIRTY(FMESA, STATE_MASK, FIFO_ENTS) \ -do { if ((STATE_MASK) & ~((FMESA)->state_dirty)) { \ - (FMESA)->state_dirty |= (STATE_MASK); \ - (FMESA)->state_fifo_ents += FIFO_ENTS; \ - } \ -} while (0) - - /* General hw reg state. */ - unsigned int fbc; - unsigned int ppc; - unsigned int drawop; - unsigned int rop; - - unsigned int lpat; -#define FFB_LPAT_BAD 0xffffffff - - unsigned int wid; - unsigned int pmask; - unsigned int xpmask; - unsigned int ypmask; - unsigned int zpmask; - unsigned int xclip; - unsigned int cmp; - unsigned int matchab; - unsigned int magnab; - unsigned int matchc; - unsigned int magnc; - - /* Depth cue unit hw reg state. */ - unsigned int dcss; /* All FFB */ - unsigned int dcsf; /* All FFB */ - unsigned int dcsb; /* All FFB */ - unsigned int dczf; /* All FFB */ - unsigned int dczb; /* All FFB */ - unsigned int dcss1; /* >=FFB2 only */ - unsigned int dcss2; /* >=FFB2 only */ - unsigned int dcss3; /* >=FFB2 only */ - unsigned int dcs2; /* >=FFB2 only */ - unsigned int dcs3; /* >=FFB2 only */ - unsigned int dcs4; /* >=FFB2 only */ - unsigned int dcd2; /* >=FFB2 only */ - unsigned int dcd3; /* >=FFB2 only */ - unsigned int dcd4; /* >=FFB2 only */ - - /* Blend unit hw reg state. */ - unsigned int blendc; - unsigned int blendc1; - unsigned int blendc2; - - /* ViewPort clipping hw reg state. */ - unsigned int vclipmin; - unsigned int vclipmax; - unsigned int vclipzmin; - unsigned int vclipzmax; - struct { - unsigned int min; - unsigned int max; - } aux_clips[4]; - - /* Stencil control hw reg state. >=FFB2+ only. */ - unsigned int stencil; - unsigned int stencilctl; - unsigned int consty; /* Stencil Ref */ - - /* Area pattern (used for polygon stipples). */ - unsigned int pattern[32]; - - /* Fog state. */ - float Znear, Zfar; - - drm_context_t hHWContext; - drm_hw_lock_t *driHwLock; - int driFd; - - unsigned int clear_pixel; - unsigned int clear_depth; - unsigned int clear_stencil; - - unsigned int setupindex; - unsigned int setupnewinputs; - unsigned int new_gl_state; - - __DRIdrawable *driDrawable; - __DRIscreen *driScreen; - ffbScreenPrivate *ffbScreen; - ffb_dri_state_t *ffb_sarea; -} ffbContextRec, *ffbContextPtr; - -#define FFB_CONTEXT(ctx) ((ffbContextPtr)((ctx)->DriverCtx)) - -/* We want the depth values written during software rendering - * to match what the hardware is going to put there when we - * hw render. - * - * The Z buffer is 28 bits deep. Smooth shaded primitives - * specify a 2:30 signed fixed point Z value in the range 0.0 - * to 1.0 inclusive. - * - * So for example, when hw rendering, the largest Z value of - * 1.0 would produce a value of 0x0fffffff in the actual Z - * buffer, which is the maximum value. - * - * Mesa's depth type is a 32-bit uint, so we use the following macro - * to convert to/from FFB hw Z values. Note we also have to clear - * out the top bits as that is where the Y (stencil) buffer is stored - * and during hw Z buffer reads it is always there. (During writes - * we tell the hw to discard those top 4 bits). - */ -#define Z_TO_MESA(VAL) ((GLuint)(((VAL) & 0x0fffffff) << (32 - 28))) -#define Z_FROM_MESA(VAL) (((GLuint)((GLdouble)(VAL))) >> (32 - 28)) - -#endif /* !(_FFB_CONTEXT_H) */ diff --git a/src/mesa/drivers/dri/ffb/ffb_dd.c b/src/mesa/drivers/dri/ffb/ffb_dd.c deleted file mode 100644 index 91b6d3153af..00000000000 --- a/src/mesa/drivers/dri/ffb/ffb_dd.c +++ /dev/null @@ -1,115 +0,0 @@ -/* - * - * GLX Hardware Device Driver for Sun Creator/Creator3D - * Copyright (C) 2000, 2001 David S. Miller - * - * 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 - * DAVID MILLER, OR ANY OTHER CONTRIBUTORS 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. - * - * - * David S. Miller <[email protected]> - */ - -#include "main/mtypes.h" -#include "main/mm.h" -#include "ffb_dd.h" -#include "ffb_span.h" -#include "ffb_context.h" -#include "ffb_clear.h" -#include "ffb_lock.h" - -#define FFB_DATE "20021125" - -PUBLIC const char __driConfigOptions[] = { 0 }; -const GLuint __driNConfigOptions = 0; - -/* Mesa's Driver Functions */ - -static const GLubyte *ffbDDGetString(GLcontext *ctx, GLenum name) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - static char buffer[128]; - - switch (name) { - case GL_VENDOR: - return (GLubyte *) "David S. Miller"; - - case GL_RENDERER: - sprintf(buffer, "Mesa DRI FFB " FFB_DATE); - - if (fmesa->ffb_sarea->flags & FFB_DRI_FFB2) - strncat(buffer, " FFB2", 5); - if (fmesa->ffb_sarea->flags & FFB_DRI_FFB2PLUS) - strncat(buffer, " FFB2PLUS", 9); - if (fmesa->ffb_sarea->flags & FFB_DRI_PAC1) - strncat(buffer, " PAC1", 5); - if (fmesa->ffb_sarea->flags & FFB_DRI_PAC2) - strncat(buffer, " PAC2", 5); - -#ifdef USE_SPARC_ASM - strncat(buffer, " Sparc", 6); -#endif - - return (GLubyte *) buffer; - - default: - return NULL; - }; -} - - -static void ffbBufferSize(GLframebuffer *buffer, GLuint *width, GLuint *height) -{ - GET_CURRENT_CONTEXT(ctx); - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - - LOCK_HARDWARE(fmesa); - *width = fmesa->driDrawable->w; - *height = fmesa->driDrawable->h; - UNLOCK_HARDWARE(fmesa); -} - -void ffbDDExtensionsInit(GLcontext *ctx) -{ - /* Nothing for now until we start to add - * real acceleration. -DaveM - */ - - /* XXX Need to turn off GL_EXT_blend_func_separate for one. - * XXX Also BlendEquation should be turned off too, what - * XXX EXT is that assosciated with? - */ -} - -static void ffbDDFinish(GLcontext *ctx) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - - LOCK_HARDWARE(fmesa); - FFBWait(fmesa, fmesa->regs); - UNLOCK_HARDWARE(fmesa); -} - -void ffbDDInitDriverFuncs(GLcontext *ctx) -{ - ctx->Driver.GetBufferSize = ffbBufferSize; - ctx->Driver.GetString = ffbDDGetString; - ctx->Driver.Clear = ffbDDClear; - - ctx->Driver.Finish = ffbDDFinish; -} diff --git a/src/mesa/drivers/dri/ffb/ffb_dd.h b/src/mesa/drivers/dri/ffb/ffb_dd.h deleted file mode 100644 index 1198cda30a1..00000000000 --- a/src/mesa/drivers/dri/ffb/ffb_dd.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * - * GLX Hardware Device Driver for Sun Creator/Creator3D. - * Copyright (C) 2000 David S. Miller - * - * 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 - * DAVID MILLER, OR ANY OTHER CONTRIBUTORS 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. - * - * - * David S. Miller <[email protected]> - */ - -#ifndef _FFB_DD_H -#define _FFB_DD_H - -#include "main/context.h" - -void ffbDDInitDriverFuncs(GLcontext *ctx); -void ffbDDExtensionsInit(GLcontext *ctx); - -#endif /* !(_FFB_DD_H) */ diff --git a/src/mesa/drivers/dri/ffb/ffb_depth.c b/src/mesa/drivers/dri/ffb/ffb_depth.c deleted file mode 100644 index d19385b776b..00000000000 --- a/src/mesa/drivers/dri/ffb/ffb_depth.c +++ /dev/null @@ -1,243 +0,0 @@ -/* - * - * GLX Hardware Device Driver for Sun Creator/Creator3D - * Copyright (C) 2000 David S. Miller - * - * 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 - * DAVID MILLER, OR ANY OTHER CONTRIBUTORS 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. - * - * - * David S. Miller <[email protected]> - */ - -#include "main/mtypes.h" -#include "ffb_dd.h" -#include "ffb_span.h" -#include "ffb_context.h" -#include "ffb_depth.h" -#include "ffb_lock.h" - - -#undef DEPTH_TRACE - -static void FFBWriteDepthSpan( GLcontext *ctx, - struct gl_renderbuffer *rb, - GLuint n, GLint x, GLint y, - const void *values, - const GLubyte mask[] ) -{ - const GLuint *depth = (const GLuint *) values; -#ifdef DEPTH_TRACE - fprintf(stderr, "FFBWriteDepthSpan: n(%d) x(%d) y(%d)\n", - (int) n, x, y); -#endif - if (ctx->Depth.Mask) { - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - __DRIdrawable *dPriv = fmesa->driDrawable; - GLuint *zptr; - GLuint i; - - if (!fmesa->hw_locked) - LOCK_HARDWARE(fmesa); - FFBFifo(fmesa, 2); - fmesa->regs->fbc = (FFB_FBC_WB_C | FFB_FBC_ZE_ON | - FFB_FBC_YE_OFF | FFB_FBC_RGBE_OFF); - fmesa->regs->ppc = FFB_PPC_ZS_VAR; - FFBWait(fmesa, fmesa->regs); - - y = (dPriv->h - y); - zptr = (GLuint *) - ((char *)fmesa->sfb32 + - ((dPriv->x + x) << 2) + - ((dPriv->y + y) << 13)); - - for (i = 0; i < n; i++) { - if (mask[i]) { - *zptr = Z_FROM_MESA(depth[i]); - } - zptr++; - } - - FFBFifo(fmesa, 2); - fmesa->regs->fbc = fmesa->fbc; - fmesa->regs->ppc = fmesa->ppc; - fmesa->ffbScreen->rp_active = 1; - if (!fmesa->hw_locked) - UNLOCK_HARDWARE(fmesa); - } -} - -static void FFBWriteMonoDepthSpan( GLcontext *ctx, - struct gl_renderbuffer *rb, - GLuint n, GLint x, GLint y, - const void *value, const GLubyte mask[] ) -{ - const GLuint depthVal = *((GLuint *) value); - GLuint depths[MAX_WIDTH]; - GLuint i; - for (i = 0; i < n; i++) - depths[i] = depthVal; - FFBWriteDepthSpan(ctx, rb, n, x, y, depths, mask); -} - -static void FFBWriteDepthPixels( GLcontext *ctx, - struct gl_renderbuffer *rb, - GLuint n, - const GLint x[], - const GLint y[], - const void *values, - const GLubyte mask[] ) -{ - const GLuint *depth = (const GLuint *) values; -#ifdef DEPTH_TRACE - fprintf(stderr, "FFBWriteDepthPixels: n(%d)\n", (int) n); -#endif - if (ctx->Depth.Mask) { - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - __DRIdrawable *dPriv = fmesa->driDrawable; - char *zbase; - GLuint i; - - if (!fmesa->hw_locked) - LOCK_HARDWARE(fmesa); - FFBFifo(fmesa, 2); - fmesa->regs->fbc = (FFB_FBC_WB_C | FFB_FBC_ZE_ON | - FFB_FBC_YE_OFF | FFB_FBC_RGBE_OFF); - fmesa->regs->ppc = FFB_PPC_ZS_VAR; - fmesa->ffbScreen->rp_active = 1; - FFBWait(fmesa, fmesa->regs); - - zbase = ((char *)fmesa->sfb32 + - (dPriv->x << 2) + (dPriv->y << 13)); - - for (i = 0; i < n; i++) { - GLint y1 = (dPriv->h - y[i]); - GLint x1 = x[i]; - GLuint *zptr; - - zptr = (GLuint *) - (zbase + (x1 << 2) + (y1 << 13)); - if (mask[i]) - *zptr = Z_FROM_MESA(depth[i]); - } - - FFBFifo(fmesa, 2); - fmesa->regs->fbc = fmesa->fbc; - fmesa->regs->ppc = fmesa->ppc; - fmesa->ffbScreen->rp_active = 1; - if (!fmesa->hw_locked) - UNLOCK_HARDWARE(fmesa); - } -} - -static void FFBReadDepthSpan( GLcontext *ctx, - struct gl_renderbuffer *rb, - GLuint n, GLint x, GLint y, - void *values ) -{ - GLuint *depth = (GLuint *) values; - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - __DRIdrawable *dPriv = fmesa->driDrawable; - GLuint *zptr; - GLuint i; - -#ifdef DEPTH_TRACE - fprintf(stderr, "FFBReadDepthSpan: n(%d) x(%d) y(%d)\n", - (int) n, x, y); -#endif - if (!fmesa->hw_locked) - LOCK_HARDWARE(fmesa); - FFBFifo(fmesa, 1); - fmesa->regs->fbc = FFB_FBC_RB_C; - fmesa->ffbScreen->rp_active = 1; - FFBWait(fmesa, fmesa->regs); - - y = (dPriv->h - y); - zptr = (GLuint *) - ((char *)fmesa->sfb32 + - ((dPriv->x + x) << 2) + - ((dPriv->y + y) << 13)); - - for (i = 0; i < n; i++) { - depth[i] = Z_TO_MESA(*zptr); - zptr++; - } - - FFBFifo(fmesa, 1); - fmesa->regs->fbc = fmesa->fbc; - fmesa->ffbScreen->rp_active = 1; - if (!fmesa->hw_locked) - UNLOCK_HARDWARE(fmesa); -} - -static void FFBReadDepthPixels( GLcontext *ctx, - struct gl_renderbuffer *rb, - GLuint n, - const GLint x[], const GLint y[], - void *values ) -{ - GLuint *depth = (GLuint *) values; - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - __DRIdrawable *dPriv = fmesa->driDrawable; - char *zbase; - GLuint i; - -#ifdef DEPTH_TRACE - fprintf(stderr, "FFBReadDepthPixels: n(%d)\n", (int) n); -#endif - if (!fmesa->hw_locked) - LOCK_HARDWARE(fmesa); - FFBFifo(fmesa, 1); - fmesa->regs->fbc = FFB_FBC_RB_C; - fmesa->ffbScreen->rp_active = 1; - FFBWait(fmesa, fmesa->regs); - - zbase = ((char *)fmesa->sfb32 + - (dPriv->x << 2) + (dPriv->y << 13)); - - for (i = 0; i < n; i++) { - GLint y1 = (dPriv->h - y[i]); - GLint x1 = x[i]; - GLuint *zptr; - - zptr = (GLuint *) - (zbase + (x1 << 2) + (y1 << 13)); - depth[i] = Z_TO_MESA(*zptr); - } - - FFBFifo(fmesa, 1); - fmesa->regs->fbc = fmesa->fbc; - fmesa->ffbScreen->rp_active = 1; - if (!fmesa->hw_locked) - UNLOCK_HARDWARE(fmesa); -} - -/** - * Plug in the Get/Put routines for the given driRenderbuffer. - */ -void -ffbSetDepthFunctions(driRenderbuffer *drb, const GLvisual *vis) -{ - assert(drb->Base.InternalFormat == GL_DEPTH_COMPONENT16); - drb->Base.GetRow = FFBReadDepthSpan; - drb->Base.GetValues = FFBReadDepthPixels; - drb->Base.PutRow = FFBWriteDepthSpan; - drb->Base.PutMonoRow = FFBWriteMonoDepthSpan; - drb->Base.PutValues = FFBWriteDepthPixels; - drb->Base.PutMonoValues = NULL; -} diff --git a/src/mesa/drivers/dri/ffb/ffb_depth.h b/src/mesa/drivers/dri/ffb/ffb_depth.h deleted file mode 100644 index 8a1829ed494..00000000000 --- a/src/mesa/drivers/dri/ffb/ffb_depth.h +++ /dev/null @@ -1,7 +0,0 @@ - -#ifndef _FFB_DEPTH_H -#define _FFB_DEPTH_H - -void ffbSetDepthFunctions(driRenderbuffer *drb, const GLvisual *vis); - -#endif /* !(_FFB_DEPTH_H) */ diff --git a/src/mesa/drivers/dri/ffb/ffb_fifo.h b/src/mesa/drivers/dri/ffb/ffb_fifo.h deleted file mode 100644 index a175f38643d..00000000000 --- a/src/mesa/drivers/dri/ffb/ffb_fifo.h +++ /dev/null @@ -1,27 +0,0 @@ - -#ifndef _FFB_FIFO_H -#define _FFB_FIFO_H - -#define FFBFifo(__fmesa, __n) \ -do { ffbScreenPrivate *__fScrn = (__fmesa)->ffbScreen; \ - int __cur_slots = __fScrn->fifo_cache; \ - if ((__cur_slots - (__n)) < 0) { \ - ffb_fbcPtr __ffb = __fmesa->regs; \ - do { __cur_slots = (((int)__ffb->ucsr & FFB_UCSR_FIFO_MASK) - 4); \ - } while ((__cur_slots - (__n)) < 0); \ - } (__fScrn)->fifo_cache = (__cur_slots - (__n)); \ -} while(0) - -#define FFBWait(__fmesa, __ffb) \ -do { ffbScreenPrivate *__fScrn = (__fmesa)->ffbScreen; \ - if (__fScrn->rp_active) { \ - unsigned int __regval = (__ffb)->ucsr; \ - while((__regval & FFB_UCSR_ALL_BUSY) != 0) { \ - __regval = (__ffb)->ucsr; \ - } \ - __fScrn->fifo_cache = ((int)(__regval & FFB_UCSR_FIFO_MASK)) - 4; \ - __fScrn->rp_active = 0; \ - } \ -} while(0) - -#endif /* !(_FFB_FIFO_H) */ diff --git a/src/mesa/drivers/dri/ffb/ffb_fog.c b/src/mesa/drivers/dri/ffb/ffb_fog.c deleted file mode 100644 index e6eca2390ee..00000000000 --- a/src/mesa/drivers/dri/ffb/ffb_fog.c +++ /dev/null @@ -1,73 +0,0 @@ - -/* FFB fog support: - * - * There are two levels of support for FOG in the Creator3D series. - * Both involve a depth cue unit and 1 or 4 slope factors and scales - * for varying the pixel intensity. - * - * Chips prior to FFB2 only have a single set of such settings, FFB2 - * and later have 4 settings. - * - * The basic depth cueing equation is: - * - * C_final = dcsf(z) * C_orig + (1 - dcsf(z)) * C_fog - * - * C_final -- The final color passed to blend unit or frame - * buffer (if blending is disabled). - * - * C_orig -- The color we start with, which comes either from - * the raster processor or cpu writes to the smart - * framebuffer aperture. - * - * C_fog -- This is the "fog" color, ie. the desired color - * at the deepest Z. - * - * dcsf(z) -- The depth cue scale as a function of Z. - * - * With pre-FFB2 chips there are four parameters to control the depth - * cue scaling. Here is a diagram: - * - * 1.0 ------------- - * | | | | - * | | | | - * Sfront XXXXX---+---+ - * | |X | | - * dcsf(z) | | X | | - * | | X| | - * Sback +---+---XXXXX - * | | | | - * 0.0 ------------- - * 0.0 Zf Zb 1.0 - * - * z - * Therefore: - * - * for Zf < z < Zb - * - * dcsf(z) = Sback + ((Sfront - Sback) / (Zf - Zb)) * (Zb - z) - * - * for z <= Zf - * - * dcsf(z) = Sfront - * - * for z >= Zb - * - * dcsf(z) = Sback - * - * With FFB2 and later, 3 more slope regions are provided, the first of - * them starts at the end of the region defined above and ends at a - * specified depth value, the next slop region starts there and ends - * at the next specified depth value, and so on. Each of the 3 slope - * regions also have scale and slope settings of their own. - * - * The C_fog color is programmed into the alpha blending unit color1 - * and color2 registers as follows: - * - * color1: -(C_fog) - * color2: C_fog - bg - * - * If alpha blending is disabled, the bg factor is zero. Note that - * the alpha blending color registers specify each of the RGB values - * as 9 bit 1:8 signed numbers in the range -1.00 to 0.ff inclusive. - * (ie. 0x100 == -1.00 and 0x0ff == +0.ff) - */ diff --git a/src/mesa/drivers/dri/ffb/ffb_lines.c b/src/mesa/drivers/dri/ffb/ffb_lines.c deleted file mode 100644 index 6dca4edd29b..00000000000 --- a/src/mesa/drivers/dri/ffb/ffb_lines.c +++ /dev/null @@ -1,107 +0,0 @@ -/* - * - * GLX Hardware Device Driver for Sun Creator/Creator3D - * Copyright (C) 2000, 2001 David S. Miller - * - * 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 - * DAVID MILLER, OR ANY OTHER CONTRIBUTORS 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. - * - * - * David S. Miller <[email protected]> - */ - -#include "main/mtypes.h" -#include "main/mm.h" -#include "ffb_dd.h" -#include "ffb_span.h" -#include "ffb_context.h" -#include "ffb_vb.h" -#include "ffb_lines.h" - -#undef FFB_LINE_TRACE - -#define FFB_LINE_FLAT_BIT 0x01 -#define FFB_LINE_ALPHA_BIT 0x02 -#define MAX_FFB_LINE_FUNCS 0x04 - -static ffb_line_func ffb_line_tab[MAX_FFB_LINE_FUNCS]; - -/* If the line is not wide, we can support all of the line - * patterning and smooth shading features of OpenGL fully. - */ - -#define IND (0) -#define TAG(x) x -#include "ffb_linetmp.h" - -#define IND (FFB_LINE_FLAT_BIT) -#define TAG(x) x##_flat -#include "ffb_linetmp.h" - -#define IND (FFB_LINE_ALPHA_BIT) -#define TAG(x) x##_alpha -#include "ffb_linetmp.h" - -#define IND (FFB_LINE_ALPHA_BIT|FFB_LINE_FLAT_BIT) -#define TAG(x) x##_alpha_flat -#include "ffb_linetmp.h" - -void ffbDDLinefuncInit(void) -{ - init(); - init_flat(); - init_alpha(); - init_alpha_flat(); -} - -static void ffb_dd_line( GLcontext *ctx, GLuint e0, GLuint e1 ) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - ffb_vertex *v0 = &fmesa->verts[e0]; - ffb_vertex *v1 = &fmesa->verts[e1]; - fmesa->draw_line( ctx, v0, v1 ); -} - -void ffbChooseLineState(GLcontext *ctx) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - TNLcontext *tnl = TNL_CONTEXT(ctx); - GLuint flags = ctx->_TriangleCaps; - GLuint ind = 0; - - tnl->Driver.Render.Line = ffb_dd_line; - - if (flags & DD_FLATSHADE) - ind |= FFB_LINE_FLAT_BIT; - - if ((flags & DD_LINE_STIPPLE) != 0 && - fmesa->lpat == FFB_LPAT_BAD) { - fmesa->draw_line = ffb_fallback_line; - return; - } - - /* If blending or the alpha test is enabled we need to - * provide alpha components to the chip, else we can - * do without it and thus feed vertex data to the chip - * more efficiently. - */ - if (ctx->Color.BlendEnabled || ctx->Color.AlphaEnabled) - ind |= FFB_LINE_ALPHA_BIT; - - fmesa->draw_line = ffb_line_tab[ind]; -} diff --git a/src/mesa/drivers/dri/ffb/ffb_lines.h b/src/mesa/drivers/dri/ffb/ffb_lines.h deleted file mode 100644 index ddb93656539..00000000000 --- a/src/mesa/drivers/dri/ffb/ffb_lines.h +++ /dev/null @@ -1,17 +0,0 @@ - -#ifndef _FFB_LINES_H -#define _FFB_LINES_H - -#include "ffb_context.h" - -#define _FFB_NEW_LINE (_DD_NEW_FLATSHADE | \ - _DD_NEW_LINE_WIDTH | \ - _DD_NEW_LINE_STIPPLE | \ - _DD_NEW_LINE_SMOOTH | \ - _NEW_COLOR) - -extern void ffbDDLinefuncInit(void); -extern void ffbChooseLineState(GLcontext *); -extern void ffb_fallback_line( GLcontext *ctx, ffb_vertex *v0, ffb_vertex *v1 ); - -#endif /* !(_FFB_LINES_H) */ diff --git a/src/mesa/drivers/dri/ffb/ffb_linetmp.h b/src/mesa/drivers/dri/ffb/ffb_linetmp.h deleted file mode 100644 index 10e1375259b..00000000000 --- a/src/mesa/drivers/dri/ffb/ffb_linetmp.h +++ /dev/null @@ -1,80 +0,0 @@ - -static INLINE void TAG(ffb_line)(GLcontext *ctx, ffb_vertex *v0, - ffb_vertex *v1 ) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - ffb_fbcPtr ffb = fmesa->regs; -#if (IND & FFB_LINE_FLAT_BIT) - const GLuint const_fg = FFB_PACK_CONST_UBYTE_ARGB_COLOR( v1->color[0] ); -#endif - FFB_DELAYED_VIEWPORT_VARS; - -#ifdef FFB_LINE_TRACE - fprintf(stderr, "FFB: ffb_line [" -#if (IND & FFB_LINE_FLAT_BIT) - " FLAT" -#endif -#if (IND & FFB_LINE_ALPHA_BIT) - " ALPHA" -#endif - " ]\n"); -#endif - -#if (IND & FFB_LINE_FLAT_BIT) - FFBFifo(fmesa, 1); - ffb->fg = const_fg; -#ifdef FFB_LINE_TRACE - fprintf(stderr, "FFB: ffb_line confg_fg[%08x]\n", const_fg); -#endif -#endif - -#if (IND & FFB_LINE_FLAT_BIT) - /* (2 * 3) + 1 */ - FFBFifo(fmesa, 7); -#else -#if (IND & FFB_LINE_ALPHA_BIT) - /* (2 * 7) + 1 */ - FFBFifo(fmesa, 15); -#else - /* (2 * 6) + 1 */ - FFBFifo(fmesa, 13); -#endif -#endif - - /* Using DDLINE or AALINE, init the line pattern state. */ - ffb->lpat = fmesa->lpat; - -#if !(IND & FFB_LINE_FLAT_BIT) -#if (IND & FFB_LINE_ALPHA_BIT) - ffb->alpha = FFB_GET_ALPHA(v0); -#endif - ffb->red = FFB_GET_RED(v0); - ffb->green = FFB_GET_GREEN(v0); - ffb->blue = FFB_GET_BLUE(v0); -#endif - ffb->z = FFB_GET_Z(v0); - ffb->ryf = FFB_GET_Y(v0); - ffb->rxf = FFB_GET_X(v0); - -#if !(IND & FFB_LINE_FLAT_BIT) -#if (IND & FFB_LINE_ALPHA_BIT) - ffb->alpha = FFB_GET_ALPHA(v1); -#endif - ffb->red = FFB_GET_RED(v1); - ffb->green = FFB_GET_GREEN(v1); - ffb->blue = FFB_GET_BLUE(v1); -#endif - ffb->z = FFB_GET_Z(v1); - ffb->y = FFB_GET_Y(v1); - ffb->x = FFB_GET_X(v1); - - fmesa->ffbScreen->rp_active = 1; -} - -static void TAG(init)(void) -{ - ffb_line_tab[IND] = TAG(ffb_line); -} - -#undef IND -#undef TAG diff --git a/src/mesa/drivers/dri/ffb/ffb_lock.h b/src/mesa/drivers/dri/ffb/ffb_lock.h deleted file mode 100644 index 1fd3eb55125..00000000000 --- a/src/mesa/drivers/dri/ffb/ffb_lock.h +++ /dev/null @@ -1,36 +0,0 @@ - -#ifndef _FFB_LOCK_H -#define _FFB_LOCK_H - -#include "ffb_context.h" - -extern void ffbXMesaUpdateState(ffbContextPtr fmesa); -#define FFB_UPDATE_STATE(fmesa) ffbXMesaUpdateState(fmesa) - -/* Lock the hardware and validate our state. This hardware can only ever - * exist on SPARC platforms. Don't bother building the real LOCK_HARDWARE and - * UNLOCK_HARDWARE code on non-SPARC platforms. The only reason the driver - * gets built on non-SPARC is to catch build breakages earlier. - */ -#if !defined(__sparc__) -#define LOCK_HARDWARE(fmesa) -#define UNLOCK_HARDWARE(fmesa) -#else -#define LOCK_HARDWARE(fmesa) \ - do { \ - DRM_CAS_RESULT(__ret); \ - DRM_CAS(fmesa->driHwLock, fmesa->hHWContext, \ - (DRM_LOCK_HELD | fmesa->hHWContext), __ret);\ - if (__ret) { \ - drmGetLock(fmesa->driFd, fmesa->hHWContext, 0); \ - FFB_UPDATE_STATE(fmesa); \ - } \ - } while (0) - - -/* Unlock the hardware. */ -#define UNLOCK_HARDWARE(fmesa) \ - DRM_UNLOCK(fmesa->driFd, fmesa->driHwLock, fmesa->hHWContext); -#endif - -#endif /* !(_FFB_LOCK_H) */ diff --git a/src/mesa/drivers/dri/ffb/ffb_points.c b/src/mesa/drivers/dri/ffb/ffb_points.c deleted file mode 100644 index 5bf4f8f0707..00000000000 --- a/src/mesa/drivers/dri/ffb/ffb_points.c +++ /dev/null @@ -1,91 +0,0 @@ -/* - * - * GLX Hardware Device Driver for Sun Creator/Creator3D - * Copyright (C) 2000, 2001 David S. Miller - * - * 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 - * DAVID MILLER, OR ANY OTHER CONTRIBUTORS 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. - * - * - * David S. Miller <[email protected]> - */ - -#include "main/mtypes.h" -#include "ffb_dd.h" -#include "ffb_context.h" -#include "ffb_vb.h" -#include "ffb_points.h" - - -#undef FFB_POINT_TRACE - -#define FFB_POINT_AA_BIT 0x01 - -static ffb_point_func ffb_point_tab[0x08]; - -#define IND (0) -#define TAG(x) x -#include "ffb_pointtmp.h" - -#define IND (FFB_POINT_AA_BIT) -#define TAG(x) x##_aa -#include "ffb_pointtmp.h" - -void ffbDDPointfuncInit(void) -{ - init(); - init_aa(); -} - -static void ffb_dd_points( GLcontext *ctx, GLuint first, GLuint last ) -{ - struct vertex_buffer *VB = &TNL_CONTEXT( ctx )->vb; - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - ffb_vertex *fverts = fmesa->verts; - int i; - - if (VB->Elts == 0) { - for ( i = first ; i < last ; i++ ) { - if ( VB->ClipMask[i] == 0 ) { - fmesa->draw_point( ctx, &fverts[i] ); - } - } - } else { - for ( i = first ; i < last ; i++ ) { - GLuint e = VB->Elts[i]; - if ( VB->ClipMask[e] == 0 ) { - fmesa->draw_point( ctx, &fverts[e] ); - } - } - } -} - -void ffbChoosePointState(GLcontext *ctx) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - TNLcontext *tnl = TNL_CONTEXT(ctx); - GLuint flags = ctx->_TriangleCaps; - GLuint ind = 0; - - tnl->Driver.Render.Points = ffb_dd_points; - - if (flags & DD_POINT_SMOOTH) - ind |= FFB_POINT_AA_BIT; - - fmesa->draw_point = ffb_point_tab[ind]; -} diff --git a/src/mesa/drivers/dri/ffb/ffb_points.h b/src/mesa/drivers/dri/ffb/ffb_points.h deleted file mode 100644 index a7229de7f19..00000000000 --- a/src/mesa/drivers/dri/ffb/ffb_points.h +++ /dev/null @@ -1,14 +0,0 @@ - -#ifndef _FFB_POINTS_H -#define _FFB_POINTS_H - -extern void ffbDDPointfuncInit(void); - -#define _FFB_NEW_POINT (_DD_NEW_POINT_SIZE | \ - _DD_NEW_POINT_SMOOTH | \ - _NEW_COLOR) - -extern void ffbChoosePointState(GLcontext *); -extern void ffb_fallback_point( GLcontext *ctx, ffb_vertex *v0 ); - -#endif /* !(_FFB_POINTS_H) */ diff --git a/src/mesa/drivers/dri/ffb/ffb_pointtmp.h b/src/mesa/drivers/dri/ffb/ffb_pointtmp.h deleted file mode 100644 index 3003de70c69..00000000000 --- a/src/mesa/drivers/dri/ffb/ffb_pointtmp.h +++ /dev/null @@ -1,54 +0,0 @@ - -static INLINE void TAG(ffb_draw_point)(GLcontext *ctx, ffb_vertex *tmp ) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - ffb_fbcPtr ffb = fmesa->regs; - FFB_DELAYED_VIEWPORT_VARS; - -#ifdef FFB_POINT_TRACE - fprintf(stderr, "FFB: ffb_point [" -#if (IND & FFB_POINT_AA_BIT) - "AA" -#endif - "] X(%f) Y(%f) Z(%f)\n", - tmp->x, tmp->y, tmp->z); -#endif - -#if (IND & FFB_POINT_AA_BIT) - FFBFifo(fmesa, 4); - - ffb->fg = FFB_PACK_CONST_UBYTE_ARGB_COLOR( tmp->color[0] ); - ffb->z = FFB_GET_Z(tmp); - ffb->y = FFB_GET_Y(tmp) + 0x8000 /* FIX ME */; - ffb->x = FFB_GET_X(tmp) + 0x8000 /* FIX ME */; -#else - { - unsigned int const_fg, const_z, h, w; - - const_fg = FFB_PACK_CONST_UBYTE_ARGB_COLOR( tmp->color[0] ); - const_z = Z_FROM_MESA(FFB_Z_TO_FLOAT(FFB_GET_Z(tmp))); - h = FFB_GET_Y(tmp) >> 16; - w = FFB_GET_X(tmp) >> 16; -#ifdef FFB_POINT_TRACE - fprintf(stderr, "FFB: ffb_point fg(%08x) z(%08x) h(%08x) w(%08x)\n", - const_fg, const_z, h, w); -#endif - FFBFifo(fmesa, 4); - ffb->fg = const_fg; - ffb->constz = const_z; - ffb->bh = h; - ffb->bw = w; - } -#endif - - fmesa->ffbScreen->rp_active = 1; -} - - -static void TAG(init)(void) -{ - ffb_point_tab[IND] = TAG(ffb_draw_point); -} - -#undef IND -#undef TAG diff --git a/src/mesa/drivers/dri/ffb/ffb_rendertmp.h b/src/mesa/drivers/dri/ffb/ffb_rendertmp.h deleted file mode 100644 index 64141c2c5f6..00000000000 --- a/src/mesa/drivers/dri/ffb/ffb_rendertmp.h +++ /dev/null @@ -1,645 +0,0 @@ - -#define IMPL_LOCAL_VARS \ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); \ - ffb_fbcPtr ffb = fmesa->regs; \ - const GLuint * const elt = TNL_CONTEXT(ctx)->vb.Elts; \ - FFB_DELAYED_VIEWPORT_VARS; \ - (void) fmesa; (void) ffb; (void) elt - -#if (IND & FFB_FLAT_BIT) -#define FFB_DECLARE_CACHED_COLOR(NAME) \ - unsigned int NAME; -#define FFB_COMPUTE_CACHED_COLOR(NAME, VTX) \ - NAME = FFB_PACK_CONST_UBYTE_ARGB_COLOR((VTX)->color[0]) -#define FFB_CACHED_COLOR_SAME(NAME1, NAME2) \ - ((NAME1) == (NAME2)) -#define FFB_CACHED_COLOR_SET(NAME) \ - ffb->fg = (NAME) -#define FFB_CACHED_COLOR_UPDATE(NAME1, NAME2) \ - ffb->fg = (NAME1) = (NAME2) -#define FFB_SET_PRIM_COLOR(COLOR_VERTEX) \ - ffb->fg = FFB_PACK_CONST_UBYTE_ARGB_COLOR((COLOR_VERTEX)->color[0]) -#define FFB_PRIM_COLOR_COST 1 -#define FFB_SET_VERTEX_COLOR(VTX) /**/ -#define FFB_VERTEX_COLOR_COST 0 -#else -#define FFB_DECLARE_CACHED_COLOR(NAME) /**/ -#define FFB_COMPUTE_CACHED_COLOR(NAME, VTX) /**/ -#define FFB_CACHED_COLOR_SAME(NAME1, NAME2) 0 -#define FFB_CACHED_COLOR_SET(NAME1) /**/ -#define FFB_CACHED_COLOR_UPDATE(NAME1, NAME2) /**/ -#define FFB_SET_PRIM_COLOR(COLOR_VERTEX) /**/ -#define FFB_PRIM_COLOR_COST 0 -#if (IND & FFB_ALPHA_BIT) -#define FFB_SET_VERTEX_COLOR(VTX) \ - ffb->alpha = FFB_GET_ALPHA(VTX); \ - ffb->red = FFB_GET_RED(VTX); \ - ffb->green = FFB_GET_GREEN(VTX); \ - ffb->blue = FFB_GET_BLUE(VTX) -#define FFB_VERTEX_COLOR_COST 4 -#else -#define FFB_SET_VERTEX_COLOR(VTX) \ - ffb->red = FFB_GET_RED(VTX); \ - ffb->green = FFB_GET_GREEN(VTX); \ - ffb->blue = FFB_GET_BLUE(VTX) -#define FFB_VERTEX_COLOR_COST 3 -#endif -#endif - -#define RESET_STIPPLE ffb->lpat = fmesa->lpat; - -#if !(IND & (FFB_TRI_CULL_BIT)) -static void TAG(ffb_vb_points)(GLcontext *ctx, GLuint start, GLuint count, GLuint flags) -{ - GLint i; - IMPL_LOCAL_VARS; - -#ifdef FFB_RENDER_TRACE - fprintf(stderr, "%s: start(%d) count(%d) flags(%x)\n", - __FUNCTION__, start, count, flags); -#endif - ffbRenderPrimitive(ctx, GL_POINTS); - if (ctx->_TriangleCaps & DD_POINT_SMOOTH) { - for (i = start; i < count; i++) { - ffb_vertex *v0 = &fmesa->verts[ELT(i)]; - - FFBFifo(fmesa, 4); - ffb->fg = FFB_PACK_CONST_UBYTE_ARGB_COLOR(v0->color[0]); - ffb->z = FFB_GET_Z(v0); - ffb->y = FFB_GET_Y(v0) + 0x8000 /* FIX ME */; - ffb->x = FFB_GET_X(v0) + 0x8000 /* FIX ME */; - } - } else { - for (i = start; i < count; i++) { - ffb_vertex *v0 = &fmesa->verts[ELT(i)]; - FFBFifo(fmesa, 4); - ffb->fg = FFB_PACK_CONST_UBYTE_ARGB_COLOR(v0->color[0]); - ffb->constz = Z_FROM_MESA(FFB_Z_TO_FLOAT(FFB_GET_Z(v0))); - ffb->bh = FFB_GET_Y(v0) >> 16; - ffb->bw = FFB_GET_X(v0) >> 16; - } - } - - fmesa->ffbScreen->rp_active = 1; -} - -static void TAG(ffb_vb_lines)(GLcontext *ctx, GLuint start, GLuint count, GLuint flags) -{ - GLint i; - IMPL_LOCAL_VARS; - -#ifdef FFB_RENDER_TRACE - fprintf(stderr, "%s: start(%d) count(%d) flags(%x)\n", - __FUNCTION__, start, count, flags); -#endif - ffbRenderPrimitive(ctx, GL_LINES); - for (i = start + 1; i < count; i += 2) { - ffb_vertex *v0 = &fmesa->verts[i - 1]; - ffb_vertex *v1 = &fmesa->verts[i - 0]; - - FFBFifo(fmesa, (1 + FFB_PRIM_COLOR_COST + - (FFB_VERTEX_COLOR_COST * 2) + 6)); - - RESET_STIPPLE; - - FFB_SET_PRIM_COLOR(v1); - - FFB_SET_VERTEX_COLOR(v0); - ffb->z = FFB_GET_Z(v0); - ffb->ryf = FFB_GET_Y(v0); - ffb->rxf = FFB_GET_X(v0); - - FFB_SET_VERTEX_COLOR(v1); - ffb->z = FFB_GET_Z(v1); - ffb->y = FFB_GET_Y(v1); - ffb->x = FFB_GET_X(v1); - } -} - -static void TAG(ffb_vb_line_loop)(GLcontext *ctx, GLuint start, GLuint count, GLuint flags) -{ - GLint i; - IMPL_LOCAL_VARS; - -#ifdef FFB_RENDER_TRACE - fprintf(stderr, "%s: start(%d) count(%d) flags(%x)\n", - __FUNCTION__, start, count, flags); -#endif - ffbRenderPrimitive(ctx, GL_LINE_LOOP); - if ((flags & PRIM_BEGIN) != 0) { - ffb_vertex *v0 = &fmesa->verts[ELT(start + 0)]; - ffb_vertex *v1 = &fmesa->verts[ELT(start + 1)]; - - FFBFifo(fmesa, (1 + FFB_PRIM_COLOR_COST + - ((FFB_VERTEX_COLOR_COST * 2) + (3 * 2)))); - - RESET_STIPPLE; - - FFB_SET_PRIM_COLOR(v1); - - FFB_SET_VERTEX_COLOR(v0); - ffb->z = FFB_GET_Z(v0); - ffb->ryf = FFB_GET_Y(v0); - ffb->rxf = FFB_GET_X(v0); - - FFB_SET_VERTEX_COLOR(v1); - ffb->z = FFB_GET_Z(v1); - ffb->y = FFB_GET_Y(v1); - ffb->x = FFB_GET_X(v1); - } - for (i = start + 2; i < count; i++) { - ffb_vertex *v0 = &fmesa->verts[ELT(i)]; - - FFBFifo(fmesa, (FFB_PRIM_COLOR_COST + - (FFB_VERTEX_COLOR_COST + 3))); - - FFB_SET_PRIM_COLOR(v0); - - FFB_SET_VERTEX_COLOR(v0); - ffb->z = FFB_GET_Z(v0); - ffb->y = FFB_GET_Y(v0); - ffb->x = FFB_GET_X(v0); - } - if ((flags & PRIM_END) != 0) { - ffb_vertex *v0 = &fmesa->verts[ELT(start)]; - - FFBFifo(fmesa, (FFB_PRIM_COLOR_COST + - (FFB_VERTEX_COLOR_COST + 3))); - - FFB_SET_PRIM_COLOR(v0); - - FFB_SET_VERTEX_COLOR(v0); - ffb->z = FFB_GET_Z(v0); - ffb->y = FFB_GET_Y(v0); - ffb->x = FFB_GET_X(v0); - } - - fmesa->ffbScreen->rp_active = 1; -} - -static void TAG(ffb_vb_line_strip)(GLcontext *ctx, GLuint start, GLuint count, GLuint flags) -{ - GLint i; - FFB_DECLARE_CACHED_COLOR(cached_fg) - IMPL_LOCAL_VARS; - -#ifdef FFB_RENDER_TRACE - fprintf(stderr, "%s: start(%d) count(%d) flags(%x)\n", - __FUNCTION__, start, count, flags); -#endif - ffbRenderPrimitive(ctx, GL_LINE_STRIP); - FFBFifo(fmesa, (1 + FFB_PRIM_COLOR_COST + - ((FFB_VERTEX_COLOR_COST * 2) + (3 * 2)))); - - RESET_STIPPLE; - - { - ffb_vertex *v0 = &fmesa->verts[ELT(start + 0)]; - ffb_vertex *v1 = &fmesa->verts[ELT(start + 1)]; - - FFB_COMPUTE_CACHED_COLOR(cached_fg, v0); - FFB_CACHED_COLOR_SET(cached_fg); - - FFB_SET_VERTEX_COLOR(v0); - ffb->z = FFB_GET_Z(v0); - ffb->ryf = FFB_GET_Y(v0); - ffb->rxf = FFB_GET_X(v0); - - FFB_SET_VERTEX_COLOR(v1); - ffb->z = FFB_GET_Z(v1); - ffb->y = FFB_GET_Y(v1); - ffb->x = FFB_GET_X(v1); - } - - for (i = start + 2; i < count; i++) { - ffb_vertex *v1 = &fmesa->verts[ELT(i - 0)]; - FFB_DECLARE_CACHED_COLOR(new_fg) - - FFB_COMPUTE_CACHED_COLOR(new_fg, v1); - if (FFB_CACHED_COLOR_SAME(cached_fg, new_fg)) { - FFBFifo(fmesa, ((FFB_VERTEX_COLOR_COST * 1) + (3 * 1))); - } else { - FFBFifo(fmesa, (FFB_PRIM_COLOR_COST + - (FFB_VERTEX_COLOR_COST * 1) + (3 * 1))); - FFB_CACHED_COLOR_UPDATE(cached_fg, new_fg); - } - - FFB_SET_VERTEX_COLOR(v1); - ffb->z = FFB_GET_Z(v1); - ffb->y = FFB_GET_Y(v1); - ffb->x = FFB_GET_X(v1); - } - - fmesa->ffbScreen->rp_active = 1; -} -#endif /* !(IND & (FFB_TRI_CULL_BIT)) */ - -/* OK, now things start getting fun :-) */ -#if (IND & (FFB_TRI_CULL_BIT)) -#define FFB_AREA_DECLARE GLfloat cc, ex, ey, fx, fy; -#define FFB_COMPUTE_AREA_TRI(V0, V1, V2) \ -{ ex = (V1)->x - (V0)->x; \ - ey = (V1)->y - (V0)->y; \ - fx = (V2)->x - (V0)->x; \ - fy = (V2)->y - (V0)->y; \ - cc = ex*fy-ey*fx; \ -} -#define FFB_COMPUTE_AREA_QUAD(V0, V1, V2, V3) \ -{ ex = (V2)->x - (V0)->x; \ - ey = (V2)->y - (V0)->y; \ - fx = (V3)->x - (V1)->x; \ - fy = (V3)->y - (V1)->y; \ - cc = ex*fy-ey*fx; \ -} -#else -#define FFB_AREA_DECLARE /**/ -#define FFB_COMPUTE_AREA_TRI(V0, V1, V2) do { } while(0) -#define FFB_COMPUTE_AREA_QUAD(V0, V1, V2, V3) do { } while(0) -#endif - -#if (IND & FFB_TRI_CULL_BIT) -#define FFB_CULL_TRI(CULL_ACTION) \ - if (cc * fmesa->backface_sign > fmesa->ffb_zero) { \ - CULL_ACTION \ - } -#define FFB_CULL_QUAD(CULL_ACTION) \ - if (cc * fmesa->backface_sign > fmesa->ffb_zero) { \ - CULL_ACTION \ - } -#else -#define FFB_CULL_TRI(CULL_ACTION) do { } while (0) -#define FFB_CULL_QUAD(CULL_ACTION) do { } while (0) -#endif - -static void TAG(ffb_vb_triangles)(GLcontext *ctx, GLuint start, GLuint count, GLuint flags) -{ - GLint i; - IMPL_LOCAL_VARS; - -#ifdef FFB_RENDER_TRACE - fprintf(stderr, "%s: start(%d) count(%d) flags(%x)\n", - __FUNCTION__, start, count, flags); -#endif - ffbRenderPrimitive(ctx, GL_TRIANGLES); - for (i = start + 2; i < count; i += 3) { - ffb_vertex *v0 = &fmesa->verts[ELT(i - 2)]; - ffb_vertex *v1 = &fmesa->verts[ELT(i - 1)]; - ffb_vertex *v2 = &fmesa->verts[ELT(i - 0)]; - FFB_AREA_DECLARE - - FFB_COMPUTE_AREA_TRI(v0, v1, v2); - FFB_CULL_TRI(continue;); - - FFBFifo(fmesa, (FFB_PRIM_COLOR_COST + - (FFB_VERTEX_COLOR_COST * 3) + 9)); - FFB_SET_PRIM_COLOR(v2); - - FFB_SET_VERTEX_COLOR(v0); - ffb->z = FFB_GET_Z(v0); - ffb->ryf = FFB_GET_Y(v0); - ffb->rxf = FFB_GET_X(v0); - - FFB_SET_VERTEX_COLOR(v1); - ffb->z = FFB_GET_Z(v1); - ffb->y = FFB_GET_Y(v1); - ffb->x = FFB_GET_X(v1); - - FFB_SET_VERTEX_COLOR(v2); - ffb->z = FFB_GET_Z(v2); - ffb->y = FFB_GET_Y(v2); - ffb->x = FFB_GET_X(v2); - } - - fmesa->ffbScreen->rp_active = 1; -} - -static void TAG(ffb_vb_tri_strip)(GLcontext *ctx, GLuint start, GLuint count, GLuint flags) -{ - GLint i; - GLint parity = 0; - IMPL_LOCAL_VARS; - -#ifdef FFB_RENDER_TRACE - fprintf(stderr, "%s: start(%d) count(%d) flags(%x)\n", - __FUNCTION__, start, count, flags); -#endif - ffbRenderPrimitive(ctx, GL_TRIANGLE_STRIP); - - i = start + 2; - goto something_clipped; - - something_clipped: - for (; i < count; i++, parity ^= 1) { - ffb_vertex *v0 = &fmesa->verts[ELT(i - 2 + parity)]; - ffb_vertex *v1 = &fmesa->verts[ELT(i - 1 - parity)]; - ffb_vertex *v2 = &fmesa->verts[ELT(i - 0)]; - FFB_AREA_DECLARE - - FFB_COMPUTE_AREA_TRI(v0, v1, v2); - FFB_CULL_TRI(continue;); - - FFBFifo(fmesa, (FFB_PRIM_COLOR_COST + - (FFB_VERTEX_COLOR_COST * 3) + 9)); - FFB_SET_PRIM_COLOR(v2); - - FFB_SET_VERTEX_COLOR(v0); - ffb->z = FFB_GET_Z(v0); - ffb->ryf = FFB_GET_Y(v0); - ffb->rxf = FFB_GET_X(v0); - - FFB_SET_VERTEX_COLOR(v1); - ffb->z = FFB_GET_Z(v1); - ffb->y = FFB_GET_Y(v1); - ffb->x = FFB_GET_X(v1); - - FFB_SET_VERTEX_COLOR(v2); - ffb->z = FFB_GET_Z(v2); - ffb->y = FFB_GET_Y(v2); - ffb->x = FFB_GET_X(v2); - - i++; - parity ^= 1; - break; - } - - for (; i < count; i++, parity ^= 1) { - ffb_vertex *v0 = &fmesa->verts[ELT(i - 2 + parity)]; - ffb_vertex *v1 = &fmesa->verts[ELT(i - 1 - parity)]; - ffb_vertex *v2 = &fmesa->verts[ELT(i - 0)]; - FFB_AREA_DECLARE - (void) v0; (void) v1; - - FFB_COMPUTE_AREA_TRI(v0, v1, v2); - FFB_CULL_TRI(i++; parity^=1; goto something_clipped;); - - FFBFifo(fmesa, (FFB_PRIM_COLOR_COST + - (FFB_VERTEX_COLOR_COST * 1) + 3)); - FFB_SET_PRIM_COLOR(v2); - - FFB_SET_VERTEX_COLOR(v2); - ffb->z = FFB_GET_Z(v2); - ffb->y = FFB_GET_Y(v2); - ffb->x = FFB_GET_X(v2); - } - - fmesa->ffbScreen->rp_active = 1; -} - -static void TAG(ffb_vb_tri_fan)(GLcontext *ctx, GLuint start, GLuint count, GLuint flags) -{ - GLint i; - IMPL_LOCAL_VARS; - -#ifdef FFB_RENDER_TRACE - fprintf(stderr, "%s: start(%d) count(%d) flags(%x)\n", - __FUNCTION__, start, count, flags); -#endif - ffbRenderPrimitive(ctx, GL_TRIANGLE_FAN); - - i = start + 2; - goto something_clipped; - - something_clipped: - for ( ; i < count; i++) { - ffb_vertex *v0 = &fmesa->verts[ELT(start)]; - ffb_vertex *v1 = &fmesa->verts[ELT(i - 1)]; - ffb_vertex *v2 = &fmesa->verts[ELT(i - 0)]; - FFB_AREA_DECLARE - - FFB_COMPUTE_AREA_TRI(v0, v1, v2); - FFB_CULL_TRI(continue;); - - FFBFifo(fmesa, (FFB_PRIM_COLOR_COST + - (FFB_VERTEX_COLOR_COST * 3) + 9)); - FFB_SET_PRIM_COLOR(v2); - - FFB_SET_VERTEX_COLOR(v0); - ffb->z = FFB_GET_Z(v0); - ffb->ryf = FFB_GET_Y(v0); - ffb->rxf = FFB_GET_X(v0); - - FFB_SET_VERTEX_COLOR(v1); - ffb->z = FFB_GET_Z(v1); - ffb->y = FFB_GET_Y(v1); - ffb->x = FFB_GET_X(v1); - - FFB_SET_VERTEX_COLOR(v2); - ffb->z = FFB_GET_Z(v2); - ffb->y = FFB_GET_Y(v2); - ffb->x = FFB_GET_X(v2); - - i++; - break; - } - - for (; i < count; i++) { - ffb_vertex *v0 = &fmesa->verts[ELT(start)]; - ffb_vertex *v1 = &fmesa->verts[ELT(i - 1)]; - ffb_vertex *v2 = &fmesa->verts[ELT(i - 0)]; - FFB_AREA_DECLARE - (void) v0; (void) v1; - - FFB_COMPUTE_AREA_TRI(v0, v1, v2); - FFB_CULL_TRI(i++; goto something_clipped;); - - FFBFifo(fmesa, (FFB_PRIM_COLOR_COST + - (FFB_VERTEX_COLOR_COST * 1) + 3)); - FFB_SET_PRIM_COLOR(v2); - - FFB_SET_VERTEX_COLOR(v2); - ffb->z = FFB_GET_Z(v2); - ffb->dmyf = FFB_GET_Y(v2); - ffb->dmxf = FFB_GET_X(v2); - } - - fmesa->ffbScreen->rp_active = 1; -} - -static void TAG(ffb_vb_poly)(GLcontext *ctx, GLuint start, GLuint count, GLuint flags) -{ - GLint i; - IMPL_LOCAL_VARS; - -#ifdef FFB_RENDER_TRACE - fprintf(stderr, "%s: start(%d) count(%d) flags(%x)\n", - __FUNCTION__, start, count, flags); -#endif - ffbRenderPrimitive(ctx, GL_POLYGON); - - /* XXX Optimize XXX */ - for (i = start + 2; i < count; i++) { - ffb_vertex *v0 = &fmesa->verts[ELT(i - 1)]; - ffb_vertex *v1 = &fmesa->verts[ELT(i)]; - ffb_vertex *v2 = &fmesa->verts[ELT(start)]; - FFB_AREA_DECLARE - - FFB_COMPUTE_AREA_TRI(v0, v1, v2); - FFB_CULL_TRI(continue;); - - FFBFifo(fmesa, (FFB_PRIM_COLOR_COST + - (FFB_VERTEX_COLOR_COST * 3) + 9)); - FFB_SET_PRIM_COLOR(v2); - - FFB_SET_VERTEX_COLOR(v0); - ffb->z = FFB_GET_Z(v0); - ffb->ryf = FFB_GET_Y(v0); - ffb->rxf = FFB_GET_X(v0); - - FFB_SET_VERTEX_COLOR(v1); - ffb->z = FFB_GET_Z(v1); - ffb->y = FFB_GET_Y(v1); - ffb->x = FFB_GET_X(v1); - - FFB_SET_VERTEX_COLOR(v2); - ffb->z = FFB_GET_Z(v2); - ffb->y = FFB_GET_Y(v2); - ffb->x = FFB_GET_X(v2); - } - - fmesa->ffbScreen->rp_active = 1; -} - -static void TAG(ffb_vb_quads)(GLcontext *ctx, GLuint start, GLuint count, GLuint flags) -{ - GLint i; - IMPL_LOCAL_VARS; - -#ifdef FFB_RENDER_TRACE - fprintf(stderr, "%s: start(%d) count(%d) flags(%x)\n", - __FUNCTION__, start, count, flags); -#endif - ffbRenderPrimitive(ctx, GL_QUADS); - - for (i = start + 3; i < count; i += 4) { - ffb_vertex *v0 = &fmesa->verts[ELT(i - 3)]; - ffb_vertex *v1 = &fmesa->verts[ELT(i - 2)]; - ffb_vertex *v2 = &fmesa->verts[ELT(i - 1)]; - ffb_vertex *v3 = &fmesa->verts[ELT(i - 0)]; - FFB_AREA_DECLARE - - FFB_COMPUTE_AREA_QUAD(v0, v1, v2, v3); - FFB_CULL_QUAD(continue;); - - FFBFifo(fmesa, (FFB_PRIM_COLOR_COST + - (FFB_VERTEX_COLOR_COST * 4) + 12)); - FFB_SET_PRIM_COLOR(v3); - - FFB_SET_VERTEX_COLOR(v0); - ffb->z = FFB_GET_Z(v0); - ffb->ryf = FFB_GET_Y(v0); - ffb->rxf = FFB_GET_X(v0); - - FFB_SET_VERTEX_COLOR(v1); - ffb->z = FFB_GET_Z(v1); - ffb->y = FFB_GET_Y(v1); - ffb->x = FFB_GET_X(v1); - - FFB_SET_VERTEX_COLOR(v2); - ffb->z = FFB_GET_Z(v2); - ffb->y = FFB_GET_Y(v2); - ffb->x = FFB_GET_X(v2); - - FFB_SET_VERTEX_COLOR(v3); - ffb->z = FFB_GET_Z(v3); - ffb->dmyf = FFB_GET_Y(v3); - ffb->dmxf = FFB_GET_X(v3); - } - - fmesa->ffbScreen->rp_active = 1; -} - -static void TAG(ffb_vb_quad_strip)(GLcontext *ctx, GLuint start, GLuint count, GLuint flags) -{ - GLint i; - IMPL_LOCAL_VARS; - -#ifdef FFB_RENDER_TRACE - fprintf(stderr, "%s: start(%d) count(%d) flags(%x)\n", - __FUNCTION__, start, count, flags); -#endif - ffbRenderPrimitive(ctx, GL_QUAD_STRIP); - - /* XXX Optimize XXX */ - for (i = start + 3; i < count; i += 2) { - ffb_vertex *v0 = &fmesa->verts[ELT(i - 1)]; - ffb_vertex *v1 = &fmesa->verts[ELT(i - 3)]; - ffb_vertex *v2 = &fmesa->verts[ELT(i - 2)]; - ffb_vertex *v3 = &fmesa->verts[ELT(i - 0)]; - FFB_AREA_DECLARE - - FFB_COMPUTE_AREA_QUAD(v0, v1, v2, v3); - FFB_CULL_QUAD(continue;); - - FFBFifo(fmesa, (FFB_PRIM_COLOR_COST + - (FFB_VERTEX_COLOR_COST * 4) + 12)); - FFB_SET_PRIM_COLOR(v3); - - FFB_DUMP_VERTEX(v0); - FFB_SET_VERTEX_COLOR(v0); - ffb->z = FFB_GET_Z(v0); - ffb->ryf = FFB_GET_Y(v0); - ffb->rxf = FFB_GET_X(v0); - - FFB_DUMP_VERTEX(v1); - FFB_SET_VERTEX_COLOR(v1); - ffb->z = FFB_GET_Z(v1); - ffb->y = FFB_GET_Y(v1); - ffb->x = FFB_GET_X(v1); - - FFB_DUMP_VERTEX(v2); - FFB_SET_VERTEX_COLOR(v2); - ffb->z = FFB_GET_Z(v2); - ffb->y = FFB_GET_Y(v2); - ffb->x = FFB_GET_X(v2); - - FFB_DUMP_VERTEX(v3); - FFB_SET_VERTEX_COLOR(v3); - ffb->z = FFB_GET_Z(v3); - ffb->dmyf = FFB_GET_Y(v3); - ffb->dmxf = FFB_GET_X(v3); - } - - fmesa->ffbScreen->rp_active = 1; -} - -static void (*TAG(render_tab)[GL_POLYGON + 2])(GLcontext *, GLuint, GLuint, GLuint) = -{ -#if !(IND & (FFB_TRI_CULL_BIT)) - TAG(ffb_vb_points), - TAG(ffb_vb_lines), - TAG(ffb_vb_line_loop), - TAG(ffb_vb_line_strip), -#else - NULL, - NULL, - NULL, - NULL, -#endif - TAG(ffb_vb_triangles), - TAG(ffb_vb_tri_strip), - TAG(ffb_vb_tri_fan), - TAG(ffb_vb_quads), - TAG(ffb_vb_quad_strip), - TAG(ffb_vb_poly), - ffb_vb_noop, -}; - -#undef IND -#undef TAG - -#undef IMPL_LOCAL_VARS -#undef FFB_DECLARE_CACHED_COLOR -#undef FFB_COMPUTE_CACHED_COLOR -#undef FFB_CACHED_COLOR_SAME -#undef FFB_CACHED_COLOR_SET -#undef FFB_CACHED_COLOR_UPDATE -#undef FFB_SET_PRIM_COLOR -#undef FFB_PRIM_COLOR_COST -#undef FFB_SET_VERTEX_COLOR -#undef FFB_VERTEX_COLOR_COST -#undef RESET_STIPPLE -#undef FFB_AREA_DECLARE -#undef FFB_COMPUTE_AREA_TRI -#undef FFB_COMPUTE_AREA_QUAD -#undef FFB_CULL_TRI -#undef FFB_CULL_QUAD diff --git a/src/mesa/drivers/dri/ffb/ffb_span.c b/src/mesa/drivers/dri/ffb/ffb_span.c deleted file mode 100644 index 61901cccadd..00000000000 --- a/src/mesa/drivers/dri/ffb/ffb_span.c +++ /dev/null @@ -1,127 +0,0 @@ -/* - * - * GLX Hardware Device Driver for Sun Creator/Creator3D - * Copyright (C) 2000 David S. Miller - * - * 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 - * DAVID MILLER, OR ANY OTHER CONTRIBUTORS 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. - * - * - * David S. Miller <[email protected]> - */ - -#include "main/mtypes.h" -#include "ffb_dd.h" -#include "ffb_span.h" -#include "ffb_context.h" -#include "ffb_lock.h" - -#define DBG 0 - -#define HW_LOCK() \ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); \ - if (!fmesa->hw_locked) \ - LOCK_HARDWARE(fmesa); - -#define HW_UNLOCK() \ - if (!fmesa->hw_locked) \ - UNLOCK_HARDWARE(fmesa); \ - -#define LOCAL_VARS \ - __DRIdrawable *dPriv = fmesa->driDrawable; \ - GLuint height = dPriv->h; \ - GLuint p; \ - char *buf; \ - (void) p - -#define INIT_MONO_PIXEL(p, color) \ - p = ((color[0] << 0) | \ - (color[1] << 8) | \ - (color[2] << 16)) - -/* We use WID clipping, so this test always passes. */ -#define CLIPPIXEL(__x, __y) (1) - -/* And also, due to WID clipping, we need not do anything - * special here. - */ -#define CLIPSPAN(__x,__y,__n,__x1,__n1,__i) \ - __n1 = __n; \ - __x1 = __x; \ - -#define HW_CLIPLOOP() \ -do { unsigned int fbc, ppc, cmp; \ - FFBWait(fmesa, fmesa->regs); \ - fbc = fmesa->regs->fbc; ppc = fmesa->regs->ppc; cmp = fmesa->regs->cmp; \ - fmesa->regs->fbc = ((fbc & \ - ~(FFB_FBC_WB_C | FFB_FBC_ZE_MASK | FFB_FBC_RGBE_MASK)) \ - | (FFB_FBC_ZE_OFF | FFB_FBC_RGBE_MASK)); \ - fmesa->regs->ppc = ((ppc & \ - ~(FFB_PPC_XS_MASK | FFB_PPC_ABE_MASK | FFB_PPC_DCE_MASK | \ - FFB_PPC_APE_MASK | FFB_PPC_CS_MASK)) \ - | (FFB_PPC_XS_WID | FFB_PPC_ABE_DISABLE | \ - FFB_PPC_DCE_DISABLE | FFB_PPC_APE_DISABLE | \ - FFB_PPC_CS_VAR)); \ - fmesa->regs->cmp = ((cmp & ~(0xff << 16)) | (0x80 << 16)); \ - fmesa->ffbScreen->rp_active = 1; \ - FFBWait(fmesa, fmesa->regs); \ - buf = (char *)(fmesa->sfb32 + (dPriv->x << 2) + (dPriv->y << 13));\ - if (dPriv->numClipRects) { - -#define HW_ENDCLIPLOOP() \ - } \ - fmesa->regs->fbc = fbc; \ - fmesa->regs->ppc = ppc; \ - fmesa->regs->cmp = cmp; \ - fmesa->ffbScreen->rp_active = 1; \ -} while(0) - -#define Y_FLIP(__y) (height - __y - 1) - -#define READ_RGBA(rgba,__x,__y) \ -do { GLuint p = *(GLuint *)(buf + ((__x)<<2) + ((__y)<<13)); \ - rgba[0] = (p >> 0) & 0xff; \ - rgba[1] = (p >> 8) & 0xff; \ - rgba[2] = (p >> 16) & 0xff; \ - rgba[3] = 0xff; \ -} while(0) - -#define WRITE_RGBA(__x, __y, __r, __g, __b, __a) \ - *(GLuint *)(buf + ((__x)<<2) + ((__y)<<13)) = \ - ((((__r) & 0xff) << 0) | \ - (((__g) & 0xff) << 8) | \ - (((__b) & 0xff) << 16)) - -#define WRITE_PIXEL(__x, __y, __p) \ - *(GLuint *)(buf + ((__x)<<2) + ((__y)<<13)) = (__p) - -#define TAG(x) ffb##x##_888 - -#include "spantmp.h" - -/** - * Plug in the Get/Put routines for the given driRenderbuffer. - */ -void -ffbSetSpanFunctions(driRenderbuffer *drb, const GLvisual *vis) -{ - assert(vis->redBits == 8); - assert(vis->greenBits == 8); - assert(vis->blueBits == 8); - ffbInitPointers_888(&drb->Base); -} diff --git a/src/mesa/drivers/dri/ffb/ffb_span.h b/src/mesa/drivers/dri/ffb/ffb_span.h deleted file mode 100644 index 37506cf30e6..00000000000 --- a/src/mesa/drivers/dri/ffb/ffb_span.h +++ /dev/null @@ -1,9 +0,0 @@ - -#ifndef _FFB_SPAN_H -#define _FFB_SPAN_H - -#include "drirenderbuffer.h" - -void ffbSetSpanFunctions(driRenderbuffer *drb, const GLvisual *vis); - -#endif /* !(_FFB_SPAN_H) */ diff --git a/src/mesa/drivers/dri/ffb/ffb_state.c b/src/mesa/drivers/dri/ffb/ffb_state.c deleted file mode 100644 index c09d2fef838..00000000000 --- a/src/mesa/drivers/dri/ffb/ffb_state.c +++ /dev/null @@ -1,1222 +0,0 @@ -/* - * - * GLX Hardware Device Driver for Sun Creator/Creator3D - * Copyright (C) 2000, 2001 David S. Miller - * - * 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 - * DAVID MILLER, OR ANY OTHER CONTRIBUTORS 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. - * - * - * David S. Miller <[email protected]> - */ - -#include "main/mtypes.h" -#include "main/colormac.h" -#include "main/enums.h" - -#include "vbo/vbo.h" -#include "tnl/tnl.h" -#include "tnl/t_pipeline.h" -#include "swrast/swrast.h" -#include "swrast_setup/swrast_setup.h" - -#include "ffb_dd.h" -#include "ffb_span.h" -#include "ffb_context.h" -#include "ffb_tris.h" -#include "ffb_state.h" - -#undef STATE_TRACE - -static unsigned int ffbComputeAlphaFunc(GLcontext *ctx) -{ - unsigned int xclip; - GLubyte alphaRef; - -#ifdef STATE_TRACE - fprintf(stderr, "ffbDDAlphaFunc: func(%s) ref(%02x)\n", - _mesa_lookup_enum_by_nr(ctx->Color.AlphaFunc), - ctx->Color.AlphaRef & 0xff); -#endif - - switch (ctx->Color.AlphaFunc) { - case GL_NEVER: xclip = FFB_XCLIP_TEST_NEVER; break; - case GL_LESS: xclip = FFB_XCLIP_TEST_LT; break; - case GL_EQUAL: xclip = FFB_XCLIP_TEST_EQ; break; - case GL_LEQUAL: xclip = FFB_XCLIP_TEST_LE; break; - case GL_GREATER: xclip = FFB_XCLIP_TEST_GT; break; - case GL_NOTEQUAL: xclip = FFB_XCLIP_TEST_NE; break; - case GL_GEQUAL: xclip = FFB_XCLIP_TEST_GE; break; - case GL_ALWAYS: xclip = FFB_XCLIP_TEST_ALWAYS; break; - - default: - return FFB_XCLIP_TEST_ALWAYS | 0x00; - } - - CLAMPED_FLOAT_TO_UBYTE(alphaRef, ctx->Color.AlphaRef); - xclip |= (alphaRef & 0xff); - - return xclip; -} - -static void ffbDDAlphaFunc(GLcontext *ctx, GLenum func, GLfloat ref) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - - if (ctx->Color.AlphaEnabled) { - unsigned int xclip = ffbComputeAlphaFunc(ctx); - - if (fmesa->xclip != xclip) { - fmesa->xclip = xclip; - FFB_MAKE_DIRTY(fmesa, FFB_STATE_XCLIP, 1); - } - } -} - -static void ffbDDBlendEquationSeparate(GLcontext *ctx, - GLenum modeRGB, GLenum modeA) -{ - -#ifdef STATE_TRACE - fprintf(stderr, "ffbDDBlendEquation: mode(%s)\n", - _mesa_lookup_enum_by_nr(modeRGB)); -#endif - assert( modeRGB == modeA ); - FALLBACK( ctx, (modeRGB != GL_FUNC_ADD), FFB_BADATTR_BLENDEQN); -} - -static void ffbDDBlendFuncSeparate(GLcontext *ctx, GLenum sfactorRGB, - GLenum dfactorRGB, GLenum sfactorA, - GLenum dfactorA) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - unsigned int blendc = 1 << 4; - -#ifdef STATE_TRACE - fprintf(stderr, "ffbDDBlendFuncSeparate: sRGB(%s) dRGB(%s) sA(%s) dA(%s)\n", - _mesa_lookup_enum_by_nr(sfactorRGB), - _mesa_lookup_enum_by_nr(dfactorRGB), - _mesa_lookup_enum_by_nr(sfactorA), - _mesa_lookup_enum_by_nr(dfactorA)); -#endif - switch (ctx->Color.BlendSrcRGB) { - case GL_ZERO: - blendc |= (0 << 0); - break; - - case GL_ONE: - blendc |= (1 << 0); - break; - - case GL_ONE_MINUS_SRC_ALPHA: - blendc |= (2 << 0); - break; - - case GL_SRC_ALPHA: - blendc |= (3 << 0); - break; - - default: - if (ctx->Color.BlendEnabled) - FALLBACK( ctx, FFB_BADATTR_BLENDFUNC, GL_TRUE ); - return; - }; - - switch (ctx->Color.BlendDstRGB) { - case GL_ZERO: - blendc |= (0 << 2); - break; - - case GL_ONE: - blendc |= (1 << 2); - break; - - case GL_ONE_MINUS_SRC_ALPHA: - blendc |= (2 << 2); - break; - - case GL_SRC_ALPHA: - blendc |= (3 << 2); - break; - - default: - if (ctx->Color.BlendEnabled) - FALLBACK( ctx, FFB_BADATTR_BLENDFUNC, GL_TRUE ); - return; - }; - - if (ctx->Color.BlendEnabled && - ctx->Color.ColorLogicOpEnabled && - ctx->Color.LogicOp != GL_COPY) { - /* We could avoid this if sfactor is GL_ONE and - * dfactor is GL_ZERO. I do not think that is even - * worthwhile to check because if someone is using - * blending they use more interesting settings and - * also it would add more state tracking to a lot - * of the code in this file. - */ - FALLBACK(ctx, FFB_BADATTR_BLENDROP, GL_TRUE); - return; - } - - FALLBACK( ctx, (FFB_BADATTR_BLENDFUNC|FFB_BADATTR_BLENDROP), GL_FALSE ); - - if (blendc != fmesa->blendc) { - fmesa->blendc = blendc; - FFB_MAKE_DIRTY(fmesa, FFB_STATE_BLEND, 1); - } -} - -static void ffbDDDepthFunc(GLcontext *ctx, GLenum func) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - GLuint cmp; - -#ifdef STATE_TRACE - fprintf(stderr, "ffbDDDepthFunc: func(%s)\n", - _mesa_lookup_enum_by_nr(func)); -#endif - - switch (func) { - case GL_NEVER: - cmp = FFB_CMP_MAGN_NEVER; - break; - case GL_ALWAYS: - cmp = FFB_CMP_MAGN_ALWAYS; - break; - case GL_LESS: - cmp = FFB_CMP_MAGN_LT; - break; - case GL_LEQUAL: - cmp = FFB_CMP_MAGN_LE; - break; - case GL_EQUAL: - cmp = FFB_CMP_MAGN_EQ; - break; - case GL_GREATER: - cmp = FFB_CMP_MAGN_GT; - break; - case GL_GEQUAL: - cmp = FFB_CMP_MAGN_GE; - break; - case GL_NOTEQUAL: - cmp = FFB_CMP_MAGN_NE; - break; - default: - return; - }; - - if (! ctx->Depth.Test) - cmp = FFB_CMP_MAGN_ALWAYS; - - cmp <<= 16; - cmp = (fmesa->cmp & ~(0xff<<16)) | cmp; - if (cmp != fmesa->cmp) { - fmesa->cmp = cmp; - FFB_MAKE_DIRTY(fmesa, FFB_STATE_CMP, 1); - } -} - -static void ffbDDDepthMask(GLcontext *ctx, GLboolean flag) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - GLuint fbc = fmesa->fbc; - GLboolean enabled_now; - -#ifdef STATE_TRACE - fprintf(stderr, "ffbDDDepthMask: flag(%d)\n", flag); -#endif - - if ((fbc & FFB_FBC_ZE_MASK) == FFB_FBC_ZE_OFF) - enabled_now = GL_FALSE; - else - enabled_now = GL_TRUE; - - if (flag != enabled_now) { - fbc &= ~FFB_FBC_ZE_MASK; - if (flag) { - fbc |= FFB_FBC_WB_C | FFB_FBC_ZE_ON; - } else { - fbc |= FFB_FBC_ZE_OFF; - fbc &= ~FFB_FBC_WB_C; - } - fmesa->fbc = fbc; - FFB_MAKE_DIRTY(fmesa, FFB_STATE_FBC, 1); - } -} - -static void -ffbDDStencilFuncSeparate(GLcontext *ctx, GLenum face, GLenum func, - GLint ref, GLuint mask) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - unsigned int stencil, stencilctl, consty; - - /* We will properly update sw/hw state when stenciling is - * enabled. - */ - if (! ctx->Stencil._Enabled) - return; - - stencilctl = fmesa->stencilctl; - stencilctl &= ~(7 << 16); - - switch (func) { - case GL_ALWAYS: stencilctl |= (0 << 16); break; - case GL_GREATER: stencilctl |= (1 << 16); break; - case GL_EQUAL: stencilctl |= (2 << 16); break; - case GL_GEQUAL: stencilctl |= (3 << 16); break; - case GL_NEVER: stencilctl |= (4 << 16); break; - case GL_LEQUAL: stencilctl |= (5 << 16); break; - case GL_NOTEQUAL: stencilctl |= (6 << 16); break; - case GL_LESS: stencilctl |= (7 << 16); break; - - default: - return; - }; - - consty = ref & 0xf; - - stencil = fmesa->stencil; - stencil &= ~(0xf << 20); - stencil |= (mask & 0xf) << 20; - - if (fmesa->stencil != stencil || - fmesa->stencilctl != stencilctl || - fmesa->consty != consty) { - fmesa->stencil = stencil; - fmesa->stencilctl = stencilctl; - fmesa->consty = consty; - FFB_MAKE_DIRTY(fmesa, FFB_STATE_STENCIL, 6); - } -} - -static void -ffbDDStencilMaskSeparate(GLcontext *ctx, GLenum face, GLuint mask) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - - mask &= 0xf; - if (fmesa->ypmask != mask) { - fmesa->ypmask = mask; - FFB_MAKE_DIRTY(fmesa, FFB_STATE_YPMASK, 1); - } -} - -static void -ffbDDStencilOpSeparate(GLcontext *ctx, GLenum face, GLenum fail, - GLenum zfail, GLenum zpass) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - unsigned int stencilctl; - - /* We will properly update sw/hw state when stenciling is - * enabled. - */ - if (! ctx->Stencil._Enabled) - return; - - stencilctl = fmesa->stencilctl; - stencilctl &= ~(0xfff00000); - - switch (fail) { - case GL_ZERO: stencilctl |= (0 << 28); break; - case GL_KEEP: stencilctl |= (1 << 28); break; - case GL_INVERT: stencilctl |= (2 << 28); break; - case GL_REPLACE: stencilctl |= (3 << 28); break; - case GL_INCR: stencilctl |= (4 << 28); break; - case GL_DECR: stencilctl |= (5 << 28); break; - - default: - return; - }; - - switch (zfail) { - case GL_ZERO: stencilctl |= (0 << 24); break; - case GL_KEEP: stencilctl |= (1 << 24); break; - case GL_INVERT: stencilctl |= (2 << 24); break; - case GL_REPLACE: stencilctl |= (3 << 24); break; - case GL_INCR: stencilctl |= (4 << 24); break; - case GL_DECR: stencilctl |= (5 << 24); break; - - default: - return; - }; - - switch (zpass) { - case GL_ZERO: stencilctl |= (0 << 20); break; - case GL_KEEP: stencilctl |= (1 << 20); break; - case GL_INVERT: stencilctl |= (2 << 20); break; - case GL_REPLACE: stencilctl |= (3 << 20); break; - case GL_INCR: stencilctl |= (4 << 20); break; - case GL_DECR: stencilctl |= (5 << 20); break; - - default: - return; - }; - - if (fmesa->stencilctl != stencilctl) { - fmesa->stencilctl = stencilctl; - FFB_MAKE_DIRTY(fmesa, FFB_STATE_STENCIL, 6); - } -} - -static void ffbCalcViewportRegs(GLcontext *ctx) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - __DRIdrawable *dPriv = fmesa->driDrawable; - GLuint xmin, xmax, ymin, ymax, zmin, zmax; - unsigned int vcmin, vcmax; - - xmin = ctx->Viewport.X + dPriv->x; - xmax = xmin + ctx->Viewport.Width; - ymax = dPriv->y + dPriv->h - ctx->Viewport.Y; - ymin = ymax - ctx->Viewport.Height; - if (ctx->Scissor.Enabled) { - GLuint sc_xmin, sc_xmax, sc_ymin, sc_ymax; - - sc_xmin = ctx->Viewport.X + dPriv->x; - sc_xmax = sc_xmin + ctx->Viewport.Width; - sc_ymax = dPriv->y + dPriv->h - ctx->Viewport.Y; - sc_ymin = sc_ymax - ctx->Viewport.Height; - if (sc_xmin > xmin) - xmin = sc_xmin; - if (sc_xmax < xmax) - xmax = sc_xmax; - if (sc_ymin > ymin) - ymin = sc_ymin; - if (sc_ymax < ymax) - ymax = sc_ymax; - } - zmin = ((GLdouble)ctx->Viewport.Near * 0x0fffffff); - zmax = ((GLdouble)ctx->Viewport.Far * 0x0fffffff); - - vcmin = ((ymin & 0xffff) << 16) | (xmin & 0xffff); - vcmax = ((ymax & 0xffff) << 16) | (xmax & 0xffff); - if (fmesa->vclipmin != vcmin || - fmesa->vclipmax != vcmax || - fmesa->vclipzmin != zmin || - fmesa->vclipzmax != zmax) { - fmesa->vclipmin = vcmin; - fmesa->vclipmax = vcmax; - fmesa->vclipzmin = zmin; - fmesa->vclipzmax = zmax; - FFB_MAKE_DIRTY(fmesa, FFB_STATE_CLIP, (4 + (4 * 2))); - } -} - -void ffbCalcViewport(GLcontext *ctx) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - const GLfloat *v = ctx->Viewport._WindowMap.m; - GLfloat *m = fmesa->hw_viewport; - __DRIdrawable *dPriv = fmesa->driDrawable; - - m[MAT_SX] = v[MAT_SX]; - m[MAT_TX] = v[MAT_TX] + dPriv->x + SUBPIXEL_X; - m[MAT_SY] = - v[MAT_SY]; - m[MAT_TY] = - v[MAT_TY] + dPriv->h + dPriv->y + SUBPIXEL_Y; - m[MAT_SZ] = v[MAT_SZ] * ((GLdouble)1.0 / (GLdouble)0x0fffffff); - m[MAT_TZ] = v[MAT_TZ] * ((GLdouble)1.0 / (GLdouble)0x0fffffff); - - fmesa->depth_scale = ((GLdouble)1.0 / (GLdouble)0x0fffffff); - - ffbCalcViewportRegs(ctx); - - fmesa->setupnewinputs |= VERT_BIT_POS; -} - -static void ffbDDViewport(GLcontext *ctx, GLint x, GLint y, - GLsizei width, GLsizei height) -{ - ffbCalcViewport(ctx); -} - -static void ffbDDDepthRange(GLcontext *ctx, GLclampd nearval, GLclampd farval) -{ - ffbCalcViewport(ctx); -} - -static void ffbDDScissor(GLcontext *ctx, GLint cx, GLint cy, - GLsizei cw, GLsizei ch) -{ - ffbCalcViewport(ctx); -} - -static void ffbDDDrawBuffer(GLcontext *ctx, GLenum buffer) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - unsigned int fbc = fmesa->fbc; - -#ifdef STATE_TRACE - fprintf(stderr, "ffbDDDrawBuffer: mode(%s)\n", - _mesa_lookup_enum_by_nr(buffer)); -#endif - fbc &= ~(FFB_FBC_WB_AB | FFB_FBC_RB_MASK); - switch (buffer) { - case GL_FRONT: - if (fmesa->back_buffer == 0) - fbc |= FFB_FBC_WB_B | FFB_FBC_RB_B; - else - fbc |= FFB_FBC_WB_A | FFB_FBC_RB_A; - break; - - case GL_BACK: - if (fmesa->back_buffer == 0) - fbc |= FFB_FBC_WB_A | FFB_FBC_RB_A; - else - fbc |= FFB_FBC_WB_B | FFB_FBC_RB_B; - break; - - case GL_FRONT_AND_BACK: - fbc |= FFB_FBC_WB_AB; - break; - - default: - return; - }; - - if (fbc != fmesa->fbc) { - fmesa->fbc = fbc; - FFB_MAKE_DIRTY(fmesa, FFB_STATE_FBC, 1); - } -} - - -static void ffbDDReadBuffer(GLcontext *ctx, GLenum buffer) -{ - /* no-op, unless you implement h/w glRead/CopyPixels */ -} - - -/* - * Specifies buffer for sw fallbacks (spans) - */ -#if 000 -/* XXX - * This function is obsolete. It's not clear how this really effected - * span reading/writing above. The span functions should use the - * incoming driRenderbuffer (gl_renderbuffer) pointer to determine how - * to read from the specified bufer. - */ -static void ffbDDSetBuffer(GLcontext *ctx, GLframebuffer *colorBuffer, - GLuint bufferBit) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - unsigned int fbc = fmesa->fbc; - -#ifdef STATE_TRACE - fprintf(stderr, "ffbDDSetReadBuffer: mode(%s)\n", - _mesa_lookup_enum_by_nr(buffer)); -#endif - fbc &= ~(FFB_FBC_RB_MASK); - switch (bufferBit) { - case BUFFER_BIT_FRONT_LEFT: - if (fmesa->back_buffer == 0) - fbc |= FFB_FBC_RB_B; - else - fbc |= FFB_FBC_RB_A; - break; - - case BUFFER_BIT_BACK_LEFT: - if (fmesa->back_buffer == 0) - fbc |= FFB_FBC_RB_A; - else - fbc |= FFB_FBC_RB_B; - break; - - default: - _mesa_problem(ctx, "Unexpected buffer in ffbDDSetBuffer()"); - return; - }; - - if (fbc != fmesa->fbc) { - fmesa->fbc = fbc; - FFB_MAKE_DIRTY(fmesa, FFB_STATE_FBC, 1); - } -} -#endif - - -static void ffbDDClearColor(GLcontext *ctx, const GLfloat color[4]) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - GLubyte c[4]; - CLAMPED_FLOAT_TO_UBYTE(c[0], color[0]); - CLAMPED_FLOAT_TO_UBYTE(c[1], color[1]); - CLAMPED_FLOAT_TO_UBYTE(c[2], color[2]); - - fmesa->clear_pixel = ((c[0] << 0) | - (c[1] << 8) | - (c[2] << 16)); -} - -static void ffbDDClearDepth(GLcontext *ctx, GLclampd depth) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - - fmesa->clear_depth = Z_FROM_MESA(depth * 4294967295.0f); -} - -static void ffbDDClearStencil(GLcontext *ctx, GLint stencil) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - - fmesa->clear_stencil = stencil & 0xf; -} - -/* XXX Actually, should I be using FBC controls for this? -DaveM */ -static void ffbDDColorMask(GLcontext *ctx, - GLboolean r, GLboolean g, - GLboolean b, GLboolean a) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - unsigned int new_pmask = 0x0; - -#ifdef STATE_TRACE - fprintf(stderr, "ffbDDColorMask: r(%d) g(%d) b(%d) a(%d)\n", - r, g, b, a); -#endif - if (r) - new_pmask |= 0x000000ff; - if (g) - new_pmask |= 0x0000ff00; - if (b) - new_pmask |= 0x00ff0000; - if (a) - new_pmask |= 0xff000000; - - if (fmesa->pmask != new_pmask) { - fmesa->pmask = new_pmask; - FFB_MAKE_DIRTY(fmesa, FFB_STATE_PMASK, 1); - } -} - -static void ffbDDLogicOp(GLcontext *ctx, GLenum op) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - unsigned int rop; - -#ifdef STATE_TRACE - fprintf(stderr, "ffbDDLogicOp: op(%s)\n", - _mesa_lookup_enum_by_nr(op)); -#endif - switch (op) { - case GL_CLEAR: rop = FFB_ROP_ZERO; break; - case GL_SET: rop = FFB_ROP_ONES; break; - case GL_COPY: rop = FFB_ROP_NEW; break; - case GL_AND: rop = FFB_ROP_NEW_AND_OLD; break; - case GL_NAND: rop = FFB_ROP_NEW_AND_NOLD; break; - case GL_OR: rop = FFB_ROP_NEW_OR_OLD; break; - case GL_NOR: rop = FFB_ROP_NEW_OR_NOLD; break; - case GL_XOR: rop = FFB_ROP_NEW_XOR_OLD; break; - case GL_NOOP: rop = FFB_ROP_OLD; break; - case GL_COPY_INVERTED: rop = FFB_ROP_NNEW; break; - case GL_INVERT: rop = FFB_ROP_NOLD; break; - case GL_EQUIV: rop = FFB_ROP_NNEW_XOR_NOLD; break; - case GL_AND_REVERSE: rop = FFB_ROP_NEW_AND_NOLD; break; - case GL_AND_INVERTED: rop = FFB_ROP_NNEW_AND_OLD; break; - case GL_OR_REVERSE: rop = FFB_ROP_NEW_OR_NOLD; break; - case GL_OR_INVERTED: rop = FFB_ROP_NNEW_OR_OLD; break; - - default: - return; - }; - - rop |= fmesa->rop & ~0xff; - if (rop != fmesa->rop) { - fmesa->rop = rop; - FFB_MAKE_DIRTY(fmesa, FFB_STATE_ROP, 1); - - if (op == GL_COPY) - FALLBACK( ctx, FFB_BADATTR_BLENDROP, GL_FALSE ); - } -} - -#if 0 -/* XXX Also need to track near/far just like 3dfx driver. - * XXX - * XXX Actually, that won't work, because the 3dfx chip works by - * XXX having 1/w coordinates fed to it for each primitive, and - * XXX it uses this to index it's 64 entry fog table. - */ -static void ffb_fog_linear(GLcontext *ctx, ffbContextPtr fmesa) -{ - GLfloat c = ctx->ProjectionMatrix.m[10]; - GLfloat d = ctx->ProjectionMatrix.m[14]; - GLfloat tz = ctx->Viewport.WindowMap.m[MAT_TZ]; - GLfloat szInv = 1.0F / ctx->Viewport.WindowMap.m[MAT_SZ]; - GLfloat fogEnd = ctx->Fog.End; - GLfloat fogScale = 1.0F / (ctx->Fog.End - ctx->Fog.Start); - GLfloat ndcz; - GLfloat eyez; - GLfloat Zzero, Zone; - unsigned int zb, zf; - - /* Compute the Z at which f reaches 0.0, this is the full - * saturation point. - * - * Thus compute Z (as seen by the chip during rendering), - * such that: - * - * 0.0 = (fogEnd - eyez) * fogScale - * - * fogScale is usually not zero, thus we are looking for: - * - * fogEnd = eyez - * - * fogEnd = -d / (c + ((Z - tz) * szInv)) - * fogEnd * (c + ((Z - tz) * szInv)) = -d - * (c + ((Z - tz) * szInv)) = -d / fogEnd - * (Z - tz) * szInv = (-d / fogEnd) - c - * (Z - tz) = ((-d / fogEnd) - c) / szInv - * Z = (((-d / fogEnd) - c) / szInv) + tz - */ - Zzero = (((-d / fogEnd) - c) / szInv) + tz; - - /* Compute the Z at which f reaches 1.0, this is where - * the incoming frag's full intensity is shown. This - * equation is: - * - * 1.0 = (fogEnd - eyez) - * - * We are looking for: - * - * 1.0 + eyez = fogEnd - * - * 1.0 + (-d / (c + ((Z - tz) * szInv))) = fogEnd - * -d / (c + ((Z - tz) * szInv)) = fogEnd - 1.0 - * -d / (FogEnd - 1.0) = (c + ((Z - tz) * szInv)) - * (-d / (fogEnd - 1.0)) - c = ((Z - tz) * szInv) - * ((-d / (fogEnd - 1.0)) - c) / szInv = (Z - tz) - * (((-d / (fogEnd - 1.0)) - c) / szInv) + tz = Z - */ - Zone = (((-d / (fogEnd - 1.0)) - c) / szInv) + tz; - - /* FFB's Zfront must be less than Zback, thus we may have - * to invert Sf/Sb to satisfy this constraint. - */ - if (Zzero < Zone) { - sf = 0.0; - sb = 1.0; - zf = Z_FROM_MESA(Zzero); - zb = Z_FROM_MESA(Zone); - } else { - sf = 1.0; - sb = 0.0; - zf = Z_FROM_MESA(Zone); - zb = Z_FROM_MESA(Zzero); - } -} -#endif - -static void ffbDDFogfv(GLcontext *ctx, GLenum pname, const GLfloat *param) -{ -#ifdef STATE_TRACE - fprintf(stderr, "ffbDDFogfv: pname(%s)\n", _mesa_lookup_enum_by_nr(pname)); -#endif -} - -static void ffbDDLineStipple(GLcontext *ctx, GLint factor, GLushort pattern) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - -#ifdef STATE_TRACE - fprintf(stderr, "ffbDDLineStipple: factor(%d) pattern(%04x)\n", - factor, pattern); -#endif - if (ctx->Line.StippleFlag) { - factor = ctx->Line.StippleFactor; - pattern = ctx->Line.StipplePattern; - if ((GLuint) factor > 15) { - fmesa->lpat = FFB_LPAT_BAD; - } else { - fmesa->lpat = ((factor << FFB_LPAT_SCALEVAL_SHIFT) | - (0 << FFB_LPAT_PATLEN_SHIFT) | - ((pattern & 0xffff) << FFB_LPAT_PATTERN_SHIFT)); - } - } else { - fmesa->lpat = 0; - } -} - -void ffbXformAreaPattern(ffbContextPtr fmesa, const GLubyte *mask) -{ - __DRIdrawable *dPriv = fmesa->driDrawable; - int i, lines, xoff; - - lines = 0; - i = (dPriv->y + dPriv->h) & (32 - 1); - xoff = dPriv->x & (32 - 1); - while (lines++ < 32) { - GLuint raw = - (((GLuint)mask[0] << 24) | - ((GLuint)mask[1] << 16) | - ((GLuint)mask[2] << 8) | - ((GLuint)mask[3] << 0)); - - fmesa->pattern[i] = - (raw << xoff) | (raw >> (32 - xoff)); - i = (i - 1) & (32 - 1); - mask += 4; - } - - FFB_MAKE_DIRTY(fmesa, FFB_STATE_APAT, 32); -} - -static void ffbDDPolygonStipple(GLcontext *ctx, const GLubyte *mask) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - -#ifdef STATE_TRACE - fprintf(stderr, "ffbDDPolygonStipple: state(%d)\n", - ctx->Polygon.StippleFlag); -#endif - ffbXformAreaPattern(fmesa, mask); -} - -static void ffbDDEnable(GLcontext *ctx, GLenum cap, GLboolean state) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - unsigned int tmp; - -#ifdef STATE_TRACE - fprintf(stderr, "ffbDDEnable: %s state(%d)\n", - _mesa_lookup_enum_by_nr(cap), state); -#endif - switch (cap) { - case GL_ALPHA_TEST: - if (state) - tmp = ffbComputeAlphaFunc(ctx); - else - tmp = FFB_XCLIP_TEST_ALWAYS; - - if (tmp != fmesa->xclip) { - fmesa->xclip = tmp; - FFB_MAKE_DIRTY(fmesa, FFB_STATE_XCLIP, 1); - } - break; - - case GL_BLEND: - tmp = (fmesa->ppc & ~FFB_PPC_ABE_MASK); - if (state) { - tmp |= FFB_PPC_ABE_ENABLE; - } else { - tmp |= FFB_PPC_ABE_DISABLE; - } - if (fmesa->ppc != tmp) { - fmesa->ppc = tmp; - FFB_MAKE_DIRTY(fmesa, FFB_STATE_PPC, 1); - ffbDDBlendFuncSeparate(ctx, 0, 0, 0, 0 ); - } - break; - - case GL_DEPTH_TEST: - if (state) - tmp = 0x0fffffff; - else - tmp = 0x00000000; - if (tmp != fmesa->magnc) { - unsigned int fbc = fmesa->fbc; - fbc &= ~FFB_FBC_ZE_MASK; - if (state) - fbc |= FFB_FBC_ZE_ON; - else - fbc |= FFB_FBC_ZE_OFF; - fmesa->fbc = fbc; - ffbDDDepthFunc(ctx, ctx->Depth.Func); - fmesa->magnc = tmp; - FFB_MAKE_DIRTY(fmesa, (FFB_STATE_MAGNC | FFB_STATE_FBC), 2); - } - break; - - case GL_SCISSOR_TEST: - ffbDDScissor(ctx, ctx->Scissor.X, ctx->Scissor.Y, - ctx->Scissor.Width, ctx->Scissor.Height); - break; - - case GL_STENCIL_TEST: - if (!(fmesa->ffb_sarea->flags & FFB_DRI_FFB2PLUS)) { - FALLBACK( ctx, FFB_BADATTR_STENCIL, state ); - } - - tmp = fmesa->fbc & ~FFB_FBC_YE_MASK; - if (state) { - ffbDDStencilFuncSeparate(ctx, GL_FRONT, - ctx->Stencil.Function[0], - ctx->Stencil.Ref[0], - ctx->Stencil.ValueMask[0]); - ffbDDStencilMaskSeparate(ctx, GL_FRONT, - ctx->Stencil.WriteMask[0]); - ffbDDStencilOpSeparate(ctx, GL_FRONT, - ctx->Stencil.FailFunc[0], - ctx->Stencil.ZFailFunc[0], - ctx->Stencil.ZPassFunc[0]); - tmp |= FFB_FBC_YE_MASK; - } else { - fmesa->stencil = 0xf0000000; - fmesa->stencilctl = 0x33300000; - FFB_MAKE_DIRTY(fmesa, FFB_STATE_STENCIL, 6); - tmp |= FFB_FBC_YE_OFF; - } - if (tmp != fmesa->fbc) { - fmesa->fbc = tmp; - FFB_MAKE_DIRTY(fmesa, FFB_STATE_FBC, 1); - } - break; - - case GL_FOG: - /* Until I implement the fog support... */ - FALLBACK( ctx, FFB_BADATTR_FOG, state ); - break; - - case GL_LINE_STIPPLE: - if (! state) - fmesa->lpat = 0; - else - ffbDDLineStipple(ctx, - ctx->Line.StippleFactor, - ctx->Line.StipplePattern); - break; - - case GL_POLYGON_STIPPLE: - /* Do nothing, we interrogate the state during - * reduced primitive changes. Since our caller - * will set NEW_POLYGON in the ctx NewState this - * will cause the driver rasterization functions - * to be reevaluated, which will cause us to force - * a reduced primitive change next rendering pass - * and it all works out. - */ - break; - - default: - break; - }; -} - -void ffbSyncHardware(ffbContextPtr fmesa) -{ - ffb_fbcPtr ffb = fmesa->regs; - unsigned int dirty; - int i; - - FFBFifo(fmesa, fmesa->state_fifo_ents); - - dirty = fmesa->state_dirty; - if (dirty & (FFB_STATE_FBC | FFB_STATE_PPC | FFB_STATE_DRAWOP | - FFB_STATE_ROP | FFB_STATE_LPAT | FFB_STATE_WID)) { - if (dirty & FFB_STATE_FBC) - ffb->fbc = fmesa->fbc; - if (dirty & FFB_STATE_PPC) - ffb->ppc = fmesa->ppc; - if (dirty & FFB_STATE_DRAWOP) - ffb->drawop = fmesa->drawop; - if (dirty & FFB_STATE_ROP) - ffb->rop = fmesa->rop; - if (dirty & FFB_STATE_LPAT) - ffb->rop = fmesa->lpat; - if (dirty & FFB_STATE_WID) - ffb->wid = fmesa->wid; - } - if (dirty & (FFB_STATE_PMASK | FFB_STATE_XPMASK | FFB_STATE_YPMASK | - FFB_STATE_ZPMASK | FFB_STATE_XCLIP | FFB_STATE_CMP | - FFB_STATE_MATCHAB | FFB_STATE_MAGNAB | FFB_STATE_MATCHC | - FFB_STATE_MAGNC)) { - if (dirty & FFB_STATE_PMASK) - ffb->pmask = fmesa->pmask; - if (dirty & FFB_STATE_XPMASK) - ffb->xpmask = fmesa->xpmask; - if (dirty & FFB_STATE_YPMASK) - ffb->ypmask = fmesa->ypmask; - if (dirty & FFB_STATE_ZPMASK) - ffb->zpmask = fmesa->zpmask; - if (dirty & FFB_STATE_XCLIP) - ffb->xclip = fmesa->xclip; - if (dirty & FFB_STATE_CMP) - ffb->cmp = fmesa->cmp; - if (dirty & FFB_STATE_MATCHAB) - ffb->matchab = fmesa->matchab; - if (dirty & FFB_STATE_MAGNAB) - ffb->magnab = fmesa->magnab; - if (dirty & FFB_STATE_MATCHC) - ffb->matchc = fmesa->matchc; - if (dirty & FFB_STATE_MAGNC) - ffb->magnc = fmesa->magnc; - } - - if (dirty & FFB_STATE_DCUE) { - ffb->dcss = fmesa->dcss; - ffb->dcsf = fmesa->dcsf; - ffb->dcsb = fmesa->dcsb; - ffb->dczf = fmesa->dczf; - ffb->dczb = fmesa->dczb; - if (fmesa->ffb_sarea->flags & (FFB_DRI_FFB2 | FFB_DRI_FFB2PLUS)) { - ffb->dcss1 = fmesa->dcss1; - ffb->dcss2 = fmesa->dcss2; - ffb->dcss3 = fmesa->dcss3; - ffb->dcs2 = fmesa->dcs2; - ffb->dcs3 = fmesa->dcs3; - ffb->dcs4 = fmesa->dcs4; - ffb->dcd2 = fmesa->dcd2; - ffb->dcd3 = fmesa->dcd3; - ffb->dcd4 = fmesa->dcd4; - } - } - - if (dirty & FFB_STATE_BLEND) { - ffb->blendc = fmesa->blendc; - ffb->blendc1 = fmesa->blendc1; - ffb->blendc2 = fmesa->blendc2; - } - - if (dirty & FFB_STATE_CLIP) { - ffb->vclipmin = fmesa->vclipmin; - ffb->vclipmax = fmesa->vclipmax; - ffb->vclipzmin = fmesa->vclipzmin; - ffb->vclipzmax = fmesa->vclipzmax; - for (i = 0; i < 4; i++) { - ffb->auxclip[i].min = fmesa->aux_clips[i].min; - ffb->auxclip[i].max = fmesa->aux_clips[i].max; - } - } - - if ((dirty & FFB_STATE_STENCIL) && - (fmesa->ffb_sarea->flags & FFB_DRI_FFB2PLUS)) { - ffb->stencil = fmesa->stencil; - ffb->stencilctl = fmesa->stencilctl; - ffb->fbc = FFB_FBC_WB_C; - ffb->rawstencilctl = (fmesa->stencilctl | (1 << 19)); - ffb->fbc = fmesa->fbc; - ffb->consty = fmesa->consty; - } - - if (dirty & FFB_STATE_APAT) { - for (i = 0; i < 32; i++) - ffb->pattern[i] = fmesa->pattern[i]; - } - - fmesa->state_dirty = 0; - fmesa->state_fifo_ents = 0; - fmesa->ffbScreen->rp_active = 1; -} - -static void ffbDDUpdateState(GLcontext *ctx, GLuint newstate) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - - /* When we are hw rendering, changing certain kinds of - * state does not require flushing all of our context. - */ - if (fmesa->bad_fragment_attrs == 0 && - (newstate & ~_NEW_COLOR) == 0) - return; - - _swrast_InvalidateState( ctx, newstate ); - _swsetup_InvalidateState( ctx, newstate ); - _vbo_InvalidateState( ctx, newstate ); - _tnl_InvalidateState( ctx, newstate ); - - if (newstate & _NEW_TEXTURE) - FALLBACK( ctx, FFB_BADATTR_TEXTURE, - (ctx->Texture._EnabledUnits != 0)); - -#ifdef STATE_TRACE - fprintf(stderr, "ffbDDUpdateState: newstate(%08x)\n", newstate); -#endif - - fmesa->new_gl_state |= newstate; - - /* Force a reduced primitive change next rendering - * pass. - */ - fmesa->raster_primitive = GL_POLYGON + 1; - -#if 0 - /* When the modelview matrix changes, this changes what - * the eye coordinates will be so we have to recompute - * the depth cueing parameters. - * - * XXX DD_HAVE_HARDWARE_FOG. - */ - if (ctx->Fog.Enabled && (newstate & _NEW_MODELVIEW)) - ffb_update_fog(); -#endif -} - - -void ffbDDInitStateFuncs(GLcontext *ctx) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - - ctx->Driver.UpdateState = ffbDDUpdateState; - - ctx->Driver.Enable = ffbDDEnable; - ctx->Driver.AlphaFunc = ffbDDAlphaFunc; - ctx->Driver.BlendEquationSeparate = ffbDDBlendEquationSeparate; - ctx->Driver.BlendFuncSeparate = ffbDDBlendFuncSeparate; - ctx->Driver.DepthFunc = ffbDDDepthFunc; - ctx->Driver.DepthMask = ffbDDDepthMask; - ctx->Driver.Fogfv = ffbDDFogfv; - ctx->Driver.LineStipple = ffbDDLineStipple; - ctx->Driver.PolygonStipple = ffbDDPolygonStipple; - ctx->Driver.Scissor = ffbDDScissor; - ctx->Driver.ColorMask = ffbDDColorMask; - ctx->Driver.LogicOpcode = ffbDDLogicOp; - ctx->Driver.Viewport = ffbDDViewport; - ctx->Driver.DepthRange = ffbDDDepthRange; - - if (fmesa->ffb_sarea->flags & FFB_DRI_FFB2PLUS) { - ctx->Driver.StencilFuncSeparate = ffbDDStencilFuncSeparate; - ctx->Driver.StencilMaskSeparate = ffbDDStencilMaskSeparate; - ctx->Driver.StencilOpSeparate = ffbDDStencilOpSeparate; - } - - ctx->Driver.DrawBuffer = ffbDDDrawBuffer; - ctx->Driver.ReadBuffer = ffbDDReadBuffer; - ctx->Driver.ClearColor = ffbDDClearColor; - ctx->Driver.ClearDepth = ffbDDClearDepth; - ctx->Driver.ClearStencil = ffbDDClearStencil; - - /* We will support color index modes later... -DaveM */ - /* - ctx->Driver.ClearIndex = 0; - ctx->Driver.IndexMask = 0; - */ -} - -void ffbDDInitContextHwState(GLcontext *ctx) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - int fifo_count = 0; - int i; - - fmesa->hw_locked = 0; - - fmesa->bad_fragment_attrs = 0; - fmesa->state_dirty = FFB_STATE_ALL; - fmesa->new_gl_state = ~0; - - fifo_count = 1; - fmesa->fbc = (FFB_FBC_WE_FORCEON | FFB_FBC_WM_COMBINED | - FFB_FBC_SB_BOTH | FFB_FBC_ZE_MASK | - FFB_FBC_YE_OFF | FFB_FBC_XE_OFF | - FFB_FBC_RGBE_MASK); - if (ctx->Visual.doubleBufferMode) { - /* Buffer B is the initial back buffer. */ - fmesa->back_buffer = 1; - fmesa->fbc |= FFB_FBC_WB_BC | FFB_FBC_RB_B; - } else { - fmesa->back_buffer = 0; - fmesa->fbc |= FFB_FBC_WB_A | FFB_FBC_RB_A; - } - - fifo_count += 1; - fmesa->ppc = (FFB_PPC_ACE_DISABLE | FFB_PPC_DCE_DISABLE | - FFB_PPC_ABE_DISABLE | FFB_PPC_VCE_3D | - FFB_PPC_APE_DISABLE | FFB_PPC_TBE_OPAQUE | - FFB_PPC_ZS_CONST | FFB_PPC_YS_CONST | - FFB_PPC_XS_WID | FFB_PPC_CS_VAR); - - fifo_count += 3; - fmesa->drawop = FFB_DRAWOP_RECTANGLE; - - /* GL_COPY is the default LogicOp. */ - fmesa->rop = (FFB_ROP_NEW << 16) | (FFB_ROP_NEW << 8) | FFB_ROP_NEW; - - /* No line patterning enabled. */ - fmesa->lpat = 0x00000000; - - /* We do not know the WID value until the first context switch. */ - fifo_count += 1; - fmesa->wid = ~0; - - fifo_count += 5; - - /* ColorMask, all enabled. */ - fmesa->pmask = 0xffffffff; - - fmesa->xpmask = 0x000000ff; - fmesa->ypmask = 0x0000000f; - fmesa->zpmask = 0x0fffffff; - - /* AlphaFunc GL_ALWAYS, AlphaRef 0 */ - fmesa->xclip = FFB_XCLIP_TEST_ALWAYS | 0x00; - - /* This sets us up to use WID clipping (so the DRI clipping - * rectangle is unneeded by us). All other match and magnitude - * tests are set to pass. - */ - fifo_count += 5; - fmesa->cmp = ((FFB_CMP_MATCH_ALWAYS << 24) | /* MATCH C */ - (FFB_CMP_MAGN_ALWAYS << 16) | /* MAGN C */ - (FFB_CMP_MATCH_EQ << 8) | /* MATCH AB */ - (FFB_CMP_MAGN_ALWAYS << 0)); /* MAGN AB */ - fmesa->matchab = 0xff000000; - fmesa->magnab = 0x00000000; - fmesa->matchc = 0x00000000; - fmesa->magnc = 0x00000000; - - /* Depth cue parameters, all zeros to start. */ - fifo_count += 14; - fmesa->dcss = 0x00000000; - fmesa->dcsf = 0x00000000; - fmesa->dcsb = 0x00000000; - fmesa->dczf = 0x00000000; - fmesa->dczb = 0x00000000; - fmesa->dcss1 = 0x00000000; - fmesa->dcss2 = 0x00000000; - fmesa->dcss3 = 0x00000000; - fmesa->dcs2 = 0x00000000; - fmesa->dcs3 = 0x00000000; - fmesa->dcs4 = 0x00000000; - fmesa->dcd2 = 0x00000000; - fmesa->dcd3 = 0x00000000; - fmesa->dcd4 = 0x00000000; - - /* Alpha blending unit state. */ - fifo_count += 3; - fmesa->blendc = (1 << 0) | (0 << 2); /* src(GL_ONE) | dst(GL_ZERO) */ - fmesa->blendc1 = 0x00000000; - fmesa->blendc2 = 0x00000000; - - /* ViewPort clip state. */ - fifo_count += 4 + (4 * 2); - fmesa->vclipmin = 0x00000000; - fmesa->vclipmax = 0xffffffff; - fmesa->vclipzmin = 0x00000000; - fmesa->vclipzmax = 0x0fffffff; - for (i = 0; i < 4; i++) { - fmesa->aux_clips[0].min = 0x00000000; - fmesa->aux_clips[0].max = 0x00000000; - } - - /* Stenciling state. */ - fifo_count += 6; - fmesa->stencil = 0xf0000000; /* Stencil MASK, Y plane */ - fmesa->stencilctl = 0x33300000; /* All stencil tests disabled */ - fmesa->consty = 0x0; - - /* Area pattern, used for polygon stipples. */ - fifo_count += 32; - for (i = 0; i < 32; i++) - fmesa->pattern[i] = 0x00000000; - - fmesa->state_fifo_ents = fifo_count; - fmesa->state_all_fifo_ents = fifo_count; -} diff --git a/src/mesa/drivers/dri/ffb/ffb_state.h b/src/mesa/drivers/dri/ffb/ffb_state.h deleted file mode 100644 index 19e72085fd1..00000000000 --- a/src/mesa/drivers/dri/ffb/ffb_state.h +++ /dev/null @@ -1,12 +0,0 @@ - -#ifndef _FFB_STATE_H -#define _FFB_STATE_H - -extern void ffbDDInitStateFuncs(GLcontext *); -extern void ffbDDInitContextHwState(GLcontext *); - -extern void ffbCalcViewport(GLcontext *); -extern void ffbXformAreaPattern(ffbContextPtr, const GLubyte *); -extern void ffbSyncHardware(ffbContextPtr fmesa); - -#endif /* !(_FFB_STATE_H) */ diff --git a/src/mesa/drivers/dri/ffb/ffb_stencil.c b/src/mesa/drivers/dri/ffb/ffb_stencil.c deleted file mode 100644 index 10cdfbc616e..00000000000 --- a/src/mesa/drivers/dri/ffb/ffb_stencil.c +++ /dev/null @@ -1,224 +0,0 @@ -/* - * - * GLX Hardware Device Driver for Sun Creator/Creator3D - * Copyright (C) 2000 David S. Miller - * - * 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 - * DAVID MILLER, OR ANY OTHER CONTRIBUTORS 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. - * - * - * David S. Miller <[email protected]> - */ - -#include "main/mtypes.h" -#include "ffb_dd.h" -#include "ffb_span.h" -#include "ffb_context.h" -#include "ffb_stencil.h" -#include "ffb_lock.h" - -#undef STENCIL_TRACE - -static void FFBWriteStencilSpan( GLcontext *ctx, - struct gl_renderbuffer *rb, - GLuint n, GLint x, GLint y, - const void *values, const GLubyte mask[] ) -{ - const GLubyte *stencil = (const GLubyte *) values; -#ifdef STENCIL_TRACE - fprintf(stderr, "FFBWriteStencilSpan: n(%d) x(%d) y(%d)\n", - (int) n, x, y); -#endif - if (ctx->Depth.Mask) { - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - __DRIdrawable *dPriv = fmesa->driDrawable; - GLuint *zptr; - GLuint i; - - if (!fmesa->hw_locked) - LOCK_HARDWARE(fmesa); - FFBFifo(fmesa, 2); - fmesa->regs->fbc = (FFB_FBC_WB_C | FFB_FBC_ZE_OFF | - FFB_FBC_YE_ON | FFB_FBC_RGBE_OFF); - fmesa->regs->ppc = FFB_PPC_YS_VAR; - FFBWait(fmesa, fmesa->regs); - - y = (dPriv->h - y); - zptr = (GLuint *) - ((char *)fmesa->sfb32 + - ((dPriv->x + x) << 2) + - ((dPriv->y + y) << 13)); - - for (i = 0; i < n; i++) { - if (mask[i]) - *zptr = (stencil[i] & 0xf) << 28; - zptr++; - } - - FFBFifo(fmesa, 2); - fmesa->regs->fbc = fmesa->fbc; - fmesa->regs->ppc = fmesa->ppc; - fmesa->ffbScreen->rp_active = 1; - if (!fmesa->hw_locked) - UNLOCK_HARDWARE(fmesa); - } -} - -static void FFBWriteStencilPixels( GLcontext *ctx, - struct gl_renderbuffer *rb, - GLuint n, - const GLint x[], const GLint y[], - const void *values, const GLubyte mask[] ) -{ - const GLubyte *stencil = (const GLubyte *) values; -#ifdef STENCIL_TRACE - fprintf(stderr, "FFBWriteStencilPixels: n(%d)\n", (int) n); -#endif - if (ctx->Depth.Mask) { - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - __DRIdrawable *dPriv = fmesa->driDrawable; - char *zbase; - GLuint i; - - if (!fmesa->hw_locked) - LOCK_HARDWARE(fmesa); - FFBFifo(fmesa, 2); - fmesa->regs->fbc = (FFB_FBC_WB_C | FFB_FBC_ZE_OFF | - FFB_FBC_YE_ON | FFB_FBC_RGBE_OFF); - fmesa->regs->ppc = FFB_PPC_YS_VAR; - fmesa->ffbScreen->rp_active = 1; - FFBWait(fmesa, fmesa->regs); - - zbase = ((char *)fmesa->sfb32 + - (dPriv->x << 2) + (dPriv->y << 13)); - - for (i = 0; i < n; i++) { - GLint y1 = (dPriv->h - y[i]); - GLint x1 = x[i]; - GLuint *zptr; - - zptr = (GLuint *) - (zbase + (x1 << 2) + (y1 << 13)); - if (mask[i]) - *zptr = (stencil[i] & 0xf) << 28; - } - - FFBFifo(fmesa, 2); - fmesa->regs->fbc = fmesa->fbc; - fmesa->regs->ppc = fmesa->ppc; - fmesa->ffbScreen->rp_active = 1; - if (!fmesa->hw_locked) - UNLOCK_HARDWARE(fmesa); - } -} - -static void FFBReadStencilSpan( GLcontext *ctx, - struct gl_renderbuffer *rb, - GLuint n, GLint x, GLint y, - void *values) -{ - GLubyte *stencil = (GLubyte *) values; - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - __DRIdrawable *dPriv = fmesa->driDrawable; - GLuint *zptr; - GLuint i; - -#ifdef STENCIL_TRACE - fprintf(stderr, "FFBReadStencilSpan: n(%d) x(%d) y(%d)\n", - (int) n, x, y); -#endif - if (!fmesa->hw_locked) - LOCK_HARDWARE(fmesa); - FFBFifo(fmesa, 1); - fmesa->regs->fbc = FFB_FBC_RB_C; - fmesa->ffbScreen->rp_active = 1; - FFBWait(fmesa, fmesa->regs); - - y = (dPriv->h - y); - zptr = (GLuint *) - ((char *)fmesa->sfb32 + - ((dPriv->x + x) << 2) + - ((dPriv->y + y) << 13)); - - for (i = 0; i < n; i++) { - stencil[i] = (*zptr >> 28) & 0xf; - zptr++; - } - - FFBFifo(fmesa, 1); - fmesa->regs->fbc = fmesa->fbc; - fmesa->ffbScreen->rp_active = 1; - if (!fmesa->hw_locked) - UNLOCK_HARDWARE(fmesa); -} - -static void FFBReadStencilPixels( GLcontext *ctx, - struct gl_renderbuffer *rb, - GLuint n, const GLint x[], const GLint y[], - void *values ) -{ - GLubyte *stencil = (GLubyte *) values; - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - __DRIdrawable *dPriv = fmesa->driDrawable; - char *zbase; - GLuint i; - -#ifdef STENCIL_TRACE - fprintf(stderr, "FFBReadStencilPixels: n(%d)\n", (int) n); -#endif - if (!fmesa->hw_locked) - LOCK_HARDWARE(fmesa); - FFBFifo(fmesa, 1); - fmesa->regs->fbc = FFB_FBC_RB_C; - fmesa->ffbScreen->rp_active = 1; - FFBWait(fmesa, fmesa->regs); - - zbase = ((char *)fmesa->sfb32 + - (dPriv->x << 2) + (dPriv->y << 13)); - - for (i = 0; i < n; i++) { - GLint y1 = (dPriv->h - y[i]); - GLint x1 = x[i]; - GLuint *zptr; - - zptr = (GLuint *) - (zbase + (x1 << 2) + (y1 << 13)); - stencil[i] = (*zptr >> 28) & 0xf; - } - - FFBFifo(fmesa, 1); - fmesa->regs->fbc = fmesa->fbc; - fmesa->ffbScreen->rp_active = 1; - if (!fmesa->hw_locked) - UNLOCK_HARDWARE(fmesa); -} - -/** - * Plug in the Get/Put routines for the given driRenderbuffer. - */ -void -ffbSetStencilFunctions(driRenderbuffer *drb, const GLvisual *vis) -{ - assert(drb->Base.InternalFormat == GL_STENCIL_INDEX8_EXT); - drb->Base.GetRow = FFBReadStencilSpan; - drb->Base.GetValues = FFBReadStencilPixels; - drb->Base.PutRow = FFBWriteStencilSpan; - /*drb->Base.PutMonoRow = FFBWriteMonoStencilSpan;*/ - drb->Base.PutValues = FFBWriteStencilPixels; - drb->Base.PutMonoValues = NULL; -} diff --git a/src/mesa/drivers/dri/ffb/ffb_stencil.h b/src/mesa/drivers/dri/ffb/ffb_stencil.h deleted file mode 100644 index 2d529980d16..00000000000 --- a/src/mesa/drivers/dri/ffb/ffb_stencil.h +++ /dev/null @@ -1,7 +0,0 @@ - -#ifndef _FFB_STENCIL_H -#define _FFB_STENCIL_H - -void ffbSetStencilFunctions(driRenderbuffer *drb, const GLvisual *vis); - -#endif /* !(_FFB_STENCIL_H) */ diff --git a/src/mesa/drivers/dri/ffb/ffb_tex.c b/src/mesa/drivers/dri/ffb/ffb_tex.c deleted file mode 100644 index 95058e9069f..00000000000 --- a/src/mesa/drivers/dri/ffb/ffb_tex.c +++ /dev/null @@ -1,35 +0,0 @@ -/* - * - * GLX Hardware Device Driver for Sun Creator/Creator3D - * Copyright (C) 2001 David S. Miller - * - * 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 - * DAVID MILLER, OR ANY OTHER CONTRIBUTORS 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. - * - * - * David S. Miller <[email protected]> - */ - -#include "main/glheader.h" -#include "main/mtypes.h" -#include "ffb_tex.h" - -/* No texture unit, all software. */ -void ffbDDInitTexFuncs(GLcontext *ctx) -{ -} diff --git a/src/mesa/drivers/dri/ffb/ffb_tex.h b/src/mesa/drivers/dri/ffb/ffb_tex.h deleted file mode 100644 index 4032e73209d..00000000000 --- a/src/mesa/drivers/dri/ffb/ffb_tex.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * - * GLX Hardware Device Driver for Sun Creator/Creator3D. - * Copyright (C) 2001 David S. Miller - * - * 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 - * DAVID MILLER, OR ANY OTHER CONTRIBUTORS 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. - * - * - * David S. Miller <[email protected]> - */ - -#ifndef _FFB_TEX_H -#define _FFB_TEX_H - -extern void ffbDDInitTexFuncs(GLcontext *ctx); - -#endif /* !(_FFB_DD_H) */ - diff --git a/src/mesa/drivers/dri/ffb/ffb_tris.c b/src/mesa/drivers/dri/ffb/ffb_tris.c deleted file mode 100644 index 8bf5ae498fd..00000000000 --- a/src/mesa/drivers/dri/ffb/ffb_tris.c +++ /dev/null @@ -1,945 +0,0 @@ -/* - * - * GLX Hardware Device Driver for Sun Creator/Creator3D - * Copyright (C) 2000, 2001 David S. Miller - * - * 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 - * DAVID MILLER, OR ANY OTHER CONTRIBUTORS 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. - * - * - * David S. Miller <[email protected]> - */ - -#include "main/glheader.h" -#include "main/mtypes.h" -#include "main/macros.h" -#include "swrast/swrast.h" -#include "swrast/s_context.h" -#include "swrast_setup/swrast_setup.h" -#include "tnl/t_context.h" -#include "tnl/t_pipeline.h" - -#include "ffb_context.h" -#include "ffb_tris.h" -#include "ffb_lines.h" -#include "ffb_lock.h" -#include "ffb_points.h" -#include "ffb_state.h" -#include "ffb_vb.h" - -#undef TRI_DEBUG -#undef FFB_RENDER_TRACE -#undef STATE_TRACE - -#ifdef TRI_DEBUG -static void ffb_print_vertex(const ffb_vertex *v) -{ - fprintf(stderr, "Vertex @(%p): " - "X[%f] Y[%f] Z[%f]\n", - v, v->x, v->y, v->z); - fprintf(stderr, "Vertex @(%p): " - "A[%f] R[%f] G[%f] B[%f]\n", - v, - v->color[0].alpha, - v->color[0].red, - v->color[0].green, - v->color[0].blue); -} -#define FFB_DUMP_VERTEX(V) ffb_print_vertex(V) -#else -#define FFB_DUMP_VERTEX(V) do { } while(0) -#endif - -#define FFB_ALPHA_BIT 0x01 -#define FFB_FLAT_BIT 0x02 -#define FFB_TRI_CULL_BIT 0x04 -#define MAX_FFB_RENDER_FUNCS 0x08 - -/*********************************************************************** - * Build low-level triangle/quad rasterize functions * - ***********************************************************************/ - -#define FFB_TRI_FLAT_BIT 0x01 -#define FFB_TRI_ALPHA_BIT 0x02 -/*#define FFB_TRI_CULL_BIT 0x04*/ - -static ffb_tri_func ffb_tri_tab[0x8]; -static ffb_quad_func ffb_quad_tab[0x8]; - -#define IND (0) -#define TAG(x) x -#include "ffb_tritmp.h" - -#define IND (FFB_TRI_FLAT_BIT) -#define TAG(x) x##_flat -#include "ffb_tritmp.h" - -#define IND (FFB_TRI_CULL_BIT) -#define TAG(x) x##_cull -#include "ffb_tritmp.h" - -#define IND (FFB_TRI_CULL_BIT|FFB_TRI_FLAT_BIT) -#define TAG(x) x##_cull_flat -#include "ffb_tritmp.h" - -#define IND (FFB_TRI_ALPHA_BIT) -#define TAG(x) x##_alpha -#include "ffb_tritmp.h" - -#define IND (FFB_TRI_ALPHA_BIT|FFB_TRI_FLAT_BIT) -#define TAG(x) x##_alpha_flat -#include "ffb_tritmp.h" - -#define IND (FFB_TRI_ALPHA_BIT|FFB_TRI_CULL_BIT) -#define TAG(x) x##_alpha_cull -#include "ffb_tritmp.h" - -#define IND (FFB_TRI_ALPHA_BIT|FFB_TRI_CULL_BIT|FFB_TRI_FLAT_BIT) -#define TAG(x) x##_alpha_cull_flat -#include "ffb_tritmp.h" - -static void init_tri_tab(void) -{ - ffb_init(); - ffb_init_flat(); - ffb_init_cull(); - ffb_init_cull_flat(); - ffb_init_alpha(); - ffb_init_alpha_flat(); - ffb_init_alpha_cull(); - ffb_init_alpha_cull_flat(); -} - -/* Build a SWvertex from a hardware vertex. */ -static void ffb_translate_vertex(GLcontext *ctx, const ffb_vertex *src, - SWvertex *dst) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - GLfloat *m = ctx->Viewport._WindowMap.m; - const GLfloat sx = m[0]; - const GLfloat sy = m[5]; - const GLfloat sz = m[10]; - const GLfloat tx = m[12]; - const GLfloat ty = m[13]; - const GLfloat tz = m[14]; - - dst->attrib[FRAG_ATTRIB_WPOS][0] = sx * src->x + tx; - dst->attrib[FRAG_ATTRIB_WPOS][1] = sy * src->y + ty; - dst->attrib[FRAG_ATTRIB_WPOS][2] = sz * src->z + tz; - dst->attrib[FRAG_ATTRIB_WPOS][3] = 1.0; - - dst->color[0] = FFB_UBYTE_FROM_COLOR(src->color[0].red); - dst->color[1] = FFB_UBYTE_FROM_COLOR(src->color[0].green); - dst->color[2] = FFB_UBYTE_FROM_COLOR(src->color[0].blue); - dst->color[3] = FFB_UBYTE_FROM_COLOR(src->color[0].alpha); -} - -/*********************************************************************** - * Build fallback triangle/quad rasterize functions * - ***********************************************************************/ - -static void ffb_fallback_triangle(GLcontext *ctx, ffb_vertex *v0, - ffb_vertex *v1, ffb_vertex *v2) -{ - SWvertex v[3]; - - ffb_translate_vertex(ctx, v0, &v[0]); - ffb_translate_vertex(ctx, v1, &v[1]); - ffb_translate_vertex(ctx, v2, &v[2]); - - _swrast_Triangle(ctx, &v[0], &v[1], &v[2]); -} - -static void ffb_fallback_quad(GLcontext *ctx, - ffb_vertex *v0, ffb_vertex *v1, - ffb_vertex *v2, ffb_vertex *v3) -{ - SWvertex v[4]; - - ffb_translate_vertex(ctx, v0, &v[0]); - ffb_translate_vertex(ctx, v1, &v[1]); - ffb_translate_vertex(ctx, v2, &v[2]); - ffb_translate_vertex(ctx, v3, &v[3]); - - _swrast_Quad(ctx, &v[0], &v[1], &v[2], &v[3]); -} - -void ffb_fallback_line(GLcontext *ctx, ffb_vertex *v0, ffb_vertex *v1) -{ - SWvertex v[2]; - - ffb_translate_vertex(ctx, v0, &v[0]); - ffb_translate_vertex(ctx, v1, &v[1]); - - _swrast_Line(ctx, &v[0], &v[1]); -} - -void ffb_fallback_point(GLcontext *ctx, ffb_vertex *v0) -{ - SWvertex v[1]; - - ffb_translate_vertex(ctx, v0, &v[0]); - - _swrast_Point(ctx, &v[0]); -} - -/*********************************************************************** - * Rasterization functions for culled tris/quads * - ***********************************************************************/ - -static void ffb_nodraw_triangle(GLcontext *ctx, ffb_vertex *v0, - ffb_vertex *v1, ffb_vertex *v2) -{ - (void) (ctx && v0 && v1 && v2); -} - -static void ffb_nodraw_quad(GLcontext *ctx, - ffb_vertex *v0, ffb_vertex *v1, - ffb_vertex *v2, ffb_vertex *v3) -{ - (void) (ctx && v0 && v1 && v2 && v3); -} - -static void ffb_update_cullsign(GLcontext *ctx) -{ - GLfloat backface_sign = 1; - - switch (ctx->Polygon.CullFaceMode) { - case GL_BACK: - if (ctx->Polygon.FrontFace==GL_CCW) - backface_sign = -1; - break; - - case GL_FRONT: - if (ctx->Polygon.FrontFace!=GL_CCW) - backface_sign = -1; - break; - - default: - break; - }; - - FFB_CONTEXT(ctx)->backface_sign = backface_sign; -} - -/*********************************************************************** - * Choose triangle/quad rasterize functions * - ***********************************************************************/ - -void ffbChooseTriangleState(GLcontext *ctx) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - GLuint flags = ctx->_TriangleCaps; - GLuint ind = 0; - - if (flags & DD_TRI_SMOOTH) { - fmesa->draw_tri = ffb_fallback_triangle; - fmesa->draw_quad = ffb_fallback_quad; - return; - } - - if (flags & DD_FLATSHADE) - ind |= FFB_TRI_FLAT_BIT; - - if (ctx->Polygon.CullFlag) { - if (ctx->Polygon.CullFaceMode == GL_FRONT_AND_BACK) { - fmesa->draw_tri = ffb_nodraw_triangle; - fmesa->draw_quad = ffb_nodraw_quad; - return; - } - - ind |= FFB_TRI_CULL_BIT; - ffb_update_cullsign(ctx); - } else - FFB_CONTEXT(ctx)->backface_sign = 0; - - /* If blending or the alpha test is enabled we need to - * provide alpha components to the chip, else we can - * do without it and thus feed vertex data to the chip - * more efficiently. - */ - if (ctx->Color.BlendEnabled || ctx->Color.AlphaEnabled) - ind |= FFB_TRI_ALPHA_BIT; - - fmesa->draw_tri = ffb_tri_tab[ind]; - fmesa->draw_quad = ffb_quad_tab[ind]; -} - -static const GLenum reduced_prim[GL_POLYGON+1] = { - GL_POINTS, - GL_LINES, - GL_LINES, - GL_LINES, - GL_TRIANGLES, - GL_TRIANGLES, - GL_TRIANGLES, - GL_TRIANGLES, - GL_TRIANGLES, - GL_TRIANGLES -}; - -static void ffbRenderPrimitive(GLcontext *ctx, GLenum prim); -static void ffbRasterPrimitive(GLcontext *ctx, GLenum rprim); - -/*********************************************************************** - * Build render functions from dd templates * - ***********************************************************************/ - -#define FFB_OFFSET_BIT 0x01 -#define FFB_TWOSIDE_BIT 0x02 -#define FFB_UNFILLED_BIT 0x04 -#define FFB_MAX_TRIFUNC 0x08 - -static struct { - tnl_triangle_func triangle; - tnl_quad_func quad; -} rast_tab[FFB_MAX_TRIFUNC]; - -#define DO_OFFSET (IND & FFB_OFFSET_BIT) -#define DO_UNFILLED (IND & FFB_UNFILLED_BIT) -#define DO_TWOSIDE (IND & FFB_TWOSIDE_BIT) -#define DO_FLAT 0 -#define DO_QUAD 1 -#define DO_FULL_QUAD 1 -#define DO_TRI 1 -#define DO_LINE 0 -#define DO_POINTS 0 - -#define QUAD( a, b, c, d ) fmesa->draw_quad( ctx, a, b, c, d ) -#define TRI( a, b, c ) fmesa->draw_tri( ctx, a, b, c ) -#define LINE( a, b ) fmesa->draw_line( ctx, a, b ) -#define POINT( a ) fmesa->draw_point( ctx, a ) - -#define HAVE_BACK_COLORS 1 -#define HAVE_RGBA 1 -#define HAVE_SPEC 0 -#define HAVE_HW_FLATSHADE 1 -#define VERTEX ffb_vertex -#define TAB rast_tab - -#define UNFILLED_TRI unfilled_tri -#define UNFILLED_QUAD unfilled_quad -#define DEPTH_SCALE (fmesa->depth_scale) -#define VERT_X(_v) (_v->x) -#define VERT_Y(_v) (_v->y) -#define VERT_Z(_v) (_v->z) -#define AREA_IS_CCW( a ) (a < fmesa->ffb_zero) -#define GET_VERTEX(e) (&fmesa->verts[e]) -#define INSANE_VERTICES -#define VERT_SET_Z(v,val) ((v)->z = (val)) -#define VERT_Z_ADD(v,val) ((v)->z += (val)) - -#define VERT_COPY_RGBA1( _v ) _v->color[0] = _v->color[1] -#define VERT_COPY_RGBA( v0, v1 ) v0->color[0] = v1->color[0] -#define VERT_SAVE_RGBA( idx ) color[idx] = v[idx]->color[0] -#define VERT_RESTORE_RGBA( idx ) v[idx]->color[0] = color[idx] - -#define LOCAL_VARS(n) \ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); \ - __DRIdrawable *dPriv = fmesa->driDrawable; \ - ffb_color color[n] = { { 0 } }; \ - (void) color; (void) dPriv; - -/*********************************************************************** - * Helpers for rendering unfilled primitives * - ***********************************************************************/ - -#define RASTERIZE(x) if (fmesa->raster_primitive != reduced_prim[x]) \ - ffbRasterPrimitive( ctx, reduced_prim[x] ) -#define RENDER_PRIMITIVE fmesa->render_primitive -#define TAG(x) x -#include "tnl_dd/t_dd_unfilled.h" - -/*********************************************************************** - * Generate GL render functions * - ***********************************************************************/ - -#define IND (0) -#define TAG(x) x -#include "tnl_dd/t_dd_tritmp.h" - -#define IND (FFB_OFFSET_BIT) -#define TAG(x) x##_offset -#include "tnl_dd/t_dd_tritmp.h" - -#define IND (FFB_TWOSIDE_BIT) -#define TAG(x) x##_twoside -#include "tnl_dd/t_dd_tritmp.h" - -#define IND (FFB_TWOSIDE_BIT|FFB_OFFSET_BIT) -#define TAG(x) x##_twoside_offset -#include "tnl_dd/t_dd_tritmp.h" - -#define IND (FFB_UNFILLED_BIT) -#define TAG(x) x##_unfilled -#include "tnl_dd/t_dd_tritmp.h" - -#define IND (FFB_OFFSET_BIT|FFB_UNFILLED_BIT) -#define TAG(x) x##_offset_unfilled -#include "tnl_dd/t_dd_tritmp.h" - -#define IND (FFB_TWOSIDE_BIT|FFB_UNFILLED_BIT) -#define TAG(x) x##_twoside_unfilled -#include "tnl_dd/t_dd_tritmp.h" - -#define IND (FFB_TWOSIDE_BIT|FFB_OFFSET_BIT|FFB_UNFILLED_BIT) -#define TAG(x) x##_twoside_offset_unfilled -#include "tnl_dd/t_dd_tritmp.h" - -static void init_rast_tab( void ) -{ - init(); - init_offset(); - init_twoside(); - init_twoside_offset(); - init_unfilled(); - init_offset_unfilled(); - init_twoside_unfilled(); - init_twoside_offset_unfilled(); -} - -/**********************************************************************/ -/* Render clipped primitives */ -/**********************************************************************/ - -static void ffbRenderClippedPolygon(GLcontext *ctx, const GLuint *elts, GLuint n) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - TNLcontext *tnl = TNL_CONTEXT(ctx); - struct vertex_buffer *VB = &tnl->vb; - GLuint prim = fmesa->render_primitive; - - /* Render the new vertices as an unclipped polygon. */ - { - GLuint *tmp = VB->Elts; - VB->Elts = (GLuint *)elts; - tnl->Driver.Render.PrimTabElts[GL_POLYGON](ctx, 0, n, PRIM_BEGIN|PRIM_END); - VB->Elts = tmp; - } - - /* Restore the render primitive. */ - if (prim != GL_POLYGON) - tnl->Driver.Render.PrimitiveNotify(ctx, prim); -} - -static void ffbRenderClippedLine(GLcontext *ctx, GLuint ii, GLuint jj) -{ - TNLcontext *tnl = TNL_CONTEXT(ctx); - tnl->Driver.Render.Line(ctx, ii, jj); -} - -/**********************************************************************/ -/* Render unclipped begin/end objects */ -/**********************************************************************/ - -static void ffb_vb_noop(GLcontext *ctx, GLuint start, GLuint count, GLuint flags) -{ - (void)(ctx && start && count && flags); -} - -#define ELT(x) x - -#define IND 0 -#define TAG(x) x -#include "ffb_rendertmp.h" - -#define IND (FFB_FLAT_BIT) -#define TAG(x) x##_flat -#include "ffb_rendertmp.h" - -#define IND (FFB_ALPHA_BIT) -#define TAG(x) x##_alpha -#include "ffb_rendertmp.h" - -#define IND (FFB_FLAT_BIT | FFB_ALPHA_BIT) -#define TAG(x) x##_flat_alpha -#include "ffb_rendertmp.h" - -#define IND (FFB_TRI_CULL_BIT) -#define TAG(x) x##_tricull -#include "ffb_rendertmp.h" - -#define IND (FFB_FLAT_BIT | FFB_TRI_CULL_BIT) -#define TAG(x) x##_flat_tricull -#include "ffb_rendertmp.h" - -#define IND (FFB_ALPHA_BIT | FFB_TRI_CULL_BIT) -#define TAG(x) x##_alpha_tricull -#include "ffb_rendertmp.h" - -#define IND (FFB_FLAT_BIT | FFB_ALPHA_BIT | FFB_TRI_CULL_BIT) -#define TAG(x) x##_flat_alpha_tricull -#include "ffb_rendertmp.h" - -#undef ELT -#define ELT(x) elt[x] - -#define IND 0 -#define TAG(x) x##_elt -#include "ffb_rendertmp.h" - -#define IND (FFB_FLAT_BIT) -#define TAG(x) x##_flat_elt -#include "ffb_rendertmp.h" - -#define IND (FFB_ALPHA_BIT) -#define TAG(x) x##_alpha_elt -#include "ffb_rendertmp.h" - -#define IND (FFB_FLAT_BIT | FFB_ALPHA_BIT) -#define TAG(x) x##_flat_alpha_elt -#include "ffb_rendertmp.h" - -#define IND (FFB_TRI_CULL_BIT) -#define TAG(x) x##_tricull_elt -#include "ffb_rendertmp.h" - -#define IND (FFB_FLAT_BIT | FFB_TRI_CULL_BIT) -#define TAG(x) x##_flat_tricull_elt -#include "ffb_rendertmp.h" - -#define IND (FFB_ALPHA_BIT | FFB_TRI_CULL_BIT) -#define TAG(x) x##_alpha_tricull_elt -#include "ffb_rendertmp.h" - -#define IND (FFB_FLAT_BIT | FFB_ALPHA_BIT | FFB_TRI_CULL_BIT) -#define TAG(x) x##_flat_alpha_tricull_elt -#include "ffb_rendertmp.h" - -static void *render_tabs[MAX_FFB_RENDER_FUNCS]; -static void *render_tabs_elt[MAX_FFB_RENDER_FUNCS]; - -static void init_render_tab(void) -{ - int i; - - render_tabs[0] = render_tab; - render_tabs[FFB_FLAT_BIT] = render_tab_flat; - render_tabs[FFB_ALPHA_BIT] = render_tab_alpha; - render_tabs[FFB_FLAT_BIT|FFB_ALPHA_BIT] = render_tab_flat_alpha; - render_tabs[FFB_TRI_CULL_BIT] = render_tab_tricull; - render_tabs[FFB_FLAT_BIT|FFB_TRI_CULL_BIT] = render_tab_flat_tricull; - render_tabs[FFB_ALPHA_BIT|FFB_TRI_CULL_BIT] = render_tab_alpha_tricull; - render_tabs[FFB_FLAT_BIT|FFB_ALPHA_BIT|FFB_TRI_CULL_BIT] = - render_tab_flat_alpha_tricull; - - render_tabs_elt[0] = render_tab_elt; - render_tabs_elt[FFB_FLAT_BIT] = render_tab_flat_elt; - render_tabs_elt[FFB_ALPHA_BIT] = render_tab_alpha_elt; - render_tabs_elt[FFB_FLAT_BIT|FFB_ALPHA_BIT] = render_tab_flat_alpha_elt; - render_tabs_elt[FFB_TRI_CULL_BIT] = render_tab_tricull_elt; - render_tabs_elt[FFB_FLAT_BIT|FFB_TRI_CULL_BIT] = render_tab_flat_tricull_elt; - render_tabs_elt[FFB_ALPHA_BIT|FFB_TRI_CULL_BIT] = render_tab_alpha_tricull_elt; - render_tabs_elt[FFB_FLAT_BIT|FFB_ALPHA_BIT|FFB_TRI_CULL_BIT] = - render_tab_flat_alpha_tricull_elt; - - for (i = 0; i < MAX_FFB_RENDER_FUNCS; i++) { - tnl_render_func *rf = render_tabs[i]; - tnl_render_func *rfe = render_tabs_elt[i]; - - if (i & FFB_TRI_CULL_BIT) { - int from_idx = (i & ~FFB_TRI_CULL_BIT); - tnl_render_func *rf_from = render_tabs[from_idx]; - tnl_render_func *rfe_from = render_tabs_elt[from_idx]; - int j; - - for (j = GL_POINTS; j < GL_TRIANGLES; j++) { - rf[j] = rf_from[j]; - rfe[j] = rfe_from[j]; - } - } - } -} - -/**********************************************************************/ -/* Choose render functions */ -/**********************************************************************/ - -#ifdef FFB_RENDER_TRACE -static void ffbPrintRenderFlags(GLuint index, GLuint render_index) -{ - fprintf(stderr, - "ffbChooseRenderState: " - "index(%s%s%s) " - "render_index(%s%s%s)\n", - ((index & FFB_TWOSIDE_BIT) ? "twoside " : ""), - ((index & FFB_OFFSET_BIT) ? "offset " : ""), - ((index & FFB_UNFILLED_BIT) ? "unfilled " : ""), - ((render_index & FFB_FLAT_BIT) ? "flat " : ""), - ((render_index & FFB_ALPHA_BIT) ? "alpha " : ""), - ((render_index & FFB_TRI_CULL_BIT) ? "tricull " : "")); -} -#endif - -void ffbChooseRenderState(GLcontext *ctx) -{ - GLuint flags = ctx->_TriangleCaps; - TNLcontext *tnl = TNL_CONTEXT(ctx); - GLuint index = 0; - - /* Per-primitive fallbacks and the selection of fmesa->draw_* are - * handled elsewhere. - */ - if (flags & DD_TRI_LIGHT_TWOSIDE) - index |= FFB_TWOSIDE_BIT; - - if (flags & DD_TRI_OFFSET) - index |= FFB_OFFSET_BIT; - - if (flags & DD_TRI_UNFILLED) - index |= FFB_UNFILLED_BIT; - - tnl->Driver.Render.Triangle = rast_tab[index].triangle; - tnl->Driver.Render.Quad = rast_tab[index].quad; - - if (index == 0) { - GLuint render_index = 0; - - if (flags & DD_FLATSHADE) - render_index |= FFB_FLAT_BIT; - - if (ctx->Color.BlendEnabled || ctx->Color.AlphaEnabled) - render_index |= FFB_ALPHA_BIT; - - if (ctx->Polygon.CullFlag) - render_index |= FFB_TRI_CULL_BIT; - -#ifdef FFB_RENDER_TRACE - ffbPrintRenderFlags(index, render_index); -#endif - tnl->Driver.Render.PrimTabVerts = render_tabs[render_index]; - tnl->Driver.Render.PrimTabElts = render_tabs_elt[render_index]; - } else { -#ifdef FFB_RENDER_TRACE - ffbPrintRenderFlags(index, 0); -#endif - tnl->Driver.Render.PrimTabVerts = _tnl_render_tab_verts; - tnl->Driver.Render.PrimTabElts = _tnl_render_tab_elts; - } - - tnl->Driver.Render.ClippedPolygon = ffbRenderClippedPolygon; - tnl->Driver.Render.ClippedLine = ffbRenderClippedLine; -} - -static void ffbRunPipeline(GLcontext *ctx) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - - if (fmesa->bad_fragment_attrs == 0 && - fmesa->new_gl_state) { - if (fmesa->new_gl_state & _FFB_NEW_TRIANGLE) - ffbChooseTriangleState(ctx); - if (fmesa->new_gl_state & _FFB_NEW_LINE) - ffbChooseLineState(ctx); - if (fmesa->new_gl_state & _FFB_NEW_POINT) - ffbChoosePointState(ctx); - if (fmesa->new_gl_state & _FFB_NEW_RENDER) - ffbChooseRenderState(ctx); - if (fmesa->new_gl_state & _FFB_NEW_VERTEX) - ffbChooseVertexState(ctx); - - fmesa->new_gl_state = 0; - } - - _tnl_run_pipeline(ctx); -} - -static void ffbRenderStart(GLcontext *ctx) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - - LOCK_HARDWARE(fmesa); - fmesa->hw_locked = 1; - - if (fmesa->state_dirty != 0) - ffbSyncHardware(fmesa); -} - -static void ffbRenderFinish(GLcontext *ctx) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - - UNLOCK_HARDWARE(fmesa); - fmesa->hw_locked = 0; -} - -/* Even when doing full software rendering we need to - * wrap render{start,finish} so that the hardware is kept - * in sync (because multipass rendering changes the write - * buffer etc.) - */ -static void ffbSWRenderStart(GLcontext *ctx) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - - LOCK_HARDWARE(fmesa); - fmesa->hw_locked = 1; - - if (fmesa->state_dirty != 0) - ffbSyncHardware(fmesa); -} - -static void ffbSWRenderFinish(GLcontext *ctx) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - - UNLOCK_HARDWARE(fmesa); - fmesa->hw_locked = 0; -} - -static void ffbRasterPrimitive(GLcontext *ctx, GLenum rprim) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - GLuint drawop, fbc, ppc; - int do_sw = 0; - - fmesa->raster_primitive = rprim; - - drawop = fmesa->drawop; - fbc = fmesa->fbc; - ppc = fmesa->ppc & ~(FFB_PPC_ZS_MASK | FFB_PPC_CS_MASK); - -#ifdef STATE_TRACE - fprintf(stderr, - "ffbReducedPrimitiveChange: rprim(%d) ", rprim); -#endif - switch(rprim) { - case GL_POINTS: -#ifdef STATE_TRACE - fprintf(stderr, "GL_POINTS "); -#endif - if (fmesa->draw_point == ffb_fallback_point) { - do_sw = 1; - break; - } - - if (ctx->Point.SmoothFlag) { - ppc |= (FFB_PPC_ZS_VAR | FFB_PPC_CS_CONST); - drawop = FFB_DRAWOP_AADOT; - } else { - ppc |= (FFB_PPC_ZS_CONST | FFB_PPC_CS_CONST); - drawop = FFB_DRAWOP_DOT; - } - break; - - case GL_LINES: -#ifdef STATE_TRACE - fprintf(stderr, "GL_LINES "); -#endif - if (fmesa->draw_line == ffb_fallback_line) { - do_sw = 1; - break; - } - - if (ctx->_TriangleCaps & DD_FLATSHADE) { - ppc |= FFB_PPC_ZS_VAR | FFB_PPC_CS_CONST; - } else { - ppc |= FFB_PPC_ZS_VAR | FFB_PPC_CS_VAR; - } - if (ctx->Line.SmoothFlag) - drawop = FFB_DRAWOP_AALINE; - else - drawop = FFB_DRAWOP_DDLINE; - break; - - case GL_TRIANGLES: -#ifdef STATE_TRACE - fprintf(stderr, "GL_POLYGON "); -#endif - if (fmesa->draw_tri == ffb_fallback_triangle) { - do_sw = 1; - break; - } - - ppc &= ~FFB_PPC_APE_MASK; - if (ctx->Polygon.StippleFlag) - ppc |= FFB_PPC_APE_ENABLE; - else - ppc |= FFB_PPC_APE_DISABLE; - - if (ctx->_TriangleCaps & DD_FLATSHADE) { - ppc |= FFB_PPC_ZS_VAR | FFB_PPC_CS_CONST; - } else { - ppc |= FFB_PPC_ZS_VAR | FFB_PPC_CS_VAR; - } - drawop = FFB_DRAWOP_TRIANGLE; - break; - - default: -#ifdef STATE_TRACE - fprintf(stderr, "unknown %d!\n", rprim); -#endif - return; - }; - -#ifdef STATE_TRACE - fprintf(stderr, "do_sw(%d) ", do_sw); -#endif - if (do_sw != 0) { - fbc &= ~(FFB_FBC_WB_C); - fbc &= ~(FFB_FBC_ZE_MASK | FFB_FBC_RGBE_MASK); - fbc |= FFB_FBC_ZE_OFF | FFB_FBC_RGBE_MASK; - ppc &= ~(FFB_PPC_XS_MASK | FFB_PPC_ABE_MASK | - FFB_PPC_DCE_MASK | FFB_PPC_APE_MASK); - ppc |= (FFB_PPC_ZS_VAR | FFB_PPC_CS_VAR | FFB_PPC_XS_WID | - FFB_PPC_ABE_DISABLE | FFB_PPC_DCE_DISABLE | - FFB_PPC_APE_DISABLE); - } else { - fbc |= FFB_FBC_WB_C; - fbc &= ~(FFB_FBC_RGBE_MASK); - fbc |= FFB_FBC_RGBE_MASK; - ppc &= ~(FFB_PPC_ABE_MASK | FFB_PPC_XS_MASK); - if (ctx->Color.BlendEnabled) { - if ((rprim == GL_POINTS && !ctx->Point.SmoothFlag) || - (rprim != GL_POINTS && ctx->_TriangleCaps & DD_FLATSHADE)) - ppc |= FFB_PPC_ABE_ENABLE | FFB_PPC_XS_CONST; - else - ppc |= FFB_PPC_ABE_ENABLE | FFB_PPC_XS_VAR; - } else { - ppc |= FFB_PPC_ABE_DISABLE | FFB_PPC_XS_WID; - } - } -#ifdef STATE_TRACE - fprintf(stderr, "fbc(%08x) ppc(%08x)\n", fbc, ppc); -#endif - - FFBFifo(fmesa, 4); - if (fmesa->drawop != drawop) - fmesa->regs->drawop = fmesa->drawop = drawop; - if (fmesa->fbc != fbc) - fmesa->regs->fbc = fmesa->fbc = fbc; - if (fmesa->ppc != ppc) - fmesa->regs->ppc = fmesa->ppc = ppc; - if (do_sw != 0) { - fmesa->regs->cmp = - (fmesa->cmp & ~(0xff<<16)) | (0x80 << 16); - } else - fmesa->regs->cmp = fmesa->cmp; -} - -static void ffbRenderPrimitive(GLcontext *ctx, GLenum prim) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - GLuint rprim = reduced_prim[prim]; - - fmesa->render_primitive = prim; - - if (rprim == GL_TRIANGLES && (ctx->_TriangleCaps & DD_TRI_UNFILLED)) - return; - - if (fmesa->raster_primitive != rprim) { - ffbRasterPrimitive( ctx, rprim ); - } -} - - - - -/**********************************************************************/ -/* Transition to/from hardware rasterization. */ -/**********************************************************************/ - -static char *fallbackStrings[] = { - "Fog enabled", - "Blend function", - "Blend ROP", - "Blend equation", - "Stencil", - "Texture", - "LIBGL_SOFTWARE_RENDERING" -}; - -static char *getFallbackString(GLuint bit) -{ - int i = 0; - - while (bit > 1) { - i++; - bit >>= 1; - } - return fallbackStrings[i]; -} - -void ffbFallback( GLcontext *ctx, GLuint bit, GLboolean mode ) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - TNLcontext *tnl = TNL_CONTEXT(ctx); - GLuint oldfallback = fmesa->bad_fragment_attrs; - - if (mode) { - fmesa->bad_fragment_attrs |= bit; - if (oldfallback == 0) { -/* FFB_FIREVERTICES(fmesa); */ - _swsetup_Wakeup( ctx ); - if (fmesa->debugFallbacks) - fprintf(stderr, "FFB begin software fallback: 0x%x %s\n", - bit, getFallbackString(bit)); - } - } else { - fmesa->bad_fragment_attrs &= ~bit; - if (oldfallback == bit) { - _swrast_flush( ctx ); - - tnl->Driver.Render.Start = ffbRenderStart; - tnl->Driver.Render.PrimitiveNotify = ffbRenderPrimitive; - tnl->Driver.Render.Finish = ffbRenderFinish; - fmesa->new_gl_state = ~0; - - /* Just re-choose everything: - */ - ffbChooseVertexState(ctx); - ffbChooseRenderState(ctx); - ffbChooseTriangleState(ctx); - ffbChooseLineState(ctx); - ffbChoosePointState(ctx); - - if (fmesa->debugFallbacks) - fprintf(stderr, "FFB end software fallback: 0x%x %s\n", - bit, getFallbackString(bit)); - } - } -} - -/**********************************************************************/ -/* Initialization. */ -/**********************************************************************/ - -void ffbDDInitRenderFuncs( GLcontext *ctx ) -{ - TNLcontext *tnl = TNL_CONTEXT(ctx); - SWcontext *swrast = SWRAST_CONTEXT(ctx); - static int firsttime = 1; - - if (firsttime) { - init_rast_tab(); - init_tri_tab(); - init_render_tab(); - firsttime = 0; - } - - tnl->Driver.RunPipeline = ffbRunPipeline; - tnl->Driver.Render.Start = ffbRenderStart; - tnl->Driver.Render.Finish = ffbRenderFinish; - tnl->Driver.Render.PrimitiveNotify = ffbRenderPrimitive; - tnl->Driver.Render.ResetLineStipple = _swrast_ResetLineStipple; - tnl->Driver.Render.PrimTabVerts = _tnl_render_tab_verts; - tnl->Driver.Render.PrimTabElts = _tnl_render_tab_elts; - - swrast->Driver.SpanRenderStart = ffbSWRenderStart; - swrast->Driver.SpanRenderFinish = ffbSWRenderFinish; -} diff --git a/src/mesa/drivers/dri/ffb/ffb_tris.h b/src/mesa/drivers/dri/ffb/ffb_tris.h deleted file mode 100644 index 116b8e07f15..00000000000 --- a/src/mesa/drivers/dri/ffb/ffb_tris.h +++ /dev/null @@ -1,25 +0,0 @@ - -#ifndef _FFB_TRIS_H -#define _FFB_TRIS_H - -extern void ffbDDInitRenderFuncs( GLcontext *ctx ); - - -#define _FFB_NEW_RENDER (_DD_NEW_TRI_LIGHT_TWOSIDE | \ - _DD_NEW_TRI_OFFSET | \ - _DD_NEW_TRI_UNFILLED) - -extern void ffbChooseRenderState(GLcontext *ctx); - - -#define _FFB_NEW_TRIANGLE (_DD_NEW_TRI_SMOOTH | \ - _DD_NEW_FLATSHADE | \ - _NEW_POLYGON | \ - _NEW_COLOR) - -extern void ffbChooseTriangleState(GLcontext *ctx); - -extern void ffbFallback( GLcontext *ctx, GLuint bit, GLboolean mode ); -#define FALLBACK( ctx, bit, mode ) ffbFallback( ctx, bit, mode ) - -#endif /* !(_FFB_TRIS_H) */ diff --git a/src/mesa/drivers/dri/ffb/ffb_tritmp.h b/src/mesa/drivers/dri/ffb/ffb_tritmp.h deleted file mode 100644 index 324a871ec42..00000000000 --- a/src/mesa/drivers/dri/ffb/ffb_tritmp.h +++ /dev/null @@ -1,238 +0,0 @@ - -static void TAG(ffb_triangle)( GLcontext *ctx, - ffb_vertex *v0, - ffb_vertex *v1, - ffb_vertex *v2 ) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - ffb_fbcPtr ffb = fmesa->regs; -#if (IND & FFB_TRI_FLAT_BIT) - GLuint const_fg; -#endif - FFB_DELAYED_VIEWPORT_VARS; - -#ifdef TRI_DEBUG - fprintf(stderr, "FFB: ffb_triangle [" -#if (IND & FFB_TRI_CULL_BIT) - " CULL" -#endif -#if (IND & FFB_TRI_FLAT_BIT) - " FLAT" -#endif -#if (IND & FFB_TRI_ALPHA_BIT) - " ALPHA" -#endif - " ]\n"); -#endif - -#if (IND & FFB_TRI_CULL_BIT) - { /* NOTE: These are not viewport transformed yet. */ - GLfloat ex = v1->x - v0->x; - GLfloat ey = v1->y - v0->y; - GLfloat fx = v2->x - v0->x; - GLfloat fy = v2->y - v0->y; - GLfloat c = ex*fy-ey*fx; - - /* Culled... */ - if (c * fmesa->backface_sign > fmesa->ffb_zero) - return; - } -#endif - -#if (IND & FFB_TRI_FLAT_BIT) - const_fg = FFB_PACK_CONST_UBYTE_ARGB_COLOR( v2->color[0] ); -#ifdef TRI_DEBUG - fprintf(stderr, "FFB_tri: const_fg %08x (B[%f] G[%f] R[%f])\n", - const_fg, - FFB_2_30_FIXED_TO_FLOAT(v2->color[0].blue), - FFB_2_30_FIXED_TO_FLOAT(v2->color[0].green), - FFB_2_30_FIXED_TO_FLOAT(v2->color[0].red)); -#endif -#endif - - -#if (IND & FFB_TRI_FLAT_BIT) - FFBFifo(fmesa, 1); - ffb->fg = const_fg; -#endif - -#if (IND & FFB_TRI_FLAT_BIT) - FFBFifo(fmesa, 9); -#else -#if (IND & FFB_TRI_ALPHA_BIT) - FFBFifo(fmesa, 21); -#else - FFBFifo(fmesa, 18); -#endif -#endif - - FFB_DUMP_VERTEX(v0); -#if !(IND & FFB_TRI_FLAT_BIT) -#if (IND & FFB_TRI_ALPHA_BIT) - ffb->alpha = FFB_GET_ALPHA(v0); -#endif - ffb->red = FFB_GET_RED(v0); - ffb->green = FFB_GET_GREEN(v0); - ffb->blue = FFB_GET_BLUE(v0); -#endif - ffb->z = FFB_GET_Z(v0); - ffb->ryf = FFB_GET_Y(v0); - ffb->rxf = FFB_GET_X(v0); - - FFB_DUMP_VERTEX(v1); -#if !(IND & FFB_TRI_FLAT_BIT) -#if (IND & FFB_TRI_ALPHA_BIT) - ffb->alpha = FFB_GET_ALPHA(v1); -#endif - ffb->red = FFB_GET_RED(v1); - ffb->green = FFB_GET_GREEN(v1); - ffb->blue = FFB_GET_BLUE(v1); -#endif - ffb->z = FFB_GET_Z(v1); - ffb->y = FFB_GET_Y(v1); - ffb->x = FFB_GET_X(v1); - - FFB_DUMP_VERTEX(v2); -#if !(IND & FFB_TRI_FLAT_BIT) -#if (IND & FFB_TRI_ALPHA_BIT) - ffb->alpha = FFB_GET_ALPHA(v2); -#endif - ffb->red = FFB_GET_RED(v2); - ffb->green = FFB_GET_GREEN(v2); - ffb->blue = FFB_GET_BLUE(v2); -#endif - ffb->z = FFB_GET_Z(v2); - ffb->y = FFB_GET_Y(v2); - ffb->x = FFB_GET_X(v2); - - fmesa->ffbScreen->rp_active = 1; -} - - -static void TAG(ffb_quad)(GLcontext *ctx, - ffb_vertex *v0, - ffb_vertex *v1, - ffb_vertex *v2, - ffb_vertex *v3 ) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - ffb_fbcPtr ffb = fmesa->regs; -#if (IND & FFB_TRI_FLAT_BIT) - GLuint const_fg; -#endif - FFB_DELAYED_VIEWPORT_VARS; - -#ifdef TRI_DEBUG - fprintf(stderr, "FFB: ffb_quad [" -#if (IND & FFB_TRI_CULL_BIT) - " CULL" -#endif -#if (IND & FFB_TRI_FLAT_BIT) - " FLAT" -#endif -#if (IND & FFB_TRI_ALPHA_BIT) - " ALPHA" -#endif - " ]\n"); -#endif /* TRI_DEBUG */ - -#if (IND & FFB_TRI_CULL_BIT) - { /* NOTE: These are not viewport transformed yet. */ - GLfloat ex = v2->x - v0->x; - GLfloat ey = v2->y - v0->y; - GLfloat fx = v3->x - v1->x; - GLfloat fy = v3->y - v1->y; - GLfloat c = ex*fy-ey*fx; - - /* Culled... */ - if (c * fmesa->backface_sign > fmesa->ffb_zero) - return; - } -#endif - -#if (IND & FFB_TRI_FLAT_BIT) - const_fg = FFB_PACK_CONST_UBYTE_ARGB_COLOR( v3->color[0] ); -#ifdef TRI_DEBUG - fprintf(stderr, "FFB_quad: const_fg %08x (B[%f] G[%f] R[%f])\n", - const_fg, - FFB_2_30_FIXED_TO_FLOAT(v3->color[0].blue), - FFB_2_30_FIXED_TO_FLOAT(v3->color[0].green), - FFB_2_30_FIXED_TO_FLOAT(v3->color[0].red)); -#endif -#endif - - -#if (IND & FFB_TRI_FLAT_BIT) - FFBFifo(fmesa, 13); - ffb->fg = const_fg; -#else -#if (IND & FFB_TRI_ALPHA_BIT) - FFBFifo(fmesa, 28); -#else - FFBFifo(fmesa, 24); -#endif -#endif - - FFB_DUMP_VERTEX(v0); -#if !(IND & FFB_TRI_FLAT_BIT) -#if (IND & FFB_TRI_ALPHA_BIT) - ffb->alpha = FFB_GET_ALPHA(v0); -#endif - ffb->red = FFB_GET_RED(v0); - ffb->green = FFB_GET_GREEN(v0); - ffb->blue = FFB_GET_BLUE(v0); -#endif - ffb->z = FFB_GET_Z(v0); - ffb->ryf = FFB_GET_Y(v0); - ffb->rxf = FFB_GET_X(v0); - - FFB_DUMP_VERTEX(v1); -#if !(IND & FFB_TRI_FLAT_BIT) -#if (IND & FFB_TRI_ALPHA_BIT) - ffb->alpha = FFB_GET_ALPHA(v1); -#endif - ffb->red = FFB_GET_RED(v1); - ffb->green = FFB_GET_GREEN(v1); - ffb->blue = FFB_GET_BLUE(v1); -#endif - ffb->z = FFB_GET_Z(v1); - ffb->y = FFB_GET_Y(v1); - ffb->x = FFB_GET_X(v1); - - FFB_DUMP_VERTEX(v2); -#if !(IND & FFB_TRI_FLAT_BIT) -#if (IND & FFB_TRI_ALPHA_BIT) - ffb->alpha = FFB_GET_ALPHA(v2); -#endif - ffb->red = FFB_GET_RED(v2); - ffb->green = FFB_GET_GREEN(v2); - ffb->blue = FFB_GET_BLUE(v2); -#endif - ffb->z = FFB_GET_Z(v2); - ffb->y = FFB_GET_Y(v2); - ffb->x = FFB_GET_X(v2); - - FFB_DUMP_VERTEX(v3); -#if !(IND & FFB_TRI_FLAT_BIT) -#if (IND & FFB_TRI_ALPHA_BIT) - ffb->alpha = FFB_GET_ALPHA(v3); -#endif - ffb->red = FFB_GET_RED(v3); - ffb->green = FFB_GET_GREEN(v3); - ffb->blue = FFB_GET_BLUE(v3); -#endif - ffb->z = FFB_GET_Z(v3); - ffb->dmyf = FFB_GET_Y(v3); - ffb->dmxf = FFB_GET_X(v3); - - fmesa->ffbScreen->rp_active = 1; -} - -static void TAG(ffb_init)(void) -{ - ffb_tri_tab[IND] = TAG(ffb_triangle); - ffb_quad_tab[IND] = TAG(ffb_quad); -} - -#undef IND -#undef TAG diff --git a/src/mesa/drivers/dri/ffb/ffb_vb.c b/src/mesa/drivers/dri/ffb/ffb_vb.c deleted file mode 100644 index a53e7c74319..00000000000 --- a/src/mesa/drivers/dri/ffb/ffb_vb.c +++ /dev/null @@ -1,207 +0,0 @@ -/* - * - * GLX Hardware Device Driver for Sun Creator/Creator3D - * Copyright (C) 2000, 2001 David S. Miller - * - * 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 - * DAVID MILLER, OR ANY OTHER CONTRIBUTORS 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. - * - * - * David S. Miller <[email protected]> - */ - -#include "ffb_xmesa.h" -#include "ffb_context.h" -#include "ffb_vb.h" -#include "main/imports.h" -#include "tnl/t_context.h" - -#undef VB_DEBUG - -static void ffb_copy_pv_oneside(GLcontext *ctx, GLuint edst, GLuint esrc) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - ffb_vertex *dst = &fmesa->verts[edst]; - ffb_vertex *src = &fmesa->verts[esrc]; - -#ifdef VB_DEBUG - fprintf(stderr, "ffb_copy_pv_oneside: edst(%d) esrc(%d)\n", edst, esrc); -#endif - dst->color[0].alpha = src->color[0].alpha; - dst->color[0].red = src->color[0].red; - dst->color[0].green = src->color[0].green; - dst->color[0].blue = src->color[0].blue; -} - -static void ffb_copy_pv_twoside(GLcontext *ctx, GLuint edst, GLuint esrc) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - ffb_vertex *dst = &fmesa->verts[edst]; - ffb_vertex *src = &fmesa->verts[esrc]; - -#ifdef VB_DEBUG - fprintf(stderr, "ffb_copy_pv_twoside: edst(%d) esrc(%d)\n", edst, esrc); -#endif - dst->color[0].alpha = src->color[0].alpha; - dst->color[0].red = src->color[0].red; - dst->color[0].green = src->color[0].green; - dst->color[0].blue = src->color[0].blue; - dst->color[1].alpha = src->color[1].alpha; - dst->color[1].red = src->color[1].red; - dst->color[1].green = src->color[1].green; - dst->color[1].blue = src->color[1].blue; -} - -#define FFB_VB_RGBA_BIT 0x01 -#define FFB_VB_XYZ_BIT 0x02 -#define FFB_VB_TWOSIDE_BIT 0x04 -#define FFB_VB_MAX 0x08 - -typedef void (*ffb_emit_func)(GLcontext *, GLuint, GLuint); - -static struct { - ffb_emit_func emit; - tnl_interp_func interp; -} setup_tab[FFB_VB_MAX]; - - -#define IND (FFB_VB_XYZ_BIT) -#define TAG(x) x##_w -#include "ffb_vbtmp.h" - -#define IND (FFB_VB_RGBA_BIT) -#define TAG(x) x##_g -#include "ffb_vbtmp.h" - -#define IND (FFB_VB_XYZ_BIT | FFB_VB_RGBA_BIT) -#define TAG(x) x##_wg -#include "ffb_vbtmp.h" - -#define IND (FFB_VB_TWOSIDE_BIT) -#define TAG(x) x##_t -#include "ffb_vbtmp.h" - -#define IND (FFB_VB_XYZ_BIT | FFB_VB_TWOSIDE_BIT) -#define TAG(x) x##_wt -#include "ffb_vbtmp.h" - -#define IND (FFB_VB_RGBA_BIT | FFB_VB_TWOSIDE_BIT) -#define TAG(x) x##_gt -#include "ffb_vbtmp.h" - -#define IND (FFB_VB_XYZ_BIT | FFB_VB_RGBA_BIT | FFB_VB_TWOSIDE_BIT) -#define TAG(x) x##_wgt -#include "ffb_vbtmp.h" - -static void init_setup_tab( void ) -{ - init_w(); - init_g(); - init_wg(); - init_t(); - init_wt(); - init_gt(); - init_wgt(); -} - -#ifdef VB_DEBUG -static void ffbPrintSetupFlags(char *msg, GLuint flags) -{ - fprintf(stderr, "%s(%x): %s%s%s\n", - msg, - (int)flags, - (flags & FFB_VB_XYZ_BIT) ? " xyz," : "", - (flags & FFB_VB_RGBA_BIT) ? " rgba," : "", - (flags & FFB_VB_TWOSIDE_BIT) ? " twoside," : ""); -} -#endif - -static void ffbDDBuildVertices(GLcontext *ctx, GLuint start, GLuint count, - GLuint newinputs) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - - newinputs |= fmesa->setupnewinputs; - fmesa->setupnewinputs = 0; - - if (!newinputs) - return; - - if (newinputs & VERT_BIT_POS) { - setup_tab[fmesa->setupindex].emit(ctx, start, count); - } else { - GLuint ind = 0; - - if (newinputs & VERT_BIT_COLOR0) - ind |= (FFB_VB_RGBA_BIT | FFB_VB_TWOSIDE_BIT); - - ind &= fmesa->setupindex; - - if (ind) - setup_tab[ind].emit(ctx, start, count); - } -} - -void ffbChooseVertexState( GLcontext *ctx ) -{ - TNLcontext *tnl = TNL_CONTEXT(ctx); - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - int ind = FFB_VB_XYZ_BIT | FFB_VB_RGBA_BIT; - - if (ctx->_TriangleCaps & DD_TRI_LIGHT_TWOSIDE) - ind |= FFB_VB_TWOSIDE_BIT; - -#ifdef VB_DEBUG - ffbPrintSetupFlags("ffb: full setup function", ind); -#endif - - fmesa->setupindex = ind; - - tnl->Driver.Render.BuildVertices = ffbDDBuildVertices; - tnl->Driver.Render.Interp = setup_tab[ind].interp; - if (ind & FFB_VB_TWOSIDE_BIT) - tnl->Driver.Render.CopyPV = ffb_copy_pv_twoside; - else - tnl->Driver.Render.CopyPV = ffb_copy_pv_oneside; -} - -void ffbInitVB( GLcontext *ctx ) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - GLuint size = TNL_CONTEXT(ctx)->vb.Size; - - fmesa->verts = (ffb_vertex *)_mesa_align_malloc(size * sizeof(ffb_vertex), 32); - - { - static int firsttime = 1; - if (firsttime) { - init_setup_tab(); - firsttime = 0; - } - } -} - - -void ffbFreeVB( GLcontext *ctx ) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - if (fmesa->verts) { - _mesa_align_free(fmesa->verts); - fmesa->verts = 0; - } -} diff --git a/src/mesa/drivers/dri/ffb/ffb_vb.h b/src/mesa/drivers/dri/ffb/ffb_vb.h deleted file mode 100644 index 238b9940bfa..00000000000 --- a/src/mesa/drivers/dri/ffb/ffb_vb.h +++ /dev/null @@ -1,44 +0,0 @@ - -#ifndef _FFB_VB_H -#define _FFB_VB_H - -#include "main/mtypes.h" -#include "main/macros.h" -#include "tnl/t_context.h" -#include "swrast/swrast.h" - -#define __FFB_2_30_FIXED_SCALE 1073741824.0f -#define FFB_2_30_FLOAT_TO_FIXED(X) \ - (IROUND((X) * fmesa->ffb_2_30_fixed_scale)) -#define FFB_2_30_FIXED_TO_FLOAT(X) \ - (((GLfloat)(X)) * fmesa->ffb_one_over_2_30_fixed_scale) - -#define __FFB_16_16_FIXED_SCALE 65536.0f -#define FFB_16_16_FLOAT_TO_FIXED(X) \ - (IROUND((X) * fmesa->ffb_16_16_fixed_scale)) -#define FFB_16_16_FIXED_TO_FLOAT(X) \ - (((GLfloat)(X)) * fmesa->ffb_one_over_16_16_fixed_scale) - -#define FFB_Z_FROM_FLOAT(VAL) FFB_2_30_FLOAT_TO_FIXED(VAL) -#define FFB_Z_TO_FLOAT(VAL) FFB_2_30_FIXED_TO_FLOAT(VAL) -#define FFB_XY_FROM_FLOAT(VAL) FFB_16_16_FLOAT_TO_FIXED(VAL) -#define FFB_XY_TO_FLOAT(VAL) FFB_16_16_FIXED_TO_FLOAT(VAL) - -#define FFB_UBYTE_FROM_COLOR(VAL) ((IROUND((VAL) * fmesa->ffb_ubyte_color_scale))) - -#define FFB_PACK_CONST_UBYTE_ARGB_COLOR(C) \ - ((FFB_UBYTE_FROM_COLOR(C.alpha) << 24) | \ - (FFB_UBYTE_FROM_COLOR(C.blue) << 16) | \ - (FFB_UBYTE_FROM_COLOR(C.green) << 8) | \ - (FFB_UBYTE_FROM_COLOR(C.red) << 0)) - -#define FFB_COLOR_FROM_FLOAT(VAL) FFB_2_30_FLOAT_TO_FIXED(VAL) - -#define _FFB_NEW_VERTEX (_DD_NEW_TRI_LIGHT_TWOSIDE) - -extern void ffbDDSetupInit(void); -extern void ffbChooseVertexState(GLcontext *); -extern void ffbInitVB( GLcontext *ctx ); -extern void ffbFreeVB( GLcontext *ctx ); - -#endif /* !(_FFB_VB_H) */ diff --git a/src/mesa/drivers/dri/ffb/ffb_vbtmp.h b/src/mesa/drivers/dri/ffb/ffb_vbtmp.h deleted file mode 100644 index c548ef3ad58..00000000000 --- a/src/mesa/drivers/dri/ffb/ffb_vbtmp.h +++ /dev/null @@ -1,150 +0,0 @@ - -static void TAG(emit)(GLcontext *ctx, GLuint start, GLuint end) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); -#if defined(VB_DEBUG) || (IND & (FFB_VB_XYZ_BIT | FFB_VB_RGBA_BIT)) - struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; -#endif -#if (IND & (FFB_VB_RGBA_BIT)) - GLfloat (*col0)[4]; - GLuint col0_stride; -#if (IND & (FFB_VB_TWOSIDE_BIT)) - GLfloat (*col1)[4]; - GLuint col1_stride; -#endif -#endif -#if (IND & FFB_VB_XYZ_BIT) - GLfloat (*proj)[4] = VB->NdcPtr->data; - GLuint proj_stride = VB->NdcPtr->stride; - const GLubyte *mask = VB->ClipMask; -#endif - ffb_vertex *v = &fmesa->verts[start]; - int i; - -#ifdef VB_DEBUG - fprintf(stderr, "FFB: ffb_emit [" -#if (IND & (FFB_VB_XYZ_BIT)) - " XYZ" -#endif -#if (IND & (FFB_VB_RGBA_BIT)) - " RGBA" -#endif -#if (IND & (FFB_VB_TWOSIDE_BIT)) - " TWOSIDE" -#endif - "] start(%d) end(%d) import(%d)\n", - start, end, - VB->importable_data); -#endif - -#if (IND & (FFB_VB_RGBA_BIT)) - col0 = VB->AttribPtr[_TNL_ATTRIB_COLOR0]->data; - col0_stride = VB->AttribPtr[_TNL_ATTRIB_COLOR0]->stride; -#if (IND & (FFB_VB_TWOSIDE_BIT)) - col1 = VB->BackfaceColorPtr->data; - col1_stride = VB->BackfaceColorPtr->stride; -#endif -#endif - - { - if (start) { -#if (IND & (FFB_VB_XYZ_BIT)) - proj = (GLfloat (*)[4])((GLubyte *)proj + start * proj_stride); -#endif -#if (IND & (FFB_VB_RGBA_BIT)) - col0 = (GLfloat (*)[4])((GLubyte *)col0 + start * col0_stride); -#if (IND & (FFB_VB_TWOSIDE_BIT)) - col1 = (GLfloat (*)[4])((GLubyte *)col1 + start * col1_stride); -#endif -#endif - } - for (i = start; i < end; i++, v++) { -#if (IND & (FFB_VB_XYZ_BIT)) - if (mask[i] == 0) { - v->x = proj[0][0]; - v->y = proj[0][1]; - v->z = proj[0][2]; - } - proj = (GLfloat (*)[4])((GLubyte *)proj + proj_stride); -#endif -#if (IND & (FFB_VB_RGBA_BIT)) - v->color[0].alpha = CLAMP(col0[0][3], 0.0f, 1.0f); - v->color[0].red = CLAMP(col0[0][0], 0.0f, 1.0f); - v->color[0].green = CLAMP(col0[0][1], 0.0f, 1.0f); - v->color[0].blue = CLAMP(col0[0][2], 0.0f, 1.0f); - col0 = (GLfloat (*)[4])((GLubyte *)col0 + col0_stride); -#if (IND & (FFB_VB_TWOSIDE_BIT)) - v->color[1].alpha = CLAMP(col1[0][3], 0.0f, 1.0f); - v->color[1].red = CLAMP(col1[0][0], 0.0f, 1.0f); - v->color[1].green = CLAMP(col1[0][1], 0.0f, 1.0f); - v->color[1].blue = CLAMP(col1[0][2], 0.0f, 1.0f); - col1 = (GLfloat (*)[4])((GLubyte *)col1 + col1_stride); -#endif -#endif - } - } -} - -static void TAG(interp)(GLcontext *ctx, GLfloat t, - GLuint edst, GLuint eout, GLuint ein, - GLboolean force_boundary) -{ -#if (IND & (FFB_VB_XYZ_BIT | FFB_VB_RGBA_BIT)) - ffbContextPtr fmesa = FFB_CONTEXT(ctx); -#endif -#if (IND & (FFB_VB_XYZ_BIT)) - struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; - const GLfloat *dstclip = VB->ClipPtr->data[edst]; - GLfloat oow = 1.0 / dstclip[3]; -#endif -#if (IND & (FFB_VB_XYZ_BIT | FFB_VB_RGBA_BIT)) - ffb_vertex *dst = &fmesa->verts[edst]; -#endif -#if (IND & (FFB_VB_RGBA_BIT)) - ffb_vertex *in = &fmesa->verts[eout]; - ffb_vertex *out = &fmesa->verts[ein]; -#endif - -#ifdef VB_DEBUG - fprintf(stderr, "FFB: ffb_interp [" -#if (IND & (FFB_VB_XYZ_BIT)) - " XYZ" -#endif -#if (IND & (FFB_VB_RGBA_BIT)) - " RGBA" -#endif -#if (IND & (FFB_VB_TWOSIDE_BIT)) - " TWOSIDE" -#endif - "] edst(%d) eout(%d) ein(%d)\n", - edst, eout, ein); -#endif - -#if (IND & (FFB_VB_XYZ_BIT)) - dst->x = dstclip[0] * oow; - dst->y = dstclip[1] * oow; - dst->z = dstclip[2] * oow; -#endif - -#if (IND & (FFB_VB_RGBA_BIT)) - INTERP_F(t, dst->color[0].alpha, out->color[0].alpha, in->color[0].alpha); - INTERP_F(t, dst->color[0].red, out->color[0].red, in->color[0].red); - INTERP_F(t, dst->color[0].green, out->color[0].green, in->color[0].green); - INTERP_F(t, dst->color[0].blue, out->color[0].blue, in->color[0].blue); -#if (IND & (FFB_VB_TWOSIDE_BIT)) - INTERP_F(t, dst->color[1].alpha, out->color[1].alpha, in->color[1].alpha); - INTERP_F(t, dst->color[1].red, out->color[1].red, in->color[1].red); - INTERP_F(t, dst->color[1].green, out->color[1].green, in->color[1].green); - INTERP_F(t, dst->color[1].blue, out->color[1].blue, in->color[1].blue); -#endif -#endif -} - -static void TAG(init)(void) -{ - setup_tab[IND].emit = TAG(emit); - setup_tab[IND].interp = TAG(interp); -} - -#undef IND -#undef TAG diff --git a/src/mesa/drivers/dri/ffb/ffb_vtxfmt.c b/src/mesa/drivers/dri/ffb/ffb_vtxfmt.c deleted file mode 100644 index 90f44b0e911..00000000000 --- a/src/mesa/drivers/dri/ffb/ffb_vtxfmt.c +++ /dev/null @@ -1,414 +0,0 @@ -/* - * - * GLX Hardware Device Driver for Sun Creator/Creator3D - * Copyright (C) 2001 David S. Miller - * - * 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 - * DAVID MILLER, OR ANY OTHER CONTRIBUTORS 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. - * - * - * David S. Miller <[email protected]> - */ - -#include "main/glheader.h" -#include "api_noop.h" -#include "main/context.h" -#include "light.h" -#include "main/macros.h" -#include "main/imports.h" -#include "main/mtypes.h" -#include "main/simple_list.h" -#include "vtxfmt.h" -#include "ffb_xmesa.h" -#include "ffb_context.h" -#include "ffb_vb.h" -#include "tnl/tnl.h" -#include "tnl/tcontext.h" - -#include "ffb_vtxfmt.h" - -#define TNL_VERTEX ffbTnlVertex - -#define INTERP_RGBA(t, out, a, b) \ -do { \ - GLint i; \ - for ( i = 0 ; i < 4 ; i++ ) { \ - GLfloat fa = a[i]; \ - GLfloat fb = b[i]; \ - out[i] = LINTERP( t, fa, fb ); \ - } \ -} while (0) - -/* Color functions: */ - -static INLINE void ffb_recalc_base_color(GLcontext *ctx) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - struct gl_light *light; - - COPY_3V(fmesa->vtx_state.light.base_color, ctx->Light._BaseColor[0]); - foreach (light, &ctx->Light.EnabledList) { - ACC_3V(fmesa->vtx_state.light.base_color, - light->_MatAmbient[0]); - } - - fmesa->vtx_state.light.base_alpha = ctx->Light._BaseAlpha[0]; -} - -#define GET_CURRENT \ - GET_CURRENT_CONTEXT(ctx); \ - ffbContextPtr fmesa = FFB_CONTEXT(ctx) - -#define CURRENT_COLOR(COMP) fmesa->vtx_state.current.color[COMP] -#define CURRENT_SPECULAR(COMP) fmesa->vtx_state.current.specular[COMP] -#define COLOR_IS_FLOAT -#define RECALC_BASE_COLOR(ctx) ffb_recalc_base_color(ctx) - -#define TAG(x) ffb_##x -#include "tnl_dd/t_dd_imm_capi.h" - -/* Normal functions: */ - -struct ffb_norm_tab { - void (*normal3f_multi)(GLfloat x, GLfloat y, GLfloat z); - void (*normal3fv_multi)(const GLfloat *v); - void (*normal3f_single)(GLfloat x, GLfloat y, GLfloat z); - void (*normal3fv_single)(const GLfloat *v); -}; - -static struct ffb_norm_tab norm_tab[0x4]; - -#define HAVE_HW_LIGHTING 0 -#define GET_CURRENT_VERTEX \ - GET_CURRENT_CONTEXT(ctx); \ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); \ - ffbTnlVertexPtr v = fmesa->imm.v0 - -#define CURRENT_NORMAL fmesa->vtx_state.current.normal -#define BASE_COLOR fmesa->vtx_state.light.base_color -#define BASE_ALPHA fmesa->vtx_state.light.base_alpha -#define VERT_COLOR( COMP ) v->color[COMP] -#define VERT_COLOR_IS_FLOAT - -#define IND (0) -#define TAG(x) ffb_##x -#define PRESERVE_NORMAL_DEFS -#include "tnl_dd/t_dd_imm_napi.h" - -#define IND (NORM_RESCALE) -#define TAG(x) ffb_##x##_rescale -#define PRESERVE_NORMAL_DEFS -#include "tnl_dd/t_dd_imm_napi.h" - -#define IND (NORM_NORMALIZE) -#define TAG(x) ffb_##x##_normalize -#include "tnl_dd/t_dd_imm_napi.h" - -static void ffb_init_norm_funcs(void) -{ - ffb_init_norm(); - ffb_init_norm_rescale(); - ffb_init_norm_normalize(); -} - -static void choose_normals(void) -{ - GET_CURRENT_CONTEXT(ctx); - GLuint index; - - if (ctx->Light.Enabled) { - if (ctx->Transform.Normalize) { - index = NORM_NORMALIZE; - } else if (!ctx->Transform.RescaleNormals && - ctx->_ModelViewInvScale != 1.0) { - index = NORM_RESCALE; - } else { - index = 0; - } - - if (ctx->Light.EnabledList.next == ctx->Light.EnabledList.prev) { - SET_Normal3f(ctx->Exec, norm_tab[index].normal3f_single); - SET_Normal3fv(ctx->Exec, norm_tab[index].normal3fv_single); - } else { - SET_Normal3f(ctx->Exec, norm_tab[index].normal3f_multi); - SET_Normal3fv(ctx->Exec, norm_tab[index].normal3fv_multi); - } - } else { - SET_Normal3f(ctx->Exec, _mesa_noop_Normal3f); - SET_Normal3fv(ctx->Exec, _mesa_noop_Normal3fv); - } -} - -static void ffb_choose_Normal3f(GLfloat x, GLfloat y, GLfloat z) -{ - choose_normals(); - CALL_Normal3f(GET_DISPATCH(), (x, y, z)); -} - -static void ffb_choose_Normal3fv(const GLfloat *v) -{ - choose_normals(); - CALL_Normal3fv(GET_DISPATCH(), (v)); -} - -/* Vertex functions: */ - -#define GET_CURRENT_VERTEX \ - GET_CURRENT_CONTEXT(ctx); \ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); \ - ffbTnlVertexPtr v = fmesa->imm.v0 - -#define CURRENT_VERTEX v->obj -#define SAVE_VERTEX fmesa->imm.save_vertex(ctx, v) - -#define TAG(x) ffb_##x -#include "tnl_dd/t_dd_imm_vapi.h" - -struct ffb_vert_tab { - void (*save_vertex)(GLcontext *ctx, ffbTnlVertexPtr v); - void (*interpolate_vertex)(GLfloat t, - ffbTnlVertex *O, - const ffbTnlVertex *I, - const ffbTnlVertex *J); -}; - -static struct ffb_vert_tab vert_tab[0xf]; - -#define VTX_NORMAL 0x0 -#define VTX_RGBA 0x1 - -#define LOCAL_VARS \ - ffbContextPtr fmesa = FFB_CONTEXT(ctx) - -#define CURRENT_COLOR fmesa->vtx_state.current.color -#define COLOR_IS_FLOAT -#define FLUSH_VERTEX fmesa->imm.flush_vertex( ctx, v ); - -#define IND (VTX_NORMAL) -#define TAG(x) ffb_##x##_NORMAL -#define PRESERVE_VERTEX_DEFS -#include "tnl_dd/t_dd_imm_vertex.h" - -#define IND (VTX_RGBA) -#define TAG(x) ffb_##x##_RGBA -#include "tnl_dd/t_dd_imm_vertex.h" - -static void ffb_init_vert_funcs( void ) -{ - ffb_init_vert_NORMAL(); - ffb_init_vert_RGBA(); -} - -#define LOCAL_VARS \ - ffbContextPtr fmesa = FFB_CONTEXT(ctx) - -#define GET_INTERP_FUNC \ - ffb_interp_func interp = fmesa->imm.interp - -#define FLUSH_VERTEX fmesa->imm.flush_vertex -#define IMM_VERTEX( V ) fmesa->imm.V -#define IMM_VERTICES( n ) fmesa->imm.vertices[n] - -#define EMIT_VERTEX_USES_HWREGS - -/* XXX Implement me XXX */ -#define EMIT_VERTEX_TRI(VTX0, VTX1, VTX2) \ - do { } while (0) -#define EMIT_VERTEX_LINE(VTX0, VTX1) \ - do { } while (0) -#define EMIT_VERTEX_POINT(VTX0) \ - do { } while (0) - -#define TAG(x) ffb_##x -#include "tnl_dd/t_dd_imm_primtmp.h" - -/* Bzzt: Material changes are lost on fallback. */ -static void ffb_Materialfv(GLenum face, GLenum pname, - const GLfloat *params) -{ - GET_CURRENT_CONTEXT(ctx); - - _mesa_noop_Materialfv( face, pname, params ); - ffb_recalc_base_color( ctx ); -} - -/* Fallback functions: */ - -static void ffb_do_fallback(GLcontext *ctx) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - struct ffb_current_state *current = &fmesa->vtx_state.current; - - /* Tell tnl to restore its exec vtxfmt, rehook its driver callbacks - * and revive internal state that depended on those callbacks: - */ - _tnl_wakeup_exec(ctx); - - /* Replay enough vertices that the current primitive is continued - * correctly: - */ - if (fmesa->imm.prim != PRIM_OUTSIDE_BEGIN_END ) - CALL_Begin(GET_DISPATCH(), (fmesa->imm.prim)); - - if (ctx->Light.Enabled) { - /* Catch ColorMaterial */ - CALL_Color4fv(GET_DISPATCH(), (ctx->Current.Color)); - CALL_Normal3fv(GET_DISPATCH(), (current->normal)); - } else { - CALL_Color4fv(GET_DISPATCH(), (current->color)); - } -} - -#define PRE_LOOPBACK( FUNC ) do { \ - GET_CURRENT_CONTEXT(ctx); \ - ffb_do_fallback( ctx ); \ -} while (0) - -#define TAG(x) ffb_fallback_##x -#include "vtxfmt_tmp.h" - -static void ffb_Begin(GLenum prim) -{ - GET_CURRENT_CONTEXT(ctx); - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - - if (prim > GL_POLYGON) { - _mesa_error( ctx, GL_INVALID_ENUM, "glBegin" ); - return; - } - - if (fmesa->imm.prim != PRIM_OUTSIDE_BEGIN_END) { - _mesa_error( ctx, GL_INVALID_OPERATION, "glBegin" ); - return; - } - - ctx->Driver.NeedFlush |= (FLUSH_STORED_VERTICES | - FLUSH_UPDATE_CURRENT); - - fmesa->imm.prim = prim; - fmesa->imm.v0 = &fmesa->imm.vertices[0]; - fmesa->imm.save_vertex = ffb_save_vertex_RGBA; - fmesa->imm.flush_vertex = ffb_flush_tab[prim]; - - /* XXX Lock hardware, update FBC, PPC, DRAWOP, etc. XXX */ -} - -static void ffb_End(void) -{ - GET_CURRENT_CONTEXT(ctx); - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - - if (fmesa->imm.prim == PRIM_OUTSIDE_BEGIN_END) { - _mesa_error( ctx, GL_INVALID_OPERATION, "glEnd" ); - return; - } - - fmesa->imm.prim = PRIM_OUTSIDE_BEGIN_END; - - ctx->Driver.NeedFlush &= ~(FLUSH_STORED_VERTICES | - FLUSH_UPDATE_CURRENT); - - /* XXX Unlock hardware, etc. */ -} - -void ffbInitTnlModule(GLcontext *ctx) -{ - ffbContextPtr fmesa = FFB_CONTEXT(ctx); - GLvertexformat *vfmt = &(fmesa->imm.vtxfmt); - - /* Work in progress... */ - return; - - ffb_init_norm_funcs(); - ffb_init_vert_funcs(); - - /* start by initializing to no-op functions */ - _mesa_noop_vtxfmt_init(vfmt); - - /* Handled fully in supported states: */ - vfmt->ArrayElement = NULL; /* FIXME: ... */ - vfmt->Color3f = ffb_choose_Color3f; - vfmt->Color3fv = ffb_choose_Color3fv; - vfmt->Color3ub = ffb_choose_Color3ub; - vfmt->Color3ubv = ffb_choose_Color3ubv; - vfmt->Color4f = ffb_choose_Color4f; - vfmt->Color4fv = ffb_choose_Color4fv; - vfmt->Color4ub = ffb_choose_Color4ub; - vfmt->Color4ubv = ffb_choose_Color4ubv; - vfmt->FogCoordfvEXT = ffb_FogCoordfvEXT; - vfmt->FogCoordfEXT = ffb_FogCoordfEXT; - vfmt->Materialfv = ffb_Materialfv; - vfmt->MultiTexCoord1fARB = ffb_fallback_MultiTexCoord1fARB; - vfmt->MultiTexCoord1fvARB = ffb_fallback_MultiTexCoord1fvARB; - vfmt->MultiTexCoord2fARB = ffb_fallback_MultiTexCoord2fARB; - vfmt->MultiTexCoord2fvARB = ffb_fallback_MultiTexCoord2fvARB; - vfmt->MultiTexCoord3fARB = ffb_fallback_MultiTexCoord3fARB; - vfmt->MultiTexCoord3fvARB = ffb_fallback_MultiTexCoord3fvARB; - vfmt->MultiTexCoord4fARB = ffb_fallback_MultiTexCoord4fARB; - vfmt->MultiTexCoord4fvARB = ffb_fallback_MultiTexCoord4fvARB; - vfmt->Normal3f = ffb_choose_Normal3f; - vfmt->Normal3fv = ffb_choose_Normal3fv; - vfmt->SecondaryColor3ubEXT = ffb_SecondaryColor3ubEXT; - vfmt->SecondaryColor3ubvEXT = ffb_SecondaryColor3ubvEXT; - vfmt->SecondaryColor3fEXT = ffb_SecondaryColor3fEXT; - vfmt->SecondaryColor3fvEXT = ffb_SecondaryColor3fvEXT; - vfmt->TexCoord1f = ffb_fallback_TexCoord1f; - vfmt->TexCoord1fv = ffb_fallback_TexCoord1fv; - vfmt->TexCoord2f = ffb_fallback_TexCoord2f; - vfmt->TexCoord2fv = ffb_fallback_TexCoord2fv; - vfmt->TexCoord3f = ffb_fallback_TexCoord3f; - vfmt->TexCoord3fv = ffb_fallback_TexCoord3fv; - vfmt->TexCoord4f = ffb_fallback_TexCoord4f; - vfmt->TexCoord4fv = ffb_fallback_TexCoord4fv; - - vfmt->Vertex2f = ffb_Vertex2f; - vfmt->Vertex2fv = ffb_Vertex2fv; - vfmt->Vertex3f = ffb_Vertex3f; - vfmt->Vertex3fv = ffb_Vertex3fv; - vfmt->Vertex4f = ffb_Vertex4f; - vfmt->Vertex4fv = ffb_Vertex4fv; - - vfmt->Begin = ffb_Begin; - vfmt->End = ffb_End; - - vfmt->DrawArrays = NULL; - vfmt->DrawElements = NULL; - - /* Active but unsupported -- fallback if we receive these: - * - * All of these fallbacks can be fixed with additional code, except - * CallList, unless we build a play_immediate_noop() command which - * turns an immediate back into glBegin/glEnd commands... - */ - vfmt->CallList = ffb_fallback_CallList; - vfmt->EvalCoord1f = ffb_fallback_EvalCoord1f; - vfmt->EvalCoord1fv = ffb_fallback_EvalCoord1fv; - vfmt->EvalCoord2f = ffb_fallback_EvalCoord2f; - vfmt->EvalCoord2fv = ffb_fallback_EvalCoord2fv; - vfmt->EvalMesh1 = ffb_fallback_EvalMesh1; - vfmt->EvalMesh2 = ffb_fallback_EvalMesh2; - vfmt->EvalPoint1 = ffb_fallback_EvalPoint1; - vfmt->EvalPoint2 = ffb_fallback_EvalPoint2; - - vfmt->prefer_float_colors = GL_TRUE; - - fmesa->imm.prim = PRIM_OUTSIDE_BEGIN_END; - - /* THIS IS A HACK! */ - _mesa_install_exec_vtxfmt( ctx, vfmt ); -} diff --git a/src/mesa/drivers/dri/ffb/ffb_vtxfmt.h b/src/mesa/drivers/dri/ffb/ffb_vtxfmt.h deleted file mode 100644 index 4d9125cd156..00000000000 --- a/src/mesa/drivers/dri/ffb/ffb_vtxfmt.h +++ /dev/null @@ -1,7 +0,0 @@ - -#ifndef _FFB_VTXFMT_H -#define _FFB_VTXFMT_H - -extern void ffbInitTnlModule(GLcontext *); - -#endif /* !(_FFB_VTXFMT_H) */ diff --git a/src/mesa/drivers/dri/ffb/ffb_xmesa.c b/src/mesa/drivers/dri/ffb/ffb_xmesa.c deleted file mode 100644 index bd1044a2bff..00000000000 --- a/src/mesa/drivers/dri/ffb/ffb_xmesa.c +++ /dev/null @@ -1,729 +0,0 @@ -/* - * - * GLX Hardware Device Driver for Sun Creator/Creator3D - * Copyright (C) 2000, 2001 David S. Miller - * - * 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 - * DAVID MILLER, OR ANY OTHER CONTRIBUTORS 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. - * - * - * David S. Miller <[email protected]> - */ - -#include "ffb_xmesa.h" -#include "main/context.h" -#include "main/framebuffer.h" -#include "main/renderbuffer.h" -#include "main/simple_list.h" -#include "main/imports.h" -#include "utils.h" - -#include "swrast/swrast.h" -#include "swrast_setup/swrast_setup.h" -#include "tnl/tnl.h" -#include "tnl/t_pipeline.h" -#include "vbo/vbo.h" -#include "drivers/common/driverfuncs.h" - -#include "ffb_context.h" -#include "ffb_dd.h" -#include "ffb_span.h" -#include "ffb_depth.h" -#include "ffb_stencil.h" -#include "ffb_clear.h" -#include "ffb_vb.h" -#include "ffb_tris.h" -#include "ffb_lines.h" -#include "ffb_points.h" -#include "ffb_state.h" -#include "ffb_lock.h" -#include "ffb_vtxfmt.h" -#include "ffb_bitmap.h" - -#include "drm_sarea.h" - -#include "drirenderbuffer.h" - -static GLboolean -ffbInitDriver(__DRIscreen *sPriv) -{ - ffbScreenPrivate *ffbScreen; - FFBDRIPtr gDRIPriv = (FFBDRIPtr) sPriv->pDevPriv; - drmAddress map; - - if (getenv("LIBGL_FORCE_XSERVER")) - return GL_FALSE; - - - if (sPriv->devPrivSize != sizeof(FFBDRIRec)) { - fprintf(stderr,"\nERROR! sizeof(FFBDRIRec) does not match passed size from device driver\n"); - return GL_FALSE; - } - - /* Allocate the private area. */ - ffbScreen = (ffbScreenPrivate *) MALLOC(sizeof(ffbScreenPrivate)); - if (!ffbScreen) - return GL_FALSE; - - /* Map FBC registers. */ - if (drmMap(sPriv->fd, - gDRIPriv->hFbcRegs, - gDRIPriv->sFbcRegs, - &map)) { - FREE(ffbScreen); - return GL_FALSE; - } - ffbScreen->regs = (ffb_fbcPtr) map; - - /* Map ramdac registers. */ - if (drmMap(sPriv->fd, - gDRIPriv->hDacRegs, - gDRIPriv->sDacRegs, - &map)) { - drmUnmap((drmAddress)ffbScreen->regs, gDRIPriv->sFbcRegs); - FREE(ffbScreen); - return GL_FALSE; - } - ffbScreen->dac = (ffb_dacPtr) map; - - /* Map "Smart" framebuffer views. */ - if (drmMap(sPriv->fd, - gDRIPriv->hSfb8r, - gDRIPriv->sSfb8r, - &map)) { - drmUnmap((drmAddress)ffbScreen->regs, gDRIPriv->sFbcRegs); - drmUnmap((drmAddress)ffbScreen->dac, gDRIPriv->sDacRegs); - FREE(ffbScreen); - return GL_FALSE; - } - ffbScreen->sfb8r = (volatile char *) map; - - if (drmMap(sPriv->fd, - gDRIPriv->hSfb32, - gDRIPriv->sSfb32, - &map)) { - drmUnmap((drmAddress)ffbScreen->regs, gDRIPriv->sFbcRegs); - drmUnmap((drmAddress)ffbScreen->dac, gDRIPriv->sDacRegs); - drmUnmap((drmAddress)ffbScreen->sfb8r, gDRIPriv->sSfb8r); - FREE(ffbScreen); - return GL_FALSE; - } - ffbScreen->sfb32 = (volatile char *) map; - - if (drmMap(sPriv->fd, - gDRIPriv->hSfb64, - gDRIPriv->sSfb64, - &map)) { - drmUnmap((drmAddress)ffbScreen->regs, gDRIPriv->sFbcRegs); - drmUnmap((drmAddress)ffbScreen->dac, gDRIPriv->sDacRegs); - drmUnmap((drmAddress)ffbScreen->sfb8r, gDRIPriv->sSfb8r); - drmUnmap((drmAddress)ffbScreen->sfb32, gDRIPriv->sSfb32); - FREE(ffbScreen); - return GL_FALSE; - } - ffbScreen->sfb64 = (volatile char *) map; - - ffbScreen->fifo_cache = 0; - ffbScreen->rp_active = 0; - - ffbScreen->sPriv = sPriv; - sPriv->private = (void *) ffbScreen; - - ffbDDLinefuncInit(); - ffbDDPointfuncInit(); - - return GL_TRUE; -} - - -static void -ffbDestroyScreen(__DRIscreen *sPriv) -{ - ffbScreenPrivate *ffbScreen = sPriv->private; - FFBDRIPtr gDRIPriv = (FFBDRIPtr) sPriv->pDevPriv; - - drmUnmap((drmAddress)ffbScreen->regs, gDRIPriv->sFbcRegs); - drmUnmap((drmAddress)ffbScreen->dac, gDRIPriv->sDacRegs); - drmUnmap((drmAddress)ffbScreen->sfb8r, gDRIPriv->sSfb8r); - drmUnmap((drmAddress)ffbScreen->sfb32, gDRIPriv->sSfb32); - drmUnmap((drmAddress)ffbScreen->sfb64, gDRIPriv->sSfb64); - - FREE(ffbScreen); -} - -static const struct tnl_pipeline_stage *ffb_pipeline[] = { - &_tnl_vertex_transform_stage, - &_tnl_normal_transform_stage, - &_tnl_lighting_stage, - /* REMOVE: fog coord stage */ - &_tnl_texgen_stage, - &_tnl_texture_transform_stage, - /* REMOVE: point attenuation stage */ - &_tnl_render_stage, - 0, -}; - -/* Create and initialize the Mesa and driver specific context data */ -static GLboolean -ffbCreateContext(const __GLcontextModes *mesaVis, - __DRIcontext *driContextPriv, - void *sharedContextPrivate) -{ - ffbContextPtr fmesa; - GLcontext *ctx, *shareCtx; - __DRIscreen *sPriv; - ffbScreenPrivate *ffbScreen; - char *debug; - struct dd_function_table functions; - - /* Allocate ffb context */ - fmesa = (ffbContextPtr) CALLOC(sizeof(ffbContextRec)); - if (!fmesa) - return GL_FALSE; - - _mesa_init_driver_functions(&functions); - - /* Allocate Mesa context */ - if (sharedContextPrivate) - shareCtx = ((ffbContextPtr) sharedContextPrivate)->glCtx; - else - shareCtx = NULL; - fmesa->glCtx = _mesa_create_context(mesaVis, shareCtx, - &functions, fmesa); - if (!fmesa->glCtx) { - FREE(fmesa); - return GL_FALSE; - } - driContextPriv->driverPrivate = fmesa; - ctx = fmesa->glCtx; - - sPriv = driContextPriv->driScreenPriv; - ffbScreen = (ffbScreenPrivate *) sPriv->private; - - /* Dri stuff. */ - fmesa->hHWContext = driContextPriv->hHWContext; - fmesa->driFd = sPriv->fd; - fmesa->driHwLock = &sPriv->pSAREA->lock; - - fmesa->ffbScreen = ffbScreen; - fmesa->driScreen = sPriv; - fmesa->ffb_sarea = FFB_DRISHARE(sPriv->pSAREA); - - /* Register and framebuffer pointers. */ - fmesa->regs = ffbScreen->regs; - fmesa->sfb32 = ffbScreen->sfb32; - - ffbDDInitContextHwState(ctx); - - /* Default clear and depth colors. */ - { - GLubyte r = (GLint) (ctx->Color.ClearColor[0] * 255.0F); - GLubyte g = (GLint) (ctx->Color.ClearColor[1] * 255.0F); - GLubyte b = (GLint) (ctx->Color.ClearColor[2] * 255.0F); - - fmesa->clear_pixel = ((r << 0) | - (g << 8) | - (b << 16)); - } - fmesa->clear_depth = Z_FROM_MESA(ctx->Depth.Clear * 4294967295.0f); - fmesa->clear_stencil = ctx->Stencil.Clear & 0xf; - - /* No wide points. */ - ctx->Const.MinPointSize = 1.0; - ctx->Const.MinPointSizeAA = 1.0; - ctx->Const.MaxPointSize = 1.0; - ctx->Const.MaxPointSizeAA = 1.0; - - /* Disable wide lines as we can't antialias them correctly in - * hardware. - */ - ctx->Const.MinLineWidth = 1.0; - ctx->Const.MinLineWidthAA = 1.0; - ctx->Const.MaxLineWidth = 1.0; - ctx->Const.MaxLineWidthAA = 1.0; - ctx->Const.LineWidthGranularity = 1.0; - - ctx->Const.MaxDrawBuffers = 1; - - /* Instead of having GCC emit these constants a zillion times - * everywhere in the driver, put them here. - */ - fmesa->ffb_2_30_fixed_scale = __FFB_2_30_FIXED_SCALE; - fmesa->ffb_one_over_2_30_fixed_scale = (1.0 / __FFB_2_30_FIXED_SCALE); - fmesa->ffb_16_16_fixed_scale = __FFB_16_16_FIXED_SCALE; - fmesa->ffb_one_over_16_16_fixed_scale = (1.0 / __FFB_16_16_FIXED_SCALE); - fmesa->ffb_ubyte_color_scale = 255.0f; - fmesa->ffb_zero = 0.0f; - - fmesa->debugFallbacks = GL_FALSE; - debug = getenv("LIBGL_DEBUG"); - if (debug && strstr(debug, "fallbacks")) - fmesa->debugFallbacks = GL_TRUE; - - /* Initialize the software rasterizer and helper modules. */ - _swrast_CreateContext( ctx ); - _vbo_CreateContext( ctx ); - _tnl_CreateContext( ctx ); - _swsetup_CreateContext( ctx ); - - /* All of this need only be done once for a new context. */ - /* XXX these should be moved right after the - * _mesa_init_driver_functions() call above. - */ - ffbDDExtensionsInit(ctx); - ffbDDInitDriverFuncs(ctx); - ffbDDInitStateFuncs(ctx); - ffbDDInitRenderFuncs(ctx); - /*ffbDDInitTexFuncs(ctx); not needed */ - ffbDDInitBitmapFuncs(ctx); - ffbInitVB(ctx); - -#if 0 - ffbInitTnlModule(ctx); -#endif - - _tnl_destroy_pipeline(ctx); - _tnl_install_pipeline(ctx, ffb_pipeline); - - return GL_TRUE; -} - -static void -ffbDestroyContext(__DRIcontext *driContextPriv) -{ - ffbContextPtr fmesa = (ffbContextPtr) driContextPriv->driverPrivate; - - if (fmesa) { - ffbFreeVB(fmesa->glCtx); - - _swsetup_DestroyContext( fmesa->glCtx ); - _tnl_DestroyContext( fmesa->glCtx ); - _vbo_DestroyContext( fmesa->glCtx ); - _swrast_DestroyContext( fmesa->glCtx ); - - /* free the Mesa context */ - fmesa->glCtx->DriverCtx = NULL; - _mesa_destroy_context(fmesa->glCtx); - - FREE(fmesa); - } -} - -/* Create and initialize the Mesa and driver specific pixmap buffer data */ -static GLboolean -ffbCreateBuffer(__DRIscreen *driScrnPriv, - __DRIdrawable *driDrawPriv, - const __GLcontextModes *mesaVis, - GLboolean isPixmap ) -{ - /* Mesa checks for pitch > 0, but ffb doesn't use pitches */ - int bogusPitch = 1; - int bpp = 4; /* we've always got a 32bpp framebuffer */ - int offset = 0; /* always at 0 for offset */ - - if (isPixmap) { - return GL_FALSE; /* not implemented */ - } else { - GLboolean swStencil = (mesaVis->stencilBits > 0 && - mesaVis->depthBits != 24); - struct gl_framebuffer *fb = _mesa_create_framebuffer(mesaVis); - - { - driRenderbuffer *frontRb - = driNewRenderbuffer(MESA_FORMAT_ARGB8888, NULL, bpp, offset, bogusPitch, - driDrawPriv); - ffbSetSpanFunctions(frontRb, mesaVis); - _mesa_add_renderbuffer(fb, BUFFER_FRONT_LEFT, &frontRb->Base); - } - - if (mesaVis->doubleBufferMode) { - driRenderbuffer *backRb - = driNewRenderbuffer(MESA_FORMAT_ARGB8888, NULL, bpp, offset, bogusPitch, - driDrawPriv); - ffbSetSpanFunctions(backRb, mesaVis); - _mesa_add_renderbuffer(fb, BUFFER_BACK_LEFT, &backRb->Base); - } - - if (mesaVis->depthBits == 16) { - driRenderbuffer *depthRb - = driNewRenderbuffer(MESA_FORMAT_Z16, NULL, bpp, offset, - bogusPitch, driDrawPriv); - ffbSetDepthFunctions(depthRb, mesaVis); - _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &depthRb->Base); - } - - if (mesaVis->stencilBits > 0 && !swStencil) { - driRenderbuffer *stencilRb - = driNewRenderbuffer(MESA_FORMAT_S8, NULL, bpp, offset, - bogusPitch, driDrawPriv); - ffbSetStencilFunctions(stencilRb, mesaVis); - _mesa_add_renderbuffer(fb, BUFFER_STENCIL, &stencilRb->Base); - } - - _mesa_add_soft_renderbuffers(fb, - GL_FALSE, /* color */ - GL_FALSE, /* depth */ - swStencil, - mesaVis->accumRedBits > 0, - GL_FALSE, /* alpha */ - GL_FALSE /* aux */); - driDrawPriv->driverPrivate = (void *) fb; - - return (driDrawPriv->driverPrivate != NULL); - } -} - - -static void -ffbDestroyBuffer(__DRIdrawable *driDrawPriv) -{ - _mesa_reference_framebuffer((GLframebuffer **)(&(driDrawPriv->driverPrivate)), NULL); -} - - -#define USE_FAST_SWAP - -static void -ffbSwapBuffers( __DRIdrawable *dPriv ) -{ - ffbContextPtr fmesa = (ffbContextPtr) dPriv->driContextPriv->driverPrivate; - unsigned int fbc, wid, wid_reg_val, dac_db_bit; - unsigned int shadow_dac_addr, active_dac_addr; - ffb_fbcPtr ffb; - ffb_dacPtr dac; - - if (fmesa == NULL || - fmesa->glCtx->Visual.doubleBufferMode == 0) - return; - - /* Flush pending rendering commands */ - _mesa_notifySwapBuffers(fmesa->glCtx); - - ffb = fmesa->regs; - dac = fmesa->ffbScreen->dac; - - fbc = fmesa->fbc; - wid = fmesa->wid; - - /* Swap the buffer we render into and read pixels from. */ - fmesa->back_buffer ^= 1; - - /* If we are writing into both buffers, don't mess with - * the WB setting. - */ - if ((fbc & FFB_FBC_WB_AB) != FFB_FBC_WB_AB) { - if ((fbc & FFB_FBC_WB_A) != 0) - fbc = (fbc & ~FFB_FBC_WB_A) | FFB_FBC_WB_B; - else - fbc = (fbc & ~FFB_FBC_WB_B) | FFB_FBC_WB_A; - } - - /* But either way, we must flip the read buffer setting. */ - if ((fbc & FFB_FBC_RB_A) != 0) - fbc = (fbc & ~FFB_FBC_RB_A) | FFB_FBC_RB_B; - else - fbc = (fbc & ~FFB_FBC_RB_B) | FFB_FBC_RB_A; - - LOCK_HARDWARE(fmesa); - - if (fmesa->fbc != fbc) { - FFBFifo(fmesa, 1); - ffb->fbc = fmesa->fbc = fbc; - fmesa->ffbScreen->rp_active = 1; - } - - /* And swap the buffer displayed in the WID. */ - if (fmesa->ffb_sarea->flags & FFB_DRI_PAC1) { - shadow_dac_addr = FFBDAC_PAC1_SPWLUT(wid); - active_dac_addr = FFBDAC_PAC1_APWLUT(wid); - dac_db_bit = FFBDAC_PAC1_WLUT_DB; - } else { - shadow_dac_addr = FFBDAC_PAC2_SPWLUT(wid); - active_dac_addr = FFBDAC_PAC2_APWLUT(wid); - dac_db_bit = FFBDAC_PAC2_WLUT_DB; - } - - FFBWait(fmesa, ffb); - - wid_reg_val = DACCFG_READ(dac, active_dac_addr); - if (fmesa->back_buffer == 0) - wid_reg_val |= dac_db_bit; - else - wid_reg_val &= ~dac_db_bit; -#ifdef USE_FAST_SWAP - DACCFG_WRITE(dac, active_dac_addr, wid_reg_val); -#else - DACCFG_WRITE(dac, shadow_dac_addr, wid_reg_val); - - /* Schedule the window transfer. */ - DACCFG_WRITE(dac, FFBDAC_CFG_WTCTRL, - (FFBDAC_CFG_WTCTRL_TCMD | FFBDAC_CFG_WTCTRL_TE)); - - { - int limit = 1000000; - while (limit--) { - unsigned int wtctrl = DACCFG_READ(dac, FFBDAC_CFG_WTCTRL); - - if ((wtctrl & FFBDAC_CFG_WTCTRL_DS) == 0) - break; - } - } -#endif - - UNLOCK_HARDWARE(fmesa); -} - -static void ffb_init_wid(ffbContextPtr fmesa, unsigned int wid) -{ - ffb_dacPtr dac = fmesa->ffbScreen->dac; - unsigned int wid_reg_val, dac_db_bit, active_dac_addr; - unsigned int shadow_dac_addr; - - if (fmesa->ffb_sarea->flags & FFB_DRI_PAC1) { - shadow_dac_addr = FFBDAC_PAC1_SPWLUT(wid); - active_dac_addr = FFBDAC_PAC1_APWLUT(wid); - dac_db_bit = FFBDAC_PAC1_WLUT_DB; - } else { - shadow_dac_addr = FFBDAC_PAC2_SPWLUT(wid); - active_dac_addr = FFBDAC_PAC2_APWLUT(wid); - dac_db_bit = FFBDAC_PAC2_WLUT_DB; - } - - wid_reg_val = DACCFG_READ(dac, active_dac_addr); - wid_reg_val &= ~dac_db_bit; -#ifdef USE_FAST_SWAP - DACCFG_WRITE(dac, active_dac_addr, wid_reg_val); -#else - DACCFG_WRITE(dac, shadow_dac_addr, wid_reg_val); - - /* Schedule the window transfer. */ - DACCFG_WRITE(dac, FFBDAC_CFG_WTCTRL, - (FFBDAC_CFG_WTCTRL_TCMD | FFBDAC_CFG_WTCTRL_TE)); - - { - int limit = 1000000; - while (limit--) { - unsigned int wtctrl = DACCFG_READ(dac, FFBDAC_CFG_WTCTRL); - - if ((wtctrl & FFBDAC_CFG_WTCTRL_DS) == 0) - break; - } - } -#endif -} - -/* Force the context `c' to be the current context and associate with it - buffer `b' */ -static GLboolean -ffbMakeCurrent(__DRIcontext *driContextPriv, - __DRIdrawable *driDrawPriv, - __DRIdrawable *driReadPriv) -{ - if (driContextPriv) { - ffbContextPtr fmesa = (ffbContextPtr) driContextPriv->driverPrivate; - int first_time; - - fmesa->driDrawable = driDrawPriv; - - _mesa_make_current(fmesa->glCtx, - (GLframebuffer *) driDrawPriv->driverPrivate, - (GLframebuffer *) driReadPriv->driverPrivate); - - first_time = 0; - if (fmesa->wid == ~0) { - first_time = 1; - if (getenv("LIBGL_SOFTWARE_RENDERING")) - FALLBACK( fmesa->glCtx, FFB_BADATTR_SWONLY, GL_TRUE ); - } - - LOCK_HARDWARE(fmesa); - if (first_time) { - fmesa->wid = fmesa->ffb_sarea->wid_table[driDrawPriv->index]; - ffb_init_wid(fmesa, fmesa->wid); - } - - fmesa->state_dirty |= FFB_STATE_ALL; - fmesa->state_fifo_ents = fmesa->state_all_fifo_ents; - ffbSyncHardware(fmesa); - UNLOCK_HARDWARE(fmesa); - - if (first_time) { - /* Also, at the first switch to a new context, - * we need to clear all the hw buffers. - */ - ffbDDClear(fmesa->glCtx, - (BUFFER_BIT_FRONT_LEFT | BUFFER_BIT_BACK_LEFT | - BUFFER_BIT_DEPTH | BUFFER_BIT_STENCIL)); - } - } else { - _mesa_make_current(NULL, NULL, NULL); - } - - return GL_TRUE; -} - -/* Force the context `c' to be unbound from its buffer */ -static GLboolean -ffbUnbindContext(__DRIcontext *driContextPriv) -{ - return GL_TRUE; -} - -void ffbXMesaUpdateState(ffbContextPtr fmesa) -{ - __DRIdrawable *dPriv = fmesa->driDrawable; - __DRIscreen *sPriv = fmesa->driScreen; - int stamp = dPriv->lastStamp; - - DRI_VALIDATE_DRAWABLE_INFO(sPriv, dPriv); - - if (dPriv->lastStamp != stamp) { - GLcontext *ctx = fmesa->glCtx; - - ffbCalcViewport(ctx); - driUpdateFramebufferSize(ctx, dPriv); - if (ctx->Polygon.StippleFlag) { - ffbXformAreaPattern(fmesa, - (const GLubyte *)ctx->PolygonStipple); - } - } -} - -static const __DRIconfig ** -ffbFillInModes( __DRIscreen *psp, - unsigned pixel_bits, unsigned depth_bits, - unsigned stencil_bits, GLboolean have_back_buffer ) -{ - __DRIconfig **configs; - __GLcontextModes *m; - unsigned depth_buffer_factor; - unsigned back_buffer_factor; - GLenum fb_format; - GLenum fb_type; - int i; - - /* GLX_SWAP_COPY_OML is only supported because the FFB driver doesn't - * support pageflipping at all. - */ - static const GLenum back_buffer_modes[] = { - GLX_NONE, GLX_SWAP_UNDEFINED_OML, GLX_SWAP_COPY_OML - }; - - uint8_t depth_bits_array[3]; - uint8_t stencil_bits_array[3]; - uint8_t msaa_samples_array[1]; - - depth_bits_array[0] = 0; - depth_bits_array[1] = depth_bits; - depth_bits_array[2] = depth_bits; - - /* Just like with the accumulation buffer, always provide some modes - * with a stencil buffer. It will be a sw fallback, but some apps won't - * care about that. - */ - stencil_bits_array[0] = 0; - stencil_bits_array[1] = 0; - stencil_bits_array[2] = (stencil_bits == 0) ? 8 : stencil_bits; - - msaa_samples_array[0] = 0; - - depth_buffer_factor = ((depth_bits != 0) || (stencil_bits != 0)) ? 3 : 1; - back_buffer_factor = (have_back_buffer) ? 3 : 1; - - if ( pixel_bits == 16 ) { - fb_format = GL_RGB; - fb_type = GL_UNSIGNED_SHORT_5_6_5; - } - else { - fb_format = GL_BGRA; - fb_type = GL_UNSIGNED_INT_8_8_8_8_REV; - } - - configs = driCreateConfigs(fb_format, fb_type, - depth_bits_array, stencil_bits_array, - depth_buffer_factor, back_buffer_modes, - back_buffer_factor, - msaa_samples_array, 1, GL_TRUE); - if (configs == NULL) { - fprintf(stderr, "[%s:%u] Error creating FBConfig!\n", __func__, - __LINE__); - return NULL; - } - - /* Mark the visual as slow if there are "fake" stencil bits. - */ - for (i = 0; configs[i]; i++) { - m = &configs[i]->modes; - if ((m->stencilBits != 0) && (m->stencilBits != stencil_bits)) { - m->visualRating = GLX_SLOW_CONFIG; - } - } - - return (const __DRIconfig **) configs; -} - - -/** - * This is the driver specific part of the createNewScreen entry point. - * - * \todo maybe fold this into intelInitDriver - * - * \return the __GLcontextModes supported by this driver - */ -static const __DRIconfig ** -ffbInitScreen(__DRIscreen *psp) -{ - static const __DRIversion ddx_expected = { 0, 1, 1 }; - static const __DRIversion dri_expected = { 4, 0, 0 }; - static const __DRIversion drm_expected = { 0, 0, 1 }; - - if ( ! driCheckDriDdxDrmVersions2( "ffb", - &psp->dri_version, & dri_expected, - &psp->ddx_version, & ddx_expected, - &psp->drm_version, & drm_expected ) ) - return NULL; - - if (!ffbInitDriver(psp)) - return NULL; - - return ffbFillInModes( psp, 32, 16, 0, GL_TRUE ); -} - -const struct __DriverAPIRec driDriverAPI = { - .InitScreen = ffbInitScreen, - .DestroyScreen = ffbDestroyScreen, - .CreateContext = ffbCreateContext, - .DestroyContext = ffbDestroyContext, - .CreateBuffer = ffbCreateBuffer, - .DestroyBuffer = ffbDestroyBuffer, - .SwapBuffers = ffbSwapBuffers, - .MakeCurrent = ffbMakeCurrent, - .UnbindContext = ffbUnbindContext, - .GetSwapInfo = NULL, - .GetDrawableMSC = NULL, - .WaitForMSC = NULL, - .WaitForSBC = NULL, - .SwapBuffersMSC = NULL -}; - -/* This is the table of extensions that the loader will dlsym() for. */ -PUBLIC const __DRIextension *__driDriverExtensions[] = { - &driCoreExtension.base, - &driLegacyExtension.base, - NULL -}; diff --git a/src/mesa/drivers/dri/ffb/ffb_xmesa.h b/src/mesa/drivers/dri/ffb/ffb_xmesa.h deleted file mode 100644 index 2b1740d2219..00000000000 --- a/src/mesa/drivers/dri/ffb/ffb_xmesa.h +++ /dev/null @@ -1,25 +0,0 @@ - -#ifndef _FFB_XMESA_H_ -#define _FFB_XMESA_H_ - -#include <sys/time.h> -#include "dri_util.h" -#include "main/mtypes.h" -#include "ffb_drishare.h" -#include "ffb_regs.h" -#include "ffb_dac.h" -#include "ffb_fifo.h" - -typedef struct { - __DRIscreen *sPriv; - ffb_fbcPtr regs; - ffb_dacPtr dac; - volatile char *sfb8r; - volatile char *sfb32; - volatile char *sfb64; - - int fifo_cache; - int rp_active; -} ffbScreenPrivate; - -#endif /* !(_FFB_XMESA_H) */ diff --git a/src/mesa/drivers/dri/ffb/server/ffb_dac.h b/src/mesa/drivers/dri/ffb/server/ffb_dac.h deleted file mode 100644 index ac4a75b4598..00000000000 --- a/src/mesa/drivers/dri/ffb/server/ffb_dac.h +++ /dev/null @@ -1,366 +0,0 @@ -/* - * Acceleration for the Creator and Creator3D framebuffer - DAC register layout. - * - * Copyright (C) 2000 David S. Miller ([email protected]) - * - * 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 - * DAVID MILLER 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. - * - */ - -#ifndef _FFB_DAC_H -#define _FFB_DAC_H - -#define Bool int - -/* FFB utilizes two different ramdac chips: - * - * 1) BT9068 "Pacifica1", used in all FFB1 and - * FFB2 boards. - * - * 2) BT498(a) "Pacifica2", used in FFB2+ and - * AFB boards. - * - * They are mostly equivalent, except in a few key areas: - * - * 1) WID register layout - * 2) Number of CLUT tables - * 3) Presence of Window Address Mask register - * 4) Method of GAMMA correction support - */ - -/* NOTE: All addresses described in this file are DAC - * indirect addresses. - */ - -/* DAC color values are in the following format. */ -#define FFBDAC_COLOR_BLUE 0x00ff0000 -#define FFBDAC_COLOR_BLUE_SHFT 16 -#define FFBDAC_COLOR_GREEN 0x0000ff00 -#define FFBDAC_COLOR_GREEN_SHFT 8 -#define FFBDAC_COLOR_RED 0x000000ff -#define FFBDAC_COLOR_RED_SHFT 0 - -/* Cursor DAC register addresses. */ -#define FFBDAC_CUR_BITMAP_P0 0x000 /* Plane 0 cursor bitmap */ -#define FFBDAC_CUR_BITMAP_P1 0x080 /* Plane 1 cursor bitmap */ -#define FFBDAC_CUR_CTRL 0x100 /* Cursor control */ -#define FFBDAC_CUR_COLOR0 0x101 /* Cursor Color 0 */ -#define FFBDAC_CUR_COLOR1 0x102 /* Cursor Color 1 (bg) */ -#define FFBDAC_CUR_COLOR2 0x103 /* Cursor Color 2 (fg) */ -#define FFBDAC_CUR_POS 0x104 /* Active cursor position */ - -/* Cursor control register. - * WARNING: Be careful, reverse logic on these bits. - */ -#define FFBDAC_CUR_CTRL_P0 0x00000001 /* Plane0 display disable */ -#define FFBDAC_CUR_CTRL_P1 0x00000002 /* Plane1 display disable */ - -/* Active cursor position register */ -#define FFBDAC_CUR_POS_Y_SIGN 0x80000000 /* Sign of Y position */ -#define FFBDAC_CUR_POS_Y 0x0fff0000 /* Y position */ -#define FFBDAC_CUR_POS_X_SIGN 0x00008000 /* Sign of X position */ -#define FFBDAC_CUR_POS_X 0x00000fff /* X position */ - -/* Configuration and Palette DAC register addresses. */ -#define FFBDAC_CFG_PPLLCTRL 0x0000 /* Pixel PLL Control */ -#define FFBDAC_CFG_GPLLCTRL 0x0001 /* General Purpose PLL Control */ -#define FFBDAC_CFG_PFCTRL 0x1000 /* Pixel Format Control */ -#define FFBDAC_CFG_UCTRL 0x1001 /* User Control */ -#define FFBDAC_CFG_CLUP_BASE 0x2000 /* Color Lookup Palette */ -#define FFBDAC_CFG_CLUP(entry) (FFBDAC_CFG_CLUP_BASE + ((entry) * 0x100)) -#define FFBDAC_PAC2_SOVWLUT0 0x3100 /* Shadow Overlay Window Lookup 0*/ -#define FFBDAC_PAC2_SOVWLUT1 0x3101 /* Shadow Overlay Window Lookup 1*/ -#define FFBDAC_PAC2_SOVWLUT2 0x3102 /* Shadow Overlay Window Lookup 2*/ -#define FFBDAC_PAC2_SOVWLUT3 0x3103 /* Shadow Overlay Window Lookup 3*/ -#define FFBDAC_PAC2_AOVWLUT0 0x3210 /* Active Overlay Window Lookup 0*/ -#define FFBDAC_PAC2_AOVWLUT1 0x3211 /* Active Overlay Window Lookup 1*/ -#define FFBDAC_PAC2_AOVWLUT2 0x3212 /* Active Overlay Window Lookup 2*/ -#define FFBDAC_PAC2_AOVWLUT3 0x3213 /* Active Overlay Window Lookup 3*/ -#define FFBDAC_CFG_WTCTRL 0x3150 /* Window Transfer Control */ -#define FFBDAC_CFG_TMCTRL 0x3151 /* Transparent Mask Control */ -#define FFBDAC_CFG_TCOLORKEY 0x3152 /* Transparent Color Key */ -#define FFBDAC_CFG_WAMASK 0x3153 /* Window Address Mask (PAC2 only) */ -#define FFBDAC_PAC1_SPWLUT_BASE 0x3100 /* Shadow Primary Window Lookups */ -#define FFBDAC_PAC1_SPWLUT(entry) (FFBDAC_PAC1_SPWLUT_BASE + (entry)) -#define FFBDAC_PAC1_APWLUT_BASE 0x3120 /* Active Primary Window Lookups */ -#define FFBDAC_PAC1_APWLUT(entry) (FFBDAC_PAC1_APWLUT_BASE + (entry)) -#define FFBDAC_PAC2_SPWLUT_BASE 0x3200 /* Shadow Primary Window Lookups */ -#define FFBDAC_PAC2_SPWLUT(entry) (FFBDAC_PAC2_SPWLUT_BASE + (entry)) -#define FFBDAC_PAC2_APWLUT_BASE 0x3240 /* Active Primary Window Lookups */ -#define FFBDAC_PAC2_APWLUT(entry) (FFBDAC_PAC2_APWLUT_BASE + (entry)) -#define FFBDAC_CFG_SANAL 0x5000 /* Signature Analysis Control */ -#define FFBDAC_CFG_DACCTRL 0x5001 /* DAC Control */ -#define FFBDAC_CFG_TGEN 0x6000 /* Timing Generator Control */ -#define FFBDAC_CFG_VBNP 0x6001 /* Vertical Blank Negation Point */ -#define FFBDAC_CFG_VBAP 0x6002 /* Vertical Blank Assertion Point*/ -#define FFBDAC_CFG_VSNP 0x6003 /* Vertical Sync Negation Point */ -#define FFBDAC_CFG_VSAP 0x6004 /* Vertical Sync Assertion Point */ -#define FFBDAC_CFG_HSNP 0x6005 /* Horz Serration Negation Point */ -#define FFBDAC_CFG_HBNP 0x6006 /* Horz Blank Negation Point */ -#define FFBDAC_CFG_HBAP 0x6007 /* Horz Blank Assertion Point */ -#define FFBDAC_CFG_HSYNCNP 0x6008 /* Horz Sync Negation Point */ -#define FFBDAC_CFG_HSYNCAP 0x6009 /* Horz Sync Assertion Point */ -#define FFBDAC_CFG_HSCENNP 0x600A /* Horz SCEN Negation Point */ -#define FFBDAC_CFG_HSCENAP 0x600B /* Horz SCEN Assertion Point */ -#define FFBDAC_CFG_EPNP 0x600C /* Eql'zing Pulse Negation Point */ -#define FFBDAC_CFG_EINP 0x600D /* Eql'zing Intvl Negation Point */ -#define FFBDAC_CFG_EIAP 0x600E /* Eql'zing Intvl Assertion Point*/ -#define FFBDAC_CFG_TGVC 0x600F /* Timing Generator Vert Counter */ -#define FFBDAC_CFG_TGHC 0x6010 /* Timing Generator Horz Counter */ -#define FFBDAC_CFG_DID 0x8000 /* Device Identification */ -#define FFBDAC_CFG_MPDATA 0x8001 /* Monitor Port Data */ -#define FFBDAC_CFG_MPSENSE 0x8002 /* Monitor Port Sense */ - -/* Pixel PLL Control Register */ -#define FFBDAC_CFG_PPLLCTRL_M 0x0000007f /* PLL VCO Multiplicand */ -#define FFBDAC_CFG_PPLLCTRL_D 0x00000780 /* PLL VCO Divisor */ -#define FFBDAC_CFG_PPLLCTRL_PFD 0x00001800 /* Post VCO Frequency Divider */ -#define FFBDAC_CFG_PPLLCTRL_EN 0x00004000 /* Enable PLL as pixel clock src */ - -/* General Purpose PLL Control Register */ -#define FFBDAC_CFG_GPLLCTRL_M 0x0000007f /* PLL VCO Multiplicand */ -#define FFBDAC_CFG_GPLLCTRL_D 0x00000780 /* PLL VCO Divisor */ -#define FFBDAC_CFG_GPLLCTRL_PFD 0x00001800 /* Post VCO Frequency Divider */ -#define FFBDAC_CFG_GPLLCTRL_EN 0x00004000 /* Enable PLL as Gen. Purpose clk*/ - -/* Pixel Format Control Register */ -#define FFBDAC_CFG_PFCTRL_2_1 0x00000000 /* 2:1 pixel interleave format */ -#define FFBDAC_CFG_PFCTRL_4_1 0x00000001 /* 4:1 pixel interleave format */ -#define FFBDAC_CFG_PFCTRL_42_1 0x00000002 /* 4/2:1 pixel interleave format */ -#define FFBDAC_CFG_PFCTRL_82_1 0x00000003 /* 8/2:1 pixel interleave format */ - -/* User Control Register */ -#define FFBDAC_UCTRL_IPDISAB 0x00000001 /* Disable input pullup resistors*/ -#define FFBDAC_UCTRL_ABLANK 0x00000002 /* Asynchronous Blank */ -#define FFBDAC_UCTRL_DBENAB 0x00000004 /* Double-Buffer Enable */ -#define FFBDAC_UCTRL_OVENAB 0x00000008 /* Overlay Enable */ -#define FFBDAC_UCTRL_WMODE 0x00000030 /* Window Mode */ -#define FFBDAC_UCTRL_WM_COMB 0x00000000 /* Window Mode = Combined */ -#define FFBDAC_UCTRL_WM_S4 0x00000010 /* Window Mode = Seperate_4 */ -#define FFBDAC_UCTRL_WM_S8 0x00000020 /* Window Mode = Seperate_8 */ -#define FFBDAC_UCTRL_WM_RESV 0x00000030 /* Window Mode = reserved */ -#define FFBDAC_UCTRL_MANREV 0x00000f00 /* 4-bit Manufacturing Revision */ - -/* Overlay Window Lookup Registers (PAC2 only) */ -#define FFBDAC_CFG_OVWLUT_PSEL 0x0000000f /* Palette Section, Seperate_4 */ -#define FFBDAC_CFG_OVWLUT_PTBL 0x00000030 /* Palette Table */ -#define FFBDAC_CFG_OVWLUT_LKUP 0x00000100 /* 1 = Use palette, 0 = Bypass */ -#define FFBDAC_CFG_OVWLUT_OTYP 0x00000c00 /* Overlay Type */ -#define FFBDAC_CFG_OVWLUT_O_N 0x00000000 /* Overlay Type - None */ -#define FFBDAC_CFG_OVWLUT_O_T 0x00000400 /* Overlay Type - Transparent */ -#define FFBDAC_CFG_OVWLUT_O_O 0x00000800 /* Overlay Type - Opaque */ -#define FFBDAC_CFG_OVWLUT_O_R 0x00000c00 /* Overlay Type - Reserved */ -#define FFBDAC_CFG_OVWLUT_PCS 0x00003000 /* Psuedocolor Src */ -#define FFBDAC_CFG_OVWLUT_P_XO 0x00000000 /* Psuedocolor Src - XO[7:0] */ -#define FFBDAC_CFG_OVWLUT_P_R 0x00001000 /* Psuedocolor Src - R[7:0] */ -#define FFBDAC_CFG_OVWLUT_P_G 0x00002000 /* Psuedocolor Src - G[7:0] */ -#define FFBDAC_CFG_OVWLUT_P_B 0x00003000 /* Psuedocolor Src - B[7:0] */ - -/* Window Transfer Control Register */ -#define FFBDAC_CFG_WTCTRL_DS 0x00000001 /* Device Status, 1 = Busy */ -#define FFBDAC_CFG_WTCTRL_TCMD 0x00000002 /* Transfer Command - * 1 = Transfer, 0 = No Action - */ -#define FFBDAC_CFG_WTCTRL_TE 0x00000004 /* Transfer Event - * 1 = Next Frame, 0 = Next Field - */ -#define FFBDAC_CFG_WTCTRL_DRD 0x00000008 /* Drawing Data - * 1 = Local Drawing Active - * 0 = Local Drawing Idle - */ -#define FFBDAC_CFG_WTCTRL_DRS 0x00000010 /* Drawing Status - * 1 = Network Drawing Active - * 0 = Network Drawing Idle - */ - -/* Transparent Mask Control Register */ -#define FFBDAC_CFG_TMCTRL_OMSK 0x000000ff /* Overlay Mask */ - -/* Transparent Color Key Register */ -#define FFBDAC_CFG_TCOLORKEY_K 0x000000ff /* Overlay Color Key */ - -/* Window Address Mask Register (PAC2 only) */ -#define FFBDAC_CFG_WAMASK_PMSK 0x0000003f /* PWLUT select PMASK */ -#define FFBDAC_CFG_WAMASK_OMSK 0x00000300 /* OWLUT control OMASK */ - -/* (non-Overlay) Window Lookup Table Registers, PAC1 format */ -#define FFBDAC_PAC1_WLUT_DB 0x00000020 /* 0 = Buffer A, 1 = Buffer B */ -#define FFBDAC_PAC1_WLUT_C 0x0000001c /* C: Color Model Selection */ -#define FFBDAC_PAC1_WLUT_C_8P 0x00000000 /* C: 8bpp Pseudocolor */ -#define FFBDAC_PAC1_WLUT_C_8LG 0x00000004 /* C: 8bpp Linear Grey */ -#define FFBDAC_PAC1_WLUT_C_8NG 0x00000008 /* C: 8bpp Non-Linear Grey */ -#define FFBDAC_PAC1_WLUT_C_24D 0x00000010 /* C: 24bpp Directcolor */ -#define FFBDAC_PAC1_WLUT_C_24LT 0x00000014 /* C: 24bpp Linear Truecolor */ -#define FFBDAC_PAC1_WLUT_C_24NT 0x00000018 /* C: 24bpp Non-Linear Truecolor */ -#define FFBDAC_PAC1_WLUT_PCS 0x00000003 /* Pseudocolor Src */ -#define FFBDAC_PAC1_WLUT_P_XO 0x00000000 /* Pseudocolor Src - XO[7:0] */ -#define FFBDAC_PAC1_WLUT_P_R 0x00000001 /* Pseudocolor Src - R[7:0] */ -#define FFBDAC_PAC1_WLUT_P_G 0x00000002 /* Pseudocolor Src - G[7:0] */ -#define FFBDAC_PAC1_WLUT_P_B 0x00000003 /* Pseudocolor Src - B[7:0] */ - -/* (non-Overlay) Window Lookup Table Registers, PAC2 format */ -#define FFBDAC_PAC2_WLUT_PTBL 0x00000030 /* Palette Table Entry */ -#define FFBDAC_PAC2_WLUT_LKUP 0x00000100 /* 1 = Use palette, 0 = Bypass */ -#define FFBDAC_PAC2_WLUT_PCS 0x00003000 /* Pseudocolor Src */ -#define FFBDAC_PAC2_WLUT_P_XO 0x00000000 /* Pseudocolor Src - XO[7:0] */ -#define FFBDAC_PAC2_WLUT_P_R 0x00001000 /* Pseudocolor Src - R[7:0] */ -#define FFBDAC_PAC2_WLUT_P_G 0x00002000 /* Pseudocolor Src - G[7:0] */ -#define FFBDAC_PAC2_WLUT_P_B 0x00003000 /* Pseudocolor Src - B[7:0] */ -#define FFBDAC_PAC2_WLUT_DEPTH 0x00004000 /* 0 = Pseudocolor, 1 = Truecolor*/ -#define FFBDAC_PAC2_WLUT_DB 0x00008000 /* 0 = Buffer A, 1 = Buffer B */ - -/* Signature Analysis Control Register */ -#define FFBDAC_CFG_SANAL_SRR 0x000000ff /* DAC Seed/Result for Red */ -#define FFBDAC_CFG_SANAL_SRG 0x0000ff00 /* DAC Seed/Result for Green */ -#define FFBDAC_CFG_SANAL_SRB 0x00ff0000 /* DAC Seed/Result for Blue */ -#define FFBDAC_CFG_SANAL_RQST 0x01000000 /* Signature Capture Request */ -#define FFBDAC_CFG_SANAL_BSY 0x02000000 /* Signature Analysis Busy */ -#define FFBDAC_CFG_SANAL_DSM 0x04000000 /* Data Strobe Mode - * 0 = Signature Analysis Mode - * 1 = Data Strobe Mode - */ - -/* DAC Control Register */ -#define FFBDAC_CFG_DACCTRL_O2 0x00000003 /* Operand 2 Select - * 00 = Normal Operation - * 01 = Select 145mv Reference - * 10 = Select Blue DAC Output - * 11 = Reserved - */ -#define FFBDAC_CFG_DACCTRL_O1 0x0000000c /* Operand 1 Select - * 00 = Normal Operation - * 01 = Select Green DAC Output - * 10 = Select Red DAC Output - * 11 = Reserved - */ -#define FFBDAC_CFG_DACCTRL_CR 0x00000010 /* Comparator Result - * 0 = operand1 < operand2 - * 1 = operand1 > operand2 - */ -#define FFBDAC_CFG_DACCTRL_SGE 0x00000020 /* Sync-on-Green Enable */ -#define FFBDAC_CFG_DACCTRL_PE 0x00000040 /* Pedestal Enable */ -#define FFBDAC_CFG_DACCTRL_VPD 0x00000080 /* VSYNC* Pin Disable */ -#define FFBDAC_CFG_DACCTRL_SPB 0x00000100 /* Sync Polarity Bit - * 0 = VSYNC* and CSYNC* active low - * 1 = VSYNC* and CSYNC* active high - */ - -/* Timing Generator Control Register */ -#define FFBDAC_CFG_TGEN_VIDE 0x00000001 /* Video Enable */ -#define FFBDAC_CFG_TGEN_TGE 0x00000002 /* Timing Generator Enable */ -#define FFBDAC_CFG_TGEN_HSD 0x00000004 /* HSYNC* Disabled */ -#define FFBDAC_CFG_TGEN_VSD 0x00000008 /* VSYNC* Disabled */ -#define FFBDAC_CFG_TGEN_EQD 0x00000010 /* Equalization Disabled */ -#define FFBDAC_CFG_TGEN_MM 0x00000020 /* 0 = Slave, 1 = Master */ -#define FFBDAC_CFG_TGEN_IM 0x00000040 /* 1 = Interlaced Mode */ - -/* Device Identification Register, should be 0xA236E1AD for FFB bt497/bt498 */ -#define FFBDAC_CFG_DID_ONE 0x00000001 /* Always set */ -#define FFBDAC_CFG_DID_MANUF 0x00000ffe /* Manufacturer ID */ -#define FFBDAC_CFG_DID_PNUM 0x0ffff000 /* Device Part Number */ -#define FFBDAC_CFG_DID_REV 0xf0000000 /* Device Revision */ - -/* Monitor Port Data Register */ -#define FFBDAC_CFG_MPDATA_SCL 0x00000001 /* SCL Data */ -#define FFBDAC_CFG_MPDATA_SDA 0x00000002 /* SDA Data */ - -/* Monitor Port Sense Register */ -#define FFBDAC_CFG_MPSENSE_SCL 0x00000001 /* SCL Sense */ -#define FFBDAC_CFG_MPSENSE_SDA 0x00000002 /* SDA Sense */ - -/* DAC register access shorthands. */ -#define DACCUR_READ(DAC, ADDR) ((DAC)->cur = (ADDR), (DAC)->curdata) -#define DACCUR_WRITE(DAC, ADDR, VAL) ((DAC)->cur = (ADDR), (DAC)->curdata = (VAL)) -#define DACCFG_READ(DAC, ADDR) ((DAC)->cfg = (ADDR), (DAC)->cfgdata) -#define DACCFG_WRITE(DAC, ADDR, VAL) ((DAC)->cfg = (ADDR), (DAC)->cfgdata = (VAL)) - -typedef struct ffb_dac_hwstate { - unsigned int ppllctrl; - unsigned int gpllctrl; - unsigned int pfctrl; - unsigned int uctrl; - unsigned int clut[256 * 4]; /* One 256 entry clut on PAC1, 4 on PAC2 */ - unsigned int ovluts[4]; /* Overlay WLUTS, PAC2 only */ - unsigned int wtctrl; - unsigned int tmctrl; - unsigned int tcolorkey; - unsigned int wamask; - unsigned int pwluts[64]; - unsigned int dacctrl; - unsigned int tgen; - unsigned int vbnp; - unsigned int vbap; - unsigned int vsnp; - unsigned int vsap; - unsigned int hsnp; - unsigned int hbnp; - unsigned int hbap; - unsigned int hsyncnp; - unsigned int hsyncap; - unsigned int hscennp; - unsigned int hscenap; - unsigned int epnp; - unsigned int einp; - unsigned int eiap; -} ffb_dac_hwstate_t; - -typedef struct { - Bool InUse; - - /* The following fields are undefined unless InUse is TRUE. */ - int refcount; - Bool canshare; - unsigned int wlut_regval; - int buffer; /* 0 = Buffer A, 1 = Buffer B */ - int depth; /* 8 or 32 bpp */ - int greyscale; /* 1 = greyscale, 0 = color */ - int linear; /* 1 = linear, 0 = non-linear */ - int direct; /* 1 = 24bpp directcolor */ - int channel; /* 0 = X, 1 = R, 2 = G, 3 = B */ - int palette; /* Only PAC2 has multiple CLUTs */ -} ffb_wid_info_t; - -#define FFB_MAX_PWIDS 64 -typedef struct { - int num_wids; - int wid_shift; /* To get X channel value */ - ffb_wid_info_t wid_pool[FFB_MAX_PWIDS]; -} ffb_wid_pool_t; - -typedef struct ffb_dac_info { - unsigned int flags; -#define FFB_DAC_PAC1 0x00000001 /* Pacifica1 DAC, BT9068 */ -#define FFB_DAC_PAC2 0x00000002 /* Pacifica2 DAC, BT498 */ -#define FFB_DAC_ICURCTL 0x00000004 /* Inverted CUR_CTRL bits */ - - unsigned int kernel_wid; - - /* These registers need to be modified when changing DAC - * timing state, so at init time we capture their values. - */ - unsigned int ffbcfg0; - unsigned int ffbcfg2; - unsigned int ffb_passin_ctrl; /* FFB2+/AFB only */ - - ffb_dac_hwstate_t kern_dac_state; - ffb_dac_hwstate_t x_dac_state; - - ffb_wid_pool_t wid_table; -} ffb_dac_info_t; - -#endif /* _FFB_DAC_H */ diff --git a/src/mesa/drivers/dri/ffb/server/ffb_drishare.h b/src/mesa/drivers/dri/ffb/server/ffb_drishare.h deleted file mode 100644 index 69fefa3f0a1..00000000000 --- a/src/mesa/drivers/dri/ffb/server/ffb_drishare.h +++ /dev/null @@ -1,47 +0,0 @@ - -#ifndef _FFB_DRISHARE_H -#define _FFB_DRISHARE_H - -typedef struct ffb_dri_state { - int flags; -#define FFB_DRI_FFB2 0x00000001 -#define FFB_DRI_FFB2PLUS 0x00000002 -#define FFB_DRI_PAC1 0x00000004 -#define FFB_DRI_PAC2 0x00000008 - - /* Indexed by DRI drawable id. */ -#define FFB_DRI_NWIDS 64 - unsigned int wid_table[FFB_DRI_NWIDS]; -} ffb_dri_state_t; - -#define FFB_DRISHARE(SAREA) \ - ((ffb_dri_state_t *) (((char *)(SAREA)) + sizeof(drm_sarea_t))) - -typedef struct { - drm_handle_t hFbcRegs; - drmSize sFbcRegs; - - drm_handle_t hDacRegs; - drmSize sDacRegs; - - drm_handle_t hSfb8r; - drmSize sSfb8r; - - drm_handle_t hSfb32; - drmSize sSfb32; - - drm_handle_t hSfb64; - drmSize sSfb64; - - /* Fastfill/Pagefill parameters. */ - unsigned char disable_pagefill; - int fastfill_small_area; - int pagefill_small_area; - int fastfill_height; - int fastfill_width; - int pagefill_height; - int pagefill_width; - short Pf_AlignTab[0x800]; -} FFBDRIRec, *FFBDRIPtr; - -#endif /* !(_FFB_DRISHARE_H) */ diff --git a/src/mesa/drivers/dri/ffb/server/ffb_regs.h b/src/mesa/drivers/dri/ffb/server/ffb_regs.h deleted file mode 100644 index bda5840d609..00000000000 --- a/src/mesa/drivers/dri/ffb/server/ffb_regs.h +++ /dev/null @@ -1,508 +0,0 @@ -/* - * Acceleration for the Creator and Creator3D framebuffer - register layout. - * - * Copyright (C) 1998,1999,2000 Jakub Jelinek ([email protected]) - * Copyright (C) 1998 Michal Rehacek ([email protected]) - * Copyright (C) 1999 David S. Miller ([email protected]) - * - * 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 - * JAKUB JELINEK, MICHAL REHACEK, OR DAVID MILLER 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. - * - */ - -#ifndef FFBREGS_H -#define FFBREGS_H - -/* Auxilliary clips. */ -typedef struct { - volatile unsigned int min; - volatile unsigned int max; -} ffb_auxclip, *ffb_auxclipPtr; - -/* FFB register set. */ -typedef struct _ffb_fbc { - /* Next vertex registers, on the right we list which drawops - * use said register and the logical name the register has in - * that context. - */ /* DESCRIPTION DRAWOP(NAME) */ -/*0x00*/unsigned int pad1[3]; /* Reserved */ -/*0x0c*/volatile unsigned int alpha; /* ALPHA Transparency */ -/*0x10*/volatile unsigned int red; /* RED */ -/*0x14*/volatile unsigned int green; /* GREEN */ -/*0x18*/volatile unsigned int blue; /* BLUE */ -/*0x1c*/volatile unsigned int z; /* DEPTH */ -/*0x20*/volatile unsigned int y; /* Y triangle(DOYF) */ - /* aadot(DYF) */ - /* ddline(DYF) */ - /* aaline(DYF) */ -/*0x24*/volatile unsigned int x; /* X triangle(DOXF) */ - /* aadot(DXF) */ - /* ddline(DXF) */ - /* aaline(DXF) */ -/*0x28*/unsigned int pad2[2]; /* Reserved */ -/*0x30*/volatile unsigned int ryf; /* Y (alias to DOYF) ddline(RYF) */ - /* aaline(RYF) */ - /* triangle(RYF) */ -/*0x34*/volatile unsigned int rxf; /* X ddline(RXF) */ - /* aaline(RXF) */ - /* triangle(RXF) */ -/*0x38*/unsigned int pad3[2]; /* Reserved */ -/*0x40*/volatile unsigned int dmyf; /* Y (alias to DOYF) triangle(DMYF) */ -/*0x44*/volatile unsigned int dmxf; /* X triangle(DMXF) */ -/*0x48*/unsigned int pad4[2]; /* Reserved */ -/*0x50*/volatile unsigned int ebyi; /* Y (alias to RYI) polygon(EBYI) */ -/*0x54*/volatile unsigned int ebxi; /* X polygon(EBXI) */ -/*0x58*/unsigned int pad5[2]; /* Reserved */ -/*0x60*/volatile unsigned int by; /* Y brline(RYI) */ - /* fastfill(OP) */ - /* polygon(YI) */ - /* rectangle(YI) */ - /* bcopy(SRCY) */ - /* vscroll(SRCY) */ -/*0x64*/volatile unsigned int bx; /* X brline(RXI) */ - /* polygon(XI) */ - /* rectangle(XI) */ - /* bcopy(SRCX) */ - /* vscroll(SRCX) */ - /* fastfill(GO) */ -/*0x68*/volatile unsigned int dy; /* destination Y fastfill(DSTY) */ - /* bcopy(DSRY) */ - /* vscroll(DSRY) */ -/*0x6c*/volatile unsigned int dx; /* destination X fastfill(DSTX) */ - /* bcopy(DSTX) */ - /* vscroll(DSTX) */ -/*0x70*/volatile unsigned int bh; /* Y (alias to RYI) brline(DYI) */ - /* dot(DYI) */ - /* polygon(ETYI) */ - /* Height fastfill(H) */ - /* bcopy(H) */ - /* vscroll(H) */ - /* Y count fastfill(NY) */ -/*0x74*/volatile unsigned int bw; /* X dot(DXI) */ - /* brline(DXI) */ - /* polygon(ETXI) */ - /* fastfill(W) */ - /* bcopy(W) */ - /* vscroll(W) */ - /* fastfill(NX) */ -/*0x78*/unsigned int pad6[2]; /* Reserved */ -/*0x80*/unsigned int pad7[32]; /* Reserved */ - - /* Setup Unit's vertex state register */ -/*100*/ volatile unsigned int suvtx; -/*104*/ unsigned int pad8[63]; /* Reserved */ - - /* Frame Buffer Control Registers */ -/*200*/ volatile unsigned int ppc; /* Pixel Processor Control */ -/*204*/ volatile unsigned int wid; /* Current WID */ -/*208*/ volatile unsigned int fg; /* FG data */ -/*20c*/ volatile unsigned int bg; /* BG data */ -/*210*/ volatile unsigned int consty; /* Constant Y */ -/*214*/ volatile unsigned int constz; /* Constant Z */ -/*218*/ volatile unsigned int xclip; /* X Clip */ -/*21c*/ volatile unsigned int dcss; /* Depth Cue Scale Slope */ -/*220*/ volatile unsigned int vclipmin; /* Viewclip XY Min Bounds */ -/*224*/ volatile unsigned int vclipmax; /* Viewclip XY Max Bounds */ -/*228*/ volatile unsigned int vclipzmin; /* Viewclip Z Min Bounds */ -/*22c*/ volatile unsigned int vclipzmax; /* Viewclip Z Max Bounds */ -/*230*/ volatile unsigned int dcsf; /* Depth Cue Scale Front Bound */ -/*234*/ volatile unsigned int dcsb; /* Depth Cue Scale Back Bound */ -/*238*/ volatile unsigned int dczf; /* Depth Cue Z Front */ -/*23c*/ volatile unsigned int dczb; /* Depth Cue Z Back */ -/*240*/ unsigned int pad9; /* Reserved */ -/*244*/ volatile unsigned int blendc; /* Alpha Blend Control */ -/*248*/ volatile unsigned int blendc1; /* Alpha Blend Color 1 */ -/*24c*/ volatile unsigned int blendc2; /* Alpha Blend Color 2 */ -/*250*/ volatile unsigned int fbramitc; /* FB RAM Interleave Test Control */ -/*254*/ volatile unsigned int fbc; /* Frame Buffer Control */ -/*258*/ volatile unsigned int rop; /* Raster OPeration */ -/*25c*/ volatile unsigned int cmp; /* Frame Buffer Compare */ -/*260*/ volatile unsigned int matchab; /* Buffer AB Match Mask */ -/*264*/ volatile unsigned int matchc; /* Buffer C(YZ) Match Mask */ -/*268*/ volatile unsigned int magnab; /* Buffer AB Magnitude Mask */ -/*26c*/ volatile unsigned int magnc; /* Buffer C(YZ) Magnitude Mask */ -/*270*/ volatile unsigned int fbcfg0; /* Frame Buffer Config 0 */ -/*274*/ volatile unsigned int fbcfg1; /* Frame Buffer Config 1 */ -/*278*/ volatile unsigned int fbcfg2; /* Frame Buffer Config 2 */ -/*27c*/ volatile unsigned int fbcfg3; /* Frame Buffer Config 3 */ -/*280*/ volatile unsigned int ppcfg; /* Pixel Processor Config */ -/*284*/ volatile unsigned int pick; /* Picking Control */ -/*288*/ volatile unsigned int fillmode; /* FillMode */ -/*28c*/ volatile unsigned int fbramwac; /* FB RAM Write Address Control */ -/*290*/ volatile unsigned int pmask; /* RGB PlaneMask */ -/*294*/ volatile unsigned int xpmask; /* X PlaneMask */ -/*298*/ volatile unsigned int ypmask; /* Y PlaneMask */ -/*29c*/ volatile unsigned int zpmask; /* Z PlaneMask */ -/*2a0*/ ffb_auxclip auxclip[4]; /* Auxilliary Viewport Clip */ - - /* New 3dRAM III support regs */ -/*2c0*/ volatile unsigned int rawblend2; -/*2c4*/ volatile unsigned int rawpreblend; -/*2c8*/ volatile unsigned int rawstencil; -/*2cc*/ volatile unsigned int rawstencilctl; -/*2d0*/ volatile unsigned int threedram1; -/*2d4*/ volatile unsigned int threedram2; -/*2d8*/ volatile unsigned int passin; -/*2dc*/ volatile unsigned int rawclrdepth; -/*2e0*/ volatile unsigned int rawpmask; -/*2e4*/ volatile unsigned int rawcsrc; -/*2e8*/ volatile unsigned int rawmatch; -/*2ec*/ volatile unsigned int rawmagn; -/*2f0*/ volatile unsigned int rawropblend; -/*2f4*/ volatile unsigned int rawcmp; -/*2f8*/ volatile unsigned int rawwac; -/*2fc*/ volatile unsigned int fbramid; - -/*300*/ volatile unsigned int drawop; /* Draw OPeration */ -/*304*/ unsigned int pad10[2]; /* Reserved */ -/*30c*/ volatile unsigned int lpat; /* Line Pattern control */ -/*310*/ unsigned int pad11; /* Reserved */ -/*314*/ volatile unsigned int fontxy; /* XY Font coordinate */ -/*318*/ volatile unsigned int fontw; /* Font Width */ -/*31c*/ volatile unsigned int fontinc; /* Font Increment */ -/*320*/ volatile unsigned int font; /* Font bits */ -/*324*/ unsigned int pad12[3]; /* Reserved */ -/*330*/ volatile unsigned int blend2; -/*334*/ volatile unsigned int preblend; -/*338*/ volatile unsigned int stencil; -/*33c*/ volatile unsigned int stencilctl; - -/*340*/ unsigned int pad13[4]; /* Reserved */ -/*350*/ volatile unsigned int dcss1; /* Depth Cue Scale Slope 1 */ -/*354*/ volatile unsigned int dcss2; /* Depth Cue Scale Slope 2 */ -/*358*/ volatile unsigned int dcss3; /* Depth Cue Scale Slope 3 */ -/*35c*/ volatile unsigned int widpmask; -/*360*/ volatile unsigned int dcs2; -/*364*/ volatile unsigned int dcs3; -/*368*/ volatile unsigned int dcs4; -/*36c*/ unsigned int pad14; /* Reserved */ -/*370*/ volatile unsigned int dcd2; -/*374*/ volatile unsigned int dcd3; -/*378*/ volatile unsigned int dcd4; -/*37c*/ unsigned int pad15; /* Reserved */ -/*380*/ volatile unsigned int pattern[32]; /* area Pattern */ -/*400*/ unsigned int pad16[8]; /* Reserved */ -/*420*/ volatile unsigned int reset; /* chip RESET */ -/*424*/ unsigned int pad17[247]; /* Reserved */ -/*800*/ volatile unsigned int devid; /* Device ID */ -/*804*/ unsigned int pad18[63]; /* Reserved */ -/*900*/ volatile unsigned int ucsr; /* User Control & Status Register */ -/*904*/ unsigned int pad19[31]; /* Reserved */ -/*980*/ volatile unsigned int mer; /* Mode Enable Register */ -/*984*/ unsigned int pad20[1439]; /* Reserved */ -} ffb_fbc, *ffb_fbcPtr; - -/* Draw operations */ -#define FFB_DRAWOP_DOT 0x00 -#define FFB_DRAWOP_AADOT 0x01 -#define FFB_DRAWOP_BRLINECAP 0x02 -#define FFB_DRAWOP_BRLINEOPEN 0x03 -#define FFB_DRAWOP_DDLINE 0x04 -#define FFB_DRAWOP_AALINE 0x05 -#define FFB_DRAWOP_TRIANGLE 0x06 -#define FFB_DRAWOP_POLYGON 0x07 -#define FFB_DRAWOP_RECTANGLE 0x08 -#define FFB_DRAWOP_FASTFILL 0x09 -#define FFB_DRAWOP_BCOPY 0x0a /* Not implemented in any FFB, VIS is faster */ -#define FFB_DRAWOP_VSCROLL 0x0b /* Up to 12x faster than BCOPY, 3-4x faster than VIS */ - -/* FastFill operation codes. */ -#define FFB_FASTFILL_PAGE 0x01 -#define FFB_FASTFILL_BLOCK 0x02 -#define FFB_FASTFILL_COLOR_BLK 0x03 -#define FFB_FASTFILL_BLOCK_X 0x04 - -/* Spanfill Unit Line Pattern */ -#define FFB_LPAT_SCALEPTR 0xf0000000 -#define FFB_LPAT_SCALEPTR_SHIFT 28 -#define FFB_LPAT_PATPTR 0x0f000000 -#define FFB_LPAT_PATPTR_SHIFT 24 -#define FFB_LPAT_SCALEVAL 0x00f00000 -#define FFB_LPAT_SCALEVAL_SHIFT 20 -#define FFB_LPAT_PATLEN 0x000f0000 -#define FFB_LPAT_PATLEN_SHIFT 16 -#define FFB_LPAT_PATTERN 0x0000ffff -#define FFB_LPAT_PATTERN_SHIFT 0 - -/* Pixel processor control */ -/* Force WID */ -#define FFB_PPC_FW_DISABLE 0x800000 -#define FFB_PPC_FW_ENABLE 0xc00000 -#define FFB_PPC_FW_MASK 0xc00000 -/* Auxiliary clip */ -#define FFB_PPC_ACE_DISABLE 0x040000 -#define FFB_PPC_ACE_AUX_SUB 0x080000 -#define FFB_PPC_ACE_AUX_ADD 0x0c0000 -#define FFB_PPC_ACE_MASK 0x0c0000 -/* Depth cue */ -#define FFB_PPC_DCE_DISABLE 0x020000 -#define FFB_PPC_DCE_ENABLE 0x030000 -#define FFB_PPC_DCE_MASK 0x030000 -/* Alpha blend */ -#define FFB_PPC_ABE_DISABLE 0x008000 -#define FFB_PPC_ABE_ENABLE 0x00c000 -#define FFB_PPC_ABE_MASK 0x00c000 -/* View clip */ -#define FFB_PPC_VCE_DISABLE 0x001000 -#define FFB_PPC_VCE_2D 0x002000 -#define FFB_PPC_VCE_3D 0x003000 -#define FFB_PPC_VCE_MASK 0x003000 -/* Area pattern */ -#define FFB_PPC_APE_DISABLE 0x000800 -#define FFB_PPC_APE_ENABLE 0x000c00 -#define FFB_PPC_APE_MASK 0x000c00 -/* Transparent background */ -#define FFB_PPC_TBE_OPAQUE 0x000200 -#define FFB_PPC_TBE_TRANSPARENT 0x000300 -#define FFB_PPC_TBE_MASK 0x000300 -/* Z source */ -#define FFB_PPC_ZS_VAR 0x000080 -#define FFB_PPC_ZS_CONST 0x0000c0 -#define FFB_PPC_ZS_MASK 0x0000c0 -/* Y source */ -#define FFB_PPC_YS_VAR 0x000020 -#define FFB_PPC_YS_CONST 0x000030 -#define FFB_PPC_YS_MASK 0x000030 -/* X source */ -#define FFB_PPC_XS_WID 0x000004 -#define FFB_PPC_XS_VAR 0x000008 -#define FFB_PPC_XS_CONST 0x00000c -#define FFB_PPC_XS_MASK 0x00000c -/* Color (BGR) source */ -#define FFB_PPC_CS_VAR 0x000002 -#define FFB_PPC_CS_CONST 0x000003 -#define FFB_PPC_CS_MASK 0x000003 - -/* X Clip */ -#define FFB_XCLIP_XREF 0x000000ff -#define FFB_XCLIP_TEST_MASK 0x00070000 -#define FFB_XCLIP_TEST_ALWAYS 0x00000000 -#define FFB_XCLIP_TEST_GT 0x00010000 -#define FFB_XCLIP_TEST_EQ 0x00020000 -#define FFB_XCLIP_TEST_GE 0x00030000 -#define FFB_XCLIP_TEST_NEVER 0x00040000 -#define FFB_XCLIP_TEST_LE 0x00050000 -#define FFB_XCLIP_TEST_NE 0x00060000 -#define FFB_XCLIP_TEST_LT 0x00070000 - -/* FB Control register */ -/* Write buffer dest */ -#define FFB_FBC_WB_A 0x20000000 -#define FFB_FBC_WB_B 0x40000000 -#define FFB_FBC_WB_AB 0x60000000 -#define FFB_FBC_WB_C 0x80000000 -#define FFB_FBC_WB_AC 0xa0000000 -#define FFB_FBC_WB_BC 0xc0000000 -#define FFB_FBC_WB_ABC 0xe0000000 -#define FFB_FBC_WB_MASK 0xe0000000 -/* Write enable */ -#define FFB_FBC_WE_FORCEOFF 0x00100000 -#define FFB_FBC_WE_FORCEON 0x00200000 -#define FFB_FBC_WE_USE_WMASK 0x00300000 -#define FFB_FBC_WE_MASK 0x00300000 -/* Write group mode */ -#define FFB_FBC_WM_RSVD 0x00040000 -#define FFB_FBC_WM_COMBINED 0x00080000 -#define FFB_FBC_WM_SEPARATE 0x000c0000 -#define FFB_FBC_WM_MASK 0x000c0000 -/* Read buffer src */ -#define FFB_FBC_RB_A 0x00004000 -#define FFB_FBC_RB_B 0x00008000 -#define FFB_FBC_RB_C 0x0000c000 -#define FFB_FBC_RB_MASK 0x0000c000 -/* Stereo buf dest */ -#define FFB_FBC_SB_LEFT 0x00001000 -#define FFB_FBC_SB_RIGHT 0x00002000 -#define FFB_FBC_SB_BOTH 0x00003000 -#define FFB_FBC_SB_MASK 0x00003000 -/* Z plane group enable */ -#define FFB_FBC_ZE_OFF 0x00000400 -#define FFB_FBC_ZE_ON 0x00000800 -#define FFB_FBC_ZE_MASK 0x00000c00 -/* Y plane group enable */ -#define FFB_FBC_YE_OFF 0x00000100 -#define FFB_FBC_YE_ON 0x00000200 -#define FFB_FBC_YE_MASK 0x00000300 -/* X plane group enable */ -#define FFB_FBC_XE_OFF 0x00000040 -#define FFB_FBC_XE_ON 0x00000080 -#define FFB_FBC_XE_MASK 0x000000c0 -/* B plane group enable */ -#define FFB_FBC_BE_OFF 0x00000010 -#define FFB_FBC_BE_ON 0x00000020 -#define FFB_FBC_BE_MASK 0x00000030 -/* G plane group enable */ -#define FFB_FBC_GE_OFF 0x00000004 -#define FFB_FBC_GE_ON 0x00000008 -#define FFB_FBC_GE_MASK 0x0000000c -/* R plane group enable */ -#define FFB_FBC_RE_OFF 0x00000001 -#define FFB_FBC_RE_ON 0x00000002 -#define FFB_FBC_RE_MASK 0x00000003 -/* Combined */ -#define FFB_FBC_RGBE_OFF 0x00000015 -#define FFB_FBC_RGBE_ON 0x0000002a -#define FFB_FBC_RGBE_MASK 0x0000003f - -/* Raster OP */ -#define FFB_ROP_YZ_MASK 0x008f0000 -#define FFB_ROP_X_MASK 0x00008f00 -#define FFB_ROP_RGB_MASK 0x0000008f - -/* Now the rops themselves which get shifted into the - * above fields. - */ -#define FFB_ROP_EDIT_BIT 0x80 -#define FFB_ROP_ZERO 0x80 -#define FFB_ROP_NEW_AND_OLD 0x81 -#define FFB_ROP_NEW_AND_NOLD 0x82 -#define FFB_ROP_NEW 0x83 -#define FFB_ROP_NNEW_AND_OLD 0x84 -#define FFB_ROP_OLD 0x85 -#define FFB_ROP_NEW_XOR_OLD 0x86 -#define FFB_ROP_NEW_OR_OLD 0x87 -#define FFB_ROP_NNEW_AND_NOLD 0x88 -#define FFB_ROP_NNEW_XOR_NOLD 0x89 -#define FFB_ROP_NOLD 0x8a -#define FFB_ROP_NEW_OR_NOLD 0x8b -#define FFB_ROP_NNEW 0x8c -#define FFB_ROP_NNEW_OR_OLD 0x8d -#define FFB_ROP_NNEW_OR_NOLD 0x8e -#define FFB_ROP_ONES 0x8f - -/* FB Compare */ -#define FFB_CMP_MATCHC_MASK 0x8f000000 -#define FFB_CMP_MAGNC_MASK 0x00870000 -#define FFB_CMP_MATCHAB_MASK 0x0000ff00 -#define FFB_CMP_MAGNAB_MASK 0x000000ff - -/* Compare Match codes */ -#define FFB_CMP_MATCH_EDIT_BIT 0x80 -#define FFB_CMP_MATCH_ALWAYS 0x80 -#define FFB_CMP_MATCH_NEVER 0x81 -#define FFB_CMP_MATCH_EQ 0x82 -#define FFB_CMP_MATCH_NE 0x83 -#define FFB_CMP_MATCH_A_ALWAYS 0xc0 -#define FFB_CMP_MATCH_B_ALWAYS 0xa0 - -/* Compare Magnitude codes */ -#define FFB_CMP_MAGN_EDIT_BIT 0x80 -#define FFB_CMP_MAGN_ALWAYS 0x80 -#define FFB_CMP_MAGN_GT 0x81 -#define FFB_CMP_MAGN_EQ 0x82 -#define FFB_CMP_MAGN_GE 0x83 -#define FFB_CMP_MAGN_NEVER 0x84 -#define FFB_CMP_MAGN_LE 0x85 -#define FFB_CMP_MAGN_NE 0x86 -#define FFB_CMP_MAGN_LT 0x87 -#define FFB_CMP_MAGN_A_ALWAYS 0xc0 -#define FFB_CMP_MAGN_B_ALWAYS 0xa0 - -/* User Control and Status */ -#define FFB_UCSR_FIFO_MASK 0x00000fff -#define FFB_UCSR_PICK_NO_HIT 0x00020000 -#define FFB_UCSR_PICK_HIT 0x00030000 -#define FFB_UCSR_PICK_DISABLE 0x00080000 -#define FFB_UCSR_PICK_ENABLE 0x000c0000 -#define FFB_UCSR_FB_BUSY 0x01000000 -#define FFB_UCSR_RP_BUSY 0x02000000 -#define FFB_UCSR_ALL_BUSY (FFB_UCSR_RP_BUSY|FFB_UCSR_FB_BUSY) -#define FFB_UCSR_READ_ERR 0x40000000 -#define FFB_UCSR_FIFO_OVFL 0x80000000 -#define FFB_UCSR_ALL_ERRORS (FFB_UCSR_READ_ERR|FFB_UCSR_FIFO_OVFL) - -/* Mode Enable Register */ -#define FFB_MER_EIRA 0x00000080 /* Enable read-ahead, increasing */ -#define FFB_MER_EDRA 0x000000c0 /* Enable read-ahead, decreasing */ -#define FFB_MER_DRA 0x00000040 /* No read-ahead */ - -/* FBram Config 0 */ -#define FFB_FBCFG0_RFTIME 0xff800000 -#define FFB_FBCFG0_XMAX 0x007c0000 -#define FFB_FBCFG0_YMAX 0x0003ffc0 -#define FFB_FBCFG0_RES_MASK 0x00000030 -#define FFB_FBCFG0_RES_HIGH 0x00000030 /* 1920x1360 */ -#define FFB_FBCFG0_RES_STD 0x00000020 /* 1280x1024 */ -#define FFB_FBCFG0_RES_STEREO 0x00000010 /* 960x580 */ -#define FFB_FBCFG0_RES_PRTRAIT 0x00000000 /* 1280x2048 */ -#define FFB_FBCFG0_ITRLACE 0x00000000 -#define FFB_FBCFG0_SEQUENTIAL 0x00000008 -#define FFB_FBCFG0_DRENA 0x00000004 -#define FFB_FBCFG0_BPMODE 0x00000002 -#define FFB_FBCFG0_RFRSH_RST 0x00000001 - -typedef struct _ffb_dac { - volatile unsigned int cfg; - volatile unsigned int cfgdata; - volatile unsigned int cur; - volatile unsigned int curdata; -} ffb_dac, *ffb_dacPtr; - -/* Writing 2 32-bit registers at a time using 64-bit stores. -DaveM */ -#if defined(__GNUC__) && defined(USE_VIS) -/* 64-bit register writing support. - * Note: "lo" means "low address". - */ -#define FFB_WRITE64_COMMON(__regp, __lo32, __hi32, REG0, REG1) \ -do { __extension__ register unsigned int __r0 __asm__(""#REG0); \ - __extension__ register unsigned int __r1 __asm__(""#REG1); \ - __r0 = (__lo32); \ - __r1 = (__hi32); \ - __asm__ __volatile__ ("sllx\t%0, 32, %%g1\n\t" \ - "srl\t%1, 0, %1\n\t" \ - "or\t%%g1, %1, %%g1\n\t" \ - "stx\t%%g1, %2" \ - : : "r" (__r0), "r" (__r1), "m" (*(__regp)) : "g1"); \ -} while(0) - -#define FFB_WRITE64P(__regp, __srcp) \ -do { __asm__ __volatile__ ("ldx\t%0, %%g2;" \ - "stx\t%%g2, %1" \ - : : "m" (*(__srcp)), "m" (*(__regp)) \ - : "g2"); \ -} while(0) - -#define FFB_WRITE64(__regp, __lo32, __hi32) \ - FFB_WRITE64_COMMON(__regp, __lo32, __hi32, g2, g3) -#define FFB_WRITE64_2(__regp, __lo32, __hi32) \ - FFB_WRITE64_COMMON(__regp, __lo32, __hi32, g4, g5) -#define FFB_WRITE64_3(__regp, __lo32, __hi32) \ - FFB_WRITE64_COMMON(__regp, __lo32, __hi32, o4, o5) - -#else /* Do not use 64-bit writes. */ - -#define FFB_WRITE64(__regp, __lo32, __hi32) \ -do { volatile unsigned int *__p = (__regp); \ - *__p = (__lo32); \ - *(__p + 1) = (__hi32); \ -} while(0) - -#define FFB_WRITE64P(__regp, __srcp) \ -do { volatile unsigned int *__p = (__regp); \ - unsigned int *__q = (__srcp); \ - *__p = *__q; \ - *(__p + 1) = *(__q + 1); \ -} while(0) - -#define FFB_WRITE64_2(__regp, __lo32, __hi32) \ - FFB_WRITE64(__regp, __lo32, __hi32) -#define FFB_WRITE64_3(__regp, __lo32, __hi32) \ - FFB_WRITE64(__regp, __lo32, __hi32) -#endif - -#endif /* FFBREGS_H */ diff --git a/src/mesa/drivers/dri/gamma/Makefile b/src/mesa/drivers/dri/gamma/Makefile deleted file mode 100644 index 09df1578fc7..00000000000 --- a/src/mesa/drivers/dri/gamma/Makefile +++ /dev/null @@ -1,34 +0,0 @@ -# src/mesa/drivers/dri/gamma/Makefile - -TOP = ../../../../.. -include $(TOP)/configs/current - -LIBNAME = gamma_dri.so - -# Not yet -# MINIGLX_SOURCES = server/gamma_dri.c - -DRIVER_SOURCES = \ - gamma_context.c \ - gamma_dd.c \ - gamma_inithw.c \ - gamma_lock.c \ - gamma_render.c \ - gamma_screen.c \ - gamma_span.c \ - gamma_state.c \ - gamma_tex.c \ - gamma_texmem.c \ - gamma_texstate.c \ - gamma_tris.c \ - gamma_vb.c \ - gamma_xmesa.c - -C_SOURCES = \ - $(COMMON_SOURCES) \ - $(DRIVER_SOURCES) - -ASM_SOURCES = - -include ../Makefile.template - diff --git a/src/mesa/drivers/dri/gamma/gamma_client.h b/src/mesa/drivers/dri/gamma/gamma_client.h deleted file mode 100644 index 6dcf2e9438b..00000000000 --- a/src/mesa/drivers/dri/gamma/gamma_client.h +++ /dev/null @@ -1,6184 +0,0 @@ -/* Automaticallly generated -- do not edit */ -#ifndef _GLINT_CLIENT_H_ -#define _GLINT_CLIENT_H_ -/* **********************************************************************/ -/* START OF glint_extra.h INCLUSION */ -/* **********************************************************************/ - -/* glint_extra.h - * Created: Fri Apr 2 23:32:05 1999 by [email protected] - * Revised: Fri Apr 2 23:33:00 1999 by [email protected] - * - * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. - * 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 - * PRECISION INSIGHT 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. - * - * - */ - -#define AreaStippleEnable 0x00001 -#define LineStippleEnable 0x00002 -#define GResetLineStipple 0x00004 -#define FastFillEnable 0x00008 -#define PrimitiveLine 0x00000 -#define PrimitiveTrapezoid 0x00040 -#define PrimitivePoint 0x00080 -#define PrimitiveRectangle 0x000C0 -#define AntialiasEnable 0x00100 -#define AntialiasingQuality 0x00200 -#define UsePointTable 0x00400 -#define SyncOnBitMask 0x00800 -#define SyncOnHostData 0x01000 -#define TextureEnable 0x02000 -#define FogEnable 0x04000 -#define CoverageEnable 0x08000 -#define SubPixelCorrectionEnable 0x10000 -#define SpanOperation 0x40000 - - -/* **********************************************************************/ -/* END OF glint_extra.h INCLUSION */ -/* **********************************************************************/ - - -#define GlintResetStatus 0x0000 -#define GlintResetStatusReg 0 -#define GlintResetStatusOff 0x0000 -#define GlintResetStatusSec 0x0000 -#define GlintResetStatusSecReg 2 -#define GlintResetStatusSecOff 0x0000 - -#define GlintIntEnable 0x0008 -#define GlintIntEnableReg 0 -#define GlintIntEnableOff 0x0008 -#define GlintIntEnableSec 0x0008 -#define GlintIntEnableSecReg 2 -#define GlintIntEnableSecOff 0x0008 - -#define GlintIntFlags 0x0010 -#define GlintIntFlagsReg 0 -#define GlintIntFlagsOff 0x0010 -#define GlintIntFlagsSec 0x0010 -#define GlintIntFlagsSecReg 2 -#define GlintIntFlagsSecOff 0x0010 - -#define GlintInFIFOSpace 0x0018 -#define GlintInFIFOSpaceReg 0 -#define GlintInFIFOSpaceOff 0x0018 -#define GlintInFIFOSpaceSec 0x0018 -#define GlintInFIFOSpaceSecReg 2 -#define GlintInFIFOSpaceSecOff 0x0018 - -#define GlintOutFIFOWords 0x0020 -#define GlintOutFIFOWordsReg 0 -#define GlintOutFIFOWordsOff 0x0020 -#define GlintOutFIFOWordsSec 0x0020 -#define GlintOutFIFOWordsSecReg 2 -#define GlintOutFIFOWordsSecOff 0x0020 - -#define GlintDMAAddress 0x0028 -#define GlintDMAAddressReg 0 -#define GlintDMAAddressOff 0x0028 -#define GlintDMAAddressSec 0x0028 -#define GlintDMAAddressSecReg 2 -#define GlintDMAAddressSecOff 0x0028 - -#define GlintDMACount 0x0030 -#define GlintDMACountReg 0 -#define GlintDMACountOff 0x0030 -#define GlintDMACountSec 0x0030 -#define GlintDMACountSecReg 2 -#define GlintDMACountSecOff 0x0030 - -#define GlintErrorFlags 0x0038 -#define GlintErrorFlagsReg 0 -#define GlintErrorFlagsOff 0x0038 -#define GlintErrorFlagsSec 0x0038 -#define GlintErrorFlagsSecReg 2 -#define GlintErrorFlagsSecOff 0x0038 - -#define GlintVClkCtl 0x0040 -#define GlintVClkCtlReg 0 -#define GlintVClkCtlOff 0x0040 -#define GlintVClkCtlSec 0x0040 -#define GlintVClkCtlSecReg 2 -#define GlintVClkCtlSecOff 0x0040 - -#define GlintTestRegister 0x0048 -#define GlintTestRegisterReg 0 -#define GlintTestRegisterOff 0x0048 -#define GlintTestRegisterSec 0x0048 -#define GlintTestRegisterSecReg 2 -#define GlintTestRegisterSecOff 0x0048 - -#define GlintAperture0 0x0050 -#define GlintAperture0Reg 0 -#define GlintAperture0Off 0x0050 -#define GlintAperture0Sec 0x0050 -#define GlintAperture0SecReg 2 -#define GlintAperture0SecOff 0x0050 - -#define GlintAperture1 0x0058 -#define GlintAperture1Reg 0 -#define GlintAperture1Off 0x0058 -#define GlintAperture1Sec 0x0058 -#define GlintAperture1SecReg 2 -#define GlintAperture1SecOff 0x0058 - -#define GlintDMAControl 0x0060 -#define GlintDMAControlReg 0 -#define GlintDMAControlOff 0x0060 -#define GlintDMAControlSec 0x0060 -#define GlintDMAControlSecReg 2 -#define GlintDMAControlSecOff 0x0060 - -#define GlintFIFODis 0x0068 -#define GlintFIFODisReg 0 -#define GlintFIFODisOff 0x0068 -#define GlintFIFODisSec 0x0068 -#define GlintFIFODisSecReg 2 -#define GlintFIFODisSecOff 0x0068 - -#define GlintLBMemoryCtl 0x1000 -#define GlintLBMemoryCtlReg 1 -#define GlintLBMemoryCtlOff 0x0000 -#define GlintLBMemoryCtlSec 0x1000 -#define GlintLBMemoryCtlSecReg 3 -#define GlintLBMemoryCtlSecOff 0x0000 - -#define GlintLBMemoryEDO 0x1008 -#define GlintLBMemoryEDOReg 1 -#define GlintLBMemoryEDOOff 0x0008 -#define GlintLBMemoryEDOSec 0x1008 -#define GlintLBMemoryEDOSecReg 3 -#define GlintLBMemoryEDOSecOff 0x0008 - -#define GlintFBMemoryCtl 0x1800 -#define GlintFBMemoryCtlReg 1 -#define GlintFBMemoryCtlOff 0x0800 -#define GlintFBMemoryCtlSec 0x1800 -#define GlintFBMemoryCtlSecReg 3 -#define GlintFBMemoryCtlSecOff 0x0800 - -#define GlintFBModeSel 0x1808 -#define GlintFBModeSelReg 1 -#define GlintFBModeSelOff 0x0808 -#define GlintFBModeSelSec 0x1808 -#define GlintFBModeSelSecReg 3 -#define GlintFBModeSelSecOff 0x0808 - -#define GlintFBGCWrMask 0x1810 -#define GlintFBGCWrMaskReg 1 -#define GlintFBGCWrMaskOff 0x0810 -#define GlintFBGCWrMaskSec 0x1810 -#define GlintFBGCWrMaskSecReg 3 -#define GlintFBGCWrMaskSecOff 0x0810 - -#define GlintFBGCColorLower 0x1818 -#define GlintFBGCColorLowerReg 1 -#define GlintFBGCColorLowerOff 0x0818 -#define GlintFBGCColorLowerSec 0x1818 -#define GlintFBGCColorLowerSecReg 3 -#define GlintFBGCColorLowerSecOff 0x0818 - -#define GlintFBTXMemCtl 0x1820 -#define GlintFBTXMemCtlReg 1 -#define GlintFBTXMemCtlOff 0x0820 -#define GlintFBTXMemCtlSec 0x1820 -#define GlintFBTXMemCtlSecReg 3 -#define GlintFBTXMemCtlSecOff 0x0820 - -#define GlintFBWrMask 0x1830 -#define GlintFBWrMaskReg 1 -#define GlintFBWrMaskOff 0x0830 -#define GlintFBWrMaskSec 0x1830 -#define GlintFBWrMaskSecReg 3 -#define GlintFBWrMaskSecOff 0x0830 - -#define GlintFBGCColorUpper 0x1838 -#define GlintFBGCColorUpperReg 1 -#define GlintFBGCColorUpperOff 0x0838 -#define GlintFBGCColorUpperSec 0x1838 -#define GlintFBGCColorUpperSecReg 3 -#define GlintFBGCColorUpperSecOff 0x0838 - -#define GlintVTGHLimit 0x3000 -#define GlintVTGHLimitReg 1 -#define GlintVTGHLimitOff 0x2000 -#define GlintVTGHLimitSec 0x3000 -#define GlintVTGHLimitSecReg 3 -#define GlintVTGHLimitSecOff 0x2000 - -#define GlintVTGHSyncStart 0x3008 -#define GlintVTGHSyncStartReg 1 -#define GlintVTGHSyncStartOff 0x2008 -#define GlintVTGHSyncStartSec 0x3008 -#define GlintVTGHSyncStartSecReg 3 -#define GlintVTGHSyncStartSecOff 0x2008 - -#define GlintVTGHSyncEnd 0x3010 -#define GlintVTGHSyncEndReg 1 -#define GlintVTGHSyncEndOff 0x2010 -#define GlintVTGHSyncEndSec 0x3010 -#define GlintVTGHSyncEndSecReg 3 -#define GlintVTGHSyncEndSecOff 0x2010 - -#define GlintVTGHBlankEnd 0x3018 -#define GlintVTGHBlankEndReg 1 -#define GlintVTGHBlankEndOff 0x2018 -#define GlintVTGHBlankEndSec 0x3018 -#define GlintVTGHBlankEndSecReg 3 -#define GlintVTGHBlankEndSecOff 0x2018 - -#define GlintVTGVLimit 0x3020 -#define GlintVTGVLimitReg 1 -#define GlintVTGVLimitOff 0x2020 -#define GlintVTGVLimitSec 0x3020 -#define GlintVTGVLimitSecReg 3 -#define GlintVTGVLimitSecOff 0x2020 - -#define GlintVTGVSyncStart 0x3028 -#define GlintVTGVSyncStartReg 1 -#define GlintVTGVSyncStartOff 0x2028 -#define GlintVTGVSyncStartSec 0x3028 -#define GlintVTGVSyncStartSecReg 3 -#define GlintVTGVSyncStartSecOff 0x2028 - -#define GlintVTGVSyncEnd 0x3030 -#define GlintVTGVSyncEndReg 1 -#define GlintVTGVSyncEndOff 0x2030 -#define GlintVTGVSyncEndSec 0x3030 -#define GlintVTGVSyncEndSecReg 3 -#define GlintVTGVSyncEndSecOff 0x2030 - -#define GlintVTGVBlankEnd 0x3038 -#define GlintVTGVBlankEndReg 1 -#define GlintVTGVBlankEndOff 0x2038 -#define GlintVTGVBlankEndSec 0x3038 -#define GlintVTGVBlankEndSecReg 3 -#define GlintVTGVBlankEndSecOff 0x2038 - -#define GlintVTGHGateStart 0x3040 -#define GlintVTGHGateStartReg 1 -#define GlintVTGHGateStartOff 0x2040 -#define GlintVTGHGateStartSec 0x3040 -#define GlintVTGHGateStartSecReg 3 -#define GlintVTGHGateStartSecOff 0x2040 - -#define GlintVTGHGateEnd 0x3048 -#define GlintVTGHGateEndReg 1 -#define GlintVTGHGateEndOff 0x2048 -#define GlintVTGHGateEndSec 0x3048 -#define GlintVTGHGateEndSecReg 3 -#define GlintVTGHGateEndSecOff 0x2048 - -#define GlintVTGVGateStart 0x3050 -#define GlintVTGVGateStartReg 1 -#define GlintVTGVGateStartOff 0x2050 -#define GlintVTGVGateStartSec 0x3050 -#define GlintVTGVGateStartSecReg 3 -#define GlintVTGVGateStartSecOff 0x2050 - -#define GlintVTGVGateEnd 0x3058 -#define GlintVTGVGateEndReg 1 -#define GlintVTGVGateEndOff 0x2058 -#define GlintVTGVGateEndSec 0x3058 -#define GlintVTGVGateEndSecReg 3 -#define GlintVTGVGateEndSecOff 0x2058 - -#define GlintVTGPolarity 0x3060 -#define GlintVTGPolarityReg 1 -#define GlintVTGPolarityOff 0x2060 -#define GlintVTGPolaritySec 0x3060 -#define GlintVTGPolaritySecReg 3 -#define GlintVTGPolaritySecOff 0x2060 - -#define GlintVTGFrameRowAddr 0x3068 -#define GlintVTGFrameRowAddrReg 1 -#define GlintVTGFrameRowAddrOff 0x2068 -#define GlintVTGFrameRowAddrSec 0x3068 -#define GlintVTGFrameRowAddrSecReg 3 -#define GlintVTGFrameRowAddrSecOff 0x2068 - -#define GlintVTGVLineNumber 0x3070 -#define GlintVTGVLineNumberReg 1 -#define GlintVTGVLineNumberOff 0x2070 -#define GlintVTGVLineNumberSec 0x3070 -#define GlintVTGVLineNumberSecReg 3 -#define GlintVTGVLineNumberSecOff 0x2070 - -#define GlintVTGSerialClk 0x3078 -#define GlintVTGSerialClkReg 1 -#define GlintVTGSerialClkOff 0x2078 -#define GlintVTGSerialClkSec 0x3078 -#define GlintVTGSerialClkSecReg 3 -#define GlintVTGSerialClkSecOff 0x2078 - -#define GlintVTGModeCtl 0x3080 -#define GlintVTGModeCtlReg 1 -#define GlintVTGModeCtlOff 0x2080 -#define GlintVTGModeCtlSec 0x3080 -#define GlintVTGModeCtlSecReg 3 -#define GlintVTGModeCtlSecOff 0x2080 - -#define GlintOutputFIFO 0x2000 -#define GlintOutputFIFOReg 1 -#define GlintOutputFIFOOff 0x1000 -#define GlintOutputFIFOSec 0x2000 -#define GlintOutputFIFOSecReg 3 -#define GlintOutputFIFOSecOff 0x1000 - -#define GlintGInFIFOSpace 0x0018 -#define GlintGInFIFOSpaceReg 0 -#define GlintGInFIFOSpaceOff 0x0018 - -#define GlintGDMAAddress 0x0028 -#define GlintGDMAAddressReg 0 -#define GlintGDMAAddressOff 0x0028 - -#define GlintGDMACount 0x0030 -#define GlintGDMACountReg 0 -#define GlintGDMACountOff 0x0030 - -#define GlintGDMAControl 0x0060 -#define GlintGDMAControlReg 0 -#define GlintGDMAControlOff 0x0060 - -#define GlintGOutDMA 0x0080 -#define GlintGOutDMAReg 0 -#define GlintGOutDMAOff 0x0080 - -#define GlintGOutDMACount 0x0088 -#define GlintGOutDMACountReg 0 -#define GlintGOutDMACountOff 0x0088 - -#define GlintGResetStatus 0x0800 -#define GlintGResetStatusReg 0 -#define GlintGResetStatusOff 0x0800 - -#define GlintGIntEnable 0x0808 -#define GlintGIntEnableReg 0 -#define GlintGIntEnableOff 0x0808 - -#define GlintGIntFlags 0x0810 -#define GlintGIntFlagsReg 0 -#define GlintGIntFlagsOff 0x0810 - -#define GlintGErrorFlags 0x0838 -#define GlintGErrorFlagsReg 0 -#define GlintGErrorFlagsOff 0x0838 - -#define GlintGTestRegister 0x0848 -#define GlintGTestRegisterReg 0 -#define GlintGTestRegisterOff 0x0848 - -#define GlintGFIFODis 0x0868 -#define GlintGFIFODisReg 0 -#define GlintGFIFODisOff 0x0868 - -#define GlintGChipConfig 0x0870 -#define GlintGChipConfigReg 0 -#define GlintGChipConfigOff 0x0870 - -#define GlintGCSRAperture 0x0878 -#define GlintGCSRApertureReg 0 -#define GlintGCSRApertureOff 0x0878 - -#define GlintGPageTableAddr 0x0c00 -#define GlintGPageTableAddrReg 0 -#define GlintGPageTableAddrOff 0x0c00 - -#define GlintGPageTableLength 0x0c08 -#define GlintGPageTableLengthReg 0 -#define GlintGPageTableLengthOff 0x0c08 - -#define GlintGDelayTimer 0x0c38 -#define GlintGDelayTimerReg 0 -#define GlintGDelayTimerOff 0x0c38 - -#define GlintGCommandMode 0x0c40 -#define GlintGCommandModeReg 0 -#define GlintGCommandModeOff 0x0c40 - -#define GlintGCommandIntEnable 0x0c48 -#define GlintGCommandIntEnableReg 0 -#define GlintGCommandIntEnableOff 0x0c48 - -#define GlintGCommandIntFlags 0x0c50 -#define GlintGCommandIntFlagsReg 0 -#define GlintGCommandIntFlagsOff 0x0c50 - -#define GlintGCommandErrorFlags 0x0c58 -#define GlintGCommandErrorFlagsReg 0 -#define GlintGCommandErrorFlagsOff 0x0c58 - -#define GlintGCommandStatus 0x0c60 -#define GlintGCommandStatusReg 0 -#define GlintGCommandStatusOff 0x0c60 - -#define GlintGCommandFaultingAddr 0x0c68 -#define GlintGCommandFaultingAddrReg 0 -#define GlintGCommandFaultingAddrOff 0x0c68 - -#define GlintGVertexFaultingAddr 0x0c70 -#define GlintGVertexFaultingAddrReg 0 -#define GlintGVertexFaultingAddrOff 0x0c70 - -#define GlintGWriteFaultingAddr 0x0c88 -#define GlintGWriteFaultingAddrReg 0 -#define GlintGWriteFaultingAddrOff 0x0c88 - -#define GlintGFeedbackSelectCount 0x0c98 -#define GlintGFeedbackSelectCountReg 0 -#define GlintGFeedbackSelectCountOff 0x0c98 - -#define GlintGGammaProcessorMode 0x0cb8 -#define GlintGGammaProcessorModeReg 0 -#define GlintGGammaProcessorModeOff 0x0cb8 - -#define GlintGVGAShadow 0x0d00 -#define GlintGVGAShadowReg 0 -#define GlintGVGAShadowOff 0x0d00 - -#define GlintGMultGLINTAperture 0x0d08 -#define GlintGMultGLINTApertureReg 0 -#define GlintGMultGLINTApertureOff 0x0d08 - -#define GlintGMultGLINT1 0x0d10 -#define GlintGMultGLINT1Reg 0 -#define GlintGMultGLINT1Off 0x0d10 - -#define GlintGMultGLINT2 0x0d18 -#define GlintGMultGLINT2Reg 0 -#define GlintGMultGLINT2Off 0x0d18 - -#define GlintStartXDom 0x8000 -#define GlintStartXDomTag 0x0000 -#define GlintStartXDomReg 1 -#define GlintStartXDomOff 0x7000 -#define GlintStartXDomSec 0x8000 -#define GlintStartXDomSecReg 3 -#define GlintStartXDomSecOff 0x7000 - -#define GlintdXDom 0x8008 -#define GlintdXDomTag 0x0001 -#define GlintdXDomReg 1 -#define GlintdXDomOff 0x7008 -#define GlintdXDomSec 0x8008 -#define GlintdXDomSecReg 3 -#define GlintdXDomSecOff 0x7008 - -#define GlintStartXSub 0x8010 -#define GlintStartXSubTag 0x0002 -#define GlintStartXSubReg 1 -#define GlintStartXSubOff 0x7010 -#define GlintStartXSubSec 0x8010 -#define GlintStartXSubSecReg 3 -#define GlintStartXSubSecOff 0x7010 - -#define GlintdXSub 0x8018 -#define GlintdXSubTag 0x0003 -#define GlintdXSubReg 1 -#define GlintdXSubOff 0x7018 -#define GlintdXSubSec 0x8018 -#define GlintdXSubSecReg 3 -#define GlintdXSubSecOff 0x7018 - -#define GlintStartY 0x8020 -#define GlintStartYTag 0x0004 -#define GlintStartYReg 1 -#define GlintStartYOff 0x7020 -#define GlintStartYSec 0x8020 -#define GlintStartYSecReg 3 -#define GlintStartYSecOff 0x7020 - -#define GlintdY 0x8028 -#define GlintdYTag 0x0005 -#define GlintdYReg 1 -#define GlintdYOff 0x7028 -#define GlintdYSec 0x8028 -#define GlintdYSecReg 3 -#define GlintdYSecOff 0x7028 - -#define GlintGLINTCount 0x8030 -#define GlintGLINTCountTag 0x0006 -#define GlintGLINTCountReg 1 -#define GlintGLINTCountOff 0x7030 -#define GlintGLINTCountSec 0x8030 -#define GlintGLINTCountSecReg 3 -#define GlintGLINTCountSecOff 0x7030 - -#define GlintRender 0x8038 -#define GlintRenderTag 0x0007 -#define GlintRenderReg 1 -#define GlintRenderOff 0x7038 -#define GlintRenderSec 0x8038 -#define GlintRenderSecReg 3 -#define GlintRenderSecOff 0x7038 - -#define GlintContinueNewLine 0x8040 -#define GlintContinueNewLineTag 0x0008 -#define GlintContinueNewLineReg 1 -#define GlintContinueNewLineOff 0x7040 -#define GlintContinueNewLineSec 0x8040 -#define GlintContinueNewLineSecReg 3 -#define GlintContinueNewLineSecOff 0x7040 - -#define GlintContinueNewDom 0x8048 -#define GlintContinueNewDomTag 0x0009 -#define GlintContinueNewDomReg 1 -#define GlintContinueNewDomOff 0x7048 -#define GlintContinueNewDomSec 0x8048 -#define GlintContinueNewDomSecReg 3 -#define GlintContinueNewDomSecOff 0x7048 - -#define GlintContinueNewSub 0x8050 -#define GlintContinueNewSubTag 0x000a -#define GlintContinueNewSubReg 1 -#define GlintContinueNewSubOff 0x7050 -#define GlintContinueNewSubSec 0x8050 -#define GlintContinueNewSubSecReg 3 -#define GlintContinueNewSubSecOff 0x7050 - -#define GlintContinue 0x8058 -#define GlintContinueTag 0x000b -#define GlintContinueReg 1 -#define GlintContinueOff 0x7058 -#define GlintContinueSec 0x8058 -#define GlintContinueSecReg 3 -#define GlintContinueSecOff 0x7058 - -#define GlintFlushSpan 0x8060 -#define GlintFlushSpanTag 0x000c -#define GlintFlushSpanReg 1 -#define GlintFlushSpanOff 0x7060 -#define GlintFlushSpanSec 0x8060 -#define GlintFlushSpanSecReg 3 -#define GlintFlushSpanSecOff 0x7060 - -#define GlintBitMaskPattern 0x8068 -#define GlintBitMaskPatternTag 0x000d -#define GlintBitMaskPatternReg 1 -#define GlintBitMaskPatternOff 0x7068 -#define GlintBitMaskPatternSec 0x8068 -#define GlintBitMaskPatternSecReg 3 -#define GlintBitMaskPatternSecOff 0x7068 - -#define GlintPointTable0 0x8080 -#define GlintPointTable0Tag 0x0010 -#define GlintPointTable0Reg 1 -#define GlintPointTable0Off 0x7080 -#define GlintPointTable0Sec 0x8080 -#define GlintPointTable0SecReg 3 -#define GlintPointTable0SecOff 0x7080 - -#define GlintPointTable1 0x8088 -#define GlintPointTable1Tag 0x0011 -#define GlintPointTable1Reg 1 -#define GlintPointTable1Off 0x7088 -#define GlintPointTable1Sec 0x8088 -#define GlintPointTable1SecReg 3 -#define GlintPointTable1SecOff 0x7088 - -#define GlintPointTable2 0x8090 -#define GlintPointTable2Tag 0x0012 -#define GlintPointTable2Reg 1 -#define GlintPointTable2Off 0x7090 -#define GlintPointTable2Sec 0x8090 -#define GlintPointTable2SecReg 3 -#define GlintPointTable2SecOff 0x7090 - -#define GlintPointTable3 0x8098 -#define GlintPointTable3Tag 0x0013 -#define GlintPointTable3Reg 1 -#define GlintPointTable3Off 0x7098 -#define GlintPointTable3Sec 0x8098 -#define GlintPointTable3SecReg 3 -#define GlintPointTable3SecOff 0x7098 - -#define GlintRasterizerMode 0x80a0 -#define GlintRasterizerModeTag 0x0014 -#define GlintRasterizerModeReg 1 -#define GlintRasterizerModeOff 0x70a0 -#define GlintRasterizerModeSec 0x80a0 -#define GlintRasterizerModeSecReg 3 -#define GlintRasterizerModeSecOff 0x70a0 - -#define GlintYLimits 0x80a8 -#define GlintYLimitsTag 0x0015 -#define GlintYLimitsReg 1 -#define GlintYLimitsOff 0x70a8 -#define GlintYLimitsSec 0x80a8 -#define GlintYLimitsSecReg 3 -#define GlintYLimitsSecOff 0x70a8 - -#define GlintScanLineOwnership 0x80b0 -#define GlintScanLineOwnershipTag 0x0016 -#define GlintScanLineOwnershipReg 1 -#define GlintScanLineOwnershipOff 0x70b0 -#define GlintScanLineOwnershipSec 0x80b0 -#define GlintScanLineOwnershipSecReg 3 -#define GlintScanLineOwnershipSecOff 0x70b0 - -#define GlintWaitForCompletion 0x80b8 -#define GlintWaitForCompletionTag 0x0017 -#define GlintWaitForCompletionReg 1 -#define GlintWaitForCompletionOff 0x70b8 -#define GlintWaitForCompletionSec 0x80b8 -#define GlintWaitForCompletionSecReg 3 -#define GlintWaitForCompletionSecOff 0x70b8 - -#define GlintPixelSize 0x80c0 -#define GlintPixelSizeTag 0x0018 -#define GlintPixelSizeReg 1 -#define GlintPixelSizeOff 0x70c0 -#define GlintPixelSizeSec 0x80c0 -#define GlintPixelSizeSecReg 3 -#define GlintPixelSizeSecOff 0x70c0 - -#define GlintScissorMode 0x8180 -#define GlintScissorModeTag 0x0030 -#define GlintScissorModeReg 1 -#define GlintScissorModeOff 0x7180 -#define GlintScissorModeSec 0x8180 -#define GlintScissorModeSecReg 3 -#define GlintScissorModeSecOff 0x7180 - -#define GlintScissorMinXY 0x8188 -#define GlintScissorMinXYTag 0x0031 -#define GlintScissorMinXYReg 1 -#define GlintScissorMinXYOff 0x7188 -#define GlintScissorMinXYSec 0x8188 -#define GlintScissorMinXYSecReg 3 -#define GlintScissorMinXYSecOff 0x7188 - -#define GlintScissorMaxXY 0x8190 -#define GlintScissorMaxXYTag 0x0032 -#define GlintScissorMaxXYReg 1 -#define GlintScissorMaxXYOff 0x7190 -#define GlintScissorMaxXYSec 0x8190 -#define GlintScissorMaxXYSecReg 3 -#define GlintScissorMaxXYSecOff 0x7190 - -#define GlintScreenSize 0x8198 -#define GlintScreenSizeTag 0x0033 -#define GlintScreenSizeReg 1 -#define GlintScreenSizeOff 0x7198 -#define GlintScreenSizeSec 0x8198 -#define GlintScreenSizeSecReg 3 -#define GlintScreenSizeSecOff 0x7198 - -#define GlintAreaStippleMode 0x81a0 -#define GlintAreaStippleModeTag 0x0034 -#define GlintAreaStippleModeReg 1 -#define GlintAreaStippleModeOff 0x71a0 -#define GlintAreaStippleModeSec 0x81a0 -#define GlintAreaStippleModeSecReg 3 -#define GlintAreaStippleModeSecOff 0x71a0 - -#define GlintLineStippleMode 0x81a8 -#define GlintLineStippleModeTag 0x0035 -#define GlintLineStippleModeReg 1 -#define GlintLineStippleModeOff 0x71a8 -#define GlintLineStippleModeSec 0x81a8 -#define GlintLineStippleModeSecReg 3 -#define GlintLineStippleModeSecOff 0x71a8 - -#define GlintLoadLineStippleCounters 0x81b0 -#define GlintLoadLineStippleCountersTag 0x0036 -#define GlintLoadLineStippleCountersReg 1 -#define GlintLoadLineStippleCountersOff 0x71b0 -#define GlintLoadLineStippleCountersSec 0x81b0 -#define GlintLoadLineStippleCountersSecReg 3 -#define GlintLoadLineStippleCountersSecOff 0x71b0 - -#define GlintUpdateLineStippleCounters 0x81b8 -#define GlintUpdateLineStippleCountersTag 0x0037 -#define GlintUpdateLineStippleCountersReg 1 -#define GlintUpdateLineStippleCountersOff 0x71b8 -#define GlintUpdateLineStippleCountersSec 0x81b8 -#define GlintUpdateLineStippleCountersSecReg 3 -#define GlintUpdateLineStippleCountersSecOff 0x71b8 - -#define GlintSaveLineStippleState 0x81c0 -#define GlintSaveLineStippleStateTag 0x0038 -#define GlintSaveLineStippleStateReg 1 -#define GlintSaveLineStippleStateOff 0x71c0 -#define GlintSaveLineStippleStateSec 0x81c0 -#define GlintSaveLineStippleStateSecReg 3 -#define GlintSaveLineStippleStateSecOff 0x71c0 - -#define GlintWindowOrigin 0x81c8 -#define GlintWindowOriginTag 0x0039 -#define GlintWindowOriginReg 1 -#define GlintWindowOriginOff 0x71c8 -#define GlintWindowOriginSec 0x81c8 -#define GlintWindowOriginSecReg 3 -#define GlintWindowOriginSecOff 0x71c8 - -#define GlintAreaStipplePattern0 0x8200 -#define GlintAreaStipplePattern0Tag 0x0040 -#define GlintAreaStipplePattern0Reg 1 -#define GlintAreaStipplePattern0Off 0x7200 -#define GlintAreaStipplePattern0Sec 0x8200 -#define GlintAreaStipplePattern0SecReg 3 -#define GlintAreaStipplePattern0SecOff 0x7200 - -#define GlintAreaStipplePattern1 0x8208 -#define GlintAreaStipplePattern1Tag 0x0041 -#define GlintAreaStipplePattern1Reg 1 -#define GlintAreaStipplePattern1Off 0x7208 -#define GlintAreaStipplePattern1Sec 0x8208 -#define GlintAreaStipplePattern1SecReg 3 -#define GlintAreaStipplePattern1SecOff 0x7208 - -#define GlintAreaStipplePattern2 0x8210 -#define GlintAreaStipplePattern2Tag 0x0042 -#define GlintAreaStipplePattern2Reg 1 -#define GlintAreaStipplePattern2Off 0x7210 -#define GlintAreaStipplePattern2Sec 0x8210 -#define GlintAreaStipplePattern2SecReg 3 -#define GlintAreaStipplePattern2SecOff 0x7210 - -#define GlintAreaStipplePattern3 0x8218 -#define GlintAreaStipplePattern3Tag 0x0043 -#define GlintAreaStipplePattern3Reg 1 -#define GlintAreaStipplePattern3Off 0x7218 -#define GlintAreaStipplePattern3Sec 0x8218 -#define GlintAreaStipplePattern3SecReg 3 -#define GlintAreaStipplePattern3SecOff 0x7218 - -#define GlintAreaStipplePattern4 0x8220 -#define GlintAreaStipplePattern4Tag 0x0044 -#define GlintAreaStipplePattern4Reg 1 -#define GlintAreaStipplePattern4Off 0x7220 -#define GlintAreaStipplePattern4Sec 0x8220 -#define GlintAreaStipplePattern4SecReg 3 -#define GlintAreaStipplePattern4SecOff 0x7220 - -#define GlintAreaStipplePattern5 0x8228 -#define GlintAreaStipplePattern5Tag 0x0045 -#define GlintAreaStipplePattern5Reg 1 -#define GlintAreaStipplePattern5Off 0x7228 -#define GlintAreaStipplePattern5Sec 0x8228 -#define GlintAreaStipplePattern5SecReg 3 -#define GlintAreaStipplePattern5SecOff 0x7228 - -#define GlintAreaStipplePattern6 0x8230 -#define GlintAreaStipplePattern6Tag 0x0046 -#define GlintAreaStipplePattern6Reg 1 -#define GlintAreaStipplePattern6Off 0x7230 -#define GlintAreaStipplePattern6Sec 0x8230 -#define GlintAreaStipplePattern6SecReg 3 -#define GlintAreaStipplePattern6SecOff 0x7230 - -#define GlintAreaStipplePattern7 0x8238 -#define GlintAreaStipplePattern7Tag 0x0047 -#define GlintAreaStipplePattern7Reg 1 -#define GlintAreaStipplePattern7Off 0x7238 -#define GlintAreaStipplePattern7Sec 0x8238 -#define GlintAreaStipplePattern7SecReg 3 -#define GlintAreaStipplePattern7SecOff 0x7238 - -#define GlintAreaStipplePattern8 0x8240 -#define GlintAreaStipplePattern8Tag 0x0048 -#define GlintAreaStipplePattern8Reg 1 -#define GlintAreaStipplePattern8Off 0x7240 -#define GlintAreaStipplePattern8Sec 0x8240 -#define GlintAreaStipplePattern8SecReg 3 -#define GlintAreaStipplePattern8SecOff 0x7240 - -#define GlintAreaStipplePattern9 0x8248 -#define GlintAreaStipplePattern9Tag 0x0049 -#define GlintAreaStipplePattern9Reg 1 -#define GlintAreaStipplePattern9Off 0x7248 -#define GlintAreaStipplePattern9Sec 0x8248 -#define GlintAreaStipplePattern9SecReg 3 -#define GlintAreaStipplePattern9SecOff 0x7248 - -#define GlintAreaStipplePattern10 0x8250 -#define GlintAreaStipplePattern10Tag 0x004a -#define GlintAreaStipplePattern10Reg 1 -#define GlintAreaStipplePattern10Off 0x7250 -#define GlintAreaStipplePattern10Sec 0x8250 -#define GlintAreaStipplePattern10SecReg 3 -#define GlintAreaStipplePattern10SecOff 0x7250 - -#define GlintAreaStipplePattern11 0x8258 -#define GlintAreaStipplePattern11Tag 0x004b -#define GlintAreaStipplePattern11Reg 1 -#define GlintAreaStipplePattern11Off 0x7258 -#define GlintAreaStipplePattern11Sec 0x8258 -#define GlintAreaStipplePattern11SecReg 3 -#define GlintAreaStipplePattern11SecOff 0x7258 - -#define GlintAreaStipplePattern12 0x8260 -#define GlintAreaStipplePattern12Tag 0x004c -#define GlintAreaStipplePattern12Reg 1 -#define GlintAreaStipplePattern12Off 0x7260 -#define GlintAreaStipplePattern12Sec 0x8260 -#define GlintAreaStipplePattern12SecReg 3 -#define GlintAreaStipplePattern12SecOff 0x7260 - -#define GlintAreaStipplePattern13 0x8268 -#define GlintAreaStipplePattern13Tag 0x004d -#define GlintAreaStipplePattern13Reg 1 -#define GlintAreaStipplePattern13Off 0x7268 -#define GlintAreaStipplePattern13Sec 0x8268 -#define GlintAreaStipplePattern13SecReg 3 -#define GlintAreaStipplePattern13SecOff 0x7268 - -#define GlintAreaStipplePattern14 0x8270 -#define GlintAreaStipplePattern14Tag 0x004e -#define GlintAreaStipplePattern14Reg 1 -#define GlintAreaStipplePattern14Off 0x7270 -#define GlintAreaStipplePattern14Sec 0x8270 -#define GlintAreaStipplePattern14SecReg 3 -#define GlintAreaStipplePattern14SecOff 0x7270 - -#define GlintAreaStipplePattern15 0x8278 -#define GlintAreaStipplePattern15Tag 0x004f -#define GlintAreaStipplePattern15Reg 1 -#define GlintAreaStipplePattern15Off 0x7278 -#define GlintAreaStipplePattern15Sec 0x8278 -#define GlintAreaStipplePattern15SecReg 3 -#define GlintAreaStipplePattern15SecOff 0x7278 - -#define GlintAreaStipplePattern16 0x8280 -#define GlintAreaStipplePattern16Tag 0x0050 -#define GlintAreaStipplePattern16Reg 1 -#define GlintAreaStipplePattern16Off 0x7280 -#define GlintAreaStipplePattern16Sec 0x8280 -#define GlintAreaStipplePattern16SecReg 3 -#define GlintAreaStipplePattern16SecOff 0x7280 - -#define GlintAreaStipplePattern17 0x8288 -#define GlintAreaStipplePattern17Tag 0x0051 -#define GlintAreaStipplePattern17Reg 1 -#define GlintAreaStipplePattern17Off 0x7288 -#define GlintAreaStipplePattern17Sec 0x8288 -#define GlintAreaStipplePattern17SecReg 3 -#define GlintAreaStipplePattern17SecOff 0x7288 - -#define GlintAreaStipplePattern18 0x8290 -#define GlintAreaStipplePattern18Tag 0x0052 -#define GlintAreaStipplePattern18Reg 1 -#define GlintAreaStipplePattern18Off 0x7290 -#define GlintAreaStipplePattern18Sec 0x8290 -#define GlintAreaStipplePattern18SecReg 3 -#define GlintAreaStipplePattern18SecOff 0x7290 - -#define GlintAreaStipplePattern19 0x8298 -#define GlintAreaStipplePattern19Tag 0x0053 -#define GlintAreaStipplePattern19Reg 1 -#define GlintAreaStipplePattern19Off 0x7298 -#define GlintAreaStipplePattern19Sec 0x8298 -#define GlintAreaStipplePattern19SecReg 3 -#define GlintAreaStipplePattern19SecOff 0x7298 - -#define GlintAreaStipplePattern20 0x82a0 -#define GlintAreaStipplePattern20Tag 0x0054 -#define GlintAreaStipplePattern20Reg 1 -#define GlintAreaStipplePattern20Off 0x72a0 -#define GlintAreaStipplePattern20Sec 0x82a0 -#define GlintAreaStipplePattern20SecReg 3 -#define GlintAreaStipplePattern20SecOff 0x72a0 - -#define GlintAreaStipplePattern21 0x82a8 -#define GlintAreaStipplePattern21Tag 0x0055 -#define GlintAreaStipplePattern21Reg 1 -#define GlintAreaStipplePattern21Off 0x72a8 -#define GlintAreaStipplePattern21Sec 0x82a8 -#define GlintAreaStipplePattern21SecReg 3 -#define GlintAreaStipplePattern21SecOff 0x72a8 - -#define GlintAreaStipplePattern22 0x82b0 -#define GlintAreaStipplePattern22Tag 0x0056 -#define GlintAreaStipplePattern22Reg 1 -#define GlintAreaStipplePattern22Off 0x72b0 -#define GlintAreaStipplePattern22Sec 0x82b0 -#define GlintAreaStipplePattern22SecReg 3 -#define GlintAreaStipplePattern22SecOff 0x72b0 - -#define GlintAreaStipplePattern23 0x82b8 -#define GlintAreaStipplePattern23Tag 0x0057 -#define GlintAreaStipplePattern23Reg 1 -#define GlintAreaStipplePattern23Off 0x72b8 -#define GlintAreaStipplePattern23Sec 0x82b8 -#define GlintAreaStipplePattern23SecReg 3 -#define GlintAreaStipplePattern23SecOff 0x72b8 - -#define GlintAreaStipplePattern24 0x82c0 -#define GlintAreaStipplePattern24Tag 0x0058 -#define GlintAreaStipplePattern24Reg 1 -#define GlintAreaStipplePattern24Off 0x72c0 -#define GlintAreaStipplePattern24Sec 0x82c0 -#define GlintAreaStipplePattern24SecReg 3 -#define GlintAreaStipplePattern24SecOff 0x72c0 - -#define GlintAreaStipplePattern25 0x82c8 -#define GlintAreaStipplePattern25Tag 0x0059 -#define GlintAreaStipplePattern25Reg 1 -#define GlintAreaStipplePattern25Off 0x72c8 -#define GlintAreaStipplePattern25Sec 0x82c8 -#define GlintAreaStipplePattern25SecReg 3 -#define GlintAreaStipplePattern25SecOff 0x72c8 - -#define GlintAreaStipplePattern26 0x82d0 -#define GlintAreaStipplePattern26Tag 0x005a -#define GlintAreaStipplePattern26Reg 1 -#define GlintAreaStipplePattern26Off 0x72d0 -#define GlintAreaStipplePattern26Sec 0x82d0 -#define GlintAreaStipplePattern26SecReg 3 -#define GlintAreaStipplePattern26SecOff 0x72d0 - -#define GlintAreaStipplePattern27 0x82d8 -#define GlintAreaStipplePattern27Tag 0x005b -#define GlintAreaStipplePattern27Reg 1 -#define GlintAreaStipplePattern27Off 0x72d8 -#define GlintAreaStipplePattern27Sec 0x82d8 -#define GlintAreaStipplePattern27SecReg 3 -#define GlintAreaStipplePattern27SecOff 0x72d8 - -#define GlintAreaStipplePattern28 0x82e0 -#define GlintAreaStipplePattern28Tag 0x005c -#define GlintAreaStipplePattern28Reg 1 -#define GlintAreaStipplePattern28Off 0x72e0 -#define GlintAreaStipplePattern28Sec 0x82e0 -#define GlintAreaStipplePattern28SecReg 3 -#define GlintAreaStipplePattern28SecOff 0x72e0 - -#define GlintAreaStipplePattern29 0x82e8 -#define GlintAreaStipplePattern29Tag 0x005d -#define GlintAreaStipplePattern29Reg 1 -#define GlintAreaStipplePattern29Off 0x72e8 -#define GlintAreaStipplePattern29Sec 0x82e8 -#define GlintAreaStipplePattern29SecReg 3 -#define GlintAreaStipplePattern29SecOff 0x72e8 - -#define GlintAreaStipplePattern30 0x82f0 -#define GlintAreaStipplePattern30Tag 0x005e -#define GlintAreaStipplePattern30Reg 1 -#define GlintAreaStipplePattern30Off 0x72f0 -#define GlintAreaStipplePattern30Sec 0x82f0 -#define GlintAreaStipplePattern30SecReg 3 -#define GlintAreaStipplePattern30SecOff 0x72f0 - -#define GlintAreaStipplePattern31 0x82f8 -#define GlintAreaStipplePattern31Tag 0x005f -#define GlintAreaStipplePattern31Reg 1 -#define GlintAreaStipplePattern31Off 0x72f8 -#define GlintAreaStipplePattern31Sec 0x82f8 -#define GlintAreaStipplePattern31SecReg 3 -#define GlintAreaStipplePattern31SecOff 0x72f8 - -#define GlintRouterMode 0x8840 -#define GlintRouterModeTag 0x0108 -#define GlintRouterModeReg 1 -#define GlintRouterModeOff 0x7840 -#define GlintRouterModeSec 0x8840 -#define GlintRouterModeSecReg 3 -#define GlintRouterModeSecOff 0x7840 - -#define GlintTextureAddressMode 0x8380 -#define GlintTextureAddressModeTag 0x0070 -#define GlintTextureAddressModeReg 1 -#define GlintTextureAddressModeOff 0x7380 -#define GlintTextureAddressModeSec 0x8380 -#define GlintTextureAddressModeSecReg 3 -#define GlintTextureAddressModeSecOff 0x7380 - -#define GlintSStart 0x8388 -#define GlintSStartTag 0x0071 -#define GlintSStartReg 1 -#define GlintSStartOff 0x7388 -#define GlintSStartSec 0x8388 -#define GlintSStartSecReg 3 -#define GlintSStartSecOff 0x7388 - -#define GlintdSdx 0x8390 -#define GlintdSdxTag 0x0072 -#define GlintdSdxReg 1 -#define GlintdSdxOff 0x7390 -#define GlintdSdxSec 0x8390 -#define GlintdSdxSecReg 3 -#define GlintdSdxSecOff 0x7390 - -#define GlintdSdyDom 0x8398 -#define GlintdSdyDomTag 0x0073 -#define GlintdSdyDomReg 1 -#define GlintdSdyDomOff 0x7398 -#define GlintdSdyDomSec 0x8398 -#define GlintdSdyDomSecReg 3 -#define GlintdSdyDomSecOff 0x7398 - -#define GlintTStart 0x83a0 -#define GlintTStartTag 0x0074 -#define GlintTStartReg 1 -#define GlintTStartOff 0x73a0 -#define GlintTStartSec 0x83a0 -#define GlintTStartSecReg 3 -#define GlintTStartSecOff 0x73a0 - -#define GlintdTdx 0x83a8 -#define GlintdTdxTag 0x0075 -#define GlintdTdxReg 1 -#define GlintdTdxOff 0x73a8 -#define GlintdTdxSec 0x83a8 -#define GlintdTdxSecReg 3 -#define GlintdTdxSecOff 0x73a8 - -#define GlintdTdyDom 0x83b0 -#define GlintdTdyDomTag 0x0076 -#define GlintdTdyDomReg 1 -#define GlintdTdyDomOff 0x73b0 -#define GlintdTdyDomSec 0x83b0 -#define GlintdTdyDomSecReg 3 -#define GlintdTdyDomSecOff 0x73b0 - -#define GlintQStart 0x83b8 -#define GlintQStartTag 0x0077 -#define GlintQStartReg 1 -#define GlintQStartOff 0x73b8 -#define GlintQStartSec 0x83b8 -#define GlintQStartSecReg 3 -#define GlintQStartSecOff 0x73b8 - -#define GlintdQdx 0x83c0 -#define GlintdQdxTag 0x0078 -#define GlintdQdxReg 1 -#define GlintdQdxOff 0x73c0 -#define GlintdQdxSec 0x83c0 -#define GlintdQdxSecReg 3 -#define GlintdQdxSecOff 0x73c0 - -#define GlintdQdyDom 0x83c8 -#define GlintdQdyDomTag 0x0079 -#define GlintdQdyDomReg 1 -#define GlintdQdyDomOff 0x73c8 -#define GlintdQdyDomSec 0x83c8 -#define GlintdQdyDomSecReg 3 -#define GlintdQdyDomSecOff 0x73c8 - -#define GlintLOD 0x83d0 -#define GlintLODTag 0x007a -#define GlintLODReg 1 -#define GlintLODOff 0x73d0 -#define GlintLODSec 0x83d0 -#define GlintLODSecReg 3 -#define GlintLODSecOff 0x73d0 - -#define GlintdSdy 0x83d8 -#define GlintdSdyTag 0x007b -#define GlintdSdyReg 1 -#define GlintdSdyOff 0x73d8 -#define GlintdSdySec 0x83d8 -#define GlintdSdySecReg 3 -#define GlintdSdySecOff 0x73d8 - -#define GlintdTdy 0x83e0 -#define GlintdTdyTag 0x007c -#define GlintdTdyReg 1 -#define GlintdTdyOff 0x73e0 -#define GlintdTdySec 0x83e0 -#define GlintdTdySecReg 3 -#define GlintdTdySecOff 0x73e0 - -#define GlintdQdy 0x83e8 -#define GlintdQdyTag 0x007d -#define GlintdQdyReg 1 -#define GlintdQdyOff 0x73e8 -#define GlintdQdySec 0x83e8 -#define GlintdQdySecReg 3 -#define GlintdQdySecOff 0x73e8 - -#define GlintTextureReadMode 0x8480 -#define GlintTextureReadModeTag 0x0090 -#define GlintTextureReadModeReg 1 -#define GlintTextureReadModeOff 0x7480 -#define GlintTextureReadModeSec 0x8480 -#define GlintTextureReadModeSecReg 3 -#define GlintTextureReadModeSecOff 0x7480 - -#define GlintTextureFormat 0x8488 -#define GlintTextureFormatTag 0x0091 -#define GlintTextureFormatReg 1 -#define GlintTextureFormatOff 0x7488 -#define GlintTextureFormatSec 0x8488 -#define GlintTextureFormatSecReg 3 -#define GlintTextureFormatSecOff 0x7488 - -#define GlintTextureCacheControl 0x8490 -#define GlintTextureCacheControlTag 0x0092 -#define GlintTextureCacheControlReg 1 -#define GlintTextureCacheControlOff 0x7490 -#define GlintTextureCacheControlSec 0x8490 -#define GlintTextureCacheControlSecReg 3 -#define GlintTextureCacheControlSecOff 0x7490 - -#define GlintGLINTBorderColor 0x84a8 -#define GlintGLINTBorderColorTag 0x0095 -#define GlintGLINTBorderColorReg 1 -#define GlintGLINTBorderColorOff 0x74a8 -#define GlintGLINTBorderColorSec 0x84a8 -#define GlintGLINTBorderColorSecReg 3 -#define GlintGLINTBorderColorSecOff 0x74a8 - -#define GlintTexelLUTIndex 0x84c0 -#define GlintTexelLUTIndexTag 0x0098 -#define GlintTexelLUTIndexReg 1 -#define GlintTexelLUTIndexOff 0x74c0 -#define GlintTexelLUTIndexSec 0x84c0 -#define GlintTexelLUTIndexSecReg 3 -#define GlintTexelLUTIndexSecOff 0x74c0 - -#define GlintTexelLUTData 0x84c8 -#define GlintTexelLUTDataTag 0x0099 -#define GlintTexelLUTDataReg 1 -#define GlintTexelLUTDataOff 0x74c8 -#define GlintTexelLUTDataSec 0x84c8 -#define GlintTexelLUTDataSecReg 3 -#define GlintTexelLUTDataSecOff 0x74c8 - -#define GlintTexelLUTAddress 0x84d0 -#define GlintTexelLUTAddressTag 0x009a -#define GlintTexelLUTAddressReg 1 -#define GlintTexelLUTAddressOff 0x74d0 -#define GlintTexelLUTAddressSec 0x84d0 -#define GlintTexelLUTAddressSecReg 3 -#define GlintTexelLUTAddressSecOff 0x74d0 - -#define GlintTexelLUTTransfer 0x84d8 -#define GlintTexelLUTTransferTag 0x009b -#define GlintTexelLUTTransferReg 1 -#define GlintTexelLUTTransferOff 0x74d8 -#define GlintTexelLUTTransferSec 0x84d8 -#define GlintTexelLUTTransferSecReg 3 -#define GlintTexelLUTTransferSecOff 0x74d8 - -#define GlintTextureFilterMode 0x84e0 -#define GlintTextureFilterModeTag 0x009c -#define GlintTextureFilterModeReg 1 -#define GlintTextureFilterModeOff 0x74e0 -#define GlintTextureFilterModeSec 0x84e0 -#define GlintTextureFilterModeSecReg 3 -#define GlintTextureFilterModeSecOff 0x74e0 - -#define GlintTextureChromaUpper 0x84e8 -#define GlintTextureChromaUpperTag 0x009d -#define GlintTextureChromaUpperReg 1 -#define GlintTextureChromaUpperOff 0x74e8 -#define GlintTextureChromaUpperSec 0x84e8 -#define GlintTextureChromaUpperSecReg 3 -#define GlintTextureChromaUpperSecOff 0x74e8 - -#define GlintTextureChromaLower 0x84f0 -#define GlintTextureChromaLowerTag 0x009e -#define GlintTextureChromaLowerReg 1 -#define GlintTextureChromaLowerOff 0x74f0 -#define GlintTextureChromaLowerSec 0x84f0 -#define GlintTextureChromaLowerSecReg 3 -#define GlintTextureChromaLowerSecOff 0x74f0 - -#define GlintTxBaseAddr0 0x8500 -#define GlintTxBaseAddr0Tag 0x00a0 -#define GlintTxBaseAddr0Reg 1 -#define GlintTxBaseAddr0Off 0x7500 -#define GlintTxBaseAddr0Sec 0x8500 -#define GlintTxBaseAddr0SecReg 3 -#define GlintTxBaseAddr0SecOff 0x7500 - -#define GlintTxBaseAddr1 0x8508 -#define GlintTxBaseAddr1Tag 0x00a1 -#define GlintTxBaseAddr1Reg 1 -#define GlintTxBaseAddr1Off 0x7508 -#define GlintTxBaseAddr1Sec 0x8508 -#define GlintTxBaseAddr1SecReg 3 -#define GlintTxBaseAddr1SecOff 0x7508 - -#define GlintTxBaseAddr2 0x8510 -#define GlintTxBaseAddr2Tag 0x00a2 -#define GlintTxBaseAddr2Reg 1 -#define GlintTxBaseAddr2Off 0x7510 -#define GlintTxBaseAddr2Sec 0x8510 -#define GlintTxBaseAddr2SecReg 3 -#define GlintTxBaseAddr2SecOff 0x7510 - -#define GlintTxBaseAddr3 0x8518 -#define GlintTxBaseAddr3Tag 0x00a3 -#define GlintTxBaseAddr3Reg 1 -#define GlintTxBaseAddr3Off 0x7518 -#define GlintTxBaseAddr3Sec 0x8518 -#define GlintTxBaseAddr3SecReg 3 -#define GlintTxBaseAddr3SecOff 0x7518 - -#define GlintTxBaseAddr4 0x8520 -#define GlintTxBaseAddr4Tag 0x00a4 -#define GlintTxBaseAddr4Reg 1 -#define GlintTxBaseAddr4Off 0x7520 -#define GlintTxBaseAddr4Sec 0x8520 -#define GlintTxBaseAddr4SecReg 3 -#define GlintTxBaseAddr4SecOff 0x7520 - -#define GlintTxBaseAddr5 0x8528 -#define GlintTxBaseAddr5Tag 0x00a5 -#define GlintTxBaseAddr5Reg 1 -#define GlintTxBaseAddr5Off 0x7528 -#define GlintTxBaseAddr5Sec 0x8528 -#define GlintTxBaseAddr5SecReg 3 -#define GlintTxBaseAddr5SecOff 0x7528 - -#define GlintTxBaseAddr6 0x8530 -#define GlintTxBaseAddr6Tag 0x00a6 -#define GlintTxBaseAddr6Reg 1 -#define GlintTxBaseAddr6Off 0x7530 -#define GlintTxBaseAddr6Sec 0x8530 -#define GlintTxBaseAddr6SecReg 3 -#define GlintTxBaseAddr6SecOff 0x7530 - -#define GlintTxBaseAddr7 0x8538 -#define GlintTxBaseAddr7Tag 0x00a7 -#define GlintTxBaseAddr7Reg 1 -#define GlintTxBaseAddr7Off 0x7538 -#define GlintTxBaseAddr7Sec 0x8538 -#define GlintTxBaseAddr7SecReg 3 -#define GlintTxBaseAddr7SecOff 0x7538 - -#define GlintTxBaseAddr8 0x8540 -#define GlintTxBaseAddr8Tag 0x00a8 -#define GlintTxBaseAddr8Reg 1 -#define GlintTxBaseAddr8Off 0x7540 -#define GlintTxBaseAddr8Sec 0x8540 -#define GlintTxBaseAddr8SecReg 3 -#define GlintTxBaseAddr8SecOff 0x7540 - -#define GlintTxBaseAddr9 0x8548 -#define GlintTxBaseAddr9Tag 0x00a9 -#define GlintTxBaseAddr9Reg 1 -#define GlintTxBaseAddr9Off 0x7548 -#define GlintTxBaseAddr9Sec 0x8548 -#define GlintTxBaseAddr9SecReg 3 -#define GlintTxBaseAddr9SecOff 0x7548 - -#define GlintTxBaseAddr10 0x8550 -#define GlintTxBaseAddr10Tag 0x00aa -#define GlintTxBaseAddr10Reg 1 -#define GlintTxBaseAddr10Off 0x7550 -#define GlintTxBaseAddr10Sec 0x8550 -#define GlintTxBaseAddr10SecReg 3 -#define GlintTxBaseAddr10SecOff 0x7550 - -#define GlintTxBaseAddr11 0x8558 -#define GlintTxBaseAddr11Tag 0x00ab -#define GlintTxBaseAddr11Reg 1 -#define GlintTxBaseAddr11Off 0x7558 -#define GlintTxBaseAddr11Sec 0x8558 -#define GlintTxBaseAddr11SecReg 3 -#define GlintTxBaseAddr11SecOff 0x7558 - -#define GlintTxBaseAddr12 0x8560 -#define GlintTxBaseAddr12Tag 0x00ac -#define GlintTxBaseAddr12Reg 1 -#define GlintTxBaseAddr12Off 0x7560 -#define GlintTxBaseAddr12Sec 0x8560 -#define GlintTxBaseAddr12SecReg 3 -#define GlintTxBaseAddr12SecOff 0x7560 - -#define GlintTexelLUT0 0x8e80 -#define GlintTexelLUT0Tag 0x01d0 -#define GlintTexelLUT0Reg 1 -#define GlintTexelLUT0Off 0x7e80 -#define GlintTexelLUT0Sec 0x8e80 -#define GlintTexelLUT0SecReg 3 -#define GlintTexelLUT0SecOff 0x7e80 - -#define GlintTexelLUT1 0x8e88 -#define GlintTexelLUT1Tag 0x01d1 -#define GlintTexelLUT1Reg 1 -#define GlintTexelLUT1Off 0x7e88 -#define GlintTexelLUT1Sec 0x8e88 -#define GlintTexelLUT1SecReg 3 -#define GlintTexelLUT1SecOff 0x7e88 - -#define GlintTexelLUT2 0x8e90 -#define GlintTexelLUT2Tag 0x01d2 -#define GlintTexelLUT2Reg 1 -#define GlintTexelLUT2Off 0x7e90 -#define GlintTexelLUT2Sec 0x8e90 -#define GlintTexelLUT2SecReg 3 -#define GlintTexelLUT2SecOff 0x7e90 - -#define GlintTexelLUT3 0x8e98 -#define GlintTexelLUT3Tag 0x01d3 -#define GlintTexelLUT3Reg 1 -#define GlintTexelLUT3Off 0x7e98 -#define GlintTexelLUT3Sec 0x8e98 -#define GlintTexelLUT3SecReg 3 -#define GlintTexelLUT3SecOff 0x7e98 - -#define GlintTexelLUT4 0x8ea0 -#define GlintTexelLUT4Tag 0x01d4 -#define GlintTexelLUT4Reg 1 -#define GlintTexelLUT4Off 0x7ea0 -#define GlintTexelLUT4Sec 0x8ea0 -#define GlintTexelLUT4SecReg 3 -#define GlintTexelLUT4SecOff 0x7ea0 - -#define GlintTexelLUT5 0x8ea8 -#define GlintTexelLUT5Tag 0x01d5 -#define GlintTexelLUT5Reg 1 -#define GlintTexelLUT5Off 0x7ea8 -#define GlintTexelLUT5Sec 0x8ea8 -#define GlintTexelLUT5SecReg 3 -#define GlintTexelLUT5SecOff 0x7ea8 - -#define GlintTexelLUT6 0x8eb0 -#define GlintTexelLUT6Tag 0x01d6 -#define GlintTexelLUT6Reg 1 -#define GlintTexelLUT6Off 0x7eb0 -#define GlintTexelLUT6Sec 0x8eb0 -#define GlintTexelLUT6SecReg 3 -#define GlintTexelLUT6SecOff 0x7eb0 - -#define GlintTexelLUT7 0x8eb8 -#define GlintTexelLUT7Tag 0x01d7 -#define GlintTexelLUT7Reg 1 -#define GlintTexelLUT7Off 0x7eb8 -#define GlintTexelLUT7Sec 0x8eb8 -#define GlintTexelLUT7SecReg 3 -#define GlintTexelLUT7SecOff 0x7eb8 - -#define GlintTexelLUT8 0x8ec0 -#define GlintTexelLUT8Tag 0x01d8 -#define GlintTexelLUT8Reg 1 -#define GlintTexelLUT8Off 0x7ec0 -#define GlintTexelLUT8Sec 0x8ec0 -#define GlintTexelLUT8SecReg 3 -#define GlintTexelLUT8SecOff 0x7ec0 - -#define GlintTexelLUT9 0x8ec8 -#define GlintTexelLUT9Tag 0x01d9 -#define GlintTexelLUT9Reg 1 -#define GlintTexelLUT9Off 0x7ec8 -#define GlintTexelLUT9Sec 0x8ec8 -#define GlintTexelLUT9SecReg 3 -#define GlintTexelLUT9SecOff 0x7ec8 - -#define GlintTexelLUT10 0x8ed0 -#define GlintTexelLUT10Tag 0x01da -#define GlintTexelLUT10Reg 1 -#define GlintTexelLUT10Off 0x7ed0 -#define GlintTexelLUT10Sec 0x8ed0 -#define GlintTexelLUT10SecReg 3 -#define GlintTexelLUT10SecOff 0x7ed0 - -#define GlintTexelLUT11 0x8ed8 -#define GlintTexelLUT11Tag 0x01db -#define GlintTexelLUT11Reg 1 -#define GlintTexelLUT11Off 0x7ed8 -#define GlintTexelLUT11Sec 0x8ed8 -#define GlintTexelLUT11SecReg 3 -#define GlintTexelLUT11SecOff 0x7ed8 - -#define GlintTexelLUT12 0x8ee0 -#define GlintTexelLUT12Tag 0x01dc -#define GlintTexelLUT12Reg 1 -#define GlintTexelLUT12Off 0x7ee0 -#define GlintTexelLUT12Sec 0x8ee0 -#define GlintTexelLUT12SecReg 3 -#define GlintTexelLUT12SecOff 0x7ee0 - -#define GlintTexelLUT13 0x8ee8 -#define GlintTexelLUT13Tag 0x01dd -#define GlintTexelLUT13Reg 1 -#define GlintTexelLUT13Off 0x7ee8 -#define GlintTexelLUT13Sec 0x8ee8 -#define GlintTexelLUT13SecReg 3 -#define GlintTexelLUT13SecOff 0x7ee8 - -#define GlintTexelLUT14 0x8ef0 -#define GlintTexelLUT14Tag 0x01de -#define GlintTexelLUT14Reg 1 -#define GlintTexelLUT14Off 0x7ef0 -#define GlintTexelLUT14Sec 0x8ef0 -#define GlintTexelLUT14SecReg 3 -#define GlintTexelLUT14SecOff 0x7ef0 - -#define GlintTexelLUT15 0x8ef8 -#define GlintTexelLUT15Tag 0x01df -#define GlintTexelLUT15Reg 1 -#define GlintTexelLUT15Off 0x7ef8 -#define GlintTexelLUT15Sec 0x8ef8 -#define GlintTexelLUT15SecReg 3 -#define GlintTexelLUT15SecOff 0x7ef8 - -#define GlintTexel0 0x8600 -#define GlintTexel0Tag 0x00c0 -#define GlintTexel0Reg 1 -#define GlintTexel0Off 0x7600 -#define GlintTexel0Sec 0x8600 -#define GlintTexel0SecReg 3 -#define GlintTexel0SecOff 0x7600 - -#define GlintTexel1 0x8608 -#define GlintTexel1Tag 0x00c1 -#define GlintTexel1Reg 1 -#define GlintTexel1Off 0x7608 -#define GlintTexel1Sec 0x8608 -#define GlintTexel1SecReg 3 -#define GlintTexel1SecOff 0x7608 - -#define GlintTexel2 0x8610 -#define GlintTexel2Tag 0x00c2 -#define GlintTexel2Reg 1 -#define GlintTexel2Off 0x7610 -#define GlintTexel2Sec 0x8610 -#define GlintTexel2SecReg 3 -#define GlintTexel2SecOff 0x7610 - -#define GlintTexel3 0x8618 -#define GlintTexel3Tag 0x00c3 -#define GlintTexel3Reg 1 -#define GlintTexel3Off 0x7618 -#define GlintTexel3Sec 0x8618 -#define GlintTexel3SecReg 3 -#define GlintTexel3SecOff 0x7618 - -#define GlintTexel4 0x8620 -#define GlintTexel4Tag 0x00c4 -#define GlintTexel4Reg 1 -#define GlintTexel4Off 0x7620 -#define GlintTexel4Sec 0x8620 -#define GlintTexel4SecReg 3 -#define GlintTexel4SecOff 0x7620 - -#define GlintTexel5 0x8628 -#define GlintTexel5Tag 0x00c5 -#define GlintTexel5Reg 1 -#define GlintTexel5Off 0x7628 -#define GlintTexel5Sec 0x8628 -#define GlintTexel5SecReg 3 -#define GlintTexel5SecOff 0x7628 - -#define GlintTexel6 0x8630 -#define GlintTexel6Tag 0x00c6 -#define GlintTexel6Reg 1 -#define GlintTexel6Off 0x7630 -#define GlintTexel6Sec 0x8630 -#define GlintTexel6SecReg 3 -#define GlintTexel6SecOff 0x7630 - -#define GlintTexel7 0x8638 -#define GlintTexel7Tag 0x00c7 -#define GlintTexel7Reg 1 -#define GlintTexel7Off 0x7638 -#define GlintTexel7Sec 0x8638 -#define GlintTexel7SecReg 3 -#define GlintTexel7SecOff 0x7638 - -#define GlintInterp0 0x8640 -#define GlintInterp0Tag 0x00c8 -#define GlintInterp0Reg 1 -#define GlintInterp0Off 0x7640 -#define GlintInterp0Sec 0x8640 -#define GlintInterp0SecReg 3 -#define GlintInterp0SecOff 0x7640 - -#define GlintInterp1 0x8648 -#define GlintInterp1Tag 0x00c9 -#define GlintInterp1Reg 1 -#define GlintInterp1Off 0x7648 -#define GlintInterp1Sec 0x8648 -#define GlintInterp1SecReg 3 -#define GlintInterp1SecOff 0x7648 - -#define GlintInterp2 0x8650 -#define GlintInterp2Tag 0x00ca -#define GlintInterp2Reg 1 -#define GlintInterp2Off 0x7650 -#define GlintInterp2Sec 0x8650 -#define GlintInterp2SecReg 3 -#define GlintInterp2SecOff 0x7650 - -#define GlintInterp3 0x8658 -#define GlintInterp3Tag 0x00cb -#define GlintInterp3Reg 1 -#define GlintInterp3Off 0x7658 -#define GlintInterp3Sec 0x8658 -#define GlintInterp3SecReg 3 -#define GlintInterp3SecOff 0x7658 - -#define GlintInterp4 0x8660 -#define GlintInterp4Tag 0x00cc -#define GlintInterp4Reg 1 -#define GlintInterp4Off 0x7660 -#define GlintInterp4Sec 0x8660 -#define GlintInterp4SecReg 3 -#define GlintInterp4SecOff 0x7660 - -#define GlintTextureFilter 0x8668 -#define GlintTextureFilterTag 0x00cd -#define GlintTextureFilterReg 1 -#define GlintTextureFilterOff 0x7668 -#define GlintTextureFilterSec 0x8668 -#define GlintTextureFilterSecReg 3 -#define GlintTextureFilterSecOff 0x7668 - -#define GlintTextureColorMode 0x8680 -#define GlintTextureColorModeTag 0x00d0 -#define GlintTextureColorModeReg 1 -#define GlintTextureColorModeOff 0x7680 -#define GlintTextureColorModeSec 0x8680 -#define GlintTextureColorModeSecReg 3 -#define GlintTextureColorModeSecOff 0x7680 - -#define GlintTextureEnvColor 0x8688 -#define GlintTextureEnvColorTag 0x00d1 -#define GlintTextureEnvColorReg 1 -#define GlintTextureEnvColorOff 0x7688 -#define GlintTextureEnvColorSec 0x8688 -#define GlintTextureEnvColorSecReg 3 -#define GlintTextureEnvColorSecOff 0x7688 - -#define GlintFogMode 0x8690 -#define GlintFogModeTag 0x00d2 -#define GlintFogModeReg 1 -#define GlintFogModeOff 0x7690 -#define GlintFogModeSec 0x8690 -#define GlintFogModeSecReg 3 -#define GlintFogModeSecOff 0x7690 - -#define GlintFogColor 0x8698 -#define GlintFogColorTag 0x00d3 -#define GlintFogColorReg 1 -#define GlintFogColorOff 0x7698 -#define GlintFogColorSec 0x8698 -#define GlintFogColorSecReg 3 -#define GlintFogColorSecOff 0x7698 - -#define GlintFStart 0x86a0 -#define GlintFStartTag 0x00d4 -#define GlintFStartReg 1 -#define GlintFStartOff 0x76a0 -#define GlintFStartSec 0x86a0 -#define GlintFStartSecReg 3 -#define GlintFStartSecOff 0x76a0 - -#define GlintdFdx 0x86a8 -#define GlintdFdxTag 0x00d5 -#define GlintdFdxReg 1 -#define GlintdFdxOff 0x76a8 -#define GlintdFdxSec 0x86a8 -#define GlintdFdxSecReg 3 -#define GlintdFdxSecOff 0x76a8 - -#define GlintdFdyDom 0x86b0 -#define GlintdFdyDomTag 0x00d6 -#define GlintdFdyDomReg 1 -#define GlintdFdyDomOff 0x76b0 -#define GlintdFdyDomSec 0x86b0 -#define GlintdFdyDomSecReg 3 -#define GlintdFdyDomSecOff 0x76b0 - -#define GlintKsStart 0x86c8 -#define GlintKsStartTag 0x00d9 -#define GlintKsStartReg 1 -#define GlintKsStartOff 0x76c8 -#define GlintKsStartSec 0x86c8 -#define GlintKsStartSecReg 3 -#define GlintKsStartSecOff 0x76c8 - -#define GlintdKsdx 0x86d0 -#define GlintdKsdxTag 0x00da -#define GlintdKsdxReg 1 -#define GlintdKsdxOff 0x76d0 -#define GlintdKsdxSec 0x86d0 -#define GlintdKsdxSecReg 3 -#define GlintdKsdxSecOff 0x76d0 - -#define GlintdKsdyDom 0x86d8 -#define GlintdKsdyDomTag 0x00db -#define GlintdKsdyDomReg 1 -#define GlintdKsdyDomOff 0x76d8 -#define GlintdKsdyDomSec 0x86d8 -#define GlintdKsdyDomSecReg 3 -#define GlintdKsdyDomSecOff 0x76d8 - -#define GlintKdStart 0x86e0 -#define GlintKdStartTag 0x00dc -#define GlintKdStartReg 1 -#define GlintKdStartOff 0x76e0 -#define GlintKdStartSec 0x86e0 -#define GlintKdStartSecReg 3 -#define GlintKdStartSecOff 0x76e0 - -#define GlintdKdStart 0x86e8 -#define GlintdKdStartTag 0x00dd -#define GlintdKdStartReg 1 -#define GlintdKdStartOff 0x76e8 -#define GlintdKdStartSec 0x86e8 -#define GlintdKdStartSecReg 3 -#define GlintdKdStartSecOff 0x76e8 - -#define GlintdKddyDom 0x86f0 -#define GlintdKddyDomTag 0x00de -#define GlintdKddyDomReg 1 -#define GlintdKddyDomOff 0x76f0 -#define GlintdKddyDomSec 0x86f0 -#define GlintdKddyDomSecReg 3 -#define GlintdKddyDomSecOff 0x76f0 - -#define GlintRStart 0x8780 -#define GlintRStartTag 0x00f0 -#define GlintRStartReg 1 -#define GlintRStartOff 0x7780 -#define GlintRStartSec 0x8780 -#define GlintRStartSecReg 3 -#define GlintRStartSecOff 0x7780 - -#define GlintdRdx 0x8788 -#define GlintdRdxTag 0x00f1 -#define GlintdRdxReg 1 -#define GlintdRdxOff 0x7788 -#define GlintdRdxSec 0x8788 -#define GlintdRdxSecReg 3 -#define GlintdRdxSecOff 0x7788 - -#define GlintdRdyDom 0x8790 -#define GlintdRdyDomTag 0x00f2 -#define GlintdRdyDomReg 1 -#define GlintdRdyDomOff 0x7790 -#define GlintdRdyDomSec 0x8790 -#define GlintdRdyDomSecReg 3 -#define GlintdRdyDomSecOff 0x7790 - -#define GlintGStart 0x8798 -#define GlintGStartTag 0x00f3 -#define GlintGStartReg 1 -#define GlintGStartOff 0x7798 -#define GlintGStartSec 0x8798 -#define GlintGStartSecReg 3 -#define GlintGStartSecOff 0x7798 - -#define GlintdGdx 0x87a0 -#define GlintdGdxTag 0x00f4 -#define GlintdGdxReg 1 -#define GlintdGdxOff 0x77a0 -#define GlintdGdxSec 0x87a0 -#define GlintdGdxSecReg 3 -#define GlintdGdxSecOff 0x77a0 - -#define GlintdGdyDom 0x87a8 -#define GlintdGdyDomTag 0x00f5 -#define GlintdGdyDomReg 1 -#define GlintdGdyDomOff 0x77a8 -#define GlintdGdyDomSec 0x87a8 -#define GlintdGdyDomSecReg 3 -#define GlintdGdyDomSecOff 0x77a8 - -#define GlintBStart 0x87b0 -#define GlintBStartTag 0x00f6 -#define GlintBStartReg 1 -#define GlintBStartOff 0x77b0 -#define GlintBStartSec 0x87b0 -#define GlintBStartSecReg 3 -#define GlintBStartSecOff 0x77b0 - -#define GlintdBdx 0x87b8 -#define GlintdBdxTag 0x00f7 -#define GlintdBdxReg 1 -#define GlintdBdxOff 0x77b8 -#define GlintdBdxSec 0x87b8 -#define GlintdBdxSecReg 3 -#define GlintdBdxSecOff 0x77b8 - -#define GlintdBdyDom 0x87c0 -#define GlintdBdyDomTag 0x00f8 -#define GlintdBdyDomReg 1 -#define GlintdBdyDomOff 0x77c0 -#define GlintdBdyDomSec 0x87c0 -#define GlintdBdyDomSecReg 3 -#define GlintdBdyDomSecOff 0x77c0 - -#define GlintAStart 0x87c8 -#define GlintAStartTag 0x00f9 -#define GlintAStartReg 1 -#define GlintAStartOff 0x77c8 -#define GlintAStartSec 0x87c8 -#define GlintAStartSecReg 3 -#define GlintAStartSecOff 0x77c8 - -#define GlintdAdx 0x87d0 -#define GlintdAdxTag 0x00fa -#define GlintdAdxReg 1 -#define GlintdAdxOff 0x77d0 -#define GlintdAdxSec 0x87d0 -#define GlintdAdxSecReg 3 -#define GlintdAdxSecOff 0x77d0 - -#define GlintdAdyDom 0x87d8 -#define GlintdAdyDomTag 0x00fb -#define GlintdAdyDomReg 1 -#define GlintdAdyDomOff 0x77d8 -#define GlintdAdyDomSec 0x87d8 -#define GlintdAdyDomSecReg 3 -#define GlintdAdyDomSecOff 0x77d8 - -#define GlintColorDDAMode 0x87e0 -#define GlintColorDDAModeTag 0x00fc -#define GlintColorDDAModeReg 1 -#define GlintColorDDAModeOff 0x77e0 -#define GlintColorDDAModeSec 0x87e0 -#define GlintColorDDAModeSecReg 3 -#define GlintColorDDAModeSecOff 0x77e0 - -#define GlintConstantColor 0x87e8 -#define GlintConstantColorTag 0x00fd -#define GlintConstantColorReg 1 -#define GlintConstantColorOff 0x77e8 -#define GlintConstantColorSec 0x87e8 -#define GlintConstantColorSecReg 3 -#define GlintConstantColorSecOff 0x77e8 - -#define GlintGLINTColor 0x87f0 -#define GlintGLINTColorTag 0x00fe -#define GlintGLINTColorReg 1 -#define GlintGLINTColorOff 0x77f0 -#define GlintGLINTColorSec 0x87f0 -#define GlintGLINTColorSecReg 3 -#define GlintGLINTColorSecOff 0x77f0 - -#define GlintAlphaTestMode 0x8800 -#define GlintAlphaTestModeTag 0x0100 -#define GlintAlphaTestModeReg 1 -#define GlintAlphaTestModeOff 0x7800 -#define GlintAlphaTestModeSec 0x8800 -#define GlintAlphaTestModeSecReg 3 -#define GlintAlphaTestModeSecOff 0x7800 - -#define GlintAntialiasMode 0x8808 -#define GlintAntialiasModeTag 0x0101 -#define GlintAntialiasModeReg 1 -#define GlintAntialiasModeOff 0x7808 -#define GlintAntialiasModeSec 0x8808 -#define GlintAntialiasModeSecReg 3 -#define GlintAntialiasModeSecOff 0x7808 - -#define GlintAlphaBlendMode 0x8810 -#define GlintAlphaBlendModeTag 0x0102 -#define GlintAlphaBlendModeReg 1 -#define GlintAlphaBlendModeOff 0x7810 -#define GlintAlphaBlendModeSec 0x8810 -#define GlintAlphaBlendModeSecReg 3 -#define GlintAlphaBlendModeSecOff 0x7810 - -#define GlintChromaUpper 0x8f08 -#define GlintChromaUpperTag 0x01e1 -#define GlintChromaUpperReg 1 -#define GlintChromaUpperOff 0x7f08 -#define GlintChromaUpperSec 0x8f08 -#define GlintChromaUpperSecReg 3 -#define GlintChromaUpperSecOff 0x7f08 - -#define GlintChromaLower 0x8f10 -#define GlintChromaLowerTag 0x01e2 -#define GlintChromaLowerReg 1 -#define GlintChromaLowerOff 0x7f10 -#define GlintChromaLowerSec 0x8f10 -#define GlintChromaLowerSecReg 3 -#define GlintChromaLowerSecOff 0x7f10 - -#define GlintChromaTestMode 0x8f18 -#define GlintChromaTestModeTag 0x01e3 -#define GlintChromaTestModeReg 1 -#define GlintChromaTestModeOff 0x7f18 -#define GlintChromaTestModeSec 0x8f18 -#define GlintChromaTestModeSecReg 3 -#define GlintChromaTestModeSecOff 0x7f18 - -#define GlintDitherMode 0x8818 -#define GlintDitherModeTag 0x0103 -#define GlintDitherModeReg 1 -#define GlintDitherModeOff 0x7818 -#define GlintDitherModeSec 0x8818 -#define GlintDitherModeSecReg 3 -#define GlintDitherModeSecOff 0x7818 - -#define GlintFBSoftwareWriteMask 0x8820 -#define GlintFBSoftwareWriteMaskTag 0x0104 -#define GlintFBSoftwareWriteMaskReg 1 -#define GlintFBSoftwareWriteMaskOff 0x7820 -#define GlintFBSoftwareWriteMaskSec 0x8820 -#define GlintFBSoftwareWriteMaskSecReg 3 -#define GlintFBSoftwareWriteMaskSecOff 0x7820 - -#define GlintLogicalOpMode 0x8828 -#define GlintLogicalOpModeTag 0x0105 -#define GlintLogicalOpModeReg 1 -#define GlintLogicalOpModeOff 0x7828 -#define GlintLogicalOpModeSec 0x8828 -#define GlintLogicalOpModeSecReg 3 -#define GlintLogicalOpModeSecOff 0x7828 - -#define GlintFBWriteData 0x8830 -#define GlintFBWriteDataTag 0x0106 -#define GlintFBWriteDataReg 1 -#define GlintFBWriteDataOff 0x7830 -#define GlintFBWriteDataSec 0x8830 -#define GlintFBWriteDataSecReg 3 -#define GlintFBWriteDataSecOff 0x7830 - -#define GlintLBReadMode 0x8880 -#define GlintLBReadModeTag 0x0110 -#define GlintLBReadModeReg 1 -#define GlintLBReadModeOff 0x7880 -#define GlintLBReadModeSec 0x8880 -#define GlintLBReadModeSecReg 3 -#define GlintLBReadModeSecOff 0x7880 - -#define GlintLBReadFormat 0x8888 -#define GlintLBReadFormatTag 0x0111 -#define GlintLBReadFormatReg 1 -#define GlintLBReadFormatOff 0x7888 -#define GlintLBReadFormatSec 0x8888 -#define GlintLBReadFormatSecReg 3 -#define GlintLBReadFormatSecOff 0x7888 - -#define GlintLBSourceOffset 0x8890 -#define GlintLBSourceOffsetTag 0x0112 -#define GlintLBSourceOffsetReg 1 -#define GlintLBSourceOffsetOff 0x7890 -#define GlintLBSourceOffsetSec 0x8890 -#define GlintLBSourceOffsetSecReg 3 -#define GlintLBSourceOffsetSecOff 0x7890 - -#define GlintLBStencil 0x88a8 -#define GlintLBStencilTag 0x0115 -#define GlintLBStencilReg 1 -#define GlintLBStencilOff 0x78a8 -#define GlintLBStencilSec 0x88a8 -#define GlintLBStencilSecReg 3 -#define GlintLBStencilSecOff 0x78a8 - -#define GlintLBDepth 0x88b0 -#define GlintLBDepthTag 0x0116 -#define GlintLBDepthReg 1 -#define GlintLBDepthOff 0x78b0 -#define GlintLBDepthSec 0x88b0 -#define GlintLBDepthSecReg 3 -#define GlintLBDepthSecOff 0x78b0 - -#define GlintLBWindowBase 0x88b8 -#define GlintLBWindowBaseTag 0x0117 -#define GlintLBWindowBaseReg 1 -#define GlintLBWindowBaseOff 0x78b8 -#define GlintLBWindowBaseSec 0x88b8 -#define GlintLBWindowBaseSecReg 3 -#define GlintLBWindowBaseSecOff 0x78b8 - -#define GlintLBWriteMode 0x88c0 -#define GlintLBWriteModeTag 0x0118 -#define GlintLBWriteModeReg 1 -#define GlintLBWriteModeOff 0x78c0 -#define GlintLBWriteModeSec 0x88c0 -#define GlintLBWriteModeSecReg 3 -#define GlintLBWriteModeSecOff 0x78c0 - -#define GlintLBWriteFormat 0x88c8 -#define GlintLBWriteFormatTag 0x0119 -#define GlintLBWriteFormatReg 1 -#define GlintLBWriteFormatOff 0x78c8 -#define GlintLBWriteFormatSec 0x88c8 -#define GlintLBWriteFormatSecReg 3 -#define GlintLBWriteFormatSecOff 0x78c8 - -#define GlintTextureData 0x88e8 -#define GlintTextureDataTag 0x011d -#define GlintTextureDataReg 1 -#define GlintTextureDataOff 0x78e8 -#define GlintTextureDataSec 0x88e8 -#define GlintTextureDataSecReg 3 -#define GlintTextureDataSecOff 0x78e8 - -#define GlintTextureDownloadOffset 0x88f0 -#define GlintTextureDownloadOffsetTag 0x011e -#define GlintTextureDownloadOffsetReg 1 -#define GlintTextureDownloadOffsetOff 0x78f0 -#define GlintTextureDownloadOffsetSec 0x88f0 -#define GlintTextureDownloadOffsetSecReg 3 -#define GlintTextureDownloadOffsetSecOff 0x78f0 - -#define GlintLBWindowOffset 0x88f8 -#define GlintLBWindowOffsetTag 0x011f -#define GlintLBWindowOffsetReg 1 -#define GlintLBWindowOffsetOff 0x78f8 -#define GlintLBWindowOffsetSec 0x88f8 -#define GlintLBWindowOffsetSecReg 3 -#define GlintLBWindowOffsetSecOff 0x78f8 - -#define GlintGLINTWindow 0x8980 -#define GlintGLINTWindowTag 0x0130 -#define GlintGLINTWindowReg 1 -#define GlintGLINTWindowOff 0x7980 -#define GlintGLINTWindowSec 0x8980 -#define GlintGLINTWindowSecReg 3 -#define GlintGLINTWindowSecOff 0x7980 - -#define GlintStencilMode 0x8988 -#define GlintStencilModeTag 0x0131 -#define GlintStencilModeReg 1 -#define GlintStencilModeOff 0x7988 -#define GlintStencilModeSec 0x8988 -#define GlintStencilModeSecReg 3 -#define GlintStencilModeSecOff 0x7988 - -#define GlintStencilData 0x8990 -#define GlintStencilDataTag 0x0132 -#define GlintStencilDataReg 1 -#define GlintStencilDataOff 0x7990 -#define GlintStencilDataSec 0x8990 -#define GlintStencilDataSecReg 3 -#define GlintStencilDataSecOff 0x7990 - -#define GlintGLINTStencil 0x8998 -#define GlintGLINTStencilTag 0x0133 -#define GlintGLINTStencilReg 1 -#define GlintGLINTStencilOff 0x7998 -#define GlintGLINTStencilSec 0x8998 -#define GlintGLINTStencilSecReg 3 -#define GlintGLINTStencilSecOff 0x7998 - -#define GlintDepthMode 0x89a0 -#define GlintDepthModeTag 0x0134 -#define GlintDepthModeReg 1 -#define GlintDepthModeOff 0x79a0 -#define GlintDepthModeSec 0x89a0 -#define GlintDepthModeSecReg 3 -#define GlintDepthModeSecOff 0x79a0 - -#define GlintGLINTDepth 0x89a8 -#define GlintGLINTDepthTag 0x0135 -#define GlintGLINTDepthReg 1 -#define GlintGLINTDepthOff 0x79a8 -#define GlintGLINTDepthSec 0x89a8 -#define GlintGLINTDepthSecReg 3 -#define GlintGLINTDepthSecOff 0x79a8 - -#define GlintZStartU 0x89b0 -#define GlintZStartUTag 0x0136 -#define GlintZStartUReg 1 -#define GlintZStartUOff 0x79b0 -#define GlintZStartUSec 0x89b0 -#define GlintZStartUSecReg 3 -#define GlintZStartUSecOff 0x79b0 - -#define GlintZStartL 0x89b8 -#define GlintZStartLTag 0x0137 -#define GlintZStartLReg 1 -#define GlintZStartLOff 0x79b8 -#define GlintZStartLSec 0x89b8 -#define GlintZStartLSecReg 3 -#define GlintZStartLSecOff 0x79b8 - -#define GlintdZdxU 0x89c0 -#define GlintdZdxUTag 0x0138 -#define GlintdZdxUReg 1 -#define GlintdZdxUOff 0x79c0 -#define GlintdZdxUSec 0x89c0 -#define GlintdZdxUSecReg 3 -#define GlintdZdxUSecOff 0x79c0 - -#define GlintdZdxL 0x89c8 -#define GlintdZdxLTag 0x0139 -#define GlintdZdxLReg 1 -#define GlintdZdxLOff 0x79c8 -#define GlintdZdxLSec 0x89c8 -#define GlintdZdxLSecReg 3 -#define GlintdZdxLSecOff 0x79c8 - -#define GlintdZdyDomU 0x89d0 -#define GlintdZdyDomUTag 0x013a -#define GlintdZdyDomUReg 1 -#define GlintdZdyDomUOff 0x79d0 -#define GlintdZdyDomUSec 0x89d0 -#define GlintdZdyDomUSecReg 3 -#define GlintdZdyDomUSecOff 0x79d0 - -#define GlintdZdyDomL 0x89d8 -#define GlintdZdyDomLTag 0x013b -#define GlintdZdyDomLReg 1 -#define GlintdZdyDomLOff 0x79d8 -#define GlintdZdyDomLSec 0x89d8 -#define GlintdZdyDomLSecReg 3 -#define GlintdZdyDomLSecOff 0x79d8 - -#define GlintFastClearDepth 0x89e0 -#define GlintFastClearDepthTag 0x013c -#define GlintFastClearDepthReg 1 -#define GlintFastClearDepthOff 0x79e0 -#define GlintFastClearDepthSec 0x89e0 -#define GlintFastClearDepthSecReg 3 -#define GlintFastClearDepthSecOff 0x79e0 - -#define GlintFBReadMode 0x8a80 -#define GlintFBReadModeTag 0x0150 -#define GlintFBReadModeReg 1 -#define GlintFBReadModeOff 0x7a80 -#define GlintFBReadModeSec 0x8a80 -#define GlintFBReadModeSecReg 3 -#define GlintFBReadModeSecOff 0x7a80 - -#define GlintFBSourceOffset 0x8a88 -#define GlintFBSourceOffsetTag 0x0151 -#define GlintFBSourceOffsetReg 1 -#define GlintFBSourceOffsetOff 0x7a88 -#define GlintFBSourceOffsetSec 0x8a88 -#define GlintFBSourceOffsetSecReg 3 -#define GlintFBSourceOffsetSecOff 0x7a88 - -#define GlintFBPixelOffset 0x8a90 -#define GlintFBPixelOffsetTag 0x0152 -#define GlintFBPixelOffsetReg 1 -#define GlintFBPixelOffsetOff 0x7a90 -#define GlintFBPixelOffsetSec 0x8a90 -#define GlintFBPixelOffsetSecReg 3 -#define GlintFBPixelOffsetSecOff 0x7a90 - -#define GlintFBColor 0x8a98 -#define GlintFBColorTag 0x0153 -#define GlintFBColorReg 1 -#define GlintFBColorOff 0x7a98 -#define GlintFBColorSec 0x8a98 -#define GlintFBColorSecReg 3 -#define GlintFBColorSecOff 0x7a98 - -#define GlintFBData 0x8aa0 -#define GlintFBDataTag 0x0154 -#define GlintFBDataReg 1 -#define GlintFBDataOff 0x7aa0 -#define GlintFBDataSec 0x8aa0 -#define GlintFBDataSecReg 3 -#define GlintFBDataSecOff 0x7aa0 - -#define GlintFBSourceData 0x8aa8 -#define GlintFBSourceDataTag 0x0155 -#define GlintFBSourceDataReg 1 -#define GlintFBSourceDataOff 0x7aa8 -#define GlintFBSourceDataSec 0x8aa8 -#define GlintFBSourceDataSecReg 3 -#define GlintFBSourceDataSecOff 0x7aa8 - -#define GlintFBWindowBase 0x8ab0 -#define GlintFBWindowBaseTag 0x0156 -#define GlintFBWindowBaseReg 1 -#define GlintFBWindowBaseOff 0x7ab0 -#define GlintFBWindowBaseSec 0x8ab0 -#define GlintFBWindowBaseSecReg 3 -#define GlintFBWindowBaseSecOff 0x7ab0 - -#define GlintFBWriteMode 0x8ab8 -#define GlintFBWriteModeTag 0x0157 -#define GlintFBWriteModeReg 1 -#define GlintFBWriteModeOff 0x7ab8 -#define GlintFBWriteModeSec 0x8ab8 -#define GlintFBWriteModeSecReg 3 -#define GlintFBWriteModeSecOff 0x7ab8 - -#define GlintFBHardwareWriteMask 0x8ac0 -#define GlintFBHardwareWriteMaskTag 0x0158 -#define GlintFBHardwareWriteMaskReg 1 -#define GlintFBHardwareWriteMaskOff 0x7ac0 -#define GlintFBHardwareWriteMaskSec 0x8ac0 -#define GlintFBHardwareWriteMaskSecReg 3 -#define GlintFBHardwareWriteMaskSecOff 0x7ac0 - -#define GlintFBBlockColor 0x8ac8 -#define GlintFBBlockColorTag 0x0159 -#define GlintFBBlockColorReg 1 -#define GlintFBBlockColorOff 0x7ac8 -#define GlintFBBlockColorSec 0x8ac8 -#define GlintFBBlockColorSecReg 3 -#define GlintFBBlockColorSecOff 0x7ac8 - -#define GlintPatternRamMode 0x8af8 -#define GlintPatternRamModeTag 0x015f -#define GlintPatternRamModeReg 1 -#define GlintPatternRamModeOff 0x7af8 -#define GlintPatternRamModeSec 0x8af8 -#define GlintPatternRamModeSecReg 3 -#define GlintPatternRamModeSecOff 0x7af8 - -#define GlintPatternRamData0 0x8b00 -#define GlintPatternRamData0Tag 0x0160 -#define GlintPatternRamData0Reg 1 -#define GlintPatternRamData0Off 0x7b00 -#define GlintPatternRamData0Sec 0x8b00 -#define GlintPatternRamData0SecReg 3 -#define GlintPatternRamData0SecOff 0x7b00 - -#define GlintPatternRamData1 0x8b08 -#define GlintPatternRamData1Tag 0x0161 -#define GlintPatternRamData1Reg 1 -#define GlintPatternRamData1Off 0x7b08 -#define GlintPatternRamData1Sec 0x8b08 -#define GlintPatternRamData1SecReg 3 -#define GlintPatternRamData1SecOff 0x7b08 - -#define GlintPatternRamData2 0x8b10 -#define GlintPatternRamData2Tag 0x0162 -#define GlintPatternRamData2Reg 1 -#define GlintPatternRamData2Off 0x7b10 -#define GlintPatternRamData2Sec 0x8b10 -#define GlintPatternRamData2SecReg 3 -#define GlintPatternRamData2SecOff 0x7b10 - -#define GlintPatternRamData3 0x8b18 -#define GlintPatternRamData3Tag 0x0163 -#define GlintPatternRamData3Reg 1 -#define GlintPatternRamData3Off 0x7b18 -#define GlintPatternRamData3Sec 0x8b18 -#define GlintPatternRamData3SecReg 3 -#define GlintPatternRamData3SecOff 0x7b18 - -#define GlintPatternRamData4 0x8b20 -#define GlintPatternRamData4Tag 0x0164 -#define GlintPatternRamData4Reg 1 -#define GlintPatternRamData4Off 0x7b20 -#define GlintPatternRamData4Sec 0x8b20 -#define GlintPatternRamData4SecReg 3 -#define GlintPatternRamData4SecOff 0x7b20 - -#define GlintPatternRamData5 0x8b28 -#define GlintPatternRamData5Tag 0x0165 -#define GlintPatternRamData5Reg 1 -#define GlintPatternRamData5Off 0x7b28 -#define GlintPatternRamData5Sec 0x8b28 -#define GlintPatternRamData5SecReg 3 -#define GlintPatternRamData5SecOff 0x7b28 - -#define GlintPatternRamData6 0x8b30 -#define GlintPatternRamData6Tag 0x0166 -#define GlintPatternRamData6Reg 1 -#define GlintPatternRamData6Off 0x7b30 -#define GlintPatternRamData6Sec 0x8b30 -#define GlintPatternRamData6SecReg 3 -#define GlintPatternRamData6SecOff 0x7b30 - -#define GlintPatternRamData7 0x8b38 -#define GlintPatternRamData7Tag 0x0167 -#define GlintPatternRamData7Reg 1 -#define GlintPatternRamData7Off 0x7b38 -#define GlintPatternRamData7Sec 0x8b38 -#define GlintPatternRamData7SecReg 3 -#define GlintPatternRamData7SecOff 0x7b38 - -#define GlintPatternRamData8 0x8b40 -#define GlintPatternRamData8Tag 0x0168 -#define GlintPatternRamData8Reg 1 -#define GlintPatternRamData8Off 0x7b40 -#define GlintPatternRamData8Sec 0x8b40 -#define GlintPatternRamData8SecReg 3 -#define GlintPatternRamData8SecOff 0x7b40 - -#define GlintPatternRamData9 0x8b48 -#define GlintPatternRamData9Tag 0x0169 -#define GlintPatternRamData9Reg 1 -#define GlintPatternRamData9Off 0x7b48 -#define GlintPatternRamData9Sec 0x8b48 -#define GlintPatternRamData9SecReg 3 -#define GlintPatternRamData9SecOff 0x7b48 - -#define GlintPatternRamData10 0x8b50 -#define GlintPatternRamData10Tag 0x016a -#define GlintPatternRamData10Reg 1 -#define GlintPatternRamData10Off 0x7b50 -#define GlintPatternRamData10Sec 0x8b50 -#define GlintPatternRamData10SecReg 3 -#define GlintPatternRamData10SecOff 0x7b50 - -#define GlintPatternRamData11 0x8b58 -#define GlintPatternRamData11Tag 0x016b -#define GlintPatternRamData11Reg 1 -#define GlintPatternRamData11Off 0x7b58 -#define GlintPatternRamData11Sec 0x8b58 -#define GlintPatternRamData11SecReg 3 -#define GlintPatternRamData11SecOff 0x7b58 - -#define GlintPatternRamData12 0x8b60 -#define GlintPatternRamData12Tag 0x016c -#define GlintPatternRamData12Reg 1 -#define GlintPatternRamData12Off 0x7b60 -#define GlintPatternRamData12Sec 0x8b60 -#define GlintPatternRamData12SecReg 3 -#define GlintPatternRamData12SecOff 0x7b60 - -#define GlintPatternRamData13 0x8b68 -#define GlintPatternRamData13Tag 0x016d -#define GlintPatternRamData13Reg 1 -#define GlintPatternRamData13Off 0x7b68 -#define GlintPatternRamData13Sec 0x8b68 -#define GlintPatternRamData13SecReg 3 -#define GlintPatternRamData13SecOff 0x7b68 - -#define GlintPatternRamData14 0x8b70 -#define GlintPatternRamData14Tag 0x016e -#define GlintPatternRamData14Reg 1 -#define GlintPatternRamData14Off 0x7b70 -#define GlintPatternRamData14Sec 0x8b70 -#define GlintPatternRamData14SecReg 3 -#define GlintPatternRamData14SecOff 0x7b70 - -#define GlintPatternRamData15 0x8b78 -#define GlintPatternRamData15Tag 0x016f -#define GlintPatternRamData15Reg 1 -#define GlintPatternRamData15Off 0x7b78 -#define GlintPatternRamData15Sec 0x8b78 -#define GlintPatternRamData15SecReg 3 -#define GlintPatternRamData15SecOff 0x7b78 - -#define GlintPatternRamData16 0x8b80 -#define GlintPatternRamData16Tag 0x0170 -#define GlintPatternRamData16Reg 1 -#define GlintPatternRamData16Off 0x7b80 -#define GlintPatternRamData16Sec 0x8b80 -#define GlintPatternRamData16SecReg 3 -#define GlintPatternRamData16SecOff 0x7b80 - -#define GlintPatternRamData17 0x8b88 -#define GlintPatternRamData17Tag 0x0171 -#define GlintPatternRamData17Reg 1 -#define GlintPatternRamData17Off 0x7b88 -#define GlintPatternRamData17Sec 0x8b88 -#define GlintPatternRamData17SecReg 3 -#define GlintPatternRamData17SecOff 0x7b88 - -#define GlintPatternRamData18 0x8b90 -#define GlintPatternRamData18Tag 0x0172 -#define GlintPatternRamData18Reg 1 -#define GlintPatternRamData18Off 0x7b90 -#define GlintPatternRamData18Sec 0x8b90 -#define GlintPatternRamData18SecReg 3 -#define GlintPatternRamData18SecOff 0x7b90 - -#define GlintPatternRamData19 0x8b98 -#define GlintPatternRamData19Tag 0x0173 -#define GlintPatternRamData19Reg 1 -#define GlintPatternRamData19Off 0x7b98 -#define GlintPatternRamData19Sec 0x8b98 -#define GlintPatternRamData19SecReg 3 -#define GlintPatternRamData19SecOff 0x7b98 - -#define GlintPatternRamData20 0x8ba0 -#define GlintPatternRamData20Tag 0x0174 -#define GlintPatternRamData20Reg 1 -#define GlintPatternRamData20Off 0x7ba0 -#define GlintPatternRamData20Sec 0x8ba0 -#define GlintPatternRamData20SecReg 3 -#define GlintPatternRamData20SecOff 0x7ba0 - -#define GlintPatternRamData21 0x8ba8 -#define GlintPatternRamData21Tag 0x0175 -#define GlintPatternRamData21Reg 1 -#define GlintPatternRamData21Off 0x7ba8 -#define GlintPatternRamData21Sec 0x8ba8 -#define GlintPatternRamData21SecReg 3 -#define GlintPatternRamData21SecOff 0x7ba8 - -#define GlintPatternRamData22 0x8bb0 -#define GlintPatternRamData22Tag 0x0176 -#define GlintPatternRamData22Reg 1 -#define GlintPatternRamData22Off 0x7bb0 -#define GlintPatternRamData22Sec 0x8bb0 -#define GlintPatternRamData22SecReg 3 -#define GlintPatternRamData22SecOff 0x7bb0 - -#define GlintPatternRamData23 0x8bb8 -#define GlintPatternRamData23Tag 0x0177 -#define GlintPatternRamData23Reg 1 -#define GlintPatternRamData23Off 0x7bb8 -#define GlintPatternRamData23Sec 0x8bb8 -#define GlintPatternRamData23SecReg 3 -#define GlintPatternRamData23SecOff 0x7bb8 - -#define GlintPatternRamData24 0x8bc0 -#define GlintPatternRamData24Tag 0x0178 -#define GlintPatternRamData24Reg 1 -#define GlintPatternRamData24Off 0x7bc0 -#define GlintPatternRamData24Sec 0x8bc0 -#define GlintPatternRamData24SecReg 3 -#define GlintPatternRamData24SecOff 0x7bc0 - -#define GlintPatternRamData25 0x8bc8 -#define GlintPatternRamData25Tag 0x0179 -#define GlintPatternRamData25Reg 1 -#define GlintPatternRamData25Off 0x7bc8 -#define GlintPatternRamData25Sec 0x8bc8 -#define GlintPatternRamData25SecReg 3 -#define GlintPatternRamData25SecOff 0x7bc8 - -#define GlintPatternRamData26 0x8bd0 -#define GlintPatternRamData26Tag 0x017a -#define GlintPatternRamData26Reg 1 -#define GlintPatternRamData26Off 0x7bd0 -#define GlintPatternRamData26Sec 0x8bd0 -#define GlintPatternRamData26SecReg 3 -#define GlintPatternRamData26SecOff 0x7bd0 - -#define GlintPatternRamData27 0x8bd8 -#define GlintPatternRamData27Tag 0x017b -#define GlintPatternRamData27Reg 1 -#define GlintPatternRamData27Off 0x7bd8 -#define GlintPatternRamData27Sec 0x8bd8 -#define GlintPatternRamData27SecReg 3 -#define GlintPatternRamData27SecOff 0x7bd8 - -#define GlintPatternRamData28 0x8be0 -#define GlintPatternRamData28Tag 0x017c -#define GlintPatternRamData28Reg 1 -#define GlintPatternRamData28Off 0x7be0 -#define GlintPatternRamData28Sec 0x8be0 -#define GlintPatternRamData28SecReg 3 -#define GlintPatternRamData28SecOff 0x7be0 - -#define GlintPatternRamData29 0x8be8 -#define GlintPatternRamData29Tag 0x017d -#define GlintPatternRamData29Reg 1 -#define GlintPatternRamData29Off 0x7be8 -#define GlintPatternRamData29Sec 0x8be8 -#define GlintPatternRamData29SecReg 3 -#define GlintPatternRamData29SecOff 0x7be8 - -#define GlintPatternRamData30 0x8bf0 -#define GlintPatternRamData30Tag 0x017e -#define GlintPatternRamData30Reg 1 -#define GlintPatternRamData30Off 0x7bf0 -#define GlintPatternRamData30Sec 0x8bf0 -#define GlintPatternRamData30SecReg 3 -#define GlintPatternRamData30SecOff 0x7bf0 - -#define GlintPatternRamData31 0x8bf8 -#define GlintPatternRamData31Tag 0x017f -#define GlintPatternRamData31Reg 1 -#define GlintPatternRamData31Off 0x7bf8 -#define GlintPatternRamData31Sec 0x8bf8 -#define GlintPatternRamData31SecReg 3 -#define GlintPatternRamData31SecOff 0x7bf8 - -#define GlintFBBlockColorU 0x8c68 -#define GlintFBBlockColorUTag 0x018d -#define GlintFBBlockColorUReg 1 -#define GlintFBBlockColorUOff 0x7c68 -#define GlintFBBlockColorUSec 0x8c68 -#define GlintFBBlockColorUSecReg 3 -#define GlintFBBlockColorUSecOff 0x7c68 - -#define GlintFBBlockColorL 0x8c70 -#define GlintFBBlockColorLTag 0x018e -#define GlintFBBlockColorLReg 1 -#define GlintFBBlockColorLOff 0x7c70 -#define GlintFBBlockColorLSec 0x8c70 -#define GlintFBBlockColorLSecReg 3 -#define GlintFBBlockColorLSecOff 0x7c70 - -#define GlintSuspendUntilFrameBlank 0x8c78 -#define GlintSuspendUntilFrameBlankTag 0x018f -#define GlintSuspendUntilFrameBlankReg 1 -#define GlintSuspendUntilFrameBlankOff 0x7c78 -#define GlintSuspendUntilFrameBlankSec 0x8c78 -#define GlintSuspendUntilFrameBlankSecReg 3 -#define GlintSuspendUntilFrameBlankSecOff 0x7c78 - -#define GlintFilterMode 0x8c00 -#define GlintFilterModeTag 0x0180 -#define GlintFilterModeReg 1 -#define GlintFilterModeOff 0x7c00 -#define GlintFilterModeSec 0x8c00 -#define GlintFilterModeSecReg 3 -#define GlintFilterModeSecOff 0x7c00 - -#define GlintStatisticMode 0x8c08 -#define GlintStatisticModeTag 0x0181 -#define GlintStatisticModeReg 1 -#define GlintStatisticModeOff 0x7c08 -#define GlintStatisticModeSec 0x8c08 -#define GlintStatisticModeSecReg 3 -#define GlintStatisticModeSecOff 0x7c08 - -#define GlintMinRegion 0x8c10 -#define GlintMinRegionTag 0x0182 -#define GlintMinRegionReg 1 -#define GlintMinRegionOff 0x7c10 -#define GlintMinRegionSec 0x8c10 -#define GlintMinRegionSecReg 3 -#define GlintMinRegionSecOff 0x7c10 - -#define GlintMaxRegion 0x8c18 -#define GlintMaxRegionTag 0x0183 -#define GlintMaxRegionReg 1 -#define GlintMaxRegionOff 0x7c18 -#define GlintMaxRegionSec 0x8c18 -#define GlintMaxRegionSecReg 3 -#define GlintMaxRegionSecOff 0x7c18 - -#define GlintResetPickResult 0x8c20 -#define GlintResetPickResultTag 0x0184 -#define GlintResetPickResultReg 1 -#define GlintResetPickResultOff 0x7c20 -#define GlintResetPickResultSec 0x8c20 -#define GlintResetPickResultSecReg 3 -#define GlintResetPickResultSecOff 0x7c20 - -#define GlintMitHitRegion 0x8c28 -#define GlintMitHitRegionTag 0x0185 -#define GlintMitHitRegionReg 1 -#define GlintMitHitRegionOff 0x7c28 -#define GlintMitHitRegionSec 0x8c28 -#define GlintMitHitRegionSecReg 3 -#define GlintMitHitRegionSecOff 0x7c28 - -#define GlintMaxHitRegion 0x8c30 -#define GlintMaxHitRegionTag 0x0186 -#define GlintMaxHitRegionReg 1 -#define GlintMaxHitRegionOff 0x7c30 -#define GlintMaxHitRegionSec 0x8c30 -#define GlintMaxHitRegionSecReg 3 -#define GlintMaxHitRegionSecOff 0x7c30 - -#define GlintPickResult 0x8c38 -#define GlintPickResultTag 0x0187 -#define GlintPickResultReg 1 -#define GlintPickResultOff 0x7c38 -#define GlintPickResultSec 0x8c38 -#define GlintPickResultSecReg 3 -#define GlintPickResultSecOff 0x7c38 - -#define GlintGLINTSync 0x8c40 -#define GlintGLINTSyncTag 0x0188 -#define GlintGLINTSyncReg 1 -#define GlintGLINTSyncOff 0x7c40 -#define GlintGLINTSyncSec 0x8c40 -#define GlintGLINTSyncSecReg 3 -#define GlintGLINTSyncSecOff 0x7c40 - -#define GlintKsRStart 0x8c80 -#define GlintKsRStartTag 0x0190 -#define GlintKsRStartReg 1 -#define GlintKsRStartOff 0x7c80 -#define GlintKsRStartSec 0x8c80 -#define GlintKsRStartSecReg 3 -#define GlintKsRStartSecOff 0x7c80 - -#define GlintdKsRdx 0x8c88 -#define GlintdKsRdxTag 0x0191 -#define GlintdKsRdxReg 1 -#define GlintdKsRdxOff 0x7c88 -#define GlintdKsRdxSec 0x8c88 -#define GlintdKsRdxSecReg 3 -#define GlintdKsRdxSecOff 0x7c88 - -#define GlintdKsRdyDom 0x8c90 -#define GlintdKsRdyDomTag 0x0192 -#define GlintdKsRdyDomReg 1 -#define GlintdKsRdyDomOff 0x7c90 -#define GlintdKsRdyDomSec 0x8c90 -#define GlintdKsRdyDomSecReg 3 -#define GlintdKsRdyDomSecOff 0x7c90 - -#define GlintKsGStart 0x8c98 -#define GlintKsGStartTag 0x0193 -#define GlintKsGStartReg 1 -#define GlintKsGStartOff 0x7c98 -#define GlintKsGStartSec 0x8c98 -#define GlintKsGStartSecReg 3 -#define GlintKsGStartSecOff 0x7c98 - -#define GlintdKsGdx 0x8ca0 -#define GlintdKsGdxTag 0x0194 -#define GlintdKsGdxReg 1 -#define GlintdKsGdxOff 0x7ca0 -#define GlintdKsGdxSec 0x8ca0 -#define GlintdKsGdxSecReg 3 -#define GlintdKsGdxSecOff 0x7ca0 - -#define GlintdKsGdyDom 0x8ca8 -#define GlintdKsGdyDomTag 0x0195 -#define GlintdKsGdyDomReg 1 -#define GlintdKsGdyDomOff 0x7ca8 -#define GlintdKsGdyDomSec 0x8ca8 -#define GlintdKsGdyDomSecReg 3 -#define GlintdKsGdyDomSecOff 0x7ca8 - -#define GlintKsBStart 0x8cb0 -#define GlintKsBStartTag 0x0196 -#define GlintKsBStartReg 1 -#define GlintKsBStartOff 0x7cb0 -#define GlintKsBStartSec 0x8cb0 -#define GlintKsBStartSecReg 3 -#define GlintKsBStartSecOff 0x7cb0 - -#define GlintdKsBdx 0x8cb8 -#define GlintdKsBdxTag 0x0197 -#define GlintdKsBdxReg 1 -#define GlintdKsBdxOff 0x7cb8 -#define GlintdKsBdxSec 0x8cb8 -#define GlintdKsBdxSecReg 3 -#define GlintdKsBdxSecOff 0x7cb8 - -#define GlintdKsBdyDom 0x8cc0 -#define GlintdKsBdyDomTag 0x0198 -#define GlintdKsBdyDomReg 1 -#define GlintdKsBdyDomOff 0x7cc0 -#define GlintdKsBdyDomSec 0x8cc0 -#define GlintdKsBdyDomSecReg 3 -#define GlintdKsBdyDomSecOff 0x7cc0 - -#define GlintKdRStart 0x8d00 -#define GlintKdRStartTag 0x01a0 -#define GlintKdRStartReg 1 -#define GlintKdRStartOff 0x7d00 -#define GlintKdRStartSec 0x8d00 -#define GlintKdRStartSecReg 3 -#define GlintKdRStartSecOff 0x7d00 - -#define GlintdKdRdx 0x8d08 -#define GlintdKdRdxTag 0x01a1 -#define GlintdKdRdxReg 1 -#define GlintdKdRdxOff 0x7d08 -#define GlintdKdRdxSec 0x8d08 -#define GlintdKdRdxSecReg 3 -#define GlintdKdRdxSecOff 0x7d08 - -#define GlintdKdRdyDom 0x8d10 -#define GlintdKdRdyDomTag 0x01a2 -#define GlintdKdRdyDomReg 1 -#define GlintdKdRdyDomOff 0x7d10 -#define GlintdKdRdyDomSec 0x8d10 -#define GlintdKdRdyDomSecReg 3 -#define GlintdKdRdyDomSecOff 0x7d10 - -#define GlintKdGStart 0x8d18 -#define GlintKdGStartTag 0x01a3 -#define GlintKdGStartReg 1 -#define GlintKdGStartOff 0x7d18 -#define GlintKdGStartSec 0x8d18 -#define GlintKdGStartSecReg 3 -#define GlintKdGStartSecOff 0x7d18 - -#define GlintdKdGdx 0x8d20 -#define GlintdKdGdxTag 0x01a4 -#define GlintdKdGdxReg 1 -#define GlintdKdGdxOff 0x7d20 -#define GlintdKdGdxSec 0x8d20 -#define GlintdKdGdxSecReg 3 -#define GlintdKdGdxSecOff 0x7d20 - -#define GlintdKdGdyDom 0x8d28 -#define GlintdKdGdyDomTag 0x01a5 -#define GlintdKdGdyDomReg 1 -#define GlintdKdGdyDomOff 0x7d28 -#define GlintdKdGdyDomSec 0x8d28 -#define GlintdKdGdyDomSecReg 3 -#define GlintdKdGdyDomSecOff 0x7d28 - -#define GlintKdBStart 0x8d30 -#define GlintKdBStartTag 0x01a6 -#define GlintKdBStartReg 1 -#define GlintKdBStartOff 0x7d30 -#define GlintKdBStartSec 0x8d30 -#define GlintKdBStartSecReg 3 -#define GlintKdBStartSecOff 0x7d30 - -#define GlintdKdBdx 0x8d38 -#define GlintdKdBdxTag 0x01a7 -#define GlintdKdBdxReg 1 -#define GlintdKdBdxOff 0x7d38 -#define GlintdKdBdxSec 0x8d38 -#define GlintdKdBdxSecReg 3 -#define GlintdKdBdxSecOff 0x7d38 - -#define GlintdKdBdyDom 0x8d40 -#define GlintdKdBdyDomTag 0x01a8 -#define GlintdKdBdyDomReg 1 -#define GlintdKdBdyDomOff 0x7d40 -#define GlintdKdBdyDomSec 0x8d40 -#define GlintdKdBdyDomSecReg 3 -#define GlintdKdBdyDomSecOff 0x7d40 - -#define GlintContextDump 0x8dc0 -#define GlintContextDumpTag 0x01b8 -#define GlintContextDumpReg 1 -#define GlintContextDumpOff 0x7dc0 - -#define GlintContextRestore 0x8dc8 -#define GlintContextRestoreTag 0x01b9 -#define GlintContextRestoreReg 1 -#define GlintContextRestoreOff 0x7dc8 - -#define GlintContextData 0x8dd0 -#define GlintContextDataTag 0x01ba -#define GlintContextDataReg 1 -#define GlintContextDataOff 0x7dd0 - -#define GlintFeedbackToken 0x8f80 -#define GlintFeedbackTokenTag 0x01f0 -#define GlintFeedbackTokenReg 1 -#define GlintFeedbackTokenOff 0x7f80 - -#define GlintFeedbackX 0x8f88 -#define GlintFeedbackXTag 0x01f1 -#define GlintFeedbackXReg 1 -#define GlintFeedbackXOff 0x7f88 - -#define GlintFeedbackY 0x8f90 -#define GlintFeedbackYTag 0x01f2 -#define GlintFeedbackYReg 1 -#define GlintFeedbackYOff 0x7f90 - -#define GlintFeedbackZ 0x8f98 -#define GlintFeedbackZTag 0x01f3 -#define GlintFeedbackZReg 1 -#define GlintFeedbackZOff 0x7f98 - -#define GlintFeedbackW 0x8fa0 -#define GlintFeedbackWTag 0x01f4 -#define GlintFeedbackWReg 1 -#define GlintFeedbackWOff 0x7fa0 - -#define GlintFeedbackRed 0x8fa8 -#define GlintFeedbackRedTag 0x01f5 -#define GlintFeedbackRedReg 1 -#define GlintFeedbackRedOff 0x7fa8 - -#define GlintFeedbackGreen 0x8fb0 -#define GlintFeedbackGreenTag 0x01f6 -#define GlintFeedbackGreenReg 1 -#define GlintFeedbackGreenOff 0x7fb0 - -#define GlintFeedbackBlue 0x8fb8 -#define GlintFeedbackBlueTag 0x01f7 -#define GlintFeedbackBlueReg 1 -#define GlintFeedbackBlueOff 0x7fb8 - -#define GlintFeedbackAlpha 0x8fc0 -#define GlintFeedbackAlphaTag 0x01f8 -#define GlintFeedbackAlphaReg 1 -#define GlintFeedbackAlphaOff 0x7fc0 - -#define GlintFeedbackS 0x8fc8 -#define GlintFeedbackSTag 0x01f9 -#define GlintFeedbackSReg 1 -#define GlintFeedbackSOff 0x7fc8 - -#define GlintFeedbackT 0x8fd0 -#define GlintFeedbackTTag 0x01fa -#define GlintFeedbackTReg 1 -#define GlintFeedbackTOff 0x7fd0 - -#define GlintFeedbackR 0x8fd8 -#define GlintFeedbackRTag 0x01fb -#define GlintFeedbackRReg 1 -#define GlintFeedbackROff 0x7fd8 - -#define GlintFeedbackQ 0x8fe0 -#define GlintFeedbackQTag 0x01fc -#define GlintFeedbackQReg 1 -#define GlintFeedbackQOff 0x7fe0 - -#define GlintSelectRecord 0x8fe8 -#define GlintSelectRecordTag 0x01fd -#define GlintSelectRecordReg 1 -#define GlintSelectRecordOff 0x7fe8 - -#define GlintPassThrough 0x8ff0 -#define GlintPassThroughTag 0x01fe -#define GlintPassThroughReg 1 -#define GlintPassThroughOff 0x7ff0 - -#define GlintEndOfFeedback 0x8ff8 -#define GlintEndOfFeedbackTag 0x01ff -#define GlintEndOfFeedbackReg 1 -#define GlintEndOfFeedbackOff 0x7ff8 - -#define GlintV0FixedS 0x9000 -#define GlintV0FixedSTag 0x0200 -#define GlintV0FixedSReg 1 -#define GlintV0FixedSOff 0x8000 - -#define GlintV0FixedT 0x9008 -#define GlintV0FixedTTag 0x0201 -#define GlintV0FixedTReg 1 -#define GlintV0FixedTOff 0x8008 - -#define GlintV0FixedQ 0x9010 -#define GlintV0FixedQTag 0x0202 -#define GlintV0FixedQReg 1 -#define GlintV0FixedQOff 0x8010 - -#define GlintV0FixedKs 0x9018 -#define GlintV0FixedKsTag 0x0203 -#define GlintV0FixedKsReg 1 -#define GlintV0FixedKsOff 0x8018 - -#define GlintV0FixedKd 0x9020 -#define GlintV0FixedKdTag 0x0204 -#define GlintV0FixedKdReg 1 -#define GlintV0FixedKdOff 0x8020 - -#define GlintV0FixedR 0x9028 -#define GlintV0FixedRTag 0x0205 -#define GlintV0FixedRReg 1 -#define GlintV0FixedROff 0x8028 - -#define GlintV0FixedG 0x9030 -#define GlintV0FixedGTag 0x0206 -#define GlintV0FixedGReg 1 -#define GlintV0FixedGOff 0x8030 - -#define GlintV0FixedB 0x9038 -#define GlintV0FixedBTag 0x0207 -#define GlintV0FixedBReg 1 -#define GlintV0FixedBOff 0x8038 - -#define GlintV0FixedA 0x9040 -#define GlintV0FixedATag 0x0208 -#define GlintV0FixedAReg 1 -#define GlintV0FixedAOff 0x8040 - -#define GlintV0FixedF 0x9048 -#define GlintV0FixedFTag 0x0209 -#define GlintV0FixedFReg 1 -#define GlintV0FixedFOff 0x8048 - -#define GlintV0FixedX 0x9050 -#define GlintV0FixedXTag 0x020a -#define GlintV0FixedXReg 1 -#define GlintV0FixedXOff 0x8050 - -#define GlintV0FixedY 0x9058 -#define GlintV0FixedYTag 0x020b -#define GlintV0FixedYReg 1 -#define GlintV0FixedYOff 0x8058 - -#define GlintV0FixedZ 0x9060 -#define GlintV0FixedZTag 0x020c -#define GlintV0FixedZReg 1 -#define GlintV0FixedZOff 0x8060 - -#define GlintV1FixedS 0x9080 -#define GlintV1FixedSTag 0x0210 -#define GlintV1FixedSReg 1 -#define GlintV1FixedSOff 0x8080 - -#define GlintV1FixedT 0x9088 -#define GlintV1FixedTTag 0x0211 -#define GlintV1FixedTReg 1 -#define GlintV1FixedTOff 0x8088 - -#define GlintV1FixedQ 0x9090 -#define GlintV1FixedQTag 0x0212 -#define GlintV1FixedQReg 1 -#define GlintV1FixedQOff 0x8090 - -#define GlintV1FixedKs 0x9098 -#define GlintV1FixedKsTag 0x0213 -#define GlintV1FixedKsReg 1 -#define GlintV1FixedKsOff 0x8098 - -#define GlintV1FixedKd 0x90a0 -#define GlintV1FixedKdTag 0x0214 -#define GlintV1FixedKdReg 1 -#define GlintV1FixedKdOff 0x80a0 - -#define GlintV1FixedR 0x90a8 -#define GlintV1FixedRTag 0x0215 -#define GlintV1FixedRReg 1 -#define GlintV1FixedROff 0x80a8 - -#define GlintV1FixedG 0x90b0 -#define GlintV1FixedGTag 0x0216 -#define GlintV1FixedGReg 1 -#define GlintV1FixedGOff 0x80b0 - -#define GlintV1FixedB 0x90b8 -#define GlintV1FixedBTag 0x0217 -#define GlintV1FixedBReg 1 -#define GlintV1FixedBOff 0x80b8 - -#define GlintV1FixedA 0x90c0 -#define GlintV1FixedATag 0x0218 -#define GlintV1FixedAReg 1 -#define GlintV1FixedAOff 0x80c0 - -#define GlintV1FixedF 0x90c8 -#define GlintV1FixedFTag 0x0219 -#define GlintV1FixedFReg 1 -#define GlintV1FixedFOff 0x80c8 - -#define GlintV1FixedX 0x90d0 -#define GlintV1FixedXTag 0x021a -#define GlintV1FixedXReg 1 -#define GlintV1FixedXOff 0x80d0 - -#define GlintV1FixedY 0x90d8 -#define GlintV1FixedYTag 0x021b -#define GlintV1FixedYReg 1 -#define GlintV1FixedYOff 0x80d8 - -#define GlintV1FixedZ 0x90e0 -#define GlintV1FixedZTag 0x021c -#define GlintV1FixedZReg 1 -#define GlintV1FixedZOff 0x80e0 - -#define GlintV2FixedS 0x9100 -#define GlintV2FixedSTag 0x0220 -#define GlintV2FixedSReg 1 -#define GlintV2FixedSOff 0x8100 - -#define GlintV2FixedT 0x9108 -#define GlintV2FixedTTag 0x0221 -#define GlintV2FixedTReg 1 -#define GlintV2FixedTOff 0x8108 - -#define GlintV2FixedQ 0x9110 -#define GlintV2FixedQTag 0x0222 -#define GlintV2FixedQReg 1 -#define GlintV2FixedQOff 0x8110 - -#define GlintV2FixedKs 0x9118 -#define GlintV2FixedKsTag 0x0223 -#define GlintV2FixedKsReg 1 -#define GlintV2FixedKsOff 0x8118 - -#define GlintV2FixedKd 0x9120 -#define GlintV2FixedKdTag 0x0224 -#define GlintV2FixedKdReg 1 -#define GlintV2FixedKdOff 0x8120 - -#define GlintV2FixedR 0x9128 -#define GlintV2FixedRTag 0x0225 -#define GlintV2FixedRReg 1 -#define GlintV2FixedROff 0x8128 - -#define GlintV2FixedG 0x9130 -#define GlintV2FixedGTag 0x0226 -#define GlintV2FixedGReg 1 -#define GlintV2FixedGOff 0x8130 - -#define GlintV2FixedB 0x9138 -#define GlintV2FixedBTag 0x0227 -#define GlintV2FixedBReg 1 -#define GlintV2FixedBOff 0x8138 - -#define GlintV2FixedA 0x9140 -#define GlintV2FixedATag 0x0228 -#define GlintV2FixedAReg 1 -#define GlintV2FixedAOff 0x8140 - -#define GlintV2FixedF 0x9148 -#define GlintV2FixedFTag 0x0229 -#define GlintV2FixedFReg 1 -#define GlintV2FixedFOff 0x8148 - -#define GlintV2FixedX 0x9150 -#define GlintV2FixedXTag 0x022a -#define GlintV2FixedXReg 1 -#define GlintV2FixedXOff 0x8150 - -#define GlintV2FixedY 0x9158 -#define GlintV2FixedYTag 0x022b -#define GlintV2FixedYReg 1 -#define GlintV2FixedYOff 0x8158 - -#define GlintV2FixedZ 0x9160 -#define GlintV2FixedZTag 0x022c -#define GlintV2FixedZReg 1 -#define GlintV2FixedZOff 0x8160 - -#define GlintV0FloatS 0x9180 -#define GlintV0FloatSTag 0x0230 -#define GlintV0FloatSReg 1 -#define GlintV0FloatSOff 0x8180 - -#define GlintV0FloatT 0x9188 -#define GlintV0FloatTTag 0x0231 -#define GlintV0FloatTReg 1 -#define GlintV0FloatTOff 0x8188 - -#define GlintV0FloatQ 0x9190 -#define GlintV0FloatQTag 0x0232 -#define GlintV0FloatQReg 1 -#define GlintV0FloatQOff 0x8190 - -#define GlintV0FloatKs 0x9198 -#define GlintV0FloatKsTag 0x0233 -#define GlintV0FloatKsReg 1 -#define GlintV0FloatKsOff 0x8198 - -#define GlintV0FloatKd 0x91a0 -#define GlintV0FloatKdTag 0x0234 -#define GlintV0FloatKdReg 1 -#define GlintV0FloatKdOff 0x81a0 - -#define GlintV0FloatR 0x91a8 -#define GlintV0FloatRTag 0x0235 -#define GlintV0FloatRReg 1 -#define GlintV0FloatROff 0x81a8 - -#define GlintV0FloatG 0x91b0 -#define GlintV0FloatGTag 0x0236 -#define GlintV0FloatGReg 1 -#define GlintV0FloatGOff 0x81b0 - -#define GlintV0FloatB 0x91b8 -#define GlintV0FloatBTag 0x0237 -#define GlintV0FloatBReg 1 -#define GlintV0FloatBOff 0x81b8 - -#define GlintV0FloatA 0x91c0 -#define GlintV0FloatATag 0x0238 -#define GlintV0FloatAReg 1 -#define GlintV0FloatAOff 0x81c0 - -#define GlintV0FloatF 0x91c8 -#define GlintV0FloatFTag 0x0239 -#define GlintV0FloatFReg 1 -#define GlintV0FloatFOff 0x81c8 - -#define GlintV0FloatX 0x91d0 -#define GlintV0FloatXTag 0x023a -#define GlintV0FloatXReg 1 -#define GlintV0FloatXOff 0x81d0 - -#define GlintV0FloatY 0x91d8 -#define GlintV0FloatYTag 0x023b -#define GlintV0FloatYReg 1 -#define GlintV0FloatYOff 0x81d8 - -#define GlintV0FloatZ 0x91e0 -#define GlintV0FloatZTag 0x023c -#define GlintV0FloatZReg 1 -#define GlintV0FloatZOff 0x81e0 - -#define GlintV1FloatS 0x9200 -#define GlintV1FloatSTag 0x0240 -#define GlintV1FloatSReg 1 -#define GlintV1FloatSOff 0x8200 - -#define GlintV1FloatT 0x9208 -#define GlintV1FloatTTag 0x0241 -#define GlintV1FloatTReg 1 -#define GlintV1FloatTOff 0x8208 - -#define GlintV1FloatQ 0x9210 -#define GlintV1FloatQTag 0x0242 -#define GlintV1FloatQReg 1 -#define GlintV1FloatQOff 0x8210 - -#define GlintV1FloatKs 0x9218 -#define GlintV1FloatKsTag 0x0243 -#define GlintV1FloatKsReg 1 -#define GlintV1FloatKsOff 0x8218 - -#define GlintV1FloatKd 0x9220 -#define GlintV1FloatKdTag 0x0244 -#define GlintV1FloatKdReg 1 -#define GlintV1FloatKdOff 0x8220 - -#define GlintV1FloatR 0x9228 -#define GlintV1FloatRTag 0x0245 -#define GlintV1FloatRReg 1 -#define GlintV1FloatROff 0x8228 - -#define GlintV1FloatG 0x9230 -#define GlintV1FloatGTag 0x0246 -#define GlintV1FloatGReg 1 -#define GlintV1FloatGOff 0x8230 - -#define GlintV1FloatB 0x9238 -#define GlintV1FloatBTag 0x0247 -#define GlintV1FloatBReg 1 -#define GlintV1FloatBOff 0x8238 - -#define GlintV1FloatA 0x9240 -#define GlintV1FloatATag 0x0248 -#define GlintV1FloatAReg 1 -#define GlintV1FloatAOff 0x8240 - -#define GlintV1FloatF 0x9248 -#define GlintV1FloatFTag 0x0249 -#define GlintV1FloatFReg 1 -#define GlintV1FloatFOff 0x8248 - -#define GlintV1FloatX 0x9250 -#define GlintV1FloatXTag 0x024a -#define GlintV1FloatXReg 1 -#define GlintV1FloatXOff 0x8250 - -#define GlintV1FloatY 0x9258 -#define GlintV1FloatYTag 0x024b -#define GlintV1FloatYReg 1 -#define GlintV1FloatYOff 0x8258 - -#define GlintV1FloatZ 0x9260 -#define GlintV1FloatZTag 0x024c -#define GlintV1FloatZReg 1 -#define GlintV1FloatZOff 0x8260 - -#define GlintV2FloatS 0x9280 -#define GlintV2FloatSTag 0x0250 -#define GlintV2FloatSReg 1 -#define GlintV2FloatSOff 0x8280 - -#define GlintV2FloatT 0x9288 -#define GlintV2FloatTTag 0x0251 -#define GlintV2FloatTReg 1 -#define GlintV2FloatTOff 0x8288 - -#define GlintV2FloatQ 0x9290 -#define GlintV2FloatQTag 0x0252 -#define GlintV2FloatQReg 1 -#define GlintV2FloatQOff 0x8290 - -#define GlintV2FloatKs 0x9298 -#define GlintV2FloatKsTag 0x0253 -#define GlintV2FloatKsReg 1 -#define GlintV2FloatKsOff 0x8298 - -#define GlintV2FloatKd 0x92a0 -#define GlintV2FloatKdTag 0x0254 -#define GlintV2FloatKdReg 1 -#define GlintV2FloatKdOff 0x82a0 - -#define GlintV2FloatR 0x92a8 -#define GlintV2FloatRTag 0x0255 -#define GlintV2FloatRReg 1 -#define GlintV2FloatROff 0x82a8 - -#define GlintV2FloatG 0x92b0 -#define GlintV2FloatGTag 0x0256 -#define GlintV2FloatGReg 1 -#define GlintV2FloatGOff 0x82b0 - -#define GlintV2FloatB 0x92b8 -#define GlintV2FloatBTag 0x0257 -#define GlintV2FloatBReg 1 -#define GlintV2FloatBOff 0x82b8 - -#define GlintV2FloatA 0x92c0 -#define GlintV2FloatATag 0x0258 -#define GlintV2FloatAReg 1 -#define GlintV2FloatAOff 0x82c0 - -#define GlintV2FloatF 0x92c8 -#define GlintV2FloatFTag 0x0259 -#define GlintV2FloatFReg 1 -#define GlintV2FloatFOff 0x82c8 - -#define GlintV2FloatX 0x92d0 -#define GlintV2FloatXTag 0x025a -#define GlintV2FloatXReg 1 -#define GlintV2FloatXOff 0x82d0 - -#define GlintV2FloatY 0x92d8 -#define GlintV2FloatYTag 0x025b -#define GlintV2FloatYReg 1 -#define GlintV2FloatYOff 0x82d8 - -#define GlintV2FloatZ 0x92e0 -#define GlintV2FloatZTag 0x025c -#define GlintV2FloatZReg 1 -#define GlintV2FloatZOff 0x82e0 - -#define GlintDeltaMode 0x9300 -#define GlintDeltaModeTag 0x0260 -#define GlintDeltaModeReg 1 -#define GlintDeltaModeOff 0x8300 - -#define GlintDrawTriangle 0x9308 -#define GlintDrawTriangleTag 0x0261 -#define GlintDrawTriangleReg 1 -#define GlintDrawTriangleOff 0x8308 - -#define GlintRepeatTriangle 0x9310 -#define GlintRepeatTriangleTag 0x0262 -#define GlintRepeatTriangleReg 1 -#define GlintRepeatTriangleOff 0x8310 - -#define GlintDrawLine01 0x9318 -#define GlintDrawLine01Tag 0x0263 -#define GlintDrawLine01Reg 1 -#define GlintDrawLine01Off 0x8318 - -#define GlintDrawLine10 0x9320 -#define GlintDrawLine10Tag 0x0264 -#define GlintDrawLine10Reg 1 -#define GlintDrawLine10Off 0x8320 - -#define GlintRepeatLine 0x9328 -#define GlintRepeatLineTag 0x0265 -#define GlintRepeatLineReg 1 -#define GlintRepeatLineOff 0x8328 - -#define GlintEpilogueTag 0x9368 -#define GlintEpilogueTagTag 0x026d -#define GlintEpilogueTagReg 1 -#define GlintEpilogueTagOff 0x8368 - -#define GlintEpilogueData 0x9370 -#define GlintEpilogueDataTag 0x026e -#define GlintEpilogueDataReg 1 -#define GlintEpilogueDataOff 0x8370 - -#define GlintBroadcastMask 0x9378 -#define GlintBroadcastMaskTag 0x026f -#define GlintBroadcastMaskReg 1 -#define GlintBroadcastMaskOff 0x8378 - -#define GlintXBias 0x9480 -#define GlintXBiasTag 0x0290 -#define GlintXBiasReg 1 -#define GlintXBiasOff 0x8480 - -#define GlintYBias 0x9488 -#define GlintYBiasTag 0x0291 -#define GlintYBiasReg 1 -#define GlintYBiasOff 0x8488 - -#define GlintPointMode 0x9490 -#define GlintPointModeTag 0x0292 -#define GlintPointModeReg 1 -#define GlintPointModeOff 0x8490 - -#define GlintPointSize 0x9498 -#define GlintPointSizeTag 0x0293 -#define GlintPointSizeReg 1 -#define GlintPointSizeOff 0x8498 - -#define GlintAApointSize 0x94a0 -#define GlintAApointSizeTag 0x0294 -#define GlintAApointSizeReg 1 -#define GlintAApointSizeOff 0x84a0 - -#define GlintLineMode 0x94a8 -#define GlintLineModeTag 0x0295 -#define GlintLineModeReg 1 -#define GlintLineModeOff 0x84a8 - -#define GlintLineWidth 0x94b0 -#define GlintLineWidthTag 0x0296 -#define GlintLineWidthReg 1 -#define GlintLineWidthOff 0x84b0 - -#define GlintLineWidthOffset 0x94b8 -#define GlintLineWidthOffsetTag 0x0297 -#define GlintLineWidthOffsetReg 1 -#define GlintLineWidthOffsetOff 0x84b8 - -#define GlintAAlineWidth 0x94c0 -#define GlintAAlineWidthTag 0x0298 -#define GlintAAlineWidthReg 1 -#define GlintAAlineWidthOff 0x84c0 - -#define GlintTriangleMode 0x94c8 -#define GlintTriangleModeTag 0x0299 -#define GlintTriangleModeReg 1 -#define GlintTriangleModeOff 0x84c8 - -#define GlintRectangleMode 0x94d0 -#define GlintRectangleModeTag 0x029a -#define GlintRectangleModeReg 1 -#define GlintRectangleModeOff 0x84d0 - -#define GlintRectangleWidth 0x94d8 -#define GlintRectangleWidthTag 0x029b -#define GlintRectangleWidthReg 1 -#define GlintRectangleWidthOff 0x84d8 - -#define GlintRectangleHeight 0x94e0 -#define GlintRectangleHeightTag 0x029c -#define GlintRectangleHeightReg 1 -#define GlintRectangleHeightOff 0x84e0 - -#define GlintRectangle2DMode 0x94e8 -#define GlintRectangle2DModeTag 0x029d -#define GlintRectangle2DModeReg 1 -#define GlintRectangle2DModeOff 0x84e8 - -#define GlintRectangle2DControl 0x94f0 -#define GlintRectangle2DControlTag 0x029e -#define GlintRectangle2DControlReg 1 -#define GlintRectangle2DControlOff 0x84f0 - -#define GlintTransformMode 0x9508 -#define GlintTransformModeTag 0x02a1 -#define GlintTransformModeReg 1 -#define GlintTransformModeOff 0x8508 - -#define GlintGeometryMode 0x9510 -#define GlintGeometryModeTag 0x02a2 -#define GlintGeometryModeReg 1 -#define GlintGeometryModeOff 0x8510 - -#define GlintNormalizeMode 0x9518 -#define GlintNormalizeModeTag 0x02a3 -#define GlintNormalizeModeReg 1 -#define GlintNormalizeModeOff 0x8518 - -#define GlintLightingMode 0x9520 -#define GlintLightingModeTag 0x02a4 -#define GlintLightingModeReg 1 -#define GlintLightingModeOff 0x8520 - -#define GlintColorMaterialMode 0x9528 -#define GlintColorMaterialModeTag 0x02a5 -#define GlintColorMaterialModeReg 1 -#define GlintColorMaterialModeOff 0x8528 - -#define GlintMaterialMode 0x9530 -#define GlintMaterialModeTag 0x02a6 -#define GlintMaterialModeReg 1 -#define GlintMaterialModeOff 0x8530 - -#define GlintSelectResult 0x9580 -#define GlintSelectResultTag 0x02b0 -#define GlintSelectResultReg 1 -#define GlintSelectResultOff 0x8580 - -#define GlintBegin 0x9590 -#define GlintBeginTag 0x02b2 -#define GlintBeginReg 1 -#define GlintBeginOff 0x8590 - -#define GlintEnd 0x9598 -#define GlintEndTag 0x02b3 -#define GlintEndReg 1 -#define GlintEndOff 0x8598 - -#define GlintEdgeFlag 0x95a0 -#define GlintEdgeFlagTag 0x02b4 -#define GlintEdgeFlagReg 1 -#define GlintEdgeFlagOff 0x85a0 - -#define GlintObjectIDvalue 0x95a8 -#define GlintObjectIDvalueTag 0x02b5 -#define GlintObjectIDvalueReg 1 -#define GlintObjectIDvalueOff 0x85a8 - -#define GlintIncrementObjectID 0x95b0 -#define GlintIncrementObjectIDTag 0x02b6 -#define GlintIncrementObjectIDReg 1 -#define GlintIncrementObjectIDOff 0x85b0 - -#define GlintTransformCurrent 0x95b8 -#define GlintTransformCurrentTag 0x02b7 -#define GlintTransformCurrentReg 1 -#define GlintTransformCurrentOff 0x85b8 - -#define GlintSaveCurrent 0x95c8 -#define GlintSaveCurrentTag 0x02b9 -#define GlintSaveCurrentReg 1 -#define GlintSaveCurrentOff 0x85c8 - -#define GlintRestoreCurrent 0x95d0 -#define GlintRestoreCurrentTag 0x02ba -#define GlintRestoreCurrentReg 1 -#define GlintRestoreCurrentOff 0x85d0 - -#define GlintInitNames 0x95d8 -#define GlintInitNamesTag 0x02bb -#define GlintInitNamesReg 1 -#define GlintInitNamesOff 0x85d8 - -#define GlintPushName 0x95e0 -#define GlintPushNameTag 0x02bc -#define GlintPushNameReg 1 -#define GlintPushNameOff 0x85e0 - -#define GlintPopName 0x95e8 -#define GlintPopNameTag 0x02bd -#define GlintPopNameReg 1 -#define GlintPopNameOff 0x85e8 - -#define GlintLoadName 0x95f0 -#define GlintLoadNameTag 0x02be -#define GlintLoadNameReg 1 -#define GlintLoadNameOff 0x85f0 - -#define GlintGeomRectangle 0x96a0 -#define GlintGeomRectangleTag 0x02d4 -#define GlintGeomRectangleReg 1 -#define GlintGeomRectangleOff 0x86a0 - -#define GlintDrawRectangle2D 0x97a0 -#define GlintDrawRectangle2DTag 0x02f4 -#define GlintDrawRectangle2DReg 1 -#define GlintDrawRectangle2DOff 0x87a0 - -#define GlintNz 0x9800 -#define GlintNzTag 0x0300 -#define GlintNzReg 1 -#define GlintNzOff 0x8800 - -#define GlintNy 0x9808 -#define GlintNyTag 0x0301 -#define GlintNyReg 1 -#define GlintNyOff 0x8808 - -#define GlintNx 0x9810 -#define GlintNxTag 0x0302 -#define GlintNxReg 1 -#define GlintNxOff 0x8810 - -#define GlintCa 0x9818 -#define GlintCaTag 0x0303 -#define GlintCaReg 1 -#define GlintCaOff 0x8818 - -#define GlintCb 0x9820 -#define GlintCbTag 0x0304 -#define GlintCbReg 1 -#define GlintCbOff 0x8820 - -#define GlintCg 0x9828 -#define GlintCgTag 0x0305 -#define GlintCgReg 1 -#define GlintCgOff 0x8828 - -#define GlintCr3 0x9830 -#define GlintCr3Tag 0x0306 -#define GlintCr3Reg 1 -#define GlintCr3Off 0x8830 - -#define GlintCr4 0x9838 -#define GlintCr4Tag 0x0307 -#define GlintCr4Reg 1 -#define GlintCr4Off 0x8838 - -#define GlintTt2 0x9840 -#define GlintTt2Tag 0x0308 -#define GlintTt2Reg 1 -#define GlintTt2Off 0x8840 - -#define GlintTs2 0x9848 -#define GlintTs2Tag 0x0309 -#define GlintTs2Reg 1 -#define GlintTs2Off 0x8848 - -#define GlintVw 0x9850 -#define GlintVwTag 0x030a -#define GlintVwReg 1 -#define GlintVwOff 0x8850 - -#define GlintVz 0x9858 -#define GlintVzTag 0x030b -#define GlintVzReg 1 -#define GlintVzOff 0x8858 - -#define GlintVy 0x9860 -#define GlintVyTag 0x030c -#define GlintVyReg 1 -#define GlintVyOff 0x8860 - -#define GlintVx2 0x9868 -#define GlintVx2Tag 0x030d -#define GlintVx2Reg 1 -#define GlintVx2Off 0x8868 - -#define GlintVx3 0x9870 -#define GlintVx3Tag 0x030e -#define GlintVx3Reg 1 -#define GlintVx3Off 0x8870 - -#define GlintVx4 0x9878 -#define GlintVx4Tag 0x030f -#define GlintVx4Reg 1 -#define GlintVx4Off 0x8878 - -#define GlintFNz 0x9880 -#define GlintFNzTag 0x0310 -#define GlintFNzReg 1 -#define GlintFNzOff 0x8880 - -#define GlintFNy 0x9888 -#define GlintFNyTag 0x0311 -#define GlintFNyReg 1 -#define GlintFNyOff 0x8888 - -#define GlintFNx 0x9890 -#define GlintFNxTag 0x0312 -#define GlintFNxReg 1 -#define GlintFNxOff 0x8890 - -#define GlintPackedColor3 0x9898 -#define GlintPackedColor3Tag 0x0313 -#define GlintPackedColor3Reg 1 -#define GlintPackedColor3Off 0x8898 - -#define GlintPackedColor4 0x98a0 -#define GlintPackedColor4Tag 0x0314 -#define GlintPackedColor4Reg 1 -#define GlintPackedColor4Off 0x88a0 - -#define GlintTq4 0x98a8 -#define GlintTq4Tag 0x0315 -#define GlintTq4Reg 1 -#define GlintTq4Off 0x88a8 - -#define GlintTr4 0x98b0 -#define GlintTr4Tag 0x0316 -#define GlintTr4Reg 1 -#define GlintTr4Off 0x88b0 - -#define GlintTt4 0x98b8 -#define GlintTt4Tag 0x0317 -#define GlintTt4Reg 1 -#define GlintTt4Off 0x88b8 - -#define GlintTs4 0x98c0 -#define GlintTs4Tag 0x0318 -#define GlintTs4Reg 1 -#define GlintTs4Off 0x88c0 - -#define GlintRPw 0x98c8 -#define GlintRPwTag 0x0319 -#define GlintRPwReg 1 -#define GlintRPwOff 0x88c8 - -#define GlintRPz 0x98d0 -#define GlintRPzTag 0x031a -#define GlintRPzReg 1 -#define GlintRPzOff 0x88d0 - -#define GlintRPy 0x98d8 -#define GlintRPyTag 0x031b -#define GlintRPyReg 1 -#define GlintRPyOff 0x88d8 - -#define GlintRPx2 0x98e0 -#define GlintRPx2Tag 0x031c -#define GlintRPx2Reg 1 -#define GlintRPx2Off 0x88e0 - -#define GlintRPx3 0x98e8 -#define GlintRPx3Tag 0x031d -#define GlintRPx3Reg 1 -#define GlintRPx3Off 0x88e8 - -#define GlintRPx4 0x98f0 -#define GlintRPx4Tag 0x031e -#define GlintRPx4Reg 1 -#define GlintRPx4Off 0x88f0 - -#define GlintTs1 0x98f8 -#define GlintTs1Tag 0x031f -#define GlintTs1Reg 1 -#define GlintTs1Off 0x88f8 - -#define GlintModelViewMatrix0 0x9900 -#define GlintModelViewMatrix0Tag 0x0320 -#define GlintModelViewMatrix0Reg 1 -#define GlintModelViewMatrix0Off 0x8900 - -#define GlintModelViewMatrix1 0x9908 -#define GlintModelViewMatrix1Tag 0x0321 -#define GlintModelViewMatrix1Reg 1 -#define GlintModelViewMatrix1Off 0x8908 - -#define GlintModelViewMatrix2 0x9910 -#define GlintModelViewMatrix2Tag 0x0322 -#define GlintModelViewMatrix2Reg 1 -#define GlintModelViewMatrix2Off 0x8910 - -#define GlintModelViewMatrix3 0x9918 -#define GlintModelViewMatrix3Tag 0x0323 -#define GlintModelViewMatrix3Reg 1 -#define GlintModelViewMatrix3Off 0x8918 - -#define GlintModelViewMatrix4 0x9920 -#define GlintModelViewMatrix4Tag 0x0324 -#define GlintModelViewMatrix4Reg 1 -#define GlintModelViewMatrix4Off 0x8920 - -#define GlintModelViewMatrix5 0x9928 -#define GlintModelViewMatrix5Tag 0x0325 -#define GlintModelViewMatrix5Reg 1 -#define GlintModelViewMatrix5Off 0x8928 - -#define GlintModelViewMatrix6 0x9930 -#define GlintModelViewMatrix6Tag 0x0326 -#define GlintModelViewMatrix6Reg 1 -#define GlintModelViewMatrix6Off 0x8930 - -#define GlintModelViewMatrix7 0x9938 -#define GlintModelViewMatrix7Tag 0x0327 -#define GlintModelViewMatrix7Reg 1 -#define GlintModelViewMatrix7Off 0x8938 - -#define GlintModelViewMatrix8 0x9940 -#define GlintModelViewMatrix8Tag 0x0328 -#define GlintModelViewMatrix8Reg 1 -#define GlintModelViewMatrix8Off 0x8940 - -#define GlintModelViewMatrix9 0x9948 -#define GlintModelViewMatrix9Tag 0x0329 -#define GlintModelViewMatrix9Reg 1 -#define GlintModelViewMatrix9Off 0x8948 - -#define GlintModelViewMatrix10 0x9950 -#define GlintModelViewMatrix10Tag 0x032a -#define GlintModelViewMatrix10Reg 1 -#define GlintModelViewMatrix10Off 0x8950 - -#define GlintModelViewMatrix11 0x9958 -#define GlintModelViewMatrix11Tag 0x032b -#define GlintModelViewMatrix11Reg 1 -#define GlintModelViewMatrix11Off 0x8958 - -#define GlintModelViewMatrix12 0x9960 -#define GlintModelViewMatrix12Tag 0x032c -#define GlintModelViewMatrix12Reg 1 -#define GlintModelViewMatrix12Off 0x8960 - -#define GlintModelViewMatrix13 0x9968 -#define GlintModelViewMatrix13Tag 0x032d -#define GlintModelViewMatrix13Reg 1 -#define GlintModelViewMatrix13Off 0x8968 - -#define GlintModelViewMatrix14 0x9970 -#define GlintModelViewMatrix14Tag 0x032e -#define GlintModelViewMatrix14Reg 1 -#define GlintModelViewMatrix14Off 0x8970 - -#define GlintModelViewMatrix15 0x9978 -#define GlintModelViewMatrix15Tag 0x032f -#define GlintModelViewMatrix15Reg 1 -#define GlintModelViewMatrix15Off 0x8978 - -#define GlintModelViewProjectionMatrix0 0x9980 -#define GlintModelViewProjectionMatrix0Tag 0x0330 -#define GlintModelViewProjectionMatrix0Reg 1 -#define GlintModelViewProjectionMatrix0Off 0x8980 - -#define GlintModelViewProjectionMatrix1 0x9988 -#define GlintModelViewProjectionMatrix1Tag 0x0331 -#define GlintModelViewProjectionMatrix1Reg 1 -#define GlintModelViewProjectionMatrix1Off 0x8988 - -#define GlintModelViewProjectionMatrix2 0x9990 -#define GlintModelViewProjectionMatrix2Tag 0x0332 -#define GlintModelViewProjectionMatrix2Reg 1 -#define GlintModelViewProjectionMatrix2Off 0x8990 - -#define GlintModelViewProjectionMatrix3 0x9998 -#define GlintModelViewProjectionMatrix3Tag 0x0333 -#define GlintModelViewProjectionMatrix3Reg 1 -#define GlintModelViewProjectionMatrix3Off 0x8998 - -#define GlintModelViewProjectionMatrix4 0x99a0 -#define GlintModelViewProjectionMatrix4Tag 0x0334 -#define GlintModelViewProjectionMatrix4Reg 1 -#define GlintModelViewProjectionMatrix4Off 0x89a0 - -#define GlintModelViewProjectionMatrix5 0x99a8 -#define GlintModelViewProjectionMatrix5Tag 0x0335 -#define GlintModelViewProjectionMatrix5Reg 1 -#define GlintModelViewProjectionMatrix5Off 0x89a8 - -#define GlintModelViewProjectionMatrix6 0x99b0 -#define GlintModelViewProjectionMatrix6Tag 0x0336 -#define GlintModelViewProjectionMatrix6Reg 1 -#define GlintModelViewProjectionMatrix6Off 0x89b0 - -#define GlintModelViewProjectionMatrix7 0x99b8 -#define GlintModelViewProjectionMatrix7Tag 0x0337 -#define GlintModelViewProjectionMatrix7Reg 1 -#define GlintModelViewProjectionMatrix7Off 0x89b8 - -#define GlintModelViewProjectionMatrix8 0x99c0 -#define GlintModelViewProjectionMatrix8Tag 0x0338 -#define GlintModelViewProjectionMatrix8Reg 1 -#define GlintModelViewProjectionMatrix8Off 0x89c0 - -#define GlintModelViewProjectionMatrix9 0x99c8 -#define GlintModelViewProjectionMatrix9Tag 0x0339 -#define GlintModelViewProjectionMatrix9Reg 1 -#define GlintModelViewProjectionMatrix9Off 0x89c8 - -#define GlintModelViewProjectionMatrix10 0x99d0 -#define GlintModelViewProjectionMatrix10Tag 0x033a -#define GlintModelViewProjectionMatrix10Reg 1 -#define GlintModelViewProjectionMatrix10Off 0x89d0 - -#define GlintModelViewProjectionMatrix11 0x99d8 -#define GlintModelViewProjectionMatrix11Tag 0x033b -#define GlintModelViewProjectionMatrix11Reg 1 -#define GlintModelViewProjectionMatrix11Off 0x89d8 - -#define GlintModelViewProjectionMatrix12 0x99e0 -#define GlintModelViewProjectionMatrix12Tag 0x033c -#define GlintModelViewProjectionMatrix12Reg 1 -#define GlintModelViewProjectionMatrix12Off 0x89e0 - -#define GlintModelViewProjectionMatrix13 0x99e8 -#define GlintModelViewProjectionMatrix13Tag 0x033d -#define GlintModelViewProjectionMatrix13Reg 1 -#define GlintModelViewProjectionMatrix13Off 0x89e8 - -#define GlintModelViewProjectionMatrix14 0x99f0 -#define GlintModelViewProjectionMatrix14Tag 0x033e -#define GlintModelViewProjectionMatrix14Reg 1 -#define GlintModelViewProjectionMatrix14Off 0x89f0 - -#define GlintModelViewProjectionMatrix15 0x99f8 -#define GlintModelViewProjectionMatrix15Tag 0x033f -#define GlintModelViewProjectionMatrix15Reg 1 -#define GlintModelViewProjectionMatrix15Off 0x89f8 - -#define GlintNormalMatrix0 0x9a00 -#define GlintNormalMatrix0Tag 0x0340 -#define GlintNormalMatrix0Reg 1 -#define GlintNormalMatrix0Off 0x8a00 - -#define GlintNormalMatrix1 0x9a08 -#define GlintNormalMatrix1Tag 0x0341 -#define GlintNormalMatrix1Reg 1 -#define GlintNormalMatrix1Off 0x8a08 - -#define GlintNormalMatrix2 0x9a10 -#define GlintNormalMatrix2Tag 0x0342 -#define GlintNormalMatrix2Reg 1 -#define GlintNormalMatrix2Off 0x8a10 - -#define GlintNormalMatrix3 0x9a18 -#define GlintNormalMatrix3Tag 0x0343 -#define GlintNormalMatrix3Reg 1 -#define GlintNormalMatrix3Off 0x8a18 - -#define GlintNormalMatrix4 0x9a20 -#define GlintNormalMatrix4Tag 0x0344 -#define GlintNormalMatrix4Reg 1 -#define GlintNormalMatrix4Off 0x8a20 - -#define GlintNormalMatrix5 0x9a28 -#define GlintNormalMatrix5Tag 0x0345 -#define GlintNormalMatrix5Reg 1 -#define GlintNormalMatrix5Off 0x8a28 - -#define GlintNormalMatrix6 0x9a30 -#define GlintNormalMatrix6Tag 0x0346 -#define GlintNormalMatrix6Reg 1 -#define GlintNormalMatrix6Off 0x8a30 - -#define GlintNormalMatrix7 0x9a38 -#define GlintNormalMatrix7Tag 0x0347 -#define GlintNormalMatrix7Reg 1 -#define GlintNormalMatrix7Off 0x8a38 - -#define GlintNormalMatrix8 0x9a40 -#define GlintNormalMatrix8Tag 0x0348 -#define GlintNormalMatrix8Reg 1 -#define GlintNormalMatrix8Off 0x8a40 - -#define GlintTextureMatrix0 0x9a80 -#define GlintTextureMatrix0Tag 0x0350 -#define GlintTextureMatrix0Reg 1 -#define GlintTextureMatrix0Off 0x8a80 - -#define GlintTextureMatrix1 0x9a88 -#define GlintTextureMatrix1Tag 0x0351 -#define GlintTextureMatrix1Reg 1 -#define GlintTextureMatrix1Off 0x8a88 - -#define GlintTextureMatrix2 0x9a90 -#define GlintTextureMatrix2Tag 0x0352 -#define GlintTextureMatrix2Reg 1 -#define GlintTextureMatrix2Off 0x8a90 - -#define GlintTextureMatrix3 0x9a98 -#define GlintTextureMatrix3Tag 0x0353 -#define GlintTextureMatrix3Reg 1 -#define GlintTextureMatrix3Off 0x8a98 - -#define GlintTextureMatrix4 0x9aa0 -#define GlintTextureMatrix4Tag 0x0354 -#define GlintTextureMatrix4Reg 1 -#define GlintTextureMatrix4Off 0x8aa0 - -#define GlintTextureMatrix5 0x9aa8 -#define GlintTextureMatrix5Tag 0x0355 -#define GlintTextureMatrix5Reg 1 -#define GlintTextureMatrix5Off 0x8aa8 - -#define GlintTextureMatrix6 0x9ab0 -#define GlintTextureMatrix6Tag 0x0356 -#define GlintTextureMatrix6Reg 1 -#define GlintTextureMatrix6Off 0x8ab0 - -#define GlintTextureMatrix7 0x9ab8 -#define GlintTextureMatrix7Tag 0x0357 -#define GlintTextureMatrix7Reg 1 -#define GlintTextureMatrix7Off 0x8ab8 - -#define GlintTextureMatrix8 0x9ac0 -#define GlintTextureMatrix8Tag 0x0358 -#define GlintTextureMatrix8Reg 1 -#define GlintTextureMatrix8Off 0x8ac0 - -#define GlintTextureMatrix9 0x9ac8 -#define GlintTextureMatrix9Tag 0x0359 -#define GlintTextureMatrix9Reg 1 -#define GlintTextureMatrix9Off 0x8ac8 - -#define GlintTextureMatrix10 0x9ad0 -#define GlintTextureMatrix10Tag 0x035a -#define GlintTextureMatrix10Reg 1 -#define GlintTextureMatrix10Off 0x8ad0 - -#define GlintTextureMatrix11 0x9ad8 -#define GlintTextureMatrix11Tag 0x035b -#define GlintTextureMatrix11Reg 1 -#define GlintTextureMatrix11Off 0x8ad8 - -#define GlintTextureMatrix12 0x9ae0 -#define GlintTextureMatrix12Tag 0x035c -#define GlintTextureMatrix12Reg 1 -#define GlintTextureMatrix12Off 0x8ae0 - -#define GlintTextureMatrix13 0x9ae8 -#define GlintTextureMatrix13Tag 0x035d -#define GlintTextureMatrix13Reg 1 -#define GlintTextureMatrix13Off 0x8ae8 - -#define GlintTextureMatrix14 0x9af0 -#define GlintTextureMatrix14Tag 0x035e -#define GlintTextureMatrix14Reg 1 -#define GlintTextureMatrix14Off 0x8af0 - -#define GlintTextureMatrix15 0x9af8 -#define GlintTextureMatrix15Tag 0x035f -#define GlintTextureMatrix15Reg 1 -#define GlintTextureMatrix15Off 0x8af8 - -#define GlintTexGen0 0x9b00 -#define GlintTexGen0Tag 0x0360 -#define GlintTexGen0Reg 1 -#define GlintTexGen0Off 0x8b00 - -#define GlintTexGen1 0x9b08 -#define GlintTexGen1Tag 0x0361 -#define GlintTexGen1Reg 1 -#define GlintTexGen1Off 0x8b08 - -#define GlintTexGen2 0x9b10 -#define GlintTexGen2Tag 0x0362 -#define GlintTexGen2Reg 1 -#define GlintTexGen2Off 0x8b10 - -#define GlintTexGen3 0x9b18 -#define GlintTexGen3Tag 0x0363 -#define GlintTexGen3Reg 1 -#define GlintTexGen3Off 0x8b18 - -#define GlintTexGen4 0x9b20 -#define GlintTexGen4Tag 0x0364 -#define GlintTexGen4Reg 1 -#define GlintTexGen4Off 0x8b20 - -#define GlintTexGen5 0x9b28 -#define GlintTexGen5Tag 0x0365 -#define GlintTexGen5Reg 1 -#define GlintTexGen5Off 0x8b28 - -#define GlintTexGen6 0x9b30 -#define GlintTexGen6Tag 0x0366 -#define GlintTexGen6Reg 1 -#define GlintTexGen6Off 0x8b30 - -#define GlintTexGen7 0x9b38 -#define GlintTexGen7Tag 0x0367 -#define GlintTexGen7Reg 1 -#define GlintTexGen7Off 0x8b38 - -#define GlintTexGen8 0x9b40 -#define GlintTexGen8Tag 0x0368 -#define GlintTexGen8Reg 1 -#define GlintTexGen8Off 0x8b40 - -#define GlintTexGen9 0x9b48 -#define GlintTexGen9Tag 0x0369 -#define GlintTexGen9Reg 1 -#define GlintTexGen9Off 0x8b48 - -#define GlintTexGen10 0x9b50 -#define GlintTexGen10Tag 0x036a -#define GlintTexGen10Reg 1 -#define GlintTexGen10Off 0x8b50 - -#define GlintTexGen11 0x9b58 -#define GlintTexGen11Tag 0x036b -#define GlintTexGen11Reg 1 -#define GlintTexGen11Off 0x8b58 - -#define GlintTexGen12 0x9b60 -#define GlintTexGen12Tag 0x036c -#define GlintTexGen12Reg 1 -#define GlintTexGen12Off 0x8b60 - -#define GlintTexGen13 0x9b68 -#define GlintTexGen13Tag 0x036d -#define GlintTexGen13Reg 1 -#define GlintTexGen13Off 0x8b68 - -#define GlintTexGen14 0x9b70 -#define GlintTexGen14Tag 0x036e -#define GlintTexGen14Reg 1 -#define GlintTexGen14Off 0x8b70 - -#define GlintTexGen15 0x9b78 -#define GlintTexGen15Tag 0x036f -#define GlintTexGen15Reg 1 -#define GlintTexGen15Off 0x8b78 - -#define GlintViewPortScaleX 0x9b80 -#define GlintViewPortScaleXTag 0x0370 -#define GlintViewPortScaleXReg 1 -#define GlintViewPortScaleXOff 0x8b80 - -#define GlintViewPortScaleY 0x9b88 -#define GlintViewPortScaleYTag 0x0371 -#define GlintViewPortScaleYReg 1 -#define GlintViewPortScaleYOff 0x8b88 - -#define GlintViewPortScaleZ 0x9b90 -#define GlintViewPortScaleZTag 0x0372 -#define GlintViewPortScaleZReg 1 -#define GlintViewPortScaleZOff 0x8b90 - -#define GlintViewPortOffsetX 0x9b98 -#define GlintViewPortOffsetXTag 0x0373 -#define GlintViewPortOffsetXReg 1 -#define GlintViewPortOffsetXOff 0x8b98 - -#define GlintViewPortOffsetY 0x9ba0 -#define GlintViewPortOffsetYTag 0x0374 -#define GlintViewPortOffsetYReg 1 -#define GlintViewPortOffsetYOff 0x8ba0 - -#define GlintViewPortOffsetZ 0x9ba8 -#define GlintViewPortOffsetZTag 0x0375 -#define GlintViewPortOffsetZReg 1 -#define GlintViewPortOffsetZOff 0x8ba8 - -#define GlintFogDensity 0x9bb0 -#define GlintFogDensityTag 0x0376 -#define GlintFogDensityReg 1 -#define GlintFogDensityOff 0x8bb0 - -#define GlintFogScale 0x9bb8 -#define GlintFogScaleTag 0x0377 -#define GlintFogScaleReg 1 -#define GlintFogScaleOff 0x8bb8 - -#define GlintFogEnd 0x9bc0 -#define GlintFogEndTag 0x0378 -#define GlintFogEndReg 1 -#define GlintFogEndOff 0x8bc0 - -#define GlintPolygonOffsetFactor 0x9bc8 -#define GlintPolygonOffsetFactorTag 0x0379 -#define GlintPolygonOffsetFactorReg 1 -#define GlintPolygonOffsetFactorOff 0x8bc8 - -#define GlintPolygonOffsetBias 0x9bd0 -#define GlintPolygonOffsetBiasTag 0x037a -#define GlintPolygonOffsetBiasReg 1 -#define GlintPolygonOffsetBiasOff 0x8bd0 - -#define GlintLineClipLengthThreshold 0x9bd8 -#define GlintLineClipLengthThresholdTag 0x037b -#define GlintLineClipLengthThresholdReg 1 -#define GlintLineClipLengthThresholdOff 0x8bd8 - -#define GlintTriangleClipAreaThreshold 0x9be0 -#define GlintTriangleClipAreaThresholdTag 0x037c -#define GlintTriangleClipAreaThresholdReg 1 -#define GlintTriangleClipAreaThresholdOff 0x8be0 - -#define GlintRasterPosXIncrement 0x9be8 -#define GlintRasterPosXIncrementTag 0x037d -#define GlintRasterPosXIncrementReg 1 -#define GlintRasterPosXIncrementOff 0x8be8 - -#define GlintRasterPosYIncrement 0x9bf0 -#define GlintRasterPosYIncrementTag 0x037e -#define GlintRasterPosYIncrementReg 1 -#define GlintRasterPosYIncrementOff 0x8bf0 - -#define GlintUserClip0X 0x9c00 -#define GlintUserClip0XTag 0x0380 -#define GlintUserClip0XReg 1 -#define GlintUserClip0XOff 0x8c00 - -#define GlintUserClip0Y 0x9c08 -#define GlintUserClip0YTag 0x0381 -#define GlintUserClip0YReg 1 -#define GlintUserClip0YOff 0x8c08 - -#define GlintUserClip0Z 0x9c10 -#define GlintUserClip0ZTag 0x0382 -#define GlintUserClip0ZReg 1 -#define GlintUserClip0ZOff 0x8c10 - -#define GlintUserClip0W 0x9c18 -#define GlintUserClip0WTag 0x0383 -#define GlintUserClip0WReg 1 -#define GlintUserClip0WOff 0x8c18 - -#define GlintUserClip1X 0x9c20 -#define GlintUserClip1XTag 0x0384 -#define GlintUserClip1XReg 1 -#define GlintUserClip1XOff 0x8c20 - -#define GlintUserClip1Y 0x9c28 -#define GlintUserClip1YTag 0x0385 -#define GlintUserClip1YReg 1 -#define GlintUserClip1YOff 0x8c28 - -#define GlintUserClip1Z 0x9c30 -#define GlintUserClip1ZTag 0x0386 -#define GlintUserClip1ZReg 1 -#define GlintUserClip1ZOff 0x8c30 - -#define GlintUserClip1W 0x9c38 -#define GlintUserClip1WTag 0x0387 -#define GlintUserClip1WReg 1 -#define GlintUserClip1WOff 0x8c38 - -#define GlintUserClip2X 0x9c40 -#define GlintUserClip2XTag 0x0388 -#define GlintUserClip2XReg 1 -#define GlintUserClip2XOff 0x8c40 - -#define GlintUserClip2Y 0x9c48 -#define GlintUserClip2YTag 0x0389 -#define GlintUserClip2YReg 1 -#define GlintUserClip2YOff 0x8c48 - -#define GlintUserClip2Z 0x9c50 -#define GlintUserClip2ZTag 0x038a -#define GlintUserClip2ZReg 1 -#define GlintUserClip2ZOff 0x8c50 - -#define GlintUserClip2W 0x9c58 -#define GlintUserClip2WTag 0x038b -#define GlintUserClip2WReg 1 -#define GlintUserClip2WOff 0x8c58 - -#define GlintUserClip3X 0x9c60 -#define GlintUserClip3XTag 0x038c -#define GlintUserClip3XReg 1 -#define GlintUserClip3XOff 0x8c60 - -#define GlintUserClip3Y 0x9c68 -#define GlintUserClip3YTag 0x038d -#define GlintUserClip3YReg 1 -#define GlintUserClip3YOff 0x8c68 - -#define GlintUserClip3Z 0x9c70 -#define GlintUserClip3ZTag 0x038e -#define GlintUserClip3ZReg 1 -#define GlintUserClip3ZOff 0x8c70 - -#define GlintUserClip3W 0x9c78 -#define GlintUserClip3WTag 0x038f -#define GlintUserClip3WReg 1 -#define GlintUserClip3WOff 0x8c78 - -#define GlintUserClip4X 0x9c80 -#define GlintUserClip4XTag 0x0390 -#define GlintUserClip4XReg 1 -#define GlintUserClip4XOff 0x8c80 - -#define GlintUserClip4Y 0x9c88 -#define GlintUserClip4YTag 0x0391 -#define GlintUserClip4YReg 1 -#define GlintUserClip4YOff 0x8c88 - -#define GlintUserClip4Z 0x9c90 -#define GlintUserClip4ZTag 0x0392 -#define GlintUserClip4ZReg 1 -#define GlintUserClip4ZOff 0x8c90 - -#define GlintUserClip4W 0x9c98 -#define GlintUserClip4WTag 0x0393 -#define GlintUserClip4WReg 1 -#define GlintUserClip4WOff 0x8c98 - -#define GlintUserClip5X 0x9ca0 -#define GlintUserClip5XTag 0x0394 -#define GlintUserClip5XReg 1 -#define GlintUserClip5XOff 0x8ca0 - -#define GlintUserClip5Y 0x9ca8 -#define GlintUserClip5YTag 0x0395 -#define GlintUserClip5YReg 1 -#define GlintUserClip5YOff 0x8ca8 - -#define GlintUserClip5Z 0x9cb0 -#define GlintUserClip5ZTag 0x0396 -#define GlintUserClip5ZReg 1 -#define GlintUserClip5ZOff 0x8cb0 - -#define GlintUserClip5W 0x9cb8 -#define GlintUserClip5WTag 0x0397 -#define GlintUserClip5WReg 1 -#define GlintUserClip5WOff 0x8cb8 - -#define GlintRasterPosXOffset 0x9ce8 -#define GlintRasterPosXOffsetTag 0x039d -#define GlintRasterPosXOffsetReg 1 -#define GlintRasterPosXOffsetOff 0x8ce8 - -#define GlintRasterPosYOffset 0x9cf0 -#define GlintRasterPosYOffsetTag 0x039e -#define GlintRasterPosYOffsetReg 1 -#define GlintRasterPosYOffsetOff 0x8cf0 - -#define GlintAttenuationCutOff 0x9cf8 -#define GlintAttenuationCutOffTag 0x039f -#define GlintAttenuationCutOffReg 1 -#define GlintAttenuationCutOffOff 0x8cf8 - -#define GlintLight0Mode 0x9d00 -#define GlintLight0ModeTag 0x03a0 -#define GlintLight0ModeReg 1 -#define GlintLight0ModeOff 0x8d00 - -#define GlintLight0AmbientIntensityRed 0x9d08 -#define GlintLight0AmbientIntensityRedTag 0x03a1 -#define GlintLight0AmbientIntensityRedReg 1 -#define GlintLight0AmbientIntensityRedOff 0x8d08 - -#define GlintLight0AmbientIntensityGreen 0x9d10 -#define GlintLight0AmbientIntensityGreenTag 0x03a2 -#define GlintLight0AmbientIntensityGreenReg 1 -#define GlintLight0AmbientIntensityGreenOff 0x8d10 - -#define GlintLight0AmbientIntensityBlue 0x9d18 -#define GlintLight0AmbientIntensityBlueTag 0x03a3 -#define GlintLight0AmbientIntensityBlueReg 1 -#define GlintLight0AmbientIntensityBlueOff 0x8d18 - -#define GlintLight0DiffuseIntensityRed 0x9d20 -#define GlintLight0DiffuseIntensityRedTag 0x03a4 -#define GlintLight0DiffuseIntensityRedReg 1 -#define GlintLight0DiffuseIntensityRedOff 0x8d20 - -#define GlintLight0DiffuseIntensityGreen 0x9d28 -#define GlintLight0DiffuseIntensityGreenTag 0x03a5 -#define GlintLight0DiffuseIntensityGreenReg 1 -#define GlintLight0DiffuseIntensityGreenOff 0x8d28 - -#define GlintLight0DiffuseIntensityBlue 0x9d30 -#define GlintLight0DiffuseIntensityBlueTag 0x03a6 -#define GlintLight0DiffuseIntensityBlueReg 1 -#define GlintLight0DiffuseIntensityBlueOff 0x8d30 - -#define GlintLight0SpecularIntensityRed 0x9d38 -#define GlintLight0SpecularIntensityRedTag 0x03a7 -#define GlintLight0SpecularIntensityRedReg 1 -#define GlintLight0SpecularIntensityRedOff 0x8d38 - -#define GlintLight0SpecularIntensityGreen 0x9d40 -#define GlintLight0SpecularIntensityGreenTag 0x03a8 -#define GlintLight0SpecularIntensityGreenReg 1 -#define GlintLight0SpecularIntensityGreenOff 0x8d40 - -#define GlintLight0SpecularIntensityBlue 0x9d48 -#define GlintLight0SpecularIntensityBlueTag 0x03a9 -#define GlintLight0SpecularIntensityBlueReg 1 -#define GlintLight0SpecularIntensityBlueOff 0x8d48 - -#define GlintLight0PositionX 0x9d50 -#define GlintLight0PositionXTag 0x03aa -#define GlintLight0PositionXReg 1 -#define GlintLight0PositionXOff 0x8d50 - -#define GlintLight0PositionY 0x9d58 -#define GlintLight0PositionYTag 0x03ab -#define GlintLight0PositionYReg 1 -#define GlintLight0PositionYOff 0x8d58 - -#define GlintLight0PositionZ 0x9d60 -#define GlintLight0PositionZTag 0x03ac -#define GlintLight0PositionZReg 1 -#define GlintLight0PositionZOff 0x8d60 - -#define GlintLight0PositionW 0x9d68 -#define GlintLight0PositionWTag 0x03ad -#define GlintLight0PositionWReg 1 -#define GlintLight0PositionWOff 0x8d68 - -#define GlintLight0SpotlightDirectionX 0x9d70 -#define GlintLight0SpotlightDirectionXTag 0x03ae -#define GlintLight0SpotlightDirectionXReg 1 -#define GlintLight0SpotlightDirectionXOff 0x8d70 - -#define GlintLight0SpotlightDirectionY 0x9d78 -#define GlintLight0SpotlightDirectionYTag 0x03af -#define GlintLight0SpotlightDirectionYReg 1 -#define GlintLight0SpotlightDirectionYOff 0x8d78 - -#define GlintLight0SpotlightDirectionZ 0x9d80 -#define GlintLight0SpotlightDirectionZTag 0x03b0 -#define GlintLight0SpotlightDirectionZReg 1 -#define GlintLight0SpotlightDirectionZOff 0x8d80 - -#define GlintLight0SpotlightExponent 0x9d88 -#define GlintLight0SpotlightExponentTag 0x03b1 -#define GlintLight0SpotlightExponentReg 1 -#define GlintLight0SpotlightExponentOff 0x8d88 - -#define GlintLight0CosSpotlightCutoffAngle 0x9d90 -#define GlintLight0CosSpotlightCutoffAngleTag 0x03b2 -#define GlintLight0CosSpotlightCutoffAngleReg 1 -#define GlintLight0CosSpotlightCutoffAngleOff 0x8d90 - -#define GlintLight0ConstantAttenuation 0x9d98 -#define GlintLight0ConstantAttenuationTag 0x03b3 -#define GlintLight0ConstantAttenuationReg 1 -#define GlintLight0ConstantAttenuationOff 0x8d98 - -#define GlintLight0LinearAttenuation 0x9da0 -#define GlintLight0LinearAttenuationTag 0x03b4 -#define GlintLight0LinearAttenuationReg 1 -#define GlintLight0LinearAttenuationOff 0x8da0 - -#define GlintLight0QuadraticAttenuation 0x9da8 -#define GlintLight0QuadraticAttenuationTag 0x03b5 -#define GlintLight0QuadraticAttenuationReg 1 -#define GlintLight0QuadraticAttenuationOff 0x8da8 - -#define GlintLight1Mode 0x9db0 -#define GlintLight1ModeTag 0x03b6 -#define GlintLight1ModeReg 1 -#define GlintLight1ModeOff 0x8db0 - -#define GlintLight1AmbientIntensityRed 0x9db8 -#define GlintLight1AmbientIntensityRedTag 0x03b7 -#define GlintLight1AmbientIntensityRedReg 1 -#define GlintLight1AmbientIntensityRedOff 0x8db8 - -#define GlintLight1AmbientIntensityGreen 0x9dc0 -#define GlintLight1AmbientIntensityGreenTag 0x03b8 -#define GlintLight1AmbientIntensityGreenReg 1 -#define GlintLight1AmbientIntensityGreenOff 0x8dc0 - -#define GlintLight1AmbientIntensityBlue 0x9dc8 -#define GlintLight1AmbientIntensityBlueTag 0x03b9 -#define GlintLight1AmbientIntensityBlueReg 1 -#define GlintLight1AmbientIntensityBlueOff 0x8dc8 - -#define GlintLight1DiffuseIntensityRed 0x9dd0 -#define GlintLight1DiffuseIntensityRedTag 0x03ba -#define GlintLight1DiffuseIntensityRedReg 1 -#define GlintLight1DiffuseIntensityRedOff 0x8dd0 - -#define GlintLight1DiffuseIntensityGreen 0x9dd8 -#define GlintLight1DiffuseIntensityGreenTag 0x03bb -#define GlintLight1DiffuseIntensityGreenReg 1 -#define GlintLight1DiffuseIntensityGreenOff 0x8dd8 - -#define GlintLight1DiffuseIntensityBlue 0x9de0 -#define GlintLight1DiffuseIntensityBlueTag 0x03bc -#define GlintLight1DiffuseIntensityBlueReg 1 -#define GlintLight1DiffuseIntensityBlueOff 0x8de0 - -#define GlintLight1SpecularIntensityRed 0x9de8 -#define GlintLight1SpecularIntensityRedTag 0x03bd -#define GlintLight1SpecularIntensityRedReg 1 -#define GlintLight1SpecularIntensityRedOff 0x8de8 - -#define GlintLight1SpecularIntensityGreen 0x9df0 -#define GlintLight1SpecularIntensityGreenTag 0x03be -#define GlintLight1SpecularIntensityGreenReg 1 -#define GlintLight1SpecularIntensityGreenOff 0x8df0 - -#define GlintLight1SpecularIntensityBlue 0x9df8 -#define GlintLight1SpecularIntensityBlueTag 0x03bf -#define GlintLight1SpecularIntensityBlueReg 1 -#define GlintLight1SpecularIntensityBlueOff 0x8df8 - -#define GlintLight1PositionX 0x9e00 -#define GlintLight1PositionXTag 0x03c0 -#define GlintLight1PositionXReg 1 -#define GlintLight1PositionXOff 0x8e00 - -#define GlintLight1PositionY 0x9e08 -#define GlintLight1PositionYTag 0x03c1 -#define GlintLight1PositionYReg 1 -#define GlintLight1PositionYOff 0x8e08 - -#define GlintLight1PositionZ 0x9e10 -#define GlintLight1PositionZTag 0x03c2 -#define GlintLight1PositionZReg 1 -#define GlintLight1PositionZOff 0x8e10 - -#define GlintLight1PositionW 0x9e18 -#define GlintLight1PositionWTag 0x03c3 -#define GlintLight1PositionWReg 1 -#define GlintLight1PositionWOff 0x8e18 - -#define GlintLight1SpotlightDirectionX 0x9e20 -#define GlintLight1SpotlightDirectionXTag 0x03c4 -#define GlintLight1SpotlightDirectionXReg 1 -#define GlintLight1SpotlightDirectionXOff 0x8e20 - -#define GlintLight1SpotlightDirectionY 0x9e28 -#define GlintLight1SpotlightDirectionYTag 0x03c5 -#define GlintLight1SpotlightDirectionYReg 1 -#define GlintLight1SpotlightDirectionYOff 0x8e28 - -#define GlintLight1SpotlightDirectionZ 0x9e30 -#define GlintLight1SpotlightDirectionZTag 0x03c6 -#define GlintLight1SpotlightDirectionZReg 1 -#define GlintLight1SpotlightDirectionZOff 0x8e30 - -#define GlintLight1SpotlightExponent 0x9e38 -#define GlintLight1SpotlightExponentTag 0x03c7 -#define GlintLight1SpotlightExponentReg 1 -#define GlintLight1SpotlightExponentOff 0x8e38 - -#define GlintLight1CosSpotlightCutoffAngle 0x9e40 -#define GlintLight1CosSpotlightCutoffAngleTag 0x03c8 -#define GlintLight1CosSpotlightCutoffAngleReg 1 -#define GlintLight1CosSpotlightCutoffAngleOff 0x8e40 - -#define GlintLight1ConstantAttenuation 0x9e48 -#define GlintLight1ConstantAttenuationTag 0x03c9 -#define GlintLight1ConstantAttenuationReg 1 -#define GlintLight1ConstantAttenuationOff 0x8e48 - -#define GlintLight1LinearAttenuation 0x9e50 -#define GlintLight1LinearAttenuationTag 0x03ca -#define GlintLight1LinearAttenuationReg 1 -#define GlintLight1LinearAttenuationOff 0x8e50 - -#define GlintLight1QuadraticAttenuation 0x9e58 -#define GlintLight1QuadraticAttenuationTag 0x03cb -#define GlintLight1QuadraticAttenuationReg 1 -#define GlintLight1QuadraticAttenuationOff 0x8e58 - -#define GlintLight2Mode 0x9e60 -#define GlintLight2ModeTag 0x03cc -#define GlintLight2ModeReg 1 -#define GlintLight2ModeOff 0x8e60 - -#define GlintLight2AmbientIntensityRed 0x9e68 -#define GlintLight2AmbientIntensityRedTag 0x03cd -#define GlintLight2AmbientIntensityRedReg 1 -#define GlintLight2AmbientIntensityRedOff 0x8e68 - -#define GlintLight2AmbientIntensityGreen 0x9e70 -#define GlintLight2AmbientIntensityGreenTag 0x03ce -#define GlintLight2AmbientIntensityGreenReg 1 -#define GlintLight2AmbientIntensityGreenOff 0x8e70 - -#define GlintLight2AmbientIntensityBlue 0x9e78 -#define GlintLight2AmbientIntensityBlueTag 0x03cf -#define GlintLight2AmbientIntensityBlueReg 1 -#define GlintLight2AmbientIntensityBlueOff 0x8e78 - -#define GlintLight2DiffuseIntensityRed 0x9e80 -#define GlintLight2DiffuseIntensityRedTag 0x03d0 -#define GlintLight2DiffuseIntensityRedReg 1 -#define GlintLight2DiffuseIntensityRedOff 0x8e80 - -#define GlintLight2DiffuseIntensityGreen 0x9e88 -#define GlintLight2DiffuseIntensityGreenTag 0x03d1 -#define GlintLight2DiffuseIntensityGreenReg 1 -#define GlintLight2DiffuseIntensityGreenOff 0x8e88 - -#define GlintLight2DiffuseIntensityBlue 0x9e90 -#define GlintLight2DiffuseIntensityBlueTag 0x03d2 -#define GlintLight2DiffuseIntensityBlueReg 1 -#define GlintLight2DiffuseIntensityBlueOff 0x8e90 - -#define GlintLight2SpecularIntensityRed 0x9e98 -#define GlintLight2SpecularIntensityRedTag 0x03d3 -#define GlintLight2SpecularIntensityRedReg 1 -#define GlintLight2SpecularIntensityRedOff 0x8e98 - -#define GlintLight2SpecularIntensityGreen 0x9ea0 -#define GlintLight2SpecularIntensityGreenTag 0x03d4 -#define GlintLight2SpecularIntensityGreenReg 1 -#define GlintLight2SpecularIntensityGreenOff 0x8ea0 - -#define GlintLight2SpecularIntensityBlue 0x9ea8 -#define GlintLight2SpecularIntensityBlueTag 0x03d5 -#define GlintLight2SpecularIntensityBlueReg 1 -#define GlintLight2SpecularIntensityBlueOff 0x8ea8 - -#define GlintLight2PositionX 0x9eb0 -#define GlintLight2PositionXTag 0x03d6 -#define GlintLight2PositionXReg 1 -#define GlintLight2PositionXOff 0x8eb0 - -#define GlintLight2PositionY 0x9eb8 -#define GlintLight2PositionYTag 0x03d7 -#define GlintLight2PositionYReg 1 -#define GlintLight2PositionYOff 0x8eb8 - -#define GlintLight2PositionZ 0x9ec0 -#define GlintLight2PositionZTag 0x03d8 -#define GlintLight2PositionZReg 1 -#define GlintLight2PositionZOff 0x8ec0 - -#define GlintLight2PositionW 0x9ec8 -#define GlintLight2PositionWTag 0x03d9 -#define GlintLight2PositionWReg 1 -#define GlintLight2PositionWOff 0x8ec8 - -#define GlintLight2SpotlightDirectionX 0x9ed0 -#define GlintLight2SpotlightDirectionXTag 0x03da -#define GlintLight2SpotlightDirectionXReg 1 -#define GlintLight2SpotlightDirectionXOff 0x8ed0 - -#define GlintLight2SpotlightDirectionY 0x9ed8 -#define GlintLight2SpotlightDirectionYTag 0x03db -#define GlintLight2SpotlightDirectionYReg 1 -#define GlintLight2SpotlightDirectionYOff 0x8ed8 - -#define GlintLight2SpotlightDirectionZ 0x9ee0 -#define GlintLight2SpotlightDirectionZTag 0x03dc -#define GlintLight2SpotlightDirectionZReg 1 -#define GlintLight2SpotlightDirectionZOff 0x8ee0 - -#define GlintLight2SpotlightExponent 0x9ee8 -#define GlintLight2SpotlightExponentTag 0x03dd -#define GlintLight2SpotlightExponentReg 1 -#define GlintLight2SpotlightExponentOff 0x8ee8 - -#define GlintLight2CosSpotlightCutoffAngle 0x9ef0 -#define GlintLight2CosSpotlightCutoffAngleTag 0x03de -#define GlintLight2CosSpotlightCutoffAngleReg 1 -#define GlintLight2CosSpotlightCutoffAngleOff 0x8ef0 - -#define GlintLight2ConstantAttenuation 0x9ef8 -#define GlintLight2ConstantAttenuationTag 0x03df -#define GlintLight2ConstantAttenuationReg 1 -#define GlintLight2ConstantAttenuationOff 0x8ef8 - -#define GlintLight2LinearAttenuation 0x9f00 -#define GlintLight2LinearAttenuationTag 0x03e0 -#define GlintLight2LinearAttenuationReg 1 -#define GlintLight2LinearAttenuationOff 0x8f00 - -#define GlintLight2QuadraticAttenuation 0x9f08 -#define GlintLight2QuadraticAttenuationTag 0x03e1 -#define GlintLight2QuadraticAttenuationReg 1 -#define GlintLight2QuadraticAttenuationOff 0x8f08 - -#define GlintLight3Mode 0x9f10 -#define GlintLight3ModeTag 0x03e2 -#define GlintLight3ModeReg 1 -#define GlintLight3ModeOff 0x8f10 - -#define GlintLight3AmbientIntensityRed 0x9f18 -#define GlintLight3AmbientIntensityRedTag 0x03e3 -#define GlintLight3AmbientIntensityRedReg 1 -#define GlintLight3AmbientIntensityRedOff 0x8f18 - -#define GlintLight3AmbientIntensityGreen 0x9f20 -#define GlintLight3AmbientIntensityGreenTag 0x03e4 -#define GlintLight3AmbientIntensityGreenReg 1 -#define GlintLight3AmbientIntensityGreenOff 0x8f20 - -#define GlintLight3AmbientIntensityBlue 0x9f28 -#define GlintLight3AmbientIntensityBlueTag 0x03e5 -#define GlintLight3AmbientIntensityBlueReg 1 -#define GlintLight3AmbientIntensityBlueOff 0x8f28 - -#define GlintLight3DiffuseIntensityRed 0x9f30 -#define GlintLight3DiffuseIntensityRedTag 0x03e6 -#define GlintLight3DiffuseIntensityRedReg 1 -#define GlintLight3DiffuseIntensityRedOff 0x8f30 - -#define GlintLight3DiffuseIntensityGreen 0x9f38 -#define GlintLight3DiffuseIntensityGreenTag 0x03e7 -#define GlintLight3DiffuseIntensityGreenReg 1 -#define GlintLight3DiffuseIntensityGreenOff 0x8f38 - -#define GlintLight3DiffuseIntensityBlue 0x9f40 -#define GlintLight3DiffuseIntensityBlueTag 0x03e8 -#define GlintLight3DiffuseIntensityBlueReg 1 -#define GlintLight3DiffuseIntensityBlueOff 0x8f40 - -#define GlintLight3SpecularIntensityRed 0x9f48 -#define GlintLight3SpecularIntensityRedTag 0x03e9 -#define GlintLight3SpecularIntensityRedReg 1 -#define GlintLight3SpecularIntensityRedOff 0x8f48 - -#define GlintLight3SpecularIntensityGreen 0x9f50 -#define GlintLight3SpecularIntensityGreenTag 0x03ea -#define GlintLight3SpecularIntensityGreenReg 1 -#define GlintLight3SpecularIntensityGreenOff 0x8f50 - -#define GlintLight3SpecularIntensityBlue 0x9f58 -#define GlintLight3SpecularIntensityBlueTag 0x03eb -#define GlintLight3SpecularIntensityBlueReg 1 -#define GlintLight3SpecularIntensityBlueOff 0x8f58 - -#define GlintLight3PositionX 0x9f60 -#define GlintLight3PositionXTag 0x03ec -#define GlintLight3PositionXReg 1 -#define GlintLight3PositionXOff 0x8f60 - -#define GlintLight3PositionY 0x9f68 -#define GlintLight3PositionYTag 0x03ed -#define GlintLight3PositionYReg 1 -#define GlintLight3PositionYOff 0x8f68 - -#define GlintLight3PositionZ 0x9f70 -#define GlintLight3PositionZTag 0x03ee -#define GlintLight3PositionZReg 1 -#define GlintLight3PositionZOff 0x8f70 - -#define GlintLight3PositionW 0x9f78 -#define GlintLight3PositionWTag 0x03ef -#define GlintLight3PositionWReg 1 -#define GlintLight3PositionWOff 0x8f78 - -#define GlintLight3SpotlightDirectionX 0x9f80 -#define GlintLight3SpotlightDirectionXTag 0x03f0 -#define GlintLight3SpotlightDirectionXReg 1 -#define GlintLight3SpotlightDirectionXOff 0x8f80 - -#define GlintLight3SpotlightDirectionY 0x9f88 -#define GlintLight3SpotlightDirectionYTag 0x03f1 -#define GlintLight3SpotlightDirectionYReg 1 -#define GlintLight3SpotlightDirectionYOff 0x8f88 - -#define GlintLight3SpotlightDirectionZ 0x9f90 -#define GlintLight3SpotlightDirectionZTag 0x03f2 -#define GlintLight3SpotlightDirectionZReg 1 -#define GlintLight3SpotlightDirectionZOff 0x8f90 - -#define GlintLight3SpotlightExponent 0x9f98 -#define GlintLight3SpotlightExponentTag 0x03f3 -#define GlintLight3SpotlightExponentReg 1 -#define GlintLight3SpotlightExponentOff 0x8f98 - -#define GlintLight3CosSpotlightCutoffAngle 0x9fa0 -#define GlintLight3CosSpotlightCutoffAngleTag 0x03f4 -#define GlintLight3CosSpotlightCutoffAngleReg 1 -#define GlintLight3CosSpotlightCutoffAngleOff 0x8fa0 - -#define GlintLight3ConstantAttenuation 0x9fa8 -#define GlintLight3ConstantAttenuationTag 0x03f5 -#define GlintLight3ConstantAttenuationReg 1 -#define GlintLight3ConstantAttenuationOff 0x8fa8 - -#define GlintLight3LinearAttenuation 0x9fb0 -#define GlintLight3LinearAttenuationTag 0x03f6 -#define GlintLight3LinearAttenuationReg 1 -#define GlintLight3LinearAttenuationOff 0x8fb0 - -#define GlintLight3QuadraticAttenuation 0x9fb8 -#define GlintLight3QuadraticAttenuationTag 0x03f7 -#define GlintLight3QuadraticAttenuationReg 1 -#define GlintLight3QuadraticAttenuationOff 0x8fb8 - -#define GlintLight4Mode 0x9fc0 -#define GlintLight4ModeTag 0x03f8 -#define GlintLight4ModeReg 1 -#define GlintLight4ModeOff 0x8fc0 - -#define GlintLight4AmbientIntensityRed 0x9fc8 -#define GlintLight4AmbientIntensityRedTag 0x03f9 -#define GlintLight4AmbientIntensityRedReg 1 -#define GlintLight4AmbientIntensityRedOff 0x8fc8 - -#define GlintLight4AmbientIntensityGreen 0x9fd0 -#define GlintLight4AmbientIntensityGreenTag 0x03fa -#define GlintLight4AmbientIntensityGreenReg 1 -#define GlintLight4AmbientIntensityGreenOff 0x8fd0 - -#define GlintLight4AmbientIntensityBlue 0x9fd8 -#define GlintLight4AmbientIntensityBlueTag 0x03fb -#define GlintLight4AmbientIntensityBlueReg 1 -#define GlintLight4AmbientIntensityBlueOff 0x8fd8 - -#define GlintLight4DiffuseIntensityRed 0x9fe0 -#define GlintLight4DiffuseIntensityRedTag 0x03fc -#define GlintLight4DiffuseIntensityRedReg 1 -#define GlintLight4DiffuseIntensityRedOff 0x8fe0 - -#define GlintLight4DiffuseIntensityGreen 0x9fe8 -#define GlintLight4DiffuseIntensityGreenTag 0x03fd -#define GlintLight4DiffuseIntensityGreenReg 1 -#define GlintLight4DiffuseIntensityGreenOff 0x8fe8 - -#define GlintLight4DiffuseIntensityBlue 0x9ff0 -#define GlintLight4DiffuseIntensityBlueTag 0x03fe -#define GlintLight4DiffuseIntensityBlueReg 1 -#define GlintLight4DiffuseIntensityBlueOff 0x8ff0 - -#define GlintLight4SpecularIntensityRed 0x9ff8 -#define GlintLight4SpecularIntensityRedTag 0x03ff -#define GlintLight4SpecularIntensityRedReg 1 -#define GlintLight4SpecularIntensityRedOff 0x8ff8 - -#define GlintLight4SpecularIntensityGreen 0xa000 -#define GlintLight4SpecularIntensityGreenTag 0x0400 -#define GlintLight4SpecularIntensityGreenReg 1 -#define GlintLight4SpecularIntensityGreenOff 0x9000 - -#define GlintLight4SpecularIntensityBlue 0xa008 -#define GlintLight4SpecularIntensityBlueTag 0x0401 -#define GlintLight4SpecularIntensityBlueReg 1 -#define GlintLight4SpecularIntensityBlueOff 0x9008 - -#define GlintLight4PositionX 0xa010 -#define GlintLight4PositionXTag 0x0402 -#define GlintLight4PositionXReg 1 -#define GlintLight4PositionXOff 0x9010 - -#define GlintLight4PositionY 0xa018 -#define GlintLight4PositionYTag 0x0403 -#define GlintLight4PositionYReg 1 -#define GlintLight4PositionYOff 0x9018 - -#define GlintLight4PositionZ 0xa020 -#define GlintLight4PositionZTag 0x0404 -#define GlintLight4PositionZReg 1 -#define GlintLight4PositionZOff 0x9020 - -#define GlintLight4PositionW 0xa028 -#define GlintLight4PositionWTag 0x0405 -#define GlintLight4PositionWReg 1 -#define GlintLight4PositionWOff 0x9028 - -#define GlintLight4SpotlightDirectionX 0xa030 -#define GlintLight4SpotlightDirectionXTag 0x0406 -#define GlintLight4SpotlightDirectionXReg 1 -#define GlintLight4SpotlightDirectionXOff 0x9030 - -#define GlintLight4SpotlightDirectionY 0xa038 -#define GlintLight4SpotlightDirectionYTag 0x0407 -#define GlintLight4SpotlightDirectionYReg 1 -#define GlintLight4SpotlightDirectionYOff 0x9038 - -#define GlintLight4SpotlightDirectionZ 0xa040 -#define GlintLight4SpotlightDirectionZTag 0x0408 -#define GlintLight4SpotlightDirectionZReg 1 -#define GlintLight4SpotlightDirectionZOff 0x9040 - -#define GlintLight4SpotlightExponent 0xa048 -#define GlintLight4SpotlightExponentTag 0x0409 -#define GlintLight4SpotlightExponentReg 1 -#define GlintLight4SpotlightExponentOff 0x9048 - -#define GlintLight4CosSpotlightCutoffAngle 0xa050 -#define GlintLight4CosSpotlightCutoffAngleTag 0x040a -#define GlintLight4CosSpotlightCutoffAngleReg 1 -#define GlintLight4CosSpotlightCutoffAngleOff 0x9050 - -#define GlintLight4ConstantAttenuation 0xa058 -#define GlintLight4ConstantAttenuationTag 0x040b -#define GlintLight4ConstantAttenuationReg 1 -#define GlintLight4ConstantAttenuationOff 0x9058 - -#define GlintLight4LinearAttenuation 0xa060 -#define GlintLight4LinearAttenuationTag 0x040c -#define GlintLight4LinearAttenuationReg 1 -#define GlintLight4LinearAttenuationOff 0x9060 - -#define GlintLight4QuadraticAttenuation 0xa068 -#define GlintLight4QuadraticAttenuationTag 0x040d -#define GlintLight4QuadraticAttenuationReg 1 -#define GlintLight4QuadraticAttenuationOff 0x9068 - -#define GlintLight5Mode 0xa070 -#define GlintLight5ModeTag 0x040e -#define GlintLight5ModeReg 1 -#define GlintLight5ModeOff 0x9070 - -#define GlintLight5AmbientIntensityRed 0xa078 -#define GlintLight5AmbientIntensityRedTag 0x040f -#define GlintLight5AmbientIntensityRedReg 1 -#define GlintLight5AmbientIntensityRedOff 0x9078 - -#define GlintLight5AmbientIntensityGreen 0xa080 -#define GlintLight5AmbientIntensityGreenTag 0x0410 -#define GlintLight5AmbientIntensityGreenReg 1 -#define GlintLight5AmbientIntensityGreenOff 0x9080 - -#define GlintLight5AmbientIntensityBlue 0xa088 -#define GlintLight5AmbientIntensityBlueTag 0x0411 -#define GlintLight5AmbientIntensityBlueReg 1 -#define GlintLight5AmbientIntensityBlueOff 0x9088 - -#define GlintLight5DiffuseIntensityRed 0xa090 -#define GlintLight5DiffuseIntensityRedTag 0x0412 -#define GlintLight5DiffuseIntensityRedReg 1 -#define GlintLight5DiffuseIntensityRedOff 0x9090 - -#define GlintLight5DiffuseIntensityGreen 0xa098 -#define GlintLight5DiffuseIntensityGreenTag 0x0413 -#define GlintLight5DiffuseIntensityGreenReg 1 -#define GlintLight5DiffuseIntensityGreenOff 0x9098 - -#define GlintLight5DiffuseIntensityBlue 0xa0a0 -#define GlintLight5DiffuseIntensityBlueTag 0x0414 -#define GlintLight5DiffuseIntensityBlueReg 1 -#define GlintLight5DiffuseIntensityBlueOff 0x90a0 - -#define GlintLight5SpecularIntensityRed 0xa0a8 -#define GlintLight5SpecularIntensityRedTag 0x0415 -#define GlintLight5SpecularIntensityRedReg 1 -#define GlintLight5SpecularIntensityRedOff 0x90a8 - -#define GlintLight5SpecularIntensityGreen 0xa0b0 -#define GlintLight5SpecularIntensityGreenTag 0x0416 -#define GlintLight5SpecularIntensityGreenReg 1 -#define GlintLight5SpecularIntensityGreenOff 0x90b0 - -#define GlintLight5SpecularIntensityBlue 0xa0b8 -#define GlintLight5SpecularIntensityBlueTag 0x0417 -#define GlintLight5SpecularIntensityBlueReg 1 -#define GlintLight5SpecularIntensityBlueOff 0x90b8 - -#define GlintLight5PositionX 0xa0c0 -#define GlintLight5PositionXTag 0x0418 -#define GlintLight5PositionXReg 1 -#define GlintLight5PositionXOff 0x90c0 - -#define GlintLight5PositionY 0xa0c8 -#define GlintLight5PositionYTag 0x0419 -#define GlintLight5PositionYReg 1 -#define GlintLight5PositionYOff 0x90c8 - -#define GlintLight5PositionZ 0xa0d0 -#define GlintLight5PositionZTag 0x041a -#define GlintLight5PositionZReg 1 -#define GlintLight5PositionZOff 0x90d0 - -#define GlintLight5PositionW 0xa0d8 -#define GlintLight5PositionWTag 0x041b -#define GlintLight5PositionWReg 1 -#define GlintLight5PositionWOff 0x90d8 - -#define GlintLight5SpotlightDirectionX 0xa0e0 -#define GlintLight5SpotlightDirectionXTag 0x041c -#define GlintLight5SpotlightDirectionXReg 1 -#define GlintLight5SpotlightDirectionXOff 0x90e0 - -#define GlintLight5SpotlightDirectionY 0xa0e8 -#define GlintLight5SpotlightDirectionYTag 0x041d -#define GlintLight5SpotlightDirectionYReg 1 -#define GlintLight5SpotlightDirectionYOff 0x90e8 - -#define GlintLight5SpotlightDirectionZ 0xa0f0 -#define GlintLight5SpotlightDirectionZTag 0x041e -#define GlintLight5SpotlightDirectionZReg 1 -#define GlintLight5SpotlightDirectionZOff 0x90f0 - -#define GlintLight5SpotlightExponent 0xa0f8 -#define GlintLight5SpotlightExponentTag 0x041f -#define GlintLight5SpotlightExponentReg 1 -#define GlintLight5SpotlightExponentOff 0x90f8 - -#define GlintLight5CosSpotlightCutoffAngle 0xa100 -#define GlintLight5CosSpotlightCutoffAngleTag 0x0420 -#define GlintLight5CosSpotlightCutoffAngleReg 1 -#define GlintLight5CosSpotlightCutoffAngleOff 0x9100 - -#define GlintLight5ConstantAttenuation 0xa108 -#define GlintLight5ConstantAttenuationTag 0x0421 -#define GlintLight5ConstantAttenuationReg 1 -#define GlintLight5ConstantAttenuationOff 0x9108 - -#define GlintLight5LinearAttenuation 0xa110 -#define GlintLight5LinearAttenuationTag 0x0422 -#define GlintLight5LinearAttenuationReg 1 -#define GlintLight5LinearAttenuationOff 0x9110 - -#define GlintLight5QuadraticAttenuation 0xa118 -#define GlintLight5QuadraticAttenuationTag 0x0423 -#define GlintLight5QuadraticAttenuationReg 1 -#define GlintLight5QuadraticAttenuationOff 0x9118 - -#define GlintLight6Mode 0xa120 -#define GlintLight6ModeTag 0x0424 -#define GlintLight6ModeReg 1 -#define GlintLight6ModeOff 0x9120 - -#define GlintLight6AmbientIntensityRed 0xa128 -#define GlintLight6AmbientIntensityRedTag 0x0425 -#define GlintLight6AmbientIntensityRedReg 1 -#define GlintLight6AmbientIntensityRedOff 0x9128 - -#define GlintLight6AmbientIntensityGreen 0xa130 -#define GlintLight6AmbientIntensityGreenTag 0x0426 -#define GlintLight6AmbientIntensityGreenReg 1 -#define GlintLight6AmbientIntensityGreenOff 0x9130 - -#define GlintLight6AmbientIntensityBlue 0xa138 -#define GlintLight6AmbientIntensityBlueTag 0x0427 -#define GlintLight6AmbientIntensityBlueReg 1 -#define GlintLight6AmbientIntensityBlueOff 0x9138 - -#define GlintLight6DiffuseIntensityRed 0xa140 -#define GlintLight6DiffuseIntensityRedTag 0x0428 -#define GlintLight6DiffuseIntensityRedReg 1 -#define GlintLight6DiffuseIntensityRedOff 0x9140 - -#define GlintLight6DiffuseIntensityGreen 0xa148 -#define GlintLight6DiffuseIntensityGreenTag 0x0429 -#define GlintLight6DiffuseIntensityGreenReg 1 -#define GlintLight6DiffuseIntensityGreenOff 0x9148 - -#define GlintLight6DiffuseIntensityBlue 0xa150 -#define GlintLight6DiffuseIntensityBlueTag 0x042a -#define GlintLight6DiffuseIntensityBlueReg 1 -#define GlintLight6DiffuseIntensityBlueOff 0x9150 - -#define GlintLight6SpecularIntensityRed 0xa158 -#define GlintLight6SpecularIntensityRedTag 0x042b -#define GlintLight6SpecularIntensityRedReg 1 -#define GlintLight6SpecularIntensityRedOff 0x9158 - -#define GlintLight6SpecularIntensityGreen 0xa160 -#define GlintLight6SpecularIntensityGreenTag 0x042c -#define GlintLight6SpecularIntensityGreenReg 1 -#define GlintLight6SpecularIntensityGreenOff 0x9160 - -#define GlintLight6SpecularIntensityBlue 0xa168 -#define GlintLight6SpecularIntensityBlueTag 0x042d -#define GlintLight6SpecularIntensityBlueReg 1 -#define GlintLight6SpecularIntensityBlueOff 0x9168 - -#define GlintLight6PositionX 0xa170 -#define GlintLight6PositionXTag 0x042e -#define GlintLight6PositionXReg 1 -#define GlintLight6PositionXOff 0x9170 - -#define GlintLight6PositionY 0xa178 -#define GlintLight6PositionYTag 0x042f -#define GlintLight6PositionYReg 1 -#define GlintLight6PositionYOff 0x9178 - -#define GlintLight6PositionZ 0xa180 -#define GlintLight6PositionZTag 0x0430 -#define GlintLight6PositionZReg 1 -#define GlintLight6PositionZOff 0x9180 - -#define GlintLight6PositionW 0xa188 -#define GlintLight6PositionWTag 0x0431 -#define GlintLight6PositionWReg 1 -#define GlintLight6PositionWOff 0x9188 - -#define GlintLight6SpotlightDirectionX 0xa190 -#define GlintLight6SpotlightDirectionXTag 0x0432 -#define GlintLight6SpotlightDirectionXReg 1 -#define GlintLight6SpotlightDirectionXOff 0x9190 - -#define GlintLight6SpotlightDirectionY 0xa198 -#define GlintLight6SpotlightDirectionYTag 0x0433 -#define GlintLight6SpotlightDirectionYReg 1 -#define GlintLight6SpotlightDirectionYOff 0x9198 - -#define GlintLight6SpotlightDirectionZ 0xa1a0 -#define GlintLight6SpotlightDirectionZTag 0x0434 -#define GlintLight6SpotlightDirectionZReg 1 -#define GlintLight6SpotlightDirectionZOff 0x91a0 - -#define GlintLight6SpotlightExponent 0xa1a8 -#define GlintLight6SpotlightExponentTag 0x0435 -#define GlintLight6SpotlightExponentReg 1 -#define GlintLight6SpotlightExponentOff 0x91a8 - -#define GlintLight6CosSpotlightCutoffAngle 0xa1b0 -#define GlintLight6CosSpotlightCutoffAngleTag 0x0436 -#define GlintLight6CosSpotlightCutoffAngleReg 1 -#define GlintLight6CosSpotlightCutoffAngleOff 0x91b0 - -#define GlintLight6ConstantAttenuation 0xa1b8 -#define GlintLight6ConstantAttenuationTag 0x0437 -#define GlintLight6ConstantAttenuationReg 1 -#define GlintLight6ConstantAttenuationOff 0x91b8 - -#define GlintLight6LinearAttenuation 0xa1c0 -#define GlintLight6LinearAttenuationTag 0x0438 -#define GlintLight6LinearAttenuationReg 1 -#define GlintLight6LinearAttenuationOff 0x91c0 - -#define GlintLight6QuadraticAttenuation 0xa1c8 -#define GlintLight6QuadraticAttenuationTag 0x0439 -#define GlintLight6QuadraticAttenuationReg 1 -#define GlintLight6QuadraticAttenuationOff 0x91c8 - -#define GlintLight7Mode 0xa1d0 -#define GlintLight7ModeTag 0x043a -#define GlintLight7ModeReg 1 -#define GlintLight7ModeOff 0x91d0 - -#define GlintLight7AmbientIntensityRed 0xa1d8 -#define GlintLight7AmbientIntensityRedTag 0x043b -#define GlintLight7AmbientIntensityRedReg 1 -#define GlintLight7AmbientIntensityRedOff 0x91d8 - -#define GlintLight7AmbientIntensityGreen 0xa1e0 -#define GlintLight7AmbientIntensityGreenTag 0x043c -#define GlintLight7AmbientIntensityGreenReg 1 -#define GlintLight7AmbientIntensityGreenOff 0x91e0 - -#define GlintLight7AmbientIntensityBlue 0xa1e8 -#define GlintLight7AmbientIntensityBlueTag 0x043d -#define GlintLight7AmbientIntensityBlueReg 1 -#define GlintLight7AmbientIntensityBlueOff 0x91e8 - -#define GlintLight7DiffuseIntensityRed 0xa1f0 -#define GlintLight7DiffuseIntensityRedTag 0x043e -#define GlintLight7DiffuseIntensityRedReg 1 -#define GlintLight7DiffuseIntensityRedOff 0x91f0 - -#define GlintLight7DiffuseIntensityGreen 0xa1f8 -#define GlintLight7DiffuseIntensityGreenTag 0x043f -#define GlintLight7DiffuseIntensityGreenReg 1 -#define GlintLight7DiffuseIntensityGreenOff 0x91f8 - -#define GlintLight7DiffuseIntensityBlue 0xa200 -#define GlintLight7DiffuseIntensityBlueTag 0x0440 -#define GlintLight7DiffuseIntensityBlueReg 1 -#define GlintLight7DiffuseIntensityBlueOff 0x9200 - -#define GlintLight7SpecularIntensityRed 0xa208 -#define GlintLight7SpecularIntensityRedTag 0x0441 -#define GlintLight7SpecularIntensityRedReg 1 -#define GlintLight7SpecularIntensityRedOff 0x9208 - -#define GlintLight7SpecularIntensityGreen 0xa210 -#define GlintLight7SpecularIntensityGreenTag 0x0442 -#define GlintLight7SpecularIntensityGreenReg 1 -#define GlintLight7SpecularIntensityGreenOff 0x9210 - -#define GlintLight7SpecularIntensityBlue 0xa218 -#define GlintLight7SpecularIntensityBlueTag 0x0443 -#define GlintLight7SpecularIntensityBlueReg 1 -#define GlintLight7SpecularIntensityBlueOff 0x9218 - -#define GlintLight7PositionX 0xa220 -#define GlintLight7PositionXTag 0x0444 -#define GlintLight7PositionXReg 1 -#define GlintLight7PositionXOff 0x9220 - -#define GlintLight7PositionY 0xa228 -#define GlintLight7PositionYTag 0x0445 -#define GlintLight7PositionYReg 1 -#define GlintLight7PositionYOff 0x9228 - -#define GlintLight7PositionZ 0xa230 -#define GlintLight7PositionZTag 0x0446 -#define GlintLight7PositionZReg 1 -#define GlintLight7PositionZOff 0x9230 - -#define GlintLight7PositionW 0xa238 -#define GlintLight7PositionWTag 0x0447 -#define GlintLight7PositionWReg 1 -#define GlintLight7PositionWOff 0x9238 - -#define GlintLight7SpotlightDirectionX 0xa240 -#define GlintLight7SpotlightDirectionXTag 0x0448 -#define GlintLight7SpotlightDirectionXReg 1 -#define GlintLight7SpotlightDirectionXOff 0x9240 - -#define GlintLight7SpotlightDirectionY 0xa248 -#define GlintLight7SpotlightDirectionYTag 0x0449 -#define GlintLight7SpotlightDirectionYReg 1 -#define GlintLight7SpotlightDirectionYOff 0x9248 - -#define GlintLight7SpotlightDirectionZ 0xa250 -#define GlintLight7SpotlightDirectionZTag 0x044a -#define GlintLight7SpotlightDirectionZReg 1 -#define GlintLight7SpotlightDirectionZOff 0x9250 - -#define GlintLight7SpotlightExponent 0xa258 -#define GlintLight7SpotlightExponentTag 0x044b -#define GlintLight7SpotlightExponentReg 1 -#define GlintLight7SpotlightExponentOff 0x9258 - -#define GlintLight7CosSpotlightCutoffAngle 0xa260 -#define GlintLight7CosSpotlightCutoffAngleTag 0x044c -#define GlintLight7CosSpotlightCutoffAngleReg 1 -#define GlintLight7CosSpotlightCutoffAngleOff 0x9260 - -#define GlintLight7ConstantAttenuation 0xa268 -#define GlintLight7ConstantAttenuationTag 0x044d -#define GlintLight7ConstantAttenuationReg 1 -#define GlintLight7ConstantAttenuationOff 0x9268 - -#define GlintLight7LinearAttenuation 0xa270 -#define GlintLight7LinearAttenuationTag 0x044e -#define GlintLight7LinearAttenuationReg 1 -#define GlintLight7LinearAttenuationOff 0x9270 - -#define GlintLight7QuadraticAttenuation 0xa278 -#define GlintLight7QuadraticAttenuationTag 0x044f -#define GlintLight7QuadraticAttenuationReg 1 -#define GlintLight7QuadraticAttenuationOff 0x9278 - -#define GlintLight8Mode 0xa280 -#define GlintLight8ModeTag 0x0450 -#define GlintLight8ModeReg 1 -#define GlintLight8ModeOff 0x9280 - -#define GlintLight8AmbientIntensityRed 0xa288 -#define GlintLight8AmbientIntensityRedTag 0x0451 -#define GlintLight8AmbientIntensityRedReg 1 -#define GlintLight8AmbientIntensityRedOff 0x9288 - -#define GlintLight8AmbientIntensityGreen 0xa290 -#define GlintLight8AmbientIntensityGreenTag 0x0452 -#define GlintLight8AmbientIntensityGreenReg 1 -#define GlintLight8AmbientIntensityGreenOff 0x9290 - -#define GlintLight8AmbientIntensityBlue 0xa298 -#define GlintLight8AmbientIntensityBlueTag 0x0453 -#define GlintLight8AmbientIntensityBlueReg 1 -#define GlintLight8AmbientIntensityBlueOff 0x9298 - -#define GlintLight8DiffuseIntensityRed 0xa2a0 -#define GlintLight8DiffuseIntensityRedTag 0x0454 -#define GlintLight8DiffuseIntensityRedReg 1 -#define GlintLight8DiffuseIntensityRedOff 0x92a0 - -#define GlintLight8DiffuseIntensityGreen 0xa2a8 -#define GlintLight8DiffuseIntensityGreenTag 0x0455 -#define GlintLight8DiffuseIntensityGreenReg 1 -#define GlintLight8DiffuseIntensityGreenOff 0x92a8 - -#define GlintLight8DiffuseIntensityBlue 0xa2b0 -#define GlintLight8DiffuseIntensityBlueTag 0x0456 -#define GlintLight8DiffuseIntensityBlueReg 1 -#define GlintLight8DiffuseIntensityBlueOff 0x92b0 - -#define GlintLight8SpecularIntensityRed 0xa2b8 -#define GlintLight8SpecularIntensityRedTag 0x0457 -#define GlintLight8SpecularIntensityRedReg 1 -#define GlintLight8SpecularIntensityRedOff 0x92b8 - -#define GlintLight8SpecularIntensityGreen 0xa2c0 -#define GlintLight8SpecularIntensityGreenTag 0x0458 -#define GlintLight8SpecularIntensityGreenReg 1 -#define GlintLight8SpecularIntensityGreenOff 0x92c0 - -#define GlintLight8SpecularIntensityBlue 0xa2c8 -#define GlintLight8SpecularIntensityBlueTag 0x0459 -#define GlintLight8SpecularIntensityBlueReg 1 -#define GlintLight8SpecularIntensityBlueOff 0x92c8 - -#define GlintLight8PositionX 0xa2d0 -#define GlintLight8PositionXTag 0x045a -#define GlintLight8PositionXReg 1 -#define GlintLight8PositionXOff 0x92d0 - -#define GlintLight8PositionY 0xa2d8 -#define GlintLight8PositionYTag 0x045b -#define GlintLight8PositionYReg 1 -#define GlintLight8PositionYOff 0x92d8 - -#define GlintLight8PositionZ 0xa2e0 -#define GlintLight8PositionZTag 0x045c -#define GlintLight8PositionZReg 1 -#define GlintLight8PositionZOff 0x92e0 - -#define GlintLight8PositionW 0xa2e8 -#define GlintLight8PositionWTag 0x045d -#define GlintLight8PositionWReg 1 -#define GlintLight8PositionWOff 0x92e8 - -#define GlintLight8SpotlightDirectionX 0xa2f0 -#define GlintLight8SpotlightDirectionXTag 0x045e -#define GlintLight8SpotlightDirectionXReg 1 -#define GlintLight8SpotlightDirectionXOff 0x92f0 - -#define GlintLight8SpotlightDirectionY 0xa2f8 -#define GlintLight8SpotlightDirectionYTag 0x045f -#define GlintLight8SpotlightDirectionYReg 1 -#define GlintLight8SpotlightDirectionYOff 0x92f8 - -#define GlintLight8SpotlightDirectionZ 0xa300 -#define GlintLight8SpotlightDirectionZTag 0x0460 -#define GlintLight8SpotlightDirectionZReg 1 -#define GlintLight8SpotlightDirectionZOff 0x9300 - -#define GlintLight8SpotlightExponent 0xa308 -#define GlintLight8SpotlightExponentTag 0x0461 -#define GlintLight8SpotlightExponentReg 1 -#define GlintLight8SpotlightExponentOff 0x9308 - -#define GlintLight8CosSpotlightCutoffAngle 0xa310 -#define GlintLight8CosSpotlightCutoffAngleTag 0x0462 -#define GlintLight8CosSpotlightCutoffAngleReg 1 -#define GlintLight8CosSpotlightCutoffAngleOff 0x9310 - -#define GlintLight8ConstantAttenuation 0xa318 -#define GlintLight8ConstantAttenuationTag 0x0463 -#define GlintLight8ConstantAttenuationReg 1 -#define GlintLight8ConstantAttenuationOff 0x9318 - -#define GlintLight8LinearAttenuation 0xa320 -#define GlintLight8LinearAttenuationTag 0x0464 -#define GlintLight8LinearAttenuationReg 1 -#define GlintLight8LinearAttenuationOff 0x9320 - -#define GlintLight8QuadraticAttenuation 0xa328 -#define GlintLight8QuadraticAttenuationTag 0x0465 -#define GlintLight8QuadraticAttenuationReg 1 -#define GlintLight8QuadraticAttenuationOff 0x9328 - -#define GlintLight9Mode 0xa330 -#define GlintLight9ModeTag 0x0466 -#define GlintLight9ModeReg 1 -#define GlintLight9ModeOff 0x9330 - -#define GlintLight9AmbientIntensityRed 0xa338 -#define GlintLight9AmbientIntensityRedTag 0x0467 -#define GlintLight9AmbientIntensityRedReg 1 -#define GlintLight9AmbientIntensityRedOff 0x9338 - -#define GlintLight9AmbientIntensityGreen 0xa340 -#define GlintLight9AmbientIntensityGreenTag 0x0468 -#define GlintLight9AmbientIntensityGreenReg 1 -#define GlintLight9AmbientIntensityGreenOff 0x9340 - -#define GlintLight9AmbientIntensityBlue 0xa348 -#define GlintLight9AmbientIntensityBlueTag 0x0469 -#define GlintLight9AmbientIntensityBlueReg 1 -#define GlintLight9AmbientIntensityBlueOff 0x9348 - -#define GlintLight9DiffuseIntensityRed 0xa350 -#define GlintLight9DiffuseIntensityRedTag 0x046a -#define GlintLight9DiffuseIntensityRedReg 1 -#define GlintLight9DiffuseIntensityRedOff 0x9350 - -#define GlintLight9DiffuseIntensityGreen 0xa358 -#define GlintLight9DiffuseIntensityGreenTag 0x046b -#define GlintLight9DiffuseIntensityGreenReg 1 -#define GlintLight9DiffuseIntensityGreenOff 0x9358 - -#define GlintLight9DiffuseIntensityBlue 0xa360 -#define GlintLight9DiffuseIntensityBlueTag 0x046c -#define GlintLight9DiffuseIntensityBlueReg 1 -#define GlintLight9DiffuseIntensityBlueOff 0x9360 - -#define GlintLight9SpecularIntensityRed 0xa368 -#define GlintLight9SpecularIntensityRedTag 0x046d -#define GlintLight9SpecularIntensityRedReg 1 -#define GlintLight9SpecularIntensityRedOff 0x9368 - -#define GlintLight9SpecularIntensityGreen 0xa370 -#define GlintLight9SpecularIntensityGreenTag 0x046e -#define GlintLight9SpecularIntensityGreenReg 1 -#define GlintLight9SpecularIntensityGreenOff 0x9370 - -#define GlintLight9SpecularIntensityBlue 0xa378 -#define GlintLight9SpecularIntensityBlueTag 0x046f -#define GlintLight9SpecularIntensityBlueReg 1 -#define GlintLight9SpecularIntensityBlueOff 0x9378 - -#define GlintLight9PositionX 0xa380 -#define GlintLight9PositionXTag 0x0470 -#define GlintLight9PositionXReg 1 -#define GlintLight9PositionXOff 0x9380 - -#define GlintLight9PositionY 0xa388 -#define GlintLight9PositionYTag 0x0471 -#define GlintLight9PositionYReg 1 -#define GlintLight9PositionYOff 0x9388 - -#define GlintLight9PositionZ 0xa390 -#define GlintLight9PositionZTag 0x0472 -#define GlintLight9PositionZReg 1 -#define GlintLight9PositionZOff 0x9390 - -#define GlintLight9PositionW 0xa398 -#define GlintLight9PositionWTag 0x0473 -#define GlintLight9PositionWReg 1 -#define GlintLight9PositionWOff 0x9398 - -#define GlintLight9SpotlightDirectionX 0xa3a0 -#define GlintLight9SpotlightDirectionXTag 0x0474 -#define GlintLight9SpotlightDirectionXReg 1 -#define GlintLight9SpotlightDirectionXOff 0x93a0 - -#define GlintLight9SpotlightDirectionY 0xa3a8 -#define GlintLight9SpotlightDirectionYTag 0x0475 -#define GlintLight9SpotlightDirectionYReg 1 -#define GlintLight9SpotlightDirectionYOff 0x93a8 - -#define GlintLight9SpotlightDirectionZ 0xa3b0 -#define GlintLight9SpotlightDirectionZTag 0x0476 -#define GlintLight9SpotlightDirectionZReg 1 -#define GlintLight9SpotlightDirectionZOff 0x93b0 - -#define GlintLight9SpotlightExponent 0xa3b8 -#define GlintLight9SpotlightExponentTag 0x0477 -#define GlintLight9SpotlightExponentReg 1 -#define GlintLight9SpotlightExponentOff 0x93b8 - -#define GlintLight9CosSpotlightCutoffAngle 0xa3c0 -#define GlintLight9CosSpotlightCutoffAngleTag 0x0478 -#define GlintLight9CosSpotlightCutoffAngleReg 1 -#define GlintLight9CosSpotlightCutoffAngleOff 0x93c0 - -#define GlintLight9ConstantAttenuation 0xa3c8 -#define GlintLight9ConstantAttenuationTag 0x0479 -#define GlintLight9ConstantAttenuationReg 1 -#define GlintLight9ConstantAttenuationOff 0x93c8 - -#define GlintLight9LinearAttenuation 0xa3d0 -#define GlintLight9LinearAttenuationTag 0x047a -#define GlintLight9LinearAttenuationReg 1 -#define GlintLight9LinearAttenuationOff 0x93d0 - -#define GlintLight9QuadraticAttenuation 0xa3d8 -#define GlintLight9QuadraticAttenuationTag 0x047b -#define GlintLight9QuadraticAttenuationReg 1 -#define GlintLight9QuadraticAttenuationOff 0x93d8 - -#define GlintLight10Mode 0xa3e0 -#define GlintLight10ModeTag 0x047c -#define GlintLight10ModeReg 1 -#define GlintLight10ModeOff 0x93e0 - -#define GlintLight10AmbientIntensityRed 0xa3e8 -#define GlintLight10AmbientIntensityRedTag 0x047d -#define GlintLight10AmbientIntensityRedReg 1 -#define GlintLight10AmbientIntensityRedOff 0x93e8 - -#define GlintLight10AmbientIntensityGreen 0xa3f0 -#define GlintLight10AmbientIntensityGreenTag 0x047e -#define GlintLight10AmbientIntensityGreenReg 1 -#define GlintLight10AmbientIntensityGreenOff 0x93f0 - -#define GlintLight10AmbientIntensityBlue 0xa3f8 -#define GlintLight10AmbientIntensityBlueTag 0x047f -#define GlintLight10AmbientIntensityBlueReg 1 -#define GlintLight10AmbientIntensityBlueOff 0x93f8 - -#define GlintLight10DiffuseIntensityRed 0xa400 -#define GlintLight10DiffuseIntensityRedTag 0x0480 -#define GlintLight10DiffuseIntensityRedReg 1 -#define GlintLight10DiffuseIntensityRedOff 0x9400 - -#define GlintLight10DiffuseIntensityGreen 0xa408 -#define GlintLight10DiffuseIntensityGreenTag 0x0481 -#define GlintLight10DiffuseIntensityGreenReg 1 -#define GlintLight10DiffuseIntensityGreenOff 0x9408 - -#define GlintLight10DiffuseIntensityBlue 0xa410 -#define GlintLight10DiffuseIntensityBlueTag 0x0482 -#define GlintLight10DiffuseIntensityBlueReg 1 -#define GlintLight10DiffuseIntensityBlueOff 0x9410 - -#define GlintLight10SpecularIntensityRed 0xa418 -#define GlintLight10SpecularIntensityRedTag 0x0483 -#define GlintLight10SpecularIntensityRedReg 1 -#define GlintLight10SpecularIntensityRedOff 0x9418 - -#define GlintLight10SpecularIntensityGreen 0xa420 -#define GlintLight10SpecularIntensityGreenTag 0x0484 -#define GlintLight10SpecularIntensityGreenReg 1 -#define GlintLight10SpecularIntensityGreenOff 0x9420 - -#define GlintLight10SpecularIntensityBlue 0xa428 -#define GlintLight10SpecularIntensityBlueTag 0x0485 -#define GlintLight10SpecularIntensityBlueReg 1 -#define GlintLight10SpecularIntensityBlueOff 0x9428 - -#define GlintLight10PositionX 0xa430 -#define GlintLight10PositionXTag 0x0486 -#define GlintLight10PositionXReg 1 -#define GlintLight10PositionXOff 0x9430 - -#define GlintLight10PositionY 0xa438 -#define GlintLight10PositionYTag 0x0487 -#define GlintLight10PositionYReg 1 -#define GlintLight10PositionYOff 0x9438 - -#define GlintLight10PositionZ 0xa440 -#define GlintLight10PositionZTag 0x0488 -#define GlintLight10PositionZReg 1 -#define GlintLight10PositionZOff 0x9440 - -#define GlintLight10PositionW 0xa448 -#define GlintLight10PositionWTag 0x0489 -#define GlintLight10PositionWReg 1 -#define GlintLight10PositionWOff 0x9448 - -#define GlintLight10SpotlightDirectionX 0xa450 -#define GlintLight10SpotlightDirectionXTag 0x048a -#define GlintLight10SpotlightDirectionXReg 1 -#define GlintLight10SpotlightDirectionXOff 0x9450 - -#define GlintLight10SpotlightDirectionY 0xa458 -#define GlintLight10SpotlightDirectionYTag 0x048b -#define GlintLight10SpotlightDirectionYReg 1 -#define GlintLight10SpotlightDirectionYOff 0x9458 - -#define GlintLight10SpotlightDirectionZ 0xa460 -#define GlintLight10SpotlightDirectionZTag 0x048c -#define GlintLight10SpotlightDirectionZReg 1 -#define GlintLight10SpotlightDirectionZOff 0x9460 - -#define GlintLight10SpotlightExponent 0xa468 -#define GlintLight10SpotlightExponentTag 0x048d -#define GlintLight10SpotlightExponentReg 1 -#define GlintLight10SpotlightExponentOff 0x9468 - -#define GlintLight10CosSpotlightCutoffAngle 0xa470 -#define GlintLight10CosSpotlightCutoffAngleTag 0x048e -#define GlintLight10CosSpotlightCutoffAngleReg 1 -#define GlintLight10CosSpotlightCutoffAngleOff 0x9470 - -#define GlintLight10ConstantAttenuation 0xa478 -#define GlintLight10ConstantAttenuationTag 0x048f -#define GlintLight10ConstantAttenuationReg 1 -#define GlintLight10ConstantAttenuationOff 0x9478 - -#define GlintLight10LinearAttenuation 0xa480 -#define GlintLight10LinearAttenuationTag 0x0490 -#define GlintLight10LinearAttenuationReg 1 -#define GlintLight10LinearAttenuationOff 0x9480 - -#define GlintLight10QuadraticAttenuation 0xa488 -#define GlintLight10QuadraticAttenuationTag 0x0491 -#define GlintLight10QuadraticAttenuationReg 1 -#define GlintLight10QuadraticAttenuationOff 0x9488 - -#define GlintLight11Mode 0xa490 -#define GlintLight11ModeTag 0x0492 -#define GlintLight11ModeReg 1 -#define GlintLight11ModeOff 0x9490 - -#define GlintLight11AmbientIntensiveRed 0xa498 -#define GlintLight11AmbientIntensiveRedTag 0x0493 -#define GlintLight11AmbientIntensiveRedReg 1 -#define GlintLight11AmbientIntensiveRedOff 0x9498 - -#define GlintLight11AmbientIntensityGreen 0xa4a0 -#define GlintLight11AmbientIntensityGreenTag 0x0494 -#define GlintLight11AmbientIntensityGreenReg 1 -#define GlintLight11AmbientIntensityGreenOff 0x94a0 - -#define GlintLight11AmbientIntensityBlue 0xa4a8 -#define GlintLight11AmbientIntensityBlueTag 0x0495 -#define GlintLight11AmbientIntensityBlueReg 1 -#define GlintLight11AmbientIntensityBlueOff 0x94a8 - -#define GlintLight11DiffuseIntensityRed 0xa4b0 -#define GlintLight11DiffuseIntensityRedTag 0x0496 -#define GlintLight11DiffuseIntensityRedReg 1 -#define GlintLight11DiffuseIntensityRedOff 0x94b0 - -#define GlintLight11DiffuseIntensityGreen 0xa4b8 -#define GlintLight11DiffuseIntensityGreenTag 0x0497 -#define GlintLight11DiffuseIntensityGreenReg 1 -#define GlintLight11DiffuseIntensityGreenOff 0x94b8 - -#define GlintLight11DiffuseIntensityBlue 0xa4c0 -#define GlintLight11DiffuseIntensityBlueTag 0x0498 -#define GlintLight11DiffuseIntensityBlueReg 1 -#define GlintLight11DiffuseIntensityBlueOff 0x94c0 - -#define GlintLight11SpecularIntensityRed 0xa4c8 -#define GlintLight11SpecularIntensityRedTag 0x0499 -#define GlintLight11SpecularIntensityRedReg 1 -#define GlintLight11SpecularIntensityRedOff 0x94c8 - -#define GlintLight11SpecularIntensityGreen 0xa4d0 -#define GlintLight11SpecularIntensityGreenTag 0x049a -#define GlintLight11SpecularIntensityGreenReg 1 -#define GlintLight11SpecularIntensityGreenOff 0x94d0 - -#define GlintLight11SpecularIntensityBlue 0xa4d8 -#define GlintLight11SpecularIntensityBlueTag 0x049b -#define GlintLight11SpecularIntensityBlueReg 1 -#define GlintLight11SpecularIntensityBlueOff 0x94d8 - -#define GlintLight11PositionX 0xa4e0 -#define GlintLight11PositionXTag 0x049c -#define GlintLight11PositionXReg 1 -#define GlintLight11PositionXOff 0x94e0 - -#define GlintLight11PositionY 0xa4e8 -#define GlintLight11PositionYTag 0x049d -#define GlintLight11PositionYReg 1 -#define GlintLight11PositionYOff 0x94e8 - -#define GlintLight11PositionZ 0xa4f0 -#define GlintLight11PositionZTag 0x049e -#define GlintLight11PositionZReg 1 -#define GlintLight11PositionZOff 0x94f0 - -#define GlintLight11PositionW 0xa4f8 -#define GlintLight11PositionWTag 0x049f -#define GlintLight11PositionWReg 1 -#define GlintLight11PositionWOff 0x94f8 - -#define GlintLight11SpotlightDirectionX 0xa500 -#define GlintLight11SpotlightDirectionXTag 0x04a0 -#define GlintLight11SpotlightDirectionXReg 1 -#define GlintLight11SpotlightDirectionXOff 0x9500 - -#define GlintLight11SpotlightDirectionY 0xa508 -#define GlintLight11SpotlightDirectionYTag 0x04a1 -#define GlintLight11SpotlightDirectionYReg 1 -#define GlintLight11SpotlightDirectionYOff 0x9508 - -#define GlintLight11SpotlightDirectionZ 0xa510 -#define GlintLight11SpotlightDirectionZTag 0x04a2 -#define GlintLight11SpotlightDirectionZReg 1 -#define GlintLight11SpotlightDirectionZOff 0x9510 - -#define GlintLight11SpotlightExponent 0xa518 -#define GlintLight11SpotlightExponentTag 0x04a3 -#define GlintLight11SpotlightExponentReg 1 -#define GlintLight11SpotlightExponentOff 0x9518 - -#define GlintLight11CosSpotlightCutoffAngle 0xa520 -#define GlintLight11CosSpotlightCutoffAngleTag 0x04a4 -#define GlintLight11CosSpotlightCutoffAngleReg 1 -#define GlintLight11CosSpotlightCutoffAngleOff 0x9520 - -#define GlintLight11ConstantAttenuation 0xa528 -#define GlintLight11ConstantAttenuationTag 0x04a5 -#define GlintLight11ConstantAttenuationReg 1 -#define GlintLight11ConstantAttenuationOff 0x9528 - -#define GlintLight11LinearAttenuation 0xa530 -#define GlintLight11LinearAttenuationTag 0x04a6 -#define GlintLight11LinearAttenuationReg 1 -#define GlintLight11LinearAttenuationOff 0x9530 - -#define GlintLight11QuadraticAttenuation 0xa538 -#define GlintLight11QuadraticAttenuationTag 0x04a7 -#define GlintLight11QuadraticAttenuationReg 1 -#define GlintLight11QuadraticAttenuationOff 0x9538 - -#define GlintLight12Mode 0xa540 -#define GlintLight12ModeTag 0x04a8 -#define GlintLight12ModeReg 1 -#define GlintLight12ModeOff 0x9540 - -#define GlintLight12AmbientIntensityRed 0xa548 -#define GlintLight12AmbientIntensityRedTag 0x04a9 -#define GlintLight12AmbientIntensityRedReg 1 -#define GlintLight12AmbientIntensityRedOff 0x9548 - -#define GlintLight12AmbientIntensityGreen 0xa550 -#define GlintLight12AmbientIntensityGreenTag 0x04aa -#define GlintLight12AmbientIntensityGreenReg 1 -#define GlintLight12AmbientIntensityGreenOff 0x9550 - -#define GlintLight12AmbientIntensityBlue 0xa558 -#define GlintLight12AmbientIntensityBlueTag 0x04ab -#define GlintLight12AmbientIntensityBlueReg 1 -#define GlintLight12AmbientIntensityBlueOff 0x9558 - -#define GlintLight12DiffuseIntensityRed 0xa560 -#define GlintLight12DiffuseIntensityRedTag 0x04ac -#define GlintLight12DiffuseIntensityRedReg 1 -#define GlintLight12DiffuseIntensityRedOff 0x9560 - -#define GlintLight12DiffuseIntensityGreen 0xa568 -#define GlintLight12DiffuseIntensityGreenTag 0x04ad -#define GlintLight12DiffuseIntensityGreenReg 1 -#define GlintLight12DiffuseIntensityGreenOff 0x9568 - -#define GlintLight12DiffuseIntensityBlue 0xa570 -#define GlintLight12DiffuseIntensityBlueTag 0x04ae -#define GlintLight12DiffuseIntensityBlueReg 1 -#define GlintLight12DiffuseIntensityBlueOff 0x9570 - -#define GlintLight12SpecularIntensityRed 0xa578 -#define GlintLight12SpecularIntensityRedTag 0x04af -#define GlintLight12SpecularIntensityRedReg 1 -#define GlintLight12SpecularIntensityRedOff 0x9578 - -#define GlintLight12SpecularIntensityGreen 0xa580 -#define GlintLight12SpecularIntensityGreenTag 0x04b0 -#define GlintLight12SpecularIntensityGreenReg 1 -#define GlintLight12SpecularIntensityGreenOff 0x9580 - -#define GlintLight12SpecularIntensityBlue 0xa588 -#define GlintLight12SpecularIntensityBlueTag 0x04b1 -#define GlintLight12SpecularIntensityBlueReg 1 -#define GlintLight12SpecularIntensityBlueOff 0x9588 - -#define GlintLight12PositionX 0xa590 -#define GlintLight12PositionXTag 0x04b2 -#define GlintLight12PositionXReg 1 -#define GlintLight12PositionXOff 0x9590 - -#define GlintLight12PositionY 0xa598 -#define GlintLight12PositionYTag 0x04b3 -#define GlintLight12PositionYReg 1 -#define GlintLight12PositionYOff 0x9598 - -#define GlintLight12PositionZ 0xa5a0 -#define GlintLight12PositionZTag 0x04b4 -#define GlintLight12PositionZReg 1 -#define GlintLight12PositionZOff 0x95a0 - -#define GlintLight12PositionW 0xa5a8 -#define GlintLight12PositionWTag 0x04b5 -#define GlintLight12PositionWReg 1 -#define GlintLight12PositionWOff 0x95a8 - -#define GlintLight12SpotlightDirectionX 0xa5b0 -#define GlintLight12SpotlightDirectionXTag 0x04b6 -#define GlintLight12SpotlightDirectionXReg 1 -#define GlintLight12SpotlightDirectionXOff 0x95b0 - -#define GlintLight12SpotlightDirectionY 0xa5b8 -#define GlintLight12SpotlightDirectionYTag 0x04b7 -#define GlintLight12SpotlightDirectionYReg 1 -#define GlintLight12SpotlightDirectionYOff 0x95b8 - -#define GlintLight12SpotlightDirectionZ 0xa5c0 -#define GlintLight12SpotlightDirectionZTag 0x04b8 -#define GlintLight12SpotlightDirectionZReg 1 -#define GlintLight12SpotlightDirectionZOff 0x95c0 - -#define GlintLight12SpotlightExponent 0xa5c8 -#define GlintLight12SpotlightExponentTag 0x04b9 -#define GlintLight12SpotlightExponentReg 1 -#define GlintLight12SpotlightExponentOff 0x95c8 - -#define GlintLight12CosSpotlightCutoffAngle 0xa5d0 -#define GlintLight12CosSpotlightCutoffAngleTag 0x04ba -#define GlintLight12CosSpotlightCutoffAngleReg 1 -#define GlintLight12CosSpotlightCutoffAngleOff 0x95d0 - -#define GlintLight12ConstantAttenuation 0xa5d8 -#define GlintLight12ConstantAttenuationTag 0x04bb -#define GlintLight12ConstantAttenuationReg 1 -#define GlintLight12ConstantAttenuationOff 0x95d8 - -#define GlintLight12LinearAttenuation 0xa5e0 -#define GlintLight12LinearAttenuationTag 0x04bc -#define GlintLight12LinearAttenuationReg 1 -#define GlintLight12LinearAttenuationOff 0x95e0 - -#define GlintLight12QuadraticAttenuation 0xa5e8 -#define GlintLight12QuadraticAttenuationTag 0x04bd -#define GlintLight12QuadraticAttenuationReg 1 -#define GlintLight12QuadraticAttenuationOff 0x95e8 - -#define GlintLight13Mode 0xa5f0 -#define GlintLight13ModeTag 0x04be -#define GlintLight13ModeReg 1 -#define GlintLight13ModeOff 0x95f0 - -#define GlintLight13AmbientIntensityRed 0xa5f8 -#define GlintLight13AmbientIntensityRedTag 0x04bf -#define GlintLight13AmbientIntensityRedReg 1 -#define GlintLight13AmbientIntensityRedOff 0x95f8 - -#define GlintLight13AmbientIntensityGreen 0xa600 -#define GlintLight13AmbientIntensityGreenTag 0x04c0 -#define GlintLight13AmbientIntensityGreenReg 1 -#define GlintLight13AmbientIntensityGreenOff 0x9600 - -#define GlintLight13AmbientIntensityBlue 0xa608 -#define GlintLight13AmbientIntensityBlueTag 0x04c1 -#define GlintLight13AmbientIntensityBlueReg 1 -#define GlintLight13AmbientIntensityBlueOff 0x9608 - -#define GlintLight13DiffuseIntensityRed 0xa610 -#define GlintLight13DiffuseIntensityRedTag 0x04c2 -#define GlintLight13DiffuseIntensityRedReg 1 -#define GlintLight13DiffuseIntensityRedOff 0x9610 - -#define GlintLight13DiffuseIntensityGreen 0xa618 -#define GlintLight13DiffuseIntensityGreenTag 0x04c3 -#define GlintLight13DiffuseIntensityGreenReg 1 -#define GlintLight13DiffuseIntensityGreenOff 0x9618 - -#define GlintLight13DiffuseIntensityBlue 0xa620 -#define GlintLight13DiffuseIntensityBlueTag 0x04c4 -#define GlintLight13DiffuseIntensityBlueReg 1 -#define GlintLight13DiffuseIntensityBlueOff 0x9620 - -#define GlintLight13SpecularIntensityRed 0xa628 -#define GlintLight13SpecularIntensityRedTag 0x04c5 -#define GlintLight13SpecularIntensityRedReg 1 -#define GlintLight13SpecularIntensityRedOff 0x9628 - -#define GlintLight13SpecularIntensityGreen 0xa630 -#define GlintLight13SpecularIntensityGreenTag 0x04c6 -#define GlintLight13SpecularIntensityGreenReg 1 -#define GlintLight13SpecularIntensityGreenOff 0x9630 - -#define GlintLight13SpecularIntensityBlue 0xa638 -#define GlintLight13SpecularIntensityBlueTag 0x04c7 -#define GlintLight13SpecularIntensityBlueReg 1 -#define GlintLight13SpecularIntensityBlueOff 0x9638 - -#define GlintLight13PositionX 0xa640 -#define GlintLight13PositionXTag 0x04c8 -#define GlintLight13PositionXReg 1 -#define GlintLight13PositionXOff 0x9640 - -#define GlintLight13PositionY 0xa648 -#define GlintLight13PositionYTag 0x04c9 -#define GlintLight13PositionYReg 1 -#define GlintLight13PositionYOff 0x9648 - -#define GlintLight13PositionZ 0xa650 -#define GlintLight13PositionZTag 0x04ca -#define GlintLight13PositionZReg 1 -#define GlintLight13PositionZOff 0x9650 - -#define GlintLight13PositionW 0xa658 -#define GlintLight13PositionWTag 0x04cb -#define GlintLight13PositionWReg 1 -#define GlintLight13PositionWOff 0x9658 - -#define GlintLight13SpotlightDirectionX 0xa660 -#define GlintLight13SpotlightDirectionXTag 0x04cc -#define GlintLight13SpotlightDirectionXReg 1 -#define GlintLight13SpotlightDirectionXOff 0x9660 - -#define GlintLight13SpotlightDirectionY 0xa668 -#define GlintLight13SpotlightDirectionYTag 0x04cd -#define GlintLight13SpotlightDirectionYReg 1 -#define GlintLight13SpotlightDirectionYOff 0x9668 - -#define GlintLight13SpotlightDirectionZ 0xa670 -#define GlintLight13SpotlightDirectionZTag 0x04ce -#define GlintLight13SpotlightDirectionZReg 1 -#define GlintLight13SpotlightDirectionZOff 0x9670 - -#define GlintLight13SpotlightExponent 0xa678 -#define GlintLight13SpotlightExponentTag 0x04cf -#define GlintLight13SpotlightExponentReg 1 -#define GlintLight13SpotlightExponentOff 0x9678 - -#define GlintLight13CosSpotlightCutoffAngle 0xa680 -#define GlintLight13CosSpotlightCutoffAngleTag 0x04d0 -#define GlintLight13CosSpotlightCutoffAngleReg 1 -#define GlintLight13CosSpotlightCutoffAngleOff 0x9680 - -#define GlintLight13ConstantAttenuation 0xa688 -#define GlintLight13ConstantAttenuationTag 0x04d1 -#define GlintLight13ConstantAttenuationReg 1 -#define GlintLight13ConstantAttenuationOff 0x9688 - -#define GlintLight13LinearAttenuation 0xa690 -#define GlintLight13LinearAttenuationTag 0x04d2 -#define GlintLight13LinearAttenuationReg 1 -#define GlintLight13LinearAttenuationOff 0x9690 - -#define GlintLight13QuadraticAttenuation 0xa698 -#define GlintLight13QuadraticAttenuationTag 0x04d3 -#define GlintLight13QuadraticAttenuationReg 1 -#define GlintLight13QuadraticAttenuationOff 0x9698 - -#define GlintLight14Mode 0xa6a0 -#define GlintLight14ModeTag 0x04d4 -#define GlintLight14ModeReg 1 -#define GlintLight14ModeOff 0x96a0 - -#define GlintLight14AmbientIntensityRed 0xa6a8 -#define GlintLight14AmbientIntensityRedTag 0x04d5 -#define GlintLight14AmbientIntensityRedReg 1 -#define GlintLight14AmbientIntensityRedOff 0x96a8 - -#define GlintLight14AmbientIntensityGreen 0xa6b0 -#define GlintLight14AmbientIntensityGreenTag 0x04d6 -#define GlintLight14AmbientIntensityGreenReg 1 -#define GlintLight14AmbientIntensityGreenOff 0x96b0 - -#define GlintLight14AmbientIntensityBlue 0xa6b8 -#define GlintLight14AmbientIntensityBlueTag 0x04d7 -#define GlintLight14AmbientIntensityBlueReg 1 -#define GlintLight14AmbientIntensityBlueOff 0x96b8 - -#define GlintLight14DiffuseIntensityRed 0xa6c0 -#define GlintLight14DiffuseIntensityRedTag 0x04d8 -#define GlintLight14DiffuseIntensityRedReg 1 -#define GlintLight14DiffuseIntensityRedOff 0x96c0 - -#define GlintLight14DiffuseIntensityGreen 0xa6c8 -#define GlintLight14DiffuseIntensityGreenTag 0x04d9 -#define GlintLight14DiffuseIntensityGreenReg 1 -#define GlintLight14DiffuseIntensityGreenOff 0x96c8 - -#define GlintLight14DiffuseIntensityBlue 0xa6d0 -#define GlintLight14DiffuseIntensityBlueTag 0x04da -#define GlintLight14DiffuseIntensityBlueReg 1 -#define GlintLight14DiffuseIntensityBlueOff 0x96d0 - -#define GlintLight14SpecularIntensityRed 0xa6d8 -#define GlintLight14SpecularIntensityRedTag 0x04db -#define GlintLight14SpecularIntensityRedReg 1 -#define GlintLight14SpecularIntensityRedOff 0x96d8 - -#define GlintLight14SpecularIntensityGreen 0xa6e0 -#define GlintLight14SpecularIntensityGreenTag 0x04dc -#define GlintLight14SpecularIntensityGreenReg 1 -#define GlintLight14SpecularIntensityGreenOff 0x96e0 - -#define GlintLight14SpecularIntensityBlue 0xa6e8 -#define GlintLight14SpecularIntensityBlueTag 0x04dd -#define GlintLight14SpecularIntensityBlueReg 1 -#define GlintLight14SpecularIntensityBlueOff 0x96e8 - -#define GlintLight14PositionX 0xa6f0 -#define GlintLight14PositionXTag 0x04de -#define GlintLight14PositionXReg 1 -#define GlintLight14PositionXOff 0x96f0 - -#define GlintLight14PositionY 0xa6f8 -#define GlintLight14PositionYTag 0x04df -#define GlintLight14PositionYReg 1 -#define GlintLight14PositionYOff 0x96f8 - -#define GlintLight14PositionZ 0xa700 -#define GlintLight14PositionZTag 0x04e0 -#define GlintLight14PositionZReg 1 -#define GlintLight14PositionZOff 0x9700 - -#define GlintLight14PositionW 0xa708 -#define GlintLight14PositionWTag 0x04e1 -#define GlintLight14PositionWReg 1 -#define GlintLight14PositionWOff 0x9708 - -#define GlintLight14SpotlightDirectionX 0xa710 -#define GlintLight14SpotlightDirectionXTag 0x04e2 -#define GlintLight14SpotlightDirectionXReg 1 -#define GlintLight14SpotlightDirectionXOff 0x9710 - -#define GlintLight14SpotlightDirectionY 0xa718 -#define GlintLight14SpotlightDirectionYTag 0x04e3 -#define GlintLight14SpotlightDirectionYReg 1 -#define GlintLight14SpotlightDirectionYOff 0x9718 - -#define GlintLight14SpotlightDirectionZ 0xa720 -#define GlintLight14SpotlightDirectionZTag 0x04e4 -#define GlintLight14SpotlightDirectionZReg 1 -#define GlintLight14SpotlightDirectionZOff 0x9720 - -#define GlintLight14SpotlightExponent 0xa728 -#define GlintLight14SpotlightExponentTag 0x04e5 -#define GlintLight14SpotlightExponentReg 1 -#define GlintLight14SpotlightExponentOff 0x9728 - -#define GlintLight14CosSpotlightCutoffAngle 0xa730 -#define GlintLight14CosSpotlightCutoffAngleTag 0x04e6 -#define GlintLight14CosSpotlightCutoffAngleReg 1 -#define GlintLight14CosSpotlightCutoffAngleOff 0x9730 - -#define GlintLight14ConstantAttenuation 0xa738 -#define GlintLight14ConstantAttenuationTag 0x04e7 -#define GlintLight14ConstantAttenuationReg 1 -#define GlintLight14ConstantAttenuationOff 0x9738 - -#define GlintLight14LinearAttenuation 0xa740 -#define GlintLight14LinearAttenuationTag 0x04e8 -#define GlintLight14LinearAttenuationReg 1 -#define GlintLight14LinearAttenuationOff 0x9740 - -#define GlintLight14QuadraticAttenuation 0xa748 -#define GlintLight14QuadraticAttenuationTag 0x04e9 -#define GlintLight14QuadraticAttenuationReg 1 -#define GlintLight14QuadraticAttenuationOff 0x9748 - -#define GlintLight15Mode 0xa750 -#define GlintLight15ModeTag 0x04ea -#define GlintLight15ModeReg 1 -#define GlintLight15ModeOff 0x9750 - -#define GlintLight15AmbientIntensityRed 0xa758 -#define GlintLight15AmbientIntensityRedTag 0x04eb -#define GlintLight15AmbientIntensityRedReg 1 -#define GlintLight15AmbientIntensityRedOff 0x9758 - -#define GlintLight15AmbientIntensityGreen 0xa760 -#define GlintLight15AmbientIntensityGreenTag 0x04ec -#define GlintLight15AmbientIntensityGreenReg 1 -#define GlintLight15AmbientIntensityGreenOff 0x9760 - -#define GlintLight15AmbientIntensityBlue 0xa768 -#define GlintLight15AmbientIntensityBlueTag 0x04ed -#define GlintLight15AmbientIntensityBlueReg 1 -#define GlintLight15AmbientIntensityBlueOff 0x9768 - -#define GlintLight15DiffuseIntensityRed 0xa770 -#define GlintLight15DiffuseIntensityRedTag 0x04ee -#define GlintLight15DiffuseIntensityRedReg 1 -#define GlintLight15DiffuseIntensityRedOff 0x9770 - -#define GlintLight15DiffuseIntensityGreen 0xa778 -#define GlintLight15DiffuseIntensityGreenTag 0x04ef -#define GlintLight15DiffuseIntensityGreenReg 1 -#define GlintLight15DiffuseIntensityGreenOff 0x9778 - -#define GlintLight15DiffuseIntensityBlue 0xa780 -#define GlintLight15DiffuseIntensityBlueTag 0x04f0 -#define GlintLight15DiffuseIntensityBlueReg 1 -#define GlintLight15DiffuseIntensityBlueOff 0x9780 - -#define GlintLight15SpecularIntensityRed 0xa788 -#define GlintLight15SpecularIntensityRedTag 0x04f1 -#define GlintLight15SpecularIntensityRedReg 1 -#define GlintLight15SpecularIntensityRedOff 0x9788 - -#define GlintLight15SpecularIntensityGreen 0xa790 -#define GlintLight15SpecularIntensityGreenTag 0x04f2 -#define GlintLight15SpecularIntensityGreenReg 1 -#define GlintLight15SpecularIntensityGreenOff 0x9790 - -#define GlintLight15SpecularIntensityBlue 0xa798 -#define GlintLight15SpecularIntensityBlueTag 0x04f3 -#define GlintLight15SpecularIntensityBlueReg 1 -#define GlintLight15SpecularIntensityBlueOff 0x9798 - -#define GlintLight15PositionX 0xa7a0 -#define GlintLight15PositionXTag 0x04f4 -#define GlintLight15PositionXReg 1 -#define GlintLight15PositionXOff 0x97a0 - -#define GlintLight15PositionY 0xa7a8 -#define GlintLight15PositionYTag 0x04f5 -#define GlintLight15PositionYReg 1 -#define GlintLight15PositionYOff 0x97a8 - -#define GlintLight15PositionZ 0xa7b0 -#define GlintLight15PositionZTag 0x04f6 -#define GlintLight15PositionZReg 1 -#define GlintLight15PositionZOff 0x97b0 - -#define GlintLight15PositionW 0xa7b8 -#define GlintLight15PositionWTag 0x04f7 -#define GlintLight15PositionWReg 1 -#define GlintLight15PositionWOff 0x97b8 - -#define GlintLight15SpotlightDirectionX 0xa7c0 -#define GlintLight15SpotlightDirectionXTag 0x04f8 -#define GlintLight15SpotlightDirectionXReg 1 -#define GlintLight15SpotlightDirectionXOff 0x97c0 - -#define GlintLight15SpotlightDirectionY 0xa7c8 -#define GlintLight15SpotlightDirectionYTag 0x04f9 -#define GlintLight15SpotlightDirectionYReg 1 -#define GlintLight15SpotlightDirectionYOff 0x97c8 - -#define GlintLight15SpotlightDirectionZ 0xa7d0 -#define GlintLight15SpotlightDirectionZTag 0x04fa -#define GlintLight15SpotlightDirectionZReg 1 -#define GlintLight15SpotlightDirectionZOff 0x97d0 - -#define GlintLight15SpotlightExponent 0xa7d8 -#define GlintLight15SpotlightExponentTag 0x04fb -#define GlintLight15SpotlightExponentReg 1 -#define GlintLight15SpotlightExponentOff 0x97d8 - -#define GlintLight15CosSpotlightCutoffAngle 0xa7e0 -#define GlintLight15CosSpotlightCutoffAngleTag 0x04fc -#define GlintLight15CosSpotlightCutoffAngleReg 1 -#define GlintLight15CosSpotlightCutoffAngleOff 0x97e0 - -#define GlintLight15ConstantAttenuation 0xa7e8 -#define GlintLight15ConstantAttenuationTag 0x04fd -#define GlintLight15ConstantAttenuationReg 1 -#define GlintLight15ConstantAttenuationOff 0x97e8 - -#define GlintLight15LinearAttenuation 0xa7f0 -#define GlintLight15LinearAttenuationTag 0x04fe -#define GlintLight15LinearAttenuationReg 1 -#define GlintLight15LinearAttenuationOff 0x97f0 - -#define GlintLight15QuadraticAttenuation 0xa7f8 -#define GlintLight15QuadraticAttenuationTag 0x04ff -#define GlintLight15QuadraticAttenuationReg 1 -#define GlintLight15QuadraticAttenuationOff 0x97f8 - -#define GlintSceneAmbientColorRed 0xa800 -#define GlintSceneAmbientColorRedTag 0x0500 -#define GlintSceneAmbientColorRedReg 1 -#define GlintSceneAmbientColorRedOff 0x9800 - -#define GlintSceneAmbientColorGreen 0xa808 -#define GlintSceneAmbientColorGreenTag 0x0501 -#define GlintSceneAmbientColorGreenReg 1 -#define GlintSceneAmbientColorGreenOff 0x9808 - -#define GlintSceneAmbientColorBlue 0xa810 -#define GlintSceneAmbientColorBlueTag 0x0502 -#define GlintSceneAmbientColorBlueReg 1 -#define GlintSceneAmbientColorBlueOff 0x9810 - -#define GlintFrontAmbientColorRed 0xa880 -#define GlintFrontAmbientColorRedTag 0x0510 -#define GlintFrontAmbientColorRedReg 1 -#define GlintFrontAmbientColorRedOff 0x9880 - -#define GlintFrontAmbientColorGreen 0xa888 -#define GlintFrontAmbientColorGreenTag 0x0511 -#define GlintFrontAmbientColorGreenReg 1 -#define GlintFrontAmbientColorGreenOff 0x9888 - -#define GlintFrontAmbientColorBlue 0xa890 -#define GlintFrontAmbientColorBlueTag 0x0512 -#define GlintFrontAmbientColorBlueReg 1 -#define GlintFrontAmbientColorBlueOff 0x9890 - -#define GlintFrontDiffuseColorRed 0xa898 -#define GlintFrontDiffuseColorRedTag 0x0513 -#define GlintFrontDiffuseColorRedReg 1 -#define GlintFrontDiffuseColorRedOff 0x9898 - -#define GlintFrontDiffuseColorGreen 0xa8a0 -#define GlintFrontDiffuseColorGreenTag 0x0514 -#define GlintFrontDiffuseColorGreenReg 1 -#define GlintFrontDiffuseColorGreenOff 0x98a0 - -#define GlintFrontDiffuseColorBlue 0xa8a8 -#define GlintFrontDiffuseColorBlueTag 0x0515 -#define GlintFrontDiffuseColorBlueReg 1 -#define GlintFrontDiffuseColorBlueOff 0x98a8 - -#define GlintFrontAlpha 0xa8b0 -#define GlintFrontAlphaTag 0x0516 -#define GlintFrontAlphaReg 1 -#define GlintFrontAlphaOff 0x98b0 - -#define GlintFrontSpecularColorRed 0xa8b8 -#define GlintFrontSpecularColorRedTag 0x0517 -#define GlintFrontSpecularColorRedReg 1 -#define GlintFrontSpecularColorRedOff 0x98b8 - -#define GlintFrontSpecularColorGreen 0xa8c0 -#define GlintFrontSpecularColorGreenTag 0x0518 -#define GlintFrontSpecularColorGreenReg 1 -#define GlintFrontSpecularColorGreenOff 0x98c0 - -#define GlintFrontSpecularColorBlue 0xa8c8 -#define GlintFrontSpecularColorBlueTag 0x0519 -#define GlintFrontSpecularColorBlueReg 1 -#define GlintFrontSpecularColorBlueOff 0x98c8 - -#define GlintFrontEmissiveColorRed 0xa8d0 -#define GlintFrontEmissiveColorRedTag 0x051a -#define GlintFrontEmissiveColorRedReg 1 -#define GlintFrontEmissiveColorRedOff 0x98d0 - -#define GlintFrontEmissiveColorGreen 0xa8d8 -#define GlintFrontEmissiveColorGreenTag 0x051b -#define GlintFrontEmissiveColorGreenReg 1 -#define GlintFrontEmissiveColorGreenOff 0x98d8 - -#define GlintFrontEmissiveColorBlue 0xa8e0 -#define GlintFrontEmissiveColorBlueTag 0x051c -#define GlintFrontEmissiveColorBlueReg 1 -#define GlintFrontEmissiveColorBlueOff 0x98e0 - -#define GlintFrontSpecularExponent 0xa8e8 -#define GlintFrontSpecularExponentTag 0x051d -#define GlintFrontSpecularExponentReg 1 -#define GlintFrontSpecularExponentOff 0x98e8 - -#define GlintBackAmbientColorRed 0xa900 -#define GlintBackAmbientColorRedTag 0x0520 -#define GlintBackAmbientColorRedReg 1 -#define GlintBackAmbientColorRedOff 0x9900 - -#define GlintBackAmbientColorGreen 0xa908 -#define GlintBackAmbientColorGreenTag 0x0521 -#define GlintBackAmbientColorGreenReg 1 -#define GlintBackAmbientColorGreenOff 0x9908 - -#define GlintBackAmbientColorBlue 0xa910 -#define GlintBackAmbientColorBlueTag 0x0522 -#define GlintBackAmbientColorBlueReg 1 -#define GlintBackAmbientColorBlueOff 0x9910 - -#define GlintBackDiffuseColorRed 0xa918 -#define GlintBackDiffuseColorRedTag 0x0523 -#define GlintBackDiffuseColorRedReg 1 -#define GlintBackDiffuseColorRedOff 0x9918 - -#define GlintBackDiffuseColorGreen 0xa920 -#define GlintBackDiffuseColorGreenTag 0x0524 -#define GlintBackDiffuseColorGreenReg 1 -#define GlintBackDiffuseColorGreenOff 0x9920 - -#define GlintBackDiffuseColorBlue 0xa928 -#define GlintBackDiffuseColorBlueTag 0x0525 -#define GlintBackDiffuseColorBlueReg 1 -#define GlintBackDiffuseColorBlueOff 0x9928 - -#define GlintBackAlpha 0xa930 -#define GlintBackAlphaTag 0x0526 -#define GlintBackAlphaReg 1 -#define GlintBackAlphaOff 0x9930 - -#define GlintBackSpecularColorRed 0xa938 -#define GlintBackSpecularColorRedTag 0x0527 -#define GlintBackSpecularColorRedReg 1 -#define GlintBackSpecularColorRedOff 0x9938 - -#define GlintBackSpecularColorGreen 0xa940 -#define GlintBackSpecularColorGreenTag 0x0528 -#define GlintBackSpecularColorGreenReg 1 -#define GlintBackSpecularColorGreenOff 0x9940 - -#define GlintBackSpecularColorBlue 0xa948 -#define GlintBackSpecularColorBlueTag 0x0529 -#define GlintBackSpecularColorBlueReg 1 -#define GlintBackSpecularColorBlueOff 0x9948 - -#define GlintBackEmissiveColorRed 0xa950 -#define GlintBackEmissiveColorRedTag 0x052a -#define GlintBackEmissiveColorRedReg 1 -#define GlintBackEmissiveColorRedOff 0x9950 - -#define GlintBackEmissiveColorGreen 0xa958 -#define GlintBackEmissiveColorGreenTag 0x052b -#define GlintBackEmissiveColorGreenReg 1 -#define GlintBackEmissiveColorGreenOff 0x9958 - -#define GlintBackEmissiveColorBlue 0xa960 -#define GlintBackEmissiveColorBlueTag 0x052c -#define GlintBackEmissiveColorBlueReg 1 -#define GlintBackEmissiveColorBlueOff 0x9960 - -#define GlintBackSpecularExponent 0xa968 -#define GlintBackSpecularExponentTag 0x052d -#define GlintBackSpecularExponentReg 1 -#define GlintBackSpecularExponentOff 0x9968 - -#define GlintDMAAddr 0xa980 -#define GlintDMAAddrTag 0x0530 -#define GlintDMAAddrReg 1 -#define GlintDMAAddrOff 0x9980 - -#define GlintGammaDMACount 0xa988 -#define GlintGammaDMACountTag 0x0531 -#define GlintGammaDMACountReg 1 -#define GlintGammaDMACountOff 0x9988 - -#define GlintCommandInterrupt 0xa990 -#define GlintCommandInterruptTag 0x0532 -#define GlintCommandInterruptReg 1 -#define GlintCommandInterruptOff 0x9990 - -#define GlintDMACall 0xa998 -#define GlintDMACallTag 0x0533 -#define GlintDMACallReg 1 -#define GlintDMACallOff 0x9998 - -#define GlintDMAReturn 0xa9a0 -#define GlintDMAReturnTag 0x0534 -#define GlintDMAReturnReg 1 -#define GlintDMAReturnOff 0x99a0 - -#define GlintDMARectangularRead 0xa9a8 -#define GlintDMARectangularReadTag 0x0535 -#define GlintDMARectangularReadReg 1 -#define GlintDMARectangularReadOff 0x99a8 - -#define GlintDMARectangleReadAddress 0xa9b0 -#define GlintDMARectangleReadAddressTag 0x0536 -#define GlintDMARectangleReadAddressReg 1 -#define GlintDMARectangleReadAddressOff 0x99b0 - -#define GlintDMARectangleReadLinePitch 0xa9b8 -#define GlintDMARectangleReadLinePitchTag 0x0537 -#define GlintDMARectangleReadLinePitchReg 1 -#define GlintDMARectangleReadLinePitchOff 0x99b8 - -#define GlintDMARectangleReadTarget 0xa9c0 -#define GlintDMARectangleReadTargetTag 0x0538 -#define GlintDMARectangleReadTargetReg 1 -#define GlintDMARectangleReadTargetOff 0x99c0 - -#define GlintDMARectangleWrite 0xa9c8 -#define GlintDMARectangleWriteTag 0x0539 -#define GlintDMARectangleWriteReg 1 -#define GlintDMARectangleWriteOff 0x99c8 - -#define GlintDMARectangleWriteAddress 0xa9d0 -#define GlintDMARectangleWriteAddressTag 0x053a -#define GlintDMARectangleWriteAddressReg 1 -#define GlintDMARectangleWriteAddressOff 0x99d0 - -#define GlintDMARectangleWriteLinePitch 0xa9d8 -#define GlintDMARectangleWriteLinePitchTag 0x053b -#define GlintDMARectangleWriteLinePitchReg 1 -#define GlintDMARectangleWriteLinePitchOff 0x99d8 - -#define GlintDMAOutputAddress 0xa9e0 -#define GlintDMAOutputAddressTag 0x053c -#define GlintDMAOutputAddressReg 1 -#define GlintDMAOutputAddressOff 0x99e0 - -#define GlintDMAOutputCount 0xa9e8 -#define GlintDMAOutputCountTag 0x053d -#define GlintDMAOutputCountReg 1 -#define GlintDMAOutputCountOff 0x99e8 - -#define GlintDMAReadGLINTSource 0xa9f0 -#define GlintDMAReadGLINTSourceTag 0x053e -#define GlintDMAReadGLINTSourceReg 1 -#define GlintDMAReadGLINTSourceOff 0x99f0 - -#define GlintDMAFeedback 0xaa10 -#define GlintDMAFeedbackTag 0x0542 -#define GlintDMAFeedbackReg 1 -#define GlintDMAFeedbackOff 0x9a10 - -#define GlintTransformModeAnd 0xaa80 -#define GlintTransformModeAndTag 0x0550 -#define GlintTransformModeAndReg 1 -#define GlintTransformModeAndOff 0x9a80 - -#define GlintTransformModeOr 0xaa88 -#define GlintTransformModeOrTag 0x0551 -#define GlintTransformModeOrReg 1 -#define GlintTransformModeOrOff 0x9a88 - -#define GlintGeometryModeAnd 0xaa90 -#define GlintGeometryModeAndTag 0x0552 -#define GlintGeometryModeAndReg 1 -#define GlintGeometryModeAndOff 0x9a90 - -#define GlintGeometryModeOr 0xaa98 -#define GlintGeometryModeOrTag 0x0553 -#define GlintGeometryModeOrReg 1 -#define GlintGeometryModeOrOff 0x9a98 - -#define GlintNormalizeModeAnd 0xaaa0 -#define GlintNormalizeModeAndTag 0x0554 -#define GlintNormalizeModeAndReg 1 -#define GlintNormalizeModeAndOff 0x9aa0 - -#define GlintNormalizeModeOr 0xaaa8 -#define GlintNormalizeModeOrTag 0x0555 -#define GlintNormalizeModeOrReg 1 -#define GlintNormalizeModeOrOff 0x9aa8 - -#define GlintLightingModeAnd 0xaab0 -#define GlintLightingModeAndTag 0x0556 -#define GlintLightingModeAndReg 1 -#define GlintLightingModeAndOff 0x9ab0 - -#define GlintLightingModeOr 0xaab8 -#define GlintLightingModeOrTag 0x0557 -#define GlintLightingModeOrReg 1 -#define GlintLightingModeOrOff 0x9ab8 - -#define GlintColorMaterialModeAnd 0xaac0 -#define GlintColorMaterialModeAndTag 0x0558 -#define GlintColorMaterialModeAndReg 1 -#define GlintColorMaterialModeAndOff 0x9ac0 - -#define GlintColorMaterialModeOr 0xaac8 -#define GlintColorMaterialModeOrTag 0x0559 -#define GlintColorMaterialModeOrReg 1 -#define GlintColorMaterialModeOrOff 0x9ac8 - -#define GlintDeltaModeAnd 0xaad0 -#define GlintDeltaModeAndTag 0x055a -#define GlintDeltaModeAndReg 1 -#define GlintDeltaModeAndOff 0x9ad0 - -#define GlintDeltaModeOr 0xaad8 -#define GlintDeltaModeOrTag 0x055b -#define GlintDeltaModeOrReg 1 -#define GlintDeltaModeOrOff 0x9ad8 - -#define GlintPointModeAnd 0xaae0 -#define GlintPointModeAndTag 0x055c -#define GlintPointModeAndReg 1 -#define GlintPointModeAndOff 0x9ae0 - -#define GlintPointModeOr 0xaae8 -#define GlintPointModeOrTag 0x055d -#define GlintPointModeOrReg 1 -#define GlintPointModeOrOff 0x9ae8 - -#define GlintLineModeAnd 0xaaf0 -#define GlintLineModeAndTag 0x055e -#define GlintLineModeAndReg 1 -#define GlintLineModeAndOff 0x9af0 - -#define GlintLineModeOr 0xaaf8 -#define GlintLineModeOrTag 0x055f -#define GlintLineModeOrReg 1 -#define GlintLineModeOrOff 0x9af8 - -#define GlintTriangleModeAnd 0xab00 -#define GlintTriangleModeAndTag 0x0560 -#define GlintTriangleModeAndReg 1 -#define GlintTriangleModeAndOff 0x9b00 - -#define GlintTriangleModeOr 0xab08 -#define GlintTriangleModeOrTag 0x0561 -#define GlintTriangleModeOrReg 1 -#define GlintTriangleModeOrOff 0x9b08 - -#define GlintMaterialModeAnd 0xab10 -#define GlintMaterialModeAndTag 0x0562 -#define GlintMaterialModeAndReg 1 -#define GlintMaterialModeAndOff 0x9b10 - -#define GlintMaterialModeOr 0xab18 -#define GlintMaterialModeOrTag 0x0563 -#define GlintMaterialModeOrReg 1 -#define GlintMaterialModeOrOff 0x9b18 - -#define GlintWindowAnd 0xab80 -#define GlintWindowAndTag 0x0570 -#define GlintWindowAndReg 1 -#define GlintWindowAndOff 0x9b80 - -#define GlintWindowOr 0xab88 -#define GlintWindowOrTag 0x0571 -#define GlintWindowOrReg 1 -#define GlintWindowOrOff 0x9b88 - -#define GlintLBReadModeAnd 0xab90 -#define GlintLBReadModeAndTag 0x0572 -#define GlintLBReadModeAndReg 1 -#define GlintLBReadModeAndOff 0x9b90 - -#define GlintLBReadModeOr 0xab98 -#define GlintLBReadModeOrTag 0x0573 -#define GlintLBReadModeOrReg 1 -#define GlintLBReadModeOrOff 0x9b98 -#endif diff --git a/src/mesa/drivers/dri/gamma/gamma_context.c b/src/mesa/drivers/dri/gamma/gamma_context.c deleted file mode 100644 index 5e666c5c8c6..00000000000 --- a/src/mesa/drivers/dri/gamma/gamma_context.c +++ /dev/null @@ -1,229 +0,0 @@ -/* - * Copyright 2001 by Alan Hourihane. - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that - * copyright notice and this permission notice appear in supporting - * documentation, and that the name of Alan Hourihane not be used in - * advertising or publicity pertaining to distribution of the software without - * specific, written prior permission. Alan Hourihane makes no representations - * about the suitability of this software for any purpose. It is provided - * "as is" without express or implied warranty. - * - * ALAN HOURIHANE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO - * EVENT SHALL ALAN HOURIHANE BE LIABLE FOR ANY SPECIAL, INDIRECT OR - * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - * - * Authors: Alan Hourihane, <[email protected]> - * - * 3DLabs Gamma driver. - * - */ -#include "gamma_context.h" - -#include "swrast/swrast.h" -#include "swrast_setup/swrast_setup.h" -#include "vbo/vbo.h" - -#include "tnl/tnl.h" -#include "tnl/t_pipeline.h" - -#include "drivers/common/driverfuncs.h" - -#include "main/context.h" -#include "main/simple_list.h" -#include "main/imports.h" -#include "main/matrix.h" -#include "main/extensions.h" -#if defined(USE_X86_ASM) -#include "x86/common_x86_asm.h" -#endif -#include "main/simple_list.h" -#include "main/mm.h" - - -#include "gamma_vb.h" -#include "gamma_tris.h" -#include "gamma_macros.h" - -extern const struct tnl_pipeline_stage _gamma_render_stage; - -static const struct tnl_pipeline_stage *gamma_pipeline[] = { - &_tnl_vertex_transform_stage, - &_tnl_normal_transform_stage, - &_tnl_lighting_stage, - &_tnl_fog_coordinate_stage, - &_tnl_texgen_stage, - &_tnl_texture_transform_stage, - /* REMOVE: point attenuation stage */ -#if 1 - &_gamma_render_stage, /* ADD: unclipped rastersetup-to-dma */ -#endif - &_tnl_render_stage, - 0, -}; - -GLboolean gammaCreateContext( const __GLcontextModes *glVisual, - __DRIcontext *driContextPriv, - void *sharedContextPrivate) -{ - GLcontext *ctx, *shareCtx; - __DRIscreen *sPriv = driContextPriv->driScreenPriv; - gammaContextPtr gmesa; - gammaScreenPtr gammascrn; - GLINTSAREADRIPtr saPriv=(GLINTSAREADRIPtr)(((char*)sPriv->pSAREA)+ - sizeof(drm_sarea_t)); - struct dd_function_table functions; - - gmesa = (gammaContextPtr) CALLOC( sizeof(*gmesa) ); - if (!gmesa) - return GL_FALSE; - - /* Init default driver functions then plug in our gamma-specific functions - * (the texture functions are especially important) - */ - _mesa_init_driver_functions( &functions ); - gammaDDInitTextureFuncs( &functions ); - - /* Allocate the Mesa context */ - if (sharedContextPrivate) - shareCtx = ((gammaContextPtr) sharedContextPrivate)->glCtx; - else - shareCtx = NULL; - - gmesa->glCtx = _mesa_create_context(glVisual, shareCtx, - &functions, (void *) gmesa); - if (!gmesa->glCtx) { - FREE(gmesa); - return GL_FALSE; - } - - gmesa->driContext = driContextPriv; - gmesa->driScreen = sPriv; - gmesa->driDrawable = NULL; /* Set by XMesaMakeCurrent */ - - gmesa->hHWContext = driContextPriv->hHWContext; - gmesa->driHwLock = &sPriv->pSAREA->lock; - gmesa->driFd = sPriv->fd; - gmesa->sarea = saPriv; - - gammascrn = gmesa->gammaScreen = (gammaScreenPtr)(sPriv->private); - - ctx = gmesa->glCtx; - - ctx->Const.MaxTextureLevels = GAMMA_TEX_MAXLEVELS; - ctx->Const.MaxTextureUnits = 1; /* Permedia 3 */ - ctx->Const.MaxTextureImageUnits = 1; - ctx->Const.MaxTextureCoordUnits = 1; - - ctx->Const.MinLineWidth = 0.0; - ctx->Const.MaxLineWidth = 255.0; - - ctx->Const.MinLineWidthAA = 0.0; - ctx->Const.MaxLineWidthAA = 65536.0; - - ctx->Const.MinPointSize = 0.0; - ctx->Const.MaxPointSize = 255.0; - - ctx->Const.MinPointSizeAA = 0.5; /* 4x4 quality mode */ - ctx->Const.MaxPointSizeAA = 16.0; - ctx->Const.PointSizeGranularity = 0.25; - - ctx->Const.MaxDrawBuffers = 1; - - gmesa->texHeap = mmInit( 0, gmesa->gammaScreen->textureSize ); - - make_empty_list(&gmesa->TexObjList); - make_empty_list(&gmesa->SwappedOut); - - gmesa->CurrentTexObj[0] = 0; - gmesa->CurrentTexObj[1] = 0; /* Permedia 3, second texture */ - - gmesa->RenderIndex = ~0; - - - /* Initialize the software rasterizer and helper modules. - */ - _swrast_CreateContext( ctx ); - _vbo_CreateContext( ctx ); - _tnl_CreateContext( ctx ); - _swsetup_CreateContext( ctx ); - - /* Install the customized pipeline: - */ - _tnl_destroy_pipeline( ctx ); - _tnl_install_pipeline( ctx, gamma_pipeline ); - - /* Configure swrast & TNL to match hardware characteristics: - */ - _swrast_allow_pixel_fog( ctx, GL_FALSE ); - _swrast_allow_vertex_fog( ctx, GL_TRUE ); - _tnl_allow_pixel_fog( ctx, GL_FALSE ); - _tnl_allow_vertex_fog( ctx, GL_TRUE ); - - gammaInitVB( ctx ); - gammaDDInitExtensions( ctx ); - /* XXX these should really go right after _mesa_init_driver_functions() */ - gammaDDInitDriverFuncs( ctx ); - gammaDDInitStateFuncs( ctx ); - gammaDDInitSpanFuncs( ctx ); - gammaDDInitTriFuncs( ctx ); - gammaDDInitState( gmesa ); - - gammaInitTextureObjects( ctx ); - - driContextPriv->driverPrivate = (void *)gmesa; - - GET_FIRST_DMA(gmesa->driFd, gmesa->hHWContext, - 1, &gmesa->bufIndex, &gmesa->bufSize, - &gmesa->buf, &gmesa->bufCount, gammascrn); - -#ifdef DO_VALIDATE - GET_FIRST_DMA(gmesa->driFd, gmesa->hHWContext, - 1, &gmesa->WCbufIndex, &gmesa->WCbufSize, - &gmesa->WCbuf, &gmesa->WCbufCount, gammascrn); -#endif - - switch (glVisual->depthBits) { - case 16: - gmesa->DeltaMode = DM_Depth16; - gmesa->depth_scale = 1.0f / 0xffff; - break; - case 24: - gmesa->DeltaMode = DM_Depth24; - gmesa->depth_scale = 1.0f / 0xffffff; - break; - case 32: - gmesa->DeltaMode = DM_Depth32; - gmesa->depth_scale = 1.0f / 0xffffffff; - break; - default: - break; - } - - gmesa->DepthSize = glVisual->depthBits; - gmesa->Flags = GAMMA_FRONT_BUFFER; - gmesa->Flags |= (glVisual->doubleBufferMode ? GAMMA_BACK_BUFFER : 0); - gmesa->Flags |= (gmesa->DepthSize > 0 ? GAMMA_DEPTH_BUFFER : 0); - - gmesa->EnabledFlags = GAMMA_FRONT_BUFFER; - gmesa->EnabledFlags |= (glVisual->doubleBufferMode ? GAMMA_BACK_BUFFER : 0); - - - if (gmesa->Flags & GAMMA_BACK_BUFFER) { - gmesa->readOffset = gmesa->drawOffset = gmesa->driScreen->fbHeight * gmesa->driScreen->fbWidth * gmesa->gammaScreen->cpp; - } else { - gmesa->readOffset = gmesa->drawOffset = 0; - } - - gammaInitHW( gmesa ); - - driContextPriv->driverPrivate = (void *)gmesa; - - return GL_TRUE; -} diff --git a/src/mesa/drivers/dri/gamma/gamma_context.h b/src/mesa/drivers/dri/gamma/gamma_context.h deleted file mode 100644 index b03dfa6fb4f..00000000000 --- a/src/mesa/drivers/dri/gamma/gamma_context.h +++ /dev/null @@ -1,401 +0,0 @@ -/* - * Copyright 2001 by Alan Hourihane. - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that - * copyright notice and this permission notice appear in supporting - * documentation, and that the name of Alan Hourihane not be used in - * advertising or publicity pertaining to distribution of the software without - * specific, written prior permission. Alan Hourihane makes no representations - * about the suitability of this software for any purpose. It is provided - * "as is" without express or implied warranty. - * - * ALAN HOURIHANE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO - * EVENT SHALL ALAN HOURIHANE BE LIABLE FOR ANY SPECIAL, INDIRECT OR - * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - * - * Authors: Alan Hourihane, <[email protected]> - * - */ - -#ifndef _GAMMA_CONTEXT_H_ -#define _GAMMA_CONTEXT_H_ - -#include "dri_util.h" -#include "drm.h" -#include "drm_sarea.h" -#include "main/colormac.h" -#include "gamma_regs.h" -#include "gamma_screen.h" -#include "main/macros.h" -#include "main/mtypes.h" -#include "glint_dri.h" -#include "main/mm.h" - -typedef union { - unsigned int i; - float f; -} dmaBufRec, *dmaBuf; - -/* Flags for context */ -#define GAMMA_FRONT_BUFFER 0x00000001 -#define GAMMA_BACK_BUFFER 0x00000002 -#define GAMMA_DEPTH_BUFFER 0x00000004 -#define GAMMA_STENCIL_BUFFER 0x00000008 -#define GAMMA_ACCUM_BUFFER 0x00000010 - -#define GAMMA_MAX_TEXTURE_SIZE 2048 - -/* These are the minimum requirements and should probably be increased */ -#define MAX_MODELVIEW_STACK 16 -#define MAX_PROJECTION_STACK 2 -#define MAX_TEXTURE_STACK 2 - -extern void gammaDDUpdateHWState(GLcontext *ctx); -extern gammaScreenPtr gammaCreateScreen(__DRIscreen *sPriv); -extern void gammaDestroyScreen(__DRIscreen *sPriv); -extern GLboolean gammaCreateContext( const __GLcontextModes *glVisual, - __DRIcontext *driContextPriv, - void *sharedContextPrivate); - -#define GAMMA_UPLOAD_ALL 0xffffffff -#define GAMMA_UPLOAD_CLIPRECTS 0x00000002 -#define GAMMA_UPLOAD_ALPHA 0x00000004 -#define GAMMA_UPLOAD_BLEND 0x00000008 -#define GAMMA_UPLOAD_DEPTH 0x00000010 -#define GAMMA_UPLOAD_VIEWPORT 0x00000020 -#define GAMMA_UPLOAD_SHADE 0x00000040 -#define GAMMA_UPLOAD_CLIP 0x00000080 -#define GAMMA_UPLOAD_MASKS 0x00000100 -#define GAMMA_UPLOAD_WINDOW 0x00000200 /* defunct */ -#define GAMMA_UPLOAD_GEOMETRY 0x00000400 -#define GAMMA_UPLOAD_POLYGON 0x00000800 -#define GAMMA_UPLOAD_DITHER 0x00001000 -#define GAMMA_UPLOAD_LOGICOP 0x00002000 -#define GAMMA_UPLOAD_FOG 0x00004000 -#define GAMMA_UPLOAD_LIGHT 0x00008000 -#define GAMMA_UPLOAD_CONTEXT 0x00010000 -#define GAMMA_UPLOAD_TEX0 0x00020000 -#define GAMMA_UPLOAD_STIPPLE 0x00040000 -#define GAMMA_UPLOAD_TRANSFORM 0x00080000 -#define GAMMA_UPLOAD_LINEMODE 0x00100000 -#define GAMMA_UPLOAD_POINTMODE 0x00200000 -#define GAMMA_UPLOAD_TRIMODE 0x00400000 - -#define GAMMA_NEW_CLIP 0x00000001 -#define GAMMA_NEW_WINDOW 0x00000002 -#define GAMMA_NEW_CONTEXT 0x00000004 -#define GAMMA_NEW_TEXTURE 0x00000008 /* defunct */ -#define GAMMA_NEW_ALPHA 0x00000010 -#define GAMMA_NEW_DEPTH 0x00000020 -#define GAMMA_NEW_MASKS 0x00000040 -#define GAMMA_NEW_POLYGON 0x00000080 -#define GAMMA_NEW_CULL 0x00000100 -#define GAMMA_NEW_LOGICOP 0x00000200 -#define GAMMA_NEW_FOG 0x00000400 -#define GAMMA_NEW_LIGHT 0x00000800 -#define GAMMA_NEW_STIPPLE 0x00001000 -#define GAMMA_NEW_ALL 0xffffffff - -#define GAMMA_FALLBACK_TRI 0x00000001 -#define GAMMA_FALLBACK_TEXTURE 0x00000002 - -#define FLUSH_BATCH(gmesa) do { \ - /*FLUSH_DMA_BUFFER(gmesa);*/ \ -} while(0) - -struct gamma_context; -typedef struct gamma_context gammaContextRec; -typedef struct gamma_context *gammaContextPtr; -typedef struct gamma_texture_object_t *gammaTextureObjectPtr; - -#define VALID_GAMMA_TEXTURE_OBJECT(tobj) (tobj) - -#define GAMMA_TEX_MAXLEVELS 12 /* 2K x 2K */ - -/* For shared texture space managment, these texture objects may also - * be used as proxies for regions of texture memory containing other - * client's textures. Such proxy textures (not to be confused with GL - * proxy textures) are subject to the same LRU aging we use for our - * own private textures, and thus we have a mechanism where we can - * fairly decide between kicking out our own textures and those of - * other clients. - * - * Non-local texture objects have a valid MemBlock to describe the - * region managed by the other client, and can be identified by - * 't->globj == 0' - */ -struct gamma_texture_object_t { - struct gamma_texture_object_t *next, *prev; - - GLuint age; - struct gl_texture_object *globj; - - int Pitch; - int Height; - int texelBytes; - int totalSize; - int bound; - - struct mem_block *MemBlock; - char * BufAddr; - - GLuint min_level; - GLuint max_level; - GLuint dirty_images; - - GLint firstLevel, lastLevel; /* upload tObj->Image[0][first .. lastLevel] */ - - struct { - const struct gl_texture_image *image; - int offset; /* into BufAddr */ - int height; - int internalFormat; - } image[GAMMA_TEX_MAXLEVELS]; - - uint32_t TextureBaseAddr[GAMMA_TEX_MAXLEVELS]; - uint32_t TextureAddressMode; - uint32_t TextureColorMode; - uint32_t TextureFilterMode; - uint32_t TextureFormat; - uint32_t TextureReadMode; - uint32_t TextureBorderColor; -}; - -#define GAMMA_NO_PALETTE 0x0 -#define GAMMA_USE_PALETTE 0x1 -#define GAMMA_UPDATE_PALETTE 0x2 -#define GAMMA_FALLBACK_PALETTE 0x4 - -void gammaUpdateTextureState( GLcontext *ctx ); - -void gammaDestroyTexObj( gammaContextPtr gmesa, gammaTextureObjectPtr t ); -void gammaSwapOutTexObj( gammaContextPtr gmesa, gammaTextureObjectPtr t ); -void gammaUploadTexImages( gammaContextPtr gmesa, gammaTextureObjectPtr t ); - -void gammaResetGlobalLRU( gammaContextPtr gmesa ); -void gammaUpdateTexLRU( gammaContextPtr gmesa, gammaTextureObjectPtr t ); -void gammaTexturesGone( gammaContextPtr gmesa, - GLuint start, GLuint end, - GLuint in_use ); - -void gammaEmitHwState( gammaContextPtr gmesa ); -void gammaDDInitExtensions( GLcontext *ctx ); -void gammaDDInitDriverFuncs( GLcontext *ctx ); -void gammaDDInitSpanFuncs( GLcontext *ctx ); -void gammaDDInitState( gammaContextPtr gmesa ); -void gammaInitHW( gammaContextPtr gmesa ); -void gammaDDInitStateFuncs( GLcontext *ctx ); -void gammaDDInitTextureFuncs( struct dd_function_table *table ); -void gammaInitTextureObjects( GLcontext *ctx ); -void gammaDDInitTriFuncs( GLcontext *ctx ); - -void gammaUpdateWindow( GLcontext *ctx ); -void gammaUpdateViewportOffset( GLcontext *ctx ); - -void gammaPrintLocalLRU( gammaContextPtr gmesa ); -void gammaPrintGlobalLRU( gammaContextPtr gmesa ); - -extern void gammaFallback( gammaContextPtr gmesa, GLuint bit, GLboolean mode ); -#define FALLBACK( imesa, bit, mode ) gammaFallback( imesa, bit, mode ) - -/* Use the templated vertex formats. Only one of these is used in gamma. - */ -#define TAG(x) gamma##x -#include "tnl_dd/t_dd_vertex.h" -#undef TAG - -typedef void (*gamma_quad_func)( gammaContextPtr, - const gammaVertex *, - const gammaVertex *, - const gammaVertex *, - const gammaVertex * ); -typedef void (*gamma_tri_func)( gammaContextPtr, - const gammaVertex *, - const gammaVertex *, - const gammaVertex * ); -typedef void (*gamma_line_func)( gammaContextPtr, - const gammaVertex *, - const gammaVertex * ); -typedef void (*gamma_point_func)( gammaContextPtr, - const gammaVertex * ); - - -struct gamma_context { - GLcontext *glCtx; /* Mesa context */ - - __DRIcontext *driContext; - __DRIscreen *driScreen; - __DRIdrawable *driDrawable; - - GLuint new_gl_state; - GLuint new_state; - GLuint dirty; - - GLINTSAREADRIPtr sarea; - - /* Mirrors of some DRI state - */ - drm_context_t hHWContext; - drm_hw_lock_t *driHwLock; - int driFd; - - GLuint numClipRects; /* Cliprects for the draw buffer */ - drm_clip_rect_t *pClipRects; - - dmaBuf buf; /* DMA buffer for regular cmds */ - int bufIndex; - int bufSize; - int bufCount; - - dmaBuf WCbuf; /* DMA buffer for window changed cmds */ - int WCbufIndex; - int WCbufSize; - int WCbufCount; - - gammaScreenPtr gammaScreen; /* Screen private DRI data */ - - int drawOffset; - int readOffset; - - gamma_point_func draw_point; - gamma_line_func draw_line; - gamma_tri_func draw_tri; - gamma_quad_func draw_quad; - - GLuint Fallback; - GLuint RenderIndex; - GLuint SetupNewInputs; - GLuint SetupIndex; - - GLuint vertex_format; - GLuint vertex_size; - GLuint vertex_stride_shift; - GLubyte *verts; - - GLfloat hw_viewport[16]; - GLuint hw_primitive; - GLenum render_primitive; - - GLfloat depth_scale; - - gammaTextureObjectPtr CurrentTexObj[2]; - struct gamma_texture_object_t TexObjList; - struct gamma_texture_object_t SwappedOut; - GLenum TexEnvImageFmt[2]; - - struct mem_block *texHeap; - - unsigned int lastSwap; - int texAge; - int ctxAge; - int dirtyAge; - unsigned int lastStamp; - - - uint32_t ClearColor; - uint32_t Color; - uint32_t DitherMode; - uint32_t ClearDepth; - uint32_t FogMode; - uint32_t AreaStippleMode; - uint32_t LBReadFormat; - uint32_t LBWriteFormat; - uint32_t LineMode; - uint32_t PointMode; - uint32_t TriangleMode; - uint32_t AntialiasMode; - GLfloat ViewportScaleX; - GLfloat ViewportScaleY; - GLfloat ViewportScaleZ; - GLfloat ViewportOffsetX; - GLfloat ViewportOffsetY; - GLfloat ViewportOffsetZ; - int MatrixMode; - int DepthMode; - int TransformMode; - int LBReadMode; - int FBReadMode; - int FBWindowBase; - int LBWindowBase; - int ColorDDAMode; - int GeometryMode; - int AlphaTestMode; - int AlphaBlendMode; - int AB_FBReadMode; - int AB_FBReadMode_Save; - int DeltaMode; - int ColorMaterialMode; - int FBHardwareWriteMask; - int MaterialMode; - int NormalizeMode; - int LightingMode; - int Light0Mode; - int Light1Mode; - int Light2Mode; - int Light3Mode; - int Light4Mode; - int Light5Mode; - int Light6Mode; - int Light7Mode; - int Light8Mode; - int Light9Mode; - int Light10Mode; - int Light11Mode; - int Light12Mode; - int Light13Mode; - int Light14Mode; - int Light15Mode; - int LogicalOpMode; - int ScissorMode; - int ScissorMaxXY; - int ScissorMinXY; - int Window; /* GID part probably should be in draw priv */ - int WindowOrigin; - int x, y, w, h; /* Probably should be in drawable priv */ - int FrameCount; /* Probably should be in drawable priv */ - int NotClipped; /* Probably should be in drawable priv */ - int WindowChanged; /* Probably should be in drawabl... */ - int Flags; - int EnabledFlags; - int DepthSize; - int Begin; - GLenum ErrorValue; - int Texture1DEnabled; - int Texture2DEnabled; - - float ModelView[16]; - float Proj[16]; - float ModelViewProj[16]; - float Texture[16]; - - float ModelViewStack[(MAX_MODELVIEW_STACK-1)*16]; - int ModelViewCount; - float ProjStack[(MAX_PROJECTION_STACK-1)*16]; - int ProjCount; - float TextureStack[(MAX_TEXTURE_STACK-1)*16]; - int TextureCount; -}; - -static INLINE GLuint gammaPackColor( GLuint cpp, - GLubyte r, GLubyte g, - GLubyte b, GLubyte a ) -{ - switch ( cpp ) { - case 2: - return PACK_COLOR_565( r, g, b ); - case 4: - return PACK_COLOR_8888( a, r, g, b ); - default: - return 0; - } -} - -#define GAMMA_CONTEXT(ctx) ((gammaContextPtr)(ctx->DriverCtx)) - -#endif /* _GAMMA_CONTEXT_H_ */ diff --git a/src/mesa/drivers/dri/gamma/gamma_dd.c b/src/mesa/drivers/dri/gamma/gamma_dd.c deleted file mode 100644 index 389d2231e76..00000000000 --- a/src/mesa/drivers/dri/gamma/gamma_dd.c +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright 2001 by Alan Hourihane. - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that - * copyright notice and this permission notice appear in supporting - * documentation, and that the name of Alan Hourihane not be used in - * advertising or publicity pertaining to distribution of the software without - * specific, written prior permission. Alan Hourihane makes no representations - * about the suitability of this software for any purpose. It is provided - * "as is" without express or implied warranty. - * - * ALAN HOURIHANE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO - * EVENT SHALL ALAN HOURIHANE BE LIABLE FOR ANY SPECIAL, INDIRECT OR - * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - * - * Authors: Alan Hourihane, <[email protected]> - * - */ - -#include "gamma_context.h" -#include "gamma_vb.h" -#include "gamma_lock.h" -#include "gamma_macros.h" -#if defined(USE_X86_ASM) -#include "x86/common_x86_asm.h" -#endif - -#include "main/context.h" -#include "swrast/swrast.h" - -#define GAMMA_DATE "20021125" - - -/* Return the width and height of the current color buffer. - */ -static void gammaDDGetBufferSize( GLframebuffer *buffer, - GLuint *width, GLuint *height ) -{ - GET_CURRENT_CONTEXT(ctx); - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - - GAMMAHW_LOCK( gmesa ); - *width = gmesa->driDrawable->w; - *height = gmesa->driDrawable->h; - GAMMAHW_UNLOCK( gmesa ); -} - - -/* Return various strings for glGetString(). - */ -static const GLubyte *gammaDDGetString( GLcontext *ctx, GLenum name ) -{ - static char buffer[128]; - - switch ( name ) { - case GL_VENDOR: - return (GLubyte *)"VA Linux Systems, Inc."; - - case GL_RENDERER: - sprintf( buffer, "Mesa DRI Gamma " GAMMA_DATE ); - - /* Append any CPU-specific information. - */ -#ifdef USE_X86_ASM - if ( _mesa_x86_cpu_features ) { - strncat( buffer, " x86", 4 ); - } -#ifdef USE_MMX_ASM - if ( cpu_has_mmx ) { - strncat( buffer, "/MMX", 4 ); - } -#endif -#ifdef USE_3DNOW_ASM - if ( cpu_has_3dnow ) { - strncat( buffer, "/3DNow!", 7 ); - } -#endif -#ifdef USE_SSE_ASM - if ( cpu_has_xmm ) { - strncat( buffer, "/SSE", 4 ); - } -#endif -#endif - return (GLubyte *)buffer; - - default: - return NULL; - } -} - -/* Enable the extensions supported by this driver. - */ -void gammaDDInitExtensions( GLcontext *ctx ) -{ - /* None... */ -} - -/* Initialize the driver's misc functions. - */ -void gammaDDInitDriverFuncs( GLcontext *ctx ) -{ - ctx->Driver.GetBufferSize = gammaDDGetBufferSize; - ctx->Driver.GetString = gammaDDGetString; -} diff --git a/src/mesa/drivers/dri/gamma/gamma_inithw.c b/src/mesa/drivers/dri/gamma/gamma_inithw.c deleted file mode 100644 index 735acb7a576..00000000000 --- a/src/mesa/drivers/dri/gamma/gamma_inithw.c +++ /dev/null @@ -1,551 +0,0 @@ -/* - * Copyright 2001 by Alan Hourihane. - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that - * copyright notice and this permission notice appear in supporting - * documentation, and that the name of Alan Hourihane not be used in - * advertising or publicity pertaining to distribution of the software without - * specific, written prior permission. Alan Hourihane makes no representations - * about the suitability of this software for any purpose. It is provided - * "as is" without express or implied warranty. - * - * ALAN HOURIHANE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO - * EVENT SHALL ALAN HOURIHANE BE LIABLE FOR ANY SPECIAL, INDIRECT OR - * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - * - * Authors: Alan Hourihane, <[email protected]> - * Kevin E. Martin <[email protected]> - * - */ - -#include "gamma_context.h" -#include "gamma_macros.h" -#include "glint_dri.h" - -void gammaInitHW( gammaContextPtr gmesa ) -{ - GLINTDRIPtr gDRIPriv = (GLINTDRIPtr)gmesa->driScreen->pDevPriv; - int i; - - if (gDRIPriv->numMultiDevices == 2) { - /* Set up each MX's ScanLineOwnership for OpenGL */ - CHECK_DMA_BUFFER(gmesa, 5); - WRITE(gmesa->buf, BroadcastMask, 1); - WRITE(gmesa->buf, ScanLineOwnership, 5); /* Use bottom left as [0,0] */ - WRITE(gmesa->buf, BroadcastMask, 2); - WRITE(gmesa->buf, ScanLineOwnership, 1); /* Use bottom left as [0,0] */ - /* Broadcast to both MX's */ - WRITE(gmesa->buf, BroadcastMask, 3); - FLUSH_DMA_BUFFER(gmesa); - } - - gmesa->AlphaBlendMode = (AlphaBlendModeDisable | - AB_Src_One | - AB_Dst_Zero | - AB_NoAlphaBufferPresent | - AB_ColorFmt_8888 | - AB_ColorOrder_RGB | - AB_OpenGLType | - AB_AlphaDst_FBData | - AB_ColorConversionScale | - AB_AlphaConversionScale); - - gmesa->DitherMode = DitherModeEnable | DM_ColorOrder_RGB; - - switch (gmesa->gammaScreen->cpp) { - case 2: - gmesa->DitherMode |= DM_ColorFmt_5555; - gmesa->AlphaBlendMode |= AB_ColorFmt_5555; - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, PixelSize, 1); - break; - case 4: - gmesa->DitherMode |= DM_ColorFmt_8888; - gmesa->AlphaBlendMode |= AB_ColorFmt_8888; - WRITE(gmesa->buf, PixelSize, 0); - break; - } - - /* FIXME for stencil, gid, etc */ - switch (gmesa->DepthSize) { - case 16: - gmesa->LBReadFormat = - (LBRF_DepthWidth16 | - LBRF_StencilWidth8 | - LBRF_StencilPos16 | - LBRF_FrameCount8 | - LBRF_FrameCountPos24 | - LBRF_GIDWidth4 | - LBRF_GIDPos32 ); - gmesa->LBWriteFormat = - (LBRF_DepthWidth16 | - LBRF_StencilWidth8 | - LBRF_StencilPos16 | - LBRF_FrameCount8 | - LBRF_FrameCountPos24 | - LBRF_GIDWidth4 | - LBRF_GIDPos32 ); - break; - case 24: - gmesa->LBReadFormat = - (LBRF_DepthWidth24 | - LBRF_StencilWidth8 | - LBRF_StencilPos24 | - LBRF_FrameCount8 | - LBRF_FrameCountPos32 | - LBRF_GIDWidth4 | - LBRF_GIDPos36 ); - gmesa->LBWriteFormat = - (LBRF_DepthWidth24 | - LBRF_StencilWidth8 | - LBRF_StencilPos24 | - LBRF_FrameCount8 | - LBRF_FrameCountPos32 | - LBRF_GIDWidth4 | - LBRF_GIDPos36 ); - break; - case 32: - gmesa->LBReadFormat = - (LBRF_DepthWidth32 | - LBRF_StencilWidth8 | - LBRF_StencilPos32 | - LBRF_FrameCount8 | - LBRF_FrameCountPos40 | - LBRF_GIDWidth4 | - LBRF_GIDPos44 ); - gmesa->LBWriteFormat = - (LBRF_DepthWidth32 | - LBRF_StencilWidth8 | - LBRF_StencilPos32 | - LBRF_FrameCount8 | - LBRF_FrameCountPos40 | - LBRF_GIDWidth4 | - LBRF_GIDPos44 ); - break; - } - - gmesa->FBHardwareWriteMask = 0xffffffff; - gmesa->FogMode = FogModeDisable; - gmesa->ClearDepth = 0xffffffff; - gmesa->AreaStippleMode = AreaStippleModeDisable; - gmesa->x = 0; - gmesa->y = 0; - gmesa->w = 0; - gmesa->h = 0; - gmesa->FrameCount = 0; - gmesa->MatrixMode = GL_MODELVIEW; - gmesa->ModelViewCount = 0; - gmesa->ProjCount = 0; - gmesa->TextureCount = 0; - gmesa->PointMode = PM_AntialiasQuality_4x4; - gmesa->LineMode = LM_AntialiasQuality_4x4; - gmesa->TriangleMode = TM_AntialiasQuality_4x4; - gmesa->AntialiasMode = AntialiasModeDisable; - - for (i = 0; i < 16; i++) - if (i % 5 == 0) - gmesa->ModelView[i] = - gmesa->Proj[i] = - gmesa->ModelViewProj[i] = - gmesa->Texture[i] = 1.0; - else - gmesa->ModelView[i] = - gmesa->Proj[i] = - gmesa->ModelViewProj[i] = - gmesa->Texture[i] = 0.0; - - gmesa->LBReadMode = (LBReadSrcDisable | - LBReadDstDisable | - LBDataTypeDefault | - LBWindowOriginBot | - gDRIPriv->pprod); - gmesa->FBReadMode = (FBReadSrcDisable | - FBReadDstDisable | - FBDataTypeDefault | - FBWindowOriginBot | - gDRIPriv->pprod); - - if (gDRIPriv->numMultiDevices == 2) { - gmesa->LBReadMode |= LBScanLineInt2; - gmesa->FBReadMode |= FBScanLineInt2; - gmesa->LBWindowBase = gmesa->driScreen->fbWidth * - (gmesa->driScreen->fbHeight/2 - 1); - gmesa->FBWindowBase = gmesa->driScreen->fbWidth * - (gmesa->driScreen->fbHeight/2 - 1); - } else { - gmesa->LBWindowBase = gmesa->driScreen->fbWidth * - (gmesa->driScreen->fbHeight - 1); - gmesa->FBWindowBase = gmesa->driScreen->fbWidth * - (gmesa->driScreen->fbHeight - 1); - } - - gmesa->Begin = (B_AreaStippleDisable | - B_LineStippleDisable | - B_AntiAliasDisable | - B_TextureDisable | - B_FogDisable | - B_SubPixelCorrectEnable | - B_PrimType_Null); - - gmesa->ColorDDAMode = (ColorDDAEnable | - ColorDDAGouraud); - - gmesa->GeometryMode = (GM_TextureDisable | - GM_FogDisable | - GM_FogExp | - GM_FrontPolyFill | - GM_BackPolyFill | - GM_FrontFaceCCW | - GM_PolyCullDisable | - GM_PolyCullBack | - GM_ClipShortLinesDisable | - GM_ClipSmallTrisDisable | - GM_RenderMode | - GM_Feedback2D | - GM_CullFaceNormDisable | - GM_AutoFaceNormDisable | - GM_GouraudShading | - GM_UserClipNone | - GM_PolyOffsetPointDisable | - GM_PolyOffsetLineDisable | - GM_PolyOffsetFillDisable | - GM_InvertFaceNormCullDisable); - - gmesa->AlphaTestMode = (AlphaTestModeDisable | - AT_Always); - - gmesa->AB_FBReadMode_Save = gmesa->AB_FBReadMode = 0; - - gmesa->Window = (WindowEnable | /* For GID testing */ - W_PassIfEqual | - (0 << 5)); /* GID part is set from draw priv (below) */ - - gmesa->NotClipped = GL_FALSE; - gmesa->WindowChanged = GL_TRUE; - - gmesa->Texture1DEnabled = GL_FALSE; - gmesa->Texture2DEnabled = GL_FALSE; - - gmesa->DepthMode |= (DepthModeDisable | - DM_WriteMask | - DM_Less); - - gmesa->DeltaMode |= (DM_SubPixlCorrectionEnable | - DM_SmoothShadingEnable | - DM_Target500TXMX); - - gmesa->LightingMode = LightingModeDisable | LightingModeSpecularEnable; - gmesa->Light0Mode = LNM_Off; - gmesa->Light1Mode = LNM_Off; - gmesa->Light2Mode = LNM_Off; - gmesa->Light3Mode = LNM_Off; - gmesa->Light4Mode = LNM_Off; - gmesa->Light5Mode = LNM_Off; - gmesa->Light6Mode = LNM_Off; - gmesa->Light7Mode = LNM_Off; - gmesa->Light8Mode = LNM_Off; - gmesa->Light9Mode = LNM_Off; - gmesa->Light10Mode = LNM_Off; - gmesa->Light11Mode = LNM_Off; - gmesa->Light12Mode = LNM_Off; - gmesa->Light13Mode = LNM_Off; - gmesa->Light14Mode = LNM_Off; - gmesa->Light15Mode = LNM_Off; - - gmesa->LogicalOpMode = LogicalOpModeDisable; - - gmesa->MaterialMode = MaterialModeDisable; - - gmesa->ScissorMode = UserScissorDisable | ScreenScissorDisable; - - gmesa->TransformMode = XM_UseModelViewProjMatrix | - XM_TexGenModeS_None | - XM_TexGenModeT_None | - XM_TexGenModeR_None | - XM_TexGenModeQ_None; - - CHECK_DMA_BUFFER(gmesa, 20); - WRITE(gmesa->buf, LineStippleMode, 0); - WRITE(gmesa->buf, RouterMode, 0); - WRITE(gmesa->buf, TextureAddressMode, 0); - WRITE(gmesa->buf, TextureReadMode, 0); - WRITE(gmesa->buf, TextureFilterMode, 0); - WRITE(gmesa->buf, TextureColorMode, 0); - WRITE(gmesa->buf, StencilMode, 0); - WRITE(gmesa->buf, PatternRamMode, 0); - WRITE(gmesa->buf, ChromaTestMode, 0); - WRITE(gmesa->buf, StatisticMode, 0); - WRITE(gmesa->buf, AreaStippleMode, gmesa->AreaStippleMode); - WRITE(gmesa->buf, ScissorMode, gmesa->ScissorMode); - WRITE(gmesa->buf, FogMode, gmesa->FogMode); - WRITE(gmesa->buf, AntialiasMode, gmesa->AntialiasMode); - WRITE(gmesa->buf, LogicalOpMode, gmesa->LogicalOpMode); - WRITE(gmesa->buf, TriangleMode, gmesa->TriangleMode); - WRITE(gmesa->buf, PointMode, gmesa->PointMode); - WRITE(gmesa->buf, LineMode, gmesa->LineMode); - WRITE(gmesa->buf, LBWriteFormat, gmesa->LBWriteFormat); - WRITE(gmesa->buf, LBReadFormat, gmesa->LBReadFormat); - - /* Framebuffer initialization */ - CHECK_DMA_BUFFER(gmesa, 10); - WRITE(gmesa->buf, FBSourceData, 0); - WRITE(gmesa->buf, FBReadMode, gmesa->FBReadMode); - if (gmesa->EnabledFlags & GAMMA_BACK_BUFFER) { - if (gDRIPriv->numMultiDevices == 2) { - WRITE(gmesa->buf, FBPixelOffset, - (gmesa->driScreen->fbHeight/2)*gmesa->driScreen->fbWidth); - } else { - WRITE(gmesa->buf, FBPixelOffset, - gmesa->driScreen->fbHeight*gmesa->driScreen->fbWidth); - } - } else - WRITE(gmesa->buf, FBPixelOffset, 0); - WRITE(gmesa->buf, FBSourceOffset, 0); - WRITE(gmesa->buf, FBHardwareWriteMask, 0xffffffff); - WRITE(gmesa->buf, FBSoftwareWriteMask, 0xffffffff); - WRITE(gmesa->buf, FBWriteMode, FBWriteModeEnable); - WRITE(gmesa->buf, FBWindowBase, gmesa->FBWindowBase); - WRITE(gmesa->buf, ScreenSize, ((gmesa->driScreen->fbHeight << 16) | - (gmesa->driScreen->fbWidth))); - WRITE(gmesa->buf, WindowOrigin, 0x00000000); - - /* Localbuffer initialization */ - CHECK_DMA_BUFFER(gmesa, 5); - WRITE(gmesa->buf, LBReadMode, gmesa->LBReadMode); - WRITE(gmesa->buf, LBSourceOffset, 0); - WRITE(gmesa->buf, LBWriteMode, LBWriteModeEnable); - WRITE(gmesa->buf, LBWindowOffset, 0); - WRITE(gmesa->buf, LBWindowBase, gmesa->LBWindowBase); - - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, Rectangle2DControl, 1); - - CHECK_DMA_BUFFER(gmesa, 11); - WRITE(gmesa->buf, DepthMode, gmesa->DepthMode); - WRITE(gmesa->buf, ColorDDAMode, gmesa->ColorDDAMode); - WRITE(gmesa->buf, FBBlockColor, 0x00000000); - WRITE(gmesa->buf, ConstantColor, 0x00000000); - WRITE(gmesa->buf, AlphaTestMode, gmesa->AlphaTestMode); - WRITE(gmesa->buf, AlphaBlendMode, gmesa->AlphaBlendMode); - WRITE(gmesa->buf, DitherMode, gmesa->DitherMode); - if (gDRIPriv->numMultiDevices == 2) - WRITE(gmesa->buf, RasterizerMode, RM_MultiGLINT | RM_BiasCoordNearHalf); - else - WRITE(gmesa->buf, RasterizerMode, RM_BiasCoordNearHalf); - WRITE(gmesa->buf, GLINTWindow, gmesa->Window); - WRITE(gmesa->buf, FastClearDepth, gmesa->ClearDepth); - WRITE(gmesa->buf, GLINTDepth, gmesa->ClearDepth); - - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, EdgeFlag, EdgeFlagEnable); - - CHECK_DMA_BUFFER(gmesa, 16); - WRITEF(gmesa->buf, ModelViewMatrix0, 1.0); - WRITEF(gmesa->buf, ModelViewMatrix1, 0.0); - WRITEF(gmesa->buf, ModelViewMatrix2, 0.0); - WRITEF(gmesa->buf, ModelViewMatrix3, 0.0); - WRITEF(gmesa->buf, ModelViewMatrix4, 0.0); - WRITEF(gmesa->buf, ModelViewMatrix5, 1.0); - WRITEF(gmesa->buf, ModelViewMatrix6, 0.0); - WRITEF(gmesa->buf, ModelViewMatrix7, 0.0); - WRITEF(gmesa->buf, ModelViewMatrix8, 0.0); - WRITEF(gmesa->buf, ModelViewMatrix9, 0.0); - WRITEF(gmesa->buf, ModelViewMatrix10, 1.0); - WRITEF(gmesa->buf, ModelViewMatrix11, 0.0); - WRITEF(gmesa->buf, ModelViewMatrix12, 0.0); - WRITEF(gmesa->buf, ModelViewMatrix13, 0.0); - WRITEF(gmesa->buf, ModelViewMatrix14, 0.0); - WRITEF(gmesa->buf, ModelViewMatrix15, 1.0); - - CHECK_DMA_BUFFER(gmesa, 16); - WRITEF(gmesa->buf, ModelViewProjectionMatrix0, 1.0); - WRITEF(gmesa->buf, ModelViewProjectionMatrix1, 0.0); - WRITEF(gmesa->buf, ModelViewProjectionMatrix2, 0.0); - WRITEF(gmesa->buf, ModelViewProjectionMatrix3, 0.0); - WRITEF(gmesa->buf, ModelViewProjectionMatrix4, 0.0); - WRITEF(gmesa->buf, ModelViewProjectionMatrix5, 1.0); - WRITEF(gmesa->buf, ModelViewProjectionMatrix6, 0.0); - WRITEF(gmesa->buf, ModelViewProjectionMatrix7, 0.0); - WRITEF(gmesa->buf, ModelViewProjectionMatrix8, 0.0); - WRITEF(gmesa->buf, ModelViewProjectionMatrix9, 0.0); - WRITEF(gmesa->buf, ModelViewProjectionMatrix10, 1.0); - WRITEF(gmesa->buf, ModelViewProjectionMatrix11, 0.0); - WRITEF(gmesa->buf, ModelViewProjectionMatrix12, 0.0); - WRITEF(gmesa->buf, ModelViewProjectionMatrix13, 0.0); - WRITEF(gmesa->buf, ModelViewProjectionMatrix14, 0.0); - WRITEF(gmesa->buf, ModelViewProjectionMatrix15, 1.0); - - CHECK_DMA_BUFFER(gmesa, 16); - WRITEF(gmesa->buf, TextureMatrix0, 1.0); - WRITEF(gmesa->buf, TextureMatrix1, 0.0); - WRITEF(gmesa->buf, TextureMatrix2, 0.0); - WRITEF(gmesa->buf, TextureMatrix3, 0.0); - WRITEF(gmesa->buf, TextureMatrix4, 0.0); - WRITEF(gmesa->buf, TextureMatrix5, 1.0); - WRITEF(gmesa->buf, TextureMatrix6, 0.0); - WRITEF(gmesa->buf, TextureMatrix7, 0.0); - WRITEF(gmesa->buf, TextureMatrix8, 0.0); - WRITEF(gmesa->buf, TextureMatrix9, 0.0); - WRITEF(gmesa->buf, TextureMatrix10, 1.0); - WRITEF(gmesa->buf, TextureMatrix11, 0.0); - WRITEF(gmesa->buf, TextureMatrix12, 0.0); - WRITEF(gmesa->buf, TextureMatrix13, 0.0); - WRITEF(gmesa->buf, TextureMatrix14, 0.0); - WRITEF(gmesa->buf, TextureMatrix15, 1.0); - - CHECK_DMA_BUFFER(gmesa, 16); - WRITEF(gmesa->buf, TexGen0, 0.0); - WRITEF(gmesa->buf, TexGen1, 0.0); - WRITEF(gmesa->buf, TexGen2, 0.0); - WRITEF(gmesa->buf, TexGen3, 0.0); - WRITEF(gmesa->buf, TexGen4, 0.0); - WRITEF(gmesa->buf, TexGen5, 0.0); - WRITEF(gmesa->buf, TexGen6, 0.0); - WRITEF(gmesa->buf, TexGen7, 0.0); - WRITEF(gmesa->buf, TexGen8, 0.0); - WRITEF(gmesa->buf, TexGen9, 0.0); - WRITEF(gmesa->buf, TexGen10, 0.0); - WRITEF(gmesa->buf, TexGen11, 0.0); - WRITEF(gmesa->buf, TexGen12, 0.0); - WRITEF(gmesa->buf, TexGen13, 0.0); - WRITEF(gmesa->buf, TexGen14, 0.0); - WRITEF(gmesa->buf, TexGen15, 0.0); - - CHECK_DMA_BUFFER(gmesa, 9); - WRITEF(gmesa->buf, NormalMatrix0, 1.0); - WRITEF(gmesa->buf, NormalMatrix1, 0.0); - WRITEF(gmesa->buf, NormalMatrix2, 0.0); - WRITEF(gmesa->buf, NormalMatrix3, 0.0); - WRITEF(gmesa->buf, NormalMatrix4, 1.0); - WRITEF(gmesa->buf, NormalMatrix5, 0.0); - WRITEF(gmesa->buf, NormalMatrix6, 0.0); - WRITEF(gmesa->buf, NormalMatrix7, 0.0); - WRITEF(gmesa->buf, NormalMatrix8, 1.0); - - CHECK_DMA_BUFFER(gmesa, 3); - WRITEF(gmesa->buf, FogDensity, 0.0); - WRITEF(gmesa->buf, FogEnd, 0.0); - WRITEF(gmesa->buf, FogScale, 0.0); - - CHECK_DMA_BUFFER(gmesa, 2); - WRITEF(gmesa->buf, LineClipLengthThreshold, 0.0); - WRITEF(gmesa->buf, TriangleClipAreaThreshold, 0.0); - - CHECK_DMA_BUFFER(gmesa, 5); - WRITE(gmesa->buf, GeometryMode, gmesa->GeometryMode); - WRITE(gmesa->buf, NormalizeMode, NormalizeModeDisable); - WRITE(gmesa->buf, LightingMode, gmesa->LightingMode); - WRITE(gmesa->buf, ColorMaterialMode, ColorMaterialModeDisable); - WRITE(gmesa->buf, MaterialMode, MaterialModeDisable); - - CHECK_DMA_BUFFER(gmesa, 2); - WRITE(gmesa->buf, FrontSpecularExponent, 0); /* fixed point */ - WRITE(gmesa->buf, BackSpecularExponent, 0); /* fixed point */ - - CHECK_DMA_BUFFER(gmesa, 29); - WRITEF(gmesa->buf, FrontAmbientColorRed, 0.2); - WRITEF(gmesa->buf, FrontAmbientColorGreen, 0.2); - WRITEF(gmesa->buf, FrontAmbientColorBlue, 0.2); - WRITEF(gmesa->buf, BackAmbientColorRed, 0.2); - WRITEF(gmesa->buf, BackAmbientColorGreen, 0.2); - WRITEF(gmesa->buf, BackAmbientColorBlue, 0.2); - WRITEF(gmesa->buf, FrontDiffuseColorRed, 0.8); - WRITEF(gmesa->buf, FrontDiffuseColorGreen, 0.8); - WRITEF(gmesa->buf, FrontDiffuseColorBlue, 0.8); - WRITEF(gmesa->buf, BackDiffuseColorRed, 0.8); - WRITEF(gmesa->buf, BackDiffuseColorGreen, 0.8); - WRITEF(gmesa->buf, BackDiffuseColorBlue, 0.8); - WRITEF(gmesa->buf, FrontSpecularColorRed, 0.0); - WRITEF(gmesa->buf, FrontSpecularColorGreen, 0.0); - WRITEF(gmesa->buf, FrontSpecularColorBlue, 0.0); - WRITEF(gmesa->buf, BackSpecularColorRed, 0.0); - WRITEF(gmesa->buf, BackSpecularColorGreen, 0.0); - WRITEF(gmesa->buf, BackSpecularColorBlue, 0.0); - WRITEF(gmesa->buf, FrontEmissiveColorRed, 0.0); - WRITEF(gmesa->buf, FrontEmissiveColorGreen, 0.0); - WRITEF(gmesa->buf, FrontEmissiveColorBlue, 0.0); - WRITEF(gmesa->buf, BackEmissiveColorRed, 0.0); - WRITEF(gmesa->buf, BackEmissiveColorGreen, 0.0); - WRITEF(gmesa->buf, BackEmissiveColorBlue, 0.0); - WRITEF(gmesa->buf, SceneAmbientColorRed, 0.2); - WRITEF(gmesa->buf, SceneAmbientColorGreen, 0.2); - WRITEF(gmesa->buf, SceneAmbientColorBlue, 0.2); - WRITEF(gmesa->buf, FrontAlpha, 1.0); - WRITEF(gmesa->buf, BackAlpha, 1.0); - - CHECK_DMA_BUFFER(gmesa, 7); - WRITE(gmesa->buf, PointSize, 1); - WRITEF(gmesa->buf, AApointSize, 1.0); - WRITE(gmesa->buf, LineWidth, 1); - WRITEF(gmesa->buf, AAlineWidth, 1.0); - WRITE(gmesa->buf, LineWidthOffset, 0); - WRITE(gmesa->buf, TransformMode, gmesa->TransformMode); - WRITE(gmesa->buf, DeltaMode, gmesa->DeltaMode); - - CHECK_DMA_BUFFER(gmesa, 16); - WRITE(gmesa->buf, Light0Mode, LNM_Off); - WRITE(gmesa->buf, Light1Mode, LNM_Off); - WRITE(gmesa->buf, Light2Mode, LNM_Off); - WRITE(gmesa->buf, Light3Mode, LNM_Off); - WRITE(gmesa->buf, Light4Mode, LNM_Off); - WRITE(gmesa->buf, Light5Mode, LNM_Off); - WRITE(gmesa->buf, Light6Mode, LNM_Off); - WRITE(gmesa->buf, Light7Mode, LNM_Off); - WRITE(gmesa->buf, Light8Mode, LNM_Off); - WRITE(gmesa->buf, Light9Mode, LNM_Off); - WRITE(gmesa->buf, Light10Mode, LNM_Off); - WRITE(gmesa->buf, Light11Mode, LNM_Off); - WRITE(gmesa->buf, Light12Mode, LNM_Off); - WRITE(gmesa->buf, Light13Mode, LNM_Off); - WRITE(gmesa->buf, Light14Mode, LNM_Off); - WRITE(gmesa->buf, Light15Mode, LNM_Off); - - CHECK_DMA_BUFFER(gmesa, 22); - WRITEF(gmesa->buf, Light0AmbientIntensityBlue, 0.0); - WRITEF(gmesa->buf, Light0AmbientIntensityGreen, 0.0); - WRITEF(gmesa->buf, Light0AmbientIntensityRed, 0.0); - WRITEF(gmesa->buf, Light0DiffuseIntensityBlue, 1.0); - WRITEF(gmesa->buf, Light0DiffuseIntensityGreen, 1.0); - WRITEF(gmesa->buf, Light0DiffuseIntensityRed, 1.0); - WRITEF(gmesa->buf, Light0SpecularIntensityBlue, 1.0); - WRITEF(gmesa->buf, Light0SpecularIntensityGreen, 1.0); - WRITEF(gmesa->buf, Light0SpecularIntensityRed, 1.0); - WRITEF(gmesa->buf, Light0SpotlightDirectionZ, 0.0); - WRITEF(gmesa->buf, Light0SpotlightDirectionY, 0.0); - WRITEF(gmesa->buf, Light0SpotlightDirectionX, -1.0); - WRITEF(gmesa->buf, Light0SpotlightExponent, 0.0); - WRITEF(gmesa->buf, Light0PositionZ, 0.0); - WRITEF(gmesa->buf, Light0PositionY, 0.0); - WRITEF(gmesa->buf, Light0PositionX, 1.0); - WRITEF(gmesa->buf, Light0PositionW, 0.0); - WRITEF(gmesa->buf, Light0CosSpotlightCutoffAngle, -1.0); - WRITEF(gmesa->buf, Light0ConstantAttenuation, 1.0); - WRITEF(gmesa->buf, Light0LinearAttenuation, 0.0); - WRITEF(gmesa->buf, Light0QuadraticAttenuation,0.0); - - CHECK_DMA_BUFFER(gmesa, 2); - WRITEF(gmesa->buf, XBias, 0.0); - WRITEF(gmesa->buf, YBias, 0.0); - - CHECK_DMA_BUFFER(gmesa, 6); - WRITEF(gmesa->buf, ViewPortScaleX, gmesa->driScreen->fbWidth/4); - WRITEF(gmesa->buf, ViewPortScaleY, gmesa->driScreen->fbHeight/4); - WRITEF(gmesa->buf, ViewPortScaleZ, 1.0f); - WRITEF(gmesa->buf, ViewPortOffsetX, gmesa->x); - WRITEF(gmesa->buf, ViewPortOffsetY, gmesa->y); - WRITEF(gmesa->buf, ViewPortOffsetZ, 0.0f); - - CHECK_DMA_BUFFER(gmesa, 3); - WRITEF(gmesa->buf, Nz, 1.0); - WRITEF(gmesa->buf, Ny, 0.0); - WRITEF(gmesa->buf, Nx, 0.0); - - /* Send the initialization commands to the HW */ - FLUSH_DMA_BUFFER(gmesa); -} diff --git a/src/mesa/drivers/dri/gamma/gamma_lock.c b/src/mesa/drivers/dri/gamma/gamma_lock.c deleted file mode 100644 index c58b59aa1b4..00000000000 --- a/src/mesa/drivers/dri/gamma/gamma_lock.c +++ /dev/null @@ -1,60 +0,0 @@ - -#include "gamma_context.h" -#include "gamma_lock.h" -#include "drirenderbuffer.h" - -#ifdef DEBUG_LOCKING -char *prevLockFile = NULL; -int prevLockLine = 0; -#endif - - -/* Update the hardware state. This is called if another context has - * grabbed the hardware lock, which includes the X server. This - * function also updates the driver's window state after the X server - * moves, resizes or restacks a window -- the change will be reflected - * in the drawable position and clip rects. Since the X server grabs - * the hardware lock when it changes the window state, this routine will - * automatically be called after such a change. - */ -void gammaGetLock( gammaContextPtr gmesa, GLuint flags ) -{ - __DRIdrawable *dPriv = gmesa->driDrawable; - __DRIscreen *sPriv = gmesa->driScreen; - - drmGetLock( gmesa->driFd, gmesa->hHWContext, flags ); - - /* The window might have moved, so we might need to get new clip - * rects. - * - * NOTE: This releases and regrabs the hw lock to allow the X server - * to respond to the DRI protocol request for new drawable info. - * Since the hardware state depends on having the latest drawable - * clip rects, all state checking must be done _after_ this call. - */ - DRI_VALIDATE_DRAWABLE_INFO( sPriv, dPriv ); - - if ( gmesa->lastStamp != dPriv->lastStamp ) { - driUpdateFramebufferSize(gmesa->glCtx, dPriv); - gmesa->lastStamp = dPriv->lastStamp; - gmesa->new_state |= GAMMA_NEW_WINDOW | GAMMA_NEW_CLIP; - } - - gmesa->numClipRects = dPriv->numClipRects; - gmesa->pClipRects = dPriv->pClipRects; - -#if 0 - gmesa->dirty = ~0; - - if ( sarea->ctxOwner != gmesa->hHWContext ) { - sarea->ctxOwner = gmesa->hHWContext; - gmesa->dirty = GAMMA_UPLOAD_ALL; - } - - for ( i = 0 ; i < gmesa->lastTexHeap ; i++ ) { - if ( sarea->texAge[i] != gmesa->lastTexAge[i] ) { - gammaAgeTextures( gmesa, i ); - } - } -#endif -} diff --git a/src/mesa/drivers/dri/gamma/gamma_lock.h b/src/mesa/drivers/dri/gamma/gamma_lock.h deleted file mode 100644 index 2d117320da2..00000000000 --- a/src/mesa/drivers/dri/gamma/gamma_lock.h +++ /dev/null @@ -1,84 +0,0 @@ -#ifndef __GAMMA_LOCK_H__ -#define __GAMMA_LOCK_H__ - -extern void gammaGetLock( gammaContextPtr gmesa, GLuint flags ); - -/* Turn DEBUG_LOCKING on to find locking conflicts. - */ -#define DEBUG_LOCKING 0 - -#if DEBUG_LOCKING -extern char *prevLockFile; -extern int prevLockLine; - -#define DEBUG_LOCK() \ - do { \ - prevLockFile = (__FILE__); \ - prevLockLine = (__LINE__); \ - } while (0) - -#define DEBUG_RESET() \ - do { \ - prevLockFile = 0; \ - prevLockLine = 0; \ - } while (0) - -#define DEBUG_CHECK_LOCK() \ - do { \ - if ( prevLockFile ) { \ - fprintf( stderr, \ - "LOCK SET!\n\tPrevious %s:%d\n\tCurrent: %s:%d\n", \ - prevLockFile, prevLockLine, __FILE__, __LINE__ ); \ - exit( 1 ); \ - } \ - } while (0) - -#else - -#define DEBUG_LOCK() -#define DEBUG_RESET() -#define DEBUG_CHECK_LOCK() - -#endif - -/* - * !!! We may want to separate locks from locks with validation. This - * could be used to improve performance for those things commands that - * do not do any drawing !!! - */ - -/* Lock the hardware and validate our state. - */ -#define LOCK_HARDWARE( gmesa ) \ - do { \ - char __ret = 0; \ - DEBUG_CHECK_LOCK(); \ - DRM_CAS( gmesa->driHwLock, gmesa->hHWContext, \ - (DRM_LOCK_HELD | gmesa->hHWContext), __ret ); \ - if ( __ret ) \ - gammaGetLock( gmesa, 0 ); \ - DEBUG_LOCK(); \ - } while (0) - -/* Unlock the hardware. - */ -#define UNLOCK_HARDWARE( gmesa ) \ - do { \ - DRM_UNLOCK( gmesa->driFd, \ - gmesa->driHwLock, \ - gmesa->hHWContext ); \ - DEBUG_RESET(); \ - } while (0) - -#define GAMMAHW_LOCK( gmesa ) \ - DRM_UNLOCK(gmesa->driFd, gmesa->driHwLock, gmesa->hHWContext); \ - DRM_SPINLOCK(&gmesa->driScreen->pSAREA->drawable_lock, \ - gmesa->driScreen->drawLockID); \ - VALIDATE_DRAWABLE_INFO_NO_LOCK(gmesa); - -#define GAMMAHW_UNLOCK( gmesa ) \ - DRM_SPINUNLOCK(&gmesa->driScreen->pSAREA->drawable_lock, \ - gmesa->driScreen->drawLockID); \ - VALIDATE_DRAWABLE_INFO_NO_LOCK_POST(gmesa); - -#endif /* __GAMMA_LOCK_H__ */ diff --git a/src/mesa/drivers/dri/gamma/gamma_macros.h b/src/mesa/drivers/dri/gamma/gamma_macros.h deleted file mode 100644 index d962dcdb566..00000000000 --- a/src/mesa/drivers/dri/gamma/gamma_macros.h +++ /dev/null @@ -1,323 +0,0 @@ -/************************************************************************** - -Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. -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 PRECISION INSIGHT 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: - * Kevin E. Martin <[email protected]> - * - */ - -#ifndef _GAMMA_MACROS_H_ -#define _GAMMA_MACROS_H_ - -#define DEBUG_DRMDMA -#define DEBUG_ERRORS -#define DEBUG_COMMANDS_NOT -#define DEBUG_VERBOSE_NOT -#define DEBUG_VERBOSE_EXTRA_NOT - -#define RANDOMIZE_COLORS_NOT -#define TURN_OFF_CLEARS_NOT -#define CULL_ALL_PRIMS_NOT -#define TURN_OFF_DEPTH_NOT -#define TURN_OFF_BLEND_NOT -#define FAST_CLEAR_4_NOT -#define FORCE_DEPTH32_NOT -#define DONT_SEND_DMA_NOT -#define TURN_OFF_FCP_NOT -#define TURN_OFF_TEXTURES_NOT -#define DO_VALIDATE - -#define GAMMA_DMA_BUFFER_SIZE 4096 - -#if 0 -#define GAMMA_DMA_SEND_FLAGS DRM_DMA_PRIORITY -#define GAMMA_DMA_SEND_FLAGS DRM_DMA_BLOCK -#else -/* MUST use non-blocking dma flags for drawable lock routines */ -#define GAMMA_DMA_SEND_FLAGS 0 -#endif - -#if 0 -#define GAMMA_DMA_GET_FLAGS \ - (DRM_DMA_SMALLER_OK | DRM_DMA_LARGER_OK | DRM_DMA_WAIT) -#else -#define GAMMA_DMA_GET_FLAGS DRM_DMA_WAIT -#endif - -#if defined(DEBUG_DRMDMA) || defined(DEBUG_COMMANDS) || defined(DEBUG_VERBOSE) -#include <stdio.h> -#endif - -/* Note: The argument to DEBUG_GLCMDS() _must_ be enclosed in parenthesis */ -#ifdef DEBUG_VERBOSE -#define DEBUG_GLCMDS(s) printf s -#else -#define DEBUG_GLCMDS(s) -#endif - -/* Note: The argument to DEBUG_DMACMDS() _must_ be enclosed in parenthesis */ -#ifdef DEBUG_DRMDMA -#define DEBUG_DMACMDS(s) printf s -#else -#define DEBUG_DMACMDS(s) -#endif - -/* Note: The argument to DEBUG_WRITE() _must_ be enclosed in parenthesis */ -#ifdef DEBUG_COMMANDS -#define DEBUG_WRITE(s) printf s -#else -#define DEBUG_WRITE(s) -#endif - -/* Note: The argument to DEBUG_ERROR() _must_ be enclosed in parenthesis */ -#ifdef DEBUG_ERRORS -#define DEBUG_ERROR(s) printf s -#else -#define DEBUG_ERROR(s) -#endif - -#define WRITEV(buf,val1,val2,val3,val4) \ -do { \ - buf++->i = 0x9C008300; \ - buf++->f = val1; \ - buf++->f = val2; \ - buf++->f = val3; \ - buf++->f = val4; \ -} while (0) - -#define WRITE(buf,reg,val) \ -do { \ - buf++->i = Glint##reg##Tag; \ - buf++->i = val; \ - DEBUG_WRITE(("WRITE(buf, %s, 0x%08x);\n", #reg, (int)val)); \ -} while (0) - -#define WRITEF(buf,reg,val) \ -do { \ - buf++->i = Glint##reg##Tag; \ - buf++->f = val; \ - DEBUG_WRITE(("WRITEF(buf, %s, %f);\n", #reg, (float)val)); \ -} while (0) - -#define CHECK_WC_DMA_BUFFER(gcp,n) \ -do { \ - (gcp)->WCbufCount += (n<<1); \ -} while (0) - -#define CHECK_DMA_BUFFER(gcp,n) \ -do { \ - if ((gcp)->bufCount+(n<<1) >= (gcp)->bufSize) \ - PROCESS_DMA_BUFFER(gcp); \ - (gcp)->bufCount += (n<<1); \ -} while (0) - -#define CHECK_DMA_BUFFER2(gcp,n) \ -do { \ - if ((gcp)->bufCount+n >= (gcp)->bufSize) \ - PROCESS_DMA_BUFFER(gcp); \ - (gcp)->bufCount += n; \ -} while (0) - -#define FLUSH_DMA_BUFFER(gcp) \ -do { \ - if (gcp->bufCount) \ - PROCESS_DMA_BUFFER(gcp); \ -} while (0) - -#ifdef DONT_SEND_DMA -#define GET_DMA(fd, hHWCtx, n, idx, size) -#define SEND_DMA(fd, hHWCtx,n, idx, cnt) -#else -#define GET_DMA(fd, hHWCtx, n, idx, size) \ -do { \ - drmDMAReq dma; \ - int retcode, i; \ - \ - dma.context = (hHWCtx); \ - dma.send_count = 0; \ - dma.send_list = NULL; \ - dma.send_sizes = NULL; \ - dma.flags = GAMMA_DMA_GET_FLAGS; \ - dma.request_count = (n); \ - dma.request_size = GAMMA_DMA_BUFFER_SIZE; \ - dma.request_list = (idx); \ - dma.request_sizes = (size); \ - \ - do { \ - if ((retcode = drmDMA((fd), &dma))) { \ - DEBUG_DMACMDS(("drmDMA returned %d\n", retcode)); \ - } \ - } while (!(dma).granted_count); \ - \ - for (i = 0; i < (n); i++) { \ - (size)[i] >>= 2; /* Convert from bytes to words */ \ - } \ -} while (0) - -#define SEND_DMA(fd, hHWCtx, n, idx, cnt) \ -do { \ - drmDMAReq dma; \ - int retcode, i; \ - \ - for (i = 0; i < (n); i++) { \ - (cnt)[i] <<= 2; /* Convert from words to bytes */ \ - } \ - \ - dma.context = (hHWCtx); \ - dma.send_count = 1; \ - dma.send_list = (idx); \ - dma.send_sizes = (cnt); \ - dma.flags = GAMMA_DMA_SEND_FLAGS; \ - dma.request_count = 0; \ - dma.request_size = 0; \ - dma.request_list = NULL; \ - dma.request_sizes = NULL; \ - \ - if ((retcode = drmDMA((fd), &dma))) { \ - DEBUG_DMACMDS(("drmDMA returned %d\n", retcode)); \ - } \ - \ - for (i = 0; i < (n); i++) { \ - (cnt)[i] = 0; \ - } \ -} while (0) -#endif - -#define GET_FIRST_DMA(fd, hHWCtx, n, idx, size, buf, cnt, gPriv) \ -do { \ - int i; \ - \ - GET_DMA(fd, hHWCtx, n, idx, size); \ - \ - for (i = 0; i < (n); i++) { \ - (buf)[i] = (dmaBuf)(gPriv)->bufs->list[(idx)[i]].address; \ - (cnt)[i] = 0; \ - } \ -} while (0) - -#define PROCESS_DMA_BUFFER_TOP_HALF(gcp) \ -do { \ - SEND_DMA((gcp)->driFd, \ - (gcp)->hHWContext, 1, &(gcp)->bufIndex, &(gcp)->bufCount); \ -} while (0) - -#define PROCESS_DMA_BUFFER_BOTTOM_HALF(gcp) \ -do { \ - GET_DMA((gcp)->driFd, \ - (gcp)->hHWContext, 1, &(gcp)->bufIndex, &(gcp)->bufSize); \ - \ - (gcp)->buf = \ - (dmaBuf)(gcp)->gammaScreen->bufs->list[(gcp)->bufIndex].address; \ -} while (0) - -#define PROCESS_DMA_BUFFER(gcp) \ -do { \ - VALIDATE_DRAWABLE_INFO(gcp); \ - PROCESS_DMA_BUFFER_TOP_HALF(gcp); \ - PROCESS_DMA_BUFFER_BOTTOM_HALF(gcp); \ -} while (0) - -#ifdef DO_VALIDATE -#define VALIDATE_DRAWABLE_INFO_NO_LOCK(gcp) \ -do { \ - /*__DRIscreen *psp = gcp->driScreen;*/ \ - __DRIdrawable *pdp = gcp->driDrawable; \ - \ - if (*(pdp->pStamp) != pdp->lastStamp) { \ - int old_index = pdp->index; \ - while (*(pdp->pStamp) != pdp->lastStamp) { \ - DRI_VALIDATE_DRAWABLE_INFO_ONCE(pdp); \ - } \ - if (pdp->index != old_index) { \ - gcp->Window &= ~W_GIDMask; \ - gcp->Window |= (pdp->index << 5); \ - CHECK_WC_DMA_BUFFER(gcp, 1); \ - WRITE(gcp->WCbuf, GLINTWindow, gcp->Window|(gcp->FrameCount<<9));\ - } \ - \ - gammaUpdateViewportOffset( gcp->glCtx); \ - \ - if (pdp->numClipRects == 1 && \ - pdp->pClipRects->x1 == pdp->x && \ - pdp->pClipRects->x2 == (pdp->x+pdp->w) && \ - pdp->pClipRects->y1 == pdp->y && \ - pdp->pClipRects->y2 == (pdp->y+pdp->h)) { \ - CHECK_WC_DMA_BUFFER(gcp, 1); \ - WRITE(gcp->WCbuf, Rectangle2DControl, 0); \ - gcp->NotClipped = GL_TRUE; \ - } else { \ - CHECK_WC_DMA_BUFFER(gcp, 1); \ - WRITE(gcp->WCbuf, Rectangle2DControl, 1); \ - gcp->NotClipped = GL_FALSE; \ - } \ - gcp->WindowChanged = GL_TRUE; \ - \ - if (gcp->WCbufCount) { \ - SEND_DMA((gcp)->gammaScreen->driScreen->fd, \ - (gcp)->hHWContext, 1, &(gcp)->WCbufIndex, \ - &(gcp)->WCbufCount); \ - (gcp)->WCbufIndex = -1; \ - } \ - } \ -} while (0) - -#define VALIDATE_DRAWABLE_INFO_NO_LOCK_POST(gcp) \ -do { \ - if ((gcp)->WCbufIndex < 0) { \ - GET_DMA((gcp)->gammaScreen->driScreen->fd, \ - (gcp)->hHWContext, 1, &(gcp)->WCbufIndex, \ - &(gcp)->WCbufSize); \ - \ - (gcp)->WCbuf = \ - (dmaBuf)(gcp)->gammaScreen->bufs-> \ - list[(gcp)->WCbufIndex].address; \ - } \ -} while (0) - -#define VALIDATE_DRAWABLE_INFO(gcp) \ -do { \ - __DRIscreen *psp = gcp->driScreen; \ -if (gcp->driDrawable) { \ - DRM_SPINLOCK(&psp->pSAREA->drawable_lock, psp->drawLockID); \ - VALIDATE_DRAWABLE_INFO_NO_LOCK(gcp); \ - DRM_SPINUNLOCK(&psp->pSAREA->drawable_lock, psp->drawLockID); \ - VALIDATE_DRAWABLE_INFO_NO_LOCK_POST(gcp); \ -} \ -} while (0) -#else -#define VALIDATE_DRAWABLE_INFO(gcp) -#endif - -#define CALC_LOG2(l2,s) \ -do { \ - int __s = s; \ - l2 = 0; \ - while (__s > 1) { ++l2; __s >>= 1; } \ -} while (0) - -#endif /* _GAMMA_MACROS_H_ */ diff --git a/src/mesa/drivers/dri/gamma/gamma_regs.h b/src/mesa/drivers/dri/gamma/gamma_regs.h deleted file mode 100644 index 9e1c735019d..00000000000 --- a/src/mesa/drivers/dri/gamma/gamma_regs.h +++ /dev/null @@ -1,658 +0,0 @@ -/************************************************************************** - -Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. -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 PRECISION INSIGHT 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: - * Kevin E. Martin <[email protected]> - * - */ - -#ifndef _GAMMA_REGS_H_ -#define _GAMMA_REGS_H_ - -#include "gamma_client.h" - -/**************** MX FLAGS ****************/ -/* FBReadMode */ -#define FBReadSrcDisable 0x00000000 -#define FBReadSrcEnable 0x00000200 -#define FBReadDstDisable 0x00000000 -#define FBReadDstEnable 0x00000400 -#define FBDataTypeDefault 0x00000000 -#define FBDataTypeColor 0x00008000 -#define FBWindowOriginTop 0x00000000 -#define FBWindowOriginBot 0x00010000 -#define FBScanLineInt1 0x00000000 -#define FBScanLineInt2 0x00800000 -#define FBScanLineInt4 0x01000000 -#define FBScanLineInt8 0x01800000 -#define FBSrcAddrConst 0x00000000 -#define FBSrcAddrIndex 0x10000000 -#define FBSrcAddrCoord 0x20000000 - -/* LBReadMode */ -#define LBPartialProdMask 0x000001ff -#define LBReadSrcDisable 0x00000000 -#define LBReadSrcEnable 0x00000200 -#define LBReadDstDisable 0x00000000 -#define LBReadDstEnable 0x00000400 -#define LBDataTypeDefault 0x00000000 -#define LBDataTypeStencil 0x00010000 -#define LBDataTypeDepth 0x00020000 -#define LBWindowOriginTop 0x00000000 -#define LBWindowOriginBot 0x00040000 -#define LBScanLineInt1 0x00000000 -#define LBScanLineInt2 0x00100000 -#define LBScanLineInt4 0x00200000 -#define LBScanLineInt8 0x00300000 - -/* ColorDDAMode */ -#define ColorDDADisable 0x00000000 -#define ColorDDAEnable 0x00000001 -#define ColorDDAFlat 0x00000000 -#define ColorDDAGouraud 0x00000002 -#define ColorDDAShadingMask 0x00000002 - -/* AlphaTestMode */ -#define AlphaTestModeDisable 0x00000000 -#define AlphaTestModeEnable 0x00000001 -#define AT_Never 0x00000000 -#define AT_Less 0x00000002 -#define AT_Equal 0x00000004 -#define AT_LessEqual 0x00000006 -#define AT_Greater 0x00000008 -#define AT_NotEqual 0x0000000a -#define AT_GreaterEqual 0x0000000c -#define AT_Always 0x0000000e -#define AT_CompareMask 0x0000000e -#define AT_RefValueMask 0x00000ff0 - -/* AlphaBlendMode */ -#define AlphaBlendModeDisable 0x00000000 -#define AlphaBlendModeEnable 0x00000001 -#define AB_Src_Zero 0x00000000 -#define AB_Src_One 0x00000002 -#define AB_Src_DstColor 0x00000004 -#define AB_Src_OneMinusDstColor 0x00000006 -#define AB_Src_SrcAlpha 0x00000008 -#define AB_Src_OneMinusSrcAlpha 0x0000000a -#define AB_Src_DstAlpha 0x0000000c -#define AB_Src_OneMinusDstAlpha 0x0000000e -#define AB_Src_SrcAlphaSaturate 0x00000010 -#define AB_SrcBlendMask 0x0000001e -#define AB_Dst_Zero 0x00000000 -#define AB_Dst_One 0x00000020 -#define AB_Dst_SrcColor 0x00000040 -#define AB_Dst_OneMinusSrcColor 0x00000060 -#define AB_Dst_SrcAlpha 0x00000080 -#define AB_Dst_OneMinusSrcAlpha 0x000000a0 -#define AB_Dst_DstAlpha 0x000000c0 -#define AB_Dst_OneMinusDstAlpha 0x000000e0 -#define AB_DstBlendMask 0x000000e0 -#define AB_ColorFmt_8888 0x00000000 -#define AB_ColorFmt_5555 0x00000100 -#define AB_ColorFmt_4444 0x00000200 -#define AB_ColorFmt_4444Front 0x00000300 -#define AB_ColorFmt_4444Back 0x00000400 -#define AB_ColorFmt_332Front 0x00000500 -#define AB_ColorFmt_332Back 0x00000600 -#define AB_ColorFmt_121Front 0x00000700 -#define AB_ColorFmt_121Back 0x00000800 -#define AB_ColorFmt_555Back 0x00000d00 -#define AB_ColorFmt_CI8 0x00000e00 -#define AB_ColorFmt_CI4 0x00000f00 -#define AB_AlphaBufferPresent 0x00000000 -#define AB_NoAlphaBufferPresent 0x00001000 -#define AB_ColorOrder_BGR 0x00000000 -#define AB_ColorOrder_RGB 0x00002000 -#define AB_OpenGLType 0x00000000 -#define AB_QuickDraw3DType 0x00004000 -#define AB_AlphaDst_FBData 0x00000000 -#define AB_AlphaDst_FBSourceData 0x00008000 -#define AB_ColorConversionScale 0x00000000 -#define AB_ColorConversionShift 0x00010000 -#define AB_AlphaConversionScale 0x00000000 -#define AB_AlphaConversionShift 0x00020000 - -/* AntialiasMode */ -#define AntialiasModeDisable 0x00000000 -#define AntialiasModeEnable 0x00000001 - -/* AreaStippleMode */ -#define AreaStippleModeDisable 0x00000000 -#define AreaStippleModeEnable 0x00000001 -#define ASM_X32 0x00000008 -#define ASM_Y32 0x00000040 - -/* DepthMode */ -#define DepthModeDisable 0x00000000 -#define DepthModeEnable 0x00000001 -#define DM_WriteMask 0x00000002 -#define DM_SourceFragment 0x00000000 -#define DM_SourceLBData 0x00000004 -#define DM_SourceDepthRegister 0x00000008 -#define DM_SourceLBSourceData 0x0000000c -#define DM_SourceMask 0x0000000c -#define DM_Never 0x00000000 -#define DM_Less 0x00000010 -#define DM_Equal 0x00000020 -#define DM_LessEqual 0x00000030 -#define DM_Greater 0x00000040 -#define DM_NotEqual 0x00000050 -#define DM_GreaterEqual 0x00000060 -#define DM_Always 0x00000070 -#define DM_CompareMask 0x00000070 - -/* FBWriteMode */ -#define FBWriteModeDisable 0x00000000 -#define FBWriteModeEnable 0x00000001 -#define FBW_UploadColorData 0x00000008 - -/* FogMode */ -#define FogModeDisable 0x00000000 -#define FogModeEnable 0x00000001 - -/* LBWriteMode */ -#define LBWriteModeDisable 0x00000000 -#define LBWriteModeEnable 0x00000001 -#define LBW_UploadNone 0x00000000 -#define LBW_UploadDepth 0x00000002 -#define LBW_UploadStencil 0x00000004 - -/* LBRead/Write Format */ -#define LBRF_DepthWidth15 0x03 /* only permedia */ -#define LBRF_DepthWidth16 0x00 -#define LBRF_DepthWidth24 0x01 -#define LBRF_DepthWidth32 0x02 -#define LBRF_StencilWidth0 (0 << 2) -#define LBRF_StencilWidth4 (1 << 2) -#define LBRF_StencilWidth8 (2 << 2) -#define LBRF_StencilPos16 (0 << 4) -#define LBRF_StencilPos20 (1 << 4) -#define LBRF_StencilPos24 (2 << 4) -#define LBRF_StencilPos28 (3 << 4) -#define LBRF_StencilPos32 (4 << 4) -#define LBRF_FrameCount0 (0 << 7) -#define LBRF_FrameCount4 (1 << 7) -#define LBRF_FrameCount8 (2 << 7) -#define LBRF_FrameCountPos16 (0 << 9) -#define LBRF_FrameCountPos20 (1 << 9) -#define LBRF_FrameCountPos24 (2 << 9) -#define LBRF_FrameCountPos28 (3 << 9) -#define LBRF_FrameCountPos32 (4 << 9) -#define LBRF_FrameCountPos36 (5 << 9) -#define LBRF_FrameCountPos40 (6 << 9) -#define LBRF_GIDWidth0 (0 << 12) -#define LBRF_GIDWidth4 (1 << 12) -#define LBRF_GIDPos16 (0 << 13) -#define LBRF_GIDPos20 (1 << 13) -#define LBRF_GIDPos24 (2 << 13) -#define LBRF_GIDPos28 (3 << 13) -#define LBRF_GIDPos32 (4 << 13) -#define LBRF_GIDPos36 (5 << 13) -#define LBRF_GIDPos40 (6 << 13) -#define LBRF_GIDPos44 (7 << 13) -#define LBRF_GIDPos48 (8 << 13) -#define LBRF_Compact32 (1 << 17) - -/* StencilMode */ -#define StencilDisable 0x00000000 -#define StencilEnable 0x00000001 - -/* RouterMode */ -#define R_Order_TextureDepth 0x00000000 -#define R_Order_DepthTexture 0x00000001 - -/* ScissorMode */ -#define UserScissorDisable 0x00000000 -#define UserScissorEnable 0x00000001 -#define ScreenScissorDisable 0x00000000 -#define ScreenScissorEnable 0x00000002 - -/* DitherMode */ -#define DitherModeDisable 0x00000000 -#define DitherModeEnable 0x00000001 -#define DM_DitherDisable 0x00000000 -#define DM_DitherEnable 0x00000002 -#define DM_ColorFmt_8888 0x00000000 -#define DM_ColorFmt_5555 0x00000004 -#define DM_ColorFmt_4444 0x00000008 -#define DM_ColorFmt_4444Front 0x0000000c -#define DM_ColorFmt_4444Back 0x00000010 -#define DM_ColorFmt_332Front 0x00000014 -#define DM_ColorFmt_332Back 0x00000018 -#define DM_ColorFmt_121Front 0x0000001c -#define DM_ColorFmt_121Back 0x00000020 -#define DM_ColorFmt_555Back 0x00000024 -#define DM_ColorFmt_CI8 0x00000028 -#define DM_ColorFmt_CI4 0x0000002c -#define DM_XOffsetMask 0x000000c0 -#define DM_YOffsetMask 0x00000300 -#define DM_ColorOrder_BGR 0x00000000 -#define DM_ColorOrder_RGB 0x00000400 -#define DM_AlphaDitherDefault 0x00000000 -#define DM_AlphaDitherNone 0x00004000 -#define DM_Truncate 0x00000000 -#define DM_Round 0x00008000 - -/* RasterizerMode */ -#define RM_MirrorBitMask 0x00000001 -#define RM_InvertBitMask 0x00000002 -#define RM_FractionAdjNo 0x00000000 -#define RM_FractionAdjZero 0x00000004 -#define RM_FractionAdjHalf 0x00000008 -#define RM_FractionAdjNearHalf 0x0000000c -#define RM_BiasCoordZero 0x00000000 -#define RM_BiasCoordHalf 0x00000010 -#define RM_BiasCoordNearHalf 0x00000020 -#define RM_BitMaskByteSwap_ABCD 0x00000000 -#define RM_BitMaskByteSwap_BADC 0x00000080 -#define RM_BitMaskByteSwap_CDAB 0x00000100 -#define RM_BitMaskByteSwap_DCBA 0x00000180 -#define RM_BitMaskPacked 0x00000000 -#define RM_BitMaskEveryScanline 0x00000200 -#define RM_BitMaskOffsetMask 0x00007c00 -#define RM_HostDataByteSwap_ABCD 0x00000000 -#define RM_HostDataByteSwap_BADC 0x00008000 -#define RM_HostDataByteSwap_CDAB 0x00010000 -#define RM_HostDataByteSwap_DCBA 0x00018000 -#define RM_SingleGLINT 0x00000000 -#define RM_MultiGLINT 0x00020000 -#define RM_YLimitsEnable 0x00040000 - -/* Window */ -#define WindowDisable 0x00000000 -#define WindowEnable 0x00000001 -#define W_AlwaysPass 0x00000000 -#define W_NeverPass 0x00000002 -#define W_PassIfEqual 0x00000004 -#define W_PassIfNotEqual 0x00000006 -#define W_CompareMask 0x00000006 -#define W_ForceLBUpdate 0x00000008 -#define W_LBUpdateFromSource 0x00000000 -#define W_LBUpdateFromRegisters 0x00000010 -#define W_GIDMask 0x000001e0 -#define W_FrameCountMask 0x0001fe00 -#define W_StencilFCP 0x00020000 -#define W_DepthFCP 0x00040000 -#define W_OverrideWriteFiltering 0x00080000 - -/* TextureAddressMode */ -#define TextureAddressModeDisable 0x00000000 -#define TextureAddressModeEnable 0x00000001 -#define TAM_SWrap_Clamp 0x00000000 -#define TAM_SWrap_Repeat 0x00000002 -#define TAM_SWrap_Mirror 0x00000004 -#define TAM_SWrap_Mask 0x00000006 -#define TAM_TWrap_Clamp 0x00000000 -#define TAM_TWrap_Repeat 0x00000008 -#define TAM_TWrap_Mirror 0x00000010 -#define TAM_TWrap_Mask 0x00000018 -#define TAM_Operation_2D 0x00000000 -#define TAM_Operation_3D 0x00000020 -#define TAM_InhibitDDAInit 0x00000040 -#define TAM_LODDisable 0x00000000 -#define TAM_LODEnable 0x00000080 -#define TAM_DY_Disable 0x00000000 -#define TAM_DY_Enable 0x00000100 -#define TAM_WidthMask 0x00001e00 -#define TAM_HeightMask 0x0001e000 -#define TAM_TexMapType_1D 0x00000000 -#define TAM_TexMapType_2D 0x00020000 -#define TAM_TexMapType_Mask 0x00020000 - -/* TextureReadMode */ -#define TextureReadModeDisable 0x00000000 -#define TextureReadModeEnable 0x00000001 -#define TRM_WidthMask 0x0000001e -#define TRM_HeightMask 0x000001e0 -#define TRM_Depth1 0x00000000 -#define TRM_Depth2 0x00000200 -#define TRM_Depth4 0x00000400 -#define TRM_Depth8 0x00000600 -#define TRM_Depth16 0x00000800 -#define TRM_Depth32 0x00000a00 -#define TRM_DepthMask 0x00000e00 -#define TRM_Border 0x00001000 -#define TRM_Patch 0x00002000 -#define TRM_Mag_Nearest 0x00000000 -#define TRM_Mag_Linear 0x00004000 -#define TRM_Mag_Mask 0x00004000 -#define TRM_Min_Nearest 0x00000000 -#define TRM_Min_Linear 0x00008000 -#define TRM_Min_NearestMMNearest 0x00010000 -#define TRM_Min_NearestMMLinear 0x00018000 -#define TRM_Min_LinearMMNearest 0x00020000 -#define TRM_Min_LinearMMLinear 0x00028000 -#define TRM_Min_Mask 0x00038000 -#define TRM_UWrap_Clamp 0x00000000 -#define TRM_UWrap_Repeat 0x00040000 -#define TRM_UWrap_Mirror 0x00080000 -#define TRM_UWrap_Mask 0x000c0000 -#define TRM_VWrap_Clamp 0x00000000 -#define TRM_VWrap_Repeat 0x00100000 -#define TRM_VWrap_Mirror 0x00200000 -#define TRM_VWrap_Mask 0x00300000 -#define TRM_TexMapType_1D 0x00000000 -#define TRM_TexMapType_2D 0x00400000 -#define TRM_TexMapType_Mask 0x00400000 -#define TRM_MipMapDisable 0x00000000 -#define TRM_MipMapEnable 0x00800000 -#define TRM_PrimaryCacheDisable 0x00000000 -#define TRM_PrimaryCacheEnable 0x01000000 -#define TRM_FBSourceAddr_None 0x00000000 -#define TRM_FBSourceAddr_Index 0x02000000 -#define TRM_FBSourceAddr_Coord 0x04000000 -#define TRM_BorderClamp 0x08000000 - -/* TextureColorMode */ -#define TextureColorModeDisable 0x00000000 -#define TextureColorModeEnable 0x00000001 -#define TCM_Modulate 0x00000000 -#define TCM_Decal 0x00000002 -#define TCM_Blend 0x00000004 -#define TCM_Replace 0x00000006 -#define TCM_ApplicationMask 0x0000000e -#define TCM_OpenGLType 0x00000000 -#define TCM_QuickDraw3DType 0x00000010 -#define TCM_KdDDA_Disable 0x00000000 -#define TCM_KdDDA_Enable 0x00000020 -#define TCM_KsDDA_Disable 0x00000000 -#define TCM_KsDDA_Enable 0x00000040 -#define TCM_BaseFormat_Alpha 0x00000000 -#define TCM_BaseFormat_Lum 0x00000080 -#define TCM_BaseFormat_LumAlpha 0x00000100 -#define TCM_BaseFormat_Intensity 0x00000180 -#define TCM_BaseFormat_RGB 0x00000200 -#define TCM_BaseFormat_RGBA 0x00000280 -#define TCM_BaseFormatMask 0x00000380 -#define TCM_LoadMode_None 0x00000000 -#define TCM_LoadMode_Ks 0x00000400 -#define TCM_LoadMode_Kd 0x00000800 - -/* TextureCacheControl */ -#define TCC_Invalidate 0x00000001 -#define TCC_Disable 0x00000000 -#define TCC_Enable 0x00000002 - -/* TextureFilterMode */ -#define TextureFilterModeDisable 0x00000000 -#define TextureFilterModeEnable 0x00000001 -#define TFM_AlphaMapEnable 0x00000002 -#define TFM_AlphaMapSense 0x00000004 - -/* TextureFormat */ -#define TF_LittleEndian 0x00000000 -#define TF_BigEndian 0x00000001 -#define TF_16Bit_565 0x00000000 -#define TF_16Bit_555 0x00000002 -#define TF_ColorOrder_BGR 0x00000000 -#define TF_ColorOrder_RGB 0x00000004 -#define TF_Compnents_1 0x00000000 -#define TF_Compnents_2 0x00000008 -#define TF_Compnents_3 0x00000010 -#define TF_Compnents_4 0x00000018 -#define TF_CompnentsMask 0x00000018 -#define TF_OutputFmt_Texel 0x00000000 -#define TF_OutputFmt_Color 0x00000020 -#define TF_OutputFmt_BitMask 0x00000040 -#define TF_OutputFmtMask 0x00000060 -#define TF_MirrorEnable 0x00000080 -#define TF_InvertEnable 0x00000100 -#define TF_ByteSwapEnable 0x00000200 -#define TF_LUTOffsetMask 0x0003fc00 -#define TF_OneCompFmt_Lum 0x00000000 -#define TF_OneCompFmt_Alpha 0x00040000 -#define TF_OneCompFmt_Intensity 0x00080000 -#define TF_OneCompFmt_Mask 0x000c0000 -/**************** MX FLAGS ****************/ - -/************** GAMMA FLAGS ***************/ -/* GeometryMode */ -#define GM_TextureDisable 0x00000000 -#define GM_TextureEnable 0x00000001 -#define GM_FogDisable 0x00000000 -#define GM_FogEnable 0x00000002 -#define GM_FogLinear 0x00000000 -#define GM_FogExp 0x00000004 -#define GM_FogExpSquared 0x00000008 -#define GM_FogMask 0x0000000C -#define GM_FrontPolyPoint 0x00000000 -#define GM_FrontPolyLine 0x00000010 -#define GM_FrontPolyFill 0x00000020 -#define GM_BackPolyPoint 0x00000000 -#define GM_BackPolyLine 0x00000040 -#define GM_BackPolyFill 0x00000080 -#define GM_FB_PolyMask 0x000000F0 -#define GM_FrontFaceCW 0x00000000 -#define GM_FrontFaceCCW 0x00000100 -#define GM_FFMask 0x00000100 -#define GM_PolyCullDisable 0x00000000 -#define GM_PolyCullEnable 0x00000200 -#define GM_PolyCullFront 0x00000000 -#define GM_PolyCullBack 0x00000400 -#define GM_PolyCullBoth 0x00000800 -#define GM_PolyCullMask 0x00000c00 -#define GM_ClipShortLinesDisable 0x00000000 -#define GM_ClipShortLinesEnable 0x00001000 -#define GM_ClipSmallTrisDisable 0x00000000 -#define GM_ClipSmallTrisEnable 0x00002000 -#define GM_RenderMode 0x00000000 -#define GM_SelectMode 0x00004000 -#define GM_FeedbackMode 0x00008000 -#define GM_Feedback2D 0x00000000 -#define GM_Feedback3D 0x00010000 -#define GM_Feedback3DColor 0x00020000 -#define GM_Feedback3DColorTexture 0x00030000 -#define GM_Feedback4DColorTexture 0x00040000 -#define GM_CullFaceNormDisable 0x00000000 -#define GM_CullFaceNormEnable 0x00080000 -#define GM_AutoFaceNormDisable 0x00000000 -#define GM_AutoFaceNormEnable 0x00100000 -#define GM_GouraudShading 0x00000000 -#define GM_FlatShading 0x00200000 -#define GM_ShadingMask 0x00200000 -#define GM_UserClipNone 0x00000000 -#define GM_UserClip0 0x00400000 -#define GM_UserClip1 0x00800000 -#define GM_UserClip2 0x01000000 -#define GM_UserClip3 0x02000000 -#define GM_UserClip4 0x04000000 -#define GM_UserClip5 0x08000000 -#define GM_PolyOffsetPointDisable 0x00000000 -#define GM_PolyOffsetPointEnable 0x10000000 -#define GM_PolyOffsetLineDisable 0x00000000 -#define GM_PolyOffsetLineEnable 0x20000000 -#define GM_PolyOffsetFillDisable 0x00000000 -#define GM_PolyOffsetFillEnable 0x40000000 -#define GM_InvertFaceNormCullDisable 0x00000000 -#define GM_InvertFaceNormCullEnable 0x80000000 - -/* Begin */ -#define B_AreaStippleDisable 0x00000000 -#define B_AreaStippleEnable 0x00000001 -#define B_LineStippleDisable 0x00000000 -#define B_LineStippleEnable 0x00000002 -#define B_AntiAliasDisable 0x00000000 -#define B_AntiAliasEnable 0x00000100 -#define B_TextureDisable 0x00000000 -#define B_TextureEnable 0x00002000 -#define B_FogDisable 0x00000000 -#define B_FogEnable 0x00004000 -#define B_SubPixelCorrectDisable 0x00000000 -#define B_SubPixelCorrectEnable 0x00010000 -#define B_PrimType_Null 0x00000000 -#define B_PrimType_Points 0x10000000 -#define B_PrimType_Lines 0x20000000 -#define B_PrimType_LineLoop 0x30000000 -#define B_PrimType_LineStrip 0x40000000 -#define B_PrimType_Triangles 0x50000000 -#define B_PrimType_TriangleStrip 0x60000000 -#define B_PrimType_TriangleFan 0x70000000 -#define B_PrimType_Quads 0x80000000 -#define B_PrimType_QuadStrip 0x90000000 -#define B_PrimType_Polygon 0xa0000000 -#define B_PrimType_Mask 0xf0000000 - -/* EdgeFlag */ -#define EdgeFlagDisable 0x00000000 -#define EdgeFlagEnable 0x00000001 - -/* NormalizeMode */ -#define NormalizeModeDisable 0x00000000 -#define NormalizeModeEnable 0x00000001 -#define FaceNormalDisable 0x00000000 -#define FaceNormalEnable 0x00000002 -#define InvertAutoFaceNormal 0x00000004 - -/* LightingMode */ -#define LightingModeDisable 0x00000000 -#define LightingModeEnable 0x00000001 -#define LightingModeTwoSides 0x00000004 -#define LightingModeLocalViewer 0x00000008 -#define LightingModeSpecularEnable 0x00008000 - -/* Light0Mode */ -#define Light0ModeDisable 0x00000000 -#define Light0ModeEnable 0x00000001 -#define Light0ModeSpotLight 0x00000002 -#define Light0ModeAttenuation 0x00000004 -#define Light0ModeLocal 0x00000008 - -/* Light0Mode */ -#define Light1ModeDisable 0x00000000 -#define Light1ModeEnable 0x00000001 -#define Light1ModeSpotLight 0x00000002 -#define Light1ModeAttenuation 0x00000004 -#define Light1ModeLocal 0x00000008 - -/* ColorMaterialMode */ -#define ColorMaterialModeDisable 0x00000000 -#define ColorMaterialModeEnable 0x00000001 -#define ColorMaterialModeFront 0x00000000 -#define ColorMaterialModeBack 0x00000002 -#define ColorMaterialModeFrontAndBack 0x00000004 -#define ColorMaterialModeEmission 0x00000000 -#define ColorMaterialModeAmbient 0x00000008 -#define ColorMaterialModeDiffuse 0x00000010 -#define ColorMaterialModeSpecular 0x00000018 -#define ColorMaterialModeAmbAndDiff 0x00000020 -#define ColorMaterialModeMask 0x0000003e - -/* MaterialMode */ -#define MaterialModeDisable 0x00000000 -#define MaterialModeEnable 0x00000001 -#define MaterialModeTwoSides 0x00000080 - -/* DeltaMode */ -#define DM_Target300SX 0x00000000 -#define DM_Target500TXMX 0x00000001 -#define DM_Depth16 0x00000004 -#define DM_Depth24 0x00000008 -#define DM_Depth32 0x0000000c -#define DM_FogEnable 0x00000010 -#define DM_TextureEnable 0x00000020 -#define DM_SmoothShadingEnable 0x00000040 -#define DM_DepthEnable 0x00000080 -#define DM_SpecularEnable 0x00000100 -#define DM_DiffuseEnable 0x00000200 -#define DM_SubPixlCorrectionEnable 0x00000400 -#define DM_DiamondExit 0x00000800 -#define DM_NoDraw 0x00001000 -#define DM_ClampEnable 0x00002000 -#define DM_TextureParameterAsGiven 0x00000000 -#define DM_TextureParameterClamped 0x00004000 -#define DM_TextureParameterNormalized 0x00008000 -#define DM_BiasCoords 0x00080000 -#define DM_ColorDiffuse 0x00100000 -#define DM_ColorSpecular 0x00200000 -#define DM_FlatShadingMethod 0x00400000 - -/* PointMode */ -#define PM_AntialiasDisable 0x00000000 -#define PM_AntialiasEnable 0x00000001 -#define PM_AntialiasQuality_4x4 0x00000000 -#define PM_AntialiasQuality_8x8 0x00000002 - -/* LogicalOpMode */ -#define LogicalOpModeDisable 0x00000000 -#define LogicalOpModeEnable 0x00000001 -#define LogicalOpModeMask 0x0000001e - -/* LineMode */ -#define LM_StippleDisable 0x00000000 -#define LM_StippleEnable 0x00000001 -#define LM_RepeatFactorMask 0x000003fe -#define LM_StippleMask 0x03fffc00 -#define LM_MirrorDisable 0x00000000 -#define LM_MirrorEnable 0x04000000 -#define LM_AntialiasDisable 0x00000000 -#define LM_AntialiasEnable 0x08000000 -#define LM_AntialiasQuality_4x4 0x00000000 -#define LM_AntialiasQuality_8x8 0x10000000 - -/* TriangleMode */ -#define TM_AntialiasDisable 0x00000000 -#define TM_AntialiasEnable 0x00000001 -#define TM_AntialiasQuality_4x4 0x00000000 -#define TM_AntialiasQuality_8x8 0x00000002 -#define TM_UseTriPacketInterface 0x00000004 - -/* TransformMode */ -#define XM_UseModelViewMatrix 0x00000001 -#define XM_UseModelViewProjMatrix 0x00000002 -#define XM_XformNormals 0x00000004 -#define XM_XformFaceNormals 0x00000008 -#define XM_XformTexture 0x00000010 -#define XM_XMask 0x00000013 -#define XM_TexGenModeS_None 0x00000000 -#define XM_TexGenModeS_ObjLinear 0x00000020 -#define XM_TexGenModeS_EyeLinear 0x00000040 -#define XM_TexGenModeS_SphereMap 0x00000060 -#define XM_TexGenModeT_None 0x00000000 -#define XM_TexGenModeT_ObjLinear 0x00000080 -#define XM_TexGenModeT_EyeLinear 0x00000100 -#define XM_TexGenModeT_SphereMap 0x00000180 -#define XM_TexGenModeR_None 0x00000000 -#define XM_TexGenModeR_ObjLinear 0x00000200 -#define XM_TexGenModeR_EyeLinear 0x00000400 -#define XM_TexGenModeR_SphereMap 0x00000600 -#define XM_TexGenModeQ_None 0x00000000 -#define XM_TexGenModeQ_ObjLinear 0x00000800 -#define XM_TexGenModeQ_EyeLinear 0x00001000 -#define XM_TexGenModeQQSphereMap 0x00001800 -#define XM_TexGenS 0x00002000 -#define XM_TexGenT 0x00004000 -#define XM_TexGenR 0x00008000 -#define XM_TexGenQ 0x00010000 - -/* LightNMode */ -#define LNM_Off 0x00000000 -#define LNM_On 0x00000001 -/************** GAMMA FLAGS ***************/ - -#endif /* _GAMMA_REGS_H_ */ diff --git a/src/mesa/drivers/dri/gamma/gamma_render.c b/src/mesa/drivers/dri/gamma/gamma_render.c deleted file mode 100644 index 3c2fa507a97..00000000000 --- a/src/mesa/drivers/dri/gamma/gamma_render.c +++ /dev/null @@ -1,221 +0,0 @@ -/* - * Copyright 2001 by Alan Hourihane. - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that - * copyright notice and this permission notice appear in supporting - * documentation, and that the name of Alan Hourihane not be used in - * advertising or publicity pertaining to distribution of the software without - * specific, written prior permission. Alan Hourihane makes no representations - * about the suitability of this software for any purpose. It is provided - * "as is" without express or implied warranty. - * - * ALAN HOURIHANE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO - * EVENT SHALL ALAN HOURIHANE BE LIABLE FOR ANY SPECIAL, INDIRECT OR - * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - * - * Authors: Alan Hourihane, <[email protected]> - * - * 3DLabs Gamma driver. - * - */ - -#include "main/glheader.h" -#include "main/context.h" -#include "main/macros.h" -#include "main/imports.h" -#include "main/mtypes.h" - -#include "tnl/t_context.h" - -#include "gamma_context.h" -#include "gamma_macros.h" -#include "gamma_tris.h" -#include "gamma_vb.h" - - -/* !! Should template this eventually !! */ - -static void gamma_emit( GLcontext *ctx, GLuint start, GLuint end) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; - GLfloat (*coord)[4]; - GLuint coord_stride; - GLfloat (*col)[4]; - GLuint col_stride; - int i; - GLuint tc0_stride = 0; - GLfloat (*tc0)[4] = 0; - GLuint tc0_size = 0; - - col = VB->AttribPtr[_TNL_ATTRIB_COLOR0]->data; - col_stride = VB->AttribPtr[_TNL_ATTRIB_COLOR0]->stride; - - if (ctx->Texture.Unit[0]._ReallyEnabled) { - tc0_stride = VB->AttribPtr[_TNL_ATTRIB_TEX0]->stride; - tc0 = VB->AttribPtr[_TNL_ATTRIB_TEX0]->data; - tc0_size = VB->AttribPtr[_TNL_ATTRIB_TEX0]->size; - coord = VB->ClipPtr->data; - coord_stride = VB->ClipPtr->stride; - } else { - coord = VB->NdcPtr->data; - coord_stride = VB->NdcPtr->stride; - } - - if (ctx->Texture.Unit[0]._ReallyEnabled && tc0_size == 4) { - for (i=start; i < end; i++) { - CHECK_DMA_BUFFER(gmesa, 9); - WRITEF(gmesa->buf, Tq4, tc0[i][3]); - WRITEF(gmesa->buf, Tr4, tc0[i][2]); - WRITEF(gmesa->buf, Tt4, tc0[i][0]); - WRITEF(gmesa->buf, Ts4, tc0[i][1]); - WRITE(gmesa->buf, PackedColor4, *(uint32_t*)col[i]); - WRITEF(gmesa->buf, Vw, coord[i][3]); - WRITEF(gmesa->buf, Vz, coord[i][2]); - WRITEF(gmesa->buf, Vy, coord[i][1]); - WRITEF(gmesa->buf, Vx4, coord[i][0]); - } - } else if (ctx->Texture.Unit[0]._ReallyEnabled && tc0_size == 2) { - for (i=start; i < end; i++) { - CHECK_DMA_BUFFER(gmesa, 7); - WRITEF(gmesa->buf, Tt2, tc0[i][0]); - WRITEF(gmesa->buf, Ts2, tc0[i][1]); - WRITE(gmesa->buf, PackedColor4, *(uint32_t*)col[i]); - WRITEF(gmesa->buf, Vw, coord[i][3]); - WRITEF(gmesa->buf, Vz, coord[i][2]); - WRITEF(gmesa->buf, Vy, coord[i][1]); - WRITEF(gmesa->buf, Vx4, coord[i][0]); - } - } else { - for (i=start; i < end; i++) { - CHECK_DMA_BUFFER(gmesa, 4); - WRITE(gmesa->buf, PackedColor4, *(uint32_t*)col[i]); - WRITEF(gmesa->buf, Vz, coord[i][2]); - WRITEF(gmesa->buf, Vy, coord[i][1]); - WRITEF(gmesa->buf, Vx3, coord[i][0]); - } - } -} - -#define HAVE_POINTS 1 -#define HAVE_LINES 1 -#define HAVE_LINE_STRIPS 1 -#define HAVE_TRIANGLES 1 -#define HAVE_TRI_STRIPS 1 -#define HAVE_TRI_STRIP_1 0 -#define HAVE_TRI_FANS 1 -#define HAVE_QUADS 1 -#define HAVE_QUAD_STRIPS 1 -#define HAVE_POLYGONS 1 - -#define HAVE_ELTS 0 - - -static const GLuint hw_prim[GL_POLYGON+1] = { - B_PrimType_Points, - B_PrimType_Lines, - B_PrimType_LineLoop, - B_PrimType_LineStrip, - B_PrimType_Triangles, - B_PrimType_TriangleStrip, - B_PrimType_TriangleFan, - B_PrimType_Quads, - B_PrimType_QuadStrip, - B_PrimType_Polygon -}; - -static INLINE void gammaStartPrimitive( gammaContextPtr gmesa, GLenum prim ) -{ - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, Begin, gmesa->Begin | hw_prim[prim]); -} - -static INLINE void gammaEndPrimitive( gammaContextPtr gmesa ) -{ - GLcontext *ctx = gmesa->glCtx; - - if ( ctx->Line.SmoothFlag || - ctx->Polygon.SmoothFlag || - ctx->Point.SmoothFlag ) { - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, FlushSpan, 0); - } - - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, End, 0); -} - -#define LOCAL_VARS gammaContextPtr gmesa = GAMMA_CONTEXT(ctx) -#define INIT( prim ) gammaStartPrimitive( gmesa, prim ) -#define FLUSH() gammaEndPrimitive( gmesa ) -#define GET_CURRENT_VB_MAX_VERTS() \ - (gmesa->bufSize - gmesa->bufCount) / 2 -#define GET_SUBSEQUENT_VB_MAX_VERTS() \ - GAMMA_DMA_BUFFER_SIZE / 2 - -#define ALLOC_VERTS( nr ) (void *)0 /* todo: explicit alloc */ -#define EMIT_VERTS( ctx, j, nr, buf ) (gamma_emit(ctx, j, (j)+(nr)), (void *)0) - -#define TAG(x) gamma_##x -#include "tnl_dd/t_dd_dmatmp.h" - - -/**********************************************************************/ -/* Render pipeline stage */ -/**********************************************************************/ - - -static GLboolean gamma_run_render( GLcontext *ctx, - struct tnl_pipeline_stage *stage ) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - TNLcontext *tnl = TNL_CONTEXT(ctx); - struct vertex_buffer *VB = &tnl->vb; - GLuint i; - tnl_render_func *tab; - - /* GH: THIS IS A HACK!!! */ - if (VB->ClipOrMask || gmesa->RenderIndex != 0) - return GL_TRUE; /* don't handle clipping here */ - - /* We don't do elts */ - if (VB->Elts || !gamma_validate_render( ctx, VB )) - return GL_TRUE; - - tab = TAG(render_tab_verts); - - tnl->Driver.Render.Start( ctx ); - - for (i = 0 ; i < VB->PrimitiveCount ; i++) - { - GLuint prim = _tnl_translate_prim(&VB->Primitive[i]); - GLuint start = VB->Primitive[i].start; - GLuint length = VB->Primitive[i].count; - - if (!length) - continue; - - tab[prim & PRIM_MODE_MASK]( ctx, start, start + length, prim); - } - - tnl->Driver.Render.Finish( ctx ); - - return GL_FALSE; /* finished the pipe */ -} - - -const struct tnl_pipeline_stage _gamma_render_stage = -{ - "gamma render", - NULL, - NULL, - NULL, - NULL, - gamma_run_render /* run */ -}; diff --git a/src/mesa/drivers/dri/gamma/gamma_screen.c b/src/mesa/drivers/dri/gamma/gamma_screen.c deleted file mode 100644 index 47862f1d77e..00000000000 --- a/src/mesa/drivers/dri/gamma/gamma_screen.c +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Copyright 2001 by Alan Hourihane. - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that - * copyright notice and this permission notice appear in supporting - * documentation, and that the name of Alan Hourihane not be used in - * advertising or publicity pertaining to distribution of the software without - * specific, written prior permission. Alan Hourihane makes no representations - * about the suitability of this software for any purpose. It is provided - * "as is" without express or implied warranty. - * - * ALAN HOURIHANE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO - * EVENT SHALL ALAN HOURIHANE BE LIABLE FOR ANY SPECIAL, INDIRECT OR - * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - * - * Authors: Alan Hourihane, <[email protected]> - * - */ - -#include "gamma_context.h" -#include "gamma_vb.h" -#include "glint_dri.h" - -#include "main/imports.h" - -gammaScreenPtr gammaCreateScreen( __DRIscreen *sPriv ) -{ - gammaScreenPtr gammaScreen; - GLINTDRIPtr gDRIPriv = (GLINTDRIPtr)sPriv->pDevPriv; - int i; - - if (sPriv->devPrivSize != sizeof(GLINTDRIRec)) { - fprintf(stderr,"\nERROR! sizeof(GLINTDRIRec) does not match passed size from device driver\n"); - return GL_FALSE; - } - -#if 0 - /* Check the DRI externsion version */ - if ( sPriv->driMajor != 3 || sPriv->driMinor != 1 ) { - __driUtilMessage( "Gamma DRI driver expected DRI version 4.0.x " - "but got version %d.%d.%d", - sPriv->driMajor, sPriv->driMinor, sPriv->driPatch ); - return NULL; - } - - /* Check that the DDX driver version is compatible */ - if ( sPriv->ddxMajor != 4 || - sPriv->ddxMinor != 0 || - sPriv->ddxPatch < 0 ) { - __driUtilMessage( "r128 DRI driver expected DDX driver version 4.0.x but got version %d.%d.%d", sPriv->ddxMajor, sPriv->ddxMinor, sPriv->ddxPatch ); - return GL_FALSE; - } - - /* Check that the DRM driver version is compatible */ - if ( sPriv->drmMajor != 2 || - sPriv->drmMinor != 1 || - sPriv->drmPatch < 0 ) { - __driUtilMessage( "r128 DRI driver expected DRM driver version 2.1.x but got version %d.%d.%d", sPriv->drmMajor, sPriv->drmMinor, sPriv->drmPatch ); - return GL_FALSE; - } -#endif - - /* Allocate the private area */ - gammaScreen = (gammaScreenPtr) CALLOC( sizeof(*gammaScreen) ); - if ( !gammaScreen ) return NULL; - - gammaScreen->regionCount = 4; /* Magic number. Can we fix this? */ - - gammaScreen->regions = CALLOC(gammaScreen->regionCount * - sizeof(gammaRegion)); - - gammaScreen->regions[0].handle = gDRIPriv->registers0.handle; - gammaScreen->regions[0].size = gDRIPriv->registers0.size; - gammaScreen->regions[1].handle = gDRIPriv->registers1.handle; - gammaScreen->regions[1].size = gDRIPriv->registers1.size; - gammaScreen->regions[2].handle = gDRIPriv->registers2.handle; - gammaScreen->regions[2].size = gDRIPriv->registers2.size; - gammaScreen->regions[3].handle = gDRIPriv->registers3.handle; - gammaScreen->regions[3].size = gDRIPriv->registers3.size; - - /* Next, map all the regions */ - for (i = 0; i < gammaScreen->regionCount; i++) { - if (drmMap(sPriv->fd, - gammaScreen->regions[i].handle, - gammaScreen->regions[i].size, - &gammaScreen->regions[i].map)) { - while (--i > 0) { - (void)drmUnmap(gammaScreen->regions[i].map, - gammaScreen->regions[i].size); - } - return GL_FALSE; - } - } - - /* Get the list of dma buffers */ - gammaScreen->bufs = drmMapBufs(sPriv->fd); - - if (!gammaScreen->bufs) { - while (gammaScreen->regionCount > 0) { - (void)drmUnmap(gammaScreen->regions[gammaScreen->regionCount].map, - gammaScreen->regions[gammaScreen->regionCount].size); - gammaScreen->regionCount--; - } - return GL_FALSE; - } - - gammaScreen->textureSize = gDRIPriv->textureSize; - gammaScreen->logTextureGranularity = gDRIPriv->logTextureGranularity; - gammaScreen->cpp = gDRIPriv->cpp; - gammaScreen->frontOffset = gDRIPriv->frontOffset; - gammaScreen->frontPitch = gDRIPriv->frontPitch; - gammaScreen->backOffset = gDRIPriv->backOffset; - gammaScreen->backPitch = gDRIPriv->backPitch; - gammaScreen->backX = gDRIPriv->backX; - gammaScreen->backY = gDRIPriv->backY; - gammaScreen->depthOffset = gDRIPriv->depthOffset; - gammaScreen->depthPitch = gDRIPriv->depthPitch; - - gammaScreen->driScreen = sPriv; - - return gammaScreen; -} - -/* Destroy the device specific screen private data struct. - */ -void gammaDestroyScreen( __DRIscreen *sPriv ) -{ - gammaScreenPtr gammaScreen = (gammaScreenPtr)sPriv->private; - - /* First, unmap the dma buffers */ - drmUnmapBufs( gammaScreen->bufs ); - - /* Next, unmap all the regions */ - while (gammaScreen->regionCount > 0) { - (void)drmUnmap(gammaScreen->regions[gammaScreen->regionCount].map, - gammaScreen->regions[gammaScreen->regionCount].size); - gammaScreen->regionCount--; - } - FREE(gammaScreen->regions); - FREE(gammaScreen); -} diff --git a/src/mesa/drivers/dri/gamma/gamma_screen.h b/src/mesa/drivers/dri/gamma/gamma_screen.h deleted file mode 100644 index c716ea89c29..00000000000 --- a/src/mesa/drivers/dri/gamma/gamma_screen.h +++ /dev/null @@ -1,30 +0,0 @@ -typedef struct _gammaRegion { - drm_handle_t handle; - drmSize size; - drmAddress map; -} gammaRegion, *gammaRegionPtr; - -typedef struct { - - int regionCount; /* Count of register regions */ - gammaRegion *regions; /* Vector of mapped region info */ - - drmBufMapPtr bufs; /* Map of DMA buffers */ - - __DRIscreen *driScreen; /* Back pointer to DRI screen */ - - int cpp; - int frontPitch; - int frontOffset; - - int backPitch; - int backOffset; - int backX; - int backY; - - int depthOffset; - int depthPitch; - - int textureSize; - int logTextureGranularity; -} gammaScreenRec, *gammaScreenPtr; diff --git a/src/mesa/drivers/dri/gamma/gamma_span.c b/src/mesa/drivers/dri/gamma/gamma_span.c deleted file mode 100644 index 00160f760b2..00000000000 --- a/src/mesa/drivers/dri/gamma/gamma_span.c +++ /dev/null @@ -1,315 +0,0 @@ - -#include "gamma_context.h" -#include "gamma_lock.h" -#include "gamma_macros.h" -#include "main/colormac.h" - -#include "swrast/swrast.h" - -#define DBG 0 - -#define LOCAL_VARS \ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); \ - gammaScreenPtr gammascrn = gmesa->gammaScreen; \ - __DRIscreen *sPriv = gmesa->driScreen; \ - __DRIdrawable *dPriv = gmesa->driDrawable; \ - GLuint pitch = sPriv->fbWidth * gammascrn->cpp; \ - GLuint height = dPriv->h; \ - char *buf = (char *)(sPriv->pFB + \ - gmesa->drawOffset + \ - (dPriv->x * gammascrn->cpp) + \ - (dPriv->y * pitch)); \ - GLuint p; \ - (void) buf; (void) p - -/* FIXME! Depth/Stencil read/writes don't work ! */ -#define LOCAL_DEPTH_VARS \ - gammaScreenPtr gammascrn = gmesa->gammaScreen; \ - __DRIdrawable *dPriv = gmesa->driDrawable; \ - __DRIscreen *sPriv = gmesa->driScreen; \ - GLuint pitch = gammascrn->depthPitch; \ - GLuint height = dPriv->h; \ - char *buf = (char *)(sPriv->pFB + \ - gammascrn->depthOffset + \ - dPriv->x * gammascrn->cpp + \ - dPriv->y * pitch) - -#define LOCAL_STENCIL_VARS LOCAL_DEPTH_VARS - -#define Y_FLIP( _y ) (height - _y - 1) - -#define HW_LOCK() \ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); \ - FLUSH_DMA_BUFFER(gmesa); \ - gammaGetLock( gmesa, DRM_LOCK_FLUSH | DRM_LOCK_QUIESCENT ); \ - GAMMAHW_LOCK( gmesa ); - -#define HW_UNLOCK() GAMMAHW_UNLOCK( gmesa ) - - - -/* ================================================================ - * Color buffer - */ - -/* 16 bit, RGB565 color spanline and pixel functions - */ -#define INIT_MONO_PIXEL(p, color) \ - p = PACK_COLOR_565( color[0], color[1], color[2] ) - -#define WRITE_RGBA( _x, _y, r, g, b, a ) \ - *(GLushort *)(buf + _x*2 + _y*pitch) = ((((int)r & 0xf8) << 8) | \ - (((int)g & 0xfc) << 3) | \ - (((int)b & 0xf8) >> 3)) - -#define WRITE_PIXEL( _x, _y, p ) \ - *(GLushort *)(buf + _x*2 + _y*pitch) = p - -#define READ_RGBA( rgba, _x, _y ) \ - do { \ - GLushort p = *(GLushort *)(buf + _x*2 + _y*pitch); \ - rgba[0] = (p >> 8) & 0xf8; \ - rgba[1] = (p >> 3) & 0xfc; \ - rgba[2] = (p << 3) & 0xf8; \ - rgba[3] = 0xff; \ - if ( rgba[0] & 0x08 ) rgba[0] |= 0x07; \ - if ( rgba[1] & 0x04 ) rgba[1] |= 0x03; \ - if ( rgba[2] & 0x08 ) rgba[2] |= 0x07; \ - } while (0) - -#define TAG(x) gamma##x##_RGB565 -#include "spantmp.h" - - -/* 32 bit, ARGB8888 color spanline and pixel functions - */ - -#undef INIT_MONO_PIXEL -#define INIT_MONO_PIXEL(p, color) \ - p = PACK_COLOR_8888( color[3], color[0], color[1], color[2] ) - -#define WRITE_RGBA( _x, _y, r, g, b, a ) \ - *(GLuint *)(buf + _x*4 + _y*pitch) = ((b << 0) | \ - (g << 8) | \ - (r << 16) | \ - (a << 24) ) - -#define WRITE_PIXEL( _x, _y, p ) \ - *(GLuint *)(buf + _x*4 + _y*pitch) = p - -#define READ_RGBA( rgba, _x, _y ) \ -do { \ - GLuint p = *(GLuint *)(buf + _x*4 + _y*pitch); \ - rgba[0] = (p >> 16) & 0xff; \ - rgba[1] = (p >> 8) & 0xff; \ - rgba[2] = (p >> 0) & 0xff; \ - rgba[3] = (p >> 24) & 0xff; \ -} while (0) - -#define TAG(x) gamma##x##_ARGB8888 -#include "spantmp.h" - - -/* 16 bit depthbuffer functions. - */ -#define VALUE_TYPE GLushort - -#define WRITE_DEPTH( _x, _y, d ) \ - *(GLushort *)(buf + (_x)*2 + (_y)*pitch) = d; - -#define READ_DEPTH( d, _x, _y ) \ - d = *(GLushort *)(buf + (_x)*2 + (_y)*pitch); - -#define TAG(x) gamma##x##_16 -#include "depthtmp.h" - - -#if 0 /* Unused */ -/* 32 bit depthbuffer functions. - */ -#define VALUE_TYPE GLuint - -#define WRITE_DEPTH( _x, _y, d ) \ - *(GLuint *)(buf + (_x)*4 + (_y)*pitch) = d; - -#define READ_DEPTH( d, _x, _y ) \ - d = *(GLuint *)(buf + (_x)*4 + (_y)*pitch); - -#define TAG(x) gamma##x##_32 -#include "depthtmp.h" -#endif - - -/* 24/8 bit interleaved depth/stencil functions - */ -#define VALUE_TYPE GLuint - -#define WRITE_DEPTH( _x, _y, d ) { \ - GLuint tmp = *(GLuint *)(buf + (_x)*4 + (_y)*pitch); \ - tmp &= 0xff; \ - tmp |= (d) & 0xffffff00; \ - *(GLuint *)(buf + (_x)*4 + (_y)*pitch) = tmp; \ -} - -#define READ_DEPTH( d, _x, _y ) \ - d = *(GLuint *)(buf + (_x)*4 + (_y)*pitch) & ~0xff; - - -#define TAG(x) gamma##x##_24_8 -#include "depthtmp.h" - -#if 0 -#define WRITE_STENCIL( _x, _y, d ) { \ - GLuint tmp = *(GLuint *)(buf + _x*4 + _y*pitch); \ - tmp &= 0xffffff00; \ - tmp |= d & 0xff; \ - *(GLuint *)(buf + _x*4 + _y*pitch) = tmp; \ -} - -#define READ_STENCIL( d, _x, _y ) \ - d = *(GLuint *)(buf + _x*4 + _y*pitch) & 0xff; - -#define TAG(x) gamma##x##_24_8 -#include "stenciltmp.h" - -static void gammaReadRGBASpan8888( const GLcontext *ctx, - GLuint n, GLint x, GLint y, - GLubyte rgba[][4]) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - gammaScreenPtr gammascrn = gmesa->gammaScreen; - uint32_t dwords1, dwords2, i = 0; - char *src = (char *)rgba[0]; - GLuint read = n * gammascrn->cpp; /* Number of bytes we are expecting */ - uint32_t data; - - FLUSH_DMA_BUFFER(gmesa); - CHECK_DMA_BUFFER(gmesa, 16); - WRITE(gmesa->buf, LBReadMode, gmesa->LBReadMode & ~(LBReadSrcEnable | LBReadDstEnable)); - WRITE(gmesa->buf, ColorDDAMode, ColorDDAEnable); - WRITE(gmesa->buf, LBWriteMode, LBWriteModeDisable); - WRITE(gmesa->buf, FBReadMode, (gmesa->FBReadMode & ~FBReadSrcEnable) | FBReadDstEnable | FBDataTypeColor); - WRITE(gmesa->buf, FilterMode, 0x200); /* Pass FBColorData */ - WRITE(gmesa->buf, FBWriteMode, FBW_UploadColorData | FBWriteModeDisable); - WRITE(gmesa->buf, StartXSub, (x+n)<<16); - WRITE(gmesa->buf, StartXDom, x<<16); - WRITE(gmesa->buf, StartY, y<<16); - WRITE(gmesa->buf, GLINTCount, 1); - WRITE(gmesa->buf, dXDom, 0<<16); - WRITE(gmesa->buf, dXSub, 0<<16); - WRITE(gmesa->buf, dY, 1<<16); - WRITE(gmesa->buf, Render, PrimitiveTrapezoid); - FLUSH_DMA_BUFFER(gmesa); - -moredata: - - dwords1 = *(volatile uint32_t*)(void *)(((uint8_t*)gammascrn->regions[0].map) + (GlintOutFIFOWords)); - dwords2 = *(volatile uint32_t*)(void *)(((uint8_t*)gammascrn->regions[2].map) + (GlintOutFIFOWords)); - - if (dwords1) { - memcpy(src, (char*)gammascrn->regions[1].map + 0x1000, dwords1 << 2); - src += dwords1 << 2; - read -= dwords1 << 2; - } - if (dwords2) { - memcpy(src, (char*)gammascrn->regions[3].map + 0x1000, dwords2 << 2); - src += dwords2 << 2; - read -= dwords2 << 2; - } - - if (read) - goto moredata; - -done: - - CHECK_DMA_BUFFER(gmesa, 6); - WRITE(gmesa->buf, ColorDDAMode, gmesa->ColorDDAMode); - WRITE(gmesa->buf, LBWriteMode, LBWriteModeEnable); - WRITE(gmesa->buf, LBReadMode, gmesa->LBReadMode); - WRITE(gmesa->buf, FBReadMode, gmesa->FBReadMode); - WRITE(gmesa->buf, FBWriteMode, FBWriteModeEnable); - WRITE(gmesa->buf, FilterMode, 0x400); -} -#endif - -static void gammaSetBuffer( GLcontext *ctx, - GLframebuffer *colorBuffer, - GLuint bufferBit ) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - - switch ( bufferBit ) { - case BUFFER_BIT_FRONT_LEFT: - gmesa->readOffset = 0; - break; - case BUFFER_BIT_BACK_LEFT: - gmesa->readOffset = gmesa->driScreen->fbHeight * gmesa->driScreen->fbWidth * gmesa->gammaScreen->cpp; - break; - default: - _mesa_problem(ctx, "Unexpected buffer 0x%x in gammaSetBuffer()", bufferBit); - } -} - - -void gammaDDInitSpanFuncs( GLcontext *ctx ) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - struct swrast_device_driver *swdd = _swrast_GetDeviceDriverReference(ctx); - - swdd->SetBuffer = gammaSetBuffer; - - switch ( gmesa->gammaScreen->cpp ) { - case 2: - swdd->WriteRGBASpan = gammaWriteRGBASpan_RGB565; - swdd->WriteRGBSpan = gammaWriteRGBSpan_RGB565; - swdd->WriteMonoRGBASpan = gammaWriteMonoRGBASpan_RGB565; - swdd->WriteRGBAPixels = gammaWriteRGBAPixels_RGB565; - swdd->WriteMonoRGBAPixels = gammaWriteMonoRGBAPixels_RGB565; - swdd->ReadRGBASpan = gammaReadRGBASpan_RGB565; - swdd->ReadRGBAPixels = gammaReadRGBAPixels_RGB565; - break; - - case 4: - swdd->WriteRGBASpan = gammaWriteRGBASpan_ARGB8888; - swdd->WriteRGBSpan = gammaWriteRGBSpan_ARGB8888; - swdd->WriteMonoRGBASpan = gammaWriteMonoRGBASpan_ARGB8888; - swdd->WriteRGBAPixels = gammaWriteRGBAPixels_ARGB8888; - swdd->WriteMonoRGBAPixels = gammaWriteMonoRGBAPixels_ARGB8888; -#if 1 - swdd->ReadRGBASpan = gammaReadRGBASpan_ARGB8888; -#else - swdd->ReadRGBASpan = gammaReadRGBASpan8888; -#endif - swdd->ReadRGBAPixels = gammaReadRGBAPixels_ARGB8888; - break; - - default: - break; - } - - switch ( gmesa->glCtx->Visual.depthBits ) { - case 16: - swdd->ReadDepthSpan = gammaReadDepthSpan_16; - swdd->WriteDepthSpan = gammaWriteDepthSpan_16; - swdd->ReadDepthPixels = gammaReadDepthPixels_16; - swdd->WriteDepthPixels = gammaWriteDepthPixels_16; - break; - - case 24: - swdd->ReadDepthSpan = gammaReadDepthSpan_24_8; - swdd->WriteDepthSpan = gammaWriteDepthSpan_24_8; - swdd->ReadDepthPixels = gammaReadDepthPixels_24_8; - swdd->WriteDepthPixels = gammaWriteDepthPixels_24_8; - -#if 0 - swdd->ReadStencilSpan = gammaReadStencilSpan_24_8; - swdd->WriteStencilSpan = gammaWriteStencilSpan_24_8; - swdd->ReadStencilPixels = gammaReadStencilPixels_24_8; - swdd->WriteStencilPixels = gammaWriteStencilPixels_24_8; -#endif - break; - - default: - break; - } -} diff --git a/src/mesa/drivers/dri/gamma/gamma_state.c b/src/mesa/drivers/dri/gamma/gamma_state.c deleted file mode 100644 index c628457fbac..00000000000 --- a/src/mesa/drivers/dri/gamma/gamma_state.c +++ /dev/null @@ -1,1721 +0,0 @@ -/* - * Copyright 2001 by Alan Hourihane. - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that - * copyright notice and this permission notice appear in supporting - * documentation, and that the name of Alan Hourihane not be used in - * advertising or publicity pertaining to distribution of the software without - * specific, written prior permission. Alan Hourihane makes no representations - * about the suitability of this software for any purpose. It is provided - * "as is" without express or implied warranty. - * - * ALAN HOURIHANE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO - * EVENT SHALL ALAN HOURIHANE BE LIABLE FOR ANY SPECIAL, INDIRECT OR - * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - * - * Authors: Alan Hourihane, <[email protected]> - * - * 3DLabs Gamma driver - */ - -#include "gamma_context.h" -#include "gamma_macros.h" -#include "main/macros.h" -#include "glint_dri.h" -#include "main/colormac.h" -#include "swrast/swrast.h" -#include "swrast_setup/swrast_setup.h" -#include "vbo/vbo.h" -#include "tnl/tnl.h" - -#define ENABLELIGHTING 0 - -/* ============================================================= - * Alpha blending - */ - -static void gammaUpdateAlphaMode( GLcontext *ctx ) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - uint32_t a = gmesa->AlphaTestMode; - uint32_t b = gmesa->AlphaBlendMode; - uint32_t f = gmesa->AB_FBReadMode_Save = 0; - GLubyte refByte = (GLint) (ctx->Color.AlphaRef * 255.0); - - a &= ~(AT_CompareMask | AT_RefValueMask); - b &= ~(AB_SrcBlendMask | AB_DstBlendMask); - - a |= refByte << 4; - - switch ( ctx->Color.AlphaFunc ) { - case GL_NEVER: - a |= AT_Never; - break; - case GL_LESS: - a |= AT_Less; - break; - case GL_EQUAL: - a |= AT_Equal; - break; - case GL_LEQUAL: - a |= AT_LessEqual; - break; - case GL_GEQUAL: - a |= AT_GreaterEqual; - break; - case GL_GREATER: - a |= AT_Greater; - break; - case GL_NOTEQUAL: - a |= AT_NotEqual; - break; - case GL_ALWAYS: - a |= AT_Always; - break; - } - - if ( ctx->Color.AlphaEnabled ) { - f |= FBReadDstEnable; - a |= AlphaTestModeEnable; - } else { - a &= ~AlphaTestModeEnable; - } - - switch ( ctx->Color.BlendSrcRGB ) { - case GL_ZERO: - b |= AB_Src_Zero; - break; - case GL_ONE: - b |= AB_Src_One; - break; - case GL_DST_COLOR: - b |= AB_Src_DstColor; - break; - case GL_ONE_MINUS_DST_COLOR: - b |= AB_Src_OneMinusDstColor; - break; - case GL_SRC_ALPHA: - b |= AB_Src_SrcAlpha; - break; - case GL_ONE_MINUS_SRC_ALPHA: - b |= AB_Src_OneMinusSrcAlpha; - break; - case GL_DST_ALPHA: - b |= AB_Src_DstAlpha; - f |= FBReadSrcEnable; - break; - case GL_ONE_MINUS_DST_ALPHA: - b |= AB_Src_OneMinusDstAlpha; - f |= FBReadSrcEnable; - break; - case GL_SRC_ALPHA_SATURATE: - b |= AB_Src_SrcAlphaSaturate; - break; - } - - switch ( ctx->Color.BlendDstRGB ) { - case GL_ZERO: - b |= AB_Dst_Zero; - break; - case GL_ONE: - b |= AB_Dst_One; - break; - case GL_SRC_COLOR: - b |= AB_Dst_SrcColor; - break; - case GL_ONE_MINUS_SRC_COLOR: - b |= AB_Dst_OneMinusSrcColor; - break; - case GL_SRC_ALPHA: - b |= AB_Dst_SrcAlpha; - break; - case GL_ONE_MINUS_SRC_ALPHA: - b |= AB_Dst_OneMinusSrcAlpha; - break; - case GL_DST_ALPHA: - b |= AB_Dst_DstAlpha; - f |= FBReadSrcEnable; - break; - case GL_ONE_MINUS_DST_ALPHA: - b |= AB_Dst_OneMinusDstAlpha; - f |= FBReadSrcEnable; - break; - } - - if ( ctx->Color.BlendEnabled ) { - f |= FBReadDstEnable; - b |= AlphaBlendModeEnable; - } else { - b &= ~AlphaBlendModeEnable; - } - - if ( gmesa->AlphaTestMode != a ) { - gmesa->AlphaTestMode = a; - gmesa->dirty |= GAMMA_UPLOAD_ALPHA; - } - if ( gmesa->AlphaBlendMode != b) { - gmesa->AlphaBlendMode = b; - gmesa->dirty |= GAMMA_UPLOAD_BLEND; - } - gmesa->AB_FBReadMode_Save = f; -} - -static void gammaDDAlphaFunc( GLcontext *ctx, GLenum func, GLfloat ref ) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - (void) ref; - - FLUSH_BATCH( gmesa ); - - gmesa->new_state |= GAMMA_NEW_ALPHA; -} - -static void gammaDDBlendEquationSeparate( GLcontext *ctx, - GLenum modeRGB, GLenum modeA ) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - - assert( modeRGB == modeA ); - FLUSH_BATCH( gmesa ); - - gmesa->new_state |= GAMMA_NEW_ALPHA; -} - -static void gammaDDBlendFuncSeparate( GLcontext *ctx, - GLenum sfactorRGB, GLenum dfactorRGB, - GLenum sfactorA, GLenum dfactorA ) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - - FLUSH_BATCH( gmesa ); - - gmesa->new_state |= GAMMA_NEW_ALPHA; -} - - -/* ================================================================ - * Buffer clear - */ - -static void gammaDDClear( GLcontext *ctx, GLbitfield mask ) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - GLINTDRIPtr gDRIPriv = (GLINTDRIPtr)gmesa->driScreen->pDevPriv; - GLuint temp = 0; - - FLUSH_BATCH( gmesa ); - - /* Update and emit any new state. We need to do this here to catch - * changes to the masks. - * FIXME: Just update the masks? - */ - if ( gmesa->new_state ) - gammaDDUpdateHWState( ctx ); - -#ifdef DO_VALIDATE - /* Flush any partially filled buffers */ - FLUSH_DMA_BUFFER(gmesa); - - DRM_SPINLOCK(&gmesa->driScreen->pSAREA->drawable_lock, - gmesa->driScreen->drawLockID); - VALIDATE_DRAWABLE_INFO_NO_LOCK(gmesa); -#endif - - if (mask & BUFFER_BIT_DEPTH) { - /* Turn off writes the FB */ - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, FBWriteMode, FBWriteModeDisable); - - mask &= ~BUFFER_BIT_DEPTH; - - /* - * Turn Rectangle2DControl off when the window is not clipped - * (i.e., the GID tests are not necessary). This dramatically - * increases the performance of the depth clears. - */ - if (!gmesa->NotClipped) { - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, Rectangle2DControl, 1); - } - - temp = (gmesa->LBReadMode & LBPartialProdMask) | LBWindowOriginBot; - if (gDRIPriv->numMultiDevices == 2) temp |= LBScanLineInt2; - - CHECK_DMA_BUFFER(gmesa, 5); - WRITE(gmesa->buf, LBReadMode, temp); - WRITE(gmesa->buf, DeltaMode, DM_DepthEnable); - WRITE(gmesa->buf, DepthMode, (DepthModeEnable | - DM_Always | - DM_SourceDepthRegister | - DM_WriteMask)); - WRITE(gmesa->buf, GLINTDepth, gmesa->ClearDepth); - - /* Increment the frame count */ - gmesa->FrameCount++; -#ifdef FAST_CLEAR_4 - gmesa->FrameCount &= 0x0f; -#else - gmesa->FrameCount &= 0xff; -#endif - - /* Force FCP to be written */ - WRITE(gmesa->buf, GLINTWindow, (WindowEnable | - W_PassIfEqual | - (gmesa->Window & W_GIDMask) | - W_DepthFCP | - W_LBUpdateFromRegisters | - W_OverrideWriteFiltering | - (gmesa->FrameCount << 9))); - - /* Clear part of the depth and FCP buffers */ - { - int y = gmesa->driScreen->fbHeight - gmesa->driDrawable->y - gmesa->driDrawable->h; - int x = gmesa->driDrawable->x; - int w = gmesa->driDrawable->w; - int h = gmesa->driDrawable->h; -#ifndef TURN_OFF_FCP - float hsub = h; - - if (gmesa->WindowChanged) { - gmesa->WindowChanged = GL_FALSE; - } else { -#ifdef FAST_CLEAR_4 - hsub /= 16; -#else - hsub /= 256; -#endif - - /* Handle the case where the height < # of FCPs */ - if (hsub < 1.0) { - if (gmesa->FrameCount > h) - gmesa->FrameCount = 0; - h = 1; - y += gmesa->FrameCount; - } else { - h = (gmesa->FrameCount+1)*hsub; - h -= (int)(gmesa->FrameCount*hsub); - y += gmesa->FrameCount*hsub; - } - } -#endif - if (h && w) { -#if 0 - CHECK_DMA_BUFFER(gmesa, 2); - WRITE(gmesa->buf, Rectangle2DMode, ((h & 0xfff)<<12) | - (w & 0xfff) ); - WRITE(gmesa->buf, DrawRectangle2D, ((y & 0xffff)<<16) | - (x & 0xffff) ); -#else - CHECK_DMA_BUFFER(gmesa, 8); - WRITE(gmesa->buf, StartXDom, x<<16); - WRITE(gmesa->buf, StartY, y<<16); - WRITE(gmesa->buf, StartXSub, (x+w)<<16); - WRITE(gmesa->buf, GLINTCount, h); - WRITE(gmesa->buf, dY, 1<<16); - WRITE(gmesa->buf, dXDom, 0<<16); - WRITE(gmesa->buf, dXSub, 0<<16); - WRITE(gmesa->buf, Render, 0x00000040); /* NOT_DONE */ -#endif - } - } - - CHECK_DMA_BUFFER(gmesa, 6); - WRITE(gmesa->buf, DepthMode, gmesa->DepthMode); - WRITE(gmesa->buf, DeltaMode, gmesa->DeltaMode); - WRITE(gmesa->buf, LBReadMode, gmesa->LBReadMode); - WRITE(gmesa->buf, GLINTWindow, gmesa->Window); - WRITE(gmesa->buf, FastClearDepth, gmesa->ClearDepth); - WRITE(gmesa->buf, FBWriteMode, FBWriteModeEnable); - - /* Turn on Depth FCP */ - if (gmesa->Window & W_DepthFCP) { - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, WindowOr, (gmesa->FrameCount << 9)); - } - - /* Turn off GID clipping if window is not clipped */ - if (gmesa->NotClipped) { - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, Rectangle2DControl, 0); - } - } - - if (mask & (BUFFER_BIT_FRONT_LEFT | BUFFER_BIT_BACK_LEFT)) { - int y = gmesa->driScreen->fbHeight - gmesa->driDrawable->y - gmesa->driDrawable->h; - int x = gmesa->driDrawable->x; - int w = gmesa->driDrawable->w; - int h = gmesa->driDrawable->h; - - mask &= ~(BUFFER_BIT_FRONT_LEFT | BUFFER_BIT_BACK_LEFT); - - if (x < 0) { w -= -x; x = 0; } - - /* Turn on GID clipping if window is clipped */ - if (!gmesa->NotClipped) { - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, Rectangle2DControl, 1); - } - - CHECK_DMA_BUFFER(gmesa, 18); - WRITE(gmesa->buf, FBBlockColor, gmesa->ClearColor); - WRITE(gmesa->buf, ColorDDAMode, ColorDDADisable); - WRITE(gmesa->buf, FBWriteMode, FBWriteModeEnable); - WRITE(gmesa->buf, DepthMode, 0); - WRITE(gmesa->buf, DeltaMode, 0); - WRITE(gmesa->buf, AlphaBlendMode, 0); -#if 1 - WRITE(gmesa->buf, dY, 1<<16); - WRITE(gmesa->buf, dXDom, 0<<16); - WRITE(gmesa->buf, dXSub, 0<<16); - WRITE(gmesa->buf, StartXSub, (x+w)<<16); - WRITE(gmesa->buf, GLINTCount, h); - WRITE(gmesa->buf, StartXDom, x<<16); - WRITE(gmesa->buf, StartY, y<<16); - WRITE(gmesa->buf, Render, 0x00000048); /* NOT_DONE */ -#else - WRITE(gmesa->buf, Rectangle2DMode, (((h & 0xfff)<<12) | - (w & 0xfff))); - WRITE(gmesa->buf, DrawRectangle2D, (((y & 0xffff)<<16) | - (x & 0xffff))); -#endif - WRITE(gmesa->buf, DepthMode, gmesa->DepthMode); - WRITE(gmesa->buf, DeltaMode, gmesa->DeltaMode); - WRITE(gmesa->buf, AlphaBlendMode, gmesa->AlphaBlendMode); - WRITE(gmesa->buf, ColorDDAMode, gmesa->ColorDDAMode); - - /* Turn off GID clipping if window is clipped */ - if (gmesa->NotClipped) { - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, Rectangle2DControl, 0); - } - } - -#ifdef DO_VALIDATE - PROCESS_DMA_BUFFER_TOP_HALF(gmesa); - - DRM_SPINUNLOCK(&gmesa->driScreen->pSAREA->drawable_lock, - gmesa->driScreen->drawLockID); - VALIDATE_DRAWABLE_INFO_NO_LOCK_POST(gmesa); - - PROCESS_DMA_BUFFER_BOTTOM_HALF(gmesa); -#endif - - if ( mask ) - _swrast_Clear( ctx, mask ); -} - -/* ============================================================= - * Depth testing - */ - -static void gammaUpdateZMode( GLcontext *ctx ) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - uint32_t z = gmesa->DepthMode; - uint32_t delta = gmesa->DeltaMode; - uint32_t window = gmesa->Window; - uint32_t lbread = gmesa->LBReadMode; - - z &= ~DM_CompareMask; - - switch ( ctx->Depth.Func ) { - case GL_NEVER: - z |= DM_Never; - break; - case GL_ALWAYS: - z |= DM_Always; - break; - case GL_LESS: - z |= DM_Less; - break; - case GL_LEQUAL: - z |= DM_LessEqual; - break; - case GL_EQUAL: - z |= DM_Equal; - break; - case GL_GEQUAL: - z |= DM_GreaterEqual; - break; - case GL_GREATER: - z |= DM_Greater; - break; - case GL_NOTEQUAL: - z |= DM_NotEqual; - break; - } - - if ( ctx->Depth.Test ) { - z |= DepthModeEnable; - delta |= DM_DepthEnable; - window |= W_DepthFCP; - lbread |= LBReadDstEnable; - } else { - z &= ~DepthModeEnable; - delta &= ~DM_DepthEnable; - window &= ~W_DepthFCP; - lbread &= ~LBReadDstEnable; - } - - if ( ctx->Depth.Mask ) { - z |= DM_WriteMask; - } else { - z &= ~DM_WriteMask; - } - -#if 0 - if ( gmesa->DepthMode != z ){ -#endif - gmesa->DepthMode = z; - gmesa->DeltaMode = delta; - gmesa->Window = window; - gmesa->LBReadMode = lbread; - gmesa->dirty |= GAMMA_UPLOAD_DEPTH; -#if 0 - } -#endif -} - -static void gammaDDDepthFunc( GLcontext *ctx, GLenum func ) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - - FLUSH_BATCH( gmesa ); - gmesa->new_state |= GAMMA_NEW_DEPTH; -} - -static void gammaDDDepthMask( GLcontext *ctx, GLboolean flag ) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - - FLUSH_BATCH( gmesa ); - gmesa->new_state |= GAMMA_NEW_DEPTH; -} - -static void gammaDDClearDepth( GLcontext *ctx, GLclampd d ) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - - switch ( gmesa->DepthSize ) { - case 16: - gmesa->ClearDepth = d * 0x0000ffff; - break; - case 24: - gmesa->ClearDepth = d * 0x00ffffff; - break; - case 32: - gmesa->ClearDepth = d * 0xffffffff; - break; - } -} - -static void gammaDDFinish( GLcontext *ctx ) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - - FLUSH_DMA_BUFFER(gmesa); -} - -static void gammaDDFlush( GLcontext *ctx ) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - - FLUSH_DMA_BUFFER(gmesa); -} - -/* ============================================================= - * Fog - */ - -static void gammaUpdateFogAttrib( GLcontext *ctx ) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - uint32_t f = gmesa->FogMode; - uint32_t g = gmesa->GeometryMode; - uint32_t d = gmesa->DeltaMode; - - if (ctx->Fog.Enabled) { - f |= FogModeEnable; - g |= GM_FogEnable; - d |= DM_FogEnable; - } else { - f &= ~FogModeEnable; - g &= ~GM_FogEnable; - d &= ~DM_FogEnable; - } - - g &= ~GM_FogMask; - - switch (ctx->Fog.Mode) { - case GL_LINEAR: - g |= GM_FogLinear; - break; - case GL_EXP: - g |= GM_FogExp; - break; - case GL_EXP2: - g |= GM_FogExpSquared; - break; - } - - if ( gmesa->FogMode != f ) { - gmesa->FogMode = f; - gmesa->dirty |= GAMMA_UPLOAD_FOG; - } - - if ( gmesa->GeometryMode != g ) { - gmesa->GeometryMode = g; - gmesa->dirty |= GAMMA_UPLOAD_GEOMETRY; - } - - if ( gmesa->DeltaMode != d ) { - gmesa->DeltaMode = d; - gmesa->dirty |= GAMMA_UPLOAD_DEPTH; - } -} - -#if 0 -static void gammaDDFogfv( GLcontext *ctx, GLenum pname, const GLfloat *param ) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - - FLUSH_BATCH( gmesa ); - gmesa->new_state |= GAMMA_NEW_FOG; -} -#endif - -/* ============================================================= - * Lines - */ -static void gammaDDLineWidth( GLcontext *ctx, GLfloat width ) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - - CHECK_DMA_BUFFER(gmesa, 3); - WRITE(gmesa->buf, LineWidth, (GLuint)width); - WRITEF(gmesa->buf, AAlineWidth, width); - WRITE(gmesa->buf, LineWidthOffset, (GLuint)(width-1)/2); -} - -static void gammaDDLineStipple( GLcontext *ctx, GLint factor, GLushort pattern ) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - - gmesa->LineMode &= ~(LM_StippleMask | LM_RepeatFactorMask); - gmesa->LineMode |= ((GLuint)(factor - 1) << 1) | ((GLuint)pattern << 10); - - gmesa->dirty |= GAMMA_UPLOAD_LINEMODE; -} - - - -/* ============================================================= - * Points - */ -static void gammaDDPointSize( GLcontext *ctx, GLfloat size ) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - - CHECK_DMA_BUFFER(gmesa, 2); - WRITE(gmesa->buf, PointSize, (GLuint)size); - WRITEF(gmesa->buf, AApointSize, size); -} - -/* ============================================================= - * Polygon - */ - -static void gammaUpdatePolygon( GLcontext *ctx ) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - uint32_t g = gmesa->GeometryMode; - - g &= ~(GM_PolyOffsetFillEnable | GM_PolyOffsetPointEnable | - GM_PolyOffsetLineEnable); - - if (ctx->Polygon.OffsetFill) g |= GM_PolyOffsetFillEnable; - if (ctx->Polygon.OffsetPoint) g |= GM_PolyOffsetPointEnable; - if (ctx->Polygon.OffsetLine) g |= GM_PolyOffsetLineEnable; - - g &= ~GM_FB_PolyMask; - - switch (ctx->Polygon.FrontMode) { - case GL_FILL: - g |= GM_FrontPolyFill; - break; - case GL_LINE: - g |= GM_FrontPolyLine; - break; - case GL_POINT: - g |= GM_FrontPolyPoint; - break; - } - - switch (ctx->Polygon.BackMode) { - case GL_FILL: - g |= GM_BackPolyFill; - break; - case GL_LINE: - g |= GM_BackPolyLine; - break; - case GL_POINT: - g |= GM_BackPolyPoint; - break; - } - - if ( gmesa->GeometryMode != g ) { - gmesa->GeometryMode = g; - gmesa->dirty |= GAMMA_UPLOAD_GEOMETRY; - } - - gmesa->dirty |= GAMMA_UPLOAD_POLYGON; -} - -static void gammaDDPolygonMode( GLcontext *ctx, GLenum face, GLenum mode) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - - FLUSH_BATCH( gmesa ); - - gmesa->new_state |= GAMMA_NEW_POLYGON; -} - -static void gammaUpdateStipple( GLcontext *ctx ) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - - FLUSH_BATCH( gmesa ); - - if (ctx->Polygon.StippleFlag) { - gmesa->AreaStippleMode |= AreaStippleModeEnable/* | ASM_X32 | ASM_Y32*/; - } else { - gmesa->AreaStippleMode &= ~AreaStippleModeEnable; - } - - gmesa->dirty |= GAMMA_UPLOAD_STIPPLE; -} - -static void gammaDDPolygonStipple( GLcontext *ctx, const GLubyte *mask) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - FLUSH_BATCH( gmesa ); - gmesa->new_state |= GAMMA_NEW_STIPPLE; -} - -/* ============================================================= - * Clipping - */ - -static void gammaUpdateClipping( GLcontext *ctx ) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - GLint x1, y1, x2, y2; - - if ( gmesa->driDrawable ) { - x1 = gmesa->driDrawable->x + ctx->Scissor.X; - y1 = gmesa->driScreen->fbHeight - - (gmesa->driDrawable->y + - gmesa->driDrawable->h) + ctx->Scissor.Y; - x2 = x1 + ctx->Scissor.Width; - y2 = y1 + ctx->Scissor.Height; - - gmesa->ScissorMinXY = x1 | (y1 << 16); - gmesa->ScissorMaxXY = x2 | (y2 << 16); - if (ctx->Scissor.Enabled) - gmesa->ScissorMode |= UserScissorEnable; - else - gmesa->ScissorMode &= ~UserScissorEnable; - - gmesa->dirty |= GAMMA_UPLOAD_CLIP; - } -} - -static void gammaDDScissor( GLcontext *ctx, - GLint x, GLint y, GLsizei w, GLsizei h ) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - - FLUSH_BATCH( gmesa ); - gmesa->new_state |= GAMMA_NEW_CLIP; -} - -/* ============================================================= - * Culling - */ - -static void gammaUpdateCull( GLcontext *ctx ) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - uint32_t g = gmesa->GeometryMode; - - g &= ~(GM_PolyCullMask | GM_FFMask); - - if (ctx->Polygon.FrontFace == GL_CCW) { - g |= GM_FrontFaceCCW; - } else { - g |= GM_FrontFaceCW; - } - - switch ( ctx->Polygon.CullFaceMode ) { - case GL_FRONT: - g |= GM_PolyCullFront; - break; - case GL_BACK: - g |= GM_PolyCullBack; - break; - case GL_FRONT_AND_BACK: - g |= GM_PolyCullBoth; - break; - } - - if ( ctx->Polygon.CullFlag ) { - g |= GM_PolyCullEnable; - } else { - g &= ~GM_PolyCullEnable; - } - - if ( gmesa->GeometryMode != g ) { - gmesa->GeometryMode = g; - gmesa->dirty |= GAMMA_UPLOAD_GEOMETRY; - } -} - -static void gammaDDCullFace( GLcontext *ctx, GLenum mode ) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - - FLUSH_BATCH( gmesa ); - gmesa->new_state |= GAMMA_NEW_CULL; -} - -static void gammaDDFrontFace( GLcontext *ctx, GLenum mode ) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - - FLUSH_BATCH( gmesa ); - gmesa->new_state |= GAMMA_NEW_CULL; -} - -/* ============================================================= - * Masks - */ - -static void gammaUpdateMasks( GLcontext *ctx ) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - - - GLuint mask = gammaPackColor( gmesa->gammaScreen->cpp, - ctx->Color.ColorMask[0][RCOMP], - ctx->Color.ColorMask[0][GCOMP], - ctx->Color.ColorMask[0][BCOMP], - ctx->Color.ColorMask[0][ACOMP] ); - - if (gmesa->gammaScreen->cpp == 2) mask |= mask << 16; - - if ( gmesa->FBHardwareWriteMask != mask ) { - gmesa->FBHardwareWriteMask = mask; - gmesa->dirty |= GAMMA_UPLOAD_MASKS; - } -} - -static void gammaDDColorMask( GLcontext *ctx, GLboolean r, GLboolean g, - GLboolean b, GLboolean a) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - - FLUSH_BATCH( gmesa ); - gmesa->new_state |= GAMMA_NEW_MASKS; -} - -/* ============================================================= - * Rendering attributes - * - * We really don't want to recalculate all this every time we bind a - * texture. These things shouldn't change all that often, so it makes - * sense to break them out of the core texture state update routines. - */ - -#if ENABLELIGHTING -static void gammaDDLightfv(GLcontext *ctx, GLenum light, GLenum pname, - const GLfloat *params, GLint nParams) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - GLfloat l,x,y,z,w; - - switch(light) { - case GL_LIGHT0: - switch (pname) { - case GL_AMBIENT: - CHECK_DMA_BUFFER(gmesa, 3); - /* We don't do alpha */ - WRITEF(gmesa->buf, Light0AmbientIntensityBlue, params[2]); - WRITEF(gmesa->buf, Light0AmbientIntensityGreen, params[1]); - WRITEF(gmesa->buf, Light0AmbientIntensityRed, params[0]); - break; - case GL_DIFFUSE: - CHECK_DMA_BUFFER(gmesa, 3); - /* We don't do alpha */ - WRITEF(gmesa->buf, Light0DiffuseIntensityBlue, params[2]); - WRITEF(gmesa->buf, Light0DiffuseIntensityGreen, params[1]); - WRITEF(gmesa->buf, Light0DiffuseIntensityRed, params[0]); - break; - case GL_SPECULAR: - CHECK_DMA_BUFFER(gmesa, 3); - /* We don't do alpha */ - WRITEF(gmesa->buf, Light0SpecularIntensityBlue, params[2]); - WRITEF(gmesa->buf, Light0SpecularIntensityGreen, params[1]); - WRITEF(gmesa->buf, Light0SpecularIntensityRed, params[0]); - break; - case GL_POSITION: - /* Normalize <x,y,z> */ - x = params[0]; y = params[1]; z = params[2]; w = params[3]; - l = sqrt(x*x + y*y + z*z + w*w); - w /= l; - x /= l; - y /= l; - z /= l; - if (params[3] != 0.0) { - gmesa->Light0Mode |= Light0ModeAttenuation; - gmesa->Light0Mode |= Light0ModeLocal; - } else { - gmesa->Light0Mode &= ~Light0ModeAttenuation; - gmesa->Light0Mode &= ~Light0ModeLocal; - } - CHECK_DMA_BUFFER(gmesa, 5); - WRITE(gmesa->buf, Light0Mode, gmesa->Light0Mode); - WRITEF(gmesa->buf, Light0PositionW, w); - WRITEF(gmesa->buf, Light0PositionZ, z); - WRITEF(gmesa->buf, Light0PositionY, y); - WRITEF(gmesa->buf, Light0PositionX, x); - break; - case GL_SPOT_DIRECTION: - CHECK_DMA_BUFFER(gmesa, 3); - /* WRITEF(gmesa->buf, Light0SpotlightDirectionW, params[3]); */ - WRITEF(gmesa->buf, Light0SpotlightDirectionZ, params[2]); - WRITEF(gmesa->buf, Light0SpotlightDirectionY, params[1]); - WRITEF(gmesa->buf, Light0SpotlightDirectionX, params[0]); - break; - case GL_SPOT_EXPONENT: - CHECK_DMA_BUFFER(gmesa, 1); - WRITEF(gmesa->buf, Light0SpotlightExponent, params[0]); - break; - case GL_SPOT_CUTOFF: - if (params[0] != 180.0) - gmesa->Light0Mode |= Light0ModeSpotLight; - else - gmesa->Light0Mode &= ~Light0ModeSpotLight; - CHECK_DMA_BUFFER(gmesa, 2); - WRITE(gmesa->buf, Light0Mode, gmesa->Light0Mode); - WRITEF(gmesa->buf, Light0CosSpotlightCutoffAngle, cos(params[0]*DEG2RAD)); - break; - case GL_CONSTANT_ATTENUATION: - CHECK_DMA_BUFFER(gmesa, 1); - WRITEF(gmesa->buf, Light0ConstantAttenuation, params[0]); - break; - case GL_LINEAR_ATTENUATION: - CHECK_DMA_BUFFER(gmesa, 1); - WRITEF(gmesa->buf, Light0LinearAttenuation, params[0]); - break; - case GL_QUADRATIC_ATTENUATION: - CHECK_DMA_BUFFER(gmesa, 1); - WRITEF(gmesa->buf, Light0QuadraticAttenuation, params[0]); - break; - } - break; - } -} - -static void gammaDDLightModelfv( GLcontext *ctx, GLenum pname, - const GLfloat *params ) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - - switch (pname) { - case GL_LIGHT_MODEL_AMBIENT: - CHECK_DMA_BUFFER(gmesa, 3); - /* We don't do alpha */ - WRITEF(gmesa->buf, SceneAmbientColorBlue, params[2]); - WRITEF(gmesa->buf, SceneAmbientColorGreen, params[1]); - WRITEF(gmesa->buf, SceneAmbientColorRed, params[0]); - break; - case GL_LIGHT_MODEL_LOCAL_VIEWER: - if (params[0] != 0.0) - gmesa->LightingMode |= LightingModeLocalViewer; - else - gmesa->LightingMode &= ~LightingModeLocalViewer; - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, LightingMode, gmesa->LightingMode); - break; - case GL_LIGHT_MODEL_TWO_SIDE: - if (params[0] == 1.0f) { - gmesa->LightingMode |= LightingModeTwoSides; - gmesa->MaterialMode |= MaterialModeTwoSides; - } else { - gmesa->LightingMode &= ~LightingModeTwoSides; - gmesa->MaterialMode &= ~MaterialModeTwoSides; - } - CHECK_DMA_BUFFER(gmesa, 2); - WRITE(gmesa->buf, LightingMode, gmesa->LightingMode); - WRITE(gmesa->buf, MaterialMode, gmesa->MaterialMode); - break; - } -} -#endif - -static void gammaDDShadeModel( GLcontext *ctx, GLenum mode ) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - uint32_t g = gmesa->GeometryMode; - uint32_t c = gmesa->ColorDDAMode; - - g &= ~GM_ShadingMask; - c &= ~ColorDDAShadingMask; - - switch ( mode ) { - case GL_FLAT: - g |= GM_FlatShading; - c |= ColorDDAFlat; - break; - case GL_SMOOTH: - g |= GM_GouraudShading; - c |= ColorDDAGouraud; - break; - default: - return; - } - - if ( gmesa->ColorDDAMode != c ) { - FLUSH_BATCH( gmesa ); - gmesa->ColorDDAMode = c; - - gmesa->dirty |= GAMMA_UPLOAD_SHADE; - } - - if ( gmesa->GeometryMode != g ) { - FLUSH_BATCH( gmesa ); - gmesa->GeometryMode = g; - - gmesa->dirty |= GAMMA_UPLOAD_GEOMETRY; - } -} - -/* ============================================================= - * Miscellaneous - */ - -static void gammaDDClearColor( GLcontext *ctx, const GLfloat color[4]) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - GLubyte c[4]; - UNCLAMPED_FLOAT_TO_UBYTE(c[0], color[0]); - UNCLAMPED_FLOAT_TO_UBYTE(c[1], color[1]); - UNCLAMPED_FLOAT_TO_UBYTE(c[2], color[2]); - UNCLAMPED_FLOAT_TO_UBYTE(c[3], color[3]); - - gmesa->ClearColor = gammaPackColor( gmesa->gammaScreen->cpp, - c[0], c[1], c[2], c[3] ); - - if (gmesa->gammaScreen->cpp == 2) gmesa->ClearColor |= gmesa->ClearColor<<16; -} - - -static void gammaDDLogicalOpcode( GLcontext *ctx, GLenum opcode ) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - - FLUSH_BATCH( gmesa ); - - if ( ctx->Color.ColorLogicOpEnabled ) { - gmesa->LogicalOpMode = opcode << 1 | LogicalOpModeEnable; - } else { - gmesa->LogicalOpMode = LogicalOpModeDisable; - } - - gmesa->dirty |= GAMMA_UPLOAD_LOGICOP; -} - -static void gammaDDDrawBuffer( GLcontext *ctx, GLenum mode ) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - - FLUSH_BATCH( gmesa ); - - switch ( mode ) { - case GL_FRONT_LEFT: - gmesa->drawOffset = gmesa->readOffset = 0; - break; - case GL_BACK_LEFT: - gmesa->drawOffset = gmesa->readOffset = gmesa->driScreen->fbHeight * gmesa->driScreen->fbWidth * gmesa->gammaScreen->cpp; - break; - } -} - -static void gammaDDReadBuffer( GLcontext *ctx, GLenum mode ) -{ - /* XXX anything? */ -} - -/* ============================================================= - * Window position and viewport transformation - */ - -void gammaUpdateWindow( GLcontext *ctx ) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - __DRIdrawable *dPriv = gmesa->driDrawable; - GLfloat xoffset = (GLfloat)dPriv->x; - GLfloat yoffset = gmesa->driScreen->fbHeight - (GLfloat)dPriv->y - dPriv->h; - const GLfloat *v = ctx->Viewport._WindowMap.m; - - GLfloat sx = v[MAT_SX]; - GLfloat tx = v[MAT_TX] + xoffset; - GLfloat sy = v[MAT_SY]; - GLfloat ty = v[MAT_TY] + yoffset; - GLfloat sz = v[MAT_SZ] * gmesa->depth_scale; - GLfloat tz = v[MAT_TZ] * gmesa->depth_scale; - - gmesa->dirty |= GAMMA_UPLOAD_VIEWPORT; - - gmesa->ViewportScaleX = sx; - gmesa->ViewportScaleY = sy; - gmesa->ViewportScaleZ = sz; - gmesa->ViewportOffsetX = tx; - gmesa->ViewportOffsetY = ty; - gmesa->ViewportOffsetZ = tz; -} - - - -static void gammaDDViewport( GLcontext *ctx, GLint x, GLint y, - GLsizei width, GLsizei height ) -{ - gammaUpdateWindow( ctx ); -} - -static void gammaDDDepthRange( GLcontext *ctx, GLclampd nearval, - GLclampd farval ) -{ - gammaUpdateWindow( ctx ); -} - -void gammaUpdateViewportOffset( GLcontext *ctx ) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - __DRIdrawable *dPriv = gmesa->driDrawable; - GLfloat xoffset = (GLfloat)dPriv->x; - GLfloat yoffset = gmesa->driScreen->fbHeight - (GLfloat)dPriv->y - dPriv->h; - const GLfloat *v = ctx->Viewport._WindowMap.m; - - GLfloat tx = v[MAT_TX] + xoffset; - GLfloat ty = v[MAT_TY] + yoffset; - - if ( gmesa->ViewportOffsetX != tx || - gmesa->ViewportOffsetY != ty ) - { - gmesa->ViewportOffsetX = tx; - gmesa->ViewportOffsetY = ty; - - gmesa->new_state |= GAMMA_NEW_WINDOW; - } - - gmesa->new_state |= GAMMA_NEW_CLIP; -} - -#if 0 -/* - * Matrix - */ - -static void gammaLoadHWMatrix(GLcontext *ctx) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - const GLfloat *m; - - gmesa->TransformMode &= ~XM_XformTexture; - - switch (ctx->Transform.MatrixMode) { - case GL_MODELVIEW: - gmesa->TransformMode |= XM_UseModelViewMatrix; - m = ctx->ModelviewMatrixStack.Top->m; - CHECK_DMA_BUFFER(gmesa, 16); - WRITEF(gmesa->buf, ModelViewMatrix0, m[0]); - WRITEF(gmesa->buf, ModelViewMatrix1, m[1]); - WRITEF(gmesa->buf, ModelViewMatrix2, m[2]); - WRITEF(gmesa->buf, ModelViewMatrix3, m[3]); - WRITEF(gmesa->buf, ModelViewMatrix4, m[4]); - WRITEF(gmesa->buf, ModelViewMatrix5, m[5]); - WRITEF(gmesa->buf, ModelViewMatrix6, m[6]); - WRITEF(gmesa->buf, ModelViewMatrix7, m[7]); - WRITEF(gmesa->buf, ModelViewMatrix8, m[8]); - WRITEF(gmesa->buf, ModelViewMatrix9, m[9]); - WRITEF(gmesa->buf, ModelViewMatrix10, m[10]); - WRITEF(gmesa->buf, ModelViewMatrix11, m[11]); - WRITEF(gmesa->buf, ModelViewMatrix12, m[12]); - WRITEF(gmesa->buf, ModelViewMatrix13, m[13]); - WRITEF(gmesa->buf, ModelViewMatrix14, m[14]); - WRITEF(gmesa->buf, ModelViewMatrix15, m[15]); - break; - case GL_PROJECTION: - m = ctx->ProjectionMatrixStack.Top->m; - CHECK_DMA_BUFFER(gmesa, 16); - WRITEF(gmesa->buf, ModelViewProjectionMatrix0, m[0]); - WRITEF(gmesa->buf, ModelViewProjectionMatrix1, m[1]); - WRITEF(gmesa->buf, ModelViewProjectionMatrix2, m[2]); - WRITEF(gmesa->buf, ModelViewProjectionMatrix3, m[3]); - WRITEF(gmesa->buf, ModelViewProjectionMatrix4, m[4]); - WRITEF(gmesa->buf, ModelViewProjectionMatrix5, m[5]); - WRITEF(gmesa->buf, ModelViewProjectionMatrix6, m[6]); - WRITEF(gmesa->buf, ModelViewProjectionMatrix7, m[7]); - WRITEF(gmesa->buf, ModelViewProjectionMatrix8, m[8]); - WRITEF(gmesa->buf, ModelViewProjectionMatrix9, m[9]); - WRITEF(gmesa->buf, ModelViewProjectionMatrix10, m[10]); - WRITEF(gmesa->buf, ModelViewProjectionMatrix11, m[11]); - WRITEF(gmesa->buf, ModelViewProjectionMatrix12, m[12]); - WRITEF(gmesa->buf, ModelViewProjectionMatrix13, m[13]); - WRITEF(gmesa->buf, ModelViewProjectionMatrix14, m[14]); - WRITEF(gmesa->buf, ModelViewProjectionMatrix15, m[15]); - break; - case GL_TEXTURE: - m = ctx->TextureMatrixStack[0].Top->m; - CHECK_DMA_BUFFER(gmesa, 16); - gmesa->TransformMode |= XM_XformTexture; - WRITEF(gmesa->buf, TextureMatrix0, m[0]); - WRITEF(gmesa->buf, TextureMatrix1, m[1]); - WRITEF(gmesa->buf, TextureMatrix2, m[2]); - WRITEF(gmesa->buf, TextureMatrix3, m[3]); - WRITEF(gmesa->buf, TextureMatrix4, m[4]); - WRITEF(gmesa->buf, TextureMatrix5, m[5]); - WRITEF(gmesa->buf, TextureMatrix6, m[6]); - WRITEF(gmesa->buf, TextureMatrix7, m[7]); - WRITEF(gmesa->buf, TextureMatrix8, m[8]); - WRITEF(gmesa->buf, TextureMatrix9, m[9]); - WRITEF(gmesa->buf, TextureMatrix10, m[10]); - WRITEF(gmesa->buf, TextureMatrix11, m[11]); - WRITEF(gmesa->buf, TextureMatrix12, m[12]); - WRITEF(gmesa->buf, TextureMatrix13, m[13]); - WRITEF(gmesa->buf, TextureMatrix14, m[14]); - WRITEF(gmesa->buf, TextureMatrix15, m[15]); - break; - - default: - /* ERROR!!! -- how did this happen? */ - break; - } - - gmesa->dirty |= GAMMA_UPLOAD_TRANSFORM; -} -#endif - -/* ============================================================= - * State enable/disable - */ - -static void gammaDDEnable( GLcontext *ctx, GLenum cap, GLboolean state ) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - - switch ( cap ) { - case GL_ALPHA_TEST: - case GL_BLEND: - FLUSH_BATCH( gmesa ); - gmesa->new_state |= GAMMA_NEW_ALPHA; - break; - - case GL_CULL_FACE: - FLUSH_BATCH( gmesa ); - gmesa->new_state |= GAMMA_NEW_CULL; - break; - - case GL_DEPTH_TEST: - FLUSH_BATCH( gmesa ); - gmesa->new_state |= GAMMA_NEW_DEPTH; - break; - - case GL_DITHER: - do { - uint32_t d = gmesa->DitherMode; - FLUSH_BATCH( gmesa ); - - if ( state ) { - d |= DM_DitherEnable; - } else { - d &= ~DM_DitherEnable; - } - - if ( gmesa->DitherMode != d ) { - gmesa->DitherMode = d; - gmesa->dirty |= GAMMA_UPLOAD_DITHER; - } - } while (0); - break; - -#if 0 - case GL_FOG: - FLUSH_BATCH( gmesa ); - gmesa->new_state |= GAMMA_NEW_FOG; - break; -#endif - - case GL_INDEX_LOGIC_OP: - case GL_COLOR_LOGIC_OP: - FLUSH_BATCH( gmesa ); - gmesa->new_state |= GAMMA_NEW_LOGICOP; - break; - -#if ENABLELIGHTING - case GL_LIGHTING: - do { - uint32_t l = gmesa->LightingMode; - FLUSH_BATCH( gmesa ); - - if ( state ) { - l |= LightingModeEnable; - } else { - l &= ~LightingModeEnable; - } - - if ( gmesa->LightingMode != l ) { - gmesa->LightingMode = l; - gmesa->dirty |= GAMMA_UPLOAD_LIGHT; - } - } while (0); - break; - - case GL_COLOR_MATERIAL: - do { - uint32_t m = gmesa->MaterialMode; - FLUSH_BATCH( gmesa ); - - if ( state ) { - m |= MaterialModeEnable; - } else { - m &= ~MaterialModeEnable; - } - - if ( gmesa->MaterialMode != m ) { - gmesa->MaterialMode = m; - gmesa->dirty |= GAMMA_UPLOAD_LIGHT; - } - } while (0); - break; -#endif - - case GL_LINE_SMOOTH: - FLUSH_BATCH( gmesa ); - if ( state ) { - gmesa->AntialiasMode |= AntialiasModeEnable; - gmesa->LineMode |= LM_AntialiasEnable; - } else { - gmesa->AntialiasMode &= ~AntialiasModeEnable; - gmesa->LineMode &= ~LM_AntialiasEnable; - } - gmesa->dirty |= GAMMA_UPLOAD_LINEMODE; - break; - - case GL_POINT_SMOOTH: - FLUSH_BATCH( gmesa ); - if ( state ) { - gmesa->AntialiasMode |= AntialiasModeEnable; - gmesa->PointMode |= PM_AntialiasEnable; - } else { - gmesa->AntialiasMode &= ~AntialiasModeEnable; - gmesa->PointMode &= ~PM_AntialiasEnable; - } - gmesa->dirty |= GAMMA_UPLOAD_POINTMODE; - break; - - case GL_POLYGON_SMOOTH: - FLUSH_BATCH( gmesa ); - if ( state ) { - gmesa->AntialiasMode |= AntialiasModeEnable; - gmesa->TriangleMode |= TM_AntialiasEnable; - } else { - gmesa->AntialiasMode &= ~AntialiasModeEnable; - gmesa->TriangleMode &= ~TM_AntialiasEnable; - } - gmesa->dirty |= GAMMA_UPLOAD_TRIMODE; - break; - - case GL_SCISSOR_TEST: - FLUSH_BATCH( gmesa ); - gmesa->new_state |= GAMMA_NEW_CLIP; - break; - - case GL_POLYGON_OFFSET_FILL: - case GL_POLYGON_OFFSET_POINT: - case GL_POLYGON_OFFSET_LINE: - FLUSH_BATCH( gmesa ); - gmesa->new_state |= GAMMA_NEW_POLYGON; - break; - - case GL_LINE_STIPPLE: - FLUSH_BATCH( gmesa ); - if ( state ) - gmesa->LineMode |= LM_StippleEnable; - else - gmesa->LineMode &= ~LM_StippleEnable; - gmesa->dirty |= GAMMA_UPLOAD_LINEMODE; - break; - - case GL_POLYGON_STIPPLE: - FLUSH_BATCH( gmesa ); - gmesa->new_state |= GAMMA_NEW_STIPPLE; - break; - - default: - return; - } -} - -/* ============================================================= - * State initialization, management - */ - - -/* - * Load the current context's state into the hardware. - * - * NOTE: Be VERY careful about ensuring the context state is marked for - * upload, the only place it shouldn't be uploaded is when the setup - * state has changed in ReducedPrimitiveChange as this comes right after - * a state update. - * - * Blits of any type should always upload the context and masks after - * they are done. - */ -void gammaEmitHwState( gammaContextPtr gmesa ) -{ - if (!gmesa->driDrawable) return; - - if (!gmesa->dirty) return; - -#ifdef DO_VALIDATE - /* Flush any partially filled buffers */ - FLUSH_DMA_BUFFER(gmesa); - - DRM_SPINLOCK(&gmesa->driScreen->pSAREA->drawable_lock, - gmesa->driScreen->drawLockID); - VALIDATE_DRAWABLE_INFO_NO_LOCK(gmesa); -#endif - - if (gmesa->dirty & GAMMA_UPLOAD_VIEWPORT) { - gmesa->dirty &= ~GAMMA_UPLOAD_VIEWPORT; - CHECK_DMA_BUFFER(gmesa, 6); - WRITEF(gmesa->buf, ViewPortOffsetX, gmesa->ViewportOffsetX); - WRITEF(gmesa->buf, ViewPortOffsetY, gmesa->ViewportOffsetY); - WRITEF(gmesa->buf, ViewPortOffsetZ, gmesa->ViewportOffsetZ); - WRITEF(gmesa->buf, ViewPortScaleX, gmesa->ViewportScaleX); - WRITEF(gmesa->buf, ViewPortScaleY, gmesa->ViewportScaleY); - WRITEF(gmesa->buf, ViewPortScaleZ, gmesa->ViewportScaleZ); - } - if ( (gmesa->dirty & GAMMA_UPLOAD_POINTMODE) || - (gmesa->dirty & GAMMA_UPLOAD_LINEMODE) || - (gmesa->dirty & GAMMA_UPLOAD_TRIMODE) ) { - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, AntialiasMode, gmesa->AntialiasMode); - } - if (gmesa->dirty & GAMMA_UPLOAD_POINTMODE) { - gmesa->dirty &= ~GAMMA_UPLOAD_POINTMODE; - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, PointMode, gmesa->PointMode); - } - if (gmesa->dirty & GAMMA_UPLOAD_LINEMODE) { - gmesa->dirty &= ~GAMMA_UPLOAD_LINEMODE; - CHECK_DMA_BUFFER(gmesa, 2); - WRITE(gmesa->buf, LineMode, gmesa->LineMode); - WRITE(gmesa->buf, LineStippleMode, gmesa->LineMode); - } - if (gmesa->dirty & GAMMA_UPLOAD_TRIMODE) { - gmesa->dirty &= ~GAMMA_UPLOAD_TRIMODE; - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, TriangleMode, gmesa->TriangleMode); - } - if (gmesa->dirty & GAMMA_UPLOAD_FOG) { - GLchan c[3], col; - UNCLAMPED_FLOAT_TO_RGB_CHAN( c, gmesa->glCtx->Fog.Color ); - col = gammaPackColor(4, c[0], c[1], c[2], 0); - gmesa->dirty &= ~GAMMA_UPLOAD_FOG; - CHECK_DMA_BUFFER(gmesa, 5); -#if 0 - WRITE(gmesa->buf, FogMode, gmesa->FogMode); - WRITE(gmesa->buf, FogColor, col); - WRITEF(gmesa->buf, FStart, gmesa->glCtx->Fog.Start); -#endif - WRITEF(gmesa->buf, FogEnd, gmesa->glCtx->Fog.End); - WRITEF(gmesa->buf, FogDensity, gmesa->glCtx->Fog.Density); - WRITEF(gmesa->buf, FogScale, - 1.0f/(gmesa->glCtx->Fog.End - gmesa->glCtx->Fog.Start)); - } - if (gmesa->dirty & GAMMA_UPLOAD_DITHER) { - gmesa->dirty &= ~GAMMA_UPLOAD_DITHER; - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, DitherMode, gmesa->DitherMode); - } - if (gmesa->dirty & GAMMA_UPLOAD_LOGICOP) { - gmesa->dirty &= ~GAMMA_UPLOAD_LOGICOP; - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, LogicalOpMode, gmesa->LogicalOpMode); - } - if (gmesa->dirty & GAMMA_UPLOAD_CLIP) { - gmesa->dirty &= ~GAMMA_UPLOAD_CLIP; - CHECK_DMA_BUFFER(gmesa, 3); - WRITE(gmesa->buf, ScissorMinXY, gmesa->ScissorMinXY); - WRITE(gmesa->buf, ScissorMaxXY, gmesa->ScissorMaxXY); - WRITE(gmesa->buf, ScissorMode, gmesa->ScissorMode); - } - if (gmesa->dirty & GAMMA_UPLOAD_MASKS) { - gmesa->dirty &= ~GAMMA_UPLOAD_MASKS; - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, FBHardwareWriteMask, gmesa->FBHardwareWriteMask); - } - if (gmesa->dirty & GAMMA_UPLOAD_ALPHA) { - gmesa->dirty &= ~GAMMA_UPLOAD_ALPHA; - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, AlphaTestMode, gmesa->AlphaTestMode); - } - if (gmesa->dirty & GAMMA_UPLOAD_BLEND) { - gmesa->dirty &= ~GAMMA_UPLOAD_BLEND; - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, AlphaBlendMode, gmesa->AlphaBlendMode); - } - CHECK_DMA_BUFFER(gmesa, 1); - if (gmesa->glCtx->Color.BlendEnabled || gmesa->glCtx->Color.AlphaEnabled) { - WRITE(gmesa->buf, FBReadMode, gmesa->FBReadMode | gmesa->AB_FBReadMode_Save); - } else { - WRITE(gmesa->buf, FBReadMode, gmesa->FBReadMode); - } - if (gmesa->dirty & GAMMA_UPLOAD_LIGHT) { - gmesa->dirty &= ~GAMMA_UPLOAD_LIGHT; - CHECK_DMA_BUFFER(gmesa, 2); - WRITE(gmesa->buf, LightingMode, gmesa->LightingMode); - WRITE(gmesa->buf, MaterialMode, gmesa->MaterialMode); - } - if (gmesa->dirty & GAMMA_UPLOAD_SHADE) { - gmesa->dirty &= ~GAMMA_UPLOAD_SHADE; - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, ColorDDAMode, gmesa->ColorDDAMode); - } - if (gmesa->dirty & GAMMA_UPLOAD_POLYGON) { - gmesa->dirty &= ~GAMMA_UPLOAD_POLYGON; - CHECK_DMA_BUFFER(gmesa, 2); - WRITEF(gmesa->buf, PolygonOffsetBias, gmesa->glCtx->Polygon.OffsetUnits); - WRITEF(gmesa->buf, PolygonOffsetFactor, gmesa->glCtx->Polygon.OffsetFactor); - } - if (gmesa->dirty & GAMMA_UPLOAD_STIPPLE) { - gmesa->dirty &= ~GAMMA_UPLOAD_STIPPLE; - CHECK_DMA_BUFFER(gmesa, 33); - WRITE(gmesa->buf, AreaStippleMode, gmesa->AreaStippleMode); - WRITE(gmesa->buf, AreaStipplePattern0, gmesa->glCtx->PolygonStipple[0]); - WRITE(gmesa->buf, AreaStipplePattern1, gmesa->glCtx->PolygonStipple[1]); - WRITE(gmesa->buf, AreaStipplePattern2, gmesa->glCtx->PolygonStipple[2]); - WRITE(gmesa->buf, AreaStipplePattern3, gmesa->glCtx->PolygonStipple[3]); - WRITE(gmesa->buf, AreaStipplePattern4, gmesa->glCtx->PolygonStipple[4]); - WRITE(gmesa->buf, AreaStipplePattern5, gmesa->glCtx->PolygonStipple[5]); - WRITE(gmesa->buf, AreaStipplePattern6, gmesa->glCtx->PolygonStipple[6]); - WRITE(gmesa->buf, AreaStipplePattern7, gmesa->glCtx->PolygonStipple[7]); - WRITE(gmesa->buf, AreaStipplePattern8, gmesa->glCtx->PolygonStipple[8]); - WRITE(gmesa->buf, AreaStipplePattern9, gmesa->glCtx->PolygonStipple[9]); - WRITE(gmesa->buf, AreaStipplePattern10, gmesa->glCtx->PolygonStipple[10]); - WRITE(gmesa->buf, AreaStipplePattern11, gmesa->glCtx->PolygonStipple[11]); - WRITE(gmesa->buf, AreaStipplePattern12, gmesa->glCtx->PolygonStipple[12]); - WRITE(gmesa->buf, AreaStipplePattern13, gmesa->glCtx->PolygonStipple[13]); - WRITE(gmesa->buf, AreaStipplePattern14, gmesa->glCtx->PolygonStipple[14]); - WRITE(gmesa->buf, AreaStipplePattern15, gmesa->glCtx->PolygonStipple[15]); - WRITE(gmesa->buf, AreaStipplePattern16, gmesa->glCtx->PolygonStipple[16]); - WRITE(gmesa->buf, AreaStipplePattern17, gmesa->glCtx->PolygonStipple[17]); - WRITE(gmesa->buf, AreaStipplePattern18, gmesa->glCtx->PolygonStipple[18]); - WRITE(gmesa->buf, AreaStipplePattern19, gmesa->glCtx->PolygonStipple[19]); - WRITE(gmesa->buf, AreaStipplePattern20, gmesa->glCtx->PolygonStipple[20]); - WRITE(gmesa->buf, AreaStipplePattern21, gmesa->glCtx->PolygonStipple[21]); - WRITE(gmesa->buf, AreaStipplePattern22, gmesa->glCtx->PolygonStipple[22]); - WRITE(gmesa->buf, AreaStipplePattern23, gmesa->glCtx->PolygonStipple[23]); - WRITE(gmesa->buf, AreaStipplePattern24, gmesa->glCtx->PolygonStipple[24]); - WRITE(gmesa->buf, AreaStipplePattern25, gmesa->glCtx->PolygonStipple[25]); - WRITE(gmesa->buf, AreaStipplePattern26, gmesa->glCtx->PolygonStipple[26]); - WRITE(gmesa->buf, AreaStipplePattern27, gmesa->glCtx->PolygonStipple[27]); - WRITE(gmesa->buf, AreaStipplePattern28, gmesa->glCtx->PolygonStipple[28]); - WRITE(gmesa->buf, AreaStipplePattern29, gmesa->glCtx->PolygonStipple[29]); - WRITE(gmesa->buf, AreaStipplePattern30, gmesa->glCtx->PolygonStipple[30]); - WRITE(gmesa->buf, AreaStipplePattern31, gmesa->glCtx->PolygonStipple[31]); - } - if (gmesa->dirty & GAMMA_UPLOAD_DEPTH) { - gmesa->dirty &= ~GAMMA_UPLOAD_DEPTH; - CHECK_DMA_BUFFER(gmesa, 4); - WRITE(gmesa->buf, DepthMode, gmesa->DepthMode); - WRITE(gmesa->buf, DeltaMode, gmesa->DeltaMode); - WRITE(gmesa->buf, GLINTWindow,gmesa->Window | (gmesa->FrameCount << 9)); - WRITE(gmesa->buf, LBReadMode, gmesa->LBReadMode); - } - if (gmesa->dirty & GAMMA_UPLOAD_GEOMETRY) { - gmesa->dirty &= ~GAMMA_UPLOAD_GEOMETRY; - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, GeometryMode, gmesa->GeometryMode); - } - if (gmesa->dirty & GAMMA_UPLOAD_TRANSFORM) { - gmesa->dirty &= ~GAMMA_UPLOAD_TRANSFORM; - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, TransformMode, gmesa->TransformMode); - } - if (gmesa->dirty & GAMMA_UPLOAD_TEX0) { - gammaTextureObjectPtr curTex = gmesa->CurrentTexObj[0]; - gmesa->dirty &= ~GAMMA_UPLOAD_TEX0; - if (curTex) { - CHECK_DMA_BUFFER(gmesa, 21); - WRITE(gmesa->buf, GeometryMode, gmesa->GeometryMode | GM_TextureEnable); - WRITE(gmesa->buf, DeltaMode, gmesa->DeltaMode | DM_TextureEnable); - WRITE(gmesa->buf, TextureAddressMode, curTex->TextureAddressMode); - WRITE(gmesa->buf, TextureReadMode, curTex->TextureReadMode); - WRITE(gmesa->buf, TextureColorMode, curTex->TextureColorMode); - WRITE(gmesa->buf, TextureFilterMode, curTex->TextureFilterMode); - WRITE(gmesa->buf, TextureFormat, curTex->TextureFormat); - WRITE(gmesa->buf, GLINTBorderColor, curTex->TextureBorderColor); - WRITE(gmesa->buf, TxBaseAddr0, curTex->TextureBaseAddr[0]); - WRITE(gmesa->buf, TxBaseAddr1, curTex->TextureBaseAddr[1]); - WRITE(gmesa->buf, TxBaseAddr2, curTex->TextureBaseAddr[2]); - WRITE(gmesa->buf, TxBaseAddr3, curTex->TextureBaseAddr[3]); - WRITE(gmesa->buf, TxBaseAddr4, curTex->TextureBaseAddr[4]); - WRITE(gmesa->buf, TxBaseAddr5, curTex->TextureBaseAddr[5]); - WRITE(gmesa->buf, TxBaseAddr6, curTex->TextureBaseAddr[6]); - WRITE(gmesa->buf, TxBaseAddr7, curTex->TextureBaseAddr[7]); - WRITE(gmesa->buf, TxBaseAddr8, curTex->TextureBaseAddr[8]); - WRITE(gmesa->buf, TxBaseAddr9, curTex->TextureBaseAddr[9]); - WRITE(gmesa->buf, TxBaseAddr10, curTex->TextureBaseAddr[10]); - WRITE(gmesa->buf, TxBaseAddr11, curTex->TextureBaseAddr[11]); - WRITE(gmesa->buf, TextureCacheControl, (TCC_Enable | TCC_Invalidate)); - } else { - CHECK_DMA_BUFFER(gmesa, 6); - WRITE(gmesa->buf, GeometryMode, gmesa->GeometryMode); - WRITE(gmesa->buf, DeltaMode, gmesa->DeltaMode); - WRITE(gmesa->buf, TextureAddressMode, TextureAddressModeDisable); - WRITE(gmesa->buf, TextureReadMode, TextureReadModeDisable); - WRITE(gmesa->buf, TextureFilterMode, TextureFilterModeDisable); - WRITE(gmesa->buf, TextureColorMode, TextureColorModeDisable); - } - } -#ifdef DO_VALIDATE - PROCESS_DMA_BUFFER_TOP_HALF(gmesa); - - DRM_SPINUNLOCK(&gmesa->driScreen->pSAREA->drawable_lock, - gmesa->driScreen->drawLockID); - VALIDATE_DRAWABLE_INFO_NO_LOCK_POST(gmesa); - - PROCESS_DMA_BUFFER_BOTTOM_HALF(gmesa); -#endif -} - -void gammaDDUpdateHWState( GLcontext *ctx ) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - int new_state = gmesa->new_state; - - if ( new_state ) - { - FLUSH_BATCH( gmesa ); - - gmesa->new_state = 0; - - /* Update the various parts of the context's state. - */ - if ( new_state & GAMMA_NEW_ALPHA ) - gammaUpdateAlphaMode( ctx ); - - if ( new_state & GAMMA_NEW_DEPTH ) - gammaUpdateZMode( ctx ); - - if ( new_state & GAMMA_NEW_FOG ) - gammaUpdateFogAttrib( ctx ); - - if ( new_state & GAMMA_NEW_CLIP ) - gammaUpdateClipping( ctx ); - - if ( new_state & GAMMA_NEW_POLYGON ) - gammaUpdatePolygon( ctx ); - - if ( new_state & GAMMA_NEW_CULL ) - gammaUpdateCull( ctx ); - - if ( new_state & GAMMA_NEW_MASKS ) - gammaUpdateMasks( ctx ); - - if ( new_state & GAMMA_NEW_WINDOW ) - gammaUpdateWindow( ctx ); - - if ( new_state & GAMMA_NEW_STIPPLE ) - gammaUpdateStipple( ctx ); - } - - /* HACK ! */ - - gammaEmitHwState( gmesa ); -} - - -static void gammaDDUpdateState( GLcontext *ctx, GLuint new_state ) -{ - _swrast_InvalidateState( ctx, new_state ); - _swsetup_InvalidateState( ctx, new_state ); - _vbo_InvalidateState( ctx, new_state ); - _tnl_InvalidateState( ctx, new_state ); - GAMMA_CONTEXT(ctx)->new_gl_state |= new_state; -} - - -/* Initialize the context's hardware state. - */ -void gammaDDInitState( gammaContextPtr gmesa ) -{ - gmesa->new_state = 0; -} - -/* Initialize the driver's state functions. - */ -void gammaDDInitStateFuncs( GLcontext *ctx ) -{ - ctx->Driver.UpdateState = gammaDDUpdateState; - - ctx->Driver.Clear = gammaDDClear; - ctx->Driver.ClearIndex = NULL; - ctx->Driver.ClearColor = gammaDDClearColor; - ctx->Driver.DrawBuffer = gammaDDDrawBuffer; - ctx->Driver.ReadBuffer = gammaDDReadBuffer; - - ctx->Driver.IndexMask = NULL; - ctx->Driver.ColorMask = gammaDDColorMask; - - ctx->Driver.AlphaFunc = gammaDDAlphaFunc; - ctx->Driver.BlendEquationSeparate = gammaDDBlendEquationSeparate; - ctx->Driver.BlendFuncSeparate = gammaDDBlendFuncSeparate; - ctx->Driver.ClearDepth = gammaDDClearDepth; - ctx->Driver.CullFace = gammaDDCullFace; - ctx->Driver.FrontFace = gammaDDFrontFace; - ctx->Driver.DepthFunc = gammaDDDepthFunc; - ctx->Driver.DepthMask = gammaDDDepthMask; - ctx->Driver.DepthRange = gammaDDDepthRange; - ctx->Driver.Enable = gammaDDEnable; - ctx->Driver.Finish = gammaDDFinish; - ctx->Driver.Flush = gammaDDFlush; -#if 0 - ctx->Driver.Fogfv = gammaDDFogfv; -#endif - ctx->Driver.Hint = NULL; - ctx->Driver.LineWidth = gammaDDLineWidth; - ctx->Driver.LineStipple = gammaDDLineStipple; -#if ENABLELIGHTING - ctx->Driver.Lightfv = gammaDDLightfv; - ctx->Driver.LightModelfv = gammaDDLightModelfv; -#endif - ctx->Driver.LogicOpcode = gammaDDLogicalOpcode; - ctx->Driver.PointSize = gammaDDPointSize; - ctx->Driver.PolygonMode = gammaDDPolygonMode; - ctx->Driver.PolygonStipple = gammaDDPolygonStipple; - ctx->Driver.Scissor = gammaDDScissor; - ctx->Driver.ShadeModel = gammaDDShadeModel; - ctx->Driver.Viewport = gammaDDViewport; -} diff --git a/src/mesa/drivers/dri/gamma/gamma_tex.c b/src/mesa/drivers/dri/gamma/gamma_tex.c deleted file mode 100644 index bef8cf27dbc..00000000000 --- a/src/mesa/drivers/dri/gamma/gamma_tex.c +++ /dev/null @@ -1,434 +0,0 @@ - -#include "main/glheader.h" -#include "main/mtypes.h" -#include "main/colormac.h" -#include "main/imports.h" -#include "main/simple_list.h" -#include "main/enums.h" -#include "main/mm.h" -#include "main/texstore.h" -#include "main/teximage.h" -#include "main/texobj.h" - -#include "swrast/swrast.h" - -#include "gamma_context.h" - - -/* - * Compute the 'S2.4' lod bias factor from the floating point OpenGL bias. - */ -#if 0 -static GLuint gammaComputeLodBias(GLfloat bias) -{ - return bias; -} -#endif - -static void gammaSetTexWrapping(gammaTextureObjectPtr t, - GLenum wraps, GLenum wrapt) -{ - uint32_t t1 = t->TextureAddressMode; - uint32_t t2 = t->TextureReadMode; - - t1 &= ~(TAM_SWrap_Mask | TAM_TWrap_Mask); - t2 &= ~(TRM_UWrap_Mask | TRM_VWrap_Mask); - - if (wraps != GL_CLAMP) { - t1 |= TAM_SWrap_Repeat; - t2 |= TRM_UWrap_Repeat; - } - - if (wrapt != GL_CLAMP) { - t1 |= TAM_TWrap_Repeat; - t2 |= TRM_VWrap_Repeat; - } - - t->TextureAddressMode = t1; - t->TextureReadMode = t2; -} - - -static void gammaSetTexFilter(gammaContextPtr gmesa, - gammaTextureObjectPtr t, - GLenum minf, GLenum magf, - GLfloat bias) -{ - uint32_t t1 = t->TextureAddressMode; - uint32_t t2 = t->TextureReadMode; - - t2 &= ~(TRM_Mag_Mask | TRM_Min_Mask); - - switch (minf) { - case GL_NEAREST: - t1 &= ~TAM_LODEnable; - t2 &= ~TRM_MipMapEnable; - t2 |= TRM_Min_Nearest; - break; - case GL_LINEAR: - t1 &= ~TAM_LODEnable; - t2 &= ~TRM_MipMapEnable; - t2 |= TRM_Min_Linear; - break; - case GL_NEAREST_MIPMAP_NEAREST: - t2 |= TRM_Min_NearestMMNearest; - break; - case GL_LINEAR_MIPMAP_NEAREST: - t2 |= TRM_Min_LinearMMNearest; - break; - case GL_NEAREST_MIPMAP_LINEAR: - t2 |= TRM_Min_NearestMMLinear; - break; - case GL_LINEAR_MIPMAP_LINEAR: - t2 |= TRM_Min_LinearMMLinear; - break; - default: - break; - } - - switch (magf) { - case GL_NEAREST: - t2 |= TRM_Mag_Nearest; - break; - case GL_LINEAR: - t2 |= TRM_Mag_Linear; - break; - default: - break; - } - - t->TextureAddressMode = t1; - t->TextureReadMode = t2; -} - - -static void gammaSetTexBorderColor(gammaContextPtr gmesa, - gammaTextureObjectPtr t, - const GLfloat color[4]) -{ - GLubyte c[4]; - CLAMPED_FLOAT_TO_UBYTE(c[0], color[0]); - CLAMPED_FLOAT_TO_UBYTE(c[1], color[1]); - CLAMPED_FLOAT_TO_UBYTE(c[2], color[2]); - CLAMPED_FLOAT_TO_UBYTE(c[3], color[3]); - t->TextureBorderColor = PACK_COLOR_8888(c[0], c[1], c[2], c[3]); -} - - -static void gammaTexParameter( GLcontext *ctx, GLenum target, - struct gl_texture_object *tObj, - GLenum pname, const GLfloat *params ) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - gammaTextureObjectPtr t = (gammaTextureObjectPtr) tObj->DriverData; - if (!t) - return; - - /* Can't do the update now as we don't know whether to flush - * vertices or not. Setting gmesa->new_state means that - * gammaUpdateTextureState() will be called before any triangles are - * rendered. If a statechange has occurred, it will be detected at - * that point, and buffered vertices flushed. - */ - switch (pname) { - case GL_TEXTURE_MIN_FILTER: - case GL_TEXTURE_MAG_FILTER: - { - GLfloat bias = ctx->Texture.Unit[ctx->Texture.CurrentUnit].LodBias; - gammaSetTexFilter( gmesa, t, tObj->MinFilter, tObj->MagFilter, bias ); - } - break; - - case GL_TEXTURE_WRAP_S: - case GL_TEXTURE_WRAP_T: - gammaSetTexWrapping( t, tObj->WrapS, tObj->WrapT ); - break; - - case GL_TEXTURE_BORDER_COLOR: - gammaSetTexBorderColor( gmesa, t, tObj->BorderColor.f ); - break; - - case GL_TEXTURE_BASE_LEVEL: - case GL_TEXTURE_MAX_LEVEL: - case GL_TEXTURE_MIN_LOD: - case GL_TEXTURE_MAX_LOD: - /* This isn't the most efficient solution but there doesn't appear to - * be a nice alternative for Radeon. Since there's no LOD clamping, - * we just have to rely on loading the right subset of mipmap levels - * to simulate a clamped LOD. - */ - gammaSwapOutTexObj( gmesa, t ); - break; - - default: - return; - } - - if (t == gmesa->CurrentTexObj[0]) - gmesa->dirty |= GAMMA_UPLOAD_TEX0; - -#if 0 - if (t == gmesa->CurrentTexObj[1]) { - gmesa->dirty |= GAMMA_UPLOAD_TEX1; - } -#endif -} - - -static void gammaTexEnv( GLcontext *ctx, GLenum target, - GLenum pname, const GLfloat *param ) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT( ctx ); - GLuint unit = ctx->Texture.CurrentUnit; - - /* Only one env color. Need a fallback if env colors are different - * and texture setup references env color in both units. - */ - switch (pname) { - case GL_TEXTURE_ENV_COLOR: { - struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit]; - GLfloat *fc = texUnit->EnvColor; - GLuint r, g, b, a, col; - CLAMPED_FLOAT_TO_UBYTE(r, fc[0]); - CLAMPED_FLOAT_TO_UBYTE(g, fc[1]); - CLAMPED_FLOAT_TO_UBYTE(b, fc[2]); - CLAMPED_FLOAT_TO_UBYTE(a, fc[3]); - - col = ((a << 24) | - (r << 16) | - (g << 8) | - (b << 0)); - - break; - } - case GL_TEXTURE_ENV_MODE: - gmesa->TexEnvImageFmt[unit] = 0; /* force recalc of env state */ - break; - - case GL_TEXTURE_LOD_BIAS_EXT: -#if 0 /* ?!?!?! */ - { - struct gl_texture_object *tObj = ctx->Texture.Unit[unit]._Current; - gammaTextureObjectPtr t = (gammaTextureObjectPtr) tObj->DriverData; - (void) t; - /* XXX Looks like there's something missing here */ - } -#endif - break; - - default: - break; - } -} - -#if 0 -static void gammaTexImage1D( GLcontext *ctx, GLenum target, GLint level, - GLint internalFormat, - GLint width, GLint border, - GLenum format, GLenum type, - const GLvoid *pixels, - const struct gl_pixelstore_attrib *pack, - struct gl_texture_object *texObj, - struct gl_texture_image *texImage ) -{ - gammaTextureObjectPtr t = (gammaTextureObjectPtr) texObj->DriverData; - if (t) { - gammaSwapOutTexObj( GAMMA_CONTEXT(ctx), t ); - } - _mesa_store_teximage1d( ctx, target, level, internalFormat, - width, border, format, type, - pixels, pack, texObj, texImage ); -} -#endif - -#if 0 -static void gammaTexSubImage1D( GLcontext *ctx, - GLenum target, - GLint level, - GLint xoffset, - GLsizei width, - GLenum format, GLenum type, - const GLvoid *pixels, - const struct gl_pixelstore_attrib *pack, - struct gl_texture_object *texObj, - struct gl_texture_image *texImage ) -{ - gammaTextureObjectPtr t = (gammaTextureObjectPtr) texObj->DriverData; - if (t) { - gammaSwapOutTexObj( GAMMA_CONTEXT(ctx), t ); - } - _mesa_store_texsubimage1d(ctx, target, level, xoffset, width, - format, type, pixels, pack, texObj, - texImage); -} -#endif - -static void gammaTexImage2D( GLcontext *ctx, GLenum target, GLint level, - GLint internalFormat, - GLint width, GLint height, GLint border, - GLenum format, GLenum type, const GLvoid *pixels, - const struct gl_pixelstore_attrib *packing, - struct gl_texture_object *texObj, - struct gl_texture_image *texImage ) -{ - gammaTextureObjectPtr t = (gammaTextureObjectPtr) texObj->DriverData; - if (t) { - gammaSwapOutTexObj( GAMMA_CONTEXT(ctx), t ); - } - _mesa_store_teximage2d( ctx, target, level, internalFormat, - width, height, border, format, type, - pixels, packing, texObj, texImage ); -} - -static void gammaTexSubImage2D( GLcontext *ctx, - GLenum target, - GLint level, - GLint xoffset, GLint yoffset, - GLsizei width, GLsizei height, - GLenum format, GLenum type, - const GLvoid *pixels, - const struct gl_pixelstore_attrib *packing, - struct gl_texture_object *texObj, - struct gl_texture_image *texImage ) -{ - gammaTextureObjectPtr t = (gammaTextureObjectPtr) texObj->DriverData; - if (t) { - gammaSwapOutTexObj( GAMMA_CONTEXT(ctx), t ); - } - _mesa_store_texsubimage2d(ctx, target, level, xoffset, yoffset, width, - height, format, type, pixels, packing, texObj, - texImage); -} - -static void gammaBindTexture( GLcontext *ctx, GLenum target, - struct gl_texture_object *tObj ) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT( ctx ); - gammaTextureObjectPtr t = (gammaTextureObjectPtr) tObj->DriverData; - - if (!t) { - GLfloat bias = ctx->Texture.Unit[ctx->Texture.CurrentUnit].LodBias; - t = CALLOC_STRUCT(gamma_texture_object_t); - - /* Initialize non-image-dependent parts of the state: - */ - t->globj = tObj; - - t->TextureAddressMode = TextureAddressModeEnable | TAM_Operation_3D | - TAM_DY_Enable | TAM_LODEnable; - t->TextureReadMode = TextureReadModeEnable | TRM_PrimaryCacheEnable | - TRM_MipMapEnable | TRM_BorderClamp | TRM_Border; - t->TextureColorMode = TextureColorModeEnable; - t->TextureFilterMode = TextureFilterModeEnable; - - if (target == GL_TEXTURE_2D) { - t->TextureAddressMode |= TAM_TexMapType_2D; - t->TextureReadMode |= TRM_TexMapType_2D; - } - else if (target == GL_TEXTURE_1D) { - t->TextureAddressMode |= TAM_TexMapType_1D; - t->TextureReadMode |= TRM_TexMapType_1D; - } - - t->TextureColorMode = TextureColorModeEnable; - - t->TextureFilterMode = TextureFilterModeEnable; - -#ifdef MESA_LITTLE_ENDIAN - t->TextureFormat = (TF_LittleEndian | -#else - t->TextureFormat = (TF_BigEndian | -#endif - TF_ColorOrder_RGB | - TF_OutputFmt_Texel); - - t->dirty_images = ~0; - - tObj->DriverData = t; - make_empty_list( t ); - - gammaSetTexWrapping( t, tObj->WrapS, tObj->WrapT ); - gammaSetTexFilter( gmesa, t, tObj->MinFilter, tObj->MagFilter, bias ); - gammaSetTexBorderColor( gmesa, t, tObj->BorderColor.f ); - } -} - -static void gammaDeleteTexture( GLcontext *ctx, struct gl_texture_object *tObj ) -{ - gammaTextureObjectPtr t = (gammaTextureObjectPtr)tObj->DriverData; - - if (t) { - gammaContextPtr gmesa = GAMMA_CONTEXT( ctx ); -#if 0 - if (gmesa) - GAMMA_FIREVERTICES( gmesa ); -#endif - gammaDestroyTexObj( gmesa, t ); - tObj->DriverData = 0; - } - /* Free mipmap images and the texture object itself */ - _mesa_delete_texture_object(ctx, tObj); -} - -static GLboolean gammaIsTextureResident( GLcontext *ctx, - struct gl_texture_object *tObj ) -{ - gammaTextureObjectPtr t = (gammaTextureObjectPtr)tObj->DriverData; - return t && t->MemBlock; -} - -#ifdef UNUSED -/** - * Allocate a new texture object. - * Called via ctx->Driver.NewTextureObject. - * Note: this function will be called during context creation to - * allocate the default texture objects. - * Note: we could use containment here to 'derive' the driver-specific - * texture object from the core mesa gl_texture_object. Not done at this time. - */ -static struct gl_texture_object * -gammaNewTextureObject( GLcontext *ctx, GLuint name, GLenum target ) -{ - struct gl_texture_object *obj; - obj = _mesa_new_texture_object(ctx, name, target); - return obj; -} -#endif - -void gammaInitTextureObjects( GLcontext *ctx ) -{ - struct gl_texture_object *texObj; - GLuint tmp = ctx->Texture.CurrentUnit; - - ctx->Texture.CurrentUnit = 0; - - texObj = ctx->Texture.Unit[0].CurrentTex[TEXTURE_1D_INDEX]; - gammaBindTexture( ctx, GL_TEXTURE_1D, texObj ); - - texObj = ctx->Texture.Unit[0].CurrentTex[TEXTURE_2D_INDEX]; - gammaBindTexture( ctx, GL_TEXTURE_2D, texObj ); - -#if 0 - ctx->Texture.CurrentUnit = 1; - - texObj = ctx->Texture.Unit[1].CurrentTex[TEXTURE_1D_INDEX]; - gammaBindTexture( ctx, GL_TEXTURE_1D, texObj ); - - texObj = ctx->Texture.Unit[1].CurrentTex[TEXTURE_2D_INDEX]; - gammaBindTexture( ctx, GL_TEXTURE_2D, texObj ); -#endif - - ctx->Texture.CurrentUnit = tmp; -} - - -void gammaDDInitTextureFuncs( struct dd_function_table *functions ) -{ - functions->TexEnv = gammaTexEnv; - functions->TexImage2D = gammaTexImage2D; - functions->TexSubImage2D = gammaTexSubImage2D; - functions->BindTexture = gammaBindTexture; - functions->DeleteTexture = gammaDeleteTexture; - functions->TexParameter = gammaTexParameter; - functions->IsTextureResident = gammaIsTextureResident; -} diff --git a/src/mesa/drivers/dri/gamma/gamma_texmem.c b/src/mesa/drivers/dri/gamma/gamma_texmem.c deleted file mode 100644 index 45a0c0148e3..00000000000 --- a/src/mesa/drivers/dri/gamma/gamma_texmem.c +++ /dev/null @@ -1,535 +0,0 @@ - -#include <stdlib.h> -#include <stdio.h> - -#include "main/glheader.h" -#include "main/colormac.h" -#include "main/macros.h" -#include "main/mtypes.h" -#include "main/simple_list.h" -#include "main/enums.h" - -#include "main/mm.h" -#include "glint_dri.h" -#include "gamma_context.h" -#include "gamma_lock.h" -#include "gamma_macros.h" - -void gammaDestroyTexObj(gammaContextPtr gmesa, gammaTextureObjectPtr t) -{ - if (!t) return; - - /* This is sad - need to sync *in case* we upload a texture - * to this newly free memory... - */ - if (t->MemBlock) { - mmFreeMem(t->MemBlock); - t->MemBlock = 0; - - if (gmesa && t->age > gmesa->dirtyAge) - gmesa->dirtyAge = t->age; - } - - if (t->globj) - t->globj->DriverData = 0; - - if (gmesa) { - if (gmesa->CurrentTexObj[0] == t) { - gmesa->CurrentTexObj[0] = 0; - gmesa->dirty &= ~GAMMA_UPLOAD_TEX0; - } - -#if 0 - if (gmesa->CurrentTexObj[1] == t) { - gmesa->CurrentTexObj[1] = 0; - gmesa->dirty &= ~GAMMA_UPLOAD_TEX1; - } -#endif - } - - remove_from_list(t); - free(t); -} - - -void gammaSwapOutTexObj(gammaContextPtr gmesa, gammaTextureObjectPtr t) -{ -/* fprintf(stderr, "%s\n", __FUNCTION__); */ - - if (t->MemBlock) { - mmFreeMem(t->MemBlock); - t->MemBlock = 0; - - if (t->age > gmesa->dirtyAge) - gmesa->dirtyAge = t->age; - } - - t->dirty_images = ~0; - move_to_tail(&(gmesa->SwappedOut), t); -} - - - -/* Upload an image from mesa's internal copy. - */ -static void gammaUploadTexLevel( gammaContextPtr gmesa, gammaTextureObjectPtr t, int level ) -{ - const struct gl_texture_image *image = t->image[level].image; - int i,j; - int l2d; -#if 0 - int offset = 0; -#endif - int words, depthLog2; - - /* fprintf(stderr, "%s\n", __FUNCTION__); */ - - l2d = 5; /* 32bits per texel == 1<<5 */ - - if (level == 0) { - t->TextureAddressMode &= ~(TAM_WidthMask | TAM_HeightMask); - t->TextureAddressMode |= (image->WidthLog2 << 9) | - (image->HeightLog2 << 13); - t->TextureReadMode &= ~(TRM_WidthMask | TRM_HeightMask | - TRM_DepthMask | TRM_Border | - TRM_Patch); - t->TextureReadMode |= (image->WidthLog2 << 1) | - (image->HeightLog2 << 5) | - (l2d << 9); - t->TextureFormat &= ~(TF_CompnentsMask | TF_OneCompFmt_Mask); - } - - t->TextureBaseAddr[level] = /* ??? */ - (unsigned long)(t->image[level].offset + t->BufAddr) << 5; - - CALC_LOG2(depthLog2, 1<<l2d); - words = (image->Width * image->Height) >> (5-depthLog2); - - CHECK_DMA_BUFFER(gmesa, 3); - WRITE(gmesa->buf, LBWindowBase, t->TextureBaseAddr[level] >> 5); - WRITE(gmesa->buf, TextureCacheControl, (TCC_Enable | TCC_Invalidate)); - WRITE(gmesa->buf, WaitForCompletion, 0); - FLUSH_DMA_BUFFER(gmesa); - - switch (t->image[level].internalFormat) { - case GL_RGB: - case 3: - { - GLubyte *src = (GLubyte *)image->Data; - - if (level == 0) - t->TextureFormat |= TF_Compnents_3; - -#if 0 /* This is the texture download code we SHOULD be using */ - /* In the routines below, but this causes an DMA overrun - WHY ? */ - while (offset < words) { - int count = gmesa->bufSize; - int i; - count -= 3; - if (count > words-offset) count = words-offset; - - gmesa->buf->i = GlintTextureDownloadOffsetTag; - gmesa->buf++; - gmesa->buf->i = offset; - gmesa->buf++; - gmesa->buf->i = (GlintTextureDataTag | ((count-1) << 16)); - gmesa->buf++; - - for (i = 0; i < count; i++) { - gmesa->buf->i = PACK_COLOR_565(src[0],src[1],src[2]); - gmesa->buf++; - src += 3; - } - - gmesa->bufCount = count+3; /* texture data + 3 values */ - offset += count; - - FLUSH_DMA_BUFFER(gmesa); - } -#else - /* The UGLY way, and SLOW !, but the above sometimes causes - * a DMA overrun error ??? FIXME ! */ - - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, TextureDownloadOffset, 0); - for (i = 0; i < words; i++) { - unsigned int data; - data = PACK_COLOR_565(src[0],src[1],src[2]); - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, TextureData, data); - src += 3; - } - FLUSH_DMA_BUFFER(gmesa); -#endif - } - break; - - case GL_RGBA: - case 4: - { - GLubyte *src = (GLubyte *)image->Data; - - if (level == 0) - t->TextureFormat |= TF_Compnents_4; - - /* The UGLY way, and SLOW !, but the above sometimes causes - * a DMA overrun error ??? FIXME ! */ - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, TextureDownloadOffset, 0); - for (i = 0; i < words; i++) { - unsigned int data; - data = PACK_COLOR_8888(src[0],src[1],src[2],src[3]); - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, TextureData, data); - src += 4; - } - FLUSH_DMA_BUFFER(gmesa); - } - break; - - case GL_LUMINANCE: - { - GLubyte *src = (GLubyte *)image->Data; - - if (level == 0) - t->TextureFormat |= TF_Compnents_1 | TF_OneCompFmt_Lum; - - /* The UGLY way, and SLOW !, but the above sometimes causes - * a DMA overrun error ??? FIXME ! */ - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, TextureDownloadOffset, 0); - for (i = 0; i < words; i++) { - unsigned int data; - data = PACK_COLOR_888(src[0],src[0],src[0]); - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, TextureData, data); - src ++; - } - FLUSH_DMA_BUFFER(gmesa); - } - break; - - case GL_INTENSITY: - { - GLubyte *src = (GLubyte *)image->Data; - - if (level == 0) - t->TextureFormat |= TF_Compnents_1 | TF_OneCompFmt_Intensity; - - /* The UGLY way, and SLOW !, but the above sometimes causes - * a DMA overrun error ??? FIXME ! */ - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, TextureDownloadOffset, 0); - for (i = 0; i < words; i++) { - unsigned int data; - data = PACK_COLOR_8888(src[0],src[0],src[0],src[0]); - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, TextureData, data); - src ++; - } - FLUSH_DMA_BUFFER(gmesa); - } - break; - - case GL_LUMINANCE_ALPHA: - { - GLubyte *src = (GLubyte *)image->Data; - - if (level == 0) - t->TextureFormat |= TF_Compnents_2; - - /* The UGLY way, and SLOW !, but the above sometimes causes - * a DMA overrun error ??? FIXME ! */ - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, TextureDownloadOffset, 0); - for (i = 0; i < words; i++) { - unsigned int data; - data = PACK_COLOR_8888(src[0],src[0],src[0],src[1]); - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, TextureData, data); - src += 2; - } - FLUSH_DMA_BUFFER(gmesa); - } - break; - - case GL_ALPHA: - { - GLubyte *src = (GLubyte *)image->Data; - - if (level == 0) - t->TextureFormat |= TF_Compnents_1 | TF_OneCompFmt_Alpha; - - /* The UGLY way, and SLOW !, but the above sometimes causes - * a DMA overrun error ??? FIXME ! */ - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, TextureDownloadOffset, 0); - for (i = 0; i < words; i++) { - unsigned int data; - data = PACK_COLOR_8888(255,255,255,src[0]); - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, TextureData, data); - src += 1; - } - FLUSH_DMA_BUFFER(gmesa); - } - break; - - /* TODO: Translate color indices *now*: - */ - case GL_COLOR_INDEX: - { - GLubyte *dst = (GLubyte *)(t->BufAddr + t->image[level].offset); - GLubyte *src = (GLubyte *)image->Data; - - for (j = 0 ; j < image->Height ; j++, dst += t->Pitch) { - for (i = 0 ; i < image->Width ; i++) { - dst[i] = src[0]; - src += 1; - } - } - } - break; - - default: - fprintf(stderr, "Not supported texture format %s\n", - _mesa_lookup_enum_by_nr(image->Format)); - } - - CHECK_DMA_BUFFER(gmesa, 2); - WRITE(gmesa->buf, WaitForCompletion, 0); - WRITE(gmesa->buf, LBWindowBase, gmesa->LBWindowBase); -} - -void gammaPrintLocalLRU( gammaContextPtr gmesa ) -{ - gammaTextureObjectPtr t; - int sz = 1 << (gmesa->gammaScreen->logTextureGranularity); - - foreach( t, &gmesa->TexObjList ) { - if (!t->globj) - fprintf(stderr, "Placeholder %d at %x sz %x\n", - t->MemBlock->ofs / sz, - t->MemBlock->ofs, - t->MemBlock->size); - else - fprintf(stderr, "Texture at %x sz %x\n", - t->MemBlock->ofs, - t->MemBlock->size); - - } -} - -void gammaPrintGlobalLRU( gammaContextPtr gmesa ) -{ - int i, j; - GAMMATextureRegionPtr list = gmesa->sarea->texList; - - for (i = 0, j = GAMMA_NR_TEX_REGIONS ; i < GAMMA_NR_TEX_REGIONS ; i++) { - fprintf(stderr, "list[%d] age %d next %d prev %d\n", - j, list[j].age, list[j].next, list[j].prev); - j = list[j].next; - if (j == GAMMA_NR_TEX_REGIONS) break; - } - - if (j != GAMMA_NR_TEX_REGIONS) - fprintf(stderr, "Loop detected in global LRU\n"); -} - - -void gammaResetGlobalLRU( gammaContextPtr gmesa ) -{ - GAMMATextureRegionPtr list = gmesa->sarea->texList; - int sz = 1 << gmesa->gammaScreen->logTextureGranularity; - int i; - - /* (Re)initialize the global circular LRU list. The last element - * in the array (GAMMA_NR_TEX_REGIONS) is the sentinal. Keeping it - * at the end of the array allows it to be addressed rationally - * when looking up objects at a particular location in texture - * memory. - */ - for (i = 0 ; (i+1) * sz <= gmesa->gammaScreen->textureSize ; i++) { - list[i].prev = i-1; - list[i].next = i+1; - list[i].age = 0; - } - - i--; - list[0].prev = GAMMA_NR_TEX_REGIONS; - list[i].prev = i-1; - list[i].next = GAMMA_NR_TEX_REGIONS; - list[GAMMA_NR_TEX_REGIONS].prev = i; - list[GAMMA_NR_TEX_REGIONS].next = 0; - gmesa->sarea->texAge = 0; -} - - -void gammaUpdateTexLRU( gammaContextPtr gmesa, gammaTextureObjectPtr t ) -{ - int i; - int logsz = gmesa->gammaScreen->logTextureGranularity; - int start = t->MemBlock->ofs >> logsz; - int end = (t->MemBlock->ofs + t->MemBlock->size - 1) >> logsz; - GAMMATextureRegionPtr list = gmesa->sarea->texList; - - gmesa->texAge = ++gmesa->sarea->texAge; - - /* Update our local LRU - */ - move_to_head( &(gmesa->TexObjList), t ); - - /* Update the global LRU - */ - for (i = start ; i <= end ; i++) { - - list[i].in_use = 1; - list[i].age = gmesa->texAge; - - /* remove_from_list(i) - */ - list[(unsigned)list[i].next].prev = list[i].prev; - list[(unsigned)list[i].prev].next = list[i].next; - - /* insert_at_head(list, i) - */ - list[i].prev = GAMMA_NR_TEX_REGIONS; - list[i].next = list[GAMMA_NR_TEX_REGIONS].next; - list[(unsigned)list[GAMMA_NR_TEX_REGIONS].next].prev = i; - list[GAMMA_NR_TEX_REGIONS].next = i; - } -} - - -/* Called for every shared texture region which has increased in age - * since we last held the lock. - * - * Figures out which of our textures have been ejected by other clients, - * and pushes a placeholder texture onto the LRU list to represent - * the other client's textures. - */ -void gammaTexturesGone( gammaContextPtr gmesa, - GLuint offset, - GLuint size, - GLuint in_use ) -{ - gammaTextureObjectPtr t, tmp; - - foreach_s ( t, tmp, &gmesa->TexObjList ) { - - if (t->MemBlock->ofs >= offset + size || - t->MemBlock->ofs + t->MemBlock->size <= offset) - continue; - - /* It overlaps - kick it off. Need to hold onto the currently bound - * objects, however. - */ - gammaSwapOutTexObj( gmesa, t ); - } - - if (in_use) { - t = (gammaTextureObjectPtr) calloc(1,sizeof(*t)); - if (!t) return; - - t->MemBlock = mmAllocMem( gmesa->texHeap, size, 0, offset); - insert_at_head( &gmesa->TexObjList, t ); - } - - /* Reload any lost textures referenced by current vertex buffer. - */ -#if 0 - if (gmesa->vertex_buffer) { - int i, j; - - fprintf(stderr, "\n\nreload tex\n"); - - for (i = 0 ; i < gmesa->statenr ; i++) { - for (j = 0 ; j < 2 ; j++) { - gammaTextureObjectPtr t = gmesa->state_tex[j][i]; - if (t) { - if (t->MemBlock == 0) - gammaUploadTexImages( gmesa, t ); - } - } - } - - /* Hard to do this with the lock held: - */ -/* GAMMA_FIREVERTICES( gmesa ); */ - } -#endif -} - - - - - -/* This is called with the lock held. May have to eject our own and/or - * other client's texture objects to make room for the upload. - */ -void gammaUploadTexImages( gammaContextPtr gmesa, gammaTextureObjectPtr t ) -{ - int i; - int ofs; - int numLevels; - - /* /fprintf(stderr, "%s\n", __FUNCTION__); */ -#if 0 - LOCK_HARDWARE( gmesa ); -#endif - - /* Do we need to eject LRU texture objects? - */ - if (!t->MemBlock) { - while (1) - { - t->MemBlock = mmAllocMem( gmesa->texHeap, t->totalSize, 12, 0 ); - if (t->MemBlock) - break; - - if (gmesa->TexObjList.prev == gmesa->CurrentTexObj[0] || - gmesa->TexObjList.prev == gmesa->CurrentTexObj[1]) { - fprintf(stderr, "Hit bound texture in upload\n"); - gammaPrintLocalLRU( gmesa ); - return; - } - - if (gmesa->TexObjList.prev == &(gmesa->TexObjList)) { - fprintf(stderr, "Failed to upload texture, sz %d\n", t->totalSize); - mmDumpMemInfo( gmesa->texHeap ); - return; - } - - gammaSwapOutTexObj( gmesa, gmesa->TexObjList.prev ); - } - - ofs = t->MemBlock->ofs; - t->BufAddr = (char *)(unsigned long)(gmesa->LBWindowBase + ofs); /* ??? */ - - if (t == gmesa->CurrentTexObj[0]) - gmesa->dirty |= GAMMA_UPLOAD_TEX0; - -#if 0 - if (t == gmesa->CurrentTexObj[1]) - gmesa->dirty |= GAMMA_UPLOAD_TEX1; -#endif - - gammaUpdateTexLRU( gmesa, t ); - } - -#if 0 - if (gmesa->dirtyAge >= GET_DISPATCH_AGE(gmesa)) - gammaWaitAgeLocked( gmesa, gmesa->dirtyAge ); -#endif - - numLevels = t->lastLevel - t->firstLevel + 1; - for (i = 0 ; i < numLevels ; i++) - if (t->dirty_images & (1<<i)) - gammaUploadTexLevel( gmesa, t, i ); - - t->dirty_images = 0; - -#if 0 - UNLOCK_HARDWARE( gmesa ); -#endif -} diff --git a/src/mesa/drivers/dri/gamma/gamma_texstate.c b/src/mesa/drivers/dri/gamma/gamma_texstate.c deleted file mode 100644 index 46f39135dc6..00000000000 --- a/src/mesa/drivers/dri/gamma/gamma_texstate.c +++ /dev/null @@ -1,215 +0,0 @@ - -#include <stdlib.h> -#include <stdio.h> - -#include "main/glheader.h" -#include "main/macros.h" -#include "main/mtypes.h" -#include "main/simple_list.h" -#include "main/enums.h" - -#include "main/mm.h" -#include "gamma_context.h" - -static void gammaSetTexImages( gammaContextPtr gmesa, - struct gl_texture_object *tObj ) -{ - GLuint height, width, pitch, i, log_pitch; - gammaTextureObjectPtr t = (gammaTextureObjectPtr) tObj->DriverData; - const struct gl_texture_image *baseImage = tObj->Image[0][tObj->BaseLevel]; - GLint firstLevel, lastLevel, numLevels; - GLint log2Width, log2Height; - - /* fprintf(stderr, "%s\n", __FUNCTION__); */ - - t->texelBytes = 2; - - /* Compute which mipmap levels we really want to send to the hardware. - * This depends on the base image size, GL_TEXTURE_MIN_LOD, - * GL_TEXTURE_MAX_LOD, GL_TEXTURE_BASE_LEVEL, and GL_TEXTURE_MAX_LEVEL. - * Yes, this looks overly complicated, but it's all needed. - */ - if (tObj->MinFilter == GL_LINEAR || tObj->MinFilter == GL_NEAREST) { - firstLevel = lastLevel = tObj->BaseLevel; - } - else { - firstLevel = tObj->BaseLevel + (GLint) (tObj->MinLod + 0.5); - firstLevel = MAX2(firstLevel, tObj->BaseLevel); - lastLevel = tObj->BaseLevel + (GLint) (tObj->MaxLod + 0.5); - lastLevel = MAX2(lastLevel, tObj->BaseLevel); - lastLevel = MIN2(lastLevel, tObj->BaseLevel + baseImage->MaxLog2); - lastLevel = MIN2(lastLevel, tObj->MaxLevel); - lastLevel = MAX2(firstLevel, lastLevel); /* need at least one level */ - } - - /* save these values */ - t->firstLevel = firstLevel; - t->lastLevel = lastLevel; - - numLevels = lastLevel - firstLevel + 1; - - log2Width = tObj->Image[0][firstLevel]->WidthLog2; - log2Height = tObj->Image[0][firstLevel]->HeightLog2; - - - /* Figure out the amount of memory required to hold all the mipmap - * levels. Choose the smallest pitch to accomodate the largest - * mipmap: - */ - width = tObj->Image[0][firstLevel]->Width * t->texelBytes; - for (pitch = 32, log_pitch=2 ; pitch < width ; pitch *= 2 ) - log_pitch++; - - /* All images must be loaded at this pitch. Count the number of - * lines required: - */ - for ( height = i = 0 ; i < numLevels ; i++ ) { - t->image[i].image = tObj->Image[0][firstLevel + i]; - t->image[i].offset = height * pitch; - t->image[i].internalFormat = baseImage->Format; - height += t->image[i].image->Height; - t->TextureBaseAddr[i] = /* ??? */ - (unsigned long)(t->image[i].offset + t->BufAddr) << 5; - - } - - t->Pitch = pitch; - t->totalSize = height*pitch; - t->max_level = i-1; - gmesa->dirty |= GAMMA_UPLOAD_TEX0 /* | GAMMA_UPLOAD_TEX1*/; - - gammaUploadTexImages( gmesa, t ); -} - -static void gammaUpdateTexEnv( GLcontext *ctx, GLuint unit ) -{ - const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit]; - const struct gl_texture_object *tObj = texUnit->_Current; - const GLuint format = tObj->Image[0][tObj->BaseLevel]->Format; - gammaTextureObjectPtr t = (gammaTextureObjectPtr)tObj->DriverData; - GLuint tc; - - /* fprintf(stderr, "%s\n", __FUNCTION__); */ - - tc = t->TextureColorMode & ~(TCM_BaseFormatMask | TCM_ApplicationMask); - - switch (format) { - case GL_RGB: - tc |= TCM_BaseFormat_RGB; - break; - case GL_LUMINANCE: - tc |= TCM_BaseFormat_Lum; - break; - case GL_ALPHA: - tc |= TCM_BaseFormat_Alpha; - break; - case GL_LUMINANCE_ALPHA: - tc |= TCM_BaseFormat_LumAlpha; - break; - case GL_INTENSITY: - tc |= TCM_BaseFormat_Intensity; - break; - case GL_RGBA: - tc |= TCM_BaseFormat_RGBA; - break; - case GL_COLOR_INDEX: - break; - } - - switch (texUnit->EnvMode) { - case GL_REPLACE: - tc |= TCM_Replace; - break; - case GL_MODULATE: - tc |= TCM_Modulate; - break; - case GL_ADD: - /* do nothing ???*/ - break; - case GL_DECAL: - tc |= TCM_Decal; - break; - case GL_BLEND: - tc |= TCM_Blend; - break; - default: - fprintf(stderr, "unknown tex env mode"); - return; - } - - t->TextureColorMode = tc; -} - - - - -static void gammaUpdateTexUnit( GLcontext *ctx, GLuint unit ) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit]; - - /* fprintf(stderr, "%s\n", __FUNCTION__); */ - - if (texUnit->_ReallyEnabled == TEXTURE_2D_BIT) - { - struct gl_texture_object *tObj = texUnit->_Current; - gammaTextureObjectPtr t = (gammaTextureObjectPtr)tObj->DriverData; - - /* Upload teximages (not pipelined) - */ - if (t->dirty_images) { - gammaSetTexImages( gmesa, tObj ); - if (!t->MemBlock) { - FALLBACK( gmesa, GAMMA_FALLBACK_TEXTURE, GL_TRUE ); - return; - } - } - -#if 0 - if (tObj->Image[0][tObj->BaseLevel]->Border > 0) { - FALLBACK( gmesa, GAMMA_FALLBACK_TEXTURE, GL_TRUE ); - return; - } -#endif - - /* Update state if this is a different texture object to last - * time. - */ - if (gmesa->CurrentTexObj[unit] != t) { - gmesa->dirty |= GAMMA_UPLOAD_TEX0 /* << unit */; - gmesa->CurrentTexObj[unit] = t; - gammaUpdateTexLRU( gmesa, t ); /* done too often */ - } - - /* Update texture environment if texture object image format or - * texture environment state has changed. - */ - if (tObj->Image[0][tObj->BaseLevel]->Format != gmesa->TexEnvImageFmt[unit]) { - gmesa->TexEnvImageFmt[unit] = tObj->Image[0][tObj->BaseLevel]->Format; - gammaUpdateTexEnv( ctx, unit ); - } - } - else if (texUnit->_ReallyEnabled) { - FALLBACK( gmesa, GAMMA_FALLBACK_TEXTURE, GL_TRUE ); - } - else /*if (gmesa->CurrentTexObj[unit])*/ { - gmesa->CurrentTexObj[unit] = 0; - gmesa->TexEnvImageFmt[unit] = 0; - gmesa->dirty &= ~(GAMMA_UPLOAD_TEX0<<unit); - } -} - - -void gammaUpdateTextureState( GLcontext *ctx ) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - /* fprintf(stderr, "%s\n", __FUNCTION__); */ - FALLBACK( gmesa, GAMMA_FALLBACK_TEXTURE, GL_FALSE ); - gammaUpdateTexUnit( ctx, 0 ); -#if 0 - gammaUpdateTexUnit( ctx, 1 ); -#endif -} - - - diff --git a/src/mesa/drivers/dri/gamma/gamma_tris.c b/src/mesa/drivers/dri/gamma/gamma_tris.c deleted file mode 100644 index babe964951b..00000000000 --- a/src/mesa/drivers/dri/gamma/gamma_tris.c +++ /dev/null @@ -1,660 +0,0 @@ -/* - * Copyright 2001 by Alan Hourihane. - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that - * copyright notice and this permission notice appear in supporting - * documentation, and that the name of Alan Hourihane not be used in - * advertising or publicity pertaining to distribution of the software without - * specific, written prior permission. Alan Hourihane makes no representations - * about the suitability of this software for any purpose. It is provided - * "as is" without express or implied warranty. - * - * ALAN HOURIHANE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO - * EVENT SHALL ALAN HOURIHANE BE LIABLE FOR ANY SPECIAL, INDIRECT OR - * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - * - * Authors: Alan Hourihane, <[email protected]> - * Keith Whitwell, <[email protected]> - * - * 3DLabs Gamma driver. - */ - -#include "gamma_context.h" -#include "gamma_macros.h" -#include "gamma_vb.h" -#include "gamma_tris.h" - -#include "main/glheader.h" -#include "main/mtypes.h" -#include "main/macros.h" -#include "main/colormac.h" - -#include "swrast/swrast.h" -#include "swrast_setup/swrast_setup.h" -#include "tnl/tnl.h" -#include "tnl/t_context.h" -#include "tnl/t_pipeline.h" - - -/*********************************************************************** - * Build hardware rasterization functions * - ***********************************************************************/ - -#define GAMMA_RAST_ALPHA_BIT 0x01 -#define GAMMA_RAST_TEX_BIT 0x02 -#define GAMMA_RAST_FLAT_BIT 0x04 - -static gamma_point_func gamma_point_tab[0x8]; -static gamma_line_func gamma_line_tab[0x8]; -static gamma_tri_func gamma_tri_tab[0x8]; -static gamma_quad_func gamma_quad_tab[0x8]; - -#define IND (0) -#define TAG(x) x -#include "gamma_tritmp.h" - -#define IND (GAMMA_RAST_ALPHA_BIT) -#define TAG(x) x##_alpha -#include "gamma_tritmp.h" - -#define IND (GAMMA_RAST_TEX_BIT) -#define TAG(x) x##_tex -#include "gamma_tritmp.h" - -#define IND (GAMMA_RAST_ALPHA_BIT|GAMMA_RAST_TEX_BIT) -#define TAG(x) x##_alpha_tex -#include "gamma_tritmp.h" - -#define IND (GAMMA_RAST_FLAT_BIT) -#define TAG(x) x##_flat -#include "gamma_tritmp.h" - -#define IND (GAMMA_RAST_ALPHA_BIT|GAMMA_RAST_FLAT_BIT) -#define TAG(x) x##_alpha_flat -#include "gamma_tritmp.h" - -#define IND (GAMMA_RAST_TEX_BIT|GAMMA_RAST_FLAT_BIT) -#define TAG(x) x##_tex_flat -#include "gamma_tritmp.h" - -#define IND (GAMMA_RAST_ALPHA_BIT|GAMMA_RAST_TEX_BIT|GAMMA_RAST_FLAT_BIT) -#define TAG(x) x##_alpha_tex_flat -#include "gamma_tritmp.h" - - -static void init_rast_tab( void ) -{ - gamma_init(); - gamma_init_alpha(); - gamma_init_tex(); - gamma_init_alpha_tex(); - gamma_init_flat(); - gamma_init_alpha_flat(); - gamma_init_tex_flat(); - gamma_init_alpha_tex_flat(); -} - -/*********************************************************************** - * Rasterization fallback helpers * - ***********************************************************************/ - - -/* This code is hit only when a mix of accelerated and unaccelerated - * primitives are being drawn, and only for the unaccelerated - * primitives. - */ -static void -gamma_fallback_quad( gammaContextPtr gmesa, - const gammaVertex *v0, - const gammaVertex *v1, - const gammaVertex *v2, - const gammaVertex *v3 ) -{ - GLcontext *ctx = gmesa->glCtx; - SWvertex v[4]; - gamma_translate_vertex( ctx, v0, &v[0] ); - gamma_translate_vertex( ctx, v1, &v[1] ); - gamma_translate_vertex( ctx, v2, &v[2] ); - gamma_translate_vertex( ctx, v3, &v[3] ); - _swrast_Quad( ctx, &v[0], &v[1], &v[2], &v[3] ); -} - -static void -gamma_fallback_tri( gammaContextPtr gmesa, - const gammaVertex *v0, - const gammaVertex *v1, - const gammaVertex *v2 ) -{ - GLcontext *ctx = gmesa->glCtx; - SWvertex v[3]; - gamma_translate_vertex( ctx, v0, &v[0] ); - gamma_translate_vertex( ctx, v1, &v[1] ); - gamma_translate_vertex( ctx, v2, &v[2] ); - _swrast_Triangle( ctx, &v[0], &v[1], &v[2] ); -} - -static void -gamma_fallback_line( gammaContextPtr gmesa, - const gammaVertex *v0, - const gammaVertex *v1 ) -{ - GLcontext *ctx = gmesa->glCtx; - SWvertex v[2]; - gamma_translate_vertex( ctx, v0, &v[0] ); - gamma_translate_vertex( ctx, v1, &v[1] ); - _swrast_Line( ctx, &v[0], &v[1] ); -} - - -#if 0 -static void -gamma_fallback_point( gammaContextPtr gmesa, - const gammaVertex *v0 ) -{ - GLcontext *ctx = gmesa->glCtx; - SWvertex v[1]; - gamma_translate_vertex( ctx, v0, &v[0] ); - _swrast_Point( ctx, &v[0] ); -} -#endif - - -/*********************************************************************** - * Choose rasterization functions * - ***********************************************************************/ - -#define _GAMMA_NEW_RASTER_STATE (_NEW_FOG | \ - _NEW_TEXTURE | \ - _DD_NEW_TRI_SMOOTH | \ - _DD_NEW_LINE_SMOOTH | \ - _DD_NEW_POINT_SMOOTH | \ - _DD_NEW_TRI_STIPPLE | \ - _DD_NEW_LINE_STIPPLE) - -#define LINE_FALLBACK (0) -#define TRI_FALLBACK (0) - -static void gammaChooseRasterState(GLcontext *ctx) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - GLuint flags = ctx->_TriangleCaps; - GLuint ind = 0; - - if ( ctx->Line.SmoothFlag || - ctx->Polygon.SmoothFlag || - ctx->Point.SmoothFlag ) - gmesa->Begin |= B_AntiAliasEnable; - else - gmesa->Begin &= ~B_AntiAliasEnable; - - if ( ctx->Texture.Unit[0]._ReallyEnabled ) { - ind |= GAMMA_RAST_TEX_BIT; - gmesa->Begin |= B_TextureEnable; - } else - gmesa->Begin &= ~B_TextureEnable; - - if (flags & DD_LINE_STIPPLE) - gmesa->Begin |= B_LineStippleEnable; - else - gmesa->Begin &= ~B_LineStippleEnable; - - if (flags & DD_TRI_STIPPLE) - gmesa->Begin |= B_AreaStippleEnable; - else - gmesa->Begin &= ~B_AreaStippleEnable; - - if (ctx->Fog.Enabled) - gmesa->Begin |= B_FogEnable; - else - gmesa->Begin &= ~B_FogEnable; - - if (ctx->Color.BlendEnabled || ctx->Color.AlphaEnabled) - ind |= GAMMA_RAST_ALPHA_BIT; - - if ( flags & DD_FLATSHADE ) - ind |= GAMMA_RAST_FLAT_BIT; - - gmesa->draw_line = gamma_line_tab[ind]; - gmesa->draw_tri = gamma_tri_tab[ind]; - gmesa->draw_quad = gamma_quad_tab[ind]; - gmesa->draw_point = gamma_point_tab[ind]; - - /* Hook in fallbacks for specific primitives. CURRENTLY DISABLED - */ - if (flags & LINE_FALLBACK) - gmesa->draw_line = gamma_fallback_line; - - if (flags & TRI_FALLBACK) { - gmesa->draw_tri = gamma_fallback_tri; - gmesa->draw_quad = gamma_fallback_quad; - } -} - - - - -/*********************************************************************** - * Macros for t_dd_tritmp.h to draw basic primitives * - ***********************************************************************/ - -#define TRI( a, b, c ) \ -do { \ - gmesa->draw_tri( gmesa, a, b, c ); \ -} while (0) - -#define QUAD( a, b, c, d ) \ -do { \ - gmesa->draw_quad( gmesa, a, b, c, d ); \ -} while (0) - -#define LINE( v0, v1 ) \ -do { \ - gmesa->draw_line( gmesa, v0, v1 ); \ -} while (0) - -#define POINT( v0 ) \ -do { \ - gmesa->draw_point( gmesa, v0 ); \ -} while (0) - - -/*********************************************************************** - * Build render functions from dd templates * - ***********************************************************************/ - -#define GAMMA_OFFSET_BIT 0x01 -#define GAMMA_TWOSIDE_BIT 0x02 -#define GAMMA_UNFILLED_BIT 0x04 -#define GAMMA_FALLBACK_BIT 0x08 -#define GAMMA_MAX_TRIFUNC 0x10 - - -static struct { - tnl_points_func points; - tnl_line_func line; - tnl_triangle_func triangle; - tnl_quad_func quad; -} rast_tab[GAMMA_MAX_TRIFUNC]; - - -#define DO_FALLBACK (IND & GAMMA_FALLBACK_BIT) -#define DO_OFFSET 0 /* (IND & GAMMA_OFFSET_BIT) */ -#define DO_UNFILLED 0 /* (IND & GAMMA_UNFILLED_BIT) */ -#define DO_TWOSIDE (IND & GAMMA_TWOSIDE_BIT) -#define DO_FLAT 0 -#define DO_TRI 1 -#define DO_QUAD 1 -#define DO_LINE 1 -#define DO_POINTS 1 -#define DO_FULL_QUAD 1 - -#define HAVE_RGBA 1 -#define HAVE_SPEC 0 -#define HAVE_BACK_COLORS 0 -#define HAVE_HW_FLATSHADE 1 -#define VERTEX gammaVertex -#define TAB rast_tab - -#define DEPTH_SCALE 1.0 -#define UNFILLED_TRI unfilled_tri -#define UNFILLED_QUAD unfilled_quad -#define VERT_X(_v) _v->v.x -#define VERT_Y(_v) _v->v.y -#define VERT_Z(_v) _v->v.z -#define AREA_IS_CCW( a ) (a > 0) -#define GET_VERTEX(e) (gmesa->verts + (e * gmesa->vertex_size * sizeof(int))) - -#define VERT_SET_RGBA( v, c ) \ -do { \ - UNCLAMPED_FLOAT_TO_UBYTE(v->ub4[4][0], (c)[0]); \ - UNCLAMPED_FLOAT_TO_UBYTE(v->ub4[4][1], (c)[1]); \ - UNCLAMPED_FLOAT_TO_UBYTE(v->ub4[4][2], (c)[2]); \ - UNCLAMPED_FLOAT_TO_UBYTE(v->ub4[4][3], (c)[3]); \ -} while (0) -#define VERT_COPY_RGBA( v0, v1 ) v0->ui[4] = v1->ui[4] -#define VERT_SAVE_RGBA( idx ) color[idx] = v[idx]->ui[4] -#define VERT_RESTORE_RGBA( idx ) v[idx]->ui[4] = color[idx] - -#define LOCAL_VARS(n) \ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); \ - GLuint color[n] = { 0 }; \ - (void) color; - - -/*********************************************************************** - * Helpers for rendering unfilled primitives * - ***********************************************************************/ - -static const GLuint hw_prim[GL_POLYGON+1] = { - B_PrimType_Points, - B_PrimType_Lines, - B_PrimType_Lines, - B_PrimType_Lines, - B_PrimType_Triangles, - B_PrimType_Triangles, - B_PrimType_Triangles, - B_PrimType_Triangles, - B_PrimType_Triangles, - B_PrimType_Triangles -}; - -static void gammaResetLineStipple( GLcontext *ctx ); -static void gammaRasterPrimitive( GLcontext *ctx, GLuint hwprim ); -static void gammaRenderPrimitive( GLcontext *ctx, GLenum prim ); - -#define RASTERIZE(x) if (gmesa->hw_primitive != hw_prim[x]) \ - gammaRasterPrimitive( ctx, hw_prim[x] ) -#define RENDER_PRIMITIVE gmesa->render_primitive -#define TAG(x) x -#define IND GAMMA_FALLBACK_BIT -#include "tnl_dd/t_dd_unfilled.h" -#undef IND - -/*********************************************************************** - * Generate GL render functions * - ***********************************************************************/ - -#define IND (0) -#define TAG(x) x -#include "tnl_dd/t_dd_tritmp.h" - -#define IND (GAMMA_OFFSET_BIT) -#define TAG(x) x##_offset -#include "tnl_dd/t_dd_tritmp.h" - -#define IND (GAMMA_TWOSIDE_BIT) -#define TAG(x) x##_twoside -#include "tnl_dd/t_dd_tritmp.h" - -#define IND (GAMMA_TWOSIDE_BIT|GAMMA_OFFSET_BIT) -#define TAG(x) x##_twoside_offset -#include "tnl_dd/t_dd_tritmp.h" - -#define IND (GAMMA_UNFILLED_BIT) -#define TAG(x) x##_unfilled -#include "tnl_dd/t_dd_tritmp.h" - -#define IND (GAMMA_OFFSET_BIT|GAMMA_UNFILLED_BIT) -#define TAG(x) x##_offset_unfilled -#include "tnl_dd/t_dd_tritmp.h" - -#define IND (GAMMA_TWOSIDE_BIT|GAMMA_UNFILLED_BIT) -#define TAG(x) x##_twoside_unfilled -#include "tnl_dd/t_dd_tritmp.h" - -#define IND (GAMMA_TWOSIDE_BIT|GAMMA_OFFSET_BIT|GAMMA_UNFILLED_BIT) -#define TAG(x) x##_twoside_offset_unfilled -#include "tnl_dd/t_dd_tritmp.h" - - - -static void init_render_tab( void ) -{ - init(); - init_offset(); - init_twoside(); - init_twoside_offset(); - init_unfilled(); - init_offset_unfilled(); - init_twoside_unfilled(); - init_twoside_offset_unfilled(); -} - - -/**********************************************************************/ -/* Render unclipped begin/end objects */ -/**********************************************************************/ - -#define VERT(x) (gammaVertex *)(gammaverts + (x * size * sizeof(int))) -#define RENDER_POINTS( start, count ) \ - for ( ; start < count ; start++) \ - gmesa->draw_point( gmesa, VERT(start) ) -#define RENDER_LINE( v0, v1 ) \ - gmesa->draw_line( gmesa, VERT(v0), VERT(v1) ) -#define RENDER_TRI( v0, v1, v2 ) \ - gmesa->draw_tri( gmesa, VERT(v0), VERT(v1), VERT(v2) ) -#define RENDER_QUAD( v0, v1, v2, v3 ) \ - gmesa->draw_quad( gmesa, VERT(v0), VERT(v1), VERT(v2), VERT(v3) ) -#define INIT(x) gammaRenderPrimitive( ctx, x ); -#undef LOCAL_VARS -#define LOCAL_VARS \ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); \ - const GLuint size = gmesa->vertex_size; \ - const char *gammaverts = (char *)gmesa->verts; \ - const GLboolean stipple = ctx->Line.StippleFlag; \ - (void) stipple; -#define RESET_STIPPLE if ( stipple ) gammaResetLineStipple( ctx ); -#define RESET_OCCLUSION -#define PRESERVE_VB_DEFS -#define ELT(x) (x) -#define TAG(x) gamma_##x##_verts -#include "tnl/t_vb_rendertmp.h" - - -/**********************************************************************/ -/* Render clipped primitives */ -/**********************************************************************/ - -static void gammaRenderClippedPoly( GLcontext *ctx, const GLuint *elts, - GLuint n ) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; - TNLcontext *tnl = TNL_CONTEXT(ctx); - GLuint prim = gmesa->render_primitive; - - /* Render the new vertices as an unclipped polygon. - */ - { - GLuint *tmp = VB->Elts; - VB->Elts = (GLuint *)elts; - tnl->Driver.Render.PrimTabElts[GL_POLYGON]( ctx, 0, n, PRIM_BEGIN|PRIM_END ); - VB->Elts = tmp; - } - - /* Restore the render primitive - */ - if (prim != GL_POLYGON) - tnl->Driver.Render.PrimitiveNotify( ctx, prim ); -} - -static void gammaRenderClippedLine( GLcontext *ctx, GLuint ii, GLuint jj ) -{ - TNLcontext *tnl = TNL_CONTEXT(ctx); - tnl->Driver.Render.Line( ctx, ii, jj ); -} - - -/**********************************************************************/ -/* Choose render functions */ -/**********************************************************************/ - - - -#define _GAMMA_NEW_RENDERSTATE (_DD_NEW_TRI_UNFILLED | \ - _DD_NEW_TRI_LIGHT_TWOSIDE | \ - _DD_NEW_TRI_OFFSET) - -#define ANY_RASTER_FLAGS (DD_TRI_LIGHT_TWOSIDE|DD_TRI_OFFSET|DD_TRI_UNFILLED) - -static void gammaChooseRenderState(GLcontext *ctx) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - TNLcontext *tnl = TNL_CONTEXT(ctx); - GLuint flags = ctx->_TriangleCaps; - GLuint index = 0; - - if (flags & ANY_RASTER_FLAGS) { - if (flags & DD_TRI_LIGHT_TWOSIDE) index |= GAMMA_TWOSIDE_BIT; - if (flags & DD_TRI_OFFSET) index |= GAMMA_OFFSET_BIT; - if (flags & DD_TRI_UNFILLED) index |= GAMMA_UNFILLED_BIT; - } - - if (gmesa->RenderIndex != index) { - gmesa->RenderIndex = index; - - tnl->Driver.Render.Points = rast_tab[index].points; - tnl->Driver.Render.Line = rast_tab[index].line; - tnl->Driver.Render.Triangle = rast_tab[index].triangle; - tnl->Driver.Render.Quad = rast_tab[index].quad; - - if (gmesa->RenderIndex == 0) - tnl->Driver.Render.PrimTabVerts = gamma_render_tab_verts; - else - tnl->Driver.Render.PrimTabVerts = _tnl_render_tab_verts; - tnl->Driver.Render.PrimTabElts = _tnl_render_tab_elts; - tnl->Driver.Render.ClippedLine = gammaRenderClippedLine; - tnl->Driver.Render.ClippedPolygon = gammaRenderClippedPoly; - } -} - - -/**********************************************************************/ -/* High level hooks for t_vb_render.c */ -/**********************************************************************/ - - - -/* Determine the rasterized primitive when not drawing unfilled - * polygons. - * - * Used only for the default render stage which always decomposes - * primitives to trianges/lines/points. For the accelerated stage, - * which renders strips as strips, the equivalent calculations are - * performed in gammarender.c. - */ - -static void gammaRasterPrimitive( GLcontext *ctx, GLuint hwprim ) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - if (gmesa->hw_primitive != hwprim) - gmesa->hw_primitive = hwprim; -} - -static void gammaRenderPrimitive( GLcontext *ctx, GLenum prim ) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - gmesa->render_primitive = prim; -} - -static void gammaRunPipeline( GLcontext *ctx ) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - - if ( gmesa->new_state ) - gammaDDUpdateHWState( ctx ); - - if (gmesa->new_gl_state) { - if (gmesa->new_gl_state & _NEW_TEXTURE) - gammaUpdateTextureState( ctx ); - - if (!gmesa->Fallback) { - if (gmesa->new_gl_state & _GAMMA_NEW_VERTEX) - gammaChooseVertexState( ctx ); - - if (gmesa->new_gl_state & _GAMMA_NEW_RASTER_STATE) - gammaChooseRasterState( ctx ); - - if (gmesa->new_gl_state & _GAMMA_NEW_RENDERSTATE) - gammaChooseRenderState( ctx ); - } - - gmesa->new_gl_state = 0; - } - - _tnl_run_pipeline( ctx ); -} - -static void gammaRenderStart( GLcontext *ctx ) -{ - /* Check for projective texturing. Make sure all texcoord - * pointers point to something. (fix in mesa?) - */ - gammaCheckTexSizes( ctx ); -} - -static void gammaRenderFinish( GLcontext *ctx ) -{ - if (0) - _swrast_flush( ctx ); /* never needed */ -} - -static void gammaResetLineStipple( GLcontext *ctx ) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - - /* Reset the hardware stipple counter. - */ - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, UpdateLineStippleCounters, 0); -} - - -/**********************************************************************/ -/* Transition to/from hardware rasterization. */ -/**********************************************************************/ - - -void gammaFallback( gammaContextPtr gmesa, GLuint bit, GLboolean mode ) -{ - GLcontext *ctx = gmesa->glCtx; - TNLcontext *tnl = TNL_CONTEXT(ctx); - GLuint oldfallback = gmesa->Fallback; - - if (mode) { - gmesa->Fallback |= bit; - if (oldfallback == 0) { - _swsetup_Wakeup( ctx ); - _tnl_need_projected_coords( ctx, GL_TRUE ); - gmesa->RenderIndex = ~0; - } - } - else { - gmesa->Fallback &= ~bit; - if (oldfallback == bit) { - _swrast_flush( ctx ); - tnl->Driver.Render.Start = gammaRenderStart; - tnl->Driver.Render.PrimitiveNotify = gammaRenderPrimitive; - tnl->Driver.Render.Finish = gammaRenderFinish; - tnl->Driver.Render.BuildVertices = gammaBuildVertices; - tnl->Driver.Render.ResetLineStipple = gammaResetLineStipple; - gmesa->new_gl_state |= (_GAMMA_NEW_RENDERSTATE| - _GAMMA_NEW_RASTER_STATE| - _GAMMA_NEW_VERTEX); - } - } -} - - -/**********************************************************************/ -/* Initialization. */ -/**********************************************************************/ - - -void gammaDDInitTriFuncs( GLcontext *ctx ) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - TNLcontext *tnl = TNL_CONTEXT(ctx); - static int firsttime = 1; - - if (firsttime) { - init_rast_tab(); - init_render_tab(); - firsttime = 0; - } - - gmesa->RenderIndex = ~0; - - tnl->Driver.RunPipeline = gammaRunPipeline; - tnl->Driver.Render.Start = gammaRenderStart; - tnl->Driver.Render.Finish = gammaRenderFinish; - tnl->Driver.Render.PrimitiveNotify = gammaRenderPrimitive; - tnl->Driver.Render.ResetLineStipple = gammaResetLineStipple; - tnl->Driver.Render.BuildVertices = gammaBuildVertices; -} diff --git a/src/mesa/drivers/dri/gamma/gamma_tris.h b/src/mesa/drivers/dri/gamma/gamma_tris.h deleted file mode 100644 index 02bec286903..00000000000 --- a/src/mesa/drivers/dri/gamma/gamma_tris.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2001 by Alan Hourihane. - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that - * copyright notice and this permission notice appear in supporting - * documentation, and that the name of Alan Hourihane not be used in - * advertising or publicity pertaining to distribution of the software without - * specific, written prior permission. Alan Hourihane makes no representations - * about the suitability of this software for any purpose. It is provided - * "as is" without express or implied warranty. - * - * ALAN HOURIHANE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO - * EVENT SHALL ALAN HOURIHANE BE LIABLE FOR ANY SPECIAL, INDIRECT OR - * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - * - * Authors: Alan Hourihane, <[email protected]> - * Keith Whitwell, <[email protected]> - * - * 3DLabs Gamma driver. - */ - -#ifndef _GAMMA_TRIS_H -#define _GAMMA_TRIS_H - -extern void gammaDDTrifuncInit(void); -extern void gammaDDChooseTriRenderState(GLcontext *); - - - -#endif /* !(_GAMMA_TRIS_H) */ diff --git a/src/mesa/drivers/dri/gamma/gamma_tritmp.h b/src/mesa/drivers/dri/gamma/gamma_tritmp.h deleted file mode 100644 index bea2508d4a2..00000000000 --- a/src/mesa/drivers/dri/gamma/gamma_tritmp.h +++ /dev/null @@ -1,496 +0,0 @@ - -static void TAG(gamma_point)( gammaContextPtr gmesa, - const gammaVertex *v0 ) -{ - uint32_t vColor; - uint32_t vBegin; - - vBegin = gmesa->Begin | B_PrimType_Points; - - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, Begin, vBegin); - -#if (IND & GAMMA_RAST_ALPHA_BIT) - vColor = (v0->v.color.alpha << 24) | - (v0->v.color.blue << 16) | - (v0->v.color.green << 8) | - (v0->v.color.red << 0); - - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, PackedColor4, vColor); -#else - vColor = (v0->v.color.blue << 16) | - (v0->v.color.green << 8) | - (v0->v.color.red << 0); - - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, PackedColor3, vColor); -#endif - -#if (IND & GAMMA_RAST_TEX_BIT) - CHECK_DMA_BUFFER(gmesa, 6); - WRITEF(gmesa->buf, Tt2, v0->v.u0); - WRITEF(gmesa->buf, Ts2, v0->v.v0); - WRITEF(gmesa->buf, Vw, v0->v.w); - WRITEF(gmesa->buf, Vz, v0->v.z); - WRITEF(gmesa->buf, Vy, v0->v.y); - WRITEF(gmesa->buf, Vx4, v0->v.x); -#else - CHECK_DMA_BUFFER(gmesa, 4); - WRITEF(gmesa->buf, Vw, v0->v.w); - WRITEF(gmesa->buf, Vz, v0->v.z); - WRITEF(gmesa->buf, Vy, v0->v.y); - WRITEF(gmesa->buf, Vx4, v0->v.x); -#endif - -#if !(IND & GAMMA_RAST_FLAT_BIT) - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, FlushSpan, 0); -#endif - - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, End, 0); -} - -static void TAG(gamma_line)( gammaContextPtr gmesa, - const gammaVertex *v0, - const gammaVertex *v1 ) -{ - uint32_t vColor; - uint32_t vBegin; - - vBegin = gmesa->Begin | B_PrimType_Lines; - - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, Begin, vBegin); - -#if !(IND & GAMMA_RAST_FLAT_BIT) -#if (IND & GAMMA_RAST_ALPHA_BIT) - vColor = (v0->v.color.alpha << 24) | - (v0->v.color.blue << 16) | - (v0->v.color.green << 8) | - (v0->v.color.red << 0); - - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, PackedColor4, vColor); -#else - vColor = (v0->v.color.blue << 16) | - (v0->v.color.green << 8) | - (v0->v.color.red << 0); - - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, PackedColor3, vColor); -#endif -#else -#if (IND & GAMMA_RAST_ALPHA_BIT) - vColor = (v1->v.color.alpha << 24) | - (v1->v.color.blue << 16) | - (v1->v.color.green << 8) | - (v1->v.color.red << 0); - - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, PackedColor4, vColor); -#else - vColor = (v1->v.color.blue << 16) | - (v1->v.color.green << 8) | - (v1->v.color.red << 0); - - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, PackedColor3, vColor); -#endif -#endif - -#if (IND & GAMMA_RAST_TEX_BIT) - CHECK_DMA_BUFFER(gmesa, 6); - WRITEF(gmesa->buf, Tt2, v0->v.u0); - WRITEF(gmesa->buf, Ts2, v0->v.v0); - WRITEF(gmesa->buf, Vw, v0->v.w); - WRITEF(gmesa->buf, Vz, v0->v.z); - WRITEF(gmesa->buf, Vy, v0->v.y); - WRITEF(gmesa->buf, Vx4, v0->v.x); -#else - CHECK_DMA_BUFFER(gmesa, 4); - WRITEF(gmesa->buf, Vw, v0->v.w); - WRITEF(gmesa->buf, Vz, v0->v.z); - WRITEF(gmesa->buf, Vy, v0->v.y); - WRITEF(gmesa->buf, Vx4, v0->v.x); -#endif - -#if !(IND & GAMMA_RAST_FLAT_BIT) -#if (IND & GAMMA_RAST_ALPHA_BIT) - vColor = (v1->v.color.alpha << 24) | - (v1->v.color.blue << 16) | - (v1->v.color.green << 8) | - (v1->v.color.red << 0); - - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, PackedColor4, vColor); -#else - vColor = (v1->v.color.blue << 16) | - (v1->v.color.green << 8) | - (v1->v.color.red << 0); - - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, PackedColor3, vColor); -#endif -#endif - -#if (IND & GAMMA_RAST_TEX_BIT) - CHECK_DMA_BUFFER(gmesa, 6); - WRITEF(gmesa->buf, Tt2, v1->v.u0); - WRITEF(gmesa->buf, Ts2, v1->v.v0); - WRITEF(gmesa->buf, Vw, v1->v.w); - WRITEF(gmesa->buf, Vz, v1->v.z); - WRITEF(gmesa->buf, Vy, v1->v.y); - WRITEF(gmesa->buf, Vx4, v1->v.x); -#else - CHECK_DMA_BUFFER(gmesa, 4); - WRITEF(gmesa->buf, Vw, v1->v.w); - WRITEF(gmesa->buf, Vz, v1->v.z); - WRITEF(gmesa->buf, Vy, v1->v.y); - WRITEF(gmesa->buf, Vx4, v1->v.x); -#endif - -#if !(IND & GAMMA_RAST_FLAT_BIT) - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, FlushSpan, 0); -#endif - - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, End, 0); -} - -static void TAG(gamma_triangle)( gammaContextPtr gmesa, - const gammaVertex *v0, - const gammaVertex *v1, - const gammaVertex *v2 ) -{ - uint32_t vColor; - uint32_t vBegin; - - vBegin = gmesa->Begin | B_PrimType_Triangles; - - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, Begin, vBegin); - -#if !(IND & GAMMA_RAST_FLAT_BIT) -#if (IND & GAMMA_RAST_ALPHA_BIT) - vColor = (v0->v.color.alpha << 24) | - (v0->v.color.blue << 16) | - (v0->v.color.green << 8) | - (v0->v.color.red << 0); - - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, PackedColor4, vColor); -#else - vColor = (v0->v.color.blue << 16) | - (v0->v.color.green << 8) | - (v0->v.color.red << 0); - - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, PackedColor3, vColor); -#endif -#else -#if (IND & GAMMA_RAST_ALPHA_BIT) - vColor = (v2->v.color.alpha << 24) | - (v2->v.color.blue << 16) | - (v2->v.color.green << 8) | - (v2->v.color.red << 0); - - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, PackedColor4, vColor); -#else - vColor = (v2->v.color.blue << 16) | - (v2->v.color.green << 8) | - (v2->v.color.red << 0); - - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, PackedColor3, vColor); -#endif -#endif - -#if (IND & GAMMA_RAST_TEX_BIT) - CHECK_DMA_BUFFER(gmesa, 6); - WRITEF(gmesa->buf, Tt2, v0->v.u0); - WRITEF(gmesa->buf, Ts2, v0->v.v0); - WRITEF(gmesa->buf, Vw, v0->v.w); - WRITEF(gmesa->buf, Vz, v0->v.z); - WRITEF(gmesa->buf, Vy, v0->v.y); - WRITEF(gmesa->buf, Vx4, v0->v.x); -#else - CHECK_DMA_BUFFER(gmesa, 4); - WRITEF(gmesa->buf, Vw, v0->v.w); - WRITEF(gmesa->buf, Vz, v0->v.z); - WRITEF(gmesa->buf, Vy, v0->v.y); - WRITEF(gmesa->buf, Vx4, v0->v.x); -#endif - -#if !(IND & GAMMA_RAST_FLAT_BIT) -#if (IND & GAMMA_RAST_ALPHA_BIT) - vColor = (v1->v.color.alpha << 24) | - (v1->v.color.blue << 16) | - (v1->v.color.green << 8) | - (v1->v.color.red << 0); - - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, PackedColor4, vColor); -#else - vColor = (v1->v.color.blue << 16) | - (v1->v.color.green << 8) | - (v1->v.color.red << 0); - - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, PackedColor3, vColor); -#endif -#endif - -#if (IND & GAMMA_RAST_TEX_BIT) - CHECK_DMA_BUFFER(gmesa, 6); - WRITEF(gmesa->buf, Tt2, v1->v.u0); - WRITEF(gmesa->buf, Ts2, v1->v.v0); - WRITEF(gmesa->buf, Vw, v1->v.w); - WRITEF(gmesa->buf, Vz, v1->v.z); - WRITEF(gmesa->buf, Vy, v1->v.y); - WRITEF(gmesa->buf, Vx4, v1->v.x); -#else - CHECK_DMA_BUFFER(gmesa, 4); - WRITEF(gmesa->buf, Vw, v1->v.w); - WRITEF(gmesa->buf, Vz, v1->v.z); - WRITEF(gmesa->buf, Vy, v1->v.y); - WRITEF(gmesa->buf, Vx4, v1->v.x); -#endif - -#if !(IND & GAMMA_RAST_FLAT_BIT) -#if (IND & GAMMA_RAST_ALPHA_BIT) - vColor = (v2->v.color.alpha << 24) | - (v2->v.color.blue << 16) | - (v2->v.color.green << 8) | - (v2->v.color.red << 0); - - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, PackedColor4, vColor); -#else - vColor = (v2->v.color.blue << 16) | - (v2->v.color.green << 8) | - (v2->v.color.red << 0); - - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, PackedColor3, vColor); -#endif -#endif - -#if (IND & GAMMA_RAST_TEX_BIT) - CHECK_DMA_BUFFER(gmesa, 6); - WRITEF(gmesa->buf, Tt2, v2->v.u0); - WRITEF(gmesa->buf, Ts2, v2->v.v0); - WRITEF(gmesa->buf, Vw, v2->v.w); - WRITEF(gmesa->buf, Vz, v2->v.z); - WRITEF(gmesa->buf, Vy, v2->v.y); - WRITEF(gmesa->buf, Vx4, v2->v.x); -#else - CHECK_DMA_BUFFER(gmesa, 4); - WRITEF(gmesa->buf, Vw, v2->v.w); - WRITEF(gmesa->buf, Vz, v2->v.z); - WRITEF(gmesa->buf, Vy, v2->v.y); - WRITEF(gmesa->buf, Vx4, v2->v.x); -#endif - -#if !(IND & GAMMA_RAST_FLAT_BIT) - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, FlushSpan, 0); -#endif - - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, End, 0); -} - -static void TAG(gamma_quad)( gammaContextPtr gmesa, - const gammaVertex *v0, - const gammaVertex *v1, - const gammaVertex *v2, - const gammaVertex *v3 ) -{ - uint32_t vColor; - uint32_t vBegin; - - vBegin = gmesa->Begin | B_PrimType_Quads; - - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, Begin, vBegin); - -#if !(IND & GAMMA_RAST_FLAT_BIT) -#if (IND & GAMMA_RAST_ALPHA_BIT) - vColor = (v0->v.color.alpha << 24) | - (v0->v.color.blue << 16) | - (v0->v.color.green << 8) | - (v0->v.color.red << 0); - - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, PackedColor4, vColor); -#else - vColor = (v0->v.color.blue << 16) | - (v0->v.color.green << 8) | - (v0->v.color.red << 0); - - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, PackedColor3, vColor); -#endif -#else -#if (IND & GAMMA_RAST_ALPHA_BIT) - vColor = (v3->v.color.alpha << 24) | - (v3->v.color.blue << 16) | - (v3->v.color.green << 8) | - (v3->v.color.red << 0); - - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, PackedColor4, vColor); -#else - vColor = (v3->v.color.blue << 16) | - (v3->v.color.green << 8) | - (v3->v.color.red << 0); - - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, PackedColor3, vColor); -#endif -#endif - -#if (IND & GAMMA_RAST_TEX_BIT) - CHECK_DMA_BUFFER(gmesa, 6); - WRITEF(gmesa->buf, Tt2, v0->v.u0); - WRITEF(gmesa->buf, Ts2, v0->v.v0); - WRITEF(gmesa->buf, Vw, v0->v.w); - WRITEF(gmesa->buf, Vz, v0->v.z); - WRITEF(gmesa->buf, Vy, v0->v.y); - WRITEF(gmesa->buf, Vx4, v0->v.x); -#else - CHECK_DMA_BUFFER(gmesa, 4); - WRITEF(gmesa->buf, Vw, v0->v.w); - WRITEF(gmesa->buf, Vz, v0->v.z); - WRITEF(gmesa->buf, Vy, v0->v.y); - WRITEF(gmesa->buf, Vx4, v0->v.x); -#endif - -#if !(IND & GAMMA_RAST_FLAT_BIT) -#if (IND & GAMMA_RAST_ALPHA_BIT) - vColor = (v1->v.color.alpha << 24) | - (v1->v.color.blue << 16) | - (v1->v.color.green << 8) | - (v1->v.color.red << 0); - - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, PackedColor4, vColor); -#else - vColor = (v1->v.color.blue << 16) | - (v1->v.color.green << 8) | - (v1->v.color.red << 0); - - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, PackedColor3, vColor); -#endif -#endif - -#if (IND & GAMMA_RAST_TEX_BIT) - CHECK_DMA_BUFFER(gmesa, 6); - WRITEF(gmesa->buf, Tt2, v1->v.u0); - WRITEF(gmesa->buf, Ts2, v1->v.v0); - WRITEF(gmesa->buf, Vw, v1->v.w); - WRITEF(gmesa->buf, Vz, v1->v.z); - WRITEF(gmesa->buf, Vy, v1->v.y); - WRITEF(gmesa->buf, Vx4, v1->v.x); -#else - CHECK_DMA_BUFFER(gmesa, 4); - WRITEF(gmesa->buf, Vw, v1->v.w); - WRITEF(gmesa->buf, Vz, v1->v.z); - WRITEF(gmesa->buf, Vy, v1->v.y); - WRITEF(gmesa->buf, Vx4, v1->v.x); -#endif - -#if !(IND & GAMMA_RAST_FLAT_BIT) -#if (IND & GAMMA_RAST_ALPHA_BIT) - vColor = (v2->v.color.alpha << 24) | - (v2->v.color.blue << 16) | - (v2->v.color.green << 8) | - (v2->v.color.red << 0); - - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, PackedColor4, vColor); -#else - vColor = (v2->v.color.blue << 16) | - (v2->v.color.green << 8) | - (v2->v.color.red << 0); - - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, PackedColor3, vColor); -#endif -#endif - -#if (IND & GAMMA_RAST_TEX_BIT) - CHECK_DMA_BUFFER(gmesa, 6); - WRITEF(gmesa->buf, Tt2, v2->v.u0); - WRITEF(gmesa->buf, Ts2, v2->v.v0); - WRITEF(gmesa->buf, Vw, v2->v.w); - WRITEF(gmesa->buf, Vz, v2->v.z); - WRITEF(gmesa->buf, Vy, v2->v.y); - WRITEF(gmesa->buf, Vx4, v2->v.x); -#else - CHECK_DMA_BUFFER(gmesa, 4); - WRITEF(gmesa->buf, Vw, v2->v.w); - WRITEF(gmesa->buf, Vz, v2->v.z); - WRITEF(gmesa->buf, Vy, v2->v.y); - WRITEF(gmesa->buf, Vx4, v2->v.x); -#endif - -#if !(IND & GAMMA_RAST_FLAT_BIT) -#if (IND & GAMMA_RAST_ALPHA_BIT) - vColor = (v3->v.color.alpha << 24) | - (v3->v.color.blue << 16) | - (v3->v.color.green << 8) | - (v3->v.color.red << 0); - - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, PackedColor4, vColor); -#else - vColor = (v3->v.color.blue << 16) | - (v3->v.color.green << 8) | - (v3->v.color.red << 0); - - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, PackedColor3, vColor); -#endif -#endif - -#if (IND & GAMMA_RAST_TEX_BIT) - CHECK_DMA_BUFFER(gmesa, 6); - WRITEF(gmesa->buf, Tt2, v3->v.u0); - WRITEF(gmesa->buf, Ts2, v3->v.v0); - WRITEF(gmesa->buf, Vw, v3->v.w); - WRITEF(gmesa->buf, Vz, v3->v.z); - WRITEF(gmesa->buf, Vy, v3->v.y); - WRITEF(gmesa->buf, Vx4, v3->v.x); -#else - CHECK_DMA_BUFFER(gmesa, 4); - WRITEF(gmesa->buf, Vw, v3->v.w); - WRITEF(gmesa->buf, Vz, v3->v.z); - WRITEF(gmesa->buf, Vy, v3->v.y); - WRITEF(gmesa->buf, Vx4, v3->v.x); -#endif - -#if !(IND & GAMMA_RAST_FLAT_BIT) - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, FlushSpan, 0); -#endif - - CHECK_DMA_BUFFER(gmesa, 1); - WRITE(gmesa->buf, End, 0); -} - -static void TAG(gamma_init)(void) -{ - gamma_point_tab[IND] = TAG(gamma_point); - gamma_line_tab[IND] = TAG(gamma_line); - gamma_tri_tab[IND] = TAG(gamma_triangle); - gamma_quad_tab[IND] = TAG(gamma_quad); -} - -#undef IND -#undef TAG diff --git a/src/mesa/drivers/dri/gamma/gamma_vb.c b/src/mesa/drivers/dri/gamma/gamma_vb.c deleted file mode 100644 index c9c1ebf62a6..00000000000 --- a/src/mesa/drivers/dri/gamma/gamma_vb.c +++ /dev/null @@ -1,361 +0,0 @@ -/* - * Copyright 2001 by Alan Hourihane. - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that - * copyright notice and this permission notice appear in supporting - * documentation, and that the name of Alan Hourihane not be used in - * advertising or publicity pertaining to distribution of the software without - * specific, written prior permission. Alan Hourihane makes no representations - * about the suitability of this software for any purpose. It is provided - * "as is" without express or implied warranty. - * - * ALAN HOURIHANE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO - * EVENT SHALL ALAN HOURIHANE BE LIABLE FOR ANY SPECIAL, INDIRECT OR - * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - * - * Authors: Alan Hourihane, <[email protected]> - * Keith Whitwell, <[email protected]> - * - * 3DLabs Gamma driver. - */ - -#include "main/glheader.h" -#include "main/mtypes.h" -#include "main/imports.h" -#include "main/macros.h" -#include "main/colormac.h" - -#include "swrast_setup/swrast_setup.h" -#include "tnl/t_context.h" -#include "tnl/tnl.h" - -#include "gamma_context.h" -#include "gamma_vb.h" -#include "gamma_tris.h" - - -#define GAMMA_TEX0_BIT 0x1 -#define GAMMA_RGBA_BIT 0x2 -#define GAMMA_XYZW_BIT 0x4 -#define GAMMA_PTEX_BIT 0x8 -#define GAMMA_FOG_BIT 0x10 -#define GAMMA_SPEC_BIT 0x20 -#define GAMMA_MAX_SETUP 0x40 - -static struct { - void (*emit)( GLcontext *, GLuint, GLuint, void *, GLuint ); - tnl_interp_func interp; - tnl_copy_pv_func copy_pv; - GLboolean (*check_tex_sizes)( GLcontext *ctx ); - GLuint vertex_size; - GLuint vertex_format; -} setup_tab[GAMMA_MAX_SETUP]; - -#define TINY_VERTEX_FORMAT 1 -#define NOTEX_VERTEX_FORMAT 2 -#define TEX0_VERTEX_FORMAT 3 -#define TEX1_VERTEX_FORMAT 0 -#define PROJ_TEX1_VERTEX_FORMAT 0 -#define TEX2_VERTEX_FORMAT 0 -#define TEX3_VERTEX_FORMAT 0 -#define PROJ_TEX3_VERTEX_FORMAT 0 - -#define DO_XYZW (IND & GAMMA_XYZW_BIT) -#define DO_RGBA (IND & GAMMA_RGBA_BIT) -#define DO_SPEC (IND & GAMMA_SPEC_BIT) -#define DO_FOG (IND & GAMMA_FOG_BIT) -#define DO_TEX0 (IND & GAMMA_TEX0_BIT) -#define DO_TEX1 0 -#define DO_TEX2 0 -#define DO_TEX3 0 -#define DO_PTEX (IND & GAMMA_PTEX_BIT) - -#define VERTEX gammaVertex -#define VERTEX_COLOR gamma_color_t -#define GET_VIEWPORT_MAT() 0 -#define GET_TEXSOURCE(n) n -#define GET_VERTEX_FORMAT() GAMMA_CONTEXT(ctx)->vertex_format -#define GET_VERTEX_STORE() GAMMA_CONTEXT(ctx)->verts -#define GET_VERTEX_SIZE() GAMMA_CONTEXT(ctx)->vertex_size * sizeof(GLuint) -#define INVALIDATE_STORED_VERTICES() - -#define HAVE_HW_VIEWPORT 1 -#define HAVE_HW_DIVIDE 1 -#define HAVE_RGBA_COLOR 0 /* we're BGRA */ -#define HAVE_TINY_VERTICES 1 -#define HAVE_NOTEX_VERTICES 1 -#define HAVE_TEX0_VERTICES 1 -#define HAVE_TEX1_VERTICES 0 -#define HAVE_TEX2_VERTICES 0 -#define HAVE_TEX3_VERTICES 0 -#define HAVE_PTEX_VERTICES 1 - -#define PTEX_FALLBACK() /* never needed */ - -#define INTERP_VERTEX setup_tab[GAMMA_CONTEXT(ctx)->SetupIndex].interp -#define COPY_PV_VERTEX setup_tab[GAMMA_CONTEXT(ctx)->SetupIndex].copy_pv - - - -/*********************************************************************** - * Generate pv-copying and translation functions * - ***********************************************************************/ - -#define TAG(x) gamma_##x -#include "tnl_dd/t_dd_vb.c" - -/*********************************************************************** - * Generate vertex emit and interp functions * - ***********************************************************************/ - -#define IND (GAMMA_XYZW_BIT|GAMMA_RGBA_BIT) -#define TAG(x) x##_wg -#include "tnl_dd/t_dd_vbtmp.h" - -#define IND (GAMMA_XYZW_BIT|GAMMA_RGBA_BIT|GAMMA_SPEC_BIT) -#define TAG(x) x##_wgs -#include "tnl_dd/t_dd_vbtmp.h" - -#define IND (GAMMA_XYZW_BIT|GAMMA_RGBA_BIT|GAMMA_TEX0_BIT) -#define TAG(x) x##_wgt0 -#include "tnl_dd/t_dd_vbtmp.h" - -#define IND (GAMMA_XYZW_BIT|GAMMA_RGBA_BIT|GAMMA_TEX0_BIT|GAMMA_PTEX_BIT) -#define TAG(x) x##_wgpt0 -#include "tnl_dd/t_dd_vbtmp.h" - -#define IND (GAMMA_XYZW_BIT|GAMMA_RGBA_BIT|GAMMA_SPEC_BIT|GAMMA_TEX0_BIT) -#define TAG(x) x##_wgst0 -#include "tnl_dd/t_dd_vbtmp.h" - -#define IND (GAMMA_XYZW_BIT|GAMMA_RGBA_BIT|GAMMA_SPEC_BIT|GAMMA_TEX0_BIT|\ - GAMMA_PTEX_BIT) -#define TAG(x) x##_wgspt0 -#include "tnl_dd/t_dd_vbtmp.h" - -#define IND (GAMMA_XYZW_BIT|GAMMA_RGBA_BIT|GAMMA_FOG_BIT) -#define TAG(x) x##_wgf -#include "tnl_dd/t_dd_vbtmp.h" - -#define IND (GAMMA_XYZW_BIT|GAMMA_RGBA_BIT|GAMMA_FOG_BIT|GAMMA_SPEC_BIT) -#define TAG(x) x##_wgfs -#include "tnl_dd/t_dd_vbtmp.h" - -#define IND (GAMMA_XYZW_BIT|GAMMA_RGBA_BIT|GAMMA_FOG_BIT|GAMMA_TEX0_BIT) -#define TAG(x) x##_wgft0 -#include "tnl_dd/t_dd_vbtmp.h" - -#define IND (GAMMA_XYZW_BIT|GAMMA_RGBA_BIT|GAMMA_FOG_BIT|GAMMA_TEX0_BIT|\ - GAMMA_PTEX_BIT) -#define TAG(x) x##_wgfpt0 -#include "tnl_dd/t_dd_vbtmp.h" - -#define IND (GAMMA_XYZW_BIT|GAMMA_RGBA_BIT|GAMMA_FOG_BIT|GAMMA_SPEC_BIT|\ - GAMMA_TEX0_BIT) -#define TAG(x) x##_wgfst0 -#include "tnl_dd/t_dd_vbtmp.h" - -#define IND (GAMMA_XYZW_BIT|GAMMA_RGBA_BIT|GAMMA_FOG_BIT|GAMMA_SPEC_BIT|\ - GAMMA_TEX0_BIT|GAMMA_PTEX_BIT) -#define TAG(x) x##_wgfspt0 -#include "tnl_dd/t_dd_vbtmp.h" - -#define IND (GAMMA_TEX0_BIT) -#define TAG(x) x##_t0 -#include "tnl_dd/t_dd_vbtmp.h" - -#define IND (GAMMA_FOG_BIT) -#define TAG(x) x##_f -#include "tnl_dd/t_dd_vbtmp.h" - -#define IND (GAMMA_FOG_BIT|GAMMA_TEX0_BIT) -#define TAG(x) x##_ft0 -#include "tnl_dd/t_dd_vbtmp.h" - -#define IND (GAMMA_RGBA_BIT) -#define TAG(x) x##_g -#include "tnl_dd/t_dd_vbtmp.h" - -#define IND (GAMMA_RGBA_BIT|GAMMA_SPEC_BIT) -#define TAG(x) x##_gs -#include "tnl_dd/t_dd_vbtmp.h" - -#define IND (GAMMA_RGBA_BIT|GAMMA_TEX0_BIT) -#define TAG(x) x##_gt0 -#include "tnl_dd/t_dd_vbtmp.h" - -#define IND (GAMMA_RGBA_BIT|GAMMA_SPEC_BIT|GAMMA_TEX0_BIT) -#define TAG(x) x##_gst0 -#include "tnl_dd/t_dd_vbtmp.h" - -#define IND (GAMMA_RGBA_BIT|GAMMA_FOG_BIT) -#define TAG(x) x##_gf -#include "tnl_dd/t_dd_vbtmp.h" - -#define IND (GAMMA_RGBA_BIT|GAMMA_FOG_BIT|GAMMA_SPEC_BIT) -#define TAG(x) x##_gfs -#include "tnl_dd/t_dd_vbtmp.h" - -#define IND (GAMMA_RGBA_BIT|GAMMA_FOG_BIT|GAMMA_TEX0_BIT) -#define TAG(x) x##_gft0 -#include "tnl_dd/t_dd_vbtmp.h" - -#define IND (GAMMA_RGBA_BIT|GAMMA_FOG_BIT|GAMMA_SPEC_BIT|GAMMA_TEX0_BIT) -#define TAG(x) x##_gfst0 -#include "tnl_dd/t_dd_vbtmp.h" - -static void init_setup_tab( void ) -{ - init_wg(); - init_wgs(); - init_wgt0(); - init_wgpt0(); - init_wgst0(); - init_wgspt0(); - init_wgf(); - init_wgfs(); - init_wgft0(); - init_wgfpt0(); - init_wgfst0(); - init_wgfspt0(); - init_t0(); - init_f(); - init_ft0(); - init_g(); - init_gs(); - init_gt0(); - init_gst0(); - init_gf(); - init_gfs(); - init_gft0(); - init_gfst0(); -} - -void gammaCheckTexSizes( GLcontext *ctx ) -{ - TNLcontext *tnl = TNL_CONTEXT(ctx); - gammaContextPtr gmesa = GAMMA_CONTEXT( ctx ); - - if (!setup_tab[gmesa->SetupIndex].check_tex_sizes(ctx)) { - /* Invalidate stored verts - */ - gmesa->SetupNewInputs = ~0; - gmesa->SetupIndex |= GAMMA_PTEX_BIT; - - if (!(ctx->_TriangleCaps & (DD_TRI_LIGHT_TWOSIDE|DD_TRI_UNFILLED))) { - tnl->Driver.Render.Interp = setup_tab[gmesa->SetupIndex].interp; - tnl->Driver.Render.CopyPV = setup_tab[gmesa->SetupIndex].copy_pv; - } - } -} - -void gammaBuildVertices( GLcontext *ctx, - GLuint start, - GLuint count, - GLuint newinputs ) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT( ctx ); - GLuint stride = gmesa->vertex_size * sizeof(int); - GLubyte *v = ((GLubyte *)gmesa->verts + (start * stride)); - - newinputs |= gmesa->SetupNewInputs; - gmesa->SetupNewInputs = 0; - - if (!newinputs) - return; - - if (newinputs & VERT_BIT_POS) { - setup_tab[gmesa->SetupIndex].emit( ctx, start, count, v, stride ); - } else { - GLuint ind = 0; - - if (newinputs & VERT_BIT_COLOR0) - ind |= GAMMA_RGBA_BIT; - - if (newinputs & VERT_BIT_COLOR1) - ind |= GAMMA_SPEC_BIT; - - if (newinputs & VERT_BIT_TEX0) - ind |= GAMMA_TEX0_BIT; - - if (newinputs & VERT_BIT_FOG) - ind |= GAMMA_FOG_BIT; - - if (gmesa->SetupIndex & GAMMA_PTEX_BIT) - ind = ~0; - - ind &= gmesa->SetupIndex; - - if (ind) { - setup_tab[ind].emit( ctx, start, count, v, stride ); - } - } -} - -void gammaChooseVertexState( GLcontext *ctx ) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT( ctx ); - TNLcontext *tnl = TNL_CONTEXT(ctx); - GLuint ind = GAMMA_XYZW_BIT|GAMMA_RGBA_BIT; - - if (ctx->_TriangleCaps & DD_SEPARATE_SPECULAR) - ind |= GAMMA_SPEC_BIT; - - if (ctx->Fog.Enabled) - ind |= GAMMA_FOG_BIT; - - if (ctx->Texture.Unit[0]._ReallyEnabled) { - _tnl_need_projected_coords( ctx, GL_FALSE ); - ind |= GAMMA_TEX0_BIT; - } else - _tnl_need_projected_coords( ctx, GL_FALSE ); - - gmesa->SetupIndex = ind; - - if (setup_tab[ind].vertex_format != gmesa->vertex_format) { - gmesa->vertex_format = setup_tab[ind].vertex_format; - gmesa->vertex_size = setup_tab[ind].vertex_size; - } - - if (ctx->_TriangleCaps & (DD_TRI_LIGHT_TWOSIDE|DD_TRI_UNFILLED)) { - tnl->Driver.Render.Interp = gamma_interp_extras; - tnl->Driver.Render.CopyPV = gamma_copy_pv_extras; - } else { - tnl->Driver.Render.Interp = setup_tab[ind].interp; - tnl->Driver.Render.CopyPV = setup_tab[ind].copy_pv; - } -} - - -void gammaInitVB( GLcontext *ctx ) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - GLuint size = TNL_CONTEXT(ctx)->vb.Size; - - gmesa->verts = (GLubyte *)_mesa_align_malloc(size * 4 * 16, 32); - - { - static int firsttime = 1; - if (firsttime) { - init_setup_tab(); - firsttime = 0; - gmesa->vertex_size = 16; /* FIXME - only one vertex setup */ - } - } -} - - -void gammaFreeVB( GLcontext *ctx ) -{ - gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); - if (gmesa->verts) { - _mesa_align_free(gmesa->verts); - gmesa->verts = 0; - } -} diff --git a/src/mesa/drivers/dri/gamma/gamma_vb.h b/src/mesa/drivers/dri/gamma/gamma_vb.h deleted file mode 100644 index 8701226f590..00000000000 --- a/src/mesa/drivers/dri/gamma/gamma_vb.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2001 by Alan Hourihane. - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that - * copyright notice and this permission notice appear in supporting - * documentation, and that the name of Alan Hourihane not be used in - * advertising or publicity pertaining to distribution of the software without - * specific, written prior permission. Alan Hourihane makes no representations - * about the suitability of this software for any purpose. It is provided - * "as is" without express or implied warranty. - * - * ALAN HOURIHANE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO - * EVENT SHALL ALAN HOURIHANE BE LIABLE FOR ANY SPECIAL, INDIRECT OR - * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - * - * Authors: Alan Hourihane, <[email protected]> - * Keith Whitwell, <[email protected]> - * - * 3DLabs Gamma driver. - */ - -#ifndef GAMMAVB_INC -#define GAMMAVB_INC - -#include "main/mtypes.h" -#include "swrast/swrast.h" - -#define _GAMMA_NEW_VERTEX (_NEW_TEXTURE | \ - _DD_NEW_TRI_UNFILLED | \ - _DD_NEW_TRI_LIGHT_TWOSIDE) - - -extern void gammaChooseVertexState( GLcontext *ctx ); -extern void gammaCheckTexSizes( GLcontext *ctx ); -extern void gammaBuildVertices( GLcontext *ctx, - GLuint start, - GLuint count, - GLuint newinputs ); - - -extern void gamma_import_float_colors( GLcontext *ctx ); -extern void gamma_import_float_spec_colors( GLcontext *ctx ); - -extern void gamma_translate_vertex( GLcontext *ctx, - const gammaVertex *src, - SWvertex *dst ); - -extern void gammaInitVB( GLcontext *ctx ); -extern void gammaFreeVB( GLcontext *ctx ); - -extern void gamma_print_vertex( GLcontext *ctx, const gammaVertex *v ); -extern void gammaPrintSetupFlags(char *msg, GLuint flags ); - -#endif diff --git a/src/mesa/drivers/dri/gamma/gamma_xmesa.c b/src/mesa/drivers/dri/gamma/gamma_xmesa.c deleted file mode 100644 index 622121eed46..00000000000 --- a/src/mesa/drivers/dri/gamma/gamma_xmesa.c +++ /dev/null @@ -1,273 +0,0 @@ -/* - * Copyright 2001 by Alan Hourihane. - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that - * copyright notice and this permission notice appear in supporting - * documentation, and that the name of Alan Hourihane not be used in - * advertising or publicity pertaining to distribution of the software without - * specific, written prior permission. Alan Hourihane makes no representations - * about the suitability of this software for any purpose. It is provided - * "as is" without express or implied warranty. - * - * ALAN HOURIHANE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO - * EVENT SHALL ALAN HOURIHANE BE LIABLE FOR ANY SPECIAL, INDIRECT OR - * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - * - * Authors: Alan Hourihane, <[email protected]> - * - * 3DLabs Gamma driver - */ - -#include "gamma_context.h" -#include "gamma_macros.h" -#include "gamma_vb.h" -#include "main/context.h" -#include "main/matrix.h" -#include "glint_dri.h" - -#include "swrast/swrast.h" -#include "swrast_setup/swrast_setup.h" -#include "tnl/tnl.h" -#include "vbo/vbo.h" - -static GLboolean -gammaInitDriver(__DRIscreen *sPriv) -{ - sPriv->private = (void *) gammaCreateScreen( sPriv ); - - if (!sPriv->private) { - gammaDestroyScreen( sPriv ); - return GL_FALSE; - } - - return GL_TRUE; -} - -static void -gammaDestroyContext(__DRIcontext *driContextPriv) -{ - gammaContextPtr gmesa = (gammaContextPtr)driContextPriv->driverPrivate; - - if (gmesa) { - _swsetup_DestroyContext( gmesa->glCtx ); - _tnl_DestroyContext( gmesa->glCtx ); - _vbo_DestroyContext( gmesa->glCtx ); - _swrast_DestroyContext( gmesa->glCtx ); - - gammaFreeVB( gmesa->glCtx ); - - /* free the Mesa context */ - gmesa->glCtx->DriverCtx = NULL; - _mesa_destroy_context(gmesa->glCtx); - - FREE(gmesa); - driContextPriv->driverPrivate = NULL; - } -} - - -static GLboolean -gammaCreateBuffer( __DRIscreen *driScrnPriv, - __DRIdrawable *driDrawPriv, - const __GLcontextModes *mesaVis, - GLboolean isPixmap ) -{ - if (isPixmap) { - return GL_FALSE; /* not implemented */ - } - else { - driDrawPriv->driverPrivate = (void *) - _mesa_create_framebuffer(mesaVis, - GL_FALSE, /* software depth buffer? */ - mesaVis->stencilBits > 0, - mesaVis->accumRedBits > 0, - mesaVis->alphaBits > 0 - ); - return (driDrawPriv->driverPrivate != NULL); - } -} - - -static void -gammaDestroyBuffer(__DRIdrawable *driDrawPriv) -{ - _mesa_reference_framebuffer((GLframebuffer **)(&(driDrawPriv->driverPrivate)), NULL); -} - -static void -gammaSwapBuffers( __DRIdrawable *dPriv ) -{ - if (dPriv->driContextPriv && dPriv->driContextPriv->driverPrivate) { - gammaContextPtr gmesa; - __DRIscreen *driScrnPriv; - GLcontext *ctx; - - gmesa = (gammaContextPtr) dPriv->driContextPriv->driverPrivate; - ctx = gmesa->glCtx; - driScrnPriv = gmesa->driScreen; - - _mesa_notifySwapBuffers(ctx); - - VALIDATE_DRAWABLE_INFO(gmesa); - - /* Flush any partially filled buffers */ - FLUSH_DMA_BUFFER(gmesa); - - DRM_SPINLOCK(&driScrnPriv->pSAREA->drawable_lock, - driScrnPriv->drawLockID); - VALIDATE_DRAWABLE_INFO_NO_LOCK(gmesa); - - if (gmesa->EnabledFlags & GAMMA_BACK_BUFFER) { - int src, dst, x0, y0, x1, h; - int i; - int nRect = dPriv->numClipRects; - drm_clip_rect_t *pRect = dPriv->pClipRects; - __DRIscreen *driScrnPriv = gmesa->driScreen; - GLINTDRIPtr gDRIPriv = (GLINTDRIPtr)driScrnPriv->pDevPriv; - - CHECK_DMA_BUFFER(gmesa, 2); - WRITE(gmesa->buf, FBReadMode, (gmesa->FBReadMode | - FBReadSrcEnable)); - WRITE(gmesa->buf, LBWriteMode, LBWriteModeDisable); - - for (i = 0; i < nRect; i++, pRect++) { - x0 = pRect->x1; - x1 = pRect->x2; - h = pRect->y2 - pRect->y1; - - y0 = driScrnPriv->fbHeight - (pRect->y1+h); - if (gDRIPriv->numMultiDevices == 2) - src = (y0/2)*driScrnPriv->fbWidth+x0; - else - src = y0*driScrnPriv->fbWidth+x0; - - y0 += driScrnPriv->fbHeight; - if (gDRIPriv->numMultiDevices == 2) - dst = (y0/2)*driScrnPriv->fbWidth+x0; - else - dst = y0*driScrnPriv->fbWidth+x0; - - CHECK_DMA_BUFFER(gmesa, 9); - WRITE(gmesa->buf, StartXDom, x0<<16); /* X0dest */ - WRITE(gmesa->buf, StartY, y0<<16); /* Y0dest */ - WRITE(gmesa->buf, StartXSub, x1<<16); /* X1dest */ - WRITE(gmesa->buf, GLINTCount, h); /* H */ - WRITE(gmesa->buf, dY, 1<<16); /* ydir */ - WRITE(gmesa->buf, dXDom, 0<<16); - WRITE(gmesa->buf, dXSub, 0<<16); - WRITE(gmesa->buf, FBSourceOffset, (dst-src)); - WRITE(gmesa->buf, Render, 0x00040048); /* NOT_DONE */ - } - - /* - ** NOTE: FBSourceOffset (above) is backwards from what is - ** described in the manual (i.e., dst-src instead of src-dst) - ** due to our using the bottom-left window origin instead of the - ** top-left window origin. - */ - - /* Restore FBReadMode */ - CHECK_DMA_BUFFER(gmesa, 2); - WRITE(gmesa->buf, FBReadMode, (gmesa->FBReadMode | - gmesa->AB_FBReadMode)); - WRITE(gmesa->buf, LBWriteMode, LBWriteModeEnable); - } - - if (gmesa->EnabledFlags & GAMMA_BACK_BUFFER) - PROCESS_DMA_BUFFER_TOP_HALF(gmesa); - - DRM_SPINUNLOCK(&driScrnPriv->pSAREA->drawable_lock, - driScrnPriv->drawLockID); - VALIDATE_DRAWABLE_INFO_NO_LOCK_POST(gmesa); - - if (gmesa->EnabledFlags & GAMMA_BACK_BUFFER) - PROCESS_DMA_BUFFER_BOTTOM_HALF(gmesa); - } else { - _mesa_problem(NULL, "gammaSwapBuffers: drawable has no context!\n"); - } -} - -static GLboolean -gammaMakeCurrent(__DRIcontext *driContextPriv, - __DRIdrawable *driDrawPriv, - __DRIdrawable *driReadPriv) -{ - if (driContextPriv) { - GET_CURRENT_CONTEXT(ctx); - gammaContextPtr oldGammaCtx = ctx ? GAMMA_CONTEXT(ctx) : NULL; - gammaContextPtr newGammaCtx = (gammaContextPtr) driContextPriv->driverPrivate; - - if ( newGammaCtx != oldGammaCtx ) { - newGammaCtx->dirty = ~0; - } - - if (newGammaCtx->driDrawable != driDrawPriv) { - newGammaCtx->driDrawable = driDrawPriv; - gammaUpdateWindow ( newGammaCtx->glCtx ); - gammaUpdateViewportOffset( newGammaCtx->glCtx ); - } - -#if 0 - newGammaCtx->Window &= ~W_GIDMask; - newGammaCtx->Window |= (driDrawPriv->index << 5); - CHECK_DMA_BUFFER(newGammaCtx,1); - WRITE(newGammaCtx->buf, GLINTWindow, newGammaCtx->Window); -#endif - -newGammaCtx->new_state |= GAMMA_NEW_WINDOW; /* FIXME */ - - _mesa_make_current2( newGammaCtx->glCtx, - (GLframebuffer *) driDrawPriv->driverPrivate, - (GLframebuffer *) driReadPriv->driverPrivate ); - } else { - _mesa_make_current( 0, 0 ); - } - return GL_TRUE; -} - - -static GLboolean -gammaUnbindContext( __DRIcontext *driContextPriv ) -{ - return GL_TRUE; -} - -const struct __DriverAPIRec driDriverAPI = { - gammaInitDriver, - gammaDestroyScreen, - gammaCreateContext, - gammaDestroyContext, - gammaCreateBuffer, - gammaDestroyBuffer, - gammaSwapBuffers, - gammaMakeCurrent, - gammaUnbindContext -}; - - - -/* - * This is the bootstrap function for the driver. - * The __driCreateScreen name is the symbol that libGL.so fetches. - * Return: pointer to a __DRIscreen. - */ -void *__driCreateScreen(Display *dpy, int scrn, __DRIscreen *psc, - int numConfigs, __GLXvisualConfig *config) -{ - __DRIscreen *psp; - psp = __driUtilCreateScreen(dpy, scrn, psc, numConfigs, config, &gammaAPI); - return (void *) psp; -} - -/* This is the table of extensions that the loader will dlsym() for. */ -PUBLIC const __DRIextension *__driDriverExtensions[] = { - &driCoreExtension.base, - &driLegacyExtension.base, - NULL -}; diff --git a/src/mesa/drivers/dri/gamma/server/glint_common.h b/src/mesa/drivers/dri/gamma/server/glint_common.h deleted file mode 100644 index 36554e4ac22..00000000000 --- a/src/mesa/drivers/dri/gamma/server/glint_common.h +++ /dev/null @@ -1,63 +0,0 @@ -/* glint_common.h -- common header definitions for Gamma 2D/3D/DRM suite - * - * Copyright 2002 Tungsten Graphics, Inc., Cedar Park, Texas. - * 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 - * PRECISION INSIGHT 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. - * - * Converted to common header format: - * Jens Owen <[email protected]> - * - * - */ - -#ifndef _GLINT_COMMON_H_ -#define _GLINT_COMMON_H_ - -/* - * WARNING: If you change any of these defines, make sure to change - * the kernel include file as well (gamma_drm.h) - */ - -/* Driver specific DRM command indices - * NOTE: these are not OS specific, but they are driver specific - */ -#define DRM_GAMMA_INIT 0x00 -#define DRM_GAMMA_COPY 0x01 - -typedef struct { - enum { - GAMMA_INIT_DMA = 0x01, - GAMMA_CLEANUP_DMA = 0x02 - } func; - int sarea_priv_offset; - int pcimode; - unsigned int mmio0; - unsigned int mmio1; - unsigned int mmio2; - unsigned int mmio3; - unsigned int buffers_offset; - int num_rast; -} drmGAMMAInit; - -extern int drmGAMMAInitDMA( int fd, drmGAMMAInit *info ); -extern int drmGAMMACleanupDMA( int fd ); - -#endif diff --git a/src/mesa/drivers/dri/gamma/server/glint_dri.h b/src/mesa/drivers/dri/gamma/server/glint_dri.h deleted file mode 100644 index df1992a5d1e..00000000000 --- a/src/mesa/drivers/dri/gamma/server/glint_dri.h +++ /dev/null @@ -1,122 +0,0 @@ -/************************************************************************** - -Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. -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 PRECISION INSIGHT 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. - -**************************************************************************/ - -/* - * Author: - * Jens Owen <[email protected]> - * - */ - -#ifndef _GLINT_DRI_H_ -#define _GLINT_DRI_H_ - -#include "xf86drm.h" -#include "glint_common.h" - -typedef struct { - unsigned int GDeltaMode; - unsigned int GDepthMode; - unsigned int GGeometryMode; - unsigned int GTransformMode; -} GAMMAContextRegionRec, *GAMMAContextRegionPtr; - -typedef struct { - unsigned char next, prev; /* indices to form a circular LRU */ - unsigned char in_use; /* owned by a client, or free? */ - int age; /* tracked by clients to update local LRU's */ -} GAMMATextureRegionRec, *GAMMATextureRegionPtr; - -typedef struct { - GAMMAContextRegionRec context_state; - - unsigned int dirty; - - /* Maintain an LRU of contiguous regions of texture space. If - * you think you own a region of texture memory, and it has an - * age different to the one you set, then you are mistaken and - * it has been stolen by another client. If global texAge - * hasn't changed, there is no need to walk the list. - * - * These regions can be used as a proxy for the fine-grained - * texture information of other clients - by maintaining them - * in the same lru which is used to age their own textures, - * clients have an approximate lru for the whole of global - * texture space, and can make informed decisions as to which - * areas to kick out. There is no need to choose whether to - * kick out your own texture or someone else's - simply eject - * them all in LRU order. - */ - -#define GAMMA_NR_TEX_REGIONS 64 - GAMMATextureRegionRec texList[GAMMA_NR_TEX_REGIONS+1]; - /* Last elt is sentinal */ - int texAge; /* last time texture was uploaded */ - int last_enqueue; /* last time a buffer was enqueued */ - int last_dispatch; /* age of the most recently dispatched buffer */ - int last_quiescent; /* */ - int ctxOwner; /* last context to upload state */ - - int vertex_prim; -} GLINTSAREADRIRec, *GLINTSAREADRIPtr; - -/* - * Glint specific record passed back to client driver - * via DRIGetDeviceInfo request - */ -typedef struct { - drmRegion registers0; - drmRegion registers1; - drmRegion registers2; - drmRegion registers3; - int numMultiDevices; - int pprod; - int cpp; - int frontOffset; - int frontPitch; - int backOffset; - int backPitch; - int backX; - int backY; - int depthOffset; - int depthPitch; - int textureSize; - int logTextureGranularity; -} GLINTDRIRec, *GLINTDRIPtr; - -#define GLINT_DRI_BUF_COUNT 256 -#define GLINT_DRI_BUF_SIZE 4096 - -#define GAMMA_NR_TEX_REGIONS 64 - -#define DMA_WRITE(val,reg) \ -do { \ - pGlint->buf2D++ = Glint##reg##Tag; \ - pGlint->buf2D++ = val; \ -} while (0) - -#endif /* _GLINT_DRI_H_ */ diff --git a/src/mesa/drivers/dri/i810/Makefile b/src/mesa/drivers/dri/i810/Makefile index 3874faee518..54a837d5ea9 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/i810texmem.c b/src/mesa/drivers/dri/i810/i810texmem.c index bb426a41122..6e6b21cf2b9 100644 --- a/src/mesa/drivers/dri/i810/i810texmem.c +++ b/src/mesa/drivers/dri/i810/i810texmem.c @@ -155,6 +155,7 @@ int i810UploadTexImagesLocked( i810ContextPtr imesa, i810TextureObjectPtr t ) return -1; } + assert(t->base.memBlock); ofs = t->base.memBlock->ofs; t->BufAddr = imesa->i810Screen->tex.map + ofs; t->Setup[I810_TEXREG_MI3] = imesa->i810Screen->textureOffset + ofs; diff --git a/src/mesa/drivers/dri/i810/i810tris.c b/src/mesa/drivers/dri/i810/i810tris.c index 213ba541cee..1492f711c93 100644 --- a/src/mesa/drivers/dri/i810/i810tris.c +++ b/src/mesa/drivers/dri/i810/i810tris.c @@ -218,7 +218,6 @@ static struct { #define DO_POINTS 1 #define DO_FULL_QUAD 1 -#define HAVE_RGBA 1 #define HAVE_SPEC 1 #define HAVE_BACK_COLORS 0 #define HAVE_HW_FLATSHADE 1 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 f52797c5ed2..00000000000 --- 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 ([email protected]) - */ - -#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 dc15ae425c9..5b49d0c77c6 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_context.h b/src/mesa/drivers/dri/i915/i830_context.h index b755d48678b..d7eb9c2d44b 100644 --- a/src/mesa/drivers/dri/i915/i830_context.h +++ b/src/mesa/drivers/dri/i915/i830_context.h @@ -34,7 +34,8 @@ #define I830_FALLBACK_COLORMASK 0x2000 #define I830_FALLBACK_STENCIL 0x4000 #define I830_FALLBACK_STIPPLE 0x8000 -#define I830_FALLBACK_LOGICOP 0x10000 +#define I830_FALLBACK_LOGICOP 0x20000 +#define I830_FALLBACK_DRAW_OFFSET 0x200000 #define I830_UPLOAD_CTX 0x1 #define I830_UPLOAD_BUFFERS 0x2 diff --git a/src/mesa/drivers/dri/i915/i830_texstate.c b/src/mesa/drivers/dri/i915/i830_texstate.c index 7525f9f2e05..e8f7e378ec7 100644 --- a/src/mesa/drivers/dri/i915/i830_texstate.c +++ b/src/mesa/drivers/dri/i915/i830_texstate.c @@ -122,6 +122,7 @@ i830_update_tex_unit(struct intel_context *intel, GLuint unit, GLuint ss3) GLuint *state = i830->state.Tex[unit], format, pitch; GLint lodbias; GLubyte border[4]; + GLuint dst_x, dst_y; memset(state, 0, sizeof(state)); @@ -132,7 +133,7 @@ i830_update_tex_unit(struct intel_context *intel, GLuint unit, GLuint ss3) i830->state.tex_buffer[unit] = NULL; } - if (!intelObj->imageOverride && !intel_finalize_mipmap_tree(intel, unit)) + if (!intel_finalize_mipmap_tree(intel, unit)) return GL_FALSE; /* Get first image here, since intelObj->firstLevel will get set in @@ -140,42 +141,20 @@ i830_update_tex_unit(struct intel_context *intel, GLuint unit, GLuint ss3) */ firstImage = tObj->Image[0][intelObj->firstLevel]; - if (intelObj->imageOverride) { - i830->state.tex_buffer[unit] = NULL; - i830->state.tex_offset[unit] = intelObj->textureOffset; + intel_miptree_get_image_offset(intelObj->mt, intelObj->firstLevel, 0, 0, + &dst_x, &dst_y); - switch (intelObj->depthOverride) { - case 32: - format = MAPSURF_32BIT | MT_32BIT_ARGB8888; - break; - case 24: - default: - format = MAPSURF_32BIT | MT_32BIT_XRGB8888; - break; - case 16: - format = MAPSURF_16BIT | MT_16BIT_RGB565; - break; - } - - pitch = intelObj->pitchOverride; - } else { - GLuint dst_x, dst_y; - - intel_miptree_get_image_offset(intelObj->mt, intelObj->firstLevel, 0, 0, - &dst_x, &dst_y); - - dri_bo_reference(intelObj->mt->region->buffer); - i830->state.tex_buffer[unit] = intelObj->mt->region->buffer; - /* 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; + dri_bo_reference(intelObj->mt->region->buffer); + i830->state.tex_buffer[unit] = intelObj->mt->region->buffer; + /* 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; - format = translate_texture_format(firstImage->TexFormat, - firstImage->InternalFormat); - pitch = intelObj->mt->pitch * intelObj->mt->cpp; - } + 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/i830_vtbl.c b/src/mesa/drivers/dri/i915/i830_vtbl.c index a8df77c600e..be96419ff19 100644 --- a/src/mesa/drivers/dri/i915/i830_vtbl.c +++ b/src/mesa/drivers/dri/i915/i830_vtbl.c @@ -496,15 +496,13 @@ i830_emit_state(struct intel_context *intel) OUT_BATCH(state->Buffer[I830_DESTREG_CBUFADDR0]); OUT_BATCH(state->Buffer[I830_DESTREG_CBUFADDR1]); OUT_RELOC(state->draw_region->buffer, - I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER, - state->draw_region->draw_offset); + I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER, 0); if (state->depth_region) { OUT_BATCH(state->Buffer[I830_DESTREG_DBUFADDR0]); OUT_BATCH(state->Buffer[I830_DESTREG_DBUFADDR1]); OUT_RELOC(state->depth_region->buffer, - I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER, - state->depth_region->draw_offset); + I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER, 0); } OUT_BATCH(state->Buffer[I830_DESTREG_DV0]); @@ -598,6 +596,7 @@ i830_set_draw_region(struct intel_context *intel, struct intel_renderbuffer *irb = intel_renderbuffer(rb); GLuint value; struct i830_hw_state *state = &i830->state; + uint32_t draw_x, draw_y; if (state->draw_region != color_regions[0]) { intel_region_release(&state->draw_region); @@ -652,14 +651,40 @@ i830_set_draw_region(struct intel_context *intel, } state->Buffer[I830_DESTREG_DV1] = value; + /* We set up the drawing rectangle to be offset into the color + * region's location in the miptree. If it doesn't match with + * depth's offsets, we can't render to it. + * + * (Well, not actually true -- the hw grew a bit to let depth's + * offset get forced to 0,0. We may want to use that if people are + * hitting that case. Also, some configurations may be supportable + * by tweaking the start offset of the buffers around, which we + * can't do in general due to tiling) + */ + FALLBACK(intel, I830_FALLBACK_DRAW_OFFSET, + (depth_region && color_regions[0]) && + (depth_region->draw_x != color_regions[0]->draw_x || + depth_region->draw_y != color_regions[0]->draw_y)); + + if (color_regions[0]) { + draw_x = color_regions[0]->draw_x; + draw_y = color_regions[0]->draw_y; + } else if (depth_region) { + draw_x = depth_region->draw_x; + draw_y = depth_region->draw_y; + } else { + draw_x = 0; + draw_y = 0; + } + state->Buffer[I830_DESTREG_DRAWRECT0] = _3DSTATE_DRAWRECT_INFO; state->Buffer[I830_DESTREG_DRAWRECT1] = 0; - state->Buffer[I830_DESTREG_DRAWRECT2] = 0; /* xmin, ymin */ + state->Buffer[I830_DESTREG_DRAWRECT2] = (draw_y << 16) | draw_x; state->Buffer[I830_DESTREG_DRAWRECT3] = - (ctx->DrawBuffer->Width & 0xffff) | - (ctx->DrawBuffer->Height << 16); - state->Buffer[I830_DESTREG_DRAWRECT4] = 0; /* xoff, yoff */ - state->Buffer[I830_DESTREG_DRAWRECT5] = 0; + ((ctx->DrawBuffer->Width + draw_x) & 0xffff) | + ((ctx->DrawBuffer->Height + draw_y) << 16); + state->Buffer[I830_DESTREG_DRAWRECT4] = (draw_y << 16) | draw_x; + state->Buffer[I830_DESTREG_DRAWRECT5] = MI_NOOP; I830_STATECHANGE(i830, I830_UPLOAD_BUFFERS); } diff --git a/src/mesa/drivers/dri/i915/i915_context.h b/src/mesa/drivers/dri/i915/i915_context.h index 60b357ec28d..b5169280f6b 100644 --- a/src/mesa/drivers/dri/i915/i915_context.h +++ b/src/mesa/drivers/dri/i915/i915_context.h @@ -40,6 +40,7 @@ #define I915_FALLBACK_POLYGON_SMOOTH 0x40000 #define I915_FALLBACK_POINT_SMOOTH 0x80000 #define I915_FALLBACK_POINT_SPRITE_COORD_ORIGIN 0x100000 +#define I915_FALLBACK_DRAW_OFFSET 0x200000 #define I915_UPLOAD_CTX 0x1 #define I915_UPLOAD_BUFFERS 0x2 diff --git a/src/mesa/drivers/dri/i915/i915_texstate.c b/src/mesa/drivers/dri/i915/i915_texstate.c index 3ee4c8653a9..a1ab8f8b6d2 100644 --- a/src/mesa/drivers/dri/i915/i915_texstate.c +++ b/src/mesa/drivers/dri/i915/i915_texstate.c @@ -150,7 +150,7 @@ i915_update_tex_unit(struct intel_context *intel, GLuint unit, GLuint ss3) i915->state.tex_buffer[unit] = NULL; } - if (!intelObj->imageOverride && !intel_finalize_mipmap_tree(intel, unit)) + if (!intel_finalize_mipmap_tree(intel, unit)) return GL_FALSE; /* Get first image here, since intelObj->firstLevel will get set in @@ -158,34 +158,14 @@ i915_update_tex_unit(struct intel_context *intel, GLuint unit, GLuint ss3) */ firstImage = tObj->Image[0][intelObj->firstLevel]; - if (intelObj->imageOverride) { - i915->state.tex_buffer[unit] = NULL; - i915->state.tex_offset[unit] = intelObj->textureOffset; + dri_bo_reference(intelObj->mt->region->buffer); + i915->state.tex_buffer[unit] = intelObj->mt->region->buffer; + i915->state.tex_offset[unit] = 0; /* Always the origin of the miptree */ - switch (intelObj->depthOverride) { - case 32: - format = MAPSURF_32BIT | MT_32BIT_ARGB8888; - break; - case 24: - default: - format = MAPSURF_32BIT | MT_32BIT_XRGB8888; - break; - case 16: - format = MAPSURF_16BIT | MT_16BIT_RGB565; - break; - } - - pitch = intelObj->pitchOverride; - } else { - dri_bo_reference(intelObj->mt->region->buffer); - i915->state.tex_buffer[unit] = intelObj->mt->region->buffer; - i915->state.tex_offset[unit] = 0; /* Always the origin of the miptree */ - - format = translate_texture_format(firstImage->TexFormat, - firstImage->InternalFormat, - tObj->DepthMode); - pitch = intelObj->mt->pitch * intelObj->mt->cpp; - } + format = translate_texture_format(firstImage->TexFormat, + firstImage->InternalFormat, + tObj->DepthMode); + pitch = intelObj->mt->pitch * intelObj->mt->cpp; state[I915_TEXREG_MS3] = (((firstImage->Height - 1) << MS3_HEIGHT_SHIFT) | diff --git a/src/mesa/drivers/dri/i915/i915_vtbl.c b/src/mesa/drivers/dri/i915/i915_vtbl.c index 30aaab78c8f..0a93e64b1fa 100644 --- a/src/mesa/drivers/dri/i915/i915_vtbl.c +++ b/src/mesa/drivers/dri/i915/i915_vtbl.c @@ -378,15 +378,13 @@ i915_emit_state(struct intel_context *intel) OUT_BATCH(state->Buffer[I915_DESTREG_CBUFADDR0]); OUT_BATCH(state->Buffer[I915_DESTREG_CBUFADDR1]); OUT_RELOC(state->draw_region->buffer, - I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER, - state->draw_region->draw_offset); + I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER, 0); if (state->depth_region) { OUT_BATCH(state->Buffer[I915_DESTREG_DBUFADDR0]); OUT_BATCH(state->Buffer[I915_DESTREG_DBUFADDR1]); OUT_RELOC(state->depth_region->buffer, - I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER, - state->depth_region->draw_offset); + I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER, 0); } OUT_BATCH(state->Buffer[I915_DESTREG_DV0]); @@ -534,6 +532,7 @@ i915_set_draw_region(struct intel_context *intel, struct intel_renderbuffer *irb = intel_renderbuffer(rb); GLuint value; struct i915_hw_state *state = &i915->state; + uint32_t draw_x, draw_y; if (state->draw_region != color_regions[0]) { intel_region_release(&state->draw_region); @@ -596,14 +595,41 @@ i915_set_draw_region(struct intel_context *intel, } state->Buffer[I915_DESTREG_DV1] = value; - state->Buffer[I915_DESTREG_DRAWRECT0] = _3DSTATE_DRAWRECT_INFO; - state->Buffer[I915_DESTREG_DRAWRECT1] = 0; - state->Buffer[I915_DESTREG_DRAWRECT2] = 0; /* xmin, ymin */ - state->Buffer[I915_DESTREG_DRAWRECT3] = - (ctx->DrawBuffer->Width & 0xffff) | - (ctx->DrawBuffer->Height << 16); - state->Buffer[I915_DESTREG_DRAWRECT4] = 0; /* xoff, yoff */ - state->Buffer[I915_DESTREG_DRAWRECT5] = 0; + /* We set up the drawing rectangle to be offset into the color + * region's location in the miptree. If it doesn't match with + * depth's offsets, we can't render to it. + * + * (Well, not actually true -- the hw grew a bit to let depth's + * offset get forced to 0,0. We may want to use that if people are + * hitting that case. Also, some configurations may be supportable + * by tweaking the start offset of the buffers around, which we + * can't do in general due to tiling) + */ + FALLBACK(intel, I915_FALLBACK_DRAW_OFFSET, + (depth_region && color_regions[0]) && + (depth_region->draw_x != color_regions[0]->draw_x || + depth_region->draw_y != color_regions[0]->draw_y)); + + if (color_regions[0]) { + draw_x = color_regions[0]->draw_x; + draw_y = color_regions[0]->draw_y; + } else if (depth_region) { + draw_x = depth_region->draw_x; + draw_y = depth_region->draw_y; + } else { + draw_x = 0; + draw_y = 0; + } + + /* When changing drawing rectangle offset, an MI_FLUSH is first required. */ + state->Buffer[I915_DESTREG_DRAWRECT0] = MI_FLUSH; + state->Buffer[I915_DESTREG_DRAWRECT1] = _3DSTATE_DRAWRECT_INFO; + state->Buffer[I915_DESTREG_DRAWRECT2] = 0; + state->Buffer[I915_DESTREG_DRAWRECT3] = (draw_y << 16) | draw_x; + state->Buffer[I915_DESTREG_DRAWRECT4] = + ((ctx->DrawBuffer->Width + draw_x) & 0xffff) | + ((ctx->DrawBuffer->Height + draw_y) << 16); + state->Buffer[I915_DESTREG_DRAWRECT5] = (draw_y << 16) | draw_x; I915_STATECHANGE(i915, I915_UPLOAD_BUFFERS); } diff --git a/src/mesa/drivers/dri/i915/intel_tris.c b/src/mesa/drivers/dri/i915/intel_tris.c index 0afbda2436b..fb191fe346f 100644 --- a/src/mesa/drivers/dri/i915/intel_tris.c +++ b/src/mesa/drivers/dri/i915/intel_tris.c @@ -603,7 +603,6 @@ static struct #define DO_POINTS 1 #define DO_FULL_QUAD 1 -#define HAVE_RGBA 1 #define HAVE_SPEC 1 #define HAVE_BACK_COLORS 0 #define HAVE_HW_FLATSHADE 1 @@ -1177,6 +1176,8 @@ static char *fallbackStrings[] = { [17] = "Logic op", [18] = "Smooth polygon", [19] = "Smooth point", + [20] = "point sprite coord origin", + [21] = "depth/color drawing offset", }; 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 effdd26448a..00000000000 --- 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 7758a792fde..842d4b7aa10 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 \ @@ -84,11 +85,21 @@ DRIVER_SOURCES = \ brw_wm_pass2.c \ brw_wm_sampler_state.c \ brw_wm_state.c \ - brw_wm_surface_state.c + brw_wm_surface_state.c \ + gen6_cc.c \ + gen6_clip_state.c \ + gen6_depthstencil.c \ + gen6_gs_state.c \ + gen6_sampler_state.c \ + gen6_scissor_state.c \ + gen6_sf_state.c \ + gen6_urb.c \ + gen6_viewport_state.c \ + gen6_vs_state.c \ + gen6_wm_state.c 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 2ca29b7ae11..241193c3579 100644 --- a/src/mesa/drivers/dri/i965/brw_context.c +++ b/src/mesa/drivers/dri/i965/brw_context.c @@ -150,12 +150,13 @@ GLboolean brwCreateContext( const __GLcontextModes *mesaVis, MIN2(ctx->Const.FragmentProgram.MaxNativeParameters, ctx->Const.FragmentProgram.MaxEnvParams); - if (intel->is_ironlake || intel->is_g4x) { + if (intel->is_ironlake || intel->is_g4x || intel->gen >= 6) { brw->CMD_VF_STATISTICS = CMD_VF_STATISTICS_GM45; brw->CMD_PIPELINE_SELECT = CMD_PIPELINE_SELECT_GM45; 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; @@ -170,7 +171,7 @@ GLboolean brwCreateContext( const __GLcontextModes *mesaVis, brw->urb.size = 384; brw->vs_max_threads = 32; brw->wm_max_threads = 10 * 5; - } else { + } else if (intel->gen < 6) { brw->urb.size = 256; brw->vs_max_threads = 16; brw->wm_max_threads = 8 * 4; diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h index 21c4cd38a72..2855c93ea66 100644 --- a/src/mesa/drivers/dri/i965/brw_context.h +++ b/src/mesa/drivers/dri/i965/brw_context.h @@ -282,6 +282,9 @@ struct brw_vs_ouput_sizes { enum brw_cache_id { + BRW_BLEND_STATE, + BRW_DEPTH_STENCIL_STATE, + BRW_COLOR_CALC_STATE, BRW_CC_VP, BRW_CC_UNIT, BRW_WM_PROG, @@ -290,7 +293,7 @@ enum brw_cache_id { BRW_WM_UNIT, BRW_SF_PROG, BRW_SF_VP, - BRW_SF_UNIT, + BRW_SF_UNIT, /* scissor state on gen6 */ BRW_VS_UNIT, BRW_VS_PROG, BRW_GS_UNIT, @@ -354,6 +357,9 @@ struct brw_tracked_state { /* Flags for brw->state.cache. */ +#define CACHE_NEW_BLEND_STATE (1<<BRW_BLEND_STATE) +#define CACHE_NEW_DEPTH_STENCIL_STATE (1<<BRW_DEPTH_STENCIL_STATE) +#define CACHE_NEW_COLOR_CALC_STATE (1<<BRW_COLOR_CALC_STATE) #define CACHE_NEW_CC_VP (1<<BRW_CC_VP) #define CACHE_NEW_CC_UNIT (1<<BRW_CC_UNIT) #define CACHE_NEW_WM_PROG (1<<BRW_WM_PROG) @@ -440,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; @@ -538,7 +545,8 @@ struct brw_context GLuint nr_sf_entries; GLuint nr_cs_entries; -/* GLuint vs_size; */ + /* gen6 */ + GLuint vs_size; /* GLuint gs_size; */ /* GLuint clip_size; */ /* GLuint sf_size; */ @@ -643,9 +651,16 @@ struct brw_context struct { + /* gen4 */ dri_bo *prog_bo; - dri_bo *state_bo; dri_bo *vp_bo; + + /* gen6 */ + dri_bo *blend_state_bo; + dri_bo *depth_stencil_state_bo; + dri_bo *color_calc_state_bo; + + dri_bo *state_bo; } cc; struct { diff --git a/src/mesa/drivers/dri/i965/brw_curbe.c b/src/mesa/drivers/dri/i965/brw_curbe.c index 6f2ead793d2..4e78b08cfed 100644 --- a/src/mesa/drivers/dri/i965/brw_curbe.c +++ b/src/mesa/drivers/dri/i965/brw_curbe.c @@ -179,7 +179,6 @@ static GLfloat fixed_plane[6][4] = { */ static void prepare_constant_buffer(struct brw_context *brw) { - struct intel_context *intel = &brw->intel; GLcontext *ctx = &brw->intel.ctx; const struct brw_vertex_program *vp = brw_vertex_program_const(brw->vertex_program); @@ -307,7 +306,7 @@ static void prepare_constant_buffer(struct brw_context *brw) if (brw->curbe.curbe_bo != NULL && brw->curbe.curbe_next_offset + bufsz > brw->curbe.curbe_bo->size) { - intel_bo_unmap_gtt_preferred(intel, brw->curbe.curbe_bo); + drm_intel_gem_bo_unmap_gtt(brw->curbe.curbe_bo); dri_bo_unreference(brw->curbe.curbe_bo); brw->curbe.curbe_bo = NULL; } @@ -319,7 +318,7 @@ static void prepare_constant_buffer(struct brw_context *brw) brw->curbe.curbe_bo = dri_bo_alloc(brw->intel.bufmgr, "CURBE", 4096, 1 << 6); brw->curbe.curbe_next_offset = 0; - intel_bo_map_gtt_preferred(intel, brw->curbe.curbe_bo, GL_TRUE); + drm_intel_gem_bo_map_gtt(brw->curbe.curbe_bo); } brw->curbe.curbe_offset = brw->curbe.curbe_next_offset; diff --git a/src/mesa/drivers/dri/i965/brw_defines.h b/src/mesa/drivers/dri/i965/brw_defines.h index ea0d7e05d41..984e56d00c8 100644 --- a/src/mesa/drivers/dri/i965/brw_defines.h +++ b/src/mesa/drivers/dri/i965/brw_defines.h @@ -530,6 +530,7 @@ #define BRW_OPCODE_POP 47 #define BRW_OPCODE_WAIT 48 #define BRW_OPCODE_SEND 49 +#define BRW_OPCODE_MATH 56 #define BRW_OPCODE_ADD 64 #define BRW_OPCODE_MUL 65 #define BRW_OPCODE_AVG 66 @@ -549,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 @@ -727,7 +729,8 @@ #define BRW_MATH_FUNCTION_SIN 6 /* was 7 */ #define BRW_MATH_FUNCTION_COS 7 /* was 8 */ #define BRW_MATH_FUNCTION_SINCOS 8 /* was 6 */ -#define BRW_MATH_FUNCTION_TAN 9 +#define BRW_MATH_FUNCTION_TAN 9 /* gen4 */ +#define BRW_MATH_FUNCTION_FDIV 9 /* gen6+ */ #define BRW_MATH_FUNCTION_POW 10 #define BRW_MATH_FUNCTION_INT_DIV_QUOTIENT_AND_REMAINDER 11 #define BRW_MATH_FUNCTION_INT_DIV_QUOTIENT 12 @@ -778,17 +781,33 @@ #define CMD_PIPELINED_STATE_POINTERS 0x7800 #define CMD_BINDING_TABLE_PTRS 0x7801 +# define GEN6_BINDING_TABLE_MODIFY_VS (1 << 8) +# define GEN6_BINDING_TABLE_MODIFY_GS (1 << 9) +# define GEN6_BINDING_TABLE_MODIFY_PS (1 << 10) + +#define CMD_3D_SAMPLER_STATE_POINTERS 0x7802 /* SNB+ */ +# define PS_SAMPLER_STATE_CHANGE (1 << 12) +# define GS_SAMPLER_STATE_CHANGE (1 << 9) +# define VS_SAMPLER_STATE_CHANGE (1 << 8) +/* DW1: VS */ +/* DW2: GS */ +/* DW3: PS */ #define CMD_VERTEX_BUFFER 0x7808 # define BRW_VB0_INDEX_SHIFT 27 +# define GEN6_VB0_INDEX_SHIFT 26 # define BRW_VB0_ACCESS_VERTEXDATA (0 << 26) # define BRW_VB0_ACCESS_INSTANCEDATA (1 << 26) +# define GEN6_VB0_ACCESS_VERTEXDATA (0 << 20) +# define GEN6_VB0_ACCESS_INSTANCEDATA (1 << 20) # define BRW_VB0_PITCH_SHIFT 0 #define CMD_VERTEX_ELEMENT 0x7809 # define BRW_VE0_INDEX_SHIFT 27 +# define GEN6_VE0_INDEX_SHIFT 26 # define BRW_VE0_FORMAT_SHIFT 16 # define BRW_VE0_VALID (1 << 26) +# define GEN6_VE0_VALID (1 << 25) # define BRW_VE0_SRC_OFFSET_SHIFT 0 # define BRW_VE1_COMPONENT_NOSTORE 0 # define BRW_VE1_COMPONENT_STORE_SRC 1 @@ -805,8 +824,219 @@ # define BRW_VE1_DST_OFFSET_SHIFT 0 #define CMD_INDEX_BUFFER 0x780a -#define CMD_VF_STATISTICS_965 0x780b +#define CMD_VF_STATISTICS_965 0x780b #define CMD_VF_STATISTICS_GM45 0x680b +#define CMD_3D_CC_STATE_POINTERS 0x780e /* GEN6+ */ + +#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 CMD_VIEWPORT_STATE_POINTERS 0x780d /* GEN6+ */ +# define GEN6_CC_VIEWPORT_MODIFY (1 << 12) +# define GEN6_SF_VIEWPORT_MODIFY (1 << 11) +# define GEN6_CLIP_VIEWPORT_MODIFY (1 << 10) + +#define CMD_3D_SCISSOR_STATE_POINTERS 0x780f /* GEN6+ */ + +#define CMD_3D_VS_STATE 0x7810 /* GEN6+ */ +/* DW2 */ +# define GEN6_VS_SPF_MODE (1 << 31) +# define GEN6_VS_VECTOR_MASK_ENABLE (1 << 30) +# define GEN6_VS_SAMPLER_COUNT_SHIFT 27 +# define GEN6_VS_BINDING_TABLE_ENTRY_COUNT_SHIFT 18 +/* DW4 */ +# define GEN6_VS_DISPATCH_START_GRF_SHIFT 20 +# define GEN6_VS_URB_READ_LENGTH_SHIFT 11 +# define GEN6_VS_URB_ENTRY_READ_OFFSET_SHIFT 4 +/* DW5 */ +# define GEN6_VS_MAX_THREADS_SHIFT 25 +# define GEN6_VS_STATISTICS_ENABLE (1 << 10) +# define GEN6_VS_CACHE_DISABLE (1 << 1) +# define GEN6_VS_ENABLE (1 << 0) + +#define CMD_3D_GS_STATE 0x7811 /* GEN6+ */ +/* DW2 */ +# define GEN6_GS_SPF_MODE (1 << 31) +# define GEN6_GS_VECTOR_MASK_ENABLE (1 << 30) +# define GEN6_GS_SAMPLER_COUNT_SHIFT 27 +# define GEN6_GS_BINDING_TABLE_ENTRY_COUNT_SHIFT 18 +/* DW4 */ +# define GEN6_GS_URB_READ_LENGTH_SHIFT 11 +# define GEN6_GS_URB_ENTRY_READ_OFFSET_SHIFT 4 +# define GEN6_GS_DISPATCH_START_GRF_SHIFT 0 +/* DW5 */ +# define GEN6_GS_MAX_THREADS_SHIFT 25 +# define GEN6_GS_STATISTICS_ENABLE (1 << 10) +# define GEN6_GS_SO_STATISTICS_ENABLE (1 << 9) +# define GEN6_GS_RENDERING_ENABLE (1 << 8) +/* DW6 */ +# define GEN6_GS_ENABLE (1 << 15) + +#define CMD_3D_CLIP_STATE 0x7812 /* GEN6+ */ +/* DW1 */ +# define GEN6_CLIP_STATISTICS_ENABLE (1 << 10) +/* DW2 */ +# define GEN6_CLIP_ENABLE (1 << 31) +# define GEN6_CLIP_API_OGL (0 << 30) +# define GEN6_CLIP_API_D3D (1 << 30) +# define GEN6_CLIP_XY_TEST (1 << 28) +# define GEN6_CLIP_Z_TEST (1 << 27) +# define GEN6_CLIP_GB_TEST (1 << 26) +# define GEN6_CLIP_MODE_NORMAL (0 << 13) +# define GEN6_CLIP_MODE_REJECT_ALL (3 << 13) +# define GEN6_CLIP_MODE_ACCEPT_ALL (4 << 13) +# define GEN6_CLIP_PERSPECTIVE_DIVIDE_DISABLE (1 << 9) +# define GEN6_CLIP_BARYCENTRIC_ENABLE (1 << 8) +# define GEN6_CLIP_TRI_PROVOKE_SHIFT 4 +# define GEN6_CLIP_LINE_PROVOKE_SHIFT 2 +# define GEN6_CLIP_TRIFAN_PROVOKE_SHIFT 0 +/* DW3 */ +# define GEN6_CLIP_MIN_POINT_WIDTH_SHIFT 17 +# define GEN6_CLIP_MAX_POINT_WIDTH_SHIFT 6 + +#define CMD_3D_SF_STATE 0x7813 /* GEN6+ */ +/* DW1 */ +# define GEN6_SF_NUM_OUTPUTS_SHIFT 22 +# define GEN6_SF_SWIZZLE_ENABLE (1 << 21) +# define GEN6_SF_POINT_SPRITE_LOWERLEFT (1 << 20) +# define GEN6_SF_URB_ENTRY_READ_LENGTH_SHIFT 11 +# define GEN6_SF_URB_ENTRY_READ_OFFSET_SHIFT 4 +/* DW2 */ +# define GEN6_SF_LEGACY_GLOBAL_DEPTH_BIAS (1 << 11) +# define GEN6_SF_STATISTICS_ENABLE (1 << 10) +# define GEN6_SF_GLOBAL_DEPTH_OFFSET_SOLID (1 << 9) +# define GEN6_SF_GLOBAL_DEPTH_OFFSET_WIREFRAME (1 << 8) +# define GEN6_SF_GLOBAL_DEPTH_OFFSET_POINT (1 << 7) +# define GEN6_SF_FRONT_SOLID (0 << 5) +# define GEN6_SF_FRONT_WIREFRAME (1 << 5) +# define GEN6_SF_FRONT_POINT (2 << 5) +# define GEN6_SF_BACK_SOLID (0 << 3) +# define GEN6_SF_BACK_WIREFRAME (1 << 3) +# define GEN6_SF_BACK_POINT (2 << 3) +# define GEN6_SF_VIEWPORT_TRANSFORM_ENABLE (1 << 1) +# define GEN6_SF_WINDING_CCW (1 << 0) +/* DW3 */ +# define GEN6_SF_LINE_AA_ENABLE (1 << 31) +# define GEN6_SF_CULL_BOTH (0 << 29) +# define GEN6_SF_CULL_NONE (1 << 29) +# define GEN6_SF_CULL_FRONT (2 << 29) +# define GEN6_SF_CULL_BACK (3 << 29) +# define GEN6_SF_LINE_WIDTH_SHIFT 18 /* U3.7 */ +# define GEN6_SF_LINE_END_CAP_WIDTH_0_5 (0 << 16) +# define GEN6_SF_LINE_END_CAP_WIDTH_1_0 (1 << 16) +# define GEN6_SF_LINE_END_CAP_WIDTH_2_0 (2 << 16) +# define GEN6_SF_LINE_END_CAP_WIDTH_4_0 (3 << 16) +# define GEN6_SF_SCISSOR_ENABLE (1 << 11) +# define GEN6_SF_MSRAST_OFF_PIXEL (0 << 8) +# define GEN6_SF_MSRAST_OFF_PATTERN (1 << 8) +# define GEN6_SF_MSRAST_ON_PIXEL (2 << 8) +# define GEN6_SF_MSRAST_ON_PATTERN (3 << 8) +/* DW4 */ +# define GEN6_SF_TRI_PROVOKE_SHIFT 29 +# define GEN6_SF_LINE_PROVOKE_SHIFT 27 +# define GEN6_SF_TRIFAN_PROVOKE_SHIFT 25 +# define GEN6_SF_LINE_AA_MODE_MANHATTAN (0 << 14) +# define GEN6_SF_LINE_AA_MODE_TRUE (1 << 14) +# define GEN6_SF_VERTEX_SUBPIXEL_8BITS (0 << 12) +# define GEN6_SF_VERTEX_SUBPIXEL_4BITS (1 << 12) +# define GEN6_SF_USE_STATE_POINT_WIDTH (1 << 11) +# define GEN6_SF_POINT_WIDTH_SHIFT 0 /* U8.3 */ +/* DW5: depth offset constant */ +/* DW6: depth offset scale */ +/* DW7: depth offset clamp */ +/* DW8 */ +# define ATTRIBUTE_1_OVERRIDE_W (1 << 31) +# define ATTRIBUTE_1_OVERRIDE_Z (1 << 30) +# define ATTRIBUTE_1_OVERRIDE_Y (1 << 29) +# define ATTRIBUTE_1_OVERRIDE_X (1 << 28) +# define ATTRIBUTE_1_CONST_SOURCE_SHIFT 25 +# define ATTRIBUTE_1_SWIZZLE_SHIFT 22 +# define ATTRIBUTE_1_SOURCE_SHIFT 16 +# define ATTRIBUTE_0_OVERRIDE_W (1 << 15) +# define ATTRIBUTE_0_OVERRIDE_Z (1 << 14) +# define ATTRIBUTE_0_OVERRIDE_Y (1 << 13) +# define ATTRIBUTE_0_OVERRIDE_X (1 << 12) +# define ATTRIBUTE_0_CONST_SOURCE_SHIFT 9 +# define ATTRIBUTE_0_SWIZZLE_SHIFT 6 +# define ATTRIBUTE_0_SOURCE_SHIFT 0 +/* DW16: Point sprite texture coordinate enables */ +/* DW17: Constant interpolation enables */ +/* DW18: attr 0-7 wrap shortest enables */ +/* DW19: attr 8-16 wrap shortest enables */ + +#define CMD_3D_WM_STATE 0x7814 /* GEN6+ */ +/* DW1: kernel pointer */ +/* DW2 */ +# define GEN6_WM_SPF_MODE (1 << 31) +# define GEN6_WM_VECTOR_MASK_ENABLE (1 << 30) +# define GEN6_WM_SAMPLER_COUNT_SHIFT 27 +# define GEN6_WM_BINDING_TABLE_ENTRY_COUNT_SHIFT 18 +/* DW3: scratch space */ +/* DW4 */ +# define GEN6_WM_STATISTICS_ENABLE (1 << 31) +# define GEN6_WM_DEPTH_CLEAR (1 << 30) +# define GEN6_WM_DEPTH_RESOLVE (1 << 28) +# define GEN6_WM_HIERARCHICAL_DEPTH_RESOLVE (1 << 27) +# define GEN6_WM_DISPATCH_START_GRF_SHIFT_0 16 +# define GEN6_WM_DISPATCH_START_GRF_SHIFT_1 8 +# define GEN6_WM_DISPATCH_START_GRF_SHIFT_2 0 +/* DW5 */ +# define GEN6_WM_MAX_THREADS_SHIFT 25 +# define GEN6_WM_KILL_ENABLE (1 << 22) +# define GEN6_WM_COMPUTED_DEPTH (1 << 21) +# define GEN6_WM_USES_SOURCE_DEPTH (1 << 20) +# define GEN6_WM_DISPATCH_ENABLE (1 << 19) +# define GEN6_WM_LINE_END_CAP_AA_WIDTH_0_5 (0 << 16) +# define GEN6_WM_LINE_END_CAP_AA_WIDTH_1_0 (1 << 16) +# define GEN6_WM_LINE_END_CAP_AA_WIDTH_2_0 (2 << 16) +# define GEN6_WM_LINE_END_CAP_AA_WIDTH_4_0 (3 << 16) +# define GEN6_WM_LINE_AA_WIDTH_0_5 (0 << 14) +# define GEN6_WM_LINE_AA_WIDTH_1_0 (1 << 14) +# define GEN6_WM_LINE_AA_WIDTH_2_0 (2 << 14) +# define GEN6_WM_LINE_AA_WIDTH_4_0 (3 << 14) +# define GEN6_WM_POLYGON_STIPPLE_ENABLE (1 << 13) +# define GEN6_WM_LINE_STIPPLE_ENABLE (1 << 12) +# define GEN6_WM_OMASK_TO_RENDER_TARGET (1 << 9) +# define GEN6_WM_USES_SOURCE_W (1 << 8) +# define GEN6_WM_DUAL_SOURCE_BLEND_ENABLE (1 << 7) +# define GEN6_WM_32_DISPATCH_ENABLE (1 << 2) +# define GEN6_WM_16_DISPATCH_ENABLE (1 << 1) +# define GEN6_WM_8_DISPATCH_ENABLE (1 << 0) +/* DW6 */ +# define GEN6_WM_NUM_SF_OUTPUTS_SHIFT 20 +# define GEN6_WM_POSOFFSET_NONE (0 << 18) +# define GEN6_WM_POSOFFSET_CENTROID (2 << 18) +# define GEN6_WM_POSOFFSET_SAMPLE (3 << 18) +# define GEN6_WM_POSITION_ZW_PIXEL (0 << 16) +# define GEN6_WM_POSITION_ZW_CENTROID (2 << 16) +# define GEN6_WM_POSITION_ZW_SAMPLE (3 << 16) +# define GEN6_WM_NONPERSPECTIVE_SAMPLE_BARYCENTRIC (1 << 15) +# define GEN6_WM_NONPERSPECTIVE_CENTROID_BARYCENTRIC (1 << 14) +# define GEN6_WM_NONPERSPECTIVE_PIXEL_BARYCENTRIC (1 << 13) +# define GEN6_WM_PERSPECTIVE_SAMPLE_BARYCENTRIC (1 << 12) +# define GEN6_WM_PERSPECTIVE_CENTROID_BARYCENTRIC (1 << 11) +# define GEN6_WM_PERSPECTIVE_PIXEL_BARYCENTRIC (1 << 10) +# define GEN6_WM_POINT_RASTRULE_UPPER_RIGHT (1 << 9) +# define GEN6_WM_MSRAST_OFF_PIXEL (0 << 1) +# define GEN6_WM_MSRAST_OFF_PATTERN (1 << 1) +# define GEN6_WM_MSRAST_ON_PIXEL (2 << 1) +# define GEN6_WM_MSRAST_ON_PATTERN (3 << 1) +# define GEN6_WM_MSDISPMODE_PERPIXEL (1 << 0) +/* DW7: kernel 1 pointer */ +/* DW8: kernel 2 pointer */ + +#define CMD_3D_CONSTANT_VS_STATE 0x7815 /* GEN6+ */ +#define CMD_3D_CONSTANT_GS_STATE 0x7816 /* GEN6+ */ +#define CMD_3D_CONSTANT_PS_STATE 0x7817 /* GEN6+ */ +# define GEN6_CONSTANT_BUFFER_3_ENABLE (1 << 15) +# define GEN6_CONSTANT_BUFFER_2_ENABLE (1 << 14) +# define GEN6_CONSTANT_BUFFER_1_ENABLE (1 << 13) +# define GEN6_CONSTANT_BUFFER_0_ENABLE (1 << 12) + +#define CMD_3D_SAMPLE_MASK 0x7818 /* GEN6+ */ #define CMD_DRAW_RECT 0x7900 #define CMD_BLEND_CONSTANT_COLOR 0x7901 @@ -818,6 +1048,25 @@ #define CMD_GLOBAL_DEPTH_OFFSET_CLAMP 0x7909 #define CMD_AA_LINE_PARAMETERS 0x790a +#define CMD_GS_SVB_INDEX 0x790b /* CTG+ */ +/* DW1 */ +# define SVB_INDEX_SHIFT 29 +# define SVB_LOAD_INTERNAL_VERTEX_COUNT (1 << 0) /* SNB+ */ +/* DW2: SVB index */ +/* DW3: SVB maximum index */ + +#define CMD_3D_MULTISAMPLE 0x790d /* SNB+ */ +/* DW1 */ +# define MS_PIXEL_LOCATION_CENTER (0 << 4) +# define MS_PIXEL_LOCATION_UPPER_LEFT (1 << 4) +# define MS_NUMSAMPLES_1 (0 << 1) +# define MS_NUMSAMPLES_4 (2 << 1) +# define MS_NUMSAMPLES_8 (3 << 1) + +#define CMD_3D_CLEAR_PARAMS 0x7910 /* ILK+ */ +# define DEPTH_CLEAR_VALID (1 << 15) +/* DW1: depth clear value */ + #define CMD_PIPE_CONTROL 0x7a00 #define CMD_3D_PRIM 0x7b00 diff --git a/src/mesa/drivers/dri/i965/brw_disasm.c b/src/mesa/drivers/dri/i965/brw_disasm.c index a8f6b993ac3..ad61770212c 100644 --- a/src/mesa/drivers/dri/i965/brw_disasm.c +++ b/src/mesa/drivers/dri/i965/brw_disasm.c @@ -50,6 +50,7 @@ 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 }, @@ -73,10 +74,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 }, diff --git a/src/mesa/drivers/dri/i965/brw_draw_upload.c b/src/mesa/drivers/dri/i965/brw_draw_upload.c index 106454de4a8..71a43577bfd 100644 --- a/src/mesa/drivers/dri/i965/brw_draw_upload.c +++ b/src/mesa/drivers/dri/i965/brw_draw_upload.c @@ -276,7 +276,6 @@ copy_array_to_vbo_array( struct brw_context *brw, struct brw_vertex_element *element, GLuint dst_stride) { - struct intel_context *intel = &brw->intel; GLuint size = element->count * dst_stride; get_space(brw, size, &element->bo, &element->offset); @@ -289,52 +288,26 @@ copy_array_to_vbo_array( struct brw_context *brw, } if (dst_stride == element->glarray->StrideB) { - if (intel->intelScreen->kernel_exec_fencing) { - drm_intel_gem_bo_map_gtt(element->bo); - memcpy((char *)element->bo->virtual + element->offset, - element->glarray->Ptr, size); - drm_intel_gem_bo_unmap_gtt(element->bo); - } else { - dri_bo_subdata(element->bo, - element->offset, - size, - element->glarray->Ptr); - } + drm_intel_gem_bo_map_gtt(element->bo); + memcpy((char *)element->bo->virtual + element->offset, + element->glarray->Ptr, size); + drm_intel_gem_bo_unmap_gtt(element->bo); } else { char *dest; const unsigned char *src = element->glarray->Ptr; int i; - if (intel->intelScreen->kernel_exec_fencing) { - drm_intel_gem_bo_map_gtt(element->bo); - dest = element->bo->virtual; - dest += element->offset; - - for (i = 0; i < element->count; i++) { - memcpy(dest, src, dst_stride); - src += element->glarray->StrideB; - dest += dst_stride; - } - - drm_intel_gem_bo_unmap_gtt(element->bo); - } else { - void *data; - - data = malloc(dst_stride * element->count); - dest = data; - for (i = 0; i < element->count; i++) { - memcpy(dest, src, dst_stride); - src += element->glarray->StrideB; - dest += dst_stride; - } + drm_intel_gem_bo_map_gtt(element->bo); + dest = element->bo->virtual; + dest += element->offset; - dri_bo_subdata(element->bo, - element->offset, - size, - data); - - free(data); + for (i = 0; i < element->count; i++) { + memcpy(dest, src, dst_stride); + src += element->glarray->StrideB; + dest += dst_stride; } + + drm_intel_gem_bo_unmap_gtt(element->bo); } } @@ -503,10 +476,17 @@ static void brw_emit_vertices(struct brw_context *brw) if (brw->vb.nr_enabled == 0) { BEGIN_BATCH(3); OUT_BATCH((CMD_VERTEX_ELEMENT << 16) | 1); - OUT_BATCH((0 << BRW_VE0_INDEX_SHIFT) | - BRW_VE0_VALID | - (BRW_SURFACEFORMAT_R32G32B32A32_FLOAT << BRW_VE0_FORMAT_SHIFT) | - (0 << BRW_VE0_SRC_OFFSET_SHIFT)); + if (IS_GEN6(intel->intelScreen->deviceID)) { + OUT_BATCH((0 << GEN6_VE0_INDEX_SHIFT) | + GEN6_VE0_VALID | + (BRW_SURFACEFORMAT_R32G32B32A32_FLOAT << BRW_VE0_FORMAT_SHIFT) | + (0 << BRW_VE0_SRC_OFFSET_SHIFT)); + } else { + OUT_BATCH((0 << BRW_VE0_INDEX_SHIFT) | + BRW_VE0_VALID | + (BRW_SURFACEFORMAT_R32G32B32A32_FLOAT << BRW_VE0_FORMAT_SHIFT) | + (0 << BRW_VE0_SRC_OFFSET_SHIFT)); + } OUT_BATCH((BRW_VE1_COMPONENT_STORE_0 << BRW_VE1_COMPONENT_0_SHIFT) | (BRW_VE1_COMPONENT_STORE_0 << BRW_VE1_COMPONENT_1_SHIFT) | (BRW_VE1_COMPONENT_STORE_0 << BRW_VE1_COMPONENT_2_SHIFT) | @@ -527,14 +507,22 @@ static void brw_emit_vertices(struct brw_context *brw) for (i = 0; i < brw->vb.nr_enabled; i++) { struct brw_vertex_element *input = brw->vb.enabled[i]; + uint32_t dw0; + + if (intel->gen >= 6) { + dw0 = GEN6_VB0_ACCESS_VERTEXDATA | + (i << GEN6_VB0_INDEX_SHIFT); + } else { + dw0 = BRW_VB0_ACCESS_VERTEXDATA | + (i << BRW_VB0_INDEX_SHIFT); + } - OUT_BATCH((i << BRW_VB0_INDEX_SHIFT) | - BRW_VB0_ACCESS_VERTEXDATA | + OUT_BATCH(dw0 | (input->stride << BRW_VB0_PITCH_SHIFT)); OUT_RELOC(input->bo, I915_GEM_DOMAIN_VERTEX, 0, input->offset); - if (intel->is_ironlake) { + if (intel->is_ironlake || intel->gen >= 6) { OUT_RELOC(input->bo, I915_GEM_DOMAIN_VERTEX, 0, input->bo->size - 1); @@ -565,12 +553,19 @@ static void brw_emit_vertices(struct brw_context *brw) break; } - OUT_BATCH((i << BRW_VE0_INDEX_SHIFT) | - BRW_VE0_VALID | - (format << BRW_VE0_FORMAT_SHIFT) | - (0 << BRW_VE0_SRC_OFFSET_SHIFT)); + if (IS_GEN6(intel->intelScreen->deviceID)) { + OUT_BATCH((i << GEN6_VE0_INDEX_SHIFT) | + GEN6_VE0_VALID | + (format << BRW_VE0_FORMAT_SHIFT) | + (0 << BRW_VE0_SRC_OFFSET_SHIFT)); + } else { + OUT_BATCH((i << BRW_VE0_INDEX_SHIFT) | + BRW_VE0_VALID | + (format << BRW_VE0_FORMAT_SHIFT) | + (0 << BRW_VE0_SRC_OFFSET_SHIFT)); + } - if (intel->is_ironlake) + if (intel->is_ironlake || intel->gen >= 6) OUT_BATCH((comp0 << BRW_VE1_COMPONENT_0_SHIFT) | (comp1 << BRW_VE1_COMPONENT_1_SHIFT) | (comp2 << BRW_VE1_COMPONENT_2_SHIFT) | @@ -624,13 +619,9 @@ static void brw_prepare_indices(struct brw_context *brw) /* Straight upload */ - if (intel->intelScreen->kernel_exec_fencing) { - drm_intel_gem_bo_map_gtt(bo); - memcpy((char *)bo->virtual + offset, index_buffer->ptr, ib_size); - drm_intel_gem_bo_unmap_gtt(bo); - } else { - dri_bo_subdata(bo, offset, ib_size, index_buffer->ptr); - } + drm_intel_gem_bo_map_gtt(bo); + memcpy((char *)bo->virtual + offset, index_buffer->ptr, ib_size); + drm_intel_gem_bo_unmap_gtt(bo); } else { offset = (GLuint) (unsigned long) index_buffer->ptr; brw->ib.start_vertex_offset = 0; diff --git a/src/mesa/drivers/dri/i965/brw_eu.h b/src/mesa/drivers/dri/i965/brw_eu.h index 39eb88d7c2b..4f55158e8f3 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 b832c7165d2..d2395dec288 100644 --- a/src/mesa/drivers/dri/i965/brw_eu_emit.c +++ b/src/mesa/drivers/dri/i965/brw_eu_emit.c @@ -102,8 +102,6 @@ static void brw_set_dest( struct brw_instruction *insn, static void brw_set_src0( struct brw_instruction *insn, struct brw_reg reg ) { - assert(reg.file != BRW_MESSAGE_REGISTER_FILE); - if (reg.type != BRW_ARCHITECTURE_REGISTER_FILE) assert(reg.nr < 128); @@ -323,7 +321,7 @@ static void brw_set_urb_message( struct brw_context *brw, struct intel_context *intel = &brw->intel; brw_set_src1(insn, brw_imm_d(0)); - if (intel->is_ironlake) { + if (intel->is_ironlake || intel->gen >= 6) { insn->bits3.urb_igdng.opcode = 0; /* ? */ insn->bits3.urb_igdng.offset = offset; insn->bits3.urb_igdng.swizzle_control = swizzle_control; @@ -334,8 +332,16 @@ static void brw_set_urb_message( struct brw_context *brw, insn->bits3.urb_igdng.response_length = response_length; insn->bits3.urb_igdng.msg_length = msg_length; insn->bits3.urb_igdng.end_of_thread = end_of_thread; - insn->bits2.send_igdng.sfid = BRW_MESSAGE_TARGET_URB; - insn->bits2.send_igdng.end_of_thread = end_of_thread; + if (intel->gen >= 6) { + /* For SNB, the SFID bits moved to the condmod bits, and + * EOT stayed in bits3 above. Does the EOT bit setting + * below on Ironlake even do anything? + */ + insn->header.destreg__conditionalmod = BRW_MESSAGE_TARGET_URB; + } else { + insn->bits2.send_igdng.sfid = BRW_MESSAGE_TARGET_URB; + insn->bits2.send_igdng.end_of_thread = end_of_thread; + } } else { insn->bits3.urb.opcode = 0; /* ? */ insn->bits3.urb.offset = offset; @@ -567,7 +573,7 @@ ALU2(DPH) ALU2(DP3) ALU2(DP2) ALU2(LINE) - +ALU2(PLN) @@ -917,26 +923,40 @@ void brw_math( struct brw_compile *p, GLuint data_type, GLuint precision ) { - struct brw_instruction *insn = next_insn(p, BRW_OPCODE_SEND); - GLuint msg_length = (function == BRW_MATH_FUNCTION_POW) ? 2 : 1; - GLuint response_length = (function == BRW_MATH_FUNCTION_SINCOS) ? 2 : 1; + struct intel_context *intel = &p->brw->intel; - /* Example code doesn't set predicate_control for send - * instructions. - */ - insn->header.predicate_control = 0; - insn->header.destreg__conditionalmod = msg_reg_nr; + if (intel->gen >= 6) { + struct brw_instruction *insn = next_insn(p, BRW_OPCODE_MATH); - brw_set_dest(insn, dest); - brw_set_src0(insn, src); - brw_set_math_message(p->brw, - insn, - msg_length, response_length, - function, - BRW_MATH_INTEGER_UNSIGNED, - precision, - saturate, - data_type); + /* Math is the same ISA format as other opcodes, except that CondModifier + * becomes FC[3:0] and ThreadCtrl becomes FC[5:4]. + */ + insn->header.destreg__conditionalmod = function; + + brw_set_dest(insn, dest); + brw_set_src0(insn, src); + brw_set_src1(insn, brw_null_reg()); + } else { + struct brw_instruction *insn = next_insn(p, BRW_OPCODE_SEND); + GLuint msg_length = (function == BRW_MATH_FUNCTION_POW) ? 2 : 1; + GLuint response_length = (function == BRW_MATH_FUNCTION_SINCOS) ? 2 : 1; + /* Example code doesn't set predicate_control for send + * instructions. + */ + insn->header.predicate_control = 0; + insn->header.destreg__conditionalmod = msg_reg_nr; + + brw_set_dest(insn, dest); + brw_set_src0(insn, src); + brw_set_math_message(p->brw, + insn, + msg_length, response_length, + function, + BRW_MATH_INTEGER_UNSIGNED, + precision, + saturate, + data_type); + } } /** @@ -1270,7 +1290,7 @@ void brw_SAMPLE(struct brw_compile *p, GLuint simd_mode) { GLboolean need_stall = 0; - + if (writemask == 0) { /*printf("%s: zero writemask??\n", __FUNCTION__); */ return; @@ -1307,8 +1327,14 @@ void brw_SAMPLE(struct brw_compile *p, /* printf("need stall %x %x\n", newmask , writemask); */ } else { + GLboolean dispatch_16 = GL_FALSE; + struct brw_reg m1 = brw_message_reg(msg_reg_nr); - + + guess_execution_size(p->current, dest); + if (p->current->header.execution_size == BRW_EXECUTE_16) + dispatch_16 = GL_TRUE; + newmask = ~newmask & WRITEMASK_XYZW; brw_push_insn_state(p); @@ -1323,7 +1349,13 @@ void brw_SAMPLE(struct brw_compile *p, src0 = retype(brw_null_reg(), BRW_REGISTER_TYPE_UW); dest = offset(dest, dst_offset); - response_length = len * 2; + + /* For 16-wide dispatch, masked channels are skipped in the + * response. For 8-wide, masked channels still take up slots, + * and are just not written to. + */ + if (dispatch_16) + response_length = len * 2; } } @@ -1377,7 +1409,18 @@ void brw_urb_WRITE(struct brw_compile *p, GLuint offset, GLuint swizzle) { - struct brw_instruction *insn = next_insn(p, BRW_OPCODE_SEND); + struct intel_context *intel = &p->brw->intel; + struct brw_instruction *insn; + + /* Sandybridge doesn't have the implied move for SENDs, + * and the first message register index comes from src0. + */ + if (intel->gen >= 6) { + brw_MOV(p, brw_message_reg(msg_reg_nr), src0); + src0 = brw_message_reg(msg_reg_nr); + } + + insn = next_insn(p, BRW_OPCODE_SEND); assert(msg_length < BRW_MAX_MRF); @@ -1385,7 +1428,8 @@ void brw_urb_WRITE(struct brw_compile *p, brw_set_src0(insn, src0); brw_set_src1(insn, brw_imm_d(0)); - insn->header.destreg__conditionalmod = msg_reg_nr; + if (intel->gen < 6) + insn->header.destreg__conditionalmod = msg_reg_nr; brw_set_urb_message(p->brw, insn, diff --git a/src/mesa/drivers/dri/i965/brw_misc_state.c b/src/mesa/drivers/dri/i965/brw_misc_state.c index f708ee00632..d030ed41f4a 100644 --- a/src/mesa/drivers/dri/i965/brw_misc_state.c +++ b/src/mesa/drivers/dri/i965/brw_misc_state.c @@ -136,6 +136,41 @@ const struct brw_tracked_state brw_binding_table_pointers = { .emit = upload_binding_table_pointers, }; +/** + * Upload the binding table pointers, which point each stage's array of surface + * state pointers. + * + * The binding table pointers are relative to the surface state base address, + * which is 0. + */ +static void upload_gen6_binding_table_pointers(struct brw_context *brw) +{ + struct intel_context *intel = &brw->intel; + + BEGIN_BATCH(4); + OUT_BATCH(CMD_BINDING_TABLE_PTRS << 16 | + GEN6_BINDING_TABLE_MODIFY_VS | + GEN6_BINDING_TABLE_MODIFY_GS | + GEN6_BINDING_TABLE_MODIFY_PS | + (4 - 2)); + if (brw->vs.bind_bo != NULL) + OUT_RELOC(brw->vs.bind_bo, I915_GEM_DOMAIN_SAMPLER, 0, 0); /* vs */ + else + OUT_BATCH(0); + OUT_BATCH(0); /* gs */ + OUT_RELOC(brw->wm.bind_bo, I915_GEM_DOMAIN_SAMPLER, 0, 0); /* wm/ps */ + ADVANCE_BATCH(); +} + +const struct brw_tracked_state gen6_binding_table_pointers = { + .dirty = { + .mesa = 0, + .brw = BRW_NEW_BATCH, + .cache = CACHE_NEW_SURF_BIND, + }, + .prepare = prepare_binding_table_pointers, + .emit = upload_gen6_binding_table_pointers, +}; /** * Upload pointers to the per-stage state. @@ -209,7 +244,14 @@ static void emit_depthbuffer(struct brw_context *brw) { struct intel_context *intel = &brw->intel; struct intel_region *region = brw->state.depth_region; - unsigned int len = (intel->is_g4x || intel->is_ironlake) ? 6 : 5; + unsigned int len; + + if (intel->gen >= 6) + len = 7; + else if (intel->is_g4x || intel->is_ironlake) + len = 6; + else + len = 5; if (region == NULL) { BEGIN_BATCH(len); @@ -220,9 +262,12 @@ static void emit_depthbuffer(struct brw_context *brw) OUT_BATCH(0); OUT_BATCH(0); - if (intel->is_g4x || intel->is_ironlake) + if (intel->is_g4x || intel->is_ironlake || intel->gen >= 6) OUT_BATCH(0); + if (intel->gen >= 6) + OUT_BATCH(0); + ADVANCE_BATCH(); } else { unsigned int format; @@ -243,6 +288,8 @@ static void emit_depthbuffer(struct brw_context *brw) } assert(region->tiling != I915_TILING_X); + if (IS_GEN6(intel->intelScreen->deviceID)) + assert(region->tiling != I915_TILING_NONE); BEGIN_BATCH(len); OUT_BATCH(CMD_DEPTH_BUFFER << 16 | (len - 2)); @@ -259,9 +306,20 @@ static void emit_depthbuffer(struct brw_context *brw) ((region->height - 1) << 19)); OUT_BATCH(0); - if (intel->is_g4x || intel->is_ironlake) + if (intel->is_g4x || intel->is_ironlake || intel->gen >= 6) OUT_BATCH(0); + if (intel->gen >= 6) + OUT_BATCH(0); + + ADVANCE_BATCH(); + } + + /* Initialize it for safety. */ + if (intel->gen >= 6) { + BEGIN_BATCH(2); + OUT_BATCH(CMD_3D_CLEAR_PARAMS << 16 | (2 - 2)); + OUT_BATCH(0); ADVANCE_BATCH(); } } @@ -435,6 +493,8 @@ const struct brw_tracked_state brw_line_stipple = { static void upload_invarient_state( struct brw_context *brw ) { + struct intel_context *intel = &brw->intel; + { /* 0x61040000 Pipeline Select */ /* PipelineSelect : 0 */ @@ -446,7 +506,7 @@ static void upload_invarient_state( struct brw_context *brw ) BRW_BATCH_STRUCT(brw, &ps); } - { + if (intel->gen < 6) { struct brw_global_depth_offset_clamp gdo; memset(&gdo, 0, sizeof(gdo)); @@ -459,6 +519,32 @@ static void upload_invarient_state( struct brw_context *brw ) BRW_BATCH_STRUCT(brw, &gdo); } + intel_batchbuffer_emit_mi_flush(intel->batch); + + if (intel->gen >= 6) { + int i; + + BEGIN_BATCH(3); + OUT_BATCH(CMD_3D_MULTISAMPLE << 16 | (3 - 2)); + OUT_BATCH(MS_PIXEL_LOCATION_CENTER | + MS_NUMSAMPLES_1); + OUT_BATCH(0); /* positions for 4/8-sample */ + ADVANCE_BATCH(); + + BEGIN_BATCH(2); + OUT_BATCH(CMD_3D_SAMPLE_MASK << 16 | (2 - 2)); + OUT_BATCH(1); + ADVANCE_BATCH(); + + for (i = 0; i < 4; i++) { + BEGIN_BATCH(4); + OUT_BATCH(CMD_GS_SVB_INDEX << 16 | (4 - 2)); + OUT_BATCH(i << SVB_INDEX_SHIFT); + OUT_BATCH(0); + OUT_BATCH(0xffffffff); + ADVANCE_BATCH(); + } + } /* 0x61020000 State Instruction Pointer */ { @@ -509,7 +595,20 @@ static void upload_state_base_address( struct brw_context *brw ) /* Output the structure (brw_state_base_address) directly to the * batchbuffer, so we can emit relocations inline. */ - if (intel->is_ironlake) { + if (intel->gen >= 6) { + BEGIN_BATCH(10); + OUT_BATCH(CMD_STATE_BASE_ADDRESS << 16 | (10 - 2)); + OUT_BATCH(1); /* General state base address */ + OUT_BATCH(1); /* Surface state base address */ + OUT_BATCH(1); /* Dynamic state base address */ + OUT_BATCH(1); /* Indirect object base address */ + OUT_BATCH(1); /* Instruction base address */ + OUT_BATCH(1); /* General state upper bound */ + OUT_BATCH(1); /* Dynamic state upper bound */ + OUT_BATCH(1); /* Indirect object upper bound */ + OUT_BATCH(1); /* Instruction access upper bound */ + ADVANCE_BATCH(); + } else if (intel->is_ironlake) { BEGIN_BATCH(8); OUT_BATCH(CMD_STATE_BASE_ADDRESS << 16 | (8 - 2)); OUT_BATCH(1); /* General state base address */ 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 00000000000..57df9ea1151 --- /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 <[email protected]> + * + */ + +#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_program.c b/src/mesa/drivers/dri/i965/brw_program.c index c78f7b38aee..1fd957b3ad6 100644 --- a/src/mesa/drivers/dri/i965/brw_program.c +++ b/src/mesa/drivers/dri/i965/brw_program.c @@ -95,9 +95,17 @@ static void brwDeleteProgram( GLcontext *ctx, struct gl_program *prog ) { if (prog->Target == GL_FRAGMENT_PROGRAM_ARB) { - struct gl_fragment_program *fprog = (struct gl_fragment_program *) prog; - struct brw_fragment_program *brw_fprog = brw_fragment_program(fprog); - dri_bo_unreference(brw_fprog->const_buffer); + struct gl_fragment_program *fp = (struct gl_fragment_program *) prog; + struct brw_fragment_program *brw_fp = brw_fragment_program(fp); + + dri_bo_unreference(brw_fp->const_buffer); + } + + if (prog->Target == GL_VERTEX_PROGRAM_ARB) { + struct gl_vertex_program *vp = (struct gl_vertex_program *) prog; + struct brw_vertex_program *brw_vp = brw_vertex_program(vp); + + dri_bo_unreference(brw_vp->const_buffer); } _mesa_delete_program( ctx, prog ); diff --git a/src/mesa/drivers/dri/i965/brw_sf.c b/src/mesa/drivers/dri/i965/brw_sf.c index 8e6839b8120..57d1c29ade1 100644 --- a/src/mesa/drivers/dri/i965/brw_sf.c +++ b/src/mesa/drivers/dri/i965/brw_sf.c @@ -46,7 +46,6 @@ static void compile_sf_prog( struct brw_context *brw, struct brw_sf_prog_key *key ) { - GLcontext *ctx = &brw->intel.ctx; struct brw_sf_compile c; const GLuint *program; GLuint program_size; @@ -69,20 +68,14 @@ static void compile_sf_prog( struct brw_context *brw, /* Construct map from attribute number to position in the vertex. */ - for (i = idx = 0; i < VERT_RESULT_MAX; i++) + for (i = idx = 0; i < VERT_RESULT_MAX; i++) { if (c.key.attrs & BITFIELD64_BIT(i)) { c.attr_to_idx[i] = idx; c.idx_to_attr[idx] = i; - if (i >= VERT_RESULT_TEX0 && i <= VERT_RESULT_TEX7) { - c.point_attrs[i].CoordReplace = - ctx->Point.CoordReplace[i - VERT_RESULT_TEX0]; - } - else { - c.point_attrs[i].CoordReplace = GL_FALSE; - } idx++; } - + } + /* Which primitive? Or all three? */ switch (key->primitive) { @@ -162,6 +155,14 @@ static void upload_sf_prog(struct brw_context *brw) } key.do_point_sprite = ctx->Point.PointSprite; + if (key.do_point_sprite) { + int i; + + for (i = 0; i < 8; i++) { + if (ctx->Point.CoordReplace[i]) + key.point_sprite_coord_replace |= (1 << i); + } + } key.sprite_origin_lower_left = (ctx->Point.SpriteOrigin == GL_LOWER_LEFT); /* _NEW_LIGHT */ key.do_flat_shading = (ctx->Light.ShadeModel == GL_FLAT); diff --git a/src/mesa/drivers/dri/i965/brw_sf.h b/src/mesa/drivers/dri/i965/brw_sf.h index 0ba731fac99..a0680a56f2c 100644 --- a/src/mesa/drivers/dri/i965/brw_sf.h +++ b/src/mesa/drivers/dri/i965/brw_sf.h @@ -46,6 +46,7 @@ struct brw_sf_prog_key { GLbitfield64 attrs; + uint8_t point_sprite_coord_replace; GLuint primitive:2; GLuint do_twoside_color:1; GLuint do_flat_shading:1; @@ -56,10 +57,6 @@ struct brw_sf_prog_key { GLuint pad:24; }; -struct brw_sf_point_tex { - GLboolean CoordReplace; -}; - struct brw_sf_compile { struct brw_compile func; struct brw_sf_prog_key key; @@ -100,7 +97,6 @@ struct brw_sf_compile { GLubyte attr_to_idx[VERT_RESULT_MAX]; GLubyte idx_to_attr[VERT_RESULT_MAX]; - struct brw_sf_point_tex point_attrs[VERT_RESULT_MAX]; }; diff --git a/src/mesa/drivers/dri/i965/brw_sf_emit.c b/src/mesa/drivers/dri/i965/brw_sf_emit.c index bb08055e3bb..56f7c986e78 100644 --- a/src/mesa/drivers/dri/i965/brw_sf_emit.c +++ b/src/mesa/drivers/dri/i965/brw_sf_emit.c @@ -354,6 +354,33 @@ static GLboolean calculate_masks( struct brw_sf_compile *c, return is_last_attr; } +/* Calculates the predicate control for which channels of a reg + * (containing 2 attrs) to do point sprite coordinate replacement on. + */ +static uint16_t +calculate_point_sprite_mask(struct brw_sf_compile *c, GLuint reg) +{ + int attr1, attr2; + uint16_t pc = 0; + + attr1 = c->idx_to_attr[reg * 2]; + if (attr1 >= VERT_RESULT_TEX0 && attr1 <= VERT_RESULT_TEX7) { + if (c->key.point_sprite_coord_replace & (1 << (attr1 - VERT_RESULT_TEX0))) + pc |= 0x0f; + } + + if (reg * 2 + 1 < c->nr_setup_attrs) { + attr2 = c->idx_to_attr[reg * 2 + 1]; + if (attr2 >= VERT_RESULT_TEX0 && attr2 <= VERT_RESULT_TEX7) { + if (c->key.point_sprite_coord_replace & (1 << (attr2 - + VERT_RESULT_TEX0))) + pc |= 0xf0; + } + } + + return pc; +} + void brw_emit_tri_setup( struct brw_sf_compile *c, GLboolean allocate) @@ -529,22 +556,27 @@ void brw_emit_point_sprite_setup( struct brw_sf_compile *c, GLboolean allocate) copy_z_inv_w(c); for (i = 0; i < c->nr_setup_regs; i++) { - struct brw_sf_point_tex *tex = &c->point_attrs[c->idx_to_attr[2*i]]; struct brw_reg a0 = offset(c->vert[0], i); - GLushort pc, pc_persp, pc_linear; + GLushort pc, pc_persp, pc_linear, pc_coord_replace; GLboolean last = calculate_masks(c, i, &pc, &pc_persp, &pc_linear); - - if (pc_persp) - { - if (!tex->CoordReplace) { - brw_set_predicate_control_flag_value(p, pc_persp); - brw_MUL(p, a0, a0, c->inv_w[0]); - } + + pc_coord_replace = calculate_point_sprite_mask(c, i); + pc_persp &= ~pc_coord_replace; + + if (pc_persp) { + brw_set_predicate_control_flag_value(p, pc_persp); + brw_MUL(p, a0, a0, c->inv_w[0]); } - if (tex->CoordReplace) { - /* Caculate 1.0/PointWidth */ - brw_math(&c->func, + /* Point sprite coordinate replacement: A texcoord with this + * enabled gets replaced with the value (x, y, 0, 1) where x and + * y vary from 0 to 1 across the horizontal and vertical of the + * point. + */ + if (pc_coord_replace) { + brw_set_predicate_control_flag_value(p, pc_coord_replace); + /* Caculate 1.0/PointWidth */ + brw_math(&c->func, c->tmp, BRW_MATH_FUNCTION_INV, BRW_MATH_SATURATE_NONE, @@ -553,50 +585,51 @@ void brw_emit_point_sprite_setup( struct brw_sf_compile *c, GLboolean allocate) BRW_MATH_DATA_SCALAR, BRW_MATH_PRECISION_FULL); - if (c->key.sprite_origin_lower_left) { - brw_MUL(p, c->m1Cx, c->tmp, c->inv_w[0]); - brw_MOV(p, vec1(suboffset(c->m1Cx, 1)), brw_imm_f(0.0)); - brw_MUL(p, c->m2Cy, c->tmp, negate(c->inv_w[0])); - brw_MOV(p, vec1(suboffset(c->m2Cy, 0)), brw_imm_f(0.0)); - } else { - brw_MUL(p, c->m1Cx, c->tmp, c->inv_w[0]); - brw_MOV(p, vec1(suboffset(c->m1Cx, 1)), brw_imm_f(0.0)); - brw_MUL(p, c->m2Cy, c->tmp, c->inv_w[0]); - brw_MOV(p, vec1(suboffset(c->m2Cy, 0)), brw_imm_f(0.0)); - } - } else { - brw_MOV(p, c->m1Cx, brw_imm_ud(0)); - brw_MOV(p, c->m2Cy, brw_imm_ud(0)); - } + brw_set_access_mode(p, BRW_ALIGN_16); - { - brw_set_predicate_control_flag_value(p, pc); - if (tex->CoordReplace) { - if (c->key.sprite_origin_lower_left) { - brw_MUL(p, c->m3C0, c->inv_w[0], brw_imm_f(1.0)); - brw_MOV(p, vec1(suboffset(c->m3C0, 0)), brw_imm_f(0.0)); - } - else - brw_MOV(p, c->m3C0, brw_imm_f(0.0)); + /* dA/dx, dA/dy */ + brw_MOV(p, c->m1Cx, brw_imm_f(0.0)); + brw_MOV(p, c->m2Cy, brw_imm_f(0.0)); + brw_MOV(p, brw_writemask(c->m1Cx, WRITEMASK_X), c->tmp); + if (c->key.sprite_origin_lower_left) { + brw_MOV(p, brw_writemask(c->m2Cy, WRITEMASK_Y), negate(c->tmp)); } else { - brw_MOV(p, c->m3C0, a0); /* constant value */ + brw_MOV(p, brw_writemask(c->m2Cy, WRITEMASK_Y), c->tmp); } - /* Copy m0..m3 to URB. - */ - brw_urb_WRITE(p, - brw_null_reg(), - 0, - brw_vec8_grf(0, 0), - 0, /* allocate */ - 1, /* used */ - 4, /* msg len */ - 0, /* response len */ - last, /* eot */ - last, /* writes complete */ - i*4, /* urb destination offset */ - BRW_URB_SWIZZLE_TRANSPOSE); + /* attribute constant offset */ + brw_MOV(p, c->m3C0, brw_imm_f(0.0)); + if (c->key.sprite_origin_lower_left) { + brw_MOV(p, brw_writemask(c->m3C0, WRITEMASK_YW), brw_imm_f(1.0)); + } else { + brw_MOV(p, brw_writemask(c->m3C0, WRITEMASK_W), brw_imm_f(1.0)); + } + + brw_set_access_mode(p, BRW_ALIGN_1); } + + if (pc & ~pc_coord_replace) { + brw_set_predicate_control_flag_value(p, pc & ~pc_coord_replace); + brw_MOV(p, c->m1Cx, brw_imm_ud(0)); + brw_MOV(p, c->m2Cy, brw_imm_ud(0)); + brw_MOV(p, c->m3C0, a0); /* constant value */ + } + + + brw_set_predicate_control_flag_value(p, pc); + /* Copy m0..m3 to URB. */ + brw_urb_WRITE(p, + brw_null_reg(), + 0, + brw_vec8_grf(0, 0), + 0, /* allocate */ + 1, /* used */ + 4, /* msg len */ + 0, /* response len */ + last, /* eot */ + last, /* writes complete */ + i*4, /* urb destination offset */ + BRW_URB_SWIZZLE_TRANSPOSE); } } diff --git a/src/mesa/drivers/dri/i965/brw_state.h b/src/mesa/drivers/dri/i965/brw_state.h index 536fe8b249b..f790cfabe25 100644 --- a/src/mesa/drivers/dri/i965/brw_state.h +++ b/src/mesa/drivers/dri/i965/brw_state.h @@ -90,6 +90,23 @@ const struct brw_tracked_state brw_drawing_rect; const struct brw_tracked_state brw_indices; const struct brw_tracked_state brw_vertices; const struct brw_tracked_state brw_index_buffer; +const struct brw_tracked_state gen6_binding_table_pointers; +const struct brw_tracked_state gen6_blend_state; +const struct brw_tracked_state gen6_cc_state_pointers; +const struct brw_tracked_state gen6_cc_vp; +const struct brw_tracked_state gen6_clip_state; +const struct brw_tracked_state gen6_clip_vp; +const struct brw_tracked_state gen6_color_calc_state; +const struct brw_tracked_state gen6_depth_stencil_state; +const struct brw_tracked_state gen6_gs_state; +const struct brw_tracked_state gen6_sampler_state; +const struct brw_tracked_state gen6_scissor_state; +const struct brw_tracked_state gen6_sf_state; +const struct brw_tracked_state gen6_sf_vp; +const struct brw_tracked_state gen6_urb; +const struct brw_tracked_state gen6_viewport_state; +const struct brw_tracked_state gen6_vs_state; +const struct brw_tracked_state gen6_wm_state; /** * Use same key for WM and VS surfaces. diff --git a/src/mesa/drivers/dri/i965/brw_state_cache.c b/src/mesa/drivers/dri/i965/brw_state_cache.c index 4bb98d8d5d5..c08cb45b75c 100644 --- a/src/mesa/drivers/dri/i965/brw_state_cache.c +++ b/src/mesa/drivers/dri/i965/brw_state_cache.c @@ -390,6 +390,7 @@ brw_init_non_surface_cache(struct brw_context *brw) brw_init_cache_id(cache, "GS_UNIT", BRW_GS_UNIT); brw_init_cache_id(cache, "GS_PROG", BRW_GS_PROG); + brw_init_cache_id(cache, "BLEND_STATE", BRW_BLEND_STATE); } diff --git a/src/mesa/drivers/dri/i965/brw_state_upload.c b/src/mesa/drivers/dri/i965/brw_state_upload.c index 4f477cfc6b3..9e54f29f0f6 100644 --- a/src/mesa/drivers/dri/i965/brw_state_upload.c +++ b/src/mesa/drivers/dri/i965/brw_state_upload.c @@ -35,8 +35,15 @@ #include "brw_state.h" #include "intel_batchbuffer.h" #include "intel_buffers.h" +#include "intel_chipset.h" -static const struct brw_tracked_state *atoms[] = +/* This is used to initialize brw->state.atoms[]. We could use this + * list directly except for a single atom, brw_constant_buffer, which + * has a .dirty value which changes according to the parameters of the + * current fragment and vertex programs, and so cannot be a static + * value. + */ +static const struct brw_tracked_state *gen4_atoms[] = { &brw_check_fallback, @@ -95,6 +102,63 @@ static const struct brw_tracked_state *atoms[] = &brw_constant_buffer }; +const struct brw_tracked_state *gen6_atoms[] = +{ + &brw_check_fallback, + + &brw_wm_input_sizes, + &brw_vs_prog, + &brw_gs_prog, + &brw_wm_prog, + + &gen6_clip_vp, + &gen6_sf_vp, + &gen6_cc_vp, + + /* Command packets: */ + &brw_invarient_state, + + &gen6_viewport_state, /* must do after *_vp stages */ + + &gen6_urb, + &gen6_blend_state, /* must do before cc unit */ + &gen6_color_calc_state, /* must do before cc unit */ + &gen6_depth_stencil_state, /* must do before cc unit */ + &gen6_cc_state_pointers, + + &brw_vs_surfaces, /* must do before unit */ + &brw_wm_constant_surface, /* must do before wm surfaces/bind bo */ + &brw_wm_surfaces, /* must do before samplers and unit */ + + &brw_wm_samplers, + &gen6_sampler_state, + + &gen6_vs_state, + &gen6_gs_state, + &gen6_clip_state, + &gen6_sf_state, + &gen6_wm_state, + + &gen6_scissor_state, + + &brw_state_base_address, + + &gen6_binding_table_pointers, + + &brw_depthbuffer, + + &brw_polygon_stipple, + &brw_polygon_stipple_offset, + + &brw_line_stipple, + &brw_aa_line_parameters, + + &brw_drawing_rect, + + &brw_indices, + &brw_index_buffer, + &brw_vertices, +}; void brw_init_state( struct brw_context *brw ) { @@ -211,6 +275,7 @@ static struct dirty_bit_map brw_bits[] = { }; static struct dirty_bit_map cache_bits[] = { + DEFINE_BIT(CACHE_NEW_BLEND_STATE), DEFINE_BIT(CACHE_NEW_CC_VP), DEFINE_BIT(CACHE_NEW_CC_UNIT), DEFINE_BIT(CACHE_NEW_WM_PROG), @@ -270,6 +335,8 @@ void brw_validate_state( struct brw_context *brw ) struct intel_context *intel = &brw->intel; struct brw_state_flags *state = &brw->state.dirty; GLuint i; + const struct brw_tracked_state **atoms; + int num_atoms; brw_clear_validated_bos(brw); @@ -278,6 +345,14 @@ void brw_validate_state( struct brw_context *brw ) brw_add_validated_bo(brw, intel->batch->buf); + if (IS_GEN6(intel->intelScreen->deviceID)) { + atoms = gen6_atoms; + num_atoms = ARRAY_SIZE(gen6_atoms); + } else { + atoms = gen4_atoms; + num_atoms = ARRAY_SIZE(gen4_atoms); + } + if (brw->emit_state_always) { state->mesa |= ~0; state->brw |= ~0; @@ -305,7 +380,7 @@ void brw_validate_state( struct brw_context *brw ) brw->intel.Fallback = GL_FALSE; /* boolean, not bitfield */ /* do prepare stage for all atoms */ - for (i = 0; i < Elements(atoms); i++) { + for (i = 0; i < num_atoms; i++) { const struct brw_tracked_state *atom = atoms[i]; if (brw->intel.Fallback) @@ -337,9 +412,20 @@ void brw_validate_state( struct brw_context *brw ) void brw_upload_state(struct brw_context *brw) { + struct intel_context *intel = &brw->intel; struct brw_state_flags *state = &brw->state.dirty; int i; static int dirty_count = 0; + const struct brw_tracked_state **atoms; + int num_atoms; + + if (IS_GEN6(intel->intelScreen->deviceID)) { + atoms = gen6_atoms; + num_atoms = ARRAY_SIZE(gen6_atoms); + } else { + atoms = gen4_atoms; + num_atoms = ARRAY_SIZE(gen4_atoms); + } brw_clear_validated_bos(brw); @@ -352,7 +438,7 @@ void brw_upload_state(struct brw_context *brw) memset(&examined, 0, sizeof(examined)); prev = *state; - for (i = 0; i < Elements(atoms); i++) { + for (i = 0; i < num_atoms; i++) { const struct brw_tracked_state *atom = atoms[i]; struct brw_state_flags generated; @@ -381,7 +467,7 @@ void brw_upload_state(struct brw_context *brw) } } else { - for (i = 0; i < Elements(atoms); i++) { + for (i = 0; i < num_atoms; i++) { const struct brw_tracked_state *atom = atoms[i]; if (brw->intel.Fallback) diff --git a/src/mesa/drivers/dri/i965/brw_structs.h b/src/mesa/drivers/dri/i965/brw_structs.h index 66d4127271a..3c2adfc87d4 100644 --- a/src/mesa/drivers/dri/i965/brw_structs.h +++ b/src/mesa/drivers/dri/i965/brw_structs.h @@ -658,7 +658,105 @@ struct brw_clip_unit_state GLfloat viewport_ymax; }; +struct gen6_blend_state +{ + struct { + GLuint dest_blend_factor:5; + GLuint source_blend_factor:5; + GLuint pad3:1; + GLuint blend_func:3; + GLuint pad2:1; + GLuint ia_dest_blend_factor:5; + GLuint ia_source_blend_factor:5; + GLuint pad1:1; + GLuint ia_blend_func:3; + GLuint pad0:1; + GLuint ia_blend_enable:1; + GLuint blend_enable:1; + } blend0; + + struct { + GLuint post_blend_clamp_enable:1; + GLuint pre_blend_clamp_enable:1; + GLuint clamp_range:2; + GLuint pad0:4; + GLuint x_dither_offset:2; + GLuint y_dither_offset:2; + GLuint dither_enable:1; + GLuint alpha_test_func:3; + GLuint alpha_test_enable:1; + GLuint pad1:1; + GLuint logic_op_func:4; + GLuint logic_op_enable:1; + GLuint pad2:1; + GLuint write_disable_b:1; + GLuint write_disable_g:1; + GLuint write_disable_r:1; + GLuint write_disable_a:1; + GLuint pad3:1; + GLuint alpha_to_coverage_dither:1; + GLuint alpha_to_one:1; + GLuint alpha_to_coverage:1; + } blend1; +}; + +struct gen6_color_calc_state +{ + struct { + GLuint alpha_test_format:1; + GLuint pad0:14; + GLuint round_disable:1; + GLuint bf_stencil_ref:8; + GLuint stencil_ref:8; + } cc0; + union { + GLfloat alpha_ref_f; + struct { + GLuint ui:8; + GLuint pad0:24; + } alpha_ref_fi; + } cc1; + + GLfloat constant_r; + GLfloat constant_g; + GLfloat constant_b; + GLfloat constant_a; +}; + +struct gen6_depth_stencil_state +{ + struct { + GLuint pad0:3; + GLuint bf_stencil_pass_depth_pass_op:3; + GLuint bf_stencil_pass_depth_fail_op:3; + GLuint bf_stencil_fail_op:3; + GLuint bf_stencil_func:3; + GLuint bf_stencil_enable:1; + GLuint pad1:2; + GLuint stencil_write_enable:1; + GLuint stencil_pass_depth_pass_op:3; + GLuint stencil_pass_depth_fail_op:3; + GLuint stencil_fail_op:3; + GLuint stencil_func:3; + GLuint stencil_enable:1; + } ds0; + + struct { + GLuint bf_stencil_write_mask:8; + GLuint bf_stencil_test_mask:8; + GLuint stencil_write_mask:8; + GLuint stencil_test_mask:8; + } ds1; + + struct { + GLuint pad0:25; + GLuint depth_write_enable:1; + GLuint depth_test_func:3; + GLuint pad1:1; + GLuint depth_test_enable:1; + } ds2; +}; struct brw_cc_unit_state { @@ -752,8 +850,6 @@ struct brw_cc_unit_state } cc7; }; - - struct brw_sf_unit_state { struct thread0 thread0; @@ -813,6 +909,11 @@ struct brw_sf_unit_state }; +struct gen6_scissor_state +{ + GLuint ymin, xmin; + GLuint ymax, xmax; +}; struct brw_gs_unit_state { @@ -1043,6 +1144,15 @@ struct brw_sf_viewport } scissor; }; +struct gen6_sf_viewport { + GLfloat m00; + GLfloat m11; + GLfloat m22; + GLfloat m30; + GLfloat m31; + GLfloat m32; +}; + /* Documented in the subsystem/shared-functions/sampler chapter... */ struct brw_surface_state diff --git a/src/mesa/drivers/dri/i965/brw_vs_emit.c b/src/mesa/drivers/dri/i965/brw_vs_emit.c index 88327d9927d..d16e916832e 100644 --- a/src/mesa/drivers/dri/i965/brw_vs_emit.c +++ b/src/mesa/drivers/dri/i965/brw_vs_emit.c @@ -180,10 +180,12 @@ static void brw_vs_alloc_regs( struct brw_vs_compile *c ) c->first_output = reg; c->first_overflow_output = 0; - if (intel->is_ironlake) - mrf = 8; + if (intel->gen >= 6) + mrf = 6; + else if (intel->is_ironlake) + mrf = 8; else - mrf = 4; + mrf = 4; for (i = 0; i < VERT_RESULT_MAX; i++) { if (c->prog_data.outputs_written & BITFIELD64_BIT(i)) { @@ -279,10 +281,12 @@ static void brw_vs_alloc_regs( struct brw_vs_compile *c ) */ attributes_in_vue = MAX2(c->nr_outputs, c->nr_inputs); - if (intel->is_ironlake) - c->prog_data.urb_entry_size = (attributes_in_vue + 6 + 3) / 4; + if (intel->gen >= 6) + c->prog_data.urb_entry_size = (attributes_in_vue + 4 + 7) / 8; + else if (intel->is_ironlake) + c->prog_data.urb_entry_size = (attributes_in_vue + 6 + 3) / 4; else - c->prog_data.urb_entry_size = (attributes_in_vue + 2 + 3) / 4; + c->prog_data.urb_entry_size = (attributes_in_vue + 2 + 3) / 4; c->prog_data.total_grf = reg; @@ -380,9 +384,8 @@ static void emit_sop( struct brw_vs_compile *c, { struct brw_compile *p = &c->func; - brw_MOV(p, dst, brw_imm_f(0.0f)); - brw_CMP(p, brw_null_reg(), cond, arg0, arg1); - brw_MOV(p, dst, brw_imm_f(1.0f)); + brw_CMP(p, brw_null_reg(), cond, arg1, arg0); + brw_SEL(p, dst, brw_null_reg(), brw_imm_f(1.0f)); brw_set_predicate_control_flag_value(p, 0xff); } @@ -479,9 +482,11 @@ static void emit_math1( struct brw_vs_compile *c, * whether that turns out to be a simulator bug or not: */ struct brw_compile *p = &c->func; + struct intel_context *intel = &p->brw->intel; struct brw_reg tmp = dst; - GLboolean need_tmp = (dst.dw1.bits.writemask != 0xf || - dst.file != BRW_GENERAL_REGISTER_FILE); + GLboolean need_tmp = (intel->gen < 6 && + (dst.dw1.bits.writemask != 0xf || + dst.file != BRW_GENERAL_REGISTER_FILE)); if (need_tmp) tmp = get_tmp(c); @@ -510,9 +515,11 @@ static void emit_math2( struct brw_vs_compile *c, GLuint precision) { struct brw_compile *p = &c->func; + struct intel_context *intel = &p->brw->intel; struct brw_reg tmp = dst; - GLboolean need_tmp = (dst.dw1.bits.writemask != 0xf || - dst.file != BRW_GENERAL_REGISTER_FILE); + GLboolean need_tmp = (intel->gen < 6 && + (dst.dw1.bits.writemask != 0xf || + dst.file != BRW_GENERAL_REGISTER_FILE)); if (need_tmp) tmp = get_tmp(c); @@ -1191,7 +1198,7 @@ static void emit_vertex_write( struct brw_vs_compile *c) struct brw_reg pos = c->regs[PROGRAM_OUTPUT][VERT_RESULT_HPOS]; struct brw_reg ndc; int eot; - GLuint len_vertext_header = 2; + GLuint len_vertex_header = 2; if (c->key.copy_edgeflag) { brw_MOV(p, @@ -1199,12 +1206,14 @@ static void emit_vertex_write( struct brw_vs_compile *c) get_reg(c, PROGRAM_INPUT, VERT_ATTRIB_EDGEFLAG)); } - /* Build ndc coords */ - ndc = get_tmp(c); - /* ndc = 1.0 / pos.w */ - emit_math1(c, BRW_MATH_FUNCTION_INV, ndc, brw_swizzle1(pos, 3), BRW_MATH_PRECISION_FULL); - /* ndc.xyz = pos * ndc */ - brw_MUL(p, brw_writemask(ndc, WRITEMASK_XYZ), pos, ndc); + if (intel->gen < 6) { + /* Build ndc coords */ + ndc = get_tmp(c); + /* ndc = 1.0 / pos.w */ + emit_math1(c, BRW_MATH_FUNCTION_INV, ndc, brw_swizzle1(pos, 3), BRW_MATH_PRECISION_FULL); + /* ndc.xyz = pos * ndc */ + brw_MUL(p, brw_writemask(ndc, WRITEMASK_XYZ), pos, ndc); + } /* Update the header for point size, user clipping flags, and -ve rhw * workaround. @@ -1267,21 +1276,41 @@ static void emit_vertex_write( struct brw_vs_compile *c) * of zeros followed by two sets of NDC coordinates: */ brw_set_access_mode(p, BRW_ALIGN_1); - brw_MOV(p, offset(m0, 2), ndc); - - if (intel->is_ironlake) { - /* There are 20 DWs (D0-D19) in VUE vertex header on Ironlake */ - brw_MOV(p, offset(m0, 3), pos); /* a portion of vertex header */ - /* m4, m5 contain the distances from vertex to the user clip planeXXX. - * Seems it is useless for us. - * m6 is used for aligning, so that the remainder of vertex element is - * reg-aligned. - */ - brw_MOV(p, offset(m0, 7), pos); /* the remainder of vertex element */ - len_vertext_header = 6; + + if (intel->gen >= 6) { + /* There are 16 DWs (D0-D15) in VUE header on Sandybridge: + * dword 0-3 (m1) of the header is indices, point width, clip flags. + * dword 4-7 (m2) is the 4D space position + * dword 8-15 (m3,m4) of the vertex header is the user clip distance. + * m5 is the first vertex data we fill, which is the vertex position. + */ + brw_MOV(p, offset(m0, 2), pos); + brw_MOV(p, offset(m0, 5), pos); + len_vertex_header = 4; + } else if (intel->is_ironlake) { + /* There are 20 DWs (D0-D19) in VUE header on Ironlake: + * dword 0-3 (m1) of the header is indices, point width, clip flags. + * dword 4-7 (m2) is the ndc position (set above) + * dword 8-11 (m3) of the vertex header is the 4D space position + * dword 12-19 (m4,m5) of the vertex header is the user clip distance. + * m6 is a pad so that the vertex element data is aligned + * m7 is the first vertex data we fill, which is the vertex position. + */ + brw_MOV(p, offset(m0, 2), ndc); + brw_MOV(p, offset(m0, 3), pos); + brw_MOV(p, offset(m0, 7), pos); + len_vertex_header = 6; } else { - brw_MOV(p, offset(m0, 3), pos); - len_vertext_header = 2; + /* There are 8 dwords in VUE header pre-Ironlake: + * dword 0-3 (m1) is indices, point width, clip flags. + * dword 4-7 (m2) is ndc position (set above) + * + * dword 8-11 (m3) is the first vertex data, which we always have be the + * vertex position. + */ + brw_MOV(p, offset(m0, 2), ndc); + brw_MOV(p, offset(m0, 3), pos); + len_vertex_header = 2; } eot = (c->first_overflow_output == 0); @@ -1292,7 +1321,7 @@ static void emit_vertex_write( struct brw_vs_compile *c) c->r0, /* src */ 0, /* allocate */ 1, /* used */ - MIN2(c->nr_outputs + 1 + len_vertext_header, (BRW_MAX_MRF-1)), /* msg len */ + MIN2(c->nr_outputs + 1 + len_vertex_header, (BRW_MAX_MRF-1)), /* msg len */ 0, /* response len */ eot, /* eot */ eot, /* writes complete */ @@ -1687,11 +1716,13 @@ void brw_vs_emit(struct brw_vs_compile *c ) /* patch all the BREAK/CONT instructions from last BEGINLOOP */ while (inst0 > loop_inst[loop_depth]) { inst0--; - if (inst0->header.opcode == BRW_OPCODE_BREAK) { + if (inst0->header.opcode == BRW_OPCODE_BREAK && + inst0->bits3.if_else.jump_count == 0) { inst0->bits3.if_else.jump_count = br * (inst1 - inst0 + 1); inst0->bits3.if_else.pop_count = 0; } - else if (inst0->header.opcode == BRW_OPCODE_CONTINUE) { + else if (inst0->header.opcode == BRW_OPCODE_CONTINUE && + inst0->bits3.if_else.jump_count == 0) { inst0->bits3.if_else.jump_count = br * (inst1 - inst0); inst0->bits3.if_else.pop_count = 0; } @@ -1793,6 +1824,8 @@ void brw_vs_emit(struct brw_vs_compile *c ) 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_vs_surface_state.c b/src/mesa/drivers/dri/i965/brw_vs_surface_state.c index ead623fc0ea..4007b5a15ce 100644 --- a/src/mesa/drivers/dri/i965/brw_vs_surface_state.c +++ b/src/mesa/drivers/dri/i965/brw_vs_surface_state.c @@ -67,13 +67,13 @@ brw_vs_update_constant_buffer(struct brw_context *brw) */ _mesa_load_state_parameters(&brw->intel.ctx, vp->program.Base.Parameters); - intel_bo_map_gtt_preferred(intel, const_buffer, GL_TRUE); + drm_intel_gem_bo_map_gtt(const_buffer); for (i = 0; i < params->NumParameters; i++) { memcpy(const_buffer->virtual + i * 4 * sizeof(float), params->ParameterValues[i], 4 * sizeof(float)); } - intel_bo_unmap_gtt_preferred(intel, const_buffer); + drm_intel_gem_bo_unmap_gtt(const_buffer); return const_buffer; } @@ -104,7 +104,7 @@ brw_update_vs_constant_surface( GLcontext *ctx, /* If there's no constant buffer, then no surface BO is needed to point at * it. */ - if (vp->const_buffer == 0) { + if (vp->const_buffer == NULL) { drm_intel_bo_unreference(brw->vs.surf_bo[surf]); brw->vs.surf_bo[surf] = NULL; return; @@ -132,7 +132,7 @@ brw_update_vs_constant_surface( GLcontext *ctx, brw->vs.surf_bo[surf] = brw_search_cache(&brw->surface_cache, BRW_SS_SURFACE, &key, sizeof(key), - &key.bo, key.bo ? 1 : 0, + &key.bo, 1, NULL); if (brw->vs.surf_bo[surf] == NULL) { brw->vs.surf_bo[surf] = brw_create_constant_surface(brw, &key); diff --git a/src/mesa/drivers/dri/i965/brw_vtbl.c b/src/mesa/drivers/dri/i965/brw_vtbl.c index 0b0be02dd20..96a44bfbec7 100644 --- a/src/mesa/drivers/dri/i965/brw_vtbl.c +++ b/src/mesa/drivers/dri/i965/brw_vtbl.c @@ -102,6 +102,9 @@ static void brw_destroy_context( struct intel_context *intel ) dri_bo_release(&brw->cc.prog_bo); dri_bo_release(&brw->cc.state_bo); dri_bo_release(&brw->cc.vp_bo); + dri_bo_release(&brw->cc.blend_state_bo); + dri_bo_release(&brw->cc.depth_stencil_state_bo); + dri_bo_release(&brw->cc.color_calc_state_bo); } @@ -141,7 +144,7 @@ static void brw_finish_batch(struct intel_context *intel) brw_emit_query_end(brw); if (brw->curbe.curbe_bo) { - intel_bo_unmap_gtt_preferred(intel, brw->curbe.curbe_bo); + drm_intel_gem_bo_unmap_gtt(brw->curbe.curbe_bo); drm_intel_bo_unreference(brw->curbe.curbe_bo); brw->curbe.curbe_bo = NULL; } diff --git a/src/mesa/drivers/dri/i965/brw_wm.h b/src/mesa/drivers/dri/i965/brw_wm.h index 88d84ee82fe..47b764d24d1 100644 --- a/src/mesa/drivers/dri/i965/brw_wm.h +++ b/src/mesa/drivers/dri/i965/brw_wm.h @@ -328,6 +328,12 @@ void emit_cinterp(struct brw_compile *p, const struct brw_reg *dst, GLuint mask, const struct brw_reg *arg0); +void emit_cmp(struct brw_compile *p, + const struct brw_reg *dst, + GLuint mask, + const struct brw_reg *arg0, + const struct brw_reg *arg1, + const struct brw_reg *arg2); void emit_ddxy(struct brw_compile *p, const struct brw_reg *dst, GLuint mask, diff --git a/src/mesa/drivers/dri/i965/brw_wm_emit.c b/src/mesa/drivers/dri/i965/brw_wm_emit.c index 9315bca3156..05e464d4b61 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. */ @@ -45,7 +62,13 @@ static INLINE struct brw_reg sechalf( struct brw_reg reg ) } -/* 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 +83,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 +122,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 +137,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 +165,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 +214,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 +225,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 +257,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 +269,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 +287,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 +299,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++) { @@ -502,11 +545,8 @@ void emit_sop(struct brw_compile *p, for (i = 0; i < 4; i++) { if (mask & (1<<i)) { brw_push_insn_state(p); - brw_CMP(p, brw_null_reg(), cond, arg0[i], arg1[i]); - brw_set_predicate_control(p, BRW_PREDICATE_NONE); - brw_MOV(p, dst[i], brw_imm_f(0)); - brw_set_predicate_control(p, BRW_PREDICATE_NORMAL); - brw_MOV(p, dst[i], brw_imm_f(1.0)); + brw_CMP(p, brw_null_reg(), cond, arg1[i], arg0[i]); + brw_SEL(p, dst[i], brw_null_reg(), brw_imm_f(1.0)); brw_pop_insn_state(p); } } @@ -566,12 +606,12 @@ static void emit_sne( struct brw_compile *p, emit_sop(p, dst, mask, BRW_CONDITIONAL_NEQ, arg0, arg1); } -static void emit_cmp( struct brw_compile *p, - const struct brw_reg *dst, - GLuint mask, - const struct brw_reg *arg0, - const struct brw_reg *arg1, - const struct brw_reg *arg2 ) +void emit_cmp(struct brw_compile *p, + const struct brw_reg *dst, + GLuint mask, + const struct brw_reg *arg0, + const struct brw_reg *arg1, + const struct brw_reg *arg2) { GLuint i; @@ -601,14 +641,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 +661,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 +1118,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 562608e2ecd..0b66cc6c9f3 100644 --- a/src/mesa/drivers/dri/i965/brw_wm_glsl.c +++ b/src/mesa/drivers/dri/i965/brw_wm_glsl.c @@ -289,6 +289,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 +414,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! @@ -614,112 +652,6 @@ static void invoke_subroutine( struct brw_wm_compile *c, } } -/* Workaround for using brw_wm_emit.c's emit functions, which expect - * destination regs to be uniquely written. Moves arguments out to - * temporaries as necessary for instructions which use their destination as - * a temporary. - */ -static void -unalias3(struct brw_wm_compile *c, - void (*func)(struct brw_compile *c, - const struct brw_reg *dst, - GLuint mask, - const struct brw_reg *arg0, - const struct brw_reg *arg1, - const struct brw_reg *arg2), - const struct brw_reg *dst, - GLuint mask, - const struct brw_reg *arg0, - const struct brw_reg *arg1, - const struct brw_reg *arg2) -{ - struct brw_compile *p = &c->func; - struct brw_reg tmp_arg0[4], tmp_arg1[4], tmp_arg2[4]; - int i, j; - int mark = mark_tmps(c); - - for (j = 0; j < 4; j++) { - tmp_arg0[j] = arg0[j]; - tmp_arg1[j] = arg1[j]; - tmp_arg2[j] = arg2[j]; - } - - for (i = 0; i < 4; i++) { - if (mask & (1<<i)) { - for (j = 0; j < 4; j++) { - if (arg0[j].file == dst[i].file && - dst[i].nr == arg0[j].nr) { - tmp_arg0[j] = alloc_tmp(c); - brw_MOV(p, tmp_arg0[j], arg0[j]); - } - if (arg1[j].file == dst[i].file && - dst[i].nr == arg1[j].nr) { - tmp_arg1[j] = alloc_tmp(c); - brw_MOV(p, tmp_arg1[j], arg1[j]); - } - if (arg2[j].file == dst[i].file && - dst[i].nr == arg2[j].nr) { - tmp_arg2[j] = alloc_tmp(c); - brw_MOV(p, tmp_arg2[j], arg2[j]); - } - } - } - } - - func(p, dst, mask, tmp_arg0, tmp_arg1, tmp_arg2); - - release_tmps(c, mark); -} - -/* Workaround for using brw_wm_emit.c's emit functions, which expect - * destination regs to be uniquely written. Moves arguments out to - * temporaries as necessary for instructions which use their destination as - * a temporary. - */ -static void -unalias2(struct brw_wm_compile *c, - void (*func)(struct brw_compile *c, - const struct brw_reg *dst, - GLuint mask, - const struct brw_reg *arg0, - const struct brw_reg *arg1), - const struct brw_reg *dst, - GLuint mask, - const struct brw_reg *arg0, - const struct brw_reg *arg1) -{ - struct brw_compile *p = &c->func; - struct brw_reg tmp_arg0[4], tmp_arg1[4]; - int i, j; - int mark = mark_tmps(c); - - for (j = 0; j < 4; j++) { - tmp_arg0[j] = arg0[j]; - tmp_arg1[j] = arg1[j]; - } - - for (i = 0; i < 4; i++) { - if (mask & (1<<i)) { - for (j = 0; j < 4; j++) { - if (arg0[j].file == dst[i].file && - dst[i].nr == arg0[j].nr) { - tmp_arg0[j] = alloc_tmp(c); - brw_MOV(p, tmp_arg0[j], arg0[j]); - } - if (arg1[j].file == dst[i].file && - dst[i].nr == arg1[j].nr) { - tmp_arg1[j] = alloc_tmp(c); - brw_MOV(p, tmp_arg1[j], arg1[j]); - } - } - } - } - - func(p, dst, mask, tmp_arg0, tmp_arg1); - - release_tmps(c, mark); -} - static void emit_arl(struct brw_wm_compile *c, const struct prog_instruction *inst) { @@ -1813,14 +1745,29 @@ static void get_argument_regs(struct brw_wm_compile *c, const struct prog_instruction *inst, int index, + struct brw_reg *dst, struct brw_reg *regs, int mask) { - int i; + struct brw_compile *p = &c->func; + int i, j; for (i = 0; i < 4; i++) { - if (mask & (1 << i)) + if (mask & (1 << i)) { regs[i] = get_src_reg(c, inst, index, i); + + /* Unalias destination registers from our sources. */ + if (regs[i].file == BRW_GENERAL_REGISTER_FILE) { + for (j = 0; j < 4; j++) { + if (memcmp(®s[i], &dst[j], sizeof(regs[0])) == 0) { + struct brw_reg tmp = alloc_tmp(c); + brw_MOV(p, tmp, regs[i]); + regs[i] = tmp; + break; + } + } + } + } } } @@ -1845,6 +1792,7 @@ static void brw_wm_emit_glsl(struct brw_context *brw, struct brw_wm_compile *c) int dst_flags; struct brw_reg args[3][4], dst[4]; int j; + int mark = mark_tmps( c ); c->cur_inst = i; @@ -1866,7 +1814,7 @@ static void brw_wm_emit_glsl(struct brw_context *brw, struct brw_wm_compile *c) } } for (j = 0; j < brw_wm_nr_args(inst->Opcode); j++) - get_argument_regs(c, inst, j, args[j], WRITEMASK_XYZW); + get_argument_regs(c, inst, j, dst, args[j], WRITEMASK_XYZW); dst_flags = inst->DstReg.WriteMask; if (inst->SaturateMode == SATURATE_ZERO_ONE) @@ -1920,8 +1868,7 @@ static void brw_wm_emit_glsl(struct brw_context *brw, struct brw_wm_compile *c) emit_alu1(p, brw_RNDD, dst, dst_flags, args[0]); break; case OPCODE_LRP: - unalias3(c, emit_lrp, - dst, dst_flags, args[0], args[1], args[2]); + emit_lrp(p, dst, dst_flags, args[0], args[1], args[2]); break; case OPCODE_TRUNC: emit_alu1(p, brw_RNDZ, dst, dst_flags, args[0]); @@ -1960,11 +1907,14 @@ static void brw_wm_emit_glsl(struct brw_context *brw, struct brw_wm_compile *c) case OPCODE_LG2: emit_math1(c, BRW_MATH_FUNCTION_LOG, dst, dst_flags, args[0]); break; + case OPCODE_CMP: + emit_cmp(p, dst, dst_flags, args[0], args[1], args[2]); + break; case OPCODE_MIN: - unalias2(c, emit_min, dst, dst_flags, args[0], args[1]); + emit_min(p, dst, dst_flags, args[0], args[1]); break; case OPCODE_MAX: - unalias2(c, emit_max, dst, dst_flags, args[0], args[1]); + emit_max(p, dst, dst_flags, args[0], args[1]); break; case OPCODE_DDX: case OPCODE_DDY: @@ -2103,11 +2053,13 @@ static void brw_wm_emit_glsl(struct brw_context *brw, struct brw_wm_compile *c) /* patch all the BREAK/CONT instructions from last BGNLOOP */ while (inst0 > loop_inst[loop_depth]) { inst0--; - if (inst0->header.opcode == BRW_OPCODE_BREAK) { + if (inst0->header.opcode == BRW_OPCODE_BREAK && + inst0->bits3.if_else.jump_count == 0) { inst0->bits3.if_else.jump_count = br * (inst1 - inst0 + 1); inst0->bits3.if_else.pop_count = 0; } - else if (inst0->header.opcode == BRW_OPCODE_CONTINUE) { + else if (inst0->header.opcode == BRW_OPCODE_CONTINUE && + inst0->bits3.if_else.jump_count == 0) { inst0->bits3.if_else.jump_count = br * (inst1 - inst0); inst0->bits3.if_else.pop_count = 0; } @@ -2115,10 +2067,14 @@ 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. */ + release_tmps( c, mark ); + if (inst->CondUpdate) brw_set_predicate_control(p, BRW_PREDICATE_NORMAL); else diff --git a/src/mesa/drivers/dri/i965/brw_wm_sampler_state.c b/src/mesa/drivers/dri/i965/brw_wm_sampler_state.c index c232cd27914..d7650af3d9d 100644 --- a/src/mesa/drivers/dri/i965/brw_wm_sampler_state.c +++ b/src/mesa/drivers/dri/i965/brw_wm_sampler_state.c @@ -89,7 +89,6 @@ struct wm_sampler_key { float max_aniso; GLenum minfilter, magfilter; GLenum comparemode, comparefunc; - dri_bo *sdc_bo; /** If target is cubemap, take context setting. */ @@ -230,7 +229,7 @@ brw_wm_sampler_populate_key(struct brw_context *brw, GLcontext *ctx = &brw->intel.ctx; int unit; - memset(key, 0, sizeof(*key)); + key->sampler_count = 0; for (unit = 0; unit < BRW_MAX_TEX_UNIT; unit++) { if (ctx->Texture.Unit[unit]._ReallyEnabled) { @@ -241,6 +240,8 @@ brw_wm_sampler_populate_key(struct brw_context *brw, struct gl_texture_image *firstImage = texObj->Image[0][intelObj->firstLevel]; + memset(entry, 0, sizeof(*entry)); + entry->tex_target = texObj->Target; entry->seamless_cube_map = (texObj->Target == GL_TEXTURE_CUBE_MAP) @@ -289,7 +290,7 @@ static void upload_wm_samplers( struct brw_context *brw ) { GLcontext *ctx = &brw->intel.ctx; struct wm_sampler_key key; - int i; + int i, sampler_key_size; brw_wm_sampler_populate_key(brw, &key); @@ -303,8 +304,11 @@ static void upload_wm_samplers( struct brw_context *brw ) if (brw->wm.sampler_count == 0) return; + /* Only include the populated portion of the key in the search. */ + sampler_key_size = offsetof(struct wm_sampler_key, + sampler[key.sampler_count]); brw->wm.sampler_bo = brw_search_cache(&brw->cache, BRW_SAMPLER, - &key, sizeof(key), + &key, sampler_key_size, brw->wm.sdc_bo, key.sampler_count, NULL); @@ -324,7 +328,7 @@ static void upload_wm_samplers( struct brw_context *brw ) } brw->wm.sampler_bo = brw_upload_cache(&brw->cache, BRW_SAMPLER, - &key, sizeof(key), + &key, sampler_key_size, brw->wm.sdc_bo, key.sampler_count, &sampler, sizeof(sampler)); 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 1db438ae7b5..ce0bf0b97d2 100644 --- a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c +++ b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c @@ -207,33 +207,14 @@ brw_create_texture_surface( struct brw_context *brw, surf.ss0.mipmap_layout_mode = BRW_SURFACE_MIPMAPLAYOUT_BELOW; surf.ss0.surface_type = translate_tex_target(key->target); - if (key->bo) { - surf.ss0.surface_format = translate_tex_format(key->format, - key->internal_format, - key->depthmode); - } - else { - switch (key->depth) { - case 32: - surf.ss0.surface_format = BRW_SURFACEFORMAT_B8G8R8A8_UNORM; - break; - default: - case 24: - surf.ss0.surface_format = BRW_SURFACEFORMAT_B8G8R8X8_UNORM; - break; - case 16: - surf.ss0.surface_format = BRW_SURFACEFORMAT_B5G6R5_UNORM; - break; - } - } + surf.ss0.surface_format = translate_tex_format(key->format, + key->internal_format, + key->depthmode); /* This is ok for all textures with channel width 8bit or less: */ /* surf.ss0.data_return_format = BRW_SURFACERETURNFORMAT_S1; */ - if (key->bo) - surf.ss1.base_addr = key->bo->offset; /* reloc */ - else - surf.ss1.base_addr = key->offset; + surf.ss1.base_addr = key->bo->offset; /* reloc */ surf.ss2.mip_count = key->last_level - key->first_level; surf.ss2.width = key->width - 1; @@ -255,17 +236,14 @@ brw_create_texture_surface( struct brw_context *brw, bo = brw_upload_cache(&brw->surface_cache, BRW_SS_SURFACE, key, sizeof(*key), - &key->bo, key->bo ? 1 : 0, + &key->bo, 1, &surf, sizeof(surf)); - if (key->bo) { - /* Emit relocation to surface contents */ - dri_bo_emit_reloc(bo, - I915_GEM_DOMAIN_SAMPLER, 0, - 0, - offsetof(struct brw_surface_state, ss1), - key->bo); - } + /* Emit relocation to surface contents */ + drm_intel_bo_emit_reloc(bo, offsetof(struct brw_surface_state, ss1), + key->bo, 0, + I915_GEM_DOMAIN_SAMPLER, 0); + return bo; } @@ -281,19 +259,12 @@ brw_update_texture_surface( GLcontext *ctx, GLuint unit ) memset(&key, 0, sizeof(key)); - if (intelObj->imageOverride) { - key.pitch = intelObj->pitchOverride / intelObj->mt->cpp; - key.depth = intelObj->depthOverride; - key.bo = NULL; - key.offset = intelObj->textureOffset; - } else { - key.format = firstImage->TexFormat; - key.internal_format = firstImage->InternalFormat; - key.pitch = intelObj->mt->pitch; - key.depth = firstImage->Depth; - key.bo = intelObj->mt->region->buffer; - key.offset = 0; - } + key.format = firstImage->TexFormat; + key.internal_format = firstImage->InternalFormat; + key.pitch = intelObj->mt->pitch; + key.depth = firstImage->Depth; + key.bo = intelObj->mt->region->buffer; + key.offset = 0; key.target = tObj->Target; key.depthmode = tObj->DepthMode; @@ -308,7 +279,7 @@ brw_update_texture_surface( GLcontext *ctx, GLuint unit ) brw->wm.surf_bo[surf] = brw_search_cache(&brw->surface_cache, BRW_SS_SURFACE, &key, sizeof(key), - &key.bo, key.bo ? 1 : 0, + &key.bo, 1, NULL); if (brw->wm.surf_bo[surf] == NULL) { brw->wm.surf_bo[surf] = brw_create_texture_surface(brw, &key); @@ -336,10 +307,7 @@ brw_create_constant_surface( struct brw_context *brw, surf.ss0.surface_format = BRW_SURFACEFORMAT_R32G32B32A32_FLOAT; assert(key->bo); - if (key->bo) - surf.ss1.base_addr = key->bo->offset; /* reloc */ - else - surf.ss1.base_addr = key->offset; + surf.ss1.base_addr = key->bo->offset; /* reloc */ surf.ss2.width = w & 0x7f; /* bits 6:0 of size or width */ surf.ss2.height = (w >> 7) & 0x1fff; /* bits 19:7 of size or width */ @@ -349,20 +317,16 @@ brw_create_constant_surface( struct brw_context *brw, bo = brw_upload_cache(&brw->surface_cache, BRW_SS_SURFACE, key, sizeof(*key), - &key->bo, key->bo ? 1 : 0, + &key->bo, 1, &surf, sizeof(surf)); - if (key->bo) { - /* Emit relocation to surface contents. Section 5.1.1 of the gen4 - * bspec ("Data Cache") says that the data cache does not exist as - * a separate cache and is just the sampler cache. - */ - dri_bo_emit_reloc(bo, - I915_GEM_DOMAIN_SAMPLER, 0, - 0, - offsetof(struct brw_surface_state, ss1), - key->bo); - } + /* Emit relocation to surface contents. Section 5.1.1 of the gen4 + * bspec ("Data Cache") says that the data cache does not exist as + * a separate cache and is just the sampler cache. + */ + drm_intel_bo_emit_reloc(bo, offsetof(struct brw_surface_state, ss1), + key->bo, 0, + I915_GEM_DOMAIN_SAMPLER, 0); return bo; } @@ -420,7 +384,7 @@ brw_update_wm_constant_surface( GLcontext *ctx, /* If there's no constant buffer, then no surface BO is needed to point at * it. */ - if (fp->const_buffer == 0) { + if (fp->const_buffer == NULL) { drm_intel_bo_unreference(brw->wm.surf_bo[surf]); brw->wm.surf_bo[surf] = NULL; return; @@ -448,7 +412,7 @@ brw_update_wm_constant_surface( GLcontext *ctx, brw->wm.surf_bo[surf] = brw_search_cache(&brw->surface_cache, BRW_SS_SURFACE, &key, sizeof(key), - &key.bo, key.bo ? 1 : 0, + &key.bo, 1, NULL); if (brw->wm.surf_bo[surf] == NULL) { brw->wm.surf_bo[surf] = brw_create_constant_surface(brw, &key); @@ -509,7 +473,7 @@ brw_update_renderbuffer_surface(struct brw_context *brw, struct gl_renderbuffer *rb, unsigned int unit) { - struct intel_context *intel = &brw->intel;; + struct intel_context *intel = &brw->intel; GLcontext *ctx = &intel->ctx; dri_bo *region_bo = NULL; struct intel_renderbuffer *irb = intel_renderbuffer(rb); @@ -576,18 +540,21 @@ brw_update_renderbuffer_surface(struct brw_context *brw, key.draw_x = 0; key.draw_y = 0; } - /* _NEW_COLOR */ - memcpy(key.color_mask, ctx->Color.ColorMask[unit], - sizeof(key.color_mask)); - /* As mentioned above, disable writes to the alpha component when the - * renderbuffer is XRGB. - */ - if (ctx->DrawBuffer->Visual.alphaBits == 0) - key.color_mask[3] = GL_FALSE; + if (intel->gen < 6) { + /* _NEW_COLOR */ + memcpy(key.color_mask, ctx->Color.ColorMask[unit], + sizeof(key.color_mask)); - key.color_blend = (!ctx->Color._LogicOpEnabled && - (ctx->Color.BlendEnabled & (1 << unit))); + /* As mentioned above, disable writes to the alpha component when the + * renderbuffer is XRGB. + */ + if (ctx->DrawBuffer->Visual.alphaBits == 0) + key.color_mask[3] = GL_FALSE; + + key.color_blend = (!ctx->Color._LogicOpEnabled && + (ctx->Color.BlendEnabled & (1 << unit))); + } dri_bo_unreference(brw->wm.surf_bo[unit]); brw->wm.surf_bo[unit] = brw_search_cache(&brw->surface_cache, @@ -639,12 +606,14 @@ brw_update_renderbuffer_surface(struct brw_context *brw, brw_set_surface_tiling(&surf, key.tiling); surf.ss3.pitch = (key.pitch * key.cpp) - 1; - /* _NEW_COLOR */ - surf.ss0.color_blend = key.color_blend; - surf.ss0.writedisable_red = !key.color_mask[0]; - surf.ss0.writedisable_green = !key.color_mask[1]; - surf.ss0.writedisable_blue = !key.color_mask[2]; - surf.ss0.writedisable_alpha = !key.color_mask[3]; + if (intel->gen < 6) { + /* _NEW_COLOR */ + surf.ss0.color_blend = key.color_blend; + surf.ss0.writedisable_red = !key.color_mask[0]; + surf.ss0.writedisable_green = !key.color_mask[1]; + surf.ss0.writedisable_blue = !key.color_mask[2]; + surf.ss0.writedisable_alpha = !key.color_mask[3]; + } /* Key size will never match key size for textures, so we're safe. */ brw->wm.surf_bo[unit] = brw_upload_cache(&brw->surface_cache, diff --git a/src/mesa/drivers/dri/i965/gen6_cc.c b/src/mesa/drivers/dri/i965/gen6_cc.c new file mode 100644 index 00000000000..f7acad69129 --- /dev/null +++ b/src/mesa/drivers/dri/i965/gen6_cc.c @@ -0,0 +1,296 @@ +/* + * Copyright © 2009 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 <[email protected]> + * + */ + +#include "brw_context.h" +#include "brw_state.h" +#include "brw_defines.h" +#include "brw_util.h" +#include "intel_batchbuffer.h" +#include "main/macros.h" + +struct gen6_blend_state_key { + GLboolean color_blend, alpha_enabled; + GLboolean dither; + + GLenum logic_op; + + GLenum blend_eq_rgb, blend_eq_a; + GLenum blend_src_rgb, blend_src_a; + GLenum blend_dst_rgb, blend_dst_a; + + GLenum alpha_func; +}; + +static void +blend_state_populate_key(struct brw_context *brw, + struct gen6_blend_state_key *key) +{ + GLcontext *ctx = &brw->intel.ctx; + + memset(key, 0, sizeof(*key)); + + /* _NEW_COLOR */ + if (ctx->Color._LogicOpEnabled) + key->logic_op = ctx->Color.LogicOp; + else + key->logic_op = GL_COPY; + + /* _NEW_COLOR */ + key->color_blend = ctx->Color.BlendEnabled; + if (key->color_blend) { + key->blend_eq_rgb = ctx->Color.BlendEquationRGB; + key->blend_eq_a = ctx->Color.BlendEquationA; + key->blend_src_rgb = ctx->Color.BlendSrcRGB; + key->blend_dst_rgb = ctx->Color.BlendDstRGB; + key->blend_src_a = ctx->Color.BlendSrcA; + key->blend_dst_a = ctx->Color.BlendDstA; + } + + /* _NEW_COLOR */ + key->alpha_enabled = ctx->Color.AlphaEnabled; + if (key->alpha_enabled) { + key->alpha_func = ctx->Color.AlphaFunc; + } + + /* _NEW_COLOR */ + key->dither = ctx->Color.DitherFlag; +} + +/** + * Creates the state cache entry for the given CC unit key. + */ +static drm_intel_bo * +blend_state_create_from_key(struct brw_context *brw, + struct gen6_blend_state_key *key) +{ + struct gen6_blend_state blend; + drm_intel_bo *bo; + + memset(&blend, 0, sizeof(blend)); + + if (key->logic_op != GL_COPY) { + blend.blend1.logic_op_enable = 1; + blend.blend1.logic_op_func = intel_translate_logic_op(key->logic_op); + } else if (key->color_blend) { + GLenum eqRGB = key->blend_eq_rgb; + GLenum eqA = key->blend_eq_a; + GLenum srcRGB = key->blend_src_rgb; + GLenum dstRGB = key->blend_dst_rgb; + GLenum srcA = key->blend_src_a; + GLenum dstA = key->blend_dst_a; + + if (eqRGB == GL_MIN || eqRGB == GL_MAX) { + srcRGB = dstRGB = GL_ONE; + } + + if (eqA == GL_MIN || eqA == GL_MAX) { + srcA = dstA = GL_ONE; + } + + blend.blend0.dest_blend_factor = brw_translate_blend_factor(dstRGB); + blend.blend0.source_blend_factor = brw_translate_blend_factor(srcRGB); + blend.blend0.blend_func = brw_translate_blend_equation(eqRGB); + + blend.blend0.ia_dest_blend_factor = brw_translate_blend_factor(dstA); + blend.blend0.ia_source_blend_factor = brw_translate_blend_factor(srcA); + blend.blend0.ia_blend_func = brw_translate_blend_equation(eqA); + + blend.blend0.blend_enable = 1; + blend.blend0.ia_blend_enable = (srcA != srcRGB || + dstA != dstRGB || + eqA != eqRGB); + } + + if (key->alpha_enabled) { + blend.blend1.alpha_test_enable = 1; + blend.blend1.alpha_test_func = intel_translate_compare_func(key->alpha_func); + + } + + if (key->dither) { + blend.blend1.dither_enable = 1; + blend.blend1.y_dither_offset = 0; + blend.blend1.x_dither_offset = 0; + } + + bo = brw_upload_cache(&brw->cache, BRW_BLEND_STATE, + key, sizeof(*key), + NULL, 0, + &blend, sizeof(blend)); + + return bo; +} + +static void +prepare_blend_state(struct brw_context *brw) +{ + struct gen6_blend_state_key key; + + blend_state_populate_key(brw, &key); + + drm_intel_bo_unreference(brw->cc.blend_state_bo); + brw->cc.blend_state_bo = brw_search_cache(&brw->cache, BRW_BLEND_STATE, + &key, sizeof(key), + NULL, 0, + NULL); + + if (brw->cc.blend_state_bo == NULL) + brw->cc.blend_state_bo = blend_state_create_from_key(brw, &key); +} + +const struct brw_tracked_state gen6_blend_state = { + .dirty = { + .mesa = _NEW_COLOR, + .brw = 0, + .cache = 0, + }, + .prepare = prepare_blend_state, +}; + +struct gen6_color_calc_state_key { + GLubyte blend_constant_color[4]; + GLclampf alpha_ref; + GLubyte stencil_ref[2]; +}; + +static void +color_calc_state_populate_key(struct brw_context *brw, + struct gen6_color_calc_state_key *key) +{ + GLcontext *ctx = &brw->intel.ctx; + + memset(key, 0, sizeof(*key)); + + /* _NEW_STENCIL */ + if (ctx->Stencil._Enabled) { + const unsigned back = ctx->Stencil._BackFace; + + key->stencil_ref[0] = ctx->Stencil.Ref[0]; + if (ctx->Stencil._TestTwoSide) + key->stencil_ref[1] = ctx->Stencil.Ref[back]; + } + + /* _NEW_COLOR */ + if (ctx->Color.AlphaEnabled) + key->alpha_ref = ctx->Color.AlphaRef; + + key->blend_constant_color[0] = ctx->Color.BlendColor[0]; + key->blend_constant_color[1] = ctx->Color.BlendColor[1]; + key->blend_constant_color[2] = ctx->Color.BlendColor[2]; + key->blend_constant_color[3] = ctx->Color.BlendColor[3]; +} + +/** + * Creates the state cache entry for the given CC state key. + */ +static drm_intel_bo * +color_calc_state_create_from_key(struct brw_context *brw, + struct gen6_color_calc_state_key *key) +{ + struct gen6_color_calc_state cc; + drm_intel_bo *bo; + + memset(&cc, 0, sizeof(cc)); + + cc.cc0.alpha_test_format = BRW_ALPHATEST_FORMAT_UNORM8; + UNCLAMPED_FLOAT_TO_UBYTE(cc.cc1.alpha_ref_fi.ui, key->alpha_ref); + + cc.cc0.stencil_ref = key->stencil_ref[0]; + cc.cc0.bf_stencil_ref = key->stencil_ref[1]; + + cc.constant_r = key->blend_constant_color[0]; + cc.constant_g = key->blend_constant_color[1]; + cc.constant_b = key->blend_constant_color[2]; + cc.constant_a = key->blend_constant_color[3]; + + bo = brw_upload_cache(&brw->cache, BRW_COLOR_CALC_STATE, + key, sizeof(*key), + NULL, 0, + &cc, sizeof(cc)); + + return bo; +} + +static void +prepare_color_calc_state(struct brw_context *brw) +{ + struct gen6_color_calc_state_key key; + + color_calc_state_populate_key(brw, &key); + + drm_intel_bo_unreference(brw->cc.state_bo); + brw->cc.state_bo = brw_search_cache(&brw->cache, BRW_COLOR_CALC_STATE, + &key, sizeof(key), + NULL, 0, + NULL); + + if (brw->cc.state_bo == NULL) + brw->cc.state_bo = color_calc_state_create_from_key(brw, &key); +} + +const struct brw_tracked_state gen6_color_calc_state = { + .dirty = { + .mesa = _NEW_COLOR, + .brw = 0, + .cache = 0, + }, + .prepare = prepare_color_calc_state, +}; + +static void upload_cc_state_pointers(struct brw_context *brw) +{ + struct intel_context *intel = &brw->intel; + + BEGIN_BATCH(4); + OUT_BATCH(CMD_3D_CC_STATE_POINTERS << 16 | (4 - 2)); + OUT_RELOC(brw->cc.state_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 1); + OUT_RELOC(brw->cc.blend_state_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 1); + OUT_RELOC(brw->cc.depth_stencil_state_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 1); + ADVANCE_BATCH(); + + intel_batchbuffer_emit_mi_flush(intel->batch); +} + + +static void prepare_cc_state_pointers(struct brw_context *brw) +{ + brw_add_validated_bo(brw, brw->cc.state_bo); + brw_add_validated_bo(brw, brw->cc.blend_state_bo); + brw_add_validated_bo(brw, brw->cc.depth_stencil_state_bo); +} + +const struct brw_tracked_state gen6_cc_state_pointers = { + .dirty = { + .mesa = 0, + .brw = BRW_NEW_BATCH, + .cache = (CACHE_NEW_BLEND_STATE | + CACHE_NEW_COLOR_CALC_STATE | + CACHE_NEW_DEPTH_STENCIL_STATE) + }, + .prepare = prepare_cc_state_pointers, + .emit = upload_cc_state_pointers, +}; diff --git a/src/mesa/drivers/dri/i965/gen6_clip_state.c b/src/mesa/drivers/dri/i965/gen6_clip_state.c new file mode 100644 index 00000000000..06f8145e32d --- /dev/null +++ b/src/mesa/drivers/dri/i965/gen6_clip_state.c @@ -0,0 +1,75 @@ +/* + * Copyright © 2009 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 <[email protected]> + * + */ + +#include "brw_context.h" +#include "brw_state.h" +#include "brw_defines.h" +#include "intel_batchbuffer.h" + +static void +upload_clip_state(struct brw_context *brw) +{ + struct intel_context *intel = &brw->intel; + GLcontext *ctx = &intel->ctx; + uint32_t depth_clamp = 0; + uint32_t provoking; + + if (!ctx->Transform.DepthClamp) + depth_clamp = GEN6_CLIP_Z_TEST; + + if (ctx->Light.ProvokingVertex == GL_FIRST_VERTEX_CONVENTION) { + provoking = 0; + } else { + provoking = + (2 << GEN6_CLIP_TRI_PROVOKE_SHIFT) | + (2 << GEN6_CLIP_TRIFAN_PROVOKE_SHIFT) | + (1 << GEN6_CLIP_LINE_PROVOKE_SHIFT); + } + + BEGIN_BATCH(4); + OUT_BATCH(CMD_3D_CLIP_STATE << 16 | (4 - 2)); + 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_XY_TEST | + depth_clamp | + provoking); + OUT_BATCH(0); + ADVANCE_BATCH(); + + intel_batchbuffer_emit_mi_flush(intel->batch); +} + +const struct brw_tracked_state gen6_clip_state = { + .dirty = { + .mesa = _NEW_TRANSFORM, + .brw = BRW_NEW_CONTEXT, + .cache = 0 + }, + .emit = upload_clip_state, +}; diff --git a/src/mesa/drivers/dri/i965/gen6_depthstencil.c b/src/mesa/drivers/dri/i965/gen6_depthstencil.c new file mode 100644 index 00000000000..4924f0fd559 --- /dev/null +++ b/src/mesa/drivers/dri/i965/gen6_depthstencil.c @@ -0,0 +1,165 @@ +/* + * Copyright © 2009 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 <[email protected]> + * + */ + +#include "brw_context.h" +#include "brw_state.h" + +struct brw_depth_stencil_state_key { + GLenum depth_func; + GLboolean depth_test, depth_write; + GLboolean stencil, stencil_two_side; + GLenum stencil_func[2], stencil_fail_op[2]; + GLenum stencil_pass_depth_fail_op[2], stencil_pass_depth_pass_op[2]; + GLubyte stencil_write_mask[2], stencil_test_mask[2]; +}; + +static void +depth_stencil_state_populate_key(struct brw_context *brw, + struct brw_depth_stencil_state_key *key) +{ + GLcontext *ctx = &brw->intel.ctx; + const unsigned back = ctx->Stencil._BackFace; + + memset(key, 0, sizeof(*key)); + + /* _NEW_STENCIL */ + key->stencil = ctx->Stencil._Enabled; + key->stencil_two_side = ctx->Stencil._TestTwoSide; + + if (key->stencil) { + key->stencil_func[0] = ctx->Stencil.Function[0]; + key->stencil_fail_op[0] = ctx->Stencil.FailFunc[0]; + key->stencil_pass_depth_fail_op[0] = ctx->Stencil.ZFailFunc[0]; + key->stencil_pass_depth_pass_op[0] = ctx->Stencil.ZPassFunc[0]; + key->stencil_write_mask[0] = ctx->Stencil.WriteMask[0]; + key->stencil_test_mask[0] = ctx->Stencil.ValueMask[0]; + } + if (key->stencil_two_side) { + key->stencil_func[1] = ctx->Stencil.Function[back]; + key->stencil_fail_op[1] = ctx->Stencil.FailFunc[back]; + key->stencil_pass_depth_fail_op[1] = ctx->Stencil.ZFailFunc[back]; + key->stencil_pass_depth_pass_op[1] = ctx->Stencil.ZPassFunc[back]; + key->stencil_write_mask[1] = ctx->Stencil.WriteMask[back]; + key->stencil_test_mask[1] = ctx->Stencil.ValueMask[back]; + } + + key->depth_test = ctx->Depth.Test; + if (key->depth_test) { + key->depth_func = ctx->Depth.Func; + key->depth_write = ctx->Depth.Mask; + } +} + +/** + * Creates the state cache entry for the given DEPTH_STENCIL_STATE state key. + */ +static dri_bo * +depth_stencil_state_create_from_key(struct brw_context *brw, + struct brw_depth_stencil_state_key *key) +{ + struct gen6_depth_stencil_state ds; + dri_bo *bo; + + memset(&ds, 0, sizeof(ds)); + + /* _NEW_STENCIL */ + if (key->stencil) { + ds.ds0.stencil_enable = 1; + ds.ds0.stencil_func = + intel_translate_compare_func(key->stencil_func[0]); + ds.ds0.stencil_fail_op = + intel_translate_stencil_op(key->stencil_fail_op[0]); + ds.ds0.stencil_pass_depth_fail_op = + intel_translate_stencil_op(key->stencil_pass_depth_fail_op[0]); + ds.ds0.stencil_pass_depth_pass_op = + intel_translate_stencil_op(key->stencil_pass_depth_pass_op[0]); + ds.ds1.stencil_write_mask = key->stencil_write_mask[0]; + ds.ds1.stencil_test_mask = key->stencil_test_mask[0]; + + if (key->stencil_two_side) { + ds.ds0.bf_stencil_enable = 1; + ds.ds0.bf_stencil_func = + intel_translate_compare_func(key->stencil_func[1]); + ds.ds0.bf_stencil_fail_op = + intel_translate_stencil_op(key->stencil_fail_op[1]); + ds.ds0.bf_stencil_pass_depth_fail_op = + intel_translate_stencil_op(key->stencil_pass_depth_fail_op[1]); + ds.ds0.bf_stencil_pass_depth_pass_op = + intel_translate_stencil_op(key->stencil_pass_depth_pass_op[1]); + ds.ds1.bf_stencil_write_mask = key->stencil_write_mask[1]; + ds.ds1.bf_stencil_test_mask = key->stencil_test_mask[1]; + } + + /* Not really sure about this: + */ + if (key->stencil_write_mask[0] || + (key->stencil_two_side && key->stencil_write_mask[1])) + ds.ds0.stencil_write_enable = 1; + } + + /* _NEW_DEPTH */ + if (key->depth_test) { + ds.ds2.depth_test_enable = 1; + ds.ds2.depth_test_func = intel_translate_compare_func(key->depth_func); + ds.ds2.depth_write_enable = key->depth_write; + } + + bo = brw_upload_cache(&brw->cache, BRW_DEPTH_STENCIL_STATE, + key, sizeof(*key), + NULL, 0, + &ds, sizeof(ds)); + + return bo; +} + +static void +prepare_depth_stencil_state(struct brw_context *brw) +{ + struct brw_depth_stencil_state_key key; + + depth_stencil_state_populate_key(brw, &key); + + dri_bo_unreference(brw->cc.depth_stencil_state_bo); + brw->cc.depth_stencil_state_bo = brw_search_cache(&brw->cache, + BRW_DEPTH_STENCIL_STATE, + &key, sizeof(key), + NULL, 0, + NULL); + + if (brw->cc.depth_stencil_state_bo == NULL) + brw->cc.depth_stencil_state_bo = + depth_stencil_state_create_from_key(brw, &key); +} + +const struct brw_tracked_state gen6_depth_stencil_state = { + .dirty = { + .mesa = _NEW_DEPTH | _NEW_STENCIL, + .brw = 0, + .cache = 0, + }, + .prepare = prepare_depth_stencil_state, +}; diff --git a/src/mesa/drivers/dri/i965/gen6_gs_state.c b/src/mesa/drivers/dri/i965/gen6_gs_state.c new file mode 100644 index 00000000000..161e7b85c28 --- /dev/null +++ b/src/mesa/drivers/dri/i965/gen6_gs_state.c @@ -0,0 +1,91 @@ +/* + * Copyright © 2009 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 <[email protected]> + * + */ + +#include "brw_context.h" +#include "brw_state.h" +#include "brw_defines.h" +#include "intel_batchbuffer.h" + +static void +upload_gs_state(struct brw_context *brw) +{ + struct intel_context *intel = &brw->intel; + + /* Disable all the constant buffers. */ + BEGIN_BATCH(5); + OUT_BATCH(CMD_3D_CONSTANT_GS_STATE << 16 | (5 - 2)); + OUT_BATCH(0); + OUT_BATCH(0); + OUT_BATCH(0); + OUT_BATCH(0); + ADVANCE_BATCH(); + + intel_batchbuffer_emit_mi_flush(intel->batch); + + if (brw->gs.prog_bo) { + 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) | + (0 << GEN6_GS_BINDING_TABLE_ENTRY_COUNT_SHIFT)); + OUT_BATCH(0); /* scratch space base offset */ + OUT_BATCH((1 << GEN6_GS_DISPATCH_START_GRF_SHIFT) | + (brw->gs.prog_data->urb_read_length << GEN6_GS_URB_READ_LENGTH_SHIFT) | + (0 << GEN6_GS_URB_ENTRY_READ_OFFSET_SHIFT)); + OUT_BATCH((0 << GEN6_GS_MAX_THREADS_SHIFT) | + GEN6_GS_STATISTICS_ENABLE | + GEN6_GS_RENDERING_ENABLE); + OUT_BATCH(GEN6_GS_ENABLE); + ADVANCE_BATCH(); + } else { + BEGIN_BATCH(7); + OUT_BATCH(CMD_3D_GS_STATE << 16 | (7 - 2)); + OUT_BATCH(0); /* prog_bo */ + OUT_BATCH((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) | + (0 << GEN6_GS_URB_READ_LENGTH_SHIFT) | + (0 << GEN6_GS_URB_ENTRY_READ_OFFSET_SHIFT)); + OUT_BATCH((0 << GEN6_GS_MAX_THREADS_SHIFT) | + GEN6_GS_STATISTICS_ENABLE | + GEN6_GS_RENDERING_ENABLE); + OUT_BATCH(0); + ADVANCE_BATCH(); + } +} + +const struct brw_tracked_state gen6_gs_state = { + .dirty = { + .mesa = _NEW_TRANSFORM, + .brw = (BRW_NEW_CURBE_OFFSETS | + BRW_NEW_URB_FENCE | + BRW_NEW_CONTEXT), + .cache = CACHE_NEW_GS_PROG + }, + .emit = upload_gs_state, +}; diff --git a/src/mesa/drivers/dri/i965/gen6_sampler_state.c b/src/mesa/drivers/dri/i965/gen6_sampler_state.c new file mode 100644 index 00000000000..ab8e7516d23 --- /dev/null +++ b/src/mesa/drivers/dri/i965/gen6_sampler_state.c @@ -0,0 +1,71 @@ +/* + * 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 <[email protected]> + * + */ + +#include "brw_context.h" +#include "brw_state.h" +#include "brw_defines.h" +#include "intel_batchbuffer.h" + +static void +upload_sampler_state_pointers(struct brw_context *brw) +{ + struct intel_context *intel = &brw->intel; + + BEGIN_BATCH(4); + OUT_BATCH(CMD_3D_SAMPLER_STATE_POINTERS << 16 | + VS_SAMPLER_STATE_CHANGE | + GS_SAMPLER_STATE_CHANGE | + PS_SAMPLER_STATE_CHANGE | + (4 - 2)); + OUT_BATCH(0); /* VS */ + OUT_BATCH(0); /* GS */ + if (brw->wm.sampler_bo) + OUT_RELOC(brw->wm.sampler_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0); + else + OUT_BATCH(0); + + ADVANCE_BATCH(); + + intel_batchbuffer_emit_mi_flush(intel->batch); +} + + +static void +prepare_sampler_state_pointers(struct brw_context *brw) +{ + brw_add_validated_bo(brw, brw->wm.sampler_bo); +} + +const struct brw_tracked_state gen6_sampler_state = { + .dirty = { + .mesa = 0, + .brw = BRW_NEW_BATCH, + .cache = CACHE_NEW_SAMPLER + }, + .prepare = prepare_sampler_state_pointers, + .emit = upload_sampler_state_pointers, +}; diff --git a/src/mesa/drivers/dri/i965/gen6_scissor_state.c b/src/mesa/drivers/dri/i965/gen6_scissor_state.c new file mode 100644 index 00000000000..2e21e5f7335 --- /dev/null +++ b/src/mesa/drivers/dri/i965/gen6_scissor_state.c @@ -0,0 +1,105 @@ +/* + * Copyright © 2009 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 <[email protected]> + * + */ + +#include "brw_context.h" +#include "brw_state.h" +#include "brw_defines.h" +#include "intel_batchbuffer.h" + +static void +prepare_scissor_state(struct brw_context *brw) +{ + GLcontext *ctx = &brw->intel.ctx; + const GLboolean render_to_fbo = (ctx->DrawBuffer->Name != 0); + struct gen6_scissor_state scissor; + + /* _NEW_SCISSOR | _NEW_BUFFERS | _NEW_VIEWPORT */ + + /* The scissor only needs to handle the intersection of drawable and + * scissor rect. Clipping to the boundaries of static shared buffers + * for front/back/depth is covered by looping over cliprects in brw_draw.c. + * + * Note that the hardware's coordinates are inclusive, while Mesa's min is + * inclusive but max is exclusive. + */ + if (render_to_fbo) { + /* texmemory: Y=0=bottom */ + scissor.xmin = ctx->DrawBuffer->_Xmin; + scissor.xmax = ctx->DrawBuffer->_Xmax - 1; + scissor.ymin = ctx->DrawBuffer->_Ymin; + scissor.ymax = ctx->DrawBuffer->_Ymax - 1; + } + else { + /* memory: Y=0=top */ + scissor.xmin = ctx->DrawBuffer->_Xmin; + scissor.xmax = ctx->DrawBuffer->_Xmax - 1; + scissor.ymin = ctx->DrawBuffer->Height - ctx->DrawBuffer->_Ymax; + scissor.ymax = ctx->DrawBuffer->Height - ctx->DrawBuffer->_Ymin - 1; + } + + drm_intel_bo_unreference(brw->sf.state_bo); + brw->sf.state_bo = brw_cache_data(&brw->cache, BRW_SF_UNIT, + &scissor, sizeof(scissor), + NULL, 0); +} + +const struct brw_tracked_state gen6_scissor_state = { + .dirty = { + .mesa = _NEW_SCISSOR | _NEW_BUFFERS | _NEW_VIEWPORT, + .brw = 0, + .cache = 0, + }, + .prepare = prepare_scissor_state, +}; + +static void upload_scissor_state_pointers(struct brw_context *brw) +{ + struct intel_context *intel = &brw->intel; + + BEGIN_BATCH(2); + OUT_BATCH(CMD_3D_SCISSOR_STATE_POINTERS << 16 | (2 - 2)); + OUT_RELOC(brw->sf.state_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0); + ADVANCE_BATCH(); + + intel_batchbuffer_emit_mi_flush(intel->batch); +} + + +static void prepare_scissor_state_pointers(struct brw_context *brw) +{ + brw_add_validated_bo(brw, brw->sf.state_bo); +} + +const struct brw_tracked_state gen6_scissor_state_pointers = { + .dirty = { + .mesa = 0, + .brw = BRW_NEW_BATCH, + .cache = CACHE_NEW_SF_UNIT + }, + .prepare = prepare_scissor_state_pointers, + .emit = upload_scissor_state_pointers, +}; diff --git a/src/mesa/drivers/dri/i965/gen6_sf_state.c b/src/mesa/drivers/dri/i965/gen6_sf_state.c new file mode 100644 index 00000000000..8d96b44f1dc --- /dev/null +++ b/src/mesa/drivers/dri/i965/gen6_sf_state.c @@ -0,0 +1,187 @@ +/* + * Copyright © 2009 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 <[email protected]> + * + */ + +#include "brw_context.h" +#include "brw_state.h" +#include "brw_defines.h" +#include "brw_util.h" +#include "main/macros.h" +#include "intel_batchbuffer.h" + +static uint32_t +get_attr_override(struct brw_context *brw, int attr) +{ + uint32_t attr_override; + int attr_index = 0, i; + + /* Find the source index (0 = first attribute after the 4D position) + * for this output attribute. attr is currently a VERT_RESULT_* but should + * be FRAG_ATTRIB_*. + */ + for (i = 0; i < attr; i++) { + if (brw->vs.prog_data->outputs_written & BITFIELD64_BIT(i)) + attr_index++; + } + attr_override = attr_index; + + return attr_index; +} + +static void +upload_sf_state(struct brw_context *brw) +{ + struct intel_context *intel = &brw->intel; + GLcontext *ctx = &intel->ctx; + /* CACHE_NEW_VS_PROG */ + uint32_t num_inputs = brw_count_bits(brw->vs.prog_data->outputs_written); + /* This should probably be FS inputs read */ + uint32_t num_outputs = brw_count_bits(brw->vs.prog_data->outputs_written); + uint32_t dw1, dw2, dw3, dw4; + int i; + /* _NEW_BUFFER */ + GLboolean render_to_fbo = brw->intel.ctx.DrawBuffer->Name != 0; + int attr = 0; + + dw1 = + num_outputs << GEN6_SF_NUM_OUTPUTS_SHIFT | + (num_inputs + 1) / 2 << GEN6_SF_URB_ENTRY_READ_LENGTH_SHIFT | + 3 << GEN6_SF_URB_ENTRY_READ_OFFSET_SHIFT; + dw2 = GEN6_SF_VIEWPORT_TRANSFORM_ENABLE | + GEN6_SF_STATISTICS_ENABLE; + dw3 = 0; + dw4 = 0; + + /* _NEW_POLYGON */ + if ((ctx->Polygon.FrontFace == GL_CCW) ^ render_to_fbo) + dw2 |= GEN6_SF_WINDING_CCW; + + /* _NEW_SCISSOR */ + if (ctx->Scissor.Enabled) + dw3 |= GEN6_SF_SCISSOR_ENABLE; + + /* _NEW_POLYGON */ + if (ctx->Polygon.CullFlag) { + switch (ctx->Polygon.CullFaceMode) { + case GL_FRONT: + dw3 |= GEN6_SF_CULL_BOTH; + break; + case GL_BACK: + dw3 |= GEN6_SF_CULL_BACK; + break; + case GL_FRONT_AND_BACK: + dw3 |= GEN6_SF_CULL_BOTH; + break; + default: + assert(0); + break; + } + } else { + dw3 |= GEN6_SF_CULL_NONE; + } + + /* _NEW_LINE */ + dw3 |= U_FIXED(CLAMP(ctx->Line.Width, 0.0, 7.99), 7) << + GEN6_SF_LINE_WIDTH_SHIFT; + if (ctx->Line.SmoothFlag) { + dw3 |= GEN6_SF_LINE_AA_ENABLE; + dw3 |= GEN6_SF_LINE_AA_MODE_TRUE; + dw3 |= GEN6_SF_LINE_END_CAP_WIDTH_1_0; + } + + /* _NEW_POINT */ + if (ctx->Point._Attenuated) + dw4 |= GEN6_SF_USE_STATE_POINT_WIDTH; + + dw4 |= U_FIXED(CLAMP(ctx->Point.Size, 0.125, 225.875), 3) << + GEN6_SF_POINT_WIDTH_SHIFT; + if (render_to_fbo) + dw1 |= GEN6_SF_POINT_SPRITE_LOWERLEFT; + + /* _NEW_LIGHT */ + if (ctx->Light.ProvokingVertex != GL_FIRST_VERTEX_CONVENTION) { + dw4 |= + (2 << GEN6_SF_TRI_PROVOKE_SHIFT) | + (2 << GEN6_SF_TRIFAN_PROVOKE_SHIFT) | + (1 << GEN6_SF_LINE_PROVOKE_SHIFT); + } else { + dw4 |= + (1 << GEN6_SF_TRIFAN_PROVOKE_SHIFT); + } + + BEGIN_BATCH(20); + OUT_BATCH(CMD_3D_SF_STATE << 16 | (20 - 2)); + OUT_BATCH(dw1); + OUT_BATCH(dw2); + OUT_BATCH(dw3); + OUT_BATCH(dw4); + OUT_BATCH_F(ctx->Polygon.OffsetUnits * 2); /* constant. copied from gen4 */ + OUT_BATCH_F(ctx->Polygon.OffsetFactor); /* scale */ + OUT_BATCH_F(0.0); /* XXX: global depth offset clamp */ + for (i = 0; i < 8; i++) { + uint32_t attr_overrides = 0; + + /* These should be generating FS inputs read instead of VS + * outputs written + */ + for (; attr < 64; attr++) { + if (brw->vs.prog_data->outputs_written & BITFIELD64_BIT(attr)) { + attr_overrides |= get_attr_override(brw, attr); + attr++; + break; + } + } + + for (; attr < 64; attr++) { + if (brw->vs.prog_data->outputs_written & BITFIELD64_BIT(attr)) { + attr_overrides |= get_attr_override(brw, attr) << 16; + attr++; + break; + } + } + OUT_BATCH(attr_overrides); + } + OUT_BATCH(0); /* point sprite texcoord bitmask */ + OUT_BATCH(0); /* constant interp bitmask */ + OUT_BATCH(0); /* wrapshortest enables 0-7 */ + OUT_BATCH(0); /* wrapshortest enables 8-15 */ + ADVANCE_BATCH(); + + intel_batchbuffer_emit_mi_flush(intel->batch); +} + +const struct brw_tracked_state gen6_sf_state = { + .dirty = { + .mesa = (_NEW_LIGHT | + _NEW_POLYGON | + _NEW_LINE | + _NEW_SCISSOR | + _NEW_BUFFERS), + .brw = BRW_NEW_CONTEXT, + .cache = CACHE_NEW_VS_PROG + }, + .emit = upload_sf_state, +}; diff --git a/src/mesa/drivers/dri/i965/gen6_urb.c b/src/mesa/drivers/dri/i965/gen6_urb.c new file mode 100644 index 00000000000..5445e4035a9 --- /dev/null +++ b/src/mesa/drivers/dri/i965/gen6_urb.c @@ -0,0 +1,83 @@ +/* + * Copyright © 2009 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 <[email protected]> + * + */ + +#include "main/macros.h" +#include "intel_batchbuffer.h" +#include "brw_context.h" +#include "brw_state.h" +#include "brw_defines.h" + +static void +prepare_urb( struct brw_context *brw ) +{ + brw->urb.nr_vs_entries = 24; + if (brw->gs.prog_bo) + brw->urb.nr_gs_entries = 4; + else + brw->urb.nr_gs_entries = 0; + /* CACHE_NEW_VS_PROG */ + brw->urb.vs_size = MIN2(brw->vs.prog_data->urb_entry_size, 1); + + /* Check that the number of URB rows (8 floats each) allocated is less + * than the URB space. + */ + assert((brw->urb.nr_vs_entries + + brw->urb.nr_gs_entries) * brw->urb.vs_size * 8 < 64 * 1024); +} + +static void +upload_urb(struct brw_context *brw) +{ + struct intel_context *intel = &brw->intel; + + assert(brw->urb.nr_vs_entries % 4 == 0); + assert(brw->urb.nr_gs_entries % 4 == 0); + /* GS requirement */ + assert(!brw->gs.prog_bo || brw->urb.vs_size < 5); + + intel_batchbuffer_emit_mi_flush(intel->batch); + + BEGIN_BATCH(3); + OUT_BATCH(CMD_URB << 16 | (3 - 2)); + OUT_BATCH(((brw->urb.vs_size - 1) << GEN6_URB_VS_SIZE_SHIFT) | + ((brw->urb.nr_vs_entries) << GEN6_URB_VS_ENTRIES_SHIFT)); + OUT_BATCH(((brw->urb.vs_size - 1) << GEN6_URB_GS_SIZE_SHIFT) | + ((brw->urb.nr_gs_entries) << GEN6_URB_GS_ENTRIES_SHIFT)); + ADVANCE_BATCH(); + + intel_batchbuffer_emit_mi_flush(intel->batch); +} + +const struct brw_tracked_state gen6_urb = { + .dirty = { + .mesa = 0, + .brw = BRW_NEW_CONTEXT, + .cache = CACHE_NEW_VS_PROG, + }, + .prepare = prepare_urb, + .emit = upload_urb, +}; diff --git a/src/mesa/drivers/dri/i965/gen6_viewport_state.c b/src/mesa/drivers/dri/i965/gen6_viewport_state.c new file mode 100644 index 00000000000..0c2aa4206c6 --- /dev/null +++ b/src/mesa/drivers/dri/i965/gen6_viewport_state.c @@ -0,0 +1,173 @@ +/* + * Copyright © 2009 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 <[email protected]> + * + */ + +#include "brw_context.h" +#include "brw_state.h" +#include "brw_defines.h" +#include "intel_batchbuffer.h" +#include "main/macros.h" + +/* The clip VP defines the guardband region where expensive clipping is skipped + * and fragments are allowed to be generated and clipped out cheaply by the SF. + * + * By setting it to NDC bounds of [-1,1], we don't do GB clipping. It's + * supposed to cause seams to become visible in apps due to shared edges taking + * different clip/no clip paths depending on whether the rest of the prim ends + * up in the guardband or not. + */ +static void +prepare_clip_vp(struct brw_context *brw) +{ + struct brw_clipper_viewport vp; + + vp.xmin = -1.0; + vp.xmax = 1.0; + vp.ymin = -1.0; + vp.ymax = 1.0; + + drm_intel_bo_unreference(brw->clip.vp_bo); + brw->clip.vp_bo = brw_cache_data(&brw->cache, BRW_CLIP_VP, + &vp, sizeof(vp), + NULL, 0); +} + +const struct brw_tracked_state gen6_clip_vp = { + .dirty = { + .mesa = _NEW_VIEWPORT, /* XXX: not really, but we need nonzero */ + .brw = 0, + .cache = 0, + }, + .prepare = prepare_clip_vp, +}; + +static void +prepare_sf_vp(struct brw_context *brw) +{ + GLcontext *ctx = &brw->intel.ctx; + const GLfloat depth_scale = 1.0F / ctx->DrawBuffer->_DepthMaxF; + struct brw_sf_viewport sfv; + GLfloat y_scale, y_bias; + const GLboolean render_to_fbo = (ctx->DrawBuffer->Name != 0); + const GLfloat *v = ctx->Viewport._WindowMap.m; + + memset(&sfv, 0, sizeof(sfv)); + + /* _NEW_BUFFERS */ + if (render_to_fbo) { + y_scale = 1.0; + y_bias = 0; + } else { + y_scale = -1.0; + y_bias = ctx->DrawBuffer->Height; + } + + /* _NEW_VIEWPORT */ + sfv.viewport.m00 = v[MAT_SX]; + sfv.viewport.m11 = v[MAT_SY] * y_scale; + sfv.viewport.m22 = v[MAT_SZ] * depth_scale; + sfv.viewport.m30 = v[MAT_TX]; + sfv.viewport.m31 = v[MAT_TY] * y_scale + y_bias; + sfv.viewport.m32 = v[MAT_TZ] * depth_scale; + + drm_intel_bo_unreference(brw->sf.vp_bo); + brw->sf.vp_bo = brw_cache_data(&brw->cache, BRW_SF_VP, + &sfv, sizeof(sfv), + NULL, 0); +} + +const struct brw_tracked_state gen6_sf_vp = { + .dirty = { + .mesa = _NEW_VIEWPORT | _NEW_BUFFERS, + .brw = 0, + .cache = 0, + }, + .prepare = prepare_sf_vp, +}; + +static void +prepare_cc_vp(struct brw_context *brw) +{ + GLcontext *ctx = &brw->intel.ctx; + struct brw_cc_viewport ccv; + + /* _NEW_TRANSOFORM */ + if (ctx->Transform.DepthClamp) { + /* _NEW_VIEWPORT */ + ccv.min_depth = MIN2(ctx->Viewport.Near, ctx->Viewport.Far); + ccv.max_depth = MAX2(ctx->Viewport.Near, ctx->Viewport.Far); + } else { + ccv.min_depth = 0.0; + ccv.max_depth = 1.0; + } + + drm_intel_bo_unreference(brw->cc.vp_bo); + brw->cc.vp_bo = brw_cache_data(&brw->cache, BRW_CC_VP, &ccv, sizeof(ccv), + NULL, 0); +} + +const struct brw_tracked_state gen6_cc_vp = { + .dirty = { + .mesa = _NEW_VIEWPORT | _NEW_TRANSFORM, + .brw = 0, + .cache = 0, + }, + .prepare = prepare_cc_vp, +}; + +static void prepare_viewport_state_pointers(struct brw_context *brw) +{ + brw_add_validated_bo(brw, brw->sf.state_bo); +} + +static void upload_viewport_state_pointers(struct brw_context *brw) +{ + struct intel_context *intel = &brw->intel; + + BEGIN_BATCH(4); + OUT_BATCH(CMD_VIEWPORT_STATE_POINTERS << 16 | (4 - 2) | + GEN6_CC_VIEWPORT_MODIFY | + GEN6_SF_VIEWPORT_MODIFY | + GEN6_CLIP_VIEWPORT_MODIFY); + OUT_RELOC(brw->clip.vp_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0); + OUT_RELOC(brw->sf.vp_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0); + OUT_RELOC(brw->cc.vp_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0); + ADVANCE_BATCH(); + + intel_batchbuffer_emit_mi_flush(intel->batch); +} + +const struct brw_tracked_state gen6_viewport_state = { + .dirty = { + .mesa = 0, + .brw = BRW_NEW_BATCH, + .cache = (CACHE_NEW_CLIP_VP | + CACHE_NEW_SF_VP | + CACHE_NEW_CC_VP) + }, + .prepare = prepare_viewport_state_pointers, + .emit = upload_viewport_state_pointers, +}; diff --git a/src/mesa/drivers/dri/i965/gen6_vs_state.c b/src/mesa/drivers/dri/i965/gen6_vs_state.c new file mode 100644 index 00000000000..fe597dfb945 --- /dev/null +++ b/src/mesa/drivers/dri/i965/gen6_vs_state.c @@ -0,0 +1,119 @@ +/* + * Copyright © 2009 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 <[email protected]> + * + */ + +#include "brw_context.h" +#include "brw_state.h" +#include "brw_defines.h" +#include "brw_util.h" +#include "shader/prog_parameter.h" +#include "shader/prog_statevars.h" +#include "intel_batchbuffer.h" + +static void +upload_vs_state(struct brw_context *brw) +{ + struct intel_context *intel = &brw->intel; + GLcontext *ctx = &intel->ctx; + const struct brw_vertex_program *vp = + brw_vertex_program_const(brw->vertex_program); + unsigned int nr_params = vp->program.Base.Parameters->NumParameters; + drm_intel_bo *constant_bo; + int i; + + if (vp->use_const_buffer || nr_params == 0) { + /* Disable the push constant buffers. */ + BEGIN_BATCH(5); + OUT_BATCH(CMD_3D_CONSTANT_VS_STATE << 16 | (5 - 2)); + OUT_BATCH(0); + OUT_BATCH(0); + OUT_BATCH(0); + OUT_BATCH(0); + ADVANCE_BATCH(); + } else { + if (brw->vertex_program->IsNVProgram) + _mesa_load_tracked_matrices(ctx); + + /* Updates the ParamaterValues[i] pointers for all parameters of the + * basic type of PROGRAM_STATE_VAR. + */ + _mesa_load_state_parameters(ctx, vp->program.Base.Parameters); + + constant_bo = drm_intel_bo_alloc(intel->bufmgr, "VS constant_bo", + nr_params * 4 * sizeof(float), + 4096); + drm_intel_gem_bo_map_gtt(constant_bo); + for (i = 0; i < nr_params; i++) { + memcpy((char *)constant_bo->virtual + i * 4 * sizeof(float), + vp->program.Base.Parameters->ParameterValues[i], + 4 * sizeof(float)); + } + drm_intel_gem_bo_unmap_gtt(constant_bo); + + BEGIN_BATCH(5); + OUT_BATCH(CMD_3D_CONSTANT_VS_STATE << 16 | + GEN6_CONSTANT_BUFFER_0_ENABLE | + (5 - 2)); + OUT_RELOC(constant_bo, + I915_GEM_DOMAIN_RENDER, 0, /* XXX: bad domain */ + ALIGN(nr_params, 2) / 2 - 1); + OUT_BATCH(0); + OUT_BATCH(0); + OUT_BATCH(0); + ADVANCE_BATCH(); + + drm_intel_bo_unreference(constant_bo); + } + + intel_batchbuffer_emit_mi_flush(intel->batch); + + BEGIN_BATCH(6); + OUT_BATCH(CMD_3D_VS_STATE << 16 | (6 - 2)); + OUT_RELOC(brw->vs.prog_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0); + OUT_BATCH((0 << GEN6_VS_SAMPLER_COUNT_SHIFT) | + (brw->vs.nr_surfaces << GEN6_VS_BINDING_TABLE_ENTRY_COUNT_SHIFT)); + OUT_BATCH(0); /* scratch space base offset */ + OUT_BATCH((1 << GEN6_VS_DISPATCH_START_GRF_SHIFT) | + (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); + ADVANCE_BATCH(); + + intel_batchbuffer_emit_mi_flush(intel->batch); +} + +const struct brw_tracked_state gen6_vs_state = { + .dirty = { + .mesa = _NEW_TRANSFORM | _NEW_PROGRAM_CONSTANTS, + .brw = (BRW_NEW_CURBE_OFFSETS | + BRW_NEW_NR_VS_SURFACES | + BRW_NEW_URB_FENCE | + BRW_NEW_CONTEXT), + .cache = CACHE_NEW_VS_PROG + }, + .emit = upload_vs_state, +}; diff --git a/src/mesa/drivers/dri/i965/gen6_wm_state.c b/src/mesa/drivers/dri/i965/gen6_wm_state.c new file mode 100644 index 00000000000..1eb17ca627d --- /dev/null +++ b/src/mesa/drivers/dri/i965/gen6_wm_state.c @@ -0,0 +1,160 @@ +/* + * Copyright © 2009 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 <[email protected]> + * + */ + +#include "brw_context.h" +#include "brw_state.h" +#include "brw_defines.h" +#include "brw_util.h" +#include "shader/prog_parameter.h" +#include "shader/prog_statevars.h" +#include "intel_batchbuffer.h" + +static void +upload_wm_state(struct brw_context *brw) +{ + struct intel_context *intel = &brw->intel; + GLcontext *ctx = &intel->ctx; + const struct brw_fragment_program *fp = + brw_fragment_program_const(brw->fragment_program); + unsigned int nr_params = fp->program.Base.Parameters->NumParameters; + drm_intel_bo *constant_bo; + int i; + uint32_t dw2, dw4, dw5, dw6; + + if (fp->use_const_buffer || nr_params == 0) { + /* Disable the push constant buffers. */ + BEGIN_BATCH(5); + OUT_BATCH(CMD_3D_CONSTANT_PS_STATE << 16 | (5 - 2)); + OUT_BATCH(0); + OUT_BATCH(0); + OUT_BATCH(0); + OUT_BATCH(0); + ADVANCE_BATCH(); + } else { + /* Updates the ParamaterValues[i] pointers for all parameters of the + * basic type of PROGRAM_STATE_VAR. + */ + _mesa_load_state_parameters(ctx, fp->program.Base.Parameters); + + constant_bo = drm_intel_bo_alloc(intel->bufmgr, "WM constant_bo", + nr_params * 4 * sizeof(float), + 4096); + drm_intel_gem_bo_map_gtt(constant_bo); + for (i = 0; i < nr_params; i++) { + memcpy((char *)constant_bo->virtual + i * 4 * sizeof(float), + fp->program.Base.Parameters->ParameterValues[i], + 4 * sizeof(float)); + } + drm_intel_gem_bo_unmap_gtt(constant_bo); + + BEGIN_BATCH(5); + OUT_BATCH(CMD_3D_CONSTANT_PS_STATE << 16 | + GEN6_CONSTANT_BUFFER_0_ENABLE | + (5 - 2)); + OUT_RELOC(constant_bo, + I915_GEM_DOMAIN_RENDER, 0, /* XXX: bad domain */ + ALIGN(nr_params, 2) / 2 - 1); + OUT_BATCH(0); + OUT_BATCH(0); + OUT_BATCH(0); + ADVANCE_BATCH(); + + drm_intel_bo_unreference(constant_bo); + } + + intel_batchbuffer_emit_mi_flush(intel->batch); + + dw2 = dw4 = dw5 = dw6 = 0; + dw4 |= GEN6_WM_STATISTICS_ENABLE; + dw5 |= GEN6_WM_LINE_AA_WIDTH_1_0; + dw5 |= GEN6_WM_LINE_END_CAP_AA_WIDTH_0_5; + + /* BRW_NEW_NR_SURFACES */ + dw2 |= brw->wm.nr_surfaces << GEN6_WM_BINDING_TABLE_ENTRY_COUNT_SHIFT; + + /* CACHE_NEW_SAMPLER */ + dw2 |= (ALIGN(brw->wm.sampler_count, 4) / 4) << GEN6_WM_SAMPLER_COUNT_SHIFT; + dw4 |= (1 << GEN6_WM_DISPATCH_START_GRF_SHIFT_0); + + dw5 |= (40 - 1) << GEN6_WM_MAX_THREADS_SHIFT; + dw5 |= GEN6_WM_DISPATCH_ENABLE; + + /* BRW_NEW_FRAGMENT_PROGRAM */ + if (fp->isGLSL) + dw5 |= GEN6_WM_8_DISPATCH_ENABLE; + else + dw5 |= GEN6_WM_16_DISPATCH_ENABLE; + + /* _NEW_LINE */ + if (ctx->Line.StippleFlag) + dw5 |= GEN6_WM_LINE_STIPPLE_ENABLE; + + /* _NEW_POLYGONSTIPPLE */ + if (ctx->Polygon.StippleFlag) + dw5 |= GEN6_WM_POLYGON_STIPPLE_ENABLE; + + /* BRW_NEW_FRAGMENT_PROGRAM */ + if (fp->program.Base.InputsRead & (1 << FRAG_ATTRIB_WPOS)) + dw5 |= GEN6_WM_USES_SOURCE_DEPTH | GEN6_WM_USES_SOURCE_W; + if (fp->program.Base.OutputsWritten & BITFIELD64_BIT(FRAG_RESULT_DEPTH)) + dw5 |= GEN6_WM_COMPUTED_DEPTH; + + /* _NEW_COLOR */ + if (fp->program.UsesKill || ctx->Color.AlphaEnabled) + dw5 |= GEN6_WM_KILL_ENABLE; + + /* This should probably be FS inputs read */ + dw6 |= brw_count_bits(brw->vs.prog_data->outputs_written) << + GEN6_WM_NUM_SF_OUTPUTS_SHIFT; + + BEGIN_BATCH(9); + OUT_BATCH(CMD_3D_WM_STATE << 16 | (9 - 2)); + OUT_RELOC(brw->wm.prog_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0); + OUT_BATCH(dw2); + OUT_BATCH(0); /* scratch space base offset */ + OUT_BATCH(dw4); + OUT_BATCH(dw5); + OUT_BATCH(dw6); + OUT_BATCH(0); /* kernel 1 pointer */ + OUT_BATCH(0); /* kernel 2 pointer */ + ADVANCE_BATCH(); + + intel_batchbuffer_emit_mi_flush(intel->batch); +} + +const struct brw_tracked_state gen6_wm_state = { + .dirty = { + .mesa = _NEW_LINE | _NEW_POLYGONSTIPPLE | _NEW_COLOR, + .brw = (BRW_NEW_CURBE_OFFSETS | + BRW_NEW_FRAGMENT_PROGRAM | + BRW_NEW_NR_WM_SURFACES | + BRW_NEW_URB_FENCE | + BRW_NEW_BATCH), + .cache = CACHE_NEW_SAMPLER + }, + .emit = upload_wm_state, +}; 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 effdd26448a..00000000000 --- 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_batchbuffer.c b/src/mesa/drivers/dri/intel/intel_batchbuffer.c index 4c99dcde23f..9768b0deee7 100644 --- a/src/mesa/drivers/dri/intel/intel_batchbuffer.c +++ b/src/mesa/drivers/dri/intel/intel_batchbuffer.c @@ -104,7 +104,8 @@ do_flush_locked(struct intel_batchbuffer *batch, GLuint used) batch->map = NULL; batch->ptr = NULL; - dri_bo_exec(batch->buf, used, NULL, 0, (x_off & 0xffff) | (y_off << 16)); + if (!intel->no_hw) + dri_bo_exec(batch->buf, used, NULL, 0, (x_off & 0xffff) | (y_off << 16)); if (INTEL_DEBUG & DEBUG_BATCH) { dri_bo_map(batch->buf, GL_FALSE); @@ -209,6 +210,8 @@ intel_batchbuffer_emit_reloc(struct intel_batchbuffer *batch, { int ret; + assert(delta < buffer->size); + if (batch->ptr - batch->map > batch->buf->size) printf ("bad relocation ptr %p map %p offset %d size %lu\n", batch->ptr, batch->map, batch->ptr - batch->map, batch->buf->size); @@ -225,6 +228,33 @@ intel_batchbuffer_emit_reloc(struct intel_batchbuffer *batch, return GL_TRUE; } +GLboolean +intel_batchbuffer_emit_reloc_fenced(struct intel_batchbuffer *batch, + drm_intel_bo *buffer, + uint32_t read_domains, uint32_t write_domain, + uint32_t delta) +{ + int ret; + + assert(delta < buffer->size); + + if (batch->ptr - batch->map > batch->buf->size) + printf ("bad relocation ptr %p map %p offset %d size %lu\n", + batch->ptr, batch->map, batch->ptr - batch->map, batch->buf->size); + ret = drm_intel_bo_emit_reloc_fence(batch->buf, batch->ptr - batch->map, + buffer, delta, + read_domains, write_domain); + + /* + * Using the old buffer offset, write in what the right data would + * be, in case the buffer doesn't move and we can short-circuit the + * relocation processing in the kernel + */ + intel_batchbuffer_emit_dword (batch, buffer->offset + delta); + + return GL_TRUE; +} + void intel_batchbuffer_data(struct intel_batchbuffer *batch, const void *data, GLuint bytes) diff --git a/src/mesa/drivers/dri/intel/intel_batchbuffer.h b/src/mesa/drivers/dri/intel/intel_batchbuffer.h index b052b724d84..e5ad2617ab9 100644 --- a/src/mesa/drivers/dri/intel/intel_batchbuffer.h +++ b/src/mesa/drivers/dri/intel/intel_batchbuffer.h @@ -24,11 +24,13 @@ struct intel_batchbuffer GLuint size; +#ifdef DEBUG /** Tracking of BEGIN_BATCH()/OUT_BATCH()/ADVANCE_BATCH() debugging */ struct { GLuint total; GLubyte *start_ptr; } emit; +#endif GLuint dirty_state; GLuint reserved_space; @@ -64,8 +66,24 @@ GLboolean intel_batchbuffer_emit_reloc(struct intel_batchbuffer *batch, uint32_t read_domains, uint32_t write_domain, uint32_t offset); +GLboolean intel_batchbuffer_emit_reloc_fenced(struct intel_batchbuffer *batch, + drm_intel_bo *buffer, + uint32_t read_domains, + uint32_t write_domain, + uint32_t offset); void intel_batchbuffer_emit_mi_flush(struct intel_batchbuffer *batch); +static INLINE uint32_t float_as_int(float f) +{ + union { + float f; + uint32_t d; + } fi; + + fi.f = f; + return fi.d; +} + /* Inline functions - might actually be better off with these * non-inlined. Certainly better off switching all command packets to * be passed as structs rather than dwords, but that's a little bit of @@ -81,49 +99,73 @@ intel_batchbuffer_space(struct intel_batchbuffer *batch) static INLINE void intel_batchbuffer_emit_dword(struct intel_batchbuffer *batch, GLuint dword) { - assert(batch->map); +#ifdef DEBUG assert(intel_batchbuffer_space(batch) >= 4); +#endif *(GLuint *) (batch->ptr) = dword; batch->ptr += 4; } static INLINE void +intel_batchbuffer_emit_float(struct intel_batchbuffer *batch, float f) +{ + intel_batchbuffer_emit_dword(batch, float_as_int(f)); +} + +static INLINE void intel_batchbuffer_require_space(struct intel_batchbuffer *batch, GLuint sz) { +#ifdef DEBUG assert(sz < batch->size - 8); +#endif if (intel_batchbuffer_space(batch) < sz) intel_batchbuffer_flush(batch); } +static INLINE void +intel_batchbuffer_begin(struct intel_batchbuffer *batch, int n) +{ + intel_batchbuffer_require_space(batch, n * 4); +#ifdef DEBUG + assert(batch->map); + assert(batch->emit.start_ptr == NULL); + batch->emit.total = n * 4; + batch->emit.start_ptr = batch->ptr; +#endif +} + +static INLINE void +intel_batchbuffer_advance(struct intel_batchbuffer *batch) +{ +#ifdef DEBUG + unsigned int _n = batch->ptr - batch->emit.start_ptr; + assert(batch->emit.start_ptr != NULL); + if (_n != batch->emit.total) { + fprintf(stderr, "ADVANCE_BATCH: %d of %d dwords emitted\n", + _n, batch->emit.total); + abort(); + } + batch->emit.start_ptr = NULL; +#endif +} + /* Here are the crusty old macros, to be removed: */ #define BATCH_LOCALS -#define BEGIN_BATCH(n) do { \ - intel_batchbuffer_require_space(intel->batch, (n)*4); \ - assert(intel->batch->emit.start_ptr == NULL); \ - intel->batch->emit.total = (n) * 4; \ - intel->batch->emit.start_ptr = intel->batch->ptr; \ -} while (0) - +#define BEGIN_BATCH(n) intel_batchbuffer_begin(intel->batch, n) #define OUT_BATCH(d) intel_batchbuffer_emit_dword(intel->batch, d) - +#define OUT_BATCH_F(f) intel_batchbuffer_emit_float(intel->batch,f) #define OUT_RELOC(buf, read_domains, write_domain, delta) do { \ - assert((unsigned) (delta) < buf->size); \ intel_batchbuffer_emit_reloc(intel->batch, buf, \ read_domains, write_domain, delta); \ } while (0) +#define OUT_RELOC_FENCED(buf, read_domains, write_domain, delta) do { \ + intel_batchbuffer_emit_reloc_fenced(intel->batch, buf, \ + read_domains, write_domain, delta); \ +} while (0) -#define ADVANCE_BATCH() do { \ - unsigned int _n = intel->batch->ptr - intel->batch->emit.start_ptr; \ - assert(intel->batch->emit.start_ptr != NULL); \ - if (_n != intel->batch->emit.total) { \ - fprintf(stderr, "ADVANCE_BATCH: %d of %d dwords emitted\n", \ - _n, intel->batch->emit.total); \ - abort(); \ - } \ - intel->batch->emit.start_ptr = NULL; \ -} while(0) +#define ADVANCE_BATCH() intel_batchbuffer_advance(intel->batch); #endif diff --git a/src/mesa/drivers/dri/intel/intel_blit.c b/src/mesa/drivers/dri/intel/intel_blit.c index 5a60a17500e..f2769aa3e8c 100644 --- a/src/mesa/drivers/dri/intel/intel_blit.c +++ b/src/mesa/drivers/dri/intel/intel_blit.c @@ -89,6 +89,10 @@ intelEmitCopyBlit(struct intel_context *intel, dri_bo *aper_array[3]; BATCH_LOCALS; + /* Blits are in a different ringbuffer so we don't use them. */ + if (intel->gen >= 6) + return GL_FALSE; + if (dst_tiling != I915_TILING_NONE) { if (dst_offset & 4095) return GL_FALSE; @@ -118,21 +122,20 @@ intelEmitCopyBlit(struct intel_context *intel, intel_prepare_render(intel); if (pass >= 2) { - dri_bo_map(dst_buffer, GL_TRUE); - dri_bo_map(src_buffer, GL_FALSE); - _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); - - dri_bo_unmap(src_buffer); - dri_bo_unmap(dst_buffer); - - return GL_TRUE; + 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; } intel_batchbuffer_require_space(intel->batch, 8 * 4); @@ -185,14 +188,14 @@ intelEmitCopyBlit(struct intel_context *intel, OUT_BATCH(BR13 | (uint16_t)dst_pitch); OUT_BATCH((dst_y << 16) | dst_x); OUT_BATCH((dst_y2 << 16) | dst_x2); - OUT_RELOC(dst_buffer, - I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER, - dst_offset); + OUT_RELOC_FENCED(dst_buffer, + I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER, + dst_offset); OUT_BATCH((src_y << 16) | src_x); OUT_BATCH((uint16_t)src_pitch); - OUT_RELOC(src_buffer, - I915_GEM_DOMAIN_RENDER, 0, - src_offset); + OUT_RELOC_FENCED(src_buffer, + I915_GEM_DOMAIN_RENDER, 0, + src_offset); ADVANCE_BATCH(); intel_batchbuffer_emit_mi_flush(intel->batch); @@ -218,6 +221,9 @@ intelClearWithBlit(GLcontext *ctx, GLbitfield mask) GLint cx, cy, cw, ch; BATCH_LOCALS; + /* Blits are in a different ringbuffer so we don't use them. */ + assert(intel->gen < 6); + /* * Compute values for clearing the buffers. */ @@ -359,9 +365,9 @@ intelClearWithBlit(GLcontext *ctx, GLbitfield mask) OUT_BATCH(BR13); OUT_BATCH((y1 << 16) | x1); OUT_BATCH((y2 << 16) | x2); - OUT_RELOC(write_buffer, - I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER, - 0); + OUT_RELOC_FENCED(write_buffer, + I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER, + 0); OUT_BATCH(clear_val); ADVANCE_BATCH(); @@ -388,6 +394,10 @@ intelEmitImmediateColorExpandBlit(struct intel_context *intel, int dwords = ALIGN(src_size, 8) / 4; uint32_t opcode, br13, blit_cmd; + /* Blits are in a different ringbuffer so we don't use them. */ + if (intel->gen >= 6) + return GL_FALSE; + if (dst_tiling != I915_TILING_NONE) { if (dst_offset & 4095) return GL_FALSE; @@ -438,9 +448,9 @@ intelEmitImmediateColorExpandBlit(struct intel_context *intel, OUT_BATCH(br13); OUT_BATCH((0 << 16) | 0); /* clip x1, y1 */ OUT_BATCH((100 << 16) | 100); /* clip x2, y2 */ - OUT_RELOC(dst_buffer, - I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER, - dst_offset); + OUT_RELOC_FENCED(dst_buffer, + I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER, + dst_offset); OUT_BATCH(0); /* bg */ OUT_BATCH(fg_color); /* fg */ OUT_BATCH(0); /* pattern base addr */ @@ -473,6 +483,9 @@ intel_emit_linear_blit(struct intel_context *intel, { GLuint pitch, height; + /* Blits are in a different ringbuffer so we don't use them. */ + assert(intel->gen < 6); + /* The pitch is a signed value. */ pitch = MIN2(size, (1 << 15) - 1); height = size / pitch; diff --git a/src/mesa/drivers/dri/intel/intel_buffer_objects.c b/src/mesa/drivers/dri/intel/intel_buffer_objects.c index 312866d865d..103aaf2b956 100644 --- a/src/mesa/drivers/dri/intel/intel_buffer_objects.c +++ b/src/mesa/drivers/dri/intel/intel_buffer_objects.c @@ -31,10 +31,12 @@ #include "main/macros.h" #include "main/bufferobj.h" -#include "intel_context.h" #include "intel_blit.h" #include "intel_buffer_objects.h" #include "intel_batchbuffer.h" +#include "intel_context.h" +#include "intel_fbo.h" +#include "intel_mipmap_tree.h" #include "intel_regions.h" static GLboolean @@ -285,7 +287,7 @@ intel_bufferobj_map(GLcontext * ctx, return NULL; } - if (write_only && intel->intelScreen->kernel_exec_fencing) { + if (write_only) { drm_intel_gem_bo_map_gtt(intel_obj->buffer); intel_obj->mapped_gtt = GL_TRUE; } else { @@ -379,8 +381,7 @@ intel_bufferobj_map_range(GLcontext * ctx, intel_obj->range_map_bo = drm_intel_bo_alloc(intel->bufmgr, "range map", length, 64); - if (!(access & GL_MAP_READ_BIT) && - intel->intelScreen->kernel_exec_fencing) { + if (!(access & GL_MAP_READ_BIT)) { drm_intel_gem_bo_map_gtt(intel_obj->range_map_bo); intel_obj->mapped_gtt = GL_TRUE; } else { @@ -393,8 +394,7 @@ intel_bufferobj_map_range(GLcontext * ctx, return obj->Pointer; } - if (!(access & GL_MAP_READ_BIT) && - intel->intelScreen->kernel_exec_fencing) { + if (!(access & GL_MAP_READ_BIT)) { drm_intel_gem_bo_map_gtt(intel_obj->buffer); intel_obj->mapped_gtt = GL_TRUE; } else { @@ -588,6 +588,126 @@ intel_bufferobj_copy_subdata(GLcontext *ctx, intel_batchbuffer_emit_mi_flush(intel->batch); } +#if FEATURE_APPLE_object_purgeable +static GLenum +intel_buffer_purgeable(GLcontext * ctx, + drm_intel_bo *buffer, + GLenum option) +{ + int retained = 0; + + if (buffer != NULL) + retained = drm_intel_bo_madvise (buffer, I915_MADV_DONTNEED); + + return retained ? GL_VOLATILE_APPLE : GL_RELEASED_APPLE; +} + +static GLenum +intel_buffer_object_purgeable(GLcontext * ctx, + struct gl_buffer_object *obj, + GLenum option) +{ + struct intel_buffer_object *intel; + + intel = intel_buffer_object (obj); + if (intel->buffer != NULL) + return intel_buffer_purgeable (ctx, intel->buffer, option); + + if (option == GL_RELEASED_APPLE) { + if (intel->sys_buffer != NULL) { + free(intel->sys_buffer); + intel->sys_buffer = NULL; + } + + return GL_RELEASED_APPLE; + } else { + /* XXX Create the buffer and madvise(MADV_DONTNEED)? */ + return intel_buffer_purgeable (ctx, + intel_bufferobj_buffer(intel_context(ctx), + intel, INTEL_READ), + option); + } +} + +static GLenum +intel_texture_object_purgeable(GLcontext * ctx, + struct gl_texture_object *obj, + GLenum option) +{ + struct intel_texture_object *intel; + + intel = intel_texture_object(obj); + if (intel->mt == NULL || intel->mt->region == NULL) + return GL_RELEASED_APPLE; + + return intel_buffer_purgeable (ctx, intel->mt->region->buffer, option); +} + +static GLenum +intel_render_object_purgeable(GLcontext * ctx, + struct gl_renderbuffer *obj, + GLenum option) +{ + struct intel_renderbuffer *intel; + + intel = intel_renderbuffer(obj); + if (intel->region == NULL) + return GL_RELEASED_APPLE; + + return intel_buffer_purgeable (ctx, intel->region->buffer, option); +} + +static GLenum +intel_buffer_unpurgeable(GLcontext * ctx, + drm_intel_bo *buffer, + GLenum option) +{ + int retained; + + retained = 0; + if (buffer != NULL) + retained = drm_intel_bo_madvise (buffer, I915_MADV_WILLNEED); + + return retained ? GL_RETAINED_APPLE : GL_UNDEFINED_APPLE; +} + +static GLenum +intel_buffer_object_unpurgeable(GLcontext * ctx, + struct gl_buffer_object *obj, + GLenum option) +{ + return intel_buffer_unpurgeable (ctx, intel_buffer_object (obj)->buffer, option); +} + +static GLenum +intel_texture_object_unpurgeable(GLcontext * ctx, + struct gl_texture_object *obj, + GLenum option) +{ + struct intel_texture_object *intel; + + intel = intel_texture_object(obj); + if (intel->mt == NULL || intel->mt->region == NULL) + return GL_UNDEFINED_APPLE; + + return intel_buffer_unpurgeable (ctx, intel->mt->region->buffer, option); +} + +static GLenum +intel_render_object_unpurgeable(GLcontext * ctx, + struct gl_renderbuffer *obj, + GLenum option) +{ + struct intel_renderbuffer *intel; + + intel = intel_renderbuffer(obj); + if (intel->region == NULL) + return GL_UNDEFINED_APPLE; + + return intel_buffer_unpurgeable (ctx, intel->region->buffer, option); +} +#endif + void intelInitBufferObjectFuncs(struct dd_function_table *functions) { @@ -601,4 +721,14 @@ intelInitBufferObjectFuncs(struct dd_function_table *functions) functions->FlushMappedBufferRange = intel_bufferobj_flush_mapped_range; functions->UnmapBuffer = intel_bufferobj_unmap; functions->CopyBufferSubData = intel_bufferobj_copy_subdata; + +#if FEATURE_APPLE_object_purgeable + functions->BufferObjectPurgeable = intel_buffer_object_purgeable; + functions->TextureObjectPurgeable = intel_texture_object_purgeable; + functions->RenderObjectPurgeable = intel_render_object_purgeable; + + functions->BufferObjectUnpurgeable = intel_buffer_object_unpurgeable; + functions->TextureObjectUnpurgeable = intel_texture_object_unpurgeable; + functions->RenderObjectUnpurgeable = intel_render_object_unpurgeable; +#endif } diff --git a/src/mesa/drivers/dri/intel/intel_chipset.h b/src/mesa/drivers/dri/intel/intel_chipset.h index 3dc8653a735..a0b22669253 100644 --- a/src/mesa/drivers/dri/intel/intel_chipset.h +++ b/src/mesa/drivers/dri/intel/intel_chipset.h @@ -1,4 +1,4 @@ -/* + /* * Copyright © 2007 Intel Corporation * * Permission is hereby granted, free of charge, to any person obtaining a @@ -71,6 +71,8 @@ #define PCI_CHIP_ILD_G 0x0042 #define PCI_CHIP_ILM_G 0x0046 +#define PCI_CHIP_SANDYBRIDGE 0x0102 + #define IS_MOBILE(devid) (devid == PCI_CHIP_I855_GM || \ devid == PCI_CHIP_I915_GM || \ devid == PCI_CHIP_I945_GM || \ @@ -104,14 +106,20 @@ devid == PCI_CHIP_Q33_G || \ devid == PCI_CHIP_Q35_G || IS_IGD(devid)) -#define IS_965(devid) (devid == PCI_CHIP_I965_G || \ +#define IS_GEN4(devid) (devid == PCI_CHIP_I965_G || \ devid == PCI_CHIP_I965_Q || \ devid == PCI_CHIP_I965_G_1 || \ devid == PCI_CHIP_I965_GM || \ devid == PCI_CHIP_I965_GME || \ devid == PCI_CHIP_I946_GZ || \ + IS_G4X(devid)) + +#define IS_GEN6(devid) (devid == PCI_CHIP_SANDYBRIDGE) + +#define IS_965(devid) (IS_GEN4(devid) || \ IS_G4X(devid) || \ - IS_IGDNG(devid)) + IS_IGDNG(devid) || \ + IS_GEN6(devid)) #define IS_9XX(devid) (IS_915(devid) || \ IS_945(devid) || \ diff --git a/src/mesa/drivers/dri/intel/intel_clear.c b/src/mesa/drivers/dri/intel/intel_clear.c index ca78681538c..03b24e2b51f 100644 --- a/src/mesa/drivers/dri/intel/intel_clear.c +++ b/src/mesa/drivers/dri/intel/intel_clear.c @@ -133,6 +133,12 @@ intelClear(GLcontext *ctx, GLbitfield mask) } } + if (intel->gen >= 6) { + /* Blits are in a different ringbuffer so we don't use them. */ + tri_mask |= blit_mask; + blit_mask = 0; + } + /* SW fallback clearing */ swrast_mask = mask & ~tri_mask & ~blit_mask; diff --git a/src/mesa/drivers/dri/intel/intel_context.c b/src/mesa/drivers/dri/intel/intel_context.c index 3c36c3f4c8f..d6a1ba69524 100644 --- a/src/mesa/drivers/dri/intel/intel_context.c +++ b/src/mesa/drivers/dri/intel/intel_context.c @@ -610,7 +610,11 @@ intelInitContext(struct intel_context *intel, intel->driContext = driContextPriv; intel->driFd = sPriv->fd; - if (IS_965(intel->intelScreen->deviceID)) { + if (IS_GEN6(intel->intelScreen->deviceID)) { + intel->gen = 6; + intel->needs_ff_sync = GL_TRUE; + intel->has_luminance_srgb = GL_TRUE; + } else if (IS_965(intel->intelScreen->deviceID)) { intel->gen = 4; } else if (IS_9XX(intel->intelScreen->deviceID)) { intel->gen = 3; @@ -751,12 +755,6 @@ intelInitContext(struct intel_context *intel, } intel->use_texture_tiling = driQueryOptionb(&intel->optionCache, "texture_tiling"); - if (intel->use_texture_tiling && - !intel->intelScreen->kernel_exec_fencing) { - fprintf(stderr, "No kernel support for execution fencing, " - "disabling texture tiling\n"); - intel->use_texture_tiling = GL_FALSE; - } intel->use_early_z = driQueryOptionb(&intel->optionCache, "early_z"); intel->prim.primitive = ~0; @@ -887,6 +885,7 @@ intelMakeCurrent(__DRIcontext * driContextPriv, intel->driDrawable = driDrawPriv; driContextPriv->dri2.draw_stamp = driDrawPriv->dri2.stamp - 1; driContextPriv->dri2.read_stamp = driReadPriv->dri2.stamp - 1; + intel_prepare_render(intel); } else { _mesa_make_current(NULL, NULL, NULL); diff --git a/src/mesa/drivers/dri/intel/intel_context.h b/src/mesa/drivers/dri/intel/intel_context.h index d20d44497e1..22736a93279 100644 --- a/src/mesa/drivers/dri/intel/intel_context.h +++ b/src/mesa/drivers/dri/intel/intel_context.h @@ -475,25 +475,4 @@ is_power_of_two(uint32_t value) return (value & (value - 1)) == 0; } -static INLINE void -intel_bo_map_gtt_preferred(struct intel_context *intel, - drm_intel_bo *bo, - GLboolean write) -{ - if (intel->intelScreen->kernel_exec_fencing) - drm_intel_gem_bo_map_gtt(bo); - else - drm_intel_bo_map(bo, write); -} - -static INLINE void -intel_bo_unmap_gtt_preferred(struct intel_context *intel, - drm_intel_bo *bo) -{ - if (intel->intelScreen->kernel_exec_fencing) - drm_intel_gem_bo_unmap_gtt(bo); - else - drm_intel_bo_unmap(bo); -} - #endif diff --git a/src/mesa/drivers/dri/intel/intel_decode.c b/src/mesa/drivers/dri/intel/intel_decode.c index a9dfe281cbd..5293482b35a 100644 --- a/src/mesa/drivers/dri/intel/intel_decode.c +++ b/src/mesa/drivers/dri/intel/intel_decode.c @@ -1437,6 +1437,12 @@ decode_3d_965(uint32_t *data, int count, uint32_t hw_offset, int *failures) { 0x7909, 2, 2, "3DSTATE_GLOBAL_DEPTH_OFFSET_CLAMP" }, { 0x790a, 3, 3, "3DSTATE_AA_LINE_PARAMETERS" }, { 0x7b00, 6, 6, "3DPRIMITIVE" }, + { 0x780e, 4, 4, "3DSTATE_CC_STATE_POINTERS" }, + { 0x7810, 6, 6, "3DSTATE_VS_STATE" }, + { 0x7811, 6, 6, "3DSTATE_GS_STATE" }, + { 0x7812, 4, 4, "3DSTATE_CLIP_STATE" }, + { 0x7815, 5, 5, "3DSTATE_CONSTANT_VS_STATE" }, + { 0x7816, 5, 5, "3DSTATE_CONSTANT_GS_STATE" }, }; len = (data[0] & 0x0000ffff) + 2; @@ -1592,7 +1598,7 @@ decode_3d_965(uint32_t *data, int count, uint32_t hw_offset, int *failures) return len; case 0x7905: - if (len != 5 && len != 6) + if (len < 5 || len > 7) fprintf(out, "Bad count in 3DSTATE_DEPTH_BUFFER\n"); if (count < len) BUFFER_FAIL(count, len, "3DSTATE_DEPTH_BUFFER"); @@ -1611,6 +1617,8 @@ decode_3d_965(uint32_t *data, int count, uint32_t hw_offset, int *failures) instr_out(data, hw_offset, 4, "volume depth\n"); if (len == 6) instr_out(data, hw_offset, 5, "\n"); + if (len == 7) + instr_out(data, hw_offset, 6, "render target view extent\n"); return len; diff --git a/src/mesa/drivers/dri/intel/intel_depthtmp.h b/src/mesa/drivers/dri/intel/intel_depthtmp.h deleted file mode 100644 index a9c75d44cf3..00000000000 --- a/src/mesa/drivers/dri/intel/intel_depthtmp.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright © 2009 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 <[email protected]> - * - */ - -/** - * Wrapper around the depthtmp.h macrofest to generate spans code for - * all the tiling styles. - */ - -#define VALUE_TYPE INTEL_VALUE_TYPE -#define WRITE_DEPTH(_x, _y, d) \ - (*(INTEL_VALUE_TYPE *)(irb->region->buffer->virtual + \ - NO_TILE(_x, _y)) = d) -#define READ_DEPTH(d, _x, _y) \ - d = *(INTEL_VALUE_TYPE *)(irb->region->buffer->virtual + \ - NO_TILE(_x, _y)) -#define TAG(x) INTEL_TAG(intel_gttmap_##x) -#include "depthtmp.h" - -#define VALUE_TYPE INTEL_VALUE_TYPE -#define WRITE_DEPTH(_x, _y, d) INTEL_WRITE_DEPTH(NO_TILE(_x, _y), d) -#define READ_DEPTH(d, _x, _y) d = INTEL_READ_DEPTH(NO_TILE(_x, _y)) -#define TAG(x) INTEL_TAG(intel##x) -#include "depthtmp.h" - -#define VALUE_TYPE INTEL_VALUE_TYPE -#define WRITE_DEPTH(_x, _y, d) INTEL_WRITE_DEPTH(X_TILE(_x, _y), d) -#define READ_DEPTH(d, _x, _y) d = INTEL_READ_DEPTH(X_TILE(_x, _y)) -#define TAG(x) INTEL_TAG(intel_XTile_##x) -#include "depthtmp.h" - -#define VALUE_TYPE INTEL_VALUE_TYPE -#define WRITE_DEPTH(_x, _y, d) INTEL_WRITE_DEPTH(Y_TILE(_x, _y), d) -#define READ_DEPTH(d, _x, _y) d = INTEL_READ_DEPTH(Y_TILE(_x, _y)) -#define TAG(x) INTEL_TAG(intel_YTile_##x) -#include "depthtmp.h" - -#undef INTEL_VALUE_TYPE -#undef INTEL_WRITE_DEPTH -#undef INTEL_READ_DEPTH -#undef INTEL_TAG diff --git a/src/mesa/drivers/dri/intel/intel_extensions.c b/src/mesa/drivers/dri/intel/intel_extensions.c index 84c8d013e30..a1aac699c91 100644 --- a/src/mesa/drivers/dri/intel/intel_extensions.c +++ b/src/mesa/drivers/dri/intel/intel_extensions.c @@ -58,6 +58,7 @@ #define need_GL_EXT_secondary_color #define need_GL_EXT_stencil_two_side #define need_GL_APPLE_vertex_array_object +#define need_GL_APPLE_object_purgeable #define need_GL_ATI_separate_stencil #define need_GL_ATI_envmap_bumpmap #define need_GL_NV_point_sprite @@ -121,6 +122,7 @@ static const struct dri_extension card_extensions[] = { { "GL_EXT_texture_lod_bias", NULL }, { "GL_3DFX_texture_compression_FXT1", NULL }, { "GL_APPLE_client_storage", NULL }, + { "GL_APPLE_object_purgeable", GL_APPLE_object_purgeable_functions }, { "GL_APPLE_vertex_array_object", GL_APPLE_vertex_array_object_functions}, { "GL_MESA_pack_invert", NULL }, { "GL_MESA_ycbcr_texture", NULL }, @@ -151,6 +153,7 @@ static const struct dri_extension i915_extensions[] = { static const struct dri_extension brw_extensions[] = { { "GL_ARB_depth_clamp", NULL }, { "GL_ARB_depth_texture", NULL }, + { "GL_ARB_fragment_coord_conventions", NULL }, { "GL_ARB_fragment_program", NULL }, { "GL_ARB_fragment_program_shadow", NULL }, { "GL_ARB_fragment_shader", NULL }, @@ -181,6 +184,7 @@ static const struct dri_extension arb_oq_extensions[] = { { NULL, NULL } }; + static const struct dri_extension fragment_shader_extensions[] = { { "GL_ARB_fragment_shader", NULL }, { NULL, NULL } diff --git a/src/mesa/drivers/dri/intel/intel_fbo.c b/src/mesa/drivers/dri/intel/intel_fbo.c index e154bd4087b..a429f8d003d 100644 --- a/src/mesa/drivers/dri/intel/intel_fbo.c +++ b/src/mesa/drivers/dri/intel/intel_fbo.c @@ -70,9 +70,6 @@ intel_delete_renderbuffer(struct gl_renderbuffer *rb) ASSERT(irb); - if (irb->span_cache != NULL) - free(irb->span_cache); - if (intel && irb->region) { intel_region_release(&irb->region); } @@ -200,6 +197,38 @@ intel_alloc_renderbuffer_storage(GLcontext * ctx, struct gl_renderbuffer *rb, } +#if FEATURE_OES_EGL_image +static void +intel_image_target_renderbuffer_storage(GLcontext *ctx, + struct gl_renderbuffer *rb, + void *image_handle) +{ + struct intel_context *intel = intel_context(ctx); + struct intel_renderbuffer *irb; + __DRIscreen *screen; + __DRIimage *image; + + screen = intel->intelScreen->driScrnPriv; + image = screen->dri2.image->lookupEGLImage(intel->driContext, image_handle, + intel->driContext->loaderPrivate); + if (image == NULL) + return; + + irb = intel_renderbuffer(rb); + if (irb->region) + intel_region_release(&irb->region); + intel_region_reference(&irb->region, image->region); + + rb->InternalFormat = image->internal_format; + rb->Width = image->region->width; + rb->Height = image->region->height; + rb->Format = image->format; + rb->DataType = image->data_type; + rb->_BaseFormat = _mesa_base_fbo_format(&intel->ctx, + image->internal_format); +} +#endif + /** * Called for each hardware renderbuffer when a _window_ is resized. * Just update fields. @@ -651,4 +680,9 @@ intel_fbo_init(struct intel_context *intel) intel->ctx.Driver.ResizeBuffers = intel_resize_buffers; intel->ctx.Driver.ValidateFramebuffer = intel_validate_framebuffer; intel->ctx.Driver.BlitFramebuffer = _mesa_meta_BlitFramebuffer; + +#if FEATURE_OES_EGL_image + intel->ctx.Driver.EGLImageTargetRenderbufferStorage = + intel_image_target_renderbuffer_storage; +#endif } diff --git a/src/mesa/drivers/dri/intel/intel_fbo.h b/src/mesa/drivers/dri/intel/intel_fbo.h index 586dbbbb25a..72413f73694 100644 --- a/src/mesa/drivers/dri/intel/intel_fbo.h +++ b/src/mesa/drivers/dri/intel/intel_fbo.h @@ -40,9 +40,6 @@ struct intel_renderbuffer { struct gl_renderbuffer Base; struct intel_region *region; - - uint8_t *span_cache; - unsigned long span_cache_offset; }; diff --git a/src/mesa/drivers/dri/intel/intel_mipmap_tree.c b/src/mesa/drivers/dri/intel/intel_mipmap_tree.c index cb5a341050b..4f14946ec72 100644 --- a/src/mesa/drivers/dri/intel/intel_mipmap_tree.c +++ b/src/mesa/drivers/dri/intel/intel_mipmap_tree.c @@ -119,8 +119,7 @@ intel_miptree_create(struct intel_context *intel, struct intel_mipmap_tree *mt; uint32_t tiling; - if (intel->use_texture_tiling && compress_byte == 0 && - intel->intelScreen->kernel_exec_fencing) { + if (intel->use_texture_tiling && compress_byte == 0) { if (intel->gen >= 4 && (base_format == GL_DEPTH_COMPONENT || base_format == GL_DEPTH_STENCIL_EXT)) @@ -238,11 +237,11 @@ int intel_miptree_pitch_align (struct intel_context *intel, pitch = ALIGN(pitch * mt->cpp, pitch_align); #ifdef I915 - /* XXX: At least the i915 seems very upset when the pitch is a multiple - * of 1024 and sometimes 512 bytes - performance can drop by several - * times. Go to the next multiple of the required alignment for now. + /* 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 (!(pitch & 511) && + if (tiling == I915_TILING_NONE && !(pitch & 511) && (pitch + pitch_align) < (1 << ctx->Const.MaxTextureLevels)) pitch += pitch_align; #endif diff --git a/src/mesa/drivers/dri/intel/intel_regions.c b/src/mesa/drivers/dri/intel/intel_regions.c index f63d3a40825..f042bcbc28c 100644 --- a/src/mesa/drivers/dri/intel/intel_regions.c +++ b/src/mesa/drivers/dri/intel/intel_regions.c @@ -118,8 +118,7 @@ intel_region_map(struct intel_context *intel, struct intel_region *region) if (region->pbo) intel_region_cow(intel, region); - if (region->tiling != I915_TILING_NONE && - intel->intelScreen->kernel_exec_fencing) + if (region->tiling != I915_TILING_NONE) drm_intel_gem_bo_map_gtt(region->buffer); else dri_bo_map(region->buffer, GL_TRUE); @@ -134,8 +133,7 @@ intel_region_unmap(struct intel_context *intel, struct intel_region *region) { _DBG("%s %p\n", __FUNCTION__, region); if (!--region->map_refcount) { - if (region->tiling != I915_TILING_NONE && - intel->intelScreen->kernel_exec_fencing) + if (region->tiling != I915_TILING_NONE) drm_intel_gem_bo_unmap_gtt(region->buffer); else dri_bo_unmap(region->buffer); @@ -180,36 +178,19 @@ intel_region_alloc(struct intel_context *intel, { dri_bo *buffer; struct intel_region *region; + unsigned long flags = 0; + unsigned long aligned_pitch; - /* If we're tiled, our allocations are in 8 or 32-row blocks, so - * failure to align our height means that we won't allocate enough pages. - * - * If we're untiled, we still have to align to 2 rows high because the - * data port accesses 2x2 blocks even if the bottom row isn't to be - * rendered, so failure to align means we could walk off the end of the - * GTT and fault. - */ - if (tiling == I915_TILING_X) - height = ALIGN(height, 8); - else if (tiling == I915_TILING_Y) - height = ALIGN(height, 32); - else - height = ALIGN(height, 2); - - /* If we're untiled, we have to align to 2 rows high because the - * data port accesses 2x2 blocks even if the bottom row isn't to be - * rendered, so failure to align means we could walk off the end of the - * GTT and fault. + if (expect_accelerated_upload) + flags |= BO_ALLOC_FOR_RENDER; + + buffer = drm_intel_bo_alloc_tiled(intel->bufmgr, "region", + width, height, cpp, + &tiling, &aligned_pitch, flags); + /* We've already chosen a pitch as part of miptree layout. It had + * better be the same. */ - height = ALIGN(height, 2); - - if (expect_accelerated_upload) { - buffer = drm_intel_bo_alloc_for_render(intel->bufmgr, "region", - pitch * cpp * height, 64); - } else { - buffer = drm_intel_bo_alloc(intel->bufmgr, "region", - pitch * cpp * height, 64); - } + assert(aligned_pitch == pitch * cpp); region = intel_region_alloc_internal(intel, cpp, width, height, pitch, buffer); diff --git a/src/mesa/drivers/dri/intel/intel_regions.h b/src/mesa/drivers/dri/intel/intel_regions.h index 6d36f3d88a0..7ee6a988eae 100644 --- a/src/mesa/drivers/dri/intel/intel_regions.h +++ b/src/mesa/drivers/dri/intel/intel_regions.h @@ -148,4 +148,12 @@ void _mesa_copy_rect(GLubyte * dst, const GLubyte * src, GLuint src_pitch, GLuint src_x, GLuint src_y); +struct __DRIimageRec { + struct intel_region *region; + GLenum internal_format; + GLuint format; + GLenum data_type; + void *data; +}; + #endif diff --git a/src/mesa/drivers/dri/intel/intel_screen.c b/src/mesa/drivers/dri/intel/intel_screen.c index 5e23aa8a1d6..6e4bb643651 100644 --- a/src/mesa/drivers/dri/intel/intel_screen.c +++ b/src/mesa/drivers/dri/intel/intel_screen.c @@ -30,6 +30,7 @@ #include "main/framebuffer.h" #include "main/renderbuffer.h" #include "main/hash.h" +#include "main/fbobject.h" #include "utils.h" #include "xmlpool.h" @@ -41,13 +42,11 @@ #include "intel_fbo.h" #include "intel_screen.h" #include "intel_tex.h" +#include "intel_regions.h" #include "i915_drm.h" #define DRI_CONF_TEXTURE_TILING(def) \ - DRI_CONF_OPT_BEGIN(texture_tiling, bool, def) \ - DRI_CONF_DESC(en, "Enable texture tiling") \ - DRI_CONF_OPT_END \ PUBLIC const char __driConfigOptions[] = DRI_CONF_BEGIN @@ -63,11 +62,9 @@ PUBLIC const char __driConfigOptions[] = DRI_CONF_DESC_END DRI_CONF_OPT_END -#ifdef I915 - DRI_CONF_TEXTURE_TILING(false) -#else - DRI_CONF_TEXTURE_TILING(true) -#endif + DRI_CONF_OPT_BEGIN(texture_tiling, bool, true) + DRI_CONF_DESC(en, "Enable texture tiling") + DRI_CONF_OPT_END DRI_CONF_OPT_BEGIN(early_z, bool, false) DRI_CONF_DESC(en, "Enable early Z in classic mode (unstable, 945-only).") @@ -99,11 +96,6 @@ const GLuint __driNConfigOptions = 11; static PFNGLXCREATECONTEXTMODES create_context_modes = NULL; #endif /*USE_NEW_INTERFACE */ -static const __DRItexOffsetExtension intelTexOffsetExtension = { - { __DRI_TEX_OFFSET }, - intelSetTexOffset, -}; - static const __DRItexBufferExtension intelTexBufferExtension = { { __DRI_TEX_BUFFER, __DRI_TEX_BUFFER_VERSION }, intelSetTexBuffer, @@ -137,11 +129,102 @@ static const struct __DRI2flushExtensionRec intelFlushExtension = { intelDRI2Invalidate, }; +static __DRIimage * +intel_create_image_from_name(__DRIcontext *context, + int width, int height, int format, + int name, int pitch, void *loaderPrivate) +{ + __DRIimage *image; + struct intel_context *intel = context->driverPrivate; + int cpp; + + image = CALLOC(sizeof *image); + if (image == NULL) + return NULL; + + switch (format) { + case __DRI_IMAGE_FORMAT_RGB565: + image->format = MESA_FORMAT_RGB565; + image->internal_format = GL_RGB; + image->data_type = GL_UNSIGNED_BYTE; + break; + case __DRI_IMAGE_FORMAT_XRGB8888: + image->format = MESA_FORMAT_XRGB8888; + image->internal_format = GL_RGB; + image->data_type = GL_UNSIGNED_BYTE; + break; + case __DRI_IMAGE_FORMAT_ARGB8888: + image->format = MESA_FORMAT_ARGB8888; + image->internal_format = GL_RGBA; + image->data_type = GL_UNSIGNED_BYTE; + break; + default: + free(image); + return NULL; + } + + image->data = loaderPrivate; + cpp = _mesa_get_format_bytes(image->format); + + image->region = intel_region_alloc_for_handle(intel, cpp, width, height, + pitch, name, "image"); + if (image->region == NULL) { + FREE(image); + return NULL; + } + + return image; +} + +static __DRIimage * +intel_create_image_from_renderbuffer(__DRIcontext *context, + int renderbuffer, void *loaderPrivate) +{ + __DRIimage *image; + struct intel_context *intel = context->driverPrivate; + struct gl_renderbuffer *rb; + struct intel_renderbuffer *irb; + + rb = _mesa_lookup_renderbuffer(&intel->ctx, renderbuffer); + if (!rb) { + _mesa_error(&intel->ctx, + GL_INVALID_OPERATION, "glRenderbufferExternalMESA"); + return NULL; + } + + irb = intel_renderbuffer(rb); + image = CALLOC(sizeof *image); + if (image == NULL) + return NULL; + + image->internal_format = rb->InternalFormat; + image->format = rb->Format; + image->data_type = rb->DataType; + image->data = loaderPrivate; + intel_region_reference(&image->region, irb->region); + + return image; +} + +static void +intel_destroy_image(__DRIimage *image) +{ + intel_region_release(&image->region); + FREE(image); +} + +static struct __DRIimageExtensionRec intelImageExtension = { + { __DRI_IMAGE, __DRI_IMAGE_VERSION }, + intel_create_image_from_name, + intel_create_image_from_renderbuffer, + intel_destroy_image, +}; + static const __DRIextension *intelScreenExtensions[] = { &driReadDrawableExtension, - &intelTexOffsetExtension.base, &intelTexBufferExtension.base, &intelFlushExtension.base, + &intelImageExtension.base, NULL }; @@ -327,10 +410,13 @@ intel_init_bufmgr(struct intel_screen *intelScreen) return GL_FALSE; } - if (intel_get_param(spriv, I915_PARAM_NUM_FENCES_AVAIL, &num_fences)) - intelScreen->kernel_exec_fencing = !!num_fences; - else - intelScreen->kernel_exec_fencing = GL_FALSE; + if (!intel_get_param(spriv, I915_PARAM_NUM_FENCES_AVAIL, &num_fences) || + num_fences == 0) { + fprintf(stderr, "[%s: %u] Kernel 2.6.29 required.\n", __func__, __LINE__); + return GL_FALSE; + } + + drm_intel_bufmgr_gem_enable_fenced_relocs(intelScreen->bufmgr); intelScreen->named_regions = _mesa_NewHashTable(); diff --git a/src/mesa/drivers/dri/intel/intel_screen.h b/src/mesa/drivers/dri/intel/intel_screen.h index 1ce476dacaa..5863093f001 100644 --- a/src/mesa/drivers/dri/intel/intel_screen.h +++ b/src/mesa/drivers/dri/intel/intel_screen.h @@ -46,7 +46,6 @@ struct intel_screen GLboolean no_vbo; dri_bufmgr *bufmgr; - GLboolean kernel_exec_fencing; struct _mesa_HashTable *named_regions; /** diff --git a/src/mesa/drivers/dri/intel/intel_span.c b/src/mesa/drivers/dri/intel/intel_span.c index 0072bb15fc3..fb5c01bc4dc 100644 --- a/src/mesa/drivers/dri/intel/intel_span.c +++ b/src/mesa/drivers/dri/intel/intel_span.c @@ -43,218 +43,6 @@ static void intel_set_span_functions(struct intel_context *intel, struct gl_renderbuffer *rb); -#define SPAN_CACHE_SIZE 4096 - -static void -get_span_cache(struct intel_renderbuffer *irb, uint32_t offset) -{ - if (irb->span_cache == NULL) { - irb->span_cache = malloc(SPAN_CACHE_SIZE); - irb->span_cache_offset = -1; - } - - if ((offset & ~(SPAN_CACHE_SIZE - 1)) != irb->span_cache_offset) { - irb->span_cache_offset = offset & ~(SPAN_CACHE_SIZE - 1); - dri_bo_get_subdata(irb->region->buffer, irb->span_cache_offset, - SPAN_CACHE_SIZE, irb->span_cache); - } -} - -static void -clear_span_cache(struct intel_renderbuffer *irb) -{ - irb->span_cache_offset = -1; -} - -static uint32_t -pread_32(struct intel_renderbuffer *irb, uint32_t offset) -{ - get_span_cache(irb, offset); - - return *(uint32_t *)(irb->span_cache + (offset & (SPAN_CACHE_SIZE - 1))); -} - -static uint32_t -pread_xrgb8888(struct intel_renderbuffer *irb, uint32_t offset) -{ - get_span_cache(irb, offset); - - return *(uint32_t *)(irb->span_cache + (offset & (SPAN_CACHE_SIZE - 1))) | - 0xff000000; -} - -static uint16_t -pread_16(struct intel_renderbuffer *irb, uint32_t offset) -{ - get_span_cache(irb, offset); - - return *(uint16_t *)(irb->span_cache + (offset & (SPAN_CACHE_SIZE - 1))); -} - -static uint8_t -pread_8(struct intel_renderbuffer *irb, uint32_t offset) -{ - get_span_cache(irb, offset); - - return *(uint8_t *)(irb->span_cache + (offset & (SPAN_CACHE_SIZE - 1))); -} - -static void -pwrite_32(struct intel_renderbuffer *irb, uint32_t offset, uint32_t val) -{ - clear_span_cache(irb); - - dri_bo_subdata(irb->region->buffer, offset, 4, &val); -} - -static void -pwrite_xrgb8888(struct intel_renderbuffer *irb, uint32_t offset, uint32_t val) -{ - clear_span_cache(irb); - - dri_bo_subdata(irb->region->buffer, offset, 3, &val); -} - -static void -pwrite_16(struct intel_renderbuffer *irb, uint32_t offset, uint16_t val) -{ - clear_span_cache(irb); - - dri_bo_subdata(irb->region->buffer, offset, 2, &val); -} - -static void -pwrite_8(struct intel_renderbuffer *irb, uint32_t offset, uint8_t val) -{ - clear_span_cache(irb); - - dri_bo_subdata(irb->region->buffer, offset, 1, &val); -} - -static uint32_t no_tile_swizzle(struct intel_renderbuffer *irb, - int x, int y) -{ - return (y * irb->region->pitch + x) * irb->region->cpp; -} - -/* - * Deal with tiled surfaces - */ - -static uint32_t x_tile_swizzle(struct intel_renderbuffer *irb, - int x, int y) -{ - int tile_stride; - int xbyte; - int x_tile_off, y_tile_off; - int x_tile_number, y_tile_number; - int tile_off, tile_base; - - x += irb->region->draw_x; - y += irb->region->draw_y; - - tile_stride = (irb->region->pitch * irb->region->cpp) << 3; - - xbyte = x * irb->region->cpp; - - x_tile_off = xbyte & 0x1ff; - y_tile_off = y & 7; - - x_tile_number = xbyte >> 9; - y_tile_number = y >> 3; - - tile_off = (y_tile_off << 9) + x_tile_off; - - switch (irb->region->bit_6_swizzle) { - case I915_BIT_6_SWIZZLE_NONE: - break; - case I915_BIT_6_SWIZZLE_9: - tile_off ^= ((tile_off >> 3) & 64); - break; - case I915_BIT_6_SWIZZLE_9_10: - tile_off ^= ((tile_off >> 3) & 64) ^ ((tile_off >> 4) & 64); - break; - case I915_BIT_6_SWIZZLE_9_11: - tile_off ^= ((tile_off >> 3) & 64) ^ ((tile_off >> 5) & 64); - break; - case I915_BIT_6_SWIZZLE_9_10_11: - tile_off ^= ((tile_off >> 3) & 64) ^ ((tile_off >> 4) & 64) ^ - ((tile_off >> 5) & 64); - break; - default: - fprintf(stderr, "Unknown tile swizzling mode %d\n", - irb->region->bit_6_swizzle); - exit(1); - } - - tile_base = (x_tile_number << 12) + y_tile_number * tile_stride; - -#if 0 - printf("(%d,%d) -> %d + %d = %d (pitch = %d, tstride = %d)\n", - x, y, tile_off, tile_base, - tile_off + tile_base, - irb->region->pitch, tile_stride); -#endif - - return tile_base + tile_off; -} - -static uint32_t y_tile_swizzle(struct intel_renderbuffer *irb, - int x, int y) -{ - int tile_stride; - int xbyte; - int x_tile_off, y_tile_off; - int x_tile_number, y_tile_number; - int tile_off, tile_base; - - x += irb->region->draw_x; - y += irb->region->draw_y; - - tile_stride = (irb->region->pitch * irb->region->cpp) << 5; - - xbyte = x * irb->region->cpp; - - x_tile_off = xbyte & 0x7f; - y_tile_off = y & 0x1f; - - x_tile_number = xbyte >> 7; - y_tile_number = y >> 5; - - tile_off = ((x_tile_off & ~0xf) << 5) + (y_tile_off << 4) + - (x_tile_off & 0xf); - - switch (irb->region->bit_6_swizzle) { - case I915_BIT_6_SWIZZLE_NONE: - break; - case I915_BIT_6_SWIZZLE_9: - tile_off ^= ((tile_off >> 3) & 64); - break; - case I915_BIT_6_SWIZZLE_9_10: - tile_off ^= ((tile_off >> 3) & 64) ^ ((tile_off >> 4) & 64); - break; - case I915_BIT_6_SWIZZLE_9_11: - tile_off ^= ((tile_off >> 3) & 64) ^ ((tile_off >> 5) & 64); - break; - case I915_BIT_6_SWIZZLE_9_10_11: - tile_off ^= ((tile_off >> 3) & 64) ^ ((tile_off >> 4) & 64) ^ - ((tile_off >> 5) & 64); - break; - default: - fprintf(stderr, "Unknown tile swizzling mode %d\n", - irb->region->bit_6_swizzle); - exit(1); - } - - tile_base = (x_tile_number << 12) + y_tile_number * tile_stride; - - return tile_base + tile_off; -} - -/* - break intelWriteRGBASpan_ARGB8888 -*/ - #undef DBG #define DBG 0 @@ -280,50 +68,43 @@ static uint32_t y_tile_swizzle(struct intel_renderbuffer *irb, #define HW_UNLOCK() -/* Convenience macros to avoid typing the swizzle argument over and over */ -#define NO_TILE(_X, _Y) no_tile_swizzle(irb, (_X), (_Y)) -#define X_TILE(_X, _Y) x_tile_swizzle(irb, (_X), (_Y)) -#define Y_TILE(_X, _Y) y_tile_swizzle(irb, (_X), (_Y)) +/* Convenience macros to avoid typing the address argument over and over */ +#define NO_TILE(_X, _Y) (((_Y) * irb->region->pitch + (_X)) * irb->region->cpp) /* r5g6b5 color span and pixel functions */ -#define INTEL_PIXEL_FMT GL_RGB -#define INTEL_PIXEL_TYPE GL_UNSIGNED_SHORT_5_6_5 -#define INTEL_READ_VALUE(offset) pread_16(irb, offset) -#define INTEL_WRITE_VALUE(offset, v) pwrite_16(irb, offset, v) -#define INTEL_TAG(x) x##_RGB565 -#include "intel_spantmp.h" +#define SPANTMP_PIXEL_FMT GL_RGB +#define SPANTMP_PIXEL_TYPE GL_UNSIGNED_SHORT_5_6_5 +#define TAG(x) intel_##x##_RGB565 +#define TAG2(x,y) intel_##x##y_RGB565 +#include "spantmp2.h" /* a4r4g4b4 color span and pixel functions */ -#define INTEL_PIXEL_FMT GL_BGRA -#define INTEL_PIXEL_TYPE GL_UNSIGNED_SHORT_4_4_4_4_REV -#define INTEL_READ_VALUE(offset) pread_16(irb, offset) -#define INTEL_WRITE_VALUE(offset, v) pwrite_16(irb, offset, v) -#define INTEL_TAG(x) x##_ARGB4444 -#include "intel_spantmp.h" +#define SPANTMP_PIXEL_FMT GL_BGRA +#define SPANTMP_PIXEL_TYPE GL_UNSIGNED_SHORT_4_4_4_4_REV +#define TAG(x) intel_##x##_ARGB4444 +#define TAG2(x,y) intel_##x##y_ARGB4444 +#include "spantmp2.h" /* a1r5g5b5 color span and pixel functions */ -#define INTEL_PIXEL_FMT GL_BGRA -#define INTEL_PIXEL_TYPE GL_UNSIGNED_SHORT_1_5_5_5_REV -#define INTEL_READ_VALUE(offset) pread_16(irb, offset) -#define INTEL_WRITE_VALUE(offset, v) pwrite_16(irb, offset, v) -#define INTEL_TAG(x) x##_ARGB1555 -#include "intel_spantmp.h" +#define SPANTMP_PIXEL_FMT GL_BGRA +#define SPANTMP_PIXEL_TYPE GL_UNSIGNED_SHORT_1_5_5_5_REV +#define TAG(x) intel_##x##_ARGB1555 +#define TAG2(x,y) intel_##x##y##_ARGB1555 +#include "spantmp2.h" /* a8r8g8b8 color span and pixel functions */ -#define INTEL_PIXEL_FMT GL_BGRA -#define INTEL_PIXEL_TYPE GL_UNSIGNED_INT_8_8_8_8_REV -#define INTEL_READ_VALUE(offset) pread_32(irb, offset) -#define INTEL_WRITE_VALUE(offset, v) pwrite_32(irb, offset, v) -#define INTEL_TAG(x) x##_ARGB8888 -#include "intel_spantmp.h" +#define SPANTMP_PIXEL_FMT GL_BGRA +#define SPANTMP_PIXEL_TYPE GL_UNSIGNED_INT_8_8_8_8_REV +#define TAG(x) intel_##x##_ARGB8888 +#define TAG2(x,y) intel_##x##y##_ARGB8888 +#include "spantmp2.h" /* x8r8g8b8 color span and pixel functions */ -#define INTEL_PIXEL_FMT GL_BGR -#define INTEL_PIXEL_TYPE GL_UNSIGNED_INT_8_8_8_8_REV -#define INTEL_READ_VALUE(offset) pread_xrgb8888(irb, offset) -#define INTEL_WRITE_VALUE(offset, v) pwrite_xrgb8888(irb, offset, v) -#define INTEL_TAG(x) x##_xRGB8888 -#include "intel_spantmp.h" +#define SPANTMP_PIXEL_FMT GL_BGR +#define SPANTMP_PIXEL_TYPE GL_UNSIGNED_INT_8_8_8_8_REV +#define TAG(x) intel_##x##_xRGB8888 +#define TAG2(x,y) intel_##x##y##_xRGB8888 +#include "spantmp2.h" #define LOCAL_DEPTH_VARS \ struct intel_renderbuffer *irb = intel_renderbuffer(rb); \ @@ -339,52 +120,22 @@ static uint32_t y_tile_swizzle(struct intel_renderbuffer *irb, #define LOCAL_STENCIL_VARS LOCAL_DEPTH_VARS /* z16 depthbuffer functions. */ -#define INTEL_VALUE_TYPE GLushort -#define INTEL_WRITE_DEPTH(offset, d) pwrite_16(irb, offset, d) -#define INTEL_READ_DEPTH(offset) pread_16(irb, offset) -#define INTEL_TAG(name) name##_z16 -#include "intel_depthtmp.h" - -/* z24x8 depthbuffer functions. */ -#define INTEL_VALUE_TYPE GLuint -#define INTEL_WRITE_DEPTH(offset, d) pwrite_32(irb, offset, d) -#define INTEL_READ_DEPTH(offset) pread_32(irb, offset) -#define INTEL_TAG(name) name##_z24_x8 -#include "intel_depthtmp.h" - - -/** - ** 8-bit stencil function (XXX FBO: This is obsolete) - **/ -/* XXX */ -#define WRITE_STENCIL(_x, _y, d) pwrite_8(irb, NO_TILE(_x, _y) + 3, d) -#define READ_STENCIL(d, _x, _y) d = pread_8(irb, NO_TILE(_x, _y) + 3); -#define TAG(x) intel_gttmap_##x##_z24_s8 -#include "stenciltmp.h" - -/** - ** 8-bit stencil function (XXX FBO: This is obsolete) - **/ -#define WRITE_STENCIL(_x, _y, d) pwrite_8(irb, NO_TILE(_x, _y) + 3, d) -#define READ_STENCIL(d, _x, _y) d = pread_8(irb, NO_TILE(_x, _y) + 3); -#define TAG(x) intel##x##_z24_s8 -#include "stenciltmp.h" - -/** - ** 8-bit x-tile stencil function (XXX FBO: This is obsolete) - **/ -#define WRITE_STENCIL(_x, _y, d) pwrite_8(irb, X_TILE(_x, _y) + 3, d) -#define READ_STENCIL(d, _x, _y) d = pread_8(irb, X_TILE(_x, _y) + 3); -#define TAG(x) intel_XTile_##x##_z24_s8 -#include "stenciltmp.h" - -/** - ** 8-bit y-tile stencil function (XXX FBO: This is obsolete) - **/ -#define WRITE_STENCIL(_x, _y, d) pwrite_8(irb, Y_TILE(_x, _y) + 3, d) -#define READ_STENCIL(d, _x, _y) d = pread_8(irb, Y_TILE(_x, _y) + 3) -#define TAG(x) intel_YTile_##x##_z24_s8 -#include "stenciltmp.h" +#define VALUE_TYPE GLushort +#define WRITE_DEPTH(_x, _y, d) \ + (*(uint16_t *)(irb->region->buffer->virtual + NO_TILE(_x, _y)) = d) +#define READ_DEPTH(d, _x, _y) \ + d = *(uint16_t *)(irb->region->buffer->virtual + NO_TILE(_x, _y)) +#define TAG(x) intel_##x##_z16 +#include "depthtmp.h" + +/* z24_s8 and z24_x8 depthbuffer functions. */ +#define VALUE_TYPE GLuint +#define WRITE_DEPTH(_x, _y, d) \ + (*(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 +#include "depthtmp.h" void intel_renderbuffer_map(struct intel_context *intel, struct gl_renderbuffer *rb) @@ -394,8 +145,7 @@ intel_renderbuffer_map(struct intel_context *intel, struct gl_renderbuffer *rb) if (irb == NULL || irb->region == NULL) return; - if (intel->intelScreen->kernel_exec_fencing) - drm_intel_gem_bo_map_gtt(irb->region->buffer); + drm_intel_gem_bo_map_gtt(irb->region->buffer); intel_set_span_functions(intel, rb); } @@ -409,10 +159,7 @@ intel_renderbuffer_unmap(struct intel_context *intel, if (irb == NULL || irb->region == NULL) return; - if (intel->intelScreen->kernel_exec_fencing) - drm_intel_gem_bo_unmap_gtt(irb->region->buffer); - else - clear_span_cache(irb); + drm_intel_gem_bo_unmap_gtt(irb->region->buffer); rb->GetRow = NULL; rb->PutRow = NULL; @@ -592,182 +339,34 @@ intel_set_span_functions(struct intel_context *intel, struct gl_renderbuffer *rb) { struct intel_renderbuffer *irb = (struct intel_renderbuffer *) rb; - uint32_t tiling = irb->region->tiling; - - if (intel->intelScreen->kernel_exec_fencing) { - switch (irb->Base.Format) { - case MESA_FORMAT_RGB565: - intel_gttmap_InitPointers_RGB565(rb); - break; - case MESA_FORMAT_ARGB4444: - intel_gttmap_InitPointers_ARGB4444(rb); - break; - case MESA_FORMAT_ARGB1555: - intel_gttmap_InitPointers_ARGB1555(rb); - break; - case MESA_FORMAT_XRGB8888: - intel_gttmap_InitPointers_xRGB8888(rb); - break; - case MESA_FORMAT_ARGB8888: - intel_gttmap_InitPointers_ARGB8888(rb); - break; - case MESA_FORMAT_Z16: - intel_gttmap_InitDepthPointers_z16(rb); - break; - case MESA_FORMAT_X8_Z24: - intel_gttmap_InitDepthPointers_z24_x8(rb); - break; - case MESA_FORMAT_S8_Z24: - /* There are a few different ways SW asks us to access the S8Z24 data: - * Z24 depth-only depth reads - * S8Z24 depth reads - * S8Z24 stencil reads. - */ - if (rb->Format == MESA_FORMAT_S8_Z24) { - intel_gttmap_InitDepthPointers_z24_x8(rb); - } else if (rb->Format == MESA_FORMAT_S8) { - intel_gttmap_InitStencilPointers_z24_s8(rb); - } - break; - default: - _mesa_problem(NULL, - "Unexpected MesaFormat %d in intelSetSpanFunctions", - irb->Base.Format); - break; - } - return; - } - /* If in GEM mode, we need to do the tile address swizzling ourselves, - * instead of the fence registers handling it. - */ switch (irb->Base.Format) { case MESA_FORMAT_RGB565: - switch (tiling) { - case I915_TILING_NONE: - default: - intelInitPointers_RGB565(rb); - break; - case I915_TILING_X: - intel_XTile_InitPointers_RGB565(rb); - break; - case I915_TILING_Y: - intel_YTile_InitPointers_RGB565(rb); - break; - } + intel_InitPointers_RGB565(rb); break; case MESA_FORMAT_ARGB4444: - switch (tiling) { - case I915_TILING_NONE: - default: - intelInitPointers_ARGB4444(rb); - break; - case I915_TILING_X: - intel_XTile_InitPointers_ARGB4444(rb); - break; - case I915_TILING_Y: - intel_YTile_InitPointers_ARGB4444(rb); - break; - } + intel_InitPointers_ARGB4444(rb); break; case MESA_FORMAT_ARGB1555: - switch (tiling) { - case I915_TILING_NONE: - default: - intelInitPointers_ARGB1555(rb); - break; - case I915_TILING_X: - intel_XTile_InitPointers_ARGB1555(rb); - break; - case I915_TILING_Y: - intel_YTile_InitPointers_ARGB1555(rb); - break; - } + intel_InitPointers_ARGB1555(rb); break; case MESA_FORMAT_XRGB8888: - switch (tiling) { - case I915_TILING_NONE: - default: - intelInitPointers_xRGB8888(rb); - break; - case I915_TILING_X: - intel_XTile_InitPointers_xRGB8888(rb); - break; - case I915_TILING_Y: - intel_YTile_InitPointers_xRGB8888(rb); - break; - } + intel_InitPointers_xRGB8888(rb); break; case MESA_FORMAT_ARGB8888: - /* 8888 RGBA */ - switch (tiling) { - case I915_TILING_NONE: - default: - intelInitPointers_ARGB8888(rb); - break; - case I915_TILING_X: - intel_XTile_InitPointers_ARGB8888(rb); - break; - case I915_TILING_Y: - intel_YTile_InitPointers_ARGB8888(rb); - break; - } + intel_InitPointers_ARGB8888(rb); break; case MESA_FORMAT_Z16: - switch (tiling) { - case I915_TILING_NONE: - default: - intelInitDepthPointers_z16(rb); - break; - case I915_TILING_X: - intel_XTile_InitDepthPointers_z16(rb); - break; - case I915_TILING_Y: - intel_YTile_InitDepthPointers_z16(rb); - break; - } + intel_InitDepthPointers_z16(rb); break; case MESA_FORMAT_X8_Z24: case MESA_FORMAT_S8_Z24: - /* There are a few different ways SW asks us to access the S8Z24 data: - * Z24 depth-only depth reads - * S8Z24 depth reads - * S8Z24 stencil reads. - */ - if (rb->Format == MESA_FORMAT_S8_Z24) { - switch (tiling) { - case I915_TILING_NONE: - default: - intelInitDepthPointers_z24_x8(rb); - break; - case I915_TILING_X: - intel_XTile_InitDepthPointers_z24_x8(rb); - break; - case I915_TILING_Y: - intel_YTile_InitDepthPointers_z24_x8(rb); - break; - } - } else if (rb->Format == MESA_FORMAT_S8) { - switch (tiling) { - case I915_TILING_NONE: - default: - intelInitStencilPointers_z24_s8(rb); - break; - case I915_TILING_X: - intel_XTile_InitStencilPointers_z24_s8(rb); - break; - case I915_TILING_Y: - intel_YTile_InitStencilPointers_z24_s8(rb); - break; - } - } else { - _mesa_problem(NULL, - "Unexpected ActualFormat in intelSetSpanFunctions"); - } + intel_InitDepthPointers_z24_x8(rb); break; default: _mesa_problem(NULL, - "Unexpected MesaFormat in intelSetSpanFunctions"); + "Unexpected MesaFormat %d in intelSetSpanFunctions", + irb->Base.Format); break; } } diff --git a/src/mesa/drivers/dri/intel/intel_spantmp.h b/src/mesa/drivers/dri/intel/intel_spantmp.h deleted file mode 100644 index bad03398f68..00000000000 --- a/src/mesa/drivers/dri/intel/intel_spantmp.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright © 2009 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 <[email protected]> - * - */ - -/** - * Wrapper around the spantmp.h macrofest to generate spans code for - * all the tiling styles. - */ - -#define SPANTMP_PIXEL_FMT INTEL_PIXEL_FMT -#define SPANTMP_PIXEL_TYPE INTEL_PIXEL_TYPE -#define TAG(x) INTEL_TAG(intel_gttmap_##x) -#define TAG2(x, y) INTEL_TAG(intel_gttmap_##x##y) -#include "spantmp2.h" - -#define SPANTMP_PIXEL_FMT INTEL_PIXEL_FMT -#define SPANTMP_PIXEL_TYPE INTEL_PIXEL_TYPE -#define PUT_VALUE(_x, _y, v) INTEL_WRITE_VALUE(NO_TILE(_x, _y), v) -#define GET_VALUE(_x, _y) INTEL_READ_VALUE(NO_TILE(_x, _y)) -#define TAG(x) INTEL_TAG(intel##x) -#define TAG2(x, y) INTEL_TAG(intel##x)##y -#include "spantmp2.h" - -#define SPANTMP_PIXEL_FMT INTEL_PIXEL_FMT -#define SPANTMP_PIXEL_TYPE INTEL_PIXEL_TYPE -#define PUT_VALUE(_x, _y, v) INTEL_WRITE_VALUE(X_TILE(_x, _y), v) -#define GET_VALUE(_x, _y) INTEL_READ_VALUE(X_TILE(_x, _y)) -#define TAG(x) INTEL_TAG(intel_XTile_##x) -#define TAG2(x, y) INTEL_TAG(intel_XTile_##x)##y -#include "spantmp2.h" - -#define SPANTMP_PIXEL_FMT INTEL_PIXEL_FMT -#define SPANTMP_PIXEL_TYPE INTEL_PIXEL_TYPE -#define PUT_VALUE(_x, _y, v) INTEL_WRITE_VALUE(Y_TILE(_x, _y), v) -#define GET_VALUE(_x, _y) INTEL_READ_VALUE(Y_TILE(_x, _y)) -#define TAG(x) INTEL_TAG(intel_YTile_##x) -#define TAG2(x, y) INTEL_TAG(intel_YTile_##x)##y -#include "spantmp2.h" - -#undef INTEL_PIXEL_FMT -#undef INTEL_PIXEL_TYPE -#undef INTEL_WRITE_VALUE -#undef INTEL_READ_VALUE -#undef INTEL_TAG diff --git a/src/mesa/drivers/dri/intel/intel_tex.h b/src/mesa/drivers/dri/intel/intel_tex.h index f3cc0fff5c8..4bb012dc65e 100644 --- a/src/mesa/drivers/dri/intel/intel_tex.h +++ b/src/mesa/drivers/dri/intel/intel_tex.h @@ -45,8 +45,6 @@ void intelInitTextureCopyImageFuncs(struct dd_function_table *functions); gl_format intelChooseTextureFormat(GLcontext *ctx, GLint internalFormat, GLenum format, GLenum type); -void intelSetTexOffset(__DRIcontext *pDRICtx, GLint texname, - unsigned long long offset, GLint depth, GLuint pitch); void intelSetTexBuffer(__DRIcontext *pDRICtx, GLint target, __DRIdrawable *pDraw); void intelSetTexBuffer2(__DRIcontext *pDRICtx, diff --git a/src/mesa/drivers/dri/intel/intel_tex_image.c b/src/mesa/drivers/dri/intel/intel_tex_image.c index aefd0b97d0c..bac36eeb569 100644 --- a/src/mesa/drivers/dri/intel/intel_tex_image.c +++ b/src/mesa/drivers/dri/intel/intel_tex_image.c @@ -706,29 +706,6 @@ intelGetCompressedTexImage(GLcontext *ctx, GLenum target, GLint level, texObj, texImage, GL_TRUE); } - -void -intelSetTexOffset(__DRIcontext *pDRICtx, GLint texname, - unsigned long long offset, GLint depth, GLuint pitch) -{ - struct intel_context *intel = pDRICtx->driverPrivate; - struct gl_texture_object *tObj = _mesa_lookup_texture(&intel->ctx, texname); - struct intel_texture_object *intelObj = intel_texture_object(tObj); - - if (!intelObj) - return; - - if (intelObj->mt) - intel_miptree_release(intel, &intelObj->mt); - - intelObj->imageOverride = GL_TRUE; - intelObj->depthOverride = depth; - intelObj->pitchOverride = pitch; - - if (offset) - intelObj->textureOffset = offset; -} - void intelSetTexBuffer2(__DRIcontext *pDRICtx, GLint target, GLint texture_format, @@ -814,6 +791,54 @@ intelSetTexBuffer(__DRIcontext *pDRICtx, GLint target, __DRIdrawable *dPriv) intelSetTexBuffer2(pDRICtx, target, __DRI_TEXTURE_FORMAT_RGBA, dPriv); } +#if FEATURE_OES_EGL_image +static void +intel_image_target_texture_2d(GLcontext *ctx, GLenum target, + struct gl_texture_object *texObj, + struct gl_texture_image *texImage, + GLeglImageOES image_handle) +{ + struct intel_context *intel = intel_context(ctx); + struct intel_texture_object *intelObj = intel_texture_object(texObj); + struct intel_texture_image *intelImage = intel_texture_image(texImage); + struct intel_mipmap_tree *mt; + __DRIscreen *screen; + __DRIimage *image; + + screen = intel->intelScreen->driScrnPriv; + image = screen->dri2.image->lookupEGLImage(intel->driContext, image_handle, + intel->driContext->loaderPrivate); + if (image == NULL) + return; + + mt = intel_miptree_create_for_region(intel, target, + image->internal_format, + 0, 0, image->region, 1, 0); + if (mt == NULL) + return; + + if (intelImage->mt) { + intel_miptree_release(intel, &intelImage->mt); + assert(!texImage->Data); + } + if (intelObj->mt) + intel_miptree_release(intel, &intelObj->mt); + + intelObj->mt = mt; + _mesa_init_teximage_fields(&intel->ctx, target, texImage, + image->region->width, image->region->height, 1, + 0, image->internal_format); + + intelImage->face = target_to_face(target); + intelImage->level = 0; + texImage->TexFormat = image->format; + texImage->RowStride = image->region->pitch; + intel_miptree_reference(&intelImage->mt, intelObj->mt); + + if (!intel_miptree_match_image(intelObj->mt, &intelImage->base)) + fprintf(stderr, "miptree doesn't match image\n"); +} +#endif void intelInitTextureImageFuncs(struct dd_function_table *functions) @@ -825,4 +850,8 @@ intelInitTextureImageFuncs(struct dd_function_table *functions) functions->CompressedTexImage2D = intelCompressedTexImage2D; functions->GetCompressedTexImage = intelGetCompressedTexImage; + +#if FEATURE_OES_EGL_image + functions->EGLImageTargetTexture2D = intel_image_target_texture_2d; +#endif } diff --git a/src/mesa/drivers/dri/intel/intel_tex_obj.h b/src/mesa/drivers/dri/intel/intel_tex_obj.h index 3ad10d3d238..5f60e0ea4f3 100644 --- a/src/mesa/drivers/dri/intel/intel_tex_obj.h +++ b/src/mesa/drivers/dri/intel/intel_tex_obj.h @@ -46,10 +46,6 @@ struct intel_texture_object * regions will be copied to this region and the old storage freed. */ struct intel_mipmap_tree *mt; - - GLboolean imageOverride; - GLint depthOverride; - GLuint pitchOverride; }; struct intel_texture_image 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 e49c4214ad4..00000000000 --- 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 ([email protected]) - - 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 a8f463e9fd0..c20fdece297 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 77e7e53ce04..73b1e08d4b8 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/mach64/mach64_state.c b/src/mesa/drivers/dri/mach64/mach64_state.c index b9093b5a139..69a5aea02ce 100644 --- a/src/mesa/drivers/dri/mach64/mach64_state.c +++ b/src/mesa/drivers/dri/mach64/mach64_state.c @@ -1156,12 +1156,10 @@ void mach64DDInitStateFuncs( GLcontext *ctx ) { ctx->Driver.UpdateState = mach64DDInvalidateState; - ctx->Driver.ClearIndex = NULL; ctx->Driver.ClearColor = mach64DDClearColor; ctx->Driver.DrawBuffer = mach64DDDrawBuffer; ctx->Driver.ReadBuffer = mach64DDReadBuffer; - ctx->Driver.IndexMask = NULL; ctx->Driver.ColorMask = mach64DDColorMask; ctx->Driver.AlphaFunc = mach64DDAlphaFunc; ctx->Driver.BlendEquationSeparate = mach64DDBlendEquationSeparate; diff --git a/src/mesa/drivers/dri/mach64/mach64_texmem.c b/src/mesa/drivers/dri/mach64/mach64_texmem.c index 46cee4320d0..b09954ce235 100644 --- a/src/mesa/drivers/dri/mach64/mach64_texmem.c +++ b/src/mesa/drivers/dri/mach64/mach64_texmem.c @@ -305,6 +305,7 @@ void mach64UploadTexImages( mach64ContextPtr mmesa, mach64TexObjPtr t ) t->heap = heap; /* Set the base offset of the texture image */ + assert(t->base.memBlock); t->bufAddr = mmesa->mach64Screen->texOffset[heap] + t->base.memBlock->ofs; /* Force loading the new state into the hardware */ @@ -457,7 +458,9 @@ void mach64UploadMultiTexImages( mach64ContextPtr mmesa, } /* Set the base offset of the texture image */ + assert(t0->base.memBlock); t0->bufAddr = mmesa->mach64Screen->texOffset[heap] + t0->base.memBlock->ofs; + assert(t1->base.memBlock); t1->bufAddr = mmesa->mach64Screen->texOffset[heap] + t1->base.memBlock->ofs; /* Force loading the new state into the hardware */ diff --git a/src/mesa/drivers/dri/mach64/mach64_tris.c b/src/mesa/drivers/dri/mach64/mach64_tris.c index c2a0adfef02..a81d21afffa 100644 --- a/src/mesa/drivers/dri/mach64/mach64_tris.c +++ b/src/mesa/drivers/dri/mach64/mach64_tris.c @@ -1248,7 +1248,6 @@ static struct { #define DO_POINTS 1 #define DO_FULL_QUAD 1 -#define HAVE_RGBA 1 #define HAVE_SPEC 1 #define HAVE_BACK_COLORS 0 #define HAVE_HW_FLATSHADE 1 diff --git a/src/mesa/drivers/dri/mga/Makefile b/src/mesa/drivers/dri/mga/Makefile index 0cc329fb22d..92533bccc29 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/mgastate.c b/src/mesa/drivers/dri/mga/mgastate.c index 0253044761d..745d5e98525 100644 --- a/src/mesa/drivers/dri/mga/mgastate.c +++ b/src/mesa/drivers/dri/mga/mgastate.c @@ -1193,8 +1193,5 @@ void mgaDDInitStateFuncs( GLcontext *ctx ) ctx->Driver.Viewport = mgaViewport; ctx->Driver.RenderMode = mgaRenderMode; - ctx->Driver.ClearIndex = 0; - ctx->Driver.IndexMask = 0; - TNL_CONTEXT(ctx)->Driver.RunPipeline = mgaRunPipeline; } diff --git a/src/mesa/drivers/dri/mga/mgatexmem.c b/src/mesa/drivers/dri/mga/mgatexmem.c index 47be6f3c185..58afbbb279e 100644 --- a/src/mesa/drivers/dri/mga/mgatexmem.c +++ b/src/mesa/drivers/dri/mga/mgatexmem.c @@ -222,6 +222,7 @@ int mgaUploadTexImages( mgaContextPtr mmesa, mgaTextureObjectPtr t ) return -1; } + assert(t->base.memBlock); ofs = mmesa->mgaScreen->textureOffset[ heap ] + t->base.memBlock->ofs; diff --git a/src/mesa/drivers/dri/mga/mgatris.c b/src/mesa/drivers/dri/mga/mgatris.c index 4c58c3bdb04..07cf682f6e4 100644 --- a/src/mesa/drivers/dri/mga/mgatris.c +++ b/src/mesa/drivers/dri/mga/mgatris.c @@ -347,7 +347,6 @@ static struct { #define DO_POINTS 1 #define DO_FULL_QUAD 1 -#define HAVE_RGBA 1 #define HAVE_BACK_COLORS 0 #define HAVE_SPEC 1 #define HAVE_HW_FLATSHADE 0 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 bc575e62ee8..00000000000 --- 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 <[email protected]> - * Gareth Hughes <[email protected]> - */ - -#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 43bc9f95161..7be19b26fda 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 \ @@ -42,6 +40,7 @@ DRIVER_SOURCES = \ nv20_state_polygon.c \ nv20_state_raster.c \ nv20_state_tex.c \ + nv20_state_frag.c \ nv20_state_tnl.c C_SOURCES = \ diff --git a/src/mesa/drivers/dri/nouveau/nouveau_context.c b/src/mesa/drivers/dri/nouveau/nouveau_context.c index b1b0e816431..be57d48b8dd 100644 --- a/src/mesa/drivers/dri/nouveau/nouveau_context.c +++ b/src/mesa/drivers/dri/nouveau/nouveau_context.c @@ -43,18 +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_EXT_framebuffer_object", GL_EXT_framebuffer_object_functions }, { "GL_ARB_multitexture", NULL }, - { "GL_EXT_texture_lod_bias", NULL }, - { "GL_SGIS_generate_mipmap", 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_ARB_texture_mirrored_repeat", NULL }, { "GL_EXT_fog_coord", GL_EXT_fog_coord_functions }, + { "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 } }; @@ -64,8 +69,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 @@ -168,19 +173,19 @@ nouveau_context_destroy(__DRIcontext *dri_ctx) context_drv(ctx)->context_destroy(ctx); } -static void -nouveau_update_renderbuffers(__DRIcontext *context, __DRIdrawable *drawable, - unsigned int *stamp) +void +nouveau_update_renderbuffers(__DRIcontext *dri_ctx, __DRIdrawable *draw) { - struct nouveau_context *nctx = context->driverPrivate; - GLcontext *ctx = &nctx->base; - __DRIscreen *screen = context->driScreenPriv; - struct gl_framebuffer *fb = drawable->driverPrivate; + GLcontext *ctx = dri_ctx->driverPrivate; + __DRIscreen *screen = dri_ctx->driScreenPriv; + struct gl_framebuffer *fb = draw->driverPrivate; unsigned int attachments[10]; __DRIbuffer *buffers = NULL; int i = 0, count, ret; - *stamp = *drawable->pStamp; + if (draw->lastStamp == *draw->pStamp) + return; + draw->lastStamp = *draw->pStamp; attachments[i++] = __DRI_BUFFER_FRONT_LEFT; if (fb->Visual.doubleBufferMode) @@ -192,10 +197,9 @@ nouveau_update_renderbuffers(__DRIcontext *context, __DRIdrawable *drawable, else if (fb->Visual.haveStencilBuffer) attachments[i++] = __DRI_BUFFER_STENCIL; - buffers = (*screen->dri2.loader->getBuffers)(drawable, - &drawable->w, &drawable->h, + buffers = (*screen->dri2.loader->getBuffers)(draw, &draw->w, &draw->h, attachments, i, &count, - drawable->loaderPrivate); + draw->loaderPrivate); if (buffers == NULL) return; @@ -227,8 +231,8 @@ nouveau_update_renderbuffers(__DRIcontext *context, __DRIdrawable *drawable, rb = fb->Attachment[index].Renderbuffer; s = &to_nouveau_renderbuffer(rb)->surface; - s->width = drawable->w; - s->height = drawable->h; + s->width = draw->w; + s->height = draw->h; s->pitch = buffers[i].pitch; s->cpp = buffers[i].cpp; @@ -244,12 +248,25 @@ nouveau_update_renderbuffers(__DRIcontext *context, __DRIdrawable *drawable, ret = nouveau_bo_handle_ref(context_dev(ctx), buffers[i].name, &s->bo); assert(!ret); - - context_dirty(ctx, FRAMEBUFFER); } } - _mesa_resize_framebuffer(ctx, fb, drawable->w, drawable->h); + _mesa_resize_framebuffer(NULL, fb, draw->w, draw->h); +} + +static void +update_framebuffer(__DRIcontext *dri_ctx, __DRIdrawable *draw, + int *stamp) +{ + GLcontext *ctx = dri_ctx->driverPrivate; + struct gl_framebuffer *fb = draw->driverPrivate; + + *stamp = *draw->pStamp; + + nouveau_update_renderbuffers(dri_ctx, draw); + _mesa_resize_framebuffer(ctx, fb, draw->w, draw->h); + + context_dirty(ctx, FRAMEBUFFER); } GLboolean @@ -260,16 +277,15 @@ nouveau_context_make_current(__DRIcontext *dri_ctx, __DRIdrawable *dri_draw, struct nouveau_context *nctx = dri_ctx->driverPrivate; GLcontext *ctx = &nctx->base; - if (dri_draw->driverPrivate == ctx->WinSysDrawBuffer && - dri_read->driverPrivate == ctx->WinSysReadBuffer) - return GL_TRUE; - /* Ask the X server for new renderbuffers. */ - nouveau_update_renderbuffers(dri_ctx, dri_draw, - &nctx->drawable.d_stamp); - if (dri_draw != dri_read) - nouveau_update_renderbuffers(dri_ctx, dri_read, - &nctx->drawable.r_stamp); + if (dri_draw->driverPrivate != ctx->WinSysDrawBuffer) + update_framebuffer(dri_ctx, dri_draw, + &dri_ctx->dri2.draw_stamp); + + if (dri_draw != dri_read && + dri_read->driverPrivate != ctx->WinSysReadBuffer) + update_framebuffer(dri_ctx, dri_read, + &dri_ctx->dri2.read_stamp); /* Pass it down to mesa. */ _mesa_make_current(ctx, dri_draw->driverPrivate, @@ -307,30 +323,20 @@ nouveau_fallback(GLcontext *ctx, enum nouveau_fallback mode) void nouveau_validate_framebuffer(GLcontext *ctx) { - struct nouveau_context *nctx = to_nouveau_context(ctx); __DRIcontext *dri_ctx = to_nouveau_context(ctx)->dri_context; __DRIdrawable *dri_draw = dri_ctx->driDrawablePriv; __DRIdrawable *dri_read = dri_ctx->driReadablePriv; - if ((ctx->DrawBuffer->Name == 0 && - nctx->drawable.d_stamp != *dri_draw->pStamp) || - (dri_draw != dri_read && - ctx->ReadBuffer->Name == 0 && - nctx->drawable.r_stamp != *dri_read->pStamp)) { - if (nctx->drawable.dirty) - ctx->Driver.Flush(ctx); + if (ctx->DrawBuffer->Name == 0 && + dri_ctx->dri2.draw_stamp != *dri_draw->pStamp) + update_framebuffer(dri_ctx, dri_draw, + &dri_ctx->dri2.draw_stamp); - /* Ask the X server for new renderbuffers. */ - nouveau_update_renderbuffers(dri_ctx, dri_draw, - &nctx->drawable.d_stamp); - if (dri_draw != dri_read) - nouveau_update_renderbuffers(dri_ctx, dri_read, - &nctx->drawable.r_stamp); - - if (nouveau_next_dirty_state(ctx) >= 0) - FIRE_RING(context_chan(ctx)); - } + if (ctx->ReadBuffer->Name == 0 && dri_draw != dri_read && + dri_ctx->dri2.read_stamp != *dri_read->pStamp) + update_framebuffer(dri_ctx, dri_read, + &dri_ctx->dri2.read_stamp); - /* Someone's planning to draw something really soon. */ - nctx->drawable.dirty = GL_TRUE; + if (nouveau_next_dirty_state(ctx) >= 0) + 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 efe3e5148b1..fe64fec930b 100644 --- a/src/mesa/drivers/dri/nouveau/nouveau_context.h +++ b/src/mesa/drivers/dri/nouveau/nouveau_context.h @@ -56,12 +56,6 @@ struct nouveau_hw_state { struct nouveau_grobj *sifm; }; -struct nouveau_drawable_state { - GLboolean dirty; - unsigned int d_stamp; - unsigned int r_stamp; -}; - struct nouveau_context { GLcontext base; __DRIcontext *dri_context; @@ -73,7 +67,6 @@ struct nouveau_context { struct nouveau_hw_state hw; struct nouveau_bo_state bo; struct nouveau_render_state render; - struct nouveau_drawable_state drawable; }; #define to_nouveau_context(ctx) ((struct nouveau_context *)(ctx)) @@ -92,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, @@ -107,9 +102,11 @@ nouveau_context_deinit(GLcontext *ctx); void nouveau_context_destroy(__DRIcontext *dri_ctx); +void +nouveau_update_renderbuffers(__DRIcontext *dri_ctx, __DRIdrawable *draw); + GLboolean -nouveau_context_make_current(__DRIcontext *dri_ctx, - __DRIdrawable *ddraw, +nouveau_context_make_current(__DRIcontext *dri_ctx, __DRIdrawable *ddraw, __DRIdrawable *rdraw); GLboolean diff --git a/src/mesa/drivers/dri/nouveau/nouveau_driver.c b/src/mesa/drivers/dri/nouveau/nouveau_driver.c index bf0e20ca81c..1d12f43741f 100644 --- a/src/mesa/drivers/dri/nouveau/nouveau_driver.c +++ b/src/mesa/drivers/dri/nouveau/nouveau_driver.c @@ -67,8 +67,6 @@ nouveau_flush(GLcontext *ctx) dri2->flushFrontBuffer(drawable, drawable->loaderPrivate); } - - nctx->drawable.dirty = GL_FALSE; } static void @@ -112,8 +110,8 @@ nouveau_clear(GLcontext *ctx, GLbitfield buffers) mask = pack_zs_i(s->format, (buffers & BUFFER_BIT_DEPTH && ctx->Depth.Mask) ? ~0 : 0, - (buffers & BUFFER_BIT_STENCIL && - ctx->Stencil.WriteMask[0]) ? ~0 : 0); + (buffers & BUFFER_BIT_STENCIL ? + ctx->Stencil.WriteMask[0] : 0)); value = pack_zs_f(s->format, ctx->Depth.Clear, ctx->Stencil.Clear); diff --git a/src/mesa/drivers/dri/nouveau/nouveau_fbo.c b/src/mesa/drivers/dri/nouveau/nouveau_fbo.c index 91eade8d633..2ec3dc92420 100644 --- a/src/mesa/drivers/dri/nouveau/nouveau_fbo.c +++ b/src/mesa/drivers/dri/nouveau/nouveau_fbo.c @@ -70,9 +70,9 @@ set_renderbuffer_format(struct gl_renderbuffer *rb, GLenum internalFormat) case GL_DEPTH_COMPONENT24: case GL_STENCIL_INDEX8_EXT: case GL_DEPTH24_STENCIL8_EXT: - rb->_BaseFormat = GL_DEPTH_COMPONENT; + rb->_BaseFormat = GL_DEPTH_STENCIL; rb->Format = MESA_FORMAT_Z24_S8; - rb->DataType = GL_UNSIGNED_INT; + rb->DataType = GL_UNSIGNED_INT_24_8_EXT; s->cpp = 4; break; default: @@ -142,7 +142,6 @@ nouveau_renderbuffer_dri_storage(GLcontext *ctx, struct gl_renderbuffer *rb, rb->Width = width; rb->Height = height; - context_dirty(ctx, FRAMEBUFFER); return GL_TRUE; } @@ -216,6 +215,8 @@ get_tex_format(struct gl_texture_image *ti) switch (ti->TexFormat) { case MESA_FORMAT_ARGB8888: return GL_RGBA8; + case MESA_FORMAT_XRGB8888: + return GL_RGB8; case MESA_FORMAT_RGB565: return GL_RGB5; default: diff --git a/src/mesa/drivers/dri/nouveau/nouveau_screen.c b/src/mesa/drivers/dri/nouveau/nouveau_screen.c index 71e57e17e67..18db12f6261 100644 --- a/src/mesa/drivers/dri/nouveau/nouveau_screen.c +++ b/src/mesa/drivers/dri/nouveau/nouveau_screen.c @@ -27,6 +27,7 @@ #include "nouveau_driver.h" #include "nouveau_context.h" #include "nouveau_fbo.h" +#include "nouveau_texture.h" #include "nouveau_drmif.h" #include "nv04_driver.h" #include "nv10_driver.h" @@ -226,8 +227,15 @@ static const struct __DRI2flushExtensionRec nouveau_flush_extension = { dri2InvalidateDrawable, }; +static const struct __DRItexBufferExtensionRec nouveau_texbuffer_extension = { + { __DRI_TEX_BUFFER, __DRI_TEX_BUFFER_VERSION }, + NULL, + nouveau_set_texbuffer, +}; + static const __DRIextension *nouveau_screen_extensions[] = { &nouveau_flush_extension.base, + &nouveau_texbuffer_extension.base, NULL }; diff --git a/src/mesa/drivers/dri/nouveau/nouveau_span.c b/src/mesa/drivers/dri/nouveau/nouveau_span.c index dbbbf15b096..f1a56dd03af 100644 --- a/src/mesa/drivers/dri/nouveau/nouveau_span.c +++ b/src/mesa/drivers/dri/nouveau/nouveau_span.c @@ -61,6 +61,15 @@ #include "spantmp2.h" +/* RGB888 span functions */ +#define SPANTMP_PIXEL_FMT GL_BGR +#define SPANTMP_PIXEL_TYPE GL_UNSIGNED_INT_8_8_8_8_REV +#define TAG(x) nouveau_##x##_rgb888 +#define TAG2(x, y) nouveau_##x##_rgb888##y +#define GET_PTR(x, y) (s->bo->map + (y)*s->pitch + (x)*s->cpp) + +#include "spantmp2.h" + /* ARGB8888 span functions */ #define SPANTMP_PIXEL_FMT GL_BGRA #define SPANTMP_PIXEL_TYPE GL_UNSIGNED_INT_8_8_8_8_REV @@ -101,6 +110,8 @@ renderbuffer_map_unmap(struct gl_renderbuffer *rb, GLboolean map) nouveau_InitPointers_rgb565(rb); break; case MESA_FORMAT_XRGB8888: + nouveau_InitPointers_rgb888(rb); + break; case MESA_FORMAT_ARGB8888: nouveau_InitPointers_argb8888(rb); break; diff --git a/src/mesa/drivers/dri/nouveau/nouveau_state.c b/src/mesa/drivers/dri/nouveau/nouveau_state.c index d7278221754..bc610451b40 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); @@ -243,12 +244,6 @@ nouveau_fog(GLcontext *ctx, GLenum pname, const GLfloat *params) } static void -nouveau_index_mask(GLcontext *ctx, GLuint mask) -{ - context_dirty(ctx, INDEX_MASK); -} - -static void nouveau_light(GLcontext *ctx, GLenum light, GLenum pname, const GLfloat *params) { switch (pname) { @@ -396,7 +391,6 @@ nouveau_tex_parameter(GLcontext *ctx, GLenum target, const GLfloat *params) { switch (pname) { - case GL_TEXTURE_MIN_FILTER: case GL_TEXTURE_MAG_FILTER: case GL_TEXTURE_WRAP_S: case GL_TEXTURE_WRAP_T: @@ -408,9 +402,10 @@ nouveau_tex_parameter(GLcontext *ctx, GLenum target, context_dirty_i(ctx, TEX_OBJ, ctx->Texture.CurrentUnit); break; + case GL_TEXTURE_MIN_FILTER: case GL_TEXTURE_BASE_LEVEL: case GL_TEXTURE_MAX_LEVEL: - texture_dirty(t); + nouveau_texture_reallocate(ctx, t); context_dirty_i(ctx, TEX_OBJ, ctx->Texture.CurrentUnit); break; } @@ -504,7 +499,6 @@ nouveau_state_init(GLcontext *ctx) ctx->Driver.DrawBuffers = nouveau_draw_buffers; ctx->Driver.Enable = nouveau_enable; ctx->Driver.Fogfv = nouveau_fog; - ctx->Driver.IndexMask = nouveau_index_mask; ctx->Driver.Lightfv = nouveau_light; ctx->Driver.LightModelfv = nouveau_light_model; ctx->Driver.LineStipple = nouveau_line_stipple; diff --git a/src/mesa/drivers/dri/nouveau/nouveau_state.h b/src/mesa/drivers/dri/nouveau/nouveau_state.h index d001fa259aa..d01d962c9f2 100644 --- a/src/mesa/drivers/dri/nouveau/nouveau_state.h +++ b/src/mesa/drivers/dri/nouveau/nouveau_state.h @@ -47,7 +47,6 @@ enum { NOUVEAU_STATE_FRAG, NOUVEAU_STATE_FRAMEBUFFER, NOUVEAU_STATE_FOG, - NOUVEAU_STATE_INDEX_MASK, NOUVEAU_STATE_LIGHT_ENABLE, NOUVEAU_STATE_LIGHT_MODEL, NOUVEAU_STATE_LIGHT_SOURCE0, diff --git a/src/mesa/drivers/dri/nouveau/nouveau_texture.c b/src/mesa/drivers/dri/nouveau/nouveau_texture.c index ab6e93cceb4..bf365bfca34 100644 --- a/src/mesa/drivers/dri/nouveau/nouveau_texture.c +++ b/src/mesa/drivers/dri/nouveau/nouveau_texture.c @@ -27,6 +27,7 @@ #include "nouveau_driver.h" #include "nouveau_context.h" #include "nouveau_texture.h" +#include "nouveau_fbo.h" #include "nouveau_util.h" #include "main/texobj.h" @@ -36,6 +37,7 @@ #include "main/texgetimage.h" #include "main/mipmap.h" #include "main/texfetch.h" +#include "main/teximage.h" static struct gl_texture_object * nouveau_texture_new(GLcontext *ctx, GLuint name, GLenum target) @@ -81,10 +83,12 @@ nouveau_teximage_map(GLcontext *ctx, struct gl_texture_image *ti) struct nouveau_surface *s = &to_nouveau_teximage(ti)->surface; int ret; - ret = nouveau_bo_map(s->bo, NOUVEAU_BO_RDWR); - assert(!ret); + if (s->bo) { + ret = nouveau_bo_map(s->bo, NOUVEAU_BO_RDWR); + assert(!ret); - ti->Data = s->bo->map; + ti->Data = s->bo->map; + } } static void @@ -92,7 +96,8 @@ nouveau_teximage_unmap(GLcontext *ctx, struct gl_texture_image *ti) { struct nouveau_surface *s = &to_nouveau_teximage(ti)->surface; - nouveau_bo_unmap(s->bo); + if (s->bo) + nouveau_bo_unmap(s->bo); ti->Data = NULL; } @@ -103,43 +108,28 @@ nouveau_choose_tex_format(GLcontext *ctx, GLint internalFormat, switch (internalFormat) { case 4: case GL_RGBA: - case GL_RGB10_A2: + case GL_RGBA2: + case GL_RGBA4: + case GL_RGBA8: case GL_RGBA12: case GL_RGBA16: - case GL_RGBA8: + case GL_RGB10_A2: + return MESA_FORMAT_ARGB8888; + case GL_RGB5_A1: + return MESA_FORMAT_ARGB1555; + case GL_RGB: case GL_RGB8: case GL_RGB10: case GL_RGB12: case GL_RGB16: - return MESA_FORMAT_ARGB8888; - case GL_RGB5_A1: - return MESA_FORMAT_ARGB1555; - case GL_RGBA2: - case GL_RGBA4: - return MESA_FORMAT_ARGB4444; - + return MESA_FORMAT_XRGB8888; case 3: case GL_R3_G3_B2: case GL_RGB4: case GL_RGB5: return MESA_FORMAT_RGB565; - case GL_ALPHA: - case GL_ALPHA4: - case GL_ALPHA12: - case GL_ALPHA16: - case GL_ALPHA8: - return MESA_FORMAT_A8; - - case 1: - case GL_LUMINANCE: - case GL_LUMINANCE4: - case GL_LUMINANCE12: - case GL_LUMINANCE16: - case GL_LUMINANCE8: - return MESA_FORMAT_L8; - case 2: case GL_LUMINANCE_ALPHA: case GL_LUMINANCE4_ALPHA4: @@ -150,12 +140,27 @@ nouveau_choose_tex_format(GLcontext *ctx, GLint internalFormat, case GL_LUMINANCE8_ALPHA8: return MESA_FORMAT_ARGB8888; + case 1: + case GL_LUMINANCE: + case GL_LUMINANCE4: + case GL_LUMINANCE12: + case GL_LUMINANCE16: + case GL_LUMINANCE8: + return MESA_FORMAT_L8; + + case GL_ALPHA: + case GL_ALPHA4: + case GL_ALPHA12: + case GL_ALPHA16: + case GL_ALPHA8: + return MESA_FORMAT_A8; + case GL_INTENSITY: case GL_INTENSITY4: case GL_INTENSITY12: case GL_INTENSITY16: case GL_INTENSITY8: - return MESA_FORMAT_ARGB8888; + return MESA_FORMAT_I8; case GL_COLOR_INDEX: case GL_COLOR_INDEX1_EXT: @@ -171,6 +176,152 @@ nouveau_choose_tex_format(GLcontext *ctx, GLint internalFormat, } } +static GLboolean +teximage_fits(struct gl_texture_object *t, int level, + struct gl_texture_image *ti) +{ + struct nouveau_surface *s = &to_nouveau_texture(t)->surfaces[level]; + + return t->Target == GL_TEXTURE_RECTANGLE || + (s->bo && s->width == ti->Width && + s->height == ti->Height && + s->format == ti->TexFormat); +} + +static GLboolean +validate_teximage(GLcontext *ctx, struct gl_texture_object *t, + int level, int x, int y, int z, + int width, int height, int depth) +{ + struct gl_texture_image *ti = t->Image[0][level]; + + if (ti && teximage_fits(t, level, ti)) { + struct nouveau_surface *ss = to_nouveau_texture(t)->surfaces; + struct nouveau_surface *s = &to_nouveau_teximage(ti)->surface; + + if (t->Target == GL_TEXTURE_RECTANGLE) + nouveau_surface_ref(s, &ss[level]); + else + context_drv(ctx)->surface_copy(ctx, &ss[level], s, + x, y, x, y, + width, height); + + return GL_TRUE; + } + + return GL_FALSE; +} + +static int +get_last_level(struct gl_texture_object *t) +{ + struct gl_texture_image *base = t->Image[0][t->BaseLevel]; + + if (t->MinFilter == GL_NEAREST || + t->MinFilter == GL_LINEAR || !base) + return t->BaseLevel; + else + return MIN2(t->BaseLevel + base->MaxLog2, t->MaxLevel); +} + +static void +relayout_texture(GLcontext *ctx, struct gl_texture_object *t) +{ + struct gl_texture_image *base = t->Image[0][t->BaseLevel]; + + if (base && t->Target != GL_TEXTURE_RECTANGLE) { + struct nouveau_surface *ss = to_nouveau_texture(t)->surfaces; + struct nouveau_surface *s = &to_nouveau_teximage(base)->surface; + int i, ret, last = get_last_level(t); + unsigned size, offset = 0, + width = s->width, + height = s->height; + + /* Deallocate the old storage. */ + for (i = 0; i < MAX_TEXTURE_LEVELS; i++) + nouveau_bo_ref(NULL, &ss[i].bo); + + /* Relayout the mipmap tree. */ + for (i = t->BaseLevel; i <= last; i++) { + size = width * height * s->cpp; + + /* Images larger than 16B have to be aligned. */ + if (size > 16) + offset = align(offset, 64); + + ss[i] = (struct nouveau_surface) { + .offset = offset, + .layout = SWIZZLED, + .format = s->format, + .width = width, + .height = height, + .cpp = s->cpp, + .pitch = width * s->cpp, + }; + + offset += size; + width = MAX2(1, width / 2); + height = MAX2(1, height / 2); + } + + /* Get new storage. */ + size = align(offset, 64); + + ret = nouveau_bo_new(context_dev(ctx), NOUVEAU_BO_MAP | + NOUVEAU_BO_GART | NOUVEAU_BO_VRAM, + 0, size, &ss[last].bo); + assert(!ret); + + for (i = t->BaseLevel; i < last; i++) + nouveau_bo_ref(ss[last].bo, &ss[i].bo); + } +} + +GLboolean +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) + return GL_FALSE; + + if (nt->dirty) { + nt->dirty = GL_FALSE; + + /* Copy the teximages to the actual miptree. */ + for (i = t->BaseLevel; i <= last; i++) { + struct nouveau_surface *s = &nt->surfaces[i]; + + validate_teximage(ctx, t, i, 0, 0, 0, + s->width, s->height, 1); + } + } + + return GL_TRUE; +} + +void +nouveau_texture_reallocate(GLcontext *ctx, struct gl_texture_object *t) +{ + texture_dirty(t); + relayout_texture(ctx, t); + nouveau_texture_validate(ctx, t); +} + +static unsigned +get_teximage_placement(struct gl_texture_image *ti) +{ + if (ti->TexFormat == MESA_FORMAT_A8 || + ti->TexFormat == MESA_FORMAT_L8 || + ti->TexFormat == MESA_FORMAT_I8) + /* 1 cpp formats will have to be swizzled by the CPU, + * so leave them in system RAM for now. */ + return NOUVEAU_BO_MAP; + else + return NOUVEAU_BO_GART | NOUVEAU_BO_MAP; +} + static void nouveau_teximage(GLcontext *ctx, GLint dims, GLenum target, GLint level, GLint internalFormat, @@ -181,37 +332,45 @@ nouveau_teximage(GLcontext *ctx, GLint dims, GLenum target, GLint level, struct gl_texture_image *ti) { struct nouveau_surface *s = &to_nouveau_teximage(ti)->surface; - unsigned bo_flags = NOUVEAU_BO_GART | NOUVEAU_BO_RDWR | NOUVEAU_BO_MAP; int ret; /* Allocate a new bo for the image. */ - nouveau_surface_alloc(ctx, s, LINEAR, bo_flags, ti->TexFormat, - width, height); + nouveau_surface_alloc(ctx, s, LINEAR, get_teximage_placement(ti), + ti->TexFormat, width, height); ti->RowStride = s->pitch / s->cpp; pixels = _mesa_validate_pbo_teximage(ctx, dims, width, height, depth, format, type, pixels, packing, "glTexImage"); - if (!pixels) - return; - - /* Store the pixel data. */ - nouveau_teximage_map(ctx, ti); - - ret = _mesa_texstore(ctx, dims, ti->_BaseFormat, - ti->TexFormat, ti->Data, - 0, 0, 0, s->pitch, - ti->ImageOffsets, - width, height, depth, - format, type, pixels, packing); - assert(ret); + if (pixels) { + /* Store the pixel data. */ + nouveau_teximage_map(ctx, ti); + + ret = _mesa_texstore(ctx, dims, ti->_BaseFormat, + ti->TexFormat, ti->Data, + 0, 0, 0, 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 (!validate_teximage(ctx, t, level, 0, 0, 0, + width, height, depth)) + /* It doesn't fit, mark it as dirty. */ + texture_dirty(t); + } - nouveau_teximage_unmap(ctx, ti); - _mesa_unmap_teximage_pbo(ctx, packing); + if (level == t->BaseLevel) { + if (!teximage_fits(t, level, ti)) + relayout_texture(ctx, t); + nouveau_texture_validate(ctx, t); + } context_dirty_i(ctx, TEX_OBJ, ctx->Texture.CurrentUnit); context_dirty_i(ctx, TEX_ENV, ctx->Texture.CurrentUnit); - texture_dirty(t); } static void @@ -271,8 +430,9 @@ nouveau_texsubimage_3d(GLcontext *ctx, GLenum target, GLint level, packing, t, ti); nouveau_teximage_unmap(ctx, ti); - context_dirty_i(ctx, TEX_OBJ, ctx->Texture.CurrentUnit); - texture_dirty(t); + if (!to_nouveau_texture(t)->dirty) + validate_teximage(ctx, t, level, xoffset, yoffset, zoffset, + width, height, depth); } static void @@ -290,8 +450,9 @@ nouveau_texsubimage_2d(GLcontext *ctx, GLenum target, GLint level, packing, t, ti); nouveau_teximage_unmap(ctx, ti); - context_dirty_i(ctx, TEX_OBJ, ctx->Texture.CurrentUnit); - texture_dirty(t); + if (!to_nouveau_texture(t)->dirty) + validate_teximage(ctx, t, level, xoffset, yoffset, 0, + width, height, 1); } static void @@ -308,8 +469,9 @@ nouveau_texsubimage_1d(GLcontext *ctx, GLenum target, GLint level, packing, t, ti); nouveau_teximage_unmap(ctx, ti); - context_dirty_i(ctx, TEX_OBJ, ctx->Texture.CurrentUnit); - texture_dirty(t); + if (!to_nouveau_texture(t)->dirty) + validate_teximage(ctx, t, level, xoffset, 0, 0, + width, 1, 1); } static void @@ -332,6 +494,57 @@ nouveau_bind_texture(GLcontext *ctx, GLenum target, context_dirty_i(ctx, TEX_ENV, ctx->Texture.CurrentUnit); } +static gl_format +get_texbuffer_format(struct gl_renderbuffer *rb, GLint format) +{ + struct nouveau_surface *s = &to_nouveau_renderbuffer(rb)->surface; + + if (s->cpp < 4) + return s->format; + else if (format == __DRI_TEXTURE_FORMAT_RGBA) + return MESA_FORMAT_ARGB8888; + else + return MESA_FORMAT_XRGB8888; +} + +void +nouveau_set_texbuffer(__DRIcontext *dri_ctx, + GLint target, GLint format, + __DRIdrawable *draw) +{ + struct nouveau_context *nctx = dri_ctx->driverPrivate; + GLcontext *ctx = &nctx->base; + struct gl_framebuffer *fb = draw->driverPrivate; + struct gl_renderbuffer *rb = + fb->Attachment[BUFFER_FRONT_LEFT].Renderbuffer; + struct gl_texture_object *t = _mesa_get_current_tex_object(ctx, target); + struct gl_texture_image *ti; + struct nouveau_surface *s; + + _mesa_lock_texture(ctx, t); + ti = _mesa_get_tex_image(ctx, t, target, 0); + s = &to_nouveau_teximage(ti)->surface; + + /* Update the texture surface with the given drawable. */ + nouveau_update_renderbuffers(dri_ctx, draw); + nouveau_surface_ref(&to_nouveau_renderbuffer(rb)->surface, s); + + /* Update the image fields. */ + _mesa_init_teximage_fields(ctx, target, ti, s->width, s->height, + 1, 0, s->cpp); + ti->RowStride = s->pitch / s->cpp; + ti->TexFormat = s->format = get_texbuffer_format(rb, format); + + /* Try to validate it. */ + if (!validate_teximage(ctx, t, 0, 0, 0, 0, s->width, s->height, 1)) + nouveau_texture_reallocate(ctx, t); + + context_dirty_i(ctx, TEX_OBJ, ctx->Texture.CurrentUnit); + context_dirty_i(ctx, TEX_ENV, ctx->Texture.CurrentUnit); + + _mesa_unlock_texture(ctx, t); +} + static void nouveau_texture_map(GLcontext *ctx, struct gl_texture_object *t) { @@ -354,87 +567,6 @@ nouveau_texture_unmap(GLcontext *ctx, struct gl_texture_object *t) } } -static void -relayout_miptree(GLcontext *ctx, struct gl_texture_object *t) -{ - struct nouveau_surface *ss = to_nouveau_texture(t)->surfaces; - unsigned last_level, offset = 0; - unsigned size; - int i, ret; - - if (t->MinFilter == GL_NEAREST || - t->MinFilter == GL_LINEAR) - last_level = t->BaseLevel; - else - last_level = t->_MaxLevel; - - /* Deallocate the old storage. */ - for (i = 0; i < MAX_TEXTURE_LEVELS; i++) - nouveau_bo_ref(NULL, &ss[i].bo); - - /* Relayout the mipmap tree. */ - for (i = t->BaseLevel; i <= last_level; i++) { - struct nouveau_surface *s = - &to_nouveau_teximage(t->Image[0][i])->surface; - - size = s->width * s->height * s->cpp; - - /* Images larger than 16B have to be aligned. */ - if (size > 16) - offset = align(offset, 64); - - ss[i] = (struct nouveau_surface) { - .offset = offset, - .layout = SWIZZLED, - .format = s->format, - .width = s->width, - .height = s->height, - .cpp = s->cpp, - .pitch = s->width * s->cpp, - }; - - offset += size; - } - - /* Get new storage. */ - size = align(offset, 64); - - ret = nouveau_bo_new(context_dev(ctx), - NOUVEAU_BO_GART | NOUVEAU_BO_VRAM, - 0, size, &ss[last_level].bo); - assert(!ret); - - for (i = t->BaseLevel; i < last_level; i++) - nouveau_bo_ref(ss[last_level].bo, &ss[i].bo); -} - -void -nouveau_texture_validate(GLcontext *ctx, struct gl_texture_object *t) -{ - struct nouveau_texture *nt = to_nouveau_texture(t); - int i; - - if (!nt->dirty) - return; - - nt->dirty = GL_FALSE; - - relayout_miptree(ctx, t); - - /* Copy the teximages to the actual swizzled miptree. */ - for (i = t->BaseLevel; i < MAX_TEXTURE_LEVELS; i++) { - struct gl_texture_image *ti = t->Image[0][i]; - struct nouveau_surface *s = &to_nouveau_teximage(ti)->surface; - - if (!nt->surfaces[i].bo) - break; - - context_drv(ctx)->surface_copy(ctx, &nt->surfaces[i], s, - 0, 0, 0, 0, - s->width, s->height); - } -} - void nouveau_texture_functions_init(struct dd_function_table *functions) { diff --git a/src/mesa/drivers/dri/nouveau/nouveau_texture.h b/src/mesa/drivers/dri/nouveau/nouveau_texture.h index 695c0897b59..b91facbdeb6 100644 --- a/src/mesa/drivers/dri/nouveau/nouveau_texture.h +++ b/src/mesa/drivers/dri/nouveau/nouveau_texture.h @@ -44,6 +44,14 @@ struct nouveau_texture { to_nouveau_texture(t)->dirty = GL_TRUE; void +nouveau_set_texbuffer(__DRIcontext *dri_ctx, + GLint target, GLint format, + __DRIdrawable *draw); + +GLboolean nouveau_texture_validate(GLcontext *ctx, struct gl_texture_object *t); +void +nouveau_texture_reallocate(GLcontext *ctx, struct gl_texture_object *t); + #endif diff --git a/src/mesa/drivers/dri/nouveau/nouveau_util.h b/src/mesa/drivers/dri/nouveau/nouveau_util.h index 076f225fedc..d6007aba2b9 100644 --- a/src/mesa/drivers/dri/nouveau/nouveau_util.h +++ b/src/mesa/drivers/dri/nouveau/nouveau_util.h @@ -173,4 +173,22 @@ OUT_RINGm(struct nouveau_channel *chan, float m[16]) OUT_RINGf(chan, m[4*j + i]); } +static inline GLboolean +is_color_operand(int op) +{ + return op == GL_SRC_COLOR || op == GL_ONE_MINUS_SRC_COLOR; +} + +static inline GLboolean +is_negative_operand(int op) +{ + return op == GL_ONE_MINUS_SRC_COLOR || op == GL_ONE_MINUS_SRC_ALPHA; +} + +static inline GLboolean +is_texture_source(int s) +{ + return s == GL_TEXTURE || (s >= GL_TEXTURE0 && s <= GL_TEXTURE31); +} + #endif diff --git a/src/mesa/drivers/dri/nouveau/nouveau_vbo_t.c b/src/mesa/drivers/dri/nouveau/nouveau_vbo_t.c index 02c85807608..a365b977f29 100644 --- a/src/mesa/drivers/dri/nouveau/nouveau_vbo_t.c +++ b/src/mesa/drivers/dri/nouveau/nouveau_vbo_t.c @@ -24,8 +24,11 @@ * */ -#include "main/bufferobj.h" #include "nouveau_bufferobj.h" +#include "nouveau_util.h" + +#include "main/bufferobj.h" +#include "main/image.h" /* Arbitrary pushbuf length we can assume we can get with a single * WAIT_RING. */ @@ -58,7 +61,11 @@ vbo_init_array(struct nouveau_array_state *a, int attr, int stride, } else { nouveau_bo_ref(NULL, &a->bo); a->offset = 0; - a->buf = ptr; + + if (map) + a->buf = ptr; + else + a->buf = NULL; } if (a->buf) @@ -94,11 +101,20 @@ 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, - array->StrideB, array->Size, - array->Type, array->BufferObj, - array->Ptr, render->mode == IMM); + stride, array->Size, array->Type, + array->BufferObj, array->Ptr, + render->mode == IMM); } } } @@ -227,6 +243,23 @@ 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) +{ + 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); + } + + return s; +} + static void TAG(vbo_render_prims)(GLcontext *ctx, const struct gl_client_array **arrays, const struct _mesa_prim *prims, GLuint nr_prims, @@ -241,12 +274,20 @@ vbo_maybe_split(GLcontext *ctx, const struct gl_client_array **arrays, GLuint min_index, GLuint max_index) { 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, vert_avail = get_max_vertices(ctx, NULL, pushbuf_avail), idx_avail = get_max_vertices(ctx, ib, pushbuf_avail); + int stride; - if ((ib && ib->count > idx_avail) || - (!ib && max_index - min_index > vert_avail)) { + /* Try to keep client buffers smaller than the scratch BOs. */ + if (render->mode == VBO && + (stride = get_max_client_stride(ctx))) + vert_avail = MIN2(vert_avail, + RENDER_SCRATCH_SIZE / stride); + + if (max_index - min_index > vert_avail || + (ib && ib->count > idx_avail)) { struct split_limits limits = { .max_verts = vert_avail, .max_indices = idx_avail, @@ -276,17 +317,21 @@ vbo_bind_vertices(GLcontext *ctx, const struct gl_client_array **arrays, if (attr >= 0) { const struct gl_client_array *array = arrays[attr]; struct nouveau_array_state *a = &render->attrs[attr]; - unsigned delta = (basevertex + min_index) * a->stride, - size = (max_index - min_index + 1) * a->stride; + unsigned delta = (basevertex + min_index) + * array->StrideB; if (a->bo) { a->offset = (intptr_t)array->Ptr + delta; } else { - void *scratch = get_scratch_vbo(ctx, size, - &a->bo, - &a->offset); - - memcpy(scratch, a->buf + delta, size); + int j, n = max_index - min_index + 1; + char *sp = (char *)array->Ptr + delta; + char *dp = get_scratch_vbo(ctx, n * a->stride, + &a->bo, &a->offset); + + for (j = 0; j < n; j++) + memcpy(dp + j * a->stride, + sp + j * array->StrideB, + a->stride); } } } diff --git a/src/mesa/drivers/dri/nouveau/nv04_context.c b/src/mesa/drivers/dri/nouveau/nv04_context.c index 1056171342c..3624b3af921 100644 --- a/src/mesa/drivers/dri/nouveau/nv04_context.c +++ b/src/mesa/drivers/dri/nouveau/nv04_context.c @@ -40,6 +40,7 @@ nv04_context_engine(GLcontext *ctx) if (ctx->Texture.Unit[0].EnvMode == GL_COMBINE || ctx->Texture.Unit[0].EnvMode == GL_BLEND || + ctx->Texture.Unit[0].EnvMode == GL_ADD || ctx->Texture.Unit[1]._ReallyEnabled || ctx->Stencil.Enabled) fahrenheit = hw->eng3dm; @@ -74,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); - - nouveau_state_emit(ctx); + 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_bo_state_emit(ctx); } } @@ -199,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; @@ -264,7 +263,6 @@ const struct nouveau_driver nv04_driver = { nouveau_emit_nothing, nouveau_emit_nothing, nouveau_emit_nothing, - nouveau_emit_nothing, nv04_emit_scissor, nv04_defer_blend, nv04_defer_control, diff --git a/src/mesa/drivers/dri/nouveau/nv04_state_fb.c b/src/mesa/drivers/dri/nouveau/nv04_state_fb.c index aad1e491d2f..5e5e0c58742 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_frag.c b/src/mesa/drivers/dri/nouveau/nv04_state_frag.c index 34ee2962023..d7c86d4178d 100644 --- a/src/mesa/drivers/dri/nouveau/nv04_state_frag.c +++ b/src/mesa/drivers/dri/nouveau/nv04_state_frag.c @@ -41,6 +41,7 @@ NV04_MULTITEX_TRIANGLE_COMBINE_COLOR_ALPHA0 struct combiner_state { + GLcontext *ctx; int unit; GLboolean alpha; @@ -59,11 +60,12 @@ struct combiner_state { /* Initialize a combiner_state struct from the texture unit * context. */ -#define INIT_COMBINER(chan, rc, i) do { \ +#define INIT_COMBINER(chan, ctx, rc, i) do { \ struct gl_tex_env_combine_state *c = \ ctx->Texture.Unit[i]._CurrentCombine; \ - (rc)->alpha = __INIT_COMBINER_ALPHA_##chan; \ + (rc)->ctx = ctx; \ (rc)->unit = i; \ + (rc)->alpha = __INIT_COMBINER_ALPHA_##chan; \ (rc)->mode = c->Mode##chan; \ (rc)->source = c->Source##chan; \ (rc)->operand = c->Operand##chan; \ @@ -72,11 +74,11 @@ struct combiner_state { } while (0) /* Get the combiner source for the specified EXT_texture_env_combine - * argument. */ + * source. */ static uint32_t -get_arg_source(struct combiner_state *rc, int arg) +get_input_source(struct combiner_state *rc, int source) { - switch (rc->source[arg]) { + switch (source) { case GL_TEXTURE: return rc->unit ? COMBINER_SOURCE(TEXTURE1) : COMBINER_SOURCE(TEXTURE0); @@ -103,38 +105,53 @@ get_arg_source(struct combiner_state *rc, int arg) } /* Get the (possibly inverted) combiner input mapping for the - * specified argument. */ + * specified EXT_texture_env_combine operand. */ #define INVERT 0x1 static uint32_t -get_arg_mapping(struct combiner_state *rc, int arg, int flags) +get_input_mapping(struct combiner_state *rc, int operand, int flags) { int map = 0; - switch (rc->operand[arg]) { - case GL_SRC_COLOR: - case GL_ONE_MINUS_SRC_COLOR: - break; + if (!is_color_operand(operand) && !rc->alpha) + map |= COMBINER_ALPHA; - case GL_SRC_ALPHA: - case GL_ONE_MINUS_SRC_ALPHA: - map |= rc->alpha ? 0 : COMBINER_ALPHA; - break; - } + if (is_negative_operand(operand) == !(flags & INVERT)) + map |= COMBINER_INVERT; - switch (rc->operand[arg]) { - case GL_SRC_COLOR: - case GL_SRC_ALPHA: - map |= flags & INVERT ? COMBINER_INVERT : 0; - break; + return map; +} - case GL_ONE_MINUS_SRC_COLOR: - case GL_ONE_MINUS_SRC_ALPHA: - map |= flags & INVERT ? 0 : COMBINER_INVERT; - break; +static uint32_t +get_input_arg(struct combiner_state *rc, int arg, int flags) +{ + int source = rc->source[arg]; + int operand = rc->operand[arg]; + + /* Fake several unsupported texture formats. */ + if (is_texture_source(source)) { + int i = (source == GL_TEXTURE ? + rc->unit : source - GL_TEXTURE0); + struct gl_texture_object *t = rc->ctx->Texture.Unit[i]._Current; + gl_format format = t->Image[0][t->BaseLevel]->TexFormat; + + if (format == MESA_FORMAT_A8) { + /* Emulated using I8. */ + if (is_color_operand(operand)) + return COMBINER_SOURCE(ZERO) | + get_input_mapping(rc, operand, flags); + + } else if (format == MESA_FORMAT_L8) { + /* Emulated using I8. */ + if (!is_color_operand(operand)) + return COMBINER_SOURCE(ZERO) | + get_input_mapping(rc, operand, + flags ^ INVERT); + } } - return map; + return get_input_source(rc, source) | + get_input_mapping(rc, operand, flags); } /* Bind the combiner input <in> to the combiner source <src>, @@ -146,8 +163,7 @@ get_arg_mapping(struct combiner_state *rc, int arg, int flags) /* Bind the combiner input <in> to the EXT_texture_env_combine * argument <arg>, possibly inverted. */ #define INPUT_ARG(rc, in, arg, flags) \ - (rc)->hw |= (get_arg_source(rc, arg) | \ - get_arg_mapping(rc, arg, flags)) << COMBINER_SHIFT(in) + (rc)->hw |= get_input_arg(rc, arg, flags) << COMBINER_SHIFT(in) #define UNSIGNED_OP(rc) \ (rc)->hw |= ((rc)->logscale ? \ @@ -222,10 +238,10 @@ nv04_emit_tex_env(GLcontext *ctx, int emit) /* Compute the new combiner state. */ if (ctx->Texture.Unit[i]._ReallyEnabled) { - INIT_COMBINER(A, &rc_a, i); + INIT_COMBINER(A, ctx, &rc_a, i); setup_combiner(&rc_a); - INIT_COMBINER(RGB, &rc_c, i); + INIT_COMBINER(RGB, ctx, &rc_c, i); setup_combiner(&rc_c); } else { diff --git a/src/mesa/drivers/dri/nouveau/nv04_state_raster.c b/src/mesa/drivers/dri/nouveau/nv04_state_raster.c index 5e3788d1854..c191571a5f8 100644 --- a/src/mesa/drivers/dri/nouveau/nv04_state_raster.c +++ b/src/mesa/drivers/dri/nouveau/nv04_state_raster.c @@ -61,12 +61,20 @@ get_stencil_op(unsigned op) switch (op) { case GL_KEEP: return 0x1; + case GL_ZERO: + return 0x2; + case GL_REPLACE: + return 0x3; case GL_INCR: return 0x4; case GL_DECR: return 0x5; case GL_INVERT: return 0x6; + case GL_INCR_WRAP: + return 0x7; + case GL_DECR_WRAP: + return 0x8; default: assert(0); } @@ -78,8 +86,6 @@ get_texenv_mode(unsigned mode) switch (mode) { case GL_REPLACE: return 0x1; - case GL_ADD: - return 0x2; case GL_DECAL: return 0x3; case GL_MODULATE: @@ -269,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; @@ -298,7 +308,14 @@ nv04_emit_blend(GLcontext *ctx, int emit) blend |= NV04_TEXTURED_TRIANGLE_BLEND_SHADE_MODE_FLAT; /* Texture environment. */ - blend |= get_texenv_mode(ctx->Texture.Unit[0].EnvMode); + if (ctx->Texture._EnabledUnits) + blend |= get_texenv_mode(ctx->Texture.Unit[0].EnvMode); + 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) diff --git a/src/mesa/drivers/dri/nouveau/nv04_state_tex.c b/src/mesa/drivers/dri/nouveau/nv04_state_tex.c index 99ea310c65f..6d8762b7d1e 100644 --- a/src/mesa/drivers/dri/nouveau/nv04_state_tex.c +++ b/src/mesa/drivers/dri/nouveau/nv04_state_tex.c @@ -38,6 +38,7 @@ get_tex_format(struct gl_texture_image *ti) switch (ti->TexFormat) { case MESA_FORMAT_A8: case MESA_FORMAT_L8: + case MESA_FORMAT_I8: return NV04_TEXTURED_TRIANGLE_FORMAT_COLOR_Y8; case MESA_FORMAT_ARGB1555: return NV04_TEXTURED_TRIANGLE_FORMAT_COLOR_A1R5G5B5; @@ -47,6 +48,8 @@ get_tex_format(struct gl_texture_image *ti) return NV04_TEXTURED_TRIANGLE_FORMAT_COLOR_R5G6B5; case MESA_FORMAT_ARGB8888: return NV04_TEXTURED_TRIANGLE_FORMAT_COLOR_A8R8G8B8; + case MESA_FORMAT_XRGB8888: + return NV04_TEXTURED_TRIANGLE_FORMAT_COLOR_X8R8G8B8; default: assert(0); } @@ -89,7 +92,9 @@ nv04_emit_tex_obj(GLcontext *ctx, int emit) struct gl_texture_image *ti = t->Image[0][t->BaseLevel]; int lod_max = 1, lod_bias = 0; - nouveau_texture_validate(ctx, t); + if (!nouveau_texture_validate(ctx, t)) + return; + s = &to_nouveau_texture(t)->surfaces[t->BaseLevel]; if (t->MinFilter != GL_NEAREST && diff --git a/src/mesa/drivers/dri/nouveau/nv04_surface.c b/src/mesa/drivers/dri/nouveau/nv04_surface.c index 86fa1dcd7a6..e3febf7d2f7 100644 --- a/src/mesa/drivers/dri/nouveau/nv04_surface.c +++ b/src/mesa/drivers/dri/nouveau/nv04_surface.c @@ -216,8 +216,8 @@ nv04_surface_copy_swizzle(GLcontext *ctx, /* If area is too large to copy in one shot we must copy it in * POT chunks to meet alignment requirements */ - assert(sub_w == w || _mesa_is_pow_two(sub_w)); - assert(sub_h == h || _mesa_is_pow_two(sub_h)); + assert(sub_w == w || _mesa_is_pow_two(w)); + assert(sub_h == h || _mesa_is_pow_two(h)); nouveau_bo_marko(bctx, sifm, NV03_SCALED_IMAGE_FROM_MEMORY_DMA_IMAGE, src->bo, bo_flags | NOUVEAU_BO_RD); @@ -239,8 +239,6 @@ nv04_surface_copy_swizzle(GLcontext *ctx, for (x = 0; x < w; x += sub_w) { sub_w = MIN2(sub_w, w - x); - /* Must be 64-byte aligned */ - assert(!(dst->offset & 63)); MARK_RING(chan, 15, 1); @@ -277,10 +275,10 @@ nv04_surface_copy_swizzle(GLcontext *ctx, static void nv04_surface_copy_m2mf(GLcontext *ctx, - struct nouveau_surface *dst, - struct nouveau_surface *src, - int dx, int dy, int sx, int sy, - int w, int h) + struct nouveau_surface *dst, + struct nouveau_surface *src, + int dx, int dy, int sx, int sy, + int w, int h) { struct nouveau_channel *chan = context_chan(ctx); struct nouveau_hw_state *hw = &to_nouveau_context(ctx)->hw; @@ -323,6 +321,82 @@ nv04_surface_copy_m2mf(GLcontext *ctx, FIRE_RING(chan); } +typedef unsigned (*get_offset_t)(struct nouveau_surface *s, + unsigned x, unsigned y); + +static unsigned +get_linear_offset(struct nouveau_surface *s, unsigned x, unsigned y) +{ + return x * s->cpp + y * s->pitch; +} + +static unsigned +get_swizzled_offset(struct nouveau_surface *s, unsigned x, unsigned y) +{ + unsigned k = log2i(MIN2(s->width, s->height)); + + unsigned u = (x & 0x001) << 0 | + (x & 0x002) << 1 | + (x & 0x004) << 2 | + (x & 0x008) << 3 | + (x & 0x010) << 4 | + (x & 0x020) << 5 | + (x & 0x040) << 6 | + (x & 0x080) << 7 | + (x & 0x100) << 8 | + (x & 0x200) << 9 | + (x & 0x400) << 10 | + (x & 0x800) << 11; + + unsigned v = (y & 0x001) << 1 | + (y & 0x002) << 2 | + (y & 0x004) << 3 | + (y & 0x008) << 4 | + (y & 0x010) << 5 | + (y & 0x020) << 6 | + (y & 0x040) << 7 | + (y & 0x080) << 8 | + (y & 0x100) << 9 | + (y & 0x200) << 10 | + (y & 0x400) << 11 | + (y & 0x800) << 12; + + return s->cpp * (((u | v) & ~(~0 << 2*k)) | + (x & (~0 << k)) << k | + (y & (~0 << k)) << k); +} + +static void +nv04_surface_copy_cpu(GLcontext *ctx, + struct nouveau_surface *dst, + struct nouveau_surface *src, + int dx, int dy, int sx, int sy, + int w, int h) +{ + int x, y; + get_offset_t get_dst = (dst->layout == SWIZZLED ? + get_swizzled_offset : get_linear_offset); + get_offset_t get_src = (src->layout == SWIZZLED ? + get_swizzled_offset : get_linear_offset); + void *dp, *sp; + + nouveau_bo_map(dst->bo, NOUVEAU_BO_WR); + nouveau_bo_map(src->bo, NOUVEAU_BO_RD); + + dp = dst->bo->map + dst->offset; + sp = src->bo->map + src->offset; + + for (y = 0; y < h; y++) { + for (x = 0; x < w; x++) { + memcpy(dp + get_dst(dst, dx + x, dy + y), + sp + get_src(src, sx + x, sy + y), dst->cpp); + } + } + + nouveau_bo_unmap(src->bo); + nouveau_bo_unmap(dst->bo); +} + void nv04_surface_copy(GLcontext *ctx, struct nouveau_surface *dst, @@ -330,16 +404,22 @@ nv04_surface_copy(GLcontext *ctx, int dx, int dy, int sx, int sy, int w, int h) { - /* Setup transfer to swizzle the texture to vram if needed */ - if (src->layout != SWIZZLED && - dst->layout == SWIZZLED && - dst->width > 2 && dst->height > 1) { - nv04_surface_copy_swizzle(ctx, dst, src, - dx, dy, sx, sy, w, h); + /* Linear texture copy. */ + if ((src->layout == LINEAR && dst->layout == LINEAR) || + dst->width <= 2 || dst->height <= 1) { + nv04_surface_copy_m2mf(ctx, dst, src, dx, dy, sx, sy, w, h); + return; + } + + /* Swizzle using sifm+swzsurf. */ + if (src->layout == LINEAR && dst->layout == SWIZZLED && + dst->cpp != 1 && !(dst->offset & 63)) { + nv04_surface_copy_swizzle(ctx, dst, src, dx, dy, sx, sy, w, h); return; } - nv04_surface_copy_m2mf(ctx, dst, src, dx, dy, sx, sy, w, h); + /* Fallback to CPU copy. */ + nv04_surface_copy_cpu(ctx, dst, src, dx, dy, sx, sy, w, h); } void @@ -369,7 +449,7 @@ nv04_surface_fill(GLcontext *ctx, BEGIN_RING(chan, patt, NV04_IMAGE_PATTERN_COLOR_FORMAT, 1); OUT_RING (chan, rect_format(dst->format)); BEGIN_RING(chan, patt, NV04_IMAGE_PATTERN_MONOCHROME_COLOR1, 1); - OUT_RING (chan, mask | ~0 << (8 * dst->cpp)); + OUT_RING (chan, mask | ~0ll << (8 * dst->cpp)); BEGIN_RING(chan, rect, NV04_GDI_RECTANGLE_TEXT_COLOR_FORMAT, 1); OUT_RING (chan, rect_format(dst->format)); @@ -484,34 +564,20 @@ nv04_surface_init(GLcontext *ctx) OUT_RING (chan, NV04_GDI_RECTANGLE_TEXT_MONOCHROME_FORMAT_LE); /* Swizzled surface. */ - switch (context_chipset(ctx) & 0xf0) { - case 0x00: - case 0x10: + if (context_chipset(ctx) < 0x20) class = NV04_SWIZZLED_SURFACE; - break; - case 0x20: + else class = NV20_SWIZZLED_SURFACE; - break; - default: - /* Famous last words: this really can't happen.. */ - assert(0); - break; - } ret = nouveau_grobj_alloc(chan, handle++, class, &hw->swzsurf); if (ret) goto fail; /* Scaled image from memory. */ - switch (context_chipset(ctx) & 0xf0) { - case 0x00: + if (context_chipset(ctx) < 0x10) class = NV04_SCALED_IMAGE_FROM_MEMORY; - break; - case 0x10: - case 0x20: + else class = NV10_SCALED_IMAGE_FROM_MEMORY; - break; - } ret = nouveau_grobj_alloc(chan, handle++, class, &hw->sifm); if (ret) diff --git a/src/mesa/drivers/dri/nouveau/nv10_context.c b/src/mesa/drivers/dri/nouveau/nv10_context.c index d80d99caa80..860d0aeb8f5 100644 --- a/src/mesa/drivers/dri/nouveau/nv10_context.c +++ b/src/mesa/drivers/dri/nouveau/nv10_context.c @@ -32,6 +32,11 @@ #include "nv04_driver.h" #include "nv10_driver.h" +static const struct dri_extension nv10_extensions[] = { + { "GL_EXT_texture_rectangle", NULL }, + { NULL, NULL } +}; + static void nv10_clear(GLcontext *ctx, GLbitfield buffers) { @@ -301,6 +306,8 @@ nv10_context_create(struct nouveau_screen *screen, const GLvisual *visual, if (!nouveau_context_init(ctx, screen, visual, share_ctx)) goto fail; + driInitExtensions(ctx, nv10_extensions, GL_FALSE); + /* GL constants. */ ctx->Const.MaxTextureLevels = 12; ctx->Const.MaxTextureCoordUnits = NV10_TEXTURE_UNITS; @@ -363,7 +370,6 @@ const struct nouveau_driver nv10_driver = { nv10_emit_frag, nv10_emit_framebuffer, nv10_emit_fog, - nv10_emit_index_mask, nv10_emit_light_enable, nv10_emit_light_model, nv10_emit_light_source, diff --git a/src/mesa/drivers/dri/nouveau/nv10_driver.h b/src/mesa/drivers/dri/nouveau/nv10_driver.h index 4c220b0373f..d662712533b 100644 --- a/src/mesa/drivers/dri/nouveau/nv10_driver.h +++ b/src/mesa/drivers/dri/nouveau/nv10_driver.h @@ -100,9 +100,6 @@ void nv10_emit_dither(GLcontext *ctx, int emit); void -nv10_emit_index_mask(GLcontext *ctx, int emit); - -void nv10_emit_logic_opcode(GLcontext *ctx, int emit); void @@ -119,6 +116,14 @@ nv10_emit_stencil_op(GLcontext *ctx, int emit); /* nv10_state_frag.c */ void +nv10_get_general_combiner(GLcontext *ctx, int i, + uint32_t *a_in, uint32_t *a_out, + uint32_t *c_in, uint32_t *c_out, uint32_t *k); + +void +nv10_get_final_combiner(GLcontext *ctx, uint64_t *in, int *n); + +void nv10_emit_tex_env(GLcontext *ctx, int emit); void diff --git a/src/mesa/drivers/dri/nouveau/nv10_state_fb.c b/src/mesa/drivers/dri/nouveau/nv10_state_fb.c index 05c36b4f8f5..6bd383ebcd3 100644 --- a/src/mesa/drivers/dri/nouveau/nv10_state_fb.c +++ b/src/mesa/drivers/dri/nouveau/nv10_state_fb.c @@ -111,7 +111,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; diff --git a/src/mesa/drivers/dri/nouveau/nv10_state_frag.c b/src/mesa/drivers/dri/nouveau/nv10_state_frag.c index c1df26ecce6..76b95fdd518 100644 --- a/src/mesa/drivers/dri/nouveau/nv10_state_frag.c +++ b/src/mesa/drivers/dri/nouveau/nv10_state_frag.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009 Francisco Jerez. + * Copyright (C) 2009-2010 Francisco Jerez. * All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining @@ -90,11 +90,11 @@ struct combiner_state { } while (0) /* Get the RC input source for the specified EXT_texture_env_combine - * argument. */ + * source. */ static uint32_t -get_input_source(struct combiner_state *rc, int arg) +get_input_source(struct combiner_state *rc, int source) { - switch (rc->source[arg]) { + switch (source) { case GL_TEXTURE: return RC_IN_SOURCE(TEXTURE0) + rc->unit; @@ -127,52 +127,76 @@ get_input_source(struct combiner_state *rc, int arg) } } -/* Get the RC input mapping for the specified argument, possibly - * inverted or biased. */ +/* Get the RC input mapping for the specified texture_env_combine + * operand, possibly inverted or biased. */ #define INVERT 0x1 #define HALF_BIAS 0x2 static uint32_t -get_input_mapping(struct combiner_state *rc, int arg, int flags) +get_input_mapping(struct combiner_state *rc, int operand, int flags) { int map = 0; - switch (rc->operand[arg]) { - case GL_SRC_COLOR: - case GL_ONE_MINUS_SRC_COLOR: + if (is_color_operand(operand)) map |= RC_IN_USAGE(RGB); - break; - - case GL_SRC_ALPHA: - case GL_ONE_MINUS_SRC_ALPHA: + else map |= RC_IN_USAGE(ALPHA); - break; - } - switch (rc->operand[arg]) { - case GL_SRC_COLOR: - case GL_SRC_ALPHA: - map |= (flags & INVERT ? RC_IN_MAPPING(UNSIGNED_INVERT) : - flags & HALF_BIAS ? RC_IN_MAPPING(HALF_BIAS_NORMAL) : - RC_IN_MAPPING(UNSIGNED_IDENTITY)); - break; + if (is_negative_operand(operand) == !(flags & INVERT)) + map |= flags & HALF_BIAS ? + RC_IN_MAPPING(HALF_BIAS_NEGATE) : + RC_IN_MAPPING(UNSIGNED_INVERT); + else + map |= flags & HALF_BIAS ? + RC_IN_MAPPING(HALF_BIAS_NORMAL) : + RC_IN_MAPPING(UNSIGNED_IDENTITY); - case GL_ONE_MINUS_SRC_COLOR: - case GL_ONE_MINUS_SRC_ALPHA: - map |= (flags & INVERT ? RC_IN_MAPPING(UNSIGNED_IDENTITY) : - flags & HALF_BIAS ? RC_IN_MAPPING(HALF_BIAS_NEGATE) : - RC_IN_MAPPING(UNSIGNED_INVERT)); - break; + return map; +} + +static uint32_t +get_input_arg(struct combiner_state *rc, int arg, int flags) +{ + int source = rc->source[arg]; + int operand = rc->operand[arg]; + + /* Fake several unsupported texture formats. */ + if (is_texture_source(source)) { + int i = (source == GL_TEXTURE ? + rc->unit : source - GL_TEXTURE0); + struct gl_texture_object *t = rc->ctx->Texture.Unit[i]._Current; + gl_format format = t->Image[0][t->BaseLevel]->TexFormat; + + if (format == MESA_FORMAT_A8) { + /* Emulated using I8. */ + if (is_color_operand(operand)) + return RC_IN_SOURCE(ZERO) | + get_input_mapping(rc, operand, flags); + + } else if (format == MESA_FORMAT_L8) { + /* Sometimes emulated using I8. */ + if (!is_color_operand(operand)) + return RC_IN_SOURCE(ZERO) | + get_input_mapping(rc, operand, + flags ^ INVERT); + + } else if (format == MESA_FORMAT_XRGB8888) { + /* Sometimes emulated using ARGB8888. */ + if (!is_color_operand(operand)) + return RC_IN_SOURCE(ZERO) | + get_input_mapping(rc, operand, + flags ^ INVERT); + } } - return map; + return get_input_source(rc, source) | + get_input_mapping(rc, operand, flags); } /* Bind the RC input variable <var> to the EXT_texture_env_combine * argument <arg>, possibly inverted or biased. */ #define INPUT_ARG(rc, var, arg, flags) \ - (rc)->in |= (get_input_mapping(rc, arg, flags) | \ - get_input_source(rc, arg)) << RC_IN_SHIFT_##var + (rc)->in |= get_input_arg(rc, arg, flags) << RC_IN_SHIFT_##var /* Bind the RC input variable <var> to the RC source <src>. */ #define INPUT_SRC(rc, var, src, chan) \ @@ -268,86 +292,13 @@ setup_combiner(struct combiner_state *rc) } } -/* Write the register combiner state out to the hardware. */ -static void -nv10_load_combiner(GLcontext *ctx, int i, struct combiner_state *rc_a, - struct combiner_state *rc_c, uint32_t rc_const) -{ - struct nouveau_channel *chan = context_chan(ctx); - struct nouveau_grobj *celsius = context_eng3d(ctx); - - /* Enable the combiners we're going to need. */ - if (i == 1) { - if (rc_c->out || rc_a->out) - rc_c->out |= 0x5 << 27; - else - rc_c->out |= 0x3 << 27; - } - - BEGIN_RING(chan, celsius, NV10TCL_RC_IN_ALPHA(i), 1); - OUT_RING(chan, rc_a->in); - BEGIN_RING(chan, celsius, NV10TCL_RC_IN_RGB(i), 1); - OUT_RING(chan, rc_c->in); - BEGIN_RING(chan, celsius, NV10TCL_RC_COLOR(i), 1); - OUT_RING(chan, rc_const); - BEGIN_RING(chan, celsius, NV10TCL_RC_OUT_ALPHA(i), 1); - OUT_RING(chan, rc_a->out); - BEGIN_RING(chan, celsius, NV10TCL_RC_OUT_RGB(i), 1); - OUT_RING(chan, rc_c->out); -} - -static void -nv10_load_final(GLcontext *ctx, struct combiner_state *rc, int n) -{ - struct nouveau_channel *chan = context_chan(ctx); - struct nouveau_grobj *celsius = context_eng3d(ctx); - - BEGIN_RING(chan, celsius, NV10TCL_RC_FINAL0, 2); - OUT_RING(chan, rc->in); - OUT_RING(chan, rc->in >> 32); -} - -static void -nv20_load_combiner(GLcontext *ctx, int i, struct combiner_state *rc_a, - struct combiner_state *rc_c, uint32_t rc_const) -{ - struct nouveau_channel *chan = context_chan(ctx); - struct nouveau_grobj *kelvin = context_eng3d(ctx); - - BEGIN_RING(chan, kelvin, NV20TCL_RC_IN_ALPHA(i), 1); - OUT_RING(chan, rc_a->in); - BEGIN_RING(chan, kelvin, NV20TCL_RC_OUT_ALPHA(i), 1); - OUT_RING(chan, rc_a->out); - BEGIN_RING(chan, kelvin, NV20TCL_RC_IN_RGB(i), 1); - OUT_RING(chan, rc_c->in); - BEGIN_RING(chan, kelvin, NV20TCL_RC_OUT_RGB(i), 1); - OUT_RING(chan, rc_c->out); - BEGIN_RING(chan, kelvin, NV20TCL_RC_CONSTANT_COLOR0(i), 1); - OUT_RING(chan, rc_const); -} - -static void -nv20_load_final(GLcontext *ctx, struct combiner_state *rc, int n) -{ - struct nouveau_channel *chan = context_chan(ctx); - struct nouveau_grobj *kelvin = context_eng3d(ctx); - - BEGIN_RING(chan, kelvin, NV20TCL_RC_FINAL0, 2); - OUT_RING(chan, rc->in); - OUT_RING(chan, rc->in >> 32); - - BEGIN_RING(chan, kelvin, NV20TCL_RC_ENABLE, 1); - OUT_RING(chan, n); -} - void -nv10_emit_tex_env(GLcontext *ctx, int emit) +nv10_get_general_combiner(GLcontext *ctx, int i, + uint32_t *a_in, uint32_t *a_out, + uint32_t *c_in, uint32_t *c_out, uint32_t *k) { - const int i = emit - NOUVEAU_STATE_TEX_ENV0; struct combiner_state rc_a, rc_c; - uint32_t rc_const; - /* Compute the new combiner state. */ if (ctx->Texture.Unit[i]._ReallyEnabled) { INIT_COMBINER(RGB, ctx, &rc_c, i); @@ -359,26 +310,22 @@ nv10_emit_tex_env(GLcontext *ctx, int emit) setup_combiner(&rc_c); setup_combiner(&rc_a); - rc_const = pack_rgba_f(MESA_FORMAT_ARGB8888, - ctx->Texture.Unit[i].EnvColor); - } else { - rc_a.in = rc_a.out = rc_c.in = rc_c.out = rc_const = 0; + rc_a.in = rc_a.out = rc_c.in = rc_c.out = 0; } - if (context_chipset(ctx) >= 0x20) - nv20_load_combiner(ctx, i, &rc_a, &rc_c, rc_const); - else - nv10_load_combiner(ctx, i, &rc_a, &rc_c, rc_const); - - context_dirty(ctx, FRAG); + *k = pack_rgba_f(MESA_FORMAT_ARGB8888, + ctx->Texture.Unit[i].EnvColor); + *a_in = rc_a.in; + *a_out = rc_a.out; + *c_in = rc_c.in; + *c_out = rc_c.out; } void -nv10_emit_frag(GLcontext *ctx, int emit) +nv10_get_final_combiner(GLcontext *ctx, uint64_t *in, int *n) { struct combiner_state rc = {}; - int n = log2i(ctx->Texture._EnabledUnits) + 1; /* * The final fragment value equation is something like: @@ -409,8 +356,53 @@ nv10_emit_frag(GLcontext *ctx, int emit) INPUT_SRC(&rc, G, PRIMARY_COLOR, ALPHA); } - if (context_chipset(ctx) >= 0x20) - nv20_load_final(ctx, &rc, n); - else - nv10_load_final(ctx, &rc, n); + *in = rc.in; + *n = log2i(ctx->Texture._EnabledUnits) + 1; +} + +void +nv10_emit_tex_env(GLcontext *ctx, int emit) +{ + const int i = emit - NOUVEAU_STATE_TEX_ENV0; + struct nouveau_channel *chan = context_chan(ctx); + struct nouveau_grobj *celsius = context_eng3d(ctx); + uint32_t a_in, a_out, c_in, c_out, k; + + nv10_get_general_combiner(ctx, i, &a_in, &a_out, &c_in, &c_out, &k); + + /* Enable the combiners we're going to need. */ + if (i == 1) { + if (c_out || a_out) + c_out |= 0x5 << 27; + else + c_out |= 0x3 << 27; + } + + BEGIN_RING(chan, celsius, NV10TCL_RC_IN_ALPHA(i), 1); + OUT_RING(chan, a_in); + BEGIN_RING(chan, celsius, NV10TCL_RC_IN_RGB(i), 1); + OUT_RING(chan, c_in); + BEGIN_RING(chan, celsius, NV10TCL_RC_COLOR(i), 1); + OUT_RING(chan, k); + BEGIN_RING(chan, celsius, NV10TCL_RC_OUT_ALPHA(i), 1); + OUT_RING(chan, a_out); + BEGIN_RING(chan, celsius, NV10TCL_RC_OUT_RGB(i), 1); + OUT_RING(chan, c_out); + + context_dirty(ctx, FRAG); +} + +void +nv10_emit_frag(GLcontext *ctx, int emit) +{ + struct nouveau_channel *chan = context_chan(ctx); + struct nouveau_grobj *celsius = context_eng3d(ctx); + uint64_t in; + int n; + + nv10_get_final_combiner(ctx, &in, &n); + + BEGIN_RING(chan, celsius, NV10TCL_RC_FINAL0, 2); + OUT_RING(chan, in); + OUT_RING(chan, in >> 32); } diff --git a/src/mesa/drivers/dri/nouveau/nv10_state_raster.c b/src/mesa/drivers/dri/nouveau/nv10_state_raster.c index 68882ef05f2..a62cd807a91 100644 --- a/src/mesa/drivers/dri/nouveau/nv10_state_raster.c +++ b/src/mesa/drivers/dri/nouveau/nv10_state_raster.c @@ -119,11 +119,6 @@ nv10_emit_dither(GLcontext *ctx, int emit) } void -nv10_emit_index_mask(GLcontext *ctx, int emit) -{ -} - -void nv10_emit_logic_opcode(GLcontext *ctx, int emit) { struct nouveau_channel *chan = context_chan(ctx); diff --git a/src/mesa/drivers/dri/nouveau/nv10_state_tex.c b/src/mesa/drivers/dri/nouveau/nv10_state_tex.c index e5d4f3d18d8..02a5ca797ae 100644 --- a/src/mesa/drivers/dri/nouveau/nv10_state_tex.c +++ b/src/mesa/drivers/dri/nouveau/nv10_state_tex.c @@ -38,12 +38,15 @@ nv10_emit_tex_gen(GLcontext *ctx, int emit) } static uint32_t -get_tex_format(struct gl_texture_image *ti) +get_tex_format_pot(struct gl_texture_image *ti) { switch (ti->TexFormat) { case MESA_FORMAT_ARGB8888: return NV10TCL_TX_FORMAT_FORMAT_A8R8G8B8; + case MESA_FORMAT_XRGB8888: + return NV10TCL_TX_FORMAT_FORMAT_X8R8G8B8; + case MESA_FORMAT_ARGB1555: return NV10TCL_TX_FORMAT_FORMAT_A1R5G5B5; @@ -54,6 +57,7 @@ get_tex_format(struct gl_texture_image *ti) return NV10TCL_TX_FORMAT_FORMAT_R5G6B5; case MESA_FORMAT_A8: + case MESA_FORMAT_I8: return NV10TCL_TX_FORMAT_FORMAT_A8; case MESA_FORMAT_L8: @@ -67,6 +71,30 @@ get_tex_format(struct gl_texture_image *ti) } } +static uint32_t +get_tex_format_rect(struct gl_texture_image *ti) +{ + switch (ti->TexFormat) { + case MESA_FORMAT_ARGB1555: + return NV10TCL_TX_FORMAT_FORMAT_A1R5G5B5_RECT; + + case MESA_FORMAT_RGB565: + return NV10TCL_TX_FORMAT_FORMAT_R5G6B5_RECT; + + case MESA_FORMAT_ARGB8888: + case MESA_FORMAT_XRGB8888: + return NV10TCL_TX_FORMAT_FORMAT_A8R8G8B8_RECT; + + case MESA_FORMAT_A8: + case MESA_FORMAT_L8: + case MESA_FORMAT_I8: + return NV10TCL_TX_FORMAT_FORMAT_A8_RECT; + + default: + assert(0); + } +} + void nv10_emit_tex_obj(GLcontext *ctx, int emit) { @@ -90,14 +118,14 @@ nv10_emit_tex_obj(GLcontext *ctx, int emit) s = &to_nouveau_texture(t)->surfaces[t->BaseLevel]; ti = t->Image[0][t->BaseLevel]; - nouveau_texture_validate(ctx, t); + if (!nouveau_texture_validate(ctx, t)) + return; /* Recompute the texturing registers. */ tx_format = nvgl_wrap_mode(t->WrapT) << 28 | nvgl_wrap_mode(t->WrapS) << 24 | ti->HeightLog2 << 20 | ti->WidthLog2 << 16 - | get_tex_format(ti) | 5 << 4 | 1 << 12; tx_filter = nvgl_filter_mode(t->MagFilter) << 28 @@ -106,6 +134,17 @@ nv10_emit_tex_obj(GLcontext *ctx, int emit) tx_enable = NV10TCL_TX_ENABLE_ENABLE | log2i(t->MaxAnisotropy) << 4; + if (t->Target == GL_TEXTURE_RECTANGLE) { + BEGIN_RING(chan, celsius, NV10TCL_TX_NPOT_PITCH(i), 1); + OUT_RING(chan, s->pitch << 16); + BEGIN_RING(chan, celsius, NV10TCL_TX_NPOT_SIZE(i), 1); + OUT_RING(chan, align(s->width, 2) << 16 | s->height); + + tx_format |= get_tex_format_rect(ti); + } else { + tx_format |= get_tex_format_pot(ti); + } + if (t->MinFilter != GL_NEAREST && t->MinFilter != GL_LINEAR) { int lod_min = t->MinLod; diff --git a/src/mesa/drivers/dri/nouveau/nv10_state_tnl.c b/src/mesa/drivers/dri/nouveau/nv10_state_tnl.c index 6db14d83b83..406e24c455d 100644 --- a/src/mesa/drivers/dri/nouveau/nv10_state_tnl.c +++ b/src/mesa/drivers/dri/nouveau/nv10_state_tnl.c @@ -201,8 +201,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 diff --git a/src/mesa/drivers/dri/nouveau/nv20_context.c b/src/mesa/drivers/dri/nouveau/nv20_context.c index 82a13fb6ff0..db39ef70750 100644 --- a/src/mesa/drivers/dri/nouveau/nv20_context.c +++ b/src/mesa/drivers/dri/nouveau/nv20_context.c @@ -31,6 +31,11 @@ #include "nv10_driver.h" #include "nv20_driver.h" +static const struct dri_extension nv20_extensions[] = { + { "GL_EXT_texture_rectangle", NULL }, + { NULL, NULL } +}; + static void nv20_hwctx_init(GLcontext *ctx) { @@ -394,6 +399,8 @@ nv20_context_create(struct nouveau_screen *screen, const GLvisual *visual, if (!nouveau_context_init(ctx, screen, visual, share_ctx)) goto fail; + driInitExtensions(ctx, nv20_extensions, GL_FALSE); + /* GL constants. */ ctx->Const.MaxTextureCoordUnits = NV20_TEXTURE_UNITS; ctx->Const.MaxTextureImageUnits = NV20_TEXTURE_UNITS; @@ -449,10 +456,9 @@ const struct nouveau_driver nv20_driver = { nv10_emit_front_face, nv10_emit_depth, nv10_emit_dither, - nv10_emit_frag, + nv20_emit_frag, nv20_emit_framebuffer, nv20_emit_fog, - nv10_emit_index_mask, nv10_emit_light_enable, nv20_emit_light_model, nv20_emit_light_source, @@ -487,10 +493,10 @@ const struct nouveau_driver nv20_driver = { nv10_emit_stencil_func, nv10_emit_stencil_mask, nv10_emit_stencil_op, - nv10_emit_tex_env, - nv10_emit_tex_env, - nv10_emit_tex_env, - nv10_emit_tex_env, + nv20_emit_tex_env, + nv20_emit_tex_env, + nv20_emit_tex_env, + nv20_emit_tex_env, nv10_emit_tex_gen, nv10_emit_tex_gen, nv10_emit_tex_gen, diff --git a/src/mesa/drivers/dri/nouveau/nv20_driver.h b/src/mesa/drivers/dri/nouveau/nv20_driver.h index f82a292cf7a..18574e9be64 100644 --- a/src/mesa/drivers/dri/nouveau/nv20_driver.h +++ b/src/mesa/drivers/dri/nouveau/nv20_driver.h @@ -59,6 +59,13 @@ nv20_emit_point_mode(GLcontext *ctx, int emit); void nv20_emit_logic_opcode(GLcontext *ctx, int emit); +/* nv20_state_frag.c */ +void +nv20_emit_tex_env(GLcontext *ctx, int emit); + +void +nv20_emit_frag(GLcontext *ctx, int emit); + /* nv20_state_tex.c */ void nv20_emit_tex_obj(GLcontext *ctx, int emit); diff --git a/src/mesa/drivers/dri/nouveau/nv20_state_fb.c b/src/mesa/drivers/dri/nouveau/nv20_state_fb.c index 869acd6e317..d638541df9e 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; diff --git a/src/mesa/drivers/dri/nouveau/nv20_state_frag.c b/src/mesa/drivers/dri/nouveau/nv20_state_frag.c new file mode 100644 index 00000000000..74803d2ae84 --- /dev/null +++ b/src/mesa/drivers/dri/nouveau/nv20_state_frag.c @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2009-2010 Francisco Jerez. + * 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 "nouveau_driver.h" +#include "nouveau_context.h" +#include "nouveau_class.h" +#include "nv10_driver.h" +#include "nv20_driver.h" + +void +nv20_emit_tex_env(GLcontext *ctx, int emit) +{ + const int i = emit - NOUVEAU_STATE_TEX_ENV0; + struct nouveau_channel *chan = context_chan(ctx); + struct nouveau_grobj *kelvin = context_eng3d(ctx); + uint32_t a_in, a_out, c_in, c_out, k; + + nv10_get_general_combiner(ctx, i, &a_in, &a_out, &c_in, &c_out, &k); + + BEGIN_RING(chan, kelvin, NV20TCL_RC_IN_ALPHA(i), 1); + OUT_RING(chan, a_in); + BEGIN_RING(chan, kelvin, NV20TCL_RC_OUT_ALPHA(i), 1); + OUT_RING(chan, a_out); + BEGIN_RING(chan, kelvin, NV20TCL_RC_IN_RGB(i), 1); + OUT_RING(chan, c_in); + BEGIN_RING(chan, kelvin, NV20TCL_RC_OUT_RGB(i), 1); + OUT_RING(chan, c_out); + BEGIN_RING(chan, kelvin, NV20TCL_RC_CONSTANT_COLOR0(i), 1); + OUT_RING(chan, k); + + context_dirty(ctx, FRAG); +} + +void +nv20_emit_frag(GLcontext *ctx, int emit) +{ + struct nouveau_channel *chan = context_chan(ctx); + struct nouveau_grobj *kelvin = context_eng3d(ctx); + uint64_t in; + int n; + + nv10_get_final_combiner(ctx, &in, &n); + + BEGIN_RING(chan, kelvin, NV20TCL_RC_FINAL0, 2); + OUT_RING(chan, in); + OUT_RING(chan, in >> 32); + + BEGIN_RING(chan, kelvin, NV20TCL_RC_ENABLE, 1); + OUT_RING(chan, n); +} diff --git a/src/mesa/drivers/dri/nouveau/nv20_state_tex.c b/src/mesa/drivers/dri/nouveau/nv20_state_tex.c index d01e91f8ee1..92870105f96 100644 --- a/src/mesa/drivers/dri/nouveau/nv20_state_tex.c +++ b/src/mesa/drivers/dri/nouveau/nv20_state_tex.c @@ -33,7 +33,7 @@ #include "nv20_driver.h" static uint32_t -get_tex_format(struct gl_texture_image *ti) +get_tex_format_pot(struct gl_texture_image *ti) { switch (ti->TexFormat) { case MESA_FORMAT_ARGB8888: @@ -45,10 +45,14 @@ get_tex_format(struct gl_texture_image *ti) case MESA_FORMAT_ARGB4444: return NV20TCL_TX_FORMAT_FORMAT_A4R4G4B4; + case MESA_FORMAT_XRGB8888: + return NV20TCL_TX_FORMAT_FORMAT_X8R8G8B8; + case MESA_FORMAT_RGB565: return NV20TCL_TX_FORMAT_FORMAT_R5G6B5; case MESA_FORMAT_A8: + case MESA_FORMAT_I8: return NV20TCL_TX_FORMAT_FORMAT_A8; case MESA_FORMAT_L8: @@ -62,6 +66,37 @@ get_tex_format(struct gl_texture_image *ti) } } +static uint32_t +get_tex_format_rect(struct gl_texture_image *ti) +{ + switch (ti->TexFormat) { + case MESA_FORMAT_ARGB8888: + return NV20TCL_TX_FORMAT_FORMAT_A8R8G8B8_RECT; + + case MESA_FORMAT_ARGB1555: + return NV20TCL_TX_FORMAT_FORMAT_A1R5G5B5_RECT; + + case MESA_FORMAT_ARGB4444: + return NV20TCL_TX_FORMAT_FORMAT_A4R4G4B4_RECT; + + case MESA_FORMAT_XRGB8888: + return NV20TCL_TX_FORMAT_FORMAT_R8G8B8_RECT; + + case MESA_FORMAT_RGB565: + return NV20TCL_TX_FORMAT_FORMAT_R5G6B5_RECT; + + case MESA_FORMAT_L8: + return NV20TCL_TX_FORMAT_FORMAT_L8_RECT; + + case MESA_FORMAT_A8: + case MESA_FORMAT_I8: + return NV20TCL_TX_FORMAT_FORMAT_A8_RECT; + + default: + assert(0); + } +} + void nv20_emit_tex_obj(GLcontext *ctx, int emit) { @@ -87,13 +122,13 @@ nv20_emit_tex_obj(GLcontext *ctx, int emit) s = &to_nouveau_texture(t)->surfaces[t->BaseLevel]; ti = t->Image[0][t->BaseLevel]; - nouveau_texture_validate(ctx, t); + if (!nouveau_texture_validate(ctx, t)) + return; /* Recompute the texturing registers. */ tx_format = ti->DepthLog2 << 28 | ti->HeightLog2 << 24 | ti->WidthLog2 << 20 - | get_tex_format(ti) | NV20TCL_TX_FORMAT_DIMS_2D | NV20TCL_TX_FORMAT_NO_BORDER | 1 << 16; @@ -108,6 +143,17 @@ nv20_emit_tex_obj(GLcontext *ctx, int emit) tx_enable = NV20TCL_TX_ENABLE_ENABLE | log2i(t->MaxAnisotropy) << 4; + if (t->Target == GL_TEXTURE_RECTANGLE) { + BEGIN_RING(chan, kelvin, NV20TCL_TX_NPOT_PITCH(i), 1); + OUT_RING(chan, s->pitch << 16); + BEGIN_RING(chan, kelvin, NV20TCL_TX_NPOT_SIZE(i), 1); + OUT_RING(chan, s->width << 16 | s->height); + + tx_format |= get_tex_format_rect(ti); + } else { + tx_format |= get_tex_format_pot(ti); + } + if (t->MinFilter != GL_NEAREST && t->MinFilter != GL_LINEAR) { int lod_min = t->MinLod; diff --git a/src/mesa/drivers/dri/nouveau/nv20_state_tnl.c b/src/mesa/drivers/dri/nouveau/nv20_state_tnl.c index 0d566064f67..43f8c723122 100644 --- a/src/mesa/drivers/dri/nouveau/nv20_state_tnl.c +++ b/src/mesa/drivers/dri/nouveau/nv20_state_tnl.c @@ -158,7 +158,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))); diff --git a/src/mesa/drivers/dri/r128/Makefile b/src/mesa/drivers/dri/r128/Makefile index 52c5a38a705..8144c9b43ff 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/r128_state.c b/src/mesa/drivers/dri/r128/r128_state.c index 42f6dd73888..4d773feaaa8 100644 --- a/src/mesa/drivers/dri/r128/r128_state.c +++ b/src/mesa/drivers/dri/r128/r128_state.c @@ -1407,13 +1407,11 @@ void r128DDInitStateFuncs( GLcontext *ctx ) { ctx->Driver.UpdateState = r128DDInvalidateState; - ctx->Driver.ClearIndex = NULL; ctx->Driver.ClearColor = r128DDClearColor; ctx->Driver.ClearStencil = r128DDClearStencil; ctx->Driver.DrawBuffer = r128DDDrawBuffer; ctx->Driver.ReadBuffer = r128DDReadBuffer; - ctx->Driver.IndexMask = NULL; ctx->Driver.ColorMask = r128DDColorMask; ctx->Driver.AlphaFunc = r128DDAlphaFunc; ctx->Driver.BlendEquationSeparate = r128DDBlendEquationSeparate; diff --git a/src/mesa/drivers/dri/r128/r128_tex.c b/src/mesa/drivers/dri/r128/r128_tex.c index 24fbf8f5194..4ec4be9a47b 100644 --- a/src/mesa/drivers/dri/r128/r128_tex.c +++ b/src/mesa/drivers/dri/r128/r128_tex.c @@ -468,7 +468,7 @@ static void r128TexEnv( GLcontext *ctx, GLenum target, * certain point. It is better than completely ignoring the LOD * bias. Unfortunately there isn't much range in the bias, the * spec mentions strides that vary between 0.5 and 2.0 but these - * numbers don't seem to relate the the GL LOD bias value at all. + * numbers don't seem to relate to the GL LOD bias value at all. */ if ( param[0] >= 1.0 ) { bias = -128; diff --git a/src/mesa/drivers/dri/r128/r128_texmem.c b/src/mesa/drivers/dri/r128/r128_texmem.c index 5eec8c08cd6..412f6d42551 100644 --- a/src/mesa/drivers/dri/r128/r128_texmem.c +++ b/src/mesa/drivers/dri/r128/r128_texmem.c @@ -260,6 +260,7 @@ void r128UploadTexImages( r128ContextPtr rmesa, r128TexObjPtr t ) } /* Set the base offset of the texture image */ + assert(t->base.memBlock); t->bufAddr = rmesa->r128Screen->texOffset[heap] + t->base.memBlock->ofs; diff --git a/src/mesa/drivers/dri/r128/r128_tris.c b/src/mesa/drivers/dri/r128/r128_tris.c index 86d4717b050..9ea2a9d1624 100644 --- a/src/mesa/drivers/dri/r128/r128_tris.c +++ b/src/mesa/drivers/dri/r128/r128_tris.c @@ -158,7 +158,6 @@ static struct { #define DO_POINTS 1 #define DO_FULL_QUAD 1 -#define HAVE_RGBA 1 #define HAVE_SPEC 1 #define HAVE_BACK_COLORS 0 #define HAVE_HW_FLATSHADE 1 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 6e3db948af7..00000000000 --- 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 <[email protected]> - * Rickard E. Faith <[email protected]> - * Daryll Strauss <[email protected]> - * Gareth Hughes <[email protected]> - * - */ - -#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 14eb96c1bab..c9c1346c3a2 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 e446d532cf7..e187fc0f61e 100644 --- a/src/mesa/drivers/dri/r200/r200_blit.c +++ b/src/mesa/drivers/dri/r200/r200_blit.c @@ -38,7 +38,7 @@ static inline uint32_t cmdpacket0(struct radeon_screen *rscrn, } /* common formats supported as both textures and render targets */ -static unsigned is_blit_supported(gl_format mesa_format) +unsigned r200_check_blit(gl_format mesa_format) { /* XXX others? BE/LE? */ switch (mesa_format) { @@ -48,6 +48,11 @@ static unsigned is_blit_supported(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: @@ -211,15 +344,16 @@ static GLboolean validate_buffers(struct r200_context *r200, struct radeon_bo *dst_bo) { int ret; - radeon_cs_space_add_persistent_bo(r200->radeon.cmdbuf.cs, - src_bo, RADEON_GEM_DOMAIN_VRAM, 0); - radeon_cs_space_add_persistent_bo(r200->radeon.cmdbuf.cs, - dst_bo, 0, RADEON_GEM_DOMAIN_VRAM); + radeon_cs_space_reset_bos(r200->radeon.cmdbuf.cs); + + ret = radeon_cs_space_check_with_bo(r200->radeon.cmdbuf.cs, + src_bo, RADEON_GEM_DOMAIN_VRAM | RADEON_GEM_DOMAIN_GTT, 0); + if (ret) + return GL_FALSE; ret = radeon_cs_space_check_with_bo(r200->radeon.cmdbuf.cs, - first_elem(&r200->radeon.dma.reserved)->bo, - RADEON_GEM_DOMAIN_GTT, 0); + dst_bo, 0, RADEON_GEM_DOMAIN_VRAM | RADEON_GEM_DOMAIN_GTT); if (ret) return GL_FALSE; @@ -333,7 +467,7 @@ unsigned r200_blit(GLcontext *ctx, { struct r200_context *r200 = R200_CONTEXT(ctx); - if (!is_blit_supported(dst_mesaformat)) + if (!r200_check_blit(dst_mesaformat)) return GL_FALSE; /* Make sure that colorbuffer has even width - hw limitation */ @@ -383,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_blit.h b/src/mesa/drivers/dri/r200/r200_blit.h index 38487266ae1..53206f0b471 100644 --- a/src/mesa/drivers/dri/r200/r200_blit.h +++ b/src/mesa/drivers/dri/r200/r200_blit.h @@ -30,6 +30,8 @@ void r200_blit_init(struct r200_context *r200); +unsigned r200_check_blit(gl_format mesa_format); + unsigned r200_blit(GLcontext *ctx, struct radeon_bo *src_bo, intptr_t src_offset, diff --git a/src/mesa/drivers/dri/r200/r200_context.c b/src/mesa/drivers/dri/r200/r200_context.c index 6ecd46ecd9e..36a29350ccc 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" @@ -264,7 +263,9 @@ static void r200_init_vtbl(radeonContextPtr radeon) radeon->vtbl.fallback = r200Fallback; radeon->vtbl.update_scissor = r200_vtbl_update_scissor; 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; } @@ -323,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); @@ -472,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_ioctl.c b/src/mesa/drivers/dri/r200/r200_ioctl.c index a1b505707ea..b72f69b7f45 100644 --- a/src/mesa/drivers/dri/r200/r200_ioctl.c +++ b/src/mesa/drivers/dri/r200/r200_ioctl.c @@ -61,6 +61,8 @@ static void r200KernelClear(GLcontext *ctx, GLuint flags) GLint cx, cy, cw, ch, ret; GLuint i; + radeonEmitState(&rmesa->radeon); + LOCK_HARDWARE( &rmesa->radeon ); /* Throttle the number of clear ioctls we do. 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 bfb7e2a2ed3..00000000000 --- 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 <[email protected]> - */ - -#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 e62aa05d749..00000000000 --- 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 <[email protected]> - */ - -#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 59115212cee..e331be223b8 100644 --- a/src/mesa/drivers/dri/r200/r200_reg.h +++ b/src/mesa/drivers/dri/r200/r200_reg.h @@ -690,7 +690,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # define R200_PVS_CNTL_1_PROGRAM_START_SHIFT 0 # define R200_PVS_CNTL_1_POS_END_SHIFT 10 # define R200_PVS_CNTL_1_PROGRAM_END_SHIFT 20 -/* Addresses are relative the the vertex program parameters area. */ +/* Addresses are relative to the vertex program parameters area. */ #define R200_VAP_PVS_CNTL_2 0x22d4 # define R200_PVS_CNTL_2_PARAM_OFFSET_SHIFT 0 # define R200_PVS_CNTL_2_PARAM_COUNT_SHIFT 16 @@ -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 b9ec6f428f0..9c2ac05ad6c 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,13 +2496,18 @@ void r200InitStateFuncs( struct dd_function_table *functions ) functions->DrawBuffer = radeonDrawBuffer; functions->ReadBuffer = radeonReadBuffer; + if (radeon->radeonScreen->kernel_mm) { + functions->CopyPixels = _mesa_meta_CopyPixels; + functions->DrawPixels = _mesa_meta_DrawPixels; + functions->ReadPixels = radeonReadPixels; + } + functions->AlphaFunc = r200AlphaFunc; functions->BlendColor = r200BlendColor; functions->BlendEquationSeparate = r200BlendEquationSeparate; functions->BlendFuncSeparate = r200BlendFuncSeparate; functions->ClearColor = r200ClearColor; functions->ClearDepth = r200ClearDepth; - functions->ClearIndex = NULL; functions->ClearStencil = r200ClearStencil; functions->ClipPlane = r200ClipPlane; functions->ColorMask = r200ColorMask; @@ -2513,7 +2519,6 @@ void r200InitStateFuncs( struct dd_function_table *functions ) functions->Fogfv = r200Fogfv; functions->FrontFace = r200FrontFace; functions->Hint = NULL; - functions->IndexMask = NULL; functions->LightModelfv = r200LightModelfv; functions->Lightfv = r200Lightfv; functions->LineStipple = r200LineStipple; diff --git a/src/mesa/drivers/dri/r200/r200_state.h b/src/mesa/drivers/dri/r200/r200_state.h index 7b9b0c106aa..327ba837e25 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/r200_swtcl.c b/src/mesa/drivers/dri/r200/r200_swtcl.c index e220e40b015..262fe3cddee 100644 --- a/src/mesa/drivers/dri/r200/r200_swtcl.c +++ b/src/mesa/drivers/dri/r200/r200_swtcl.c @@ -420,7 +420,6 @@ static struct { #define DO_POINTS 1 #define DO_FULL_QUAD 1 -#define HAVE_RGBA 1 #define HAVE_SPEC 1 #define HAVE_BACK_COLORS 0 #define HAVE_HW_FLATSHADE 1 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 00000000000..3b03803126f --- /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 00000000000..d9836d7326e --- /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 00000000000..d4bfe27da64 --- /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 00000000000..31074c581ea --- /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 d05847d650f..00000000000 --- 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 04459c2ddfa..2245998c952 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/r500_fragprog_emit.c b/src/mesa/drivers/dri/r300/compiler/r500_fragprog_emit.c index 829f028950c..710cae727a1 100644 --- a/src/mesa/drivers/dri/r300/compiler/r500_fragprog_emit.c +++ b/src/mesa/drivers/dri/r300/compiler/r500_fragprog_emit.c @@ -469,6 +469,8 @@ void r500BuildFragmentProgramHwCode(struct r300_fragment_program_compiler *compi if (compiler->Base.Error) return; + assert(code->inst_end >= 0); + if ((code->inst[code->inst_end].inst0 & R500_INST_TYPE_MASK) != R500_INST_TYPE_OUT) { /* This may happen when dead-code elimination is disabled or * when most of the fragment program logic is leading to a KIL */ diff --git a/src/mesa/drivers/dri/r300/r300_blit.c b/src/mesa/drivers/dri/r300/r300_blit.c index 54ac2510e7a..fa60628a5e0 100644 --- a/src/mesa/drivers/dri/r300/r300_blit.c +++ b/src/mesa/drivers/dri/r300/r300_blit.c @@ -97,6 +97,7 @@ static void create_fragment_program(struct r300_context *r300) struct r300_fragment_program_compiler compiler; struct rc_instruction *inst; + memset(&compiler, 0, sizeof(struct r300_fragment_program_compiler)); rc_init(&compiler.Base); inst = rc_insert_new_instruction(&compiler.Base, compiler.Base.Program.Instructions.Prev); @@ -125,7 +126,8 @@ static void create_fragment_program(struct r300_context *r300) void r300_blit_init(struct r300_context *r300) { - create_vertex_program(r300); + if (r300->options.hw_tcl_enabled) + create_vertex_program(r300); create_fragment_program(r300); } @@ -340,8 +342,14 @@ static void emit_pvs_setup(struct r300_context *r300, static void emit_vap_setup(struct r300_context *r300) { + int tex_offset; BATCH_LOCALS(&r300->radeon); + if (r300->options.hw_tcl_enabled) + tex_offset = 1; + else + tex_offset = 6; + BEGIN_BATCH(12); OUT_BATCH_REGSEQ(R300_SE_VTE_CNTL, 2); OUT_BATCH(R300_VTX_XY_FMT | R300_VTX_Z_FMT); @@ -350,7 +358,7 @@ static void emit_vap_setup(struct r300_context *r300) OUT_BATCH_REGVAL(R300_VAP_PSC_SGN_NORM_CNTL, 0xaaaaaaaa); OUT_BATCH_REGVAL(R300_VAP_PROG_STREAM_CNTL_0, ((R300_DATA_TYPE_FLOAT_2 | (0 << R300_DST_VEC_LOC_SHIFT)) << 0) | - (((1 << R300_DST_VEC_LOC_SHIFT) | R300_DATA_TYPE_FLOAT_2 | R300_LAST_VEC) << 16)); + (((tex_offset << R300_DST_VEC_LOC_SHIFT) | R300_DATA_TYPE_FLOAT_2 | R300_LAST_VEC) << 16)); OUT_BATCH_REGVAL(R300_VAP_PROG_STREAM_CNTL_EXT_0, ((((R300_SWIZZLE_SELECT_X << R300_SWIZZLE_SELECT_X_SHIFT) | (R300_SWIZZLE_SELECT_Y << R300_SWIZZLE_SELECT_Y_SHIFT) | @@ -373,15 +381,16 @@ static GLboolean validate_buffers(struct r300_context *r300, struct radeon_bo *dst_bo) { int ret; - radeon_cs_space_add_persistent_bo(r300->radeon.cmdbuf.cs, - src_bo, RADEON_GEM_DOMAIN_VRAM, 0); - radeon_cs_space_add_persistent_bo(r300->radeon.cmdbuf.cs, - dst_bo, 0, RADEON_GEM_DOMAIN_VRAM); + radeon_cs_space_reset_bos(r300->radeon.cmdbuf.cs); + + ret = radeon_cs_space_check_with_bo(r300->radeon.cmdbuf.cs, + src_bo, RADEON_GEM_DOMAIN_VRAM | RADEON_GEM_DOMAIN_GTT, 0); + if (ret) + return GL_FALSE; ret = radeon_cs_space_check_with_bo(r300->radeon.cmdbuf.cs, - first_elem(&r300->radeon.dma.reserved)->bo, - RADEON_GEM_DOMAIN_GTT, 0); + dst_bo, 0, RADEON_GEM_DOMAIN_VRAM | RADEON_GEM_DOMAIN_GTT); if (ret) return GL_FALSE; @@ -445,7 +454,7 @@ static void other_stuff(struct r300_context *r300) { BATCH_LOCALS(&r300->radeon); - BEGIN_BATCH(15); + BEGIN_BATCH(13); OUT_BATCH_REGVAL(R300_GA_POLY_MODE, R300_GA_POLY_MODE_FRONT_PTYPE_TRI | R300_GA_POLY_MODE_BACK_PTYPE_TRI); OUT_BATCH_REGVAL(R300_SU_CULL_MODE, R300_FRONT_FACE_CCW); @@ -454,9 +463,13 @@ static void other_stuff(struct r300_context *r300) OUT_BATCH_REGSEQ(R300_RB3D_CBLEND, 2); OUT_BATCH(0x0); OUT_BATCH(0x0); - OUT_BATCH_REGVAL(R300_VAP_CLIP_CNTL, R300_CLIP_DISABLE); OUT_BATCH_REGVAL(R300_ZB_CNTL, 0); END_BATCH(); + if (r300->options.hw_tcl_enabled) { + BEGIN_BATCH(2); + OUT_BATCH_REGVAL(R300_VAP_CLIP_CNTL, R300_CLIP_DISABLE); + END_BATCH(); + } } static void emit_cb_setup(struct r300_context *r300, @@ -494,7 +507,7 @@ static void emit_cb_setup(struct r300_context *r300, END_BATCH(); } -static unsigned is_blit_supported(gl_format dst_format) +unsigned r300_check_blit(gl_format dst_format) { switch (dst_format) { case MESA_FORMAT_RGB565: @@ -562,19 +575,13 @@ unsigned r300_blit(GLcontext *ctx, { r300ContextPtr r300 = R300_CONTEXT(ctx); - if (!is_blit_supported(dst_mesaformat)) + if (!r300_check_blit(dst_mesaformat)) return 0; /* Make sure that colorbuffer has even width - hw limitation */ 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. @@ -629,7 +636,9 @@ unsigned r300_blit(GLcontext *ctx, r300_emit_rs_setup(r300); } - emit_pvs_setup(r300, r300->blit.vp_code.body.d, 2); + if (r300->options.hw_tcl_enabled) + emit_pvs_setup(r300, r300->blit.vp_code.body.d, 2); + emit_vap_setup(r300); emit_cb_setup(r300, dst_bo, dst_offset, dst_mesaformat, dst_pitch, dst_width, dst_height); diff --git a/src/mesa/drivers/dri/r300/r300_blit.h b/src/mesa/drivers/dri/r300/r300_blit.h index 735acaddd70..39b157a57b8 100644 --- a/src/mesa/drivers/dri/r300/r300_blit.h +++ b/src/mesa/drivers/dri/r300/r300_blit.h @@ -30,6 +30,8 @@ void r300_blit_init(struct r300_context *r300); +unsigned r300_check_blit(gl_format mesa_format); + unsigned r300_blit(GLcontext *ctx, struct radeon_bo *src_bo, intptr_t src_offset, @@ -51,4 +53,4 @@ unsigned r300_blit(GLcontext *ctx, unsigned reg_height, unsigned flip_y); -#endif // R300_BLIT_H
\ No newline at end of file +#endif // R300_BLIT_H diff --git a/src/mesa/drivers/dri/r300/r300_cmdbuf.c b/src/mesa/drivers/dri/r300/r300_cmdbuf.c index 4787bafc66a..e2dbb1dbf40 100644 --- a/src/mesa/drivers/dri/r300/r300_cmdbuf.c +++ b/src/mesa/drivers/dri/r300/r300_cmdbuf.c @@ -90,8 +90,7 @@ void r300_emit_vpu(struct r300_context *r300, { BATCH_LOCALS(&r300->radeon); - BEGIN_BATCH_NO_AUTOSTATE(5 + len); - OUT_BATCH_REGVAL(R300_VAP_PVS_STATE_FLUSH_REG, 0); + BEGIN_BATCH_NO_AUTOSTATE(3 + len); OUT_BATCH_REGVAL(R300_VAP_PVS_VECTOR_INDX_REG, addr); OUT_BATCH(CP_PACKET0(R300_VAP_PVS_UPLOAD_DATA, len-1) | RADEON_ONE_REG_WR); OUT_BATCH_TABLE(data, len); @@ -333,36 +332,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; } @@ -778,24 +778,6 @@ void r300InitCmdBuf(r300ContextPtr r300) /* VPU only on TCL */ if (has_tcl) { int i; - if (r300->radeon.radeonScreen->kernel_mm) { - ALLOC_STATE(vap_flush, always, 10, 0); - /* flush processing vertices */ - r300->hw.vap_flush.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_SC_SCREENDOOR, 1); - r300->hw.vap_flush.cmd[1] = 0; - r300->hw.vap_flush.cmd[2] = cmdpacket0(r300->radeon.radeonScreen, R300_RB3D_DSTCACHE_CTLSTAT, 1); - r300->hw.vap_flush.cmd[3] = R300_RB3D_DSTCACHE_CTLSTAT_DC_FLUSH_FLUSH_DIRTY_3D; - r300->hw.vap_flush.cmd[4] = cmdpacket0(r300->radeon.radeonScreen, RADEON_WAIT_UNTIL, 1); - r300->hw.vap_flush.cmd[5] = RADEON_WAIT_3D_IDLECLEAN; - r300->hw.vap_flush.cmd[6] = cmdpacket0(r300->radeon.radeonScreen, R300_SC_SCREENDOOR, 1); - r300->hw.vap_flush.cmd[7] = 0xffffff; - r300->hw.vap_flush.cmd[8] = cmdpacket0(r300->radeon.radeonScreen, R300_VAP_PVS_STATE_FLUSH_REG, 1); - r300->hw.vap_flush.cmd[9] = 0; - } else { - ALLOC_STATE(vap_flush, never, 10, 0); - } - - ALLOC_STATE(vpi, vpu, R300_VPI_CMDSIZE, 0); r300->hw.vpi.cmd[0] = cmdvpu(r300->radeon.radeonScreen, R300_PVS_CODE_START, 0); diff --git a/src/mesa/drivers/dri/r300/r300_context.c b/src/mesa/drivers/dri/r300/r300_context.c index fe2ed22dc24..cfeb5407e91 100644 --- a/src/mesa/drivers/dri/r300/r300_context.c +++ b/src/mesa/drivers/dri/r300/r300_context.c @@ -109,7 +109,6 @@ static const struct dri_extension card_extensions[] = { {"GL_EXT_blend_func_separate", GL_EXT_blend_func_separate_functions}, {"GL_EXT_blend_minmax", GL_EXT_blend_minmax_functions}, {"GL_EXT_blend_subtract", NULL}, - {"GL_EXT_packed_depth_stencil", NULL}, {"GL_EXT_fog_coord", GL_EXT_fog_coord_functions }, {"GL_EXT_gpu_program_parameters", GL_EXT_gpu_program_parameters_functions}, {"GL_EXT_provoking_vertex", GL_EXT_provoking_vertex_functions }, @@ -320,7 +319,14 @@ static void r300_init_vtbl(radeonContextPtr radeon) } else radeon->vtbl.emit_query_finish = r300_emit_query_finish; - radeon->vtbl.blit = r300_blit; + 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) @@ -455,6 +461,9 @@ static void r300InitGLExtensions(GLcontext *ctx) } if (r300->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV350) _mesa_enable_extension(ctx, "GL_ARB_half_float_vertex"); + + if (r300->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515) + _mesa_enable_extension(ctx, "GL_EXT_packed_depth_stencil"); } static void r300InitIoctlFuncs(struct dd_function_table *functions) @@ -491,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_context.h b/src/mesa/drivers/dri/r300/r300_context.h index 78ab43a99f9..df7115e7dae 100644 --- a/src/mesa/drivers/dri/r300/r300_context.h +++ b/src/mesa/drivers/dri/r300/r300_context.h @@ -355,7 +355,6 @@ struct r300_hw_state { struct radeon_state_atom zb_hiz_offset; /* (4F44) */ struct radeon_state_atom zb_hiz_pitch; /* (4F54) */ - struct radeon_state_atom vap_flush; struct radeon_state_atom vpi; /* vp instructions */ struct radeon_state_atom vpp; /* vp parameters */ struct radeon_state_atom vps; /* vertex point size (?) */ diff --git a/src/mesa/drivers/dri/r300/r300_reg.h b/src/mesa/drivers/dri/r300/r300_reg.h index d18ebab8ff2..ac93563ed9e 100644 --- a/src/mesa/drivers/dri/r300/r300_reg.h +++ b/src/mesa/drivers/dri/r300/r300_reg.h @@ -482,7 +482,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. # define R300_PVS_FIRST_INST_SHIFT 0 # define R300_PVS_XYZW_VALID_INST_SHIFT 10 # define R300_PVS_LAST_INST_SHIFT 20 -/* Addresses are relative the the vertex program parameters area. */ +/* Addresses are relative to the vertex program parameters area. */ #define R300_VAP_PVS_CONST_CNTL 0x22D4 # define R300_PVS_CONST_BASE_OFFSET_SHIFT 0 # define R300_PVS_MAX_CONST_ADDR_SHIFT 16 @@ -1760,7 +1760,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. * The destination register index is in FPI1 (color) and FPI3 (alpha) * together with enable bits. * There are separate enable bits for writing into temporary registers - * (DSTC_REG_* /DSTA_REG) and and program output registers (DSTC_OUTPUT_* + * (DSTC_REG_* /DSTA_REG) and program output registers (DSTC_OUTPUT_* * /DSTA_OUTPUT). You can write to both at once, or not write at all (the * same index must be used for both). * diff --git a/src/mesa/drivers/dri/r300/r300_state.c b/src/mesa/drivers/dri/r300/r300_state.c index 9d1ff6e2ba2..749a2464e7c 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" @@ -366,7 +367,6 @@ static void r300ClipPlane( GLcontext *ctx, GLenum plane, const GLfloat *eq ) p = (GLint) plane - (GLint) GL_CLIP_PLANE0; ip = (GLint *)ctx->Transform._ClipUserPlane[p]; - R300_STATECHANGE( rmesa, vap_flush ); R300_STATECHANGE( rmesa, vpucp[p] ); rmesa->hw.vpucp[p].cmd[R300_VPUCP_X] = ip[0]; rmesa->hw.vpucp[p].cmd[R300_VPUCP_Y] = ip[1]; @@ -590,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; @@ -794,12 +794,14 @@ static void r300PointParameter(GLcontext * ctx, GLenum pname, const GLfloat * pa R300_STATECHANGE(r300, ga_point_minmax); r300->hw.ga_point_minmax.cmd[1] &= ~R300_GA_POINT_MINMAX_MIN_MASK; r300->hw.ga_point_minmax.cmd[1] |= (GLuint)(ctx->Point.MinSize * 6.0); + r300PointSize(ctx, ctx->Point.Size); break; case GL_POINT_SIZE_MAX: R300_STATECHANGE(r300, ga_point_minmax); r300->hw.ga_point_minmax.cmd[1] &= ~R300_GA_POINT_MINMAX_MAX_MASK; r300->hw.ga_point_minmax.cmd[1] |= (GLuint)(ctx->Point.MaxSize * 6.0) << R300_GA_POINT_MINMAX_MAX_SHIFT; + r300PointSize(ctx, ctx->Point.Size); break; case GL_POINT_DISTANCE_ATTENUATION: break; @@ -1762,8 +1764,6 @@ static void r300ResetHwState(r300ContextPtr r300) if (RADEON_DEBUG & RADEON_STATE) fprintf(stderr, "%s\n", __FUNCTION__); - radeon_firevertices(&r300->radeon); - r300ColorMask(ctx, ctx->Color.ColorMask[0][RCOMP], ctx->Color.ColorMask[0][GCOMP], @@ -1985,23 +1985,6 @@ void r300UpdateShaders(r300ContextPtr rmesa) if (rmesa->options.hw_tcl_enabled) { struct r300_vertex_program *vp; - if (rmesa->radeon.NewGLState) { - int i; - for (i = _TNL_FIRST_MAT; i <= _TNL_LAST_MAT; i++) { - rmesa->temp_attrib[i] = - TNL_CONTEXT(ctx)->vb.AttribPtr[i]; - TNL_CONTEXT(ctx)->vb.AttribPtr[i] = - &rmesa->dummy_attrib[i]; - } - - _tnl_UpdateFixedFunctionProgram(ctx); - - for (i = _TNL_FIRST_MAT; i <= _TNL_LAST_MAT; i++) { - TNL_CONTEXT(ctx)->vb.AttribPtr[i] = - rmesa->temp_attrib[i]; - } - } - vp = r300SelectAndTranslateVertexShader(ctx); r300SwitchFallback(ctx, R300_FALLBACK_VERTEX_PROGRAM, vp->error); @@ -2255,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. */ @@ -2284,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; } @@ -2305,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; @@ -2344,8 +2393,14 @@ 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; + + if (radeon->radeonScreen->kernel_mm) { + functions->CopyPixels = _mesa_meta_CopyPixels; + functions->DrawPixels = _mesa_meta_DrawPixels; + 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 d46bf9f1796..e70f84f4e4b 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_swtcl.c b/src/mesa/drivers/dri/r300/r300_swtcl.c index 93983cee205..4dcc7cb022a 100644 --- a/src/mesa/drivers/dri/r300/r300_swtcl.c +++ b/src/mesa/drivers/dri/r300/r300_swtcl.c @@ -364,7 +364,6 @@ static struct { #define DO_POINTS 1 #define DO_FULL_QUAD 1 -#define HAVE_RGBA 1 #define HAVE_SPEC 1 #define HAVE_BACK_COLORS 0 #define HAVE_HW_FLATSHADE 1 diff --git a/src/mesa/drivers/dri/r300/r300_tex.c b/src/mesa/drivers/dri/r300/r300_tex.c index 8dd85073954..baef206bc26 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 9694e703b83..aca44cd7669 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/r300_vertprog.c b/src/mesa/drivers/dri/r300/r300_vertprog.c index 6a366b438b8..129004fee78 100644 --- a/src/mesa/drivers/dri/r300/r300_vertprog.c +++ b/src/mesa/drivers/dri/r300/r300_vertprog.c @@ -79,6 +79,7 @@ static int r300VertexProgUpdateParams(GLcontext * ctx, struct r300_vertex_progra break; } + assert(src); dst[4*i] = src[0]; dst[4*i + 1] = src[1]; dst[4*i + 2] = src[2]; @@ -311,6 +312,7 @@ struct r300_vertex_program * r300SelectAndTranslateVertexShader(GLcontext *ctx) r300SelectAndTranslateFragmentShader(ctx); } + assert(r300->selected_fp); wanted_key.FpReads = r300->selected_fp->InputsRead; wanted_key.FogAttr = r300->selected_fp->fog_attr; wanted_key.WPosAttr = r300->selected_fp->wpos_attr; @@ -340,8 +342,6 @@ static void r300EmitVertexProgram(r300ContextPtr r300, int dest, struct r300_ver assert((code->length > 0) && (code->length % 4 == 0)); - R300_STATECHANGE( r300, vap_flush ); - switch ((dest >> 8) & 0xf) { case 0: R300_STATECHANGE(r300, vpi); @@ -379,7 +379,7 @@ void r300SetupVertexProgram(r300ContextPtr rmesa) ((drm_r300_cmd_header_t *) rmesa->hw.vpi.cmd)->vpu.count = 0; ((drm_r300_cmd_header_t *) rmesa->hw.vps.cmd)->vpu.count = 0; - R300_STATECHANGE(rmesa, vap_flush); + R300_STATECHANGE(rmesa, vap_cntl); R300_STATECHANGE(rmesa, vpp); param_count = r300VertexProgUpdateParams(ctx, prog, (float *)&rmesa->hw.vpp.cmd[R300_VPP_PARAM_0]); bump_vpu_count(rmesa->hw.vpp.cmd, param_count); 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 00000000000..3b03803126f --- /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 00000000000..d9836d7326e --- /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 00000000000..d4bfe27da64 --- /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 00000000000..31074c581ea --- /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 d05847d650f..00000000000 --- 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 5d509415393..17915621ee4 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_blit.c b/src/mesa/drivers/dri/r600/r600_blit.c index 4bb77a398f9..244fdc4ffbb 100644 --- a/src/mesa/drivers/dri/r600/r600_blit.c +++ b/src/mesa/drivers/dri/r600/r600_blit.c @@ -33,7 +33,7 @@ #include "r600_cmdbuf.h" /* common formats supported as both textures and render targets */ -static unsigned is_blit_supported(gl_format mesa_format) +unsigned r600_check_blit(gl_format mesa_format) { switch (mesa_format) { case MESA_FORMAT_RGBA8888: @@ -1532,24 +1532,22 @@ static GLboolean validate_buffers(context_t *rmesa, struct radeon_bo *dst_bo) { int ret; - radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs, - src_bo, RADEON_GEM_DOMAIN_VRAM, 0); - radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs, - dst_bo, 0, RADEON_GEM_DOMAIN_VRAM); + radeon_cs_space_reset_bos(rmesa->radeon.cmdbuf.cs); - radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs, - rmesa->blit_bo, RADEON_GEM_DOMAIN_GTT, 0); + ret = radeon_cs_space_check_with_bo(rmesa->radeon.cmdbuf.cs, + src_bo, RADEON_GEM_DOMAIN_VRAM | RADEON_GEM_DOMAIN_GTT, 0); + if (ret) + return GL_FALSE; ret = radeon_cs_space_check_with_bo(rmesa->radeon.cmdbuf.cs, - rmesa->blit_bo, - RADEON_GEM_DOMAIN_GTT, 0); + dst_bo, 0, RADEON_GEM_DOMAIN_VRAM | RADEON_GEM_DOMAIN_GTT); if (ret) return GL_FALSE; ret = radeon_cs_space_check_with_bo(rmesa->radeon.cmdbuf.cs, - first_elem(&rmesa->radeon.dma.reserved)->bo, - RADEON_GEM_DOMAIN_GTT, 0); + rmesa->blit_bo, + RADEON_GEM_DOMAIN_GTT, 0); if (ret) return GL_FALSE; @@ -1580,7 +1578,7 @@ unsigned r600_blit(GLcontext *ctx, context_t *context = R700_CONTEXT(ctx); int id = 0; - if (!is_blit_supported(dst_mesaformat)) + if (!r600_check_blit(dst_mesaformat)) return GL_FALSE; if (src_bo == dst_bo) { diff --git a/src/mesa/drivers/dri/r600/r600_blit.h b/src/mesa/drivers/dri/r600/r600_blit.h index f280e23489e..d56b21ba9b5 100644 --- a/src/mesa/drivers/dri/r600/r600_blit.h +++ b/src/mesa/drivers/dri/r600/r600_blit.h @@ -1,3 +1,35 @@ +/* + * Copyright (C) 2009 Advanced Micro Devices, 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, 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. + * + */ + +#ifndef R600_BLIT_H +#define R600_BLIT_H + +unsigned r600_check_blit(gl_format mesa_format); + unsigned r600_blit(GLcontext *ctx, struct radeon_bo *src_bo, intptr_t src_offset, @@ -19,3 +51,4 @@ unsigned r600_blit(GLcontext *ctx, unsigned h, unsigned flip_y); +#endif // R600_BLIT_H diff --git a/src/mesa/drivers/dri/r600/r600_context.c b/src/mesa/drivers/dri/r600/r600_context.c index f575e74c3ed..fddac2f9bdc 100644 --- a/src/mesa/drivers/dri/r600/r600_context.c +++ b/src/mesa/drivers/dri/r600/r600_context.c @@ -140,6 +140,7 @@ static const struct dri_extension card_extensions[] = { {"GL_NV_blend_square", NULL}, {"GL_NV_vertex_program", GL_NV_vertex_program_functions}, {"GL_SGIS_generate_mipmap", NULL}, + {"GL_ARB_pixel_buffer_object", NULL}, {NULL, NULL} /* *INDENT-ON* */ }; @@ -236,7 +237,9 @@ static void r600_init_vtbl(radeonContextPtr radeon) radeon->vtbl.pre_emit_atoms = r600_vtbl_pre_emit_atoms; radeon->vtbl.fallback = r600_fallback; 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) @@ -340,9 +343,12 @@ static void r600InitGLExtensions(GLcontext *ctx) _mesa_enable_extension(ctx, "GL_EXT_texture_compression_s3tc"); } - /* XXX: RV740 only seems to report results from half of its DBs */ - if (r600->radeon.radeonScreen->chip_family == CHIP_FAMILY_RV740) - _mesa_disable_extension(ctx, "GL_ARB_occlusion_query"); + /* RV740 had a broken pipe config prior to drm 1.32 */ + if (!r600->radeon.radeonScreen->kernel_mm) { + if ((r600->radeon.dri.drmMinor < 32) && + (r600->radeon.radeonScreen->chip_family == CHIP_FAMILY_RV740)) + _mesa_disable_extension(ctx, "GL_ARB_occlusion_query"); + } } /* Create the device specific rendering context. @@ -378,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/r600_texstate.c b/src/mesa/drivers/dri/r600/r600_texstate.c index dd33ef3c6a2..1600033b9bd 100644 --- a/src/mesa/drivers/dri/r600/r600_texstate.c +++ b/src/mesa/drivers/dri/r600/r600_texstate.c @@ -373,17 +373,11 @@ static GLboolean r600GetTexFormat(struct gl_texture_object *tObj, gl_format mesa break; */ case MESA_FORMAT_RGB_DXT1: /* not supported yet */ - - break; case MESA_FORMAT_RGBA_DXT1: /* not supported yet */ - - break; case MESA_FORMAT_RGBA_DXT3: /* not supported yet */ - - break; case MESA_FORMAT_RGBA_DXT5: /* not supported yet */ + return GL_FALSE; - break; case MESA_FORMAT_RGBA_FLOAT32: SETfield(t->SQ_TEX_RESOURCE1, FMT_32_32_32_32_FLOAT, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask); @@ -701,8 +695,8 @@ void r600SetDepthTexMode(struct gl_texture_object *tObj) t = radeon_tex_obj(tObj); - r600GetTexFormat(tObj, tObj->Image[0][tObj->BaseLevel]->TexFormat); - + if(!r600GetTexFormat(tObj, tObj->Image[0][tObj->BaseLevel]->TexFormat)) + t->validated = GL_FALSE; } /** @@ -711,7 +705,7 @@ void r600SetDepthTexMode(struct gl_texture_object *tObj) * \param rmesa Context pointer * \param t the r300 texture object */ -static void setup_hardware_state(GLcontext * ctx, struct gl_texture_object *texObj, int unit) +static GLboolean setup_hardware_state(GLcontext * ctx, struct gl_texture_object *texObj, int unit) { context_t *rmesa = R700_CONTEXT(ctx); radeonTexObj *t = radeon_tex_obj(texObj); @@ -721,15 +715,15 @@ static void setup_hardware_state(GLcontext * ctx, struct gl_texture_object *texO if (rmesa->radeon.radeonScreen->driScreen->dri2.enabled && t->image_override && t->bo) - return; + return GL_TRUE; firstImage = t->base.Image[0][t->minLod]; if (!t->image_override) { if (!r600GetTexFormat(texObj, firstImage->TexFormat)) { - radeon_error("unexpected texture format in %s\n", - __FUNCTION__); - return; + radeon_warning("unsupported texture format in %s\n", + __FUNCTION__); + return GL_FALSE; } } @@ -754,7 +748,7 @@ static void setup_hardware_state(GLcontext * ctx, struct gl_texture_object *texO break; default: radeon_error("unexpected texture target type in %s\n", __FUNCTION__); - return; + return GL_FALSE; } row_align = rmesa->radeon.texture_row_align - 1; @@ -799,6 +793,7 @@ static void setup_hardware_state(GLcontext * ctx, struct gl_texture_object *texO CLEARfield(t->SQ_TEX_SAMPLER0, DEPTH_COMPARE_FUNCTION_mask); } + return GL_TRUE; } /** @@ -815,7 +810,8 @@ static GLboolean r600_validate_texture(GLcontext * ctx, struct gl_texture_object /* Configure the hardware registers (more precisely, the cached version * of the hardware registers). */ - setup_hardware_state(ctx, texObj, unit); + if (!setup_hardware_state(ctx, texObj, unit)) + return GL_FALSE; t->validated = GL_TRUE; return GL_TRUE; diff --git a/src/mesa/drivers/dri/r600/r700_assembler.c b/src/mesa/drivers/dri/r600/r700_assembler.c index d0059fad2ea..834bcc63e31 100644 --- a/src/mesa/drivers/dri/r600/r700_assembler.c +++ b/src/mesa/drivers/dri/r600/r700_assembler.c @@ -1250,6 +1250,7 @@ GLboolean assemble_src(r700_AssemblerBase *pAsm, if(pAsm->aArgSubst[1+src] >= 0) { + assert(fld >= 0); setaddrmode_PVSSRC(&(pAsm->S[fld].src), ADDR_ABSOLUTE); pAsm->S[fld].src.rtype = SRC_REG_TEMPORARY; pAsm->S[fld].src.reg = pAsm->aArgSubst[1+src]; @@ -1745,18 +1746,21 @@ GLboolean assemble_alu_src(R700ALUInstruction* alu_instruction_ptr, switch (source_index) { case 0: + assert(alu_instruction_ptr); alu_instruction_ptr->m_Word0.f.src0_sel = src_sel; alu_instruction_ptr->m_Word0.f.src0_rel = src_rel; alu_instruction_ptr->m_Word0.f.src0_chan = src_chan; alu_instruction_ptr->m_Word0.f.src0_neg = src_neg; break; case 1: + assert(alu_instruction_ptr); alu_instruction_ptr->m_Word0.f.src1_sel = src_sel; alu_instruction_ptr->m_Word0.f.src1_rel = src_rel; alu_instruction_ptr->m_Word0.f.src1_chan = src_chan; alu_instruction_ptr->m_Word0.f.src1_neg = src_neg; break; case 2: + assert(alu_instruction_ptr); alu_instruction_ptr->m_Word1_OP3.f.src2_sel = src_sel; alu_instruction_ptr->m_Word1_OP3.f.src2_rel = src_rel; alu_instruction_ptr->m_Word1_OP3.f.src2_chan = src_chan; diff --git a/src/mesa/drivers/dri/r600/r700_chip.c b/src/mesa/drivers/dri/r600/r700_chip.c index a742dbcf129..63614b160cc 100644 --- a/src/mesa/drivers/dri/r600/r700_chip.c +++ b/src/mesa/drivers/dri/r600/r700_chip.c @@ -1349,7 +1349,7 @@ void r600InitAtoms(context_t *context) ALLOC_STATE(poly, always, 10, r700SendPolyState); ALLOC_STATE(cb, cb, 18, r700SendCBState); ALLOC_STATE(clrcmp, always, 6, r700SendCBCLRCMPState); - ALLOC_STATE(cb_target, always, 25, r700SendRenderTargetState); + ALLOC_STATE(cb_target, always, 29, r700SendRenderTargetState); ALLOC_STATE(blnd, blnd, (6 + (R700_MAX_RENDER_TARGETS * 3)), r700SendCBBlendState); ALLOC_STATE(blnd_clr, always, 6, r700SendCBBlendColorState); ALLOC_STATE(sx, always, 9, r700SendSXState); diff --git a/src/mesa/drivers/dri/r600/r700_render.c b/src/mesa/drivers/dri/r600/r700_render.c index fdd02fac237..1929b7cc129 100644 --- a/src/mesa/drivers/dri/r600/r700_render.c +++ b/src/mesa/drivers/dri/r600/r700_render.c @@ -419,7 +419,7 @@ static void r700RunRenderPrimitiveImmediate(GLcontext * ctx, int start, int end, } /* start 3d, idle, cb/db flush */ -#define PRE_EMIT_STATE_BUFSZ 5 + 5 + 18 +#define PRE_EMIT_STATE_BUFSZ 5 + 5 + 14 static GLuint r700PredictRenderSize(GLcontext* ctx, const struct _mesa_prim *prim, @@ -829,11 +829,10 @@ static void r700SetupIndexBuffer(GLcontext *ctx, const struct _mesa_index_buffer #if MESA_BIG_ENDIAN if (mesa_ind_buf->type == GL_UNSIGNED_INT) - { #else if (mesa_ind_buf->type != GL_UNSIGNED_BYTE) - { #endif + { const GLvoid *src_ptr; GLvoid *dst_ptr; GLboolean mapped_named_bo = GL_FALSE; @@ -872,6 +871,14 @@ static void r700SetupIndexBuffer(GLcontext *ctx, const struct _mesa_index_buffer } } +static GLboolean check_fallbacks(GLcontext *ctx) +{ + if (ctx->RenderMode != GL_RENDER) + return GL_TRUE; + + return GL_FALSE; +} + static GLboolean r700TryDrawPrims(GLcontext *ctx, const struct gl_client_array *arrays[], const struct _mesa_prim *prim, @@ -888,6 +895,9 @@ static GLboolean r700TryDrawPrims(GLcontext *ctx, if (ctx->NewState) _mesa_update_state( ctx ); + if (check_fallbacks(ctx)) + return GL_FALSE; + _tnl_UpdateFixedFunctionProgram(ctx); r700SetVertexFormat(ctx, arrays, max_index + 1); /* shaders need to be updated before buffers are validated */ @@ -983,8 +993,10 @@ static void r700DrawPrims(GLcontext *ctx, retval = r700TryDrawPrims(ctx, arrays, prim, nr_prims, ib, min_index, max_index); /* If failed run tnl pipeline - it should take care of fallbacks */ - if (!retval) + if (!retval) { + _swsetup_Wakeup(ctx); _tnl_draw_prims(ctx, arrays, prim, nr_prims, ib, min_index, max_index); + } } void r700InitDraw(GLcontext *ctx) diff --git a/src/mesa/drivers/dri/r600/r700_state.c b/src/mesa/drivers/dri/r600/r700_state.c index 4ebdbbfad25..2953ffd0288 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" @@ -911,10 +912,12 @@ static void r700PointParameter(GLcontext * ctx, GLenum pname, const GLfloat * pa case GL_POINT_SIZE_MIN: SETfield(r700->PA_SU_POINT_MINMAX.u32All, (int)(ctx->Point.MinSize * 8.0), MIN_SIZE_shift, MIN_SIZE_mask); + r700PointSize(ctx, ctx->Point.Size); break; case GL_POINT_SIZE_MAX: SETfield(r700->PA_SU_POINT_MINMAX.u32All, (int)(ctx->Point.MaxSize * 8.0), MAX_SIZE_shift, MAX_SIZE_mask); + r700PointSize(ctx, ctx->Point.Size); break; case GL_POINT_DISTANCE_ATTENUATION: break; @@ -1626,8 +1629,6 @@ void r700InitState(GLcontext * ctx) //------------------- R700_CHIP_CONTEXT *r700 = (R700_CHIP_CONTEXT*)(&context->hw); int id = 0; - radeon_firevertices(&context->radeon); - r700->TA_CNTL_AUX.u32All = 0; SETfield(r700->TA_CNTL_AUX.u32All, 28, TD_FIFO_CREDIT_shift, TD_FIFO_CREDIT_mask); r700->VC_ENHANCE.u32All = 0; @@ -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,13 @@ void r700InitStateFuncs(struct dd_function_table *functions) //----------------- functions->Scissor = radeonScissor; - functions->DrawBuffer = radeonDrawBuffer; - functions->ReadBuffer = radeonReadBuffer; + functions->DrawBuffer = radeonDrawBuffer; + functions->ReadBuffer = radeonReadBuffer; + if (radeon->radeonScreen->kernel_mm) { + functions->CopyPixels = _mesa_meta_CopyPixels; + functions->DrawPixels = _mesa_meta_DrawPixels; + functions->ReadPixels = radeonReadPixels; + } } diff --git a/src/mesa/drivers/dri/r600/r700_state.h b/src/mesa/drivers/dri/r600/r700_state.h index 60c6a7f23ca..56885e0b154 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/r700_vertprog.c b/src/mesa/drivers/dri/r600/r700_vertprog.c index 07e0adc8905..05c65164d60 100644 --- a/src/mesa/drivers/dri/r600/r700_vertprog.c +++ b/src/mesa/drivers/dri/r600/r700_vertprog.c @@ -42,7 +42,7 @@ #include "radeon_debug.h" #include "r600_context.h" #include "r600_cmdbuf.h" -#include "shader/programopt.c" +#include "shader/programopt.h" #include "r700_debug.h" #include "r700_vertprog.h" 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 00000000000..3b03803126f --- /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 00000000000..d9836d7326e --- /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 00000000000..d4bfe27da64 --- /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 00000000000..31074c581ea --- /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 d05847d650f..00000000000 --- 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 a54ea16ec63..19df62742ec 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 0df4fbb33c5..143822361e1 100644 --- a/src/mesa/drivers/dri/radeon/radeon_blit.c +++ b/src/mesa/drivers/dri/radeon/radeon_blit.c @@ -38,7 +38,7 @@ static inline uint32_t cmdpacket0(struct radeon_screen *rscrn, } /* common formats supported as both textures and render targets */ -static unsigned is_blit_supported(gl_format mesa_format) +unsigned r100_check_blit(gl_format mesa_format) { /* XXX others? BE/LE? */ switch (mesa_format) { @@ -48,6 +48,8 @@ static unsigned is_blit_supported(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: @@ -204,15 +218,16 @@ static GLboolean validate_buffers(struct r100_context *r100, struct radeon_bo *dst_bo) { int ret; - radeon_cs_space_add_persistent_bo(r100->radeon.cmdbuf.cs, - src_bo, RADEON_GEM_DOMAIN_VRAM, 0); - radeon_cs_space_add_persistent_bo(r100->radeon.cmdbuf.cs, - dst_bo, 0, RADEON_GEM_DOMAIN_VRAM); + radeon_cs_space_reset_bos(r100->radeon.cmdbuf.cs); ret = radeon_cs_space_check_with_bo(r100->radeon.cmdbuf.cs, - first_elem(&r100->radeon.dma.reserved)->bo, - RADEON_GEM_DOMAIN_GTT, 0); + src_bo, RADEON_GEM_DOMAIN_VRAM | RADEON_GEM_DOMAIN_GTT, 0); + if (ret) + return GL_FALSE; + + ret = radeon_cs_space_check_with_bo(r100->radeon.cmdbuf.cs, + dst_bo, 0, RADEON_GEM_DOMAIN_VRAM | RADEON_GEM_DOMAIN_GTT); if (ret) return GL_FALSE; @@ -329,7 +344,7 @@ unsigned r100_blit(GLcontext *ctx, { struct r100_context *r100 = R100_CONTEXT(ctx); - if (!is_blit_supported(dst_mesaformat)) + if (!r100_check_blit(dst_mesaformat)) return GL_FALSE; /* Make sure that colorbuffer has even width - hw limitation */ diff --git a/src/mesa/drivers/dri/radeon/radeon_blit.h b/src/mesa/drivers/dri/radeon/radeon_blit.h index d36366ff791..d7d0b5554a6 100644 --- a/src/mesa/drivers/dri/radeon/radeon_blit.h +++ b/src/mesa/drivers/dri/radeon/radeon_blit.h @@ -30,6 +30,8 @@ void r100_blit_init(struct r100_context *r100); +unsigned r100_check_blit(gl_format mesa_format); + unsigned r100_blit(GLcontext *ctx, struct radeon_bo *src_bo, intptr_t src_offset, diff --git a/src/mesa/drivers/dri/radeon/radeon_chipset.h b/src/mesa/drivers/dri/radeon/radeon_chipset.h index 46a9cd5ff84..f17a305bce8 100644 --- a/src/mesa/drivers/dri/radeon/radeon_chipset.h +++ b/src/mesa/drivers/dri/radeon/radeon_chipset.h @@ -340,6 +340,7 @@ #define PCI_CHIP_RS880_9712 0x9712 #define PCI_CHIP_RS880_9713 0x9713 #define PCI_CHIP_RS880_9714 0x9714 +#define PCI_CHIP_RS880_9715 0x9715 #define PCI_CHIP_RV770_9440 0x9440 #define PCI_CHIP_RV770_9441 0x9441 diff --git a/src/mesa/drivers/dri/radeon/radeon_common.c b/src/mesa/drivers/dri/radeon/radeon_common.c index 79f3ff7da65..13f1f0611b8 100644 --- a/src/mesa/drivers/dri/radeon/radeon_common.c +++ b/src/mesa/drivers/dri/radeon/radeon_common.c @@ -1325,11 +1325,6 @@ void rcommonBeginBatch(radeonContextPtr rmesa, int n, const char *function, int line) { - if (!rmesa->cmdbuf.cs->cdw && dostate) { - radeon_print(RADEON_STATE, RADEON_NORMAL, - "Reemit state after flush (from %s)\n", function); - radeonEmitState(rmesa); - } radeon_cs_begin(rmesa->cmdbuf.cs, n, file, function, line); radeon_print(RADEON_CS, RADEON_VERBOSE, "BEGIN_BATCH(%d) at %d, from %s:%i\n", diff --git a/src/mesa/drivers/dri/radeon/radeon_common.h b/src/mesa/drivers/dri/radeon/radeon_common.h index cd01c9984e3..35b3f08fff9 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 e397ee8c226..5156c5d0d0a 100644 --- a/src/mesa/drivers/dri/radeon/radeon_common_context.h +++ b/src/mesa/drivers/dri/radeon/radeon_common_context.h @@ -518,6 +518,7 @@ struct radeon_context { void (*free_context)(GLcontext *ctx); void (*emit_query_finish)(radeonContextPtr radeon); void (*update_scissor)(GLcontext *ctx); + unsigned (*check_blit)(gl_format mesa_format); unsigned (*blit)(GLcontext *ctx, struct radeon_bo *src_bo, intptr_t src_offset, @@ -538,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 4625af14ad8..56aba16e9e0 100644 --- a/src/mesa/drivers/dri/radeon/radeon_context.c +++ b/src/mesa/drivers/dri/radeon/radeon_context.c @@ -198,7 +198,9 @@ static void r100_init_vtbl(radeonContextPtr radeon) radeon->vtbl.fallback = radeonFallback; radeon->vtbl.free_context = r100_vtbl_free_context; 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_dma.c b/src/mesa/drivers/dri/radeon/radeon_dma.c index d31e4e47ddb..22499bc38d1 100644 --- a/src/mesa/drivers/dri/radeon/radeon_dma.c +++ b/src/mesa/drivers/dri/radeon/radeon_dma.c @@ -184,6 +184,8 @@ void radeonRefillCurrentDmaRegion(radeonContextPtr rmesa, int size) radeon_print(RADEON_DMA, RADEON_NORMAL, "%s size %d minimum_size %d\n", __FUNCTION__, size, rmesa->dma.minimum_size); + if (!is_empty_list(&rmesa->dma.reserved)) + radeon_bo_unmap(first_elem(&rmesa->dma.reserved)->bo); if (is_empty_list(&rmesa->dma.free) || last_elem(&rmesa->dma.free)->bo->size < size) { @@ -211,7 +213,7 @@ again_alloc: rmesa->dma.current_used = 0; rmesa->dma.current_vertexptr = 0; - + if (radeon_cs_space_check_with_bo(rmesa->cmdbuf.cs, first_elem(&rmesa->dma.reserved)->bo, RADEON_GEM_DOMAIN_GTT, 0)) @@ -221,6 +223,7 @@ again_alloc: /* Cmd buff have been flushed in radeon_revalidate_bos */ goto again_alloc; } + radeon_bo_map(first_elem(&rmesa->dma.reserved)->bo, 1); } /* Allocates a region from rmesa->dma.current. If there isn't enough @@ -332,6 +335,10 @@ void radeonReleaseDmaRegions(radeonContextPtr rmesa) /* request updated cs processing information from kernel */ legacy_track_pending(rmesa->radeonScreen->bom, 0); } + + if (!is_empty_list(&rmesa->dma.reserved)) + radeon_bo_unmap(first_elem(&rmesa->dma.reserved)->bo); + /* move waiting bos to free list. wait list provides gpu time to handle data before reuse */ foreach_s(dma_bo, temp, &rmesa->dma.wait) { @@ -349,8 +356,11 @@ void radeonReleaseDmaRegions(radeonContextPtr rmesa) FREE(dma_bo); continue; } - if (!radeon_bo_is_idle(dma_bo->bo)) + if (!radeon_bo_is_idle(dma_bo->bo)) { + if (rmesa->radeonScreen->driScreen->dri2.enabled) + break; continue; + } remove_from_list(dma_bo); dma_bo->expire_counter = expire_at; insert_at_tail(&rmesa->dma.free, dma_bo); @@ -388,7 +398,7 @@ void rcommon_flush_last_swtcl_prim( GLcontext *ctx ) { radeonContextPtr rmesa = RADEON_CONTEXT(ctx); struct radeon_dma *dma = &rmesa->dma; - + if (RADEON_DEBUG & RADEON_IOCTL) fprintf(stderr, "%s\n", __FUNCTION__); dma->flush = NULL; diff --git a/src/mesa/drivers/dri/radeon/radeon_fbo.c b/src/mesa/drivers/dri/radeon/radeon_fbo.c index 46664a17556..63986058356 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"); + "%s(%p, rrb %p, texImage %p, texFormat %s) \n", + __func__, ctx, rrb, texImage, _mesa_get_format_name(texImage->TexFormat)); + + 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; } - 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); - - retry++; - goto restart; - } - - 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_ioctl.c b/src/mesa/drivers/dri/radeon/radeon_ioctl.c index c7ea4521568..5ac526c6deb 100644 --- a/src/mesa/drivers/dri/radeon/radeon_ioctl.c +++ b/src/mesa/drivers/dri/radeon/radeon_ioctl.c @@ -442,6 +442,8 @@ static void radeonKernelClear(GLcontext *ctx, GLuint flags) GLint ret, i; GLint cx, cy, cw, ch; + radeonEmitState(&rmesa->radeon); + LOCK_HARDWARE( &rmesa->radeon ); /* compute region after locking: */ diff --git a/src/mesa/drivers/dri/radeon/radeon_mipmap_tree.c b/src/mesa/drivers/dri/radeon/radeon_mipmap_tree.c index cd843d965e5..7f5fb99fa4f 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; - return rowStride * ((height + blockHeight - 1) / blockHeight); + 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 (_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); @@ -539,6 +553,8 @@ static radeon_mipmap_tree * get_biggest_matching_miptree(radeonTexObj *texObj, } if (mtCount == 0) { + free(mtSizes); + free(mts); return NULL; } diff --git a/src/mesa/drivers/dri/radeon/radeon_mipmap_tree.h b/src/mesa/drivers/dri/radeon/radeon_mipmap_tree.h index c911688c1a5..088f9701722 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 00000000000..dadb8002c7d --- /dev/null +++ b/src/mesa/drivers/dri/radeon/radeon_pixel_read.c @@ -0,0 +1,199 @@ +/* + * Copyright (C) 2010 Maciej Cencora <[email protected]> + * + * 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_screen.c b/src/mesa/drivers/dri/radeon/radeon_screen.c index 631f729048a..6415ec1239c 100644 --- a/src/mesa/drivers/dri/radeon/radeon_screen.c +++ b/src/mesa/drivers/dri/radeon/radeon_screen.c @@ -826,6 +826,7 @@ static int radeon_set_screen_flags(radeonScreenPtr screen, int device_id) case PCI_CHIP_RS880_9712: case PCI_CHIP_RS880_9713: case PCI_CHIP_RS880_9714: + case PCI_CHIP_RS880_9715: screen->chip_family = CHIP_FAMILY_RS880; screen->chip_flags = RADEON_CHIPSET_TCL; break; diff --git a/src/mesa/drivers/dri/radeon/radeon_state.c b/src/mesa/drivers/dri/radeon/radeon_state.c index 7db745a1802..0afbc19c127 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" @@ -1900,7 +1901,7 @@ void radeonUploadTexMatrix( r100ContextPtr rmesa, So: if we need the q coord in the end (solely determined by the texture target, i.e. 2d / 1d / texrect targets) we swap the third and 4th row. Additionally, if we don't have texgen but 4 tex coords submitted, we swap - column 3 and 4 (for the 2d / 1d / texrect targets) since the the q coord + column 3 and 4 (for the 2d / 1d / texrect targets) since the q coord will get submitted in the "wrong", i.e. 3rd, slot. If an app submits 3 coords for 2d targets, we assume it is saving on vertex size and using the texture matrix to swap the r and q coords around (ut2k3 @@ -2248,13 +2249,17 @@ void radeonInitStateFuncs( GLcontext *ctx , GLboolean dri2 ) ctx->Driver.DrawBuffer = radeonDrawBuffer; ctx->Driver.ReadBuffer = radeonReadBuffer; + if (dri2) { + ctx->Driver.CopyPixels = _mesa_meta_CopyPixels; + ctx->Driver.DrawPixels = _mesa_meta_DrawPixels; + ctx->Driver.ReadPixels = radeonReadPixels; + } ctx->Driver.AlphaFunc = radeonAlphaFunc; ctx->Driver.BlendEquationSeparate = radeonBlendEquationSeparate; ctx->Driver.BlendFuncSeparate = radeonBlendFuncSeparate; ctx->Driver.ClearColor = radeonClearColor; ctx->Driver.ClearDepth = radeonClearDepth; - ctx->Driver.ClearIndex = NULL; ctx->Driver.ClearStencil = radeonClearStencil; ctx->Driver.ClipPlane = radeonClipPlane; ctx->Driver.ColorMask = radeonColorMask; @@ -2266,7 +2271,6 @@ void radeonInitStateFuncs( GLcontext *ctx , GLboolean dri2 ) ctx->Driver.Fogfv = radeonFogfv; ctx->Driver.FrontFace = radeonFrontFace; ctx->Driver.Hint = NULL; - ctx->Driver.IndexMask = NULL; ctx->Driver.LightModelfv = radeonLightModelfv; ctx->Driver.Lightfv = radeonLightfv; ctx->Driver.LineStipple = radeonLineStipple; diff --git a/src/mesa/drivers/dri/radeon/radeon_swtcl.c b/src/mesa/drivers/dri/radeon/radeon_swtcl.c index 5a71b510fa9..f2fcb46688a 100644 --- a/src/mesa/drivers/dri/radeon/radeon_swtcl.c +++ b/src/mesa/drivers/dri/radeon/radeon_swtcl.c @@ -524,7 +524,6 @@ static struct { #define DO_POINTS 1 #define DO_FULL_QUAD 1 -#define HAVE_RGBA 1 #define HAVE_SPEC 1 #define HAVE_BACK_COLORS 0 #define HAVE_HW_FLATSHADE 1 diff --git a/src/mesa/drivers/dri/radeon/radeon_tex_copy.c b/src/mesa/drivers/dri/radeon/radeon_tex_copy.c index d6aeb7049f4..29fd31ac23f 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" @@ -46,18 +47,41 @@ do_copy_texsubimage(GLcontext *ctx, { radeonContextPtr radeon = RADEON_CONTEXT(ctx); struct radeon_renderbuffer *rrb; + unsigned src_bpp; + unsigned dst_bpp; + gl_format src_mesaformat; + 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); assert(timg->base.Height >= dsty + height); @@ -75,13 +99,45 @@ do_copy_texsubimage(GLcontext *ctx, } + src_mesaformat = rrb->base.Format; + dst_mesaformat = timg->base.TexFormat; + src_width = rrb->base.Width; + dst_width = timg->base.Width; + src_bpp = _mesa_get_format_bytes(src_mesaformat); + dst_bpp = _mesa_get_format_bytes(dst_mesaformat); + if (!radeon->vtbl.check_blit(dst_mesaformat)) { + /* depth formats tend to be special */ + if (_mesa_get_format_bits(dst_mesaformat, GL_DEPTH_BITS) > 0) + return GL_FALSE; + + if (src_bpp != dst_bpp) + return GL_FALSE; + + switch (dst_bpp) { + case 2: + src_mesaformat = MESA_FORMAT_RGB565; + dst_mesaformat = MESA_FORMAT_RGB565; + break; + case 4: + src_mesaformat = MESA_FORMAT_ARGB8888; + dst_mesaformat = MESA_FORMAT_ARGB8888; + break; + case 1: + src_mesaformat = MESA_FORMAT_A8; + dst_mesaformat = MESA_FORMAT_A8; + break; + default: + return GL_FALSE; + } + } + /* blit from src buffer to texture */ - return radeon->vtbl.blit(ctx, rrb->bo, src_offset, rrb->base.Format, rrb->pitch/rrb->cpp, - rrb->base.Width, rrb->base.Height, x, y, - timg->mt->bo, dst_offset, timg->base.TexFormat, - timg->mt->levels[level].rowstride / _mesa_get_format_bytes(timg->base.TexFormat), - timg->base.Width, timg->base.Height, - dstx, dsty, width, height, 1); + return radeon->vtbl.blit(ctx, rrb->bo, src_offset, src_mesaformat, rrb->pitch/rrb->cpp, + src_width, rrb->base.Height, x, y, + timg->mt->bo, dst_offset, dst_mesaformat, + timg->mt->levels[level].rowstride / dst_bpp, + dst_width, timg->base.Height, + dstx, dsty, width, height, flip_y); } void @@ -128,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); } @@ -146,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 00000000000..7bf6dcc2e32 --- /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 ff37fd3e86e..2b655fbd953 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 f09dd652142..4ce639ea34e 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 00000000000..403da110106 --- /dev/null +++ b/src/mesa/drivers/dri/radeon/radeon_tile.c @@ -0,0 +1,512 @@ +/* + * Copyright (C) 2010 Maciej Cencora <[email protected]> + * + * 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 00000000000..31d9c5611c3 --- /dev/null +++ b/src/mesa/drivers/dri/radeon/radeon_tile.h @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2010 Maciej Cencora <[email protected]> + * + * 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 7ead588dac8..00000000000 --- 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 2e5c40802c1..53511552c6d 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/savage/savagetex.c b/src/mesa/drivers/dri/savage/savagetex.c index 1a748ee1264..1523af4065f 100644 --- a/src/mesa/drivers/dri/savage/savagetex.c +++ b/src/mesa/drivers/dri/savage/savagetex.c @@ -1021,6 +1021,7 @@ static void savageUploadTexImages( savageContextPtr imesa, savageTexObjPtr t ) return; } + assert(t->base.memBlock); ofs = t->base.memBlock->ofs; t->setup.physAddr = imesa->savageScreen->textureOffset[heap] + ofs; t->bufAddr = (GLubyte *)imesa->savageScreen->texVirtual[heap] + ofs; diff --git a/src/mesa/drivers/dri/savage/savagetris.c b/src/mesa/drivers/dri/savage/savagetris.c index a177a7d2b60..0050485e313 100644 --- a/src/mesa/drivers/dri/savage/savagetris.c +++ b/src/mesa/drivers/dri/savage/savagetris.c @@ -387,7 +387,6 @@ static struct { #define DO_POINTS 1 #define DO_FULL_QUAD 1 -#define HAVE_RGBA 1 #define HAVE_SPEC 1 #define HAVE_BACK_COLORS 0 #define HAVE_HW_FLATSHADE 1 diff --git a/src/mesa/drivers/dri/sis/Makefile b/src/mesa/drivers/dri/sis/Makefile index ad009fc2398..6b4f938bab3 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/sis/sis_tris.c b/src/mesa/drivers/dri/sis/sis_tris.c index 4b41d78d82a..d109a8c41e9 100644 --- a/src/mesa/drivers/dri/sis/sis_tris.c +++ b/src/mesa/drivers/dri/sis/sis_tris.c @@ -375,7 +375,6 @@ static struct { #define DO_POINTS 1 #define DO_FULL_QUAD 1 -#define HAVE_RGBA 1 #define HAVE_SPEC 1 #define HAVE_BACK_COLORS 0 #define HAVE_HW_FLATSHADE 1 @@ -994,6 +993,7 @@ sisFlushPrimsLocked(sisContextPtr smesa) MMIO(REG_3D_PrimitiveSet, smesa->dwPrimitiveSet); } while (smesa->vb_last < smesa->vb_cur) { + assert(sis_emit_func); sis_emit_func(smesa, (char *)smesa->vb_last); smesa->vb_last += incr; } diff --git a/src/mesa/drivers/dri/swrast/Makefile b/src/mesa/drivers/dri/swrast/Makefile index 771169c1ff9..cc59eefdb2d 100644 --- a/src/mesa/drivers/dri/swrast/Makefile +++ b/src/mesa/drivers/dri/swrast/Makefile @@ -17,7 +17,8 @@ ASM_SOURCES = SWRAST_COMMON_SOURCES = \ ../../common/driverfuncs.c \ - ../common/utils.c + ../common/utils.c \ + ../common/dri_sw.c include ../Makefile.template diff --git a/src/mesa/drivers/dri/swrast/swrast.c b/src/mesa/drivers/dri/swrast/swrast.c index b2e7df34e82..e9ca99a86f0 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 <[email protected]> + * Copyright 2008, 2010 George Sapountzis <[email protected]> * * 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); + configs32 = driConcatConfigs(configs24, configs32); - driInitExtensions( NULL, NULL, GL_FALSE ); - - return psp; + return (const __DRIconfig **)configs32; } -static void driDestroyScreen(__DRIscreen *psp) -{ - TRACE; - - if (psp) { - free(psp); - } -} - -static const __DRIextension **driGetExtensions(__DRIscreen *psp) +static void +dri_destroy_screen(__DRIscreen * sPriv) { TRACE; - - return psp->extensions; } @@ -203,34 +170,28 @@ static const __DRIextension **driGetExtensions(__DRIscreen *psp) static GLuint choose_pixel_format(const GLvisual *v) { - if (v->rgbMode) { - int depth = v->rgbBits; - - if (depth == 32 - && v->redMask == 0xff0000 - && v->greenMask == 0x00ff00 - && v->blueMask == 0x0000ff) - return PF_A8R8G8B8; - else if (depth == 24 - && v->redMask == 0xff0000 - && v->greenMask == 0x00ff00 - && v->blueMask == 0x0000ff) - return PF_X8R8G8B8; - else if (depth == 16 - && v->redMask == 0xf800 - && v->greenMask == 0x07e0 - && v->blueMask == 0x001f) - return PF_R5G6B5; - else if (depth == 8 - && v->redMask == 0x07 - && v->greenMask == 0x38 - && v->blueMask == 0xc0) - return PF_R3G3B2; - } - else { - if (v->indexBits == 8) - return PF_CI8; - } + int depth = v->rgbBits; + + if (depth == 32 + && v->redMask == 0xff0000 + && v->greenMask == 0x00ff00 + && v->blueMask == 0x0000ff) + return PF_A8R8G8B8; + else if (depth == 24 + && v->redMask == 0xff0000 + && v->greenMask == 0x00ff00 + && v->blueMask == 0x0000ff) + return PF_X8R8G8B8; + else if (depth == 16 + && v->redMask == 0xf800 + && v->greenMask == 0x07e0 + && v->blueMask == 0x001f) + return PF_R5G6B5; + else if (depth == 8 + && v->redMask == 0x07 + && v->greenMask == 0x38 + && v->blueMask == 0xc0) + return PF_R3G3B2; _mesa_problem( NULL, "unexpected format in %s", __FUNCTION__ ); return 0; @@ -335,13 +296,6 @@ swrast_new_renderbuffer(const GLvisual *visual, GLboolean front) xrb->Base.DataType = GL_UNSIGNED_BYTE; xrb->bpp = 8; break; - case PF_CI8: - xrb->Base.Format = MESA_FORMAT_CI8; - xrb->Base.InternalFormat = GL_COLOR_INDEX8_EXT; - xrb->Base._BaseFormat = GL_COLOR_INDEX; - xrb->Base.DataType = GL_UNSIGNED_BYTE; - xrb->bpp = 8; - break; default: return NULL; } @@ -349,94 +303,116 @@ 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(buf->row); + free(drawable->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); } @@ -447,13 +423,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 @@ -515,37 +491,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; @@ -571,17 +550,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 ); @@ -591,26 +581,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; @@ -627,7 +613,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, @@ -642,35 +628,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 59b4a6d2282..77670d89a5e 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 <[email protected]> * * 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 <[email protected]> - */ - #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 "dri_sw.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) { @@ -116,11 +119,10 @@ swrast_renderbuffer(struct gl_renderbuffer *rb) /** * Pixel formats we support */ -#define PF_CI8 1 /**< Color Index mode */ -#define PF_A8R8G8B8 2 /**< 32bpp TrueColor: 8-A, 8-R, 8-G, 8-B bits */ -#define PF_R5G6B5 3 /**< 16bpp TrueColor: 5-R, 6-G, 5-B bits */ -#define PF_R3G3B2 4 /**< 8bpp TrueColor: 3-R, 3-G, 2-B bits */ -#define PF_X8R8G8B8 5 /**< 32bpp TrueColor: 8-R, 8-G, 8-B bits */ +#define PF_A8R8G8B8 1 /**< 32bpp TrueColor: 8-A, 8-R, 8-G, 8-B bits */ +#define PF_R5G6B5 2 /**< 16bpp TrueColor: 5-R, 6-G, 5-B bits */ +#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). diff --git a/src/mesa/drivers/dri/swrast/swrast_span.c b/src/mesa/drivers/dri/swrast/swrast_span.c index f8e503463fa..c5681e34a91 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 <[email protected]> * * 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 <[email protected]> - */ - #include "swrast_priv.h" #define YFLIP(_xrb, Y) ((_xrb)->Base.Height - (Y) - 1) @@ -193,23 +189,6 @@ static const GLubyte kernel[16] = { #include "swrast/s_spantemp.h" -/* 8-bit color index */ -#define NAME(FUNC) FUNC##_CI8 -#define CI_MODE -#define RB_TYPE GLubyte -#define SPAN_VARS \ - struct swrast_renderbuffer *xrb = swrast_renderbuffer(rb); -#define INIT_PIXEL_PTR(P, X, Y) \ - GLubyte *P = (GLubyte *)xrb->Base.Data + YFLIP(xrb, Y) * xrb->pitch + (X); -#define INC_PIXEL_PTR(P) P += 1 -#define STORE_PIXEL(DST, X, Y, VALUE) \ - *DST = VALUE[0] -#define FETCH_PIXEL(DST, SRC) \ - DST = SRC[0] - -#include "swrast/s_spantemp.h" - - /* * Generate code for front-buffer span functions. */ @@ -282,23 +261,6 @@ static const GLubyte kernel[16] = { #include "swrast_spantemp.h" -/* 8-bit color index */ -#define NAME(FUNC) FUNC##_CI8_front -#define CI_MODE -#define RB_TYPE GLubyte -#define SPAN_VARS \ - struct swrast_renderbuffer *xrb = swrast_renderbuffer(rb); -#define INIT_PIXEL_PTR(P, X, Y) \ - GLubyte *P = (GLubyte *)row; -#define INC_PIXEL_PTR(P) P += 1 -#define STORE_PIXEL(DST, X, Y, VALUE) \ - *DST = VALUE[0] -#define FETCH_PIXEL(DST, SRC) \ - DST = SRC[0] - -#include "swrast_spantemp.h" - - /* * Back-buffers are malloced memory and always private. * @@ -346,14 +308,6 @@ swrast_set_span_funcs_back(struct swrast_renderbuffer *xrb, xrb->Base.PutValues = put_values_R3G3B2; xrb->Base.PutMonoValues = put_mono_values_R3G3B2; break; - case PF_CI8: - xrb->Base.GetRow = get_row_CI8; - xrb->Base.GetValues = get_values_CI8; - xrb->Base.PutRow = put_row_CI8; - xrb->Base.PutMonoRow = put_mono_row_CI8; - xrb->Base.PutValues = put_values_CI8; - xrb->Base.PutMonoValues = put_mono_values_CI8; - break; default: assert(0); return; @@ -410,14 +364,6 @@ swrast_set_span_funcs_front(struct swrast_renderbuffer *xrb, xrb->Base.PutValues = put_values_R3G3B2_front; xrb->Base.PutMonoValues = put_mono_values_R3G3B2_front; break; - case PF_CI8: - xrb->Base.GetRow = get_row_CI8_front; - xrb->Base.GetValues = get_values_CI8_front; - xrb->Base.PutRow = put_row_CI8_front; - xrb->Base.PutMonoRow = put_mono_row_CI8_front; - xrb->Base.PutValues = put_values_CI8_front; - xrb->Base.PutMonoValues = put_mono_values_CI8_front; - break; default: assert(0); return; diff --git a/src/mesa/drivers/dri/swrast/swrast_spantemp.h b/src/mesa/drivers/dri/swrast/swrast_spantemp.h index e0cb2414294..079726ae4ab 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, GLubyte *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, GLubyte *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; @@ -98,7 +98,6 @@ GET_ROW( GLcontext *glCtx, GLint x, GLint y, GLuint n, char *row ) * Define the following macros before including this file: * NAME(BASE) to generate the function name (i.e. add prefix or suffix) * RB_TYPE the renderbuffer DataType - * CI_MODE if set, color index mode, else RGBA * SPAN_VARS to declare any local variables * INIT_PIXEL_PTR(P, X, Y) to initialize a pointer to a pixel * INC_PIXEL_PTR(P) to increment a pixel pointer by one pixel @@ -113,9 +112,7 @@ GET_ROW( GLcontext *glCtx, GLint x, GLint y, GLuint n, char *row ) #include "main/macros.h" -#ifdef CI_MODE -#define RB_COMPONENTS 1 -#elif !defined(RB_COMPONENTS) +#if !defined(RB_COMPONENTS) #define RB_COMPONENTS 4 #endif @@ -127,11 +124,7 @@ NAME(get_row)( GLcontext *ctx, struct gl_renderbuffer *rb, #ifdef SPAN_VARS SPAN_VARS #endif -#ifdef CI_MODE - RB_TYPE *dest = (RB_TYPE *) values; -#else RB_TYPE (*dest)[RB_COMPONENTS] = (RB_TYPE (*)[RB_COMPONENTS]) values; -#endif GLuint i; char *row = swrast_drawable(ctx->ReadBuffer)->row; INIT_PIXEL_PTR(pixel, x, y); @@ -151,11 +144,7 @@ NAME(get_values)( GLcontext *ctx, struct gl_renderbuffer *rb, #ifdef SPAN_VARS SPAN_VARS #endif -#ifdef CI_MODE - RB_TYPE *dest = (RB_TYPE *) values; -#else RB_TYPE (*dest)[RB_COMPONENTS] = (RB_TYPE (*)[RB_COMPONENTS]) values; -#endif GLuint i; for (i = 0; i < count; i++) { RB_TYPE pixel[4]; @@ -198,7 +187,6 @@ NAME(put_row)( GLcontext *ctx, struct gl_renderbuffer *rb, } -#if !defined(CI_MODE) static void NAME(put_row_rgb)( GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count, GLint x, GLint y, @@ -237,7 +225,6 @@ NAME(put_row_rgb)( GLcontext *ctx, struct gl_renderbuffer *rb, } (void) rb; } -#endif static void @@ -319,7 +306,6 @@ NAME(put_mono_values)( GLcontext *ctx, struct gl_renderbuffer *rb, #undef NAME #undef RB_TYPE #undef RB_COMPONENTS -#undef CI_MODE #undef SPAN_VARS #undef INIT_PIXEL_PTR #undef INC_PIXEL_PTR diff --git a/src/mesa/drivers/dri/tdfx/Makefile b/src/mesa/drivers/dri/tdfx/Makefile index b9f25db4fe8..96bd8f8202f 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 63fe875f59e..00000000000 --- 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/tdfx/tdfx_screen.c b/src/mesa/drivers/dri/tdfx/tdfx_screen.c index d554bcdc92c..26de09503ad 100644 --- a/src/mesa/drivers/dri/tdfx/tdfx_screen.c +++ b/src/mesa/drivers/dri/tdfx/tdfx_screen.c @@ -295,6 +295,8 @@ tdfxSwapBuffers( __DRIdrawable *driDrawPriv ) } #endif + assert(fxMesa); + if (fxMesa->scissoredClipRects) { /* restore clip rects without scissor box */ fxMesa->Glide.grDRIPosition( driDrawPriv->x, driDrawPriv->y, diff --git a/src/mesa/drivers/dri/tdfx/tdfx_texstate.c b/src/mesa/drivers/dri/tdfx/tdfx_texstate.c index 6658b4d0c3e..b04f48c7a77 100644 --- a/src/mesa/drivers/dri/tdfx/tdfx_texstate.c +++ b/src/mesa/drivers/dri/tdfx/tdfx_texstate.c @@ -2142,11 +2142,13 @@ tdfxUpdateTextureBinding( GLcontext *ctx ) ctx->Texture.Unit[0]._ReallyEnabled == 0) { /* Only unit 0 2D enabled */ if (shared->umaTexMemory) { + assert(ti0); fxMesa->TexSource[0].StartAddress = ti0->tm[0]->startAddr; fxMesa->TexSource[0].EvenOdd = GR_MIPMAPLEVELMASK_BOTH; fxMesa->TexSource[0].Info = &(ti0->info); } else { + assert(ti0); if (ti0->LODblend && ti0->whichTMU == TDFX_TMU_SPLIT) { fxMesa->TexSource[0].StartAddress = ti0->tm[TDFX_TMU0]->startAddr; fxMesa->TexSource[0].EvenOdd = GR_MIPMAPLEVELMASK_ODD; @@ -2185,20 +2187,26 @@ tdfxUpdateTextureBinding( GLcontext *ctx ) /* Both 2D enabled */ if (shared->umaTexMemory) { const FxU32 tmu0 = 0, tmu1 = 1; + + assert(ti0); fxMesa->TexSource[tmu0].StartAddress = ti0->tm[0]->startAddr; fxMesa->TexSource[tmu0].EvenOdd = GR_MIPMAPLEVELMASK_BOTH; fxMesa->TexSource[tmu0].Info = &(ti0->info); + assert(ti1); fxMesa->TexSource[tmu1].StartAddress = ti1->tm[0]->startAddr; fxMesa->TexSource[tmu1].EvenOdd = GR_MIPMAPLEVELMASK_BOTH; fxMesa->TexSource[tmu1].Info = &(ti1->info); } else { const FxU32 tmu0 = 0, tmu1 = 1; + + assert(ti0); fxMesa->TexSource[tmu0].StartAddress = ti0->tm[tmu0]->startAddr; fxMesa->TexSource[tmu0].EvenOdd = GR_MIPMAPLEVELMASK_BOTH; fxMesa->TexSource[tmu0].Info = &(ti0->info); + assert(ti1); fxMesa->TexSource[tmu1].StartAddress = ti1->tm[tmu1]->startAddr; fxMesa->TexSource[tmu1].EvenOdd = GR_MIPMAPLEVELMASK_BOTH; fxMesa->TexSource[tmu1].Info = &(ti1->info); diff --git a/src/mesa/drivers/dri/tdfx/tdfx_tris.c b/src/mesa/drivers/dri/tdfx/tdfx_tris.c index 88249888952..d65833c20b0 100644 --- a/src/mesa/drivers/dri/tdfx/tdfx_tris.c +++ b/src/mesa/drivers/dri/tdfx/tdfx_tris.c @@ -320,7 +320,6 @@ static struct { #define DO_POINTS 1 #define DO_FULL_QUAD 1 -#define HAVE_RGBA 1 #define HAVE_SPEC 0 #define HAVE_HW_FLATSHADE 0 #define HAVE_BACK_COLORS 0 diff --git a/src/mesa/drivers/dri/unichrome/Makefile b/src/mesa/drivers/dri/unichrome/Makefile index 344d34fce36..14cf9f30386 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 74034485e28..00000000000 --- 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/dri/unichrome/via_ioctl.c b/src/mesa/drivers/dri/unichrome/via_ioctl.c index c9a31f3383c..25aad1b204e 100644 --- a/src/mesa/drivers/dri/unichrome/via_ioctl.c +++ b/src/mesa/drivers/dri/unichrome/via_ioctl.c @@ -757,6 +757,8 @@ static void via_emit_cliprect(struct via_context *vmesa, vb[0] = HC_HEADER2; vb[1] = (HC_ParaType_NotTex << 16); + assert(vmesa->driDrawable); + if (vmesa->driDrawable->w == 0 || vmesa->driDrawable->h == 0) { vb[2] = (HC_SubA_HClipTB << 24) | 0x0; vb[3] = (HC_SubA_HClipLR << 24) | 0x0; diff --git a/src/mesa/drivers/dri/unichrome/via_tris.c b/src/mesa/drivers/dri/unichrome/via_tris.c index 01359d51ea6..be3c9a770ff 100644 --- a/src/mesa/drivers/dri/unichrome/via_tris.c +++ b/src/mesa/drivers/dri/unichrome/via_tris.c @@ -257,7 +257,6 @@ static struct { #define DO_POINTS 1 #define DO_FULL_QUAD 1 -#define HAVE_RGBA 1 #define HAVE_SPEC 1 #define HAVE_BACK_COLORS 0 #define HAVE_HW_FLATSHADE 1 |