aboutsummaryrefslogtreecommitdiff
path: root/nx-X11/extras/Mesa/src/mesa/drivers/dri/i830/i830_texstate.c
diff options
context:
space:
mode:
Diffstat (limited to 'nx-X11/extras/Mesa/src/mesa/drivers/dri/i830/i830_texstate.c')
-rw-r--r--nx-X11/extras/Mesa/src/mesa/drivers/dri/i830/i830_texstate.c716
1 files changed, 0 insertions, 716 deletions
diff --git a/nx-X11/extras/Mesa/src/mesa/drivers/dri/i830/i830_texstate.c b/nx-X11/extras/Mesa/src/mesa/drivers/dri/i830/i830_texstate.c
deleted file mode 100644
index 358c554f3..000000000
--- a/nx-X11/extras/Mesa/src/mesa/drivers/dri/i830/i830_texstate.c
+++ /dev/null
@@ -1,716 +0,0 @@
-/**************************************************************************
-
-Copyright 2001 2d3d Inc., Delray Beach, FL
-
-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, 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
-ATI, 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.
-
-**************************************************************************/
-
-/* $XFree86: xc/lib/GL/mesa/src/drv/i830/i830_texstate.c,v 1.3 2002/12/10 01:26:53 dawes Exp $ */
-
-/**
- * \file i830_texstate.c
- *
- * Heavily based on the I810 driver, which was written by Keith Whitwell.
- *
- * \author Jeff Hartmann <jhartmann@2d3d.com>
- * \author Keith Whitwell <keithw@tungstengraphics.com>
- */
-
-#include "glheader.h"
-#include "macros.h"
-#include "mtypes.h"
-#include "simple_list.h"
-#include "enums.h"
-#include "texformat.h"
-#include "texstore.h"
-
-#include "mm.h"
-
-#include "i830_screen.h"
-#include "i830_dri.h"
-
-#include "i830_context.h"
-#include "i830_tex.h"
-#include "i830_state.h"
-#include "i830_ioctl.h"
-
-#define I830_TEX_UNIT_ENABLED(unit) (1<<unit)
-
-static void i830SetTexImages( i830ContextPtr imesa,
- struct gl_texture_object *tObj )
-{
- GLuint total_height, pitch, i, textureFormat;
- i830TextureObjectPtr t = (i830TextureObjectPtr) tObj->DriverData;
- const struct gl_texture_image *baseImage = tObj->Image[0][tObj->BaseLevel];
- GLint numLevels;
-
- switch( baseImage->TexFormat->MesaFormat ) {
- case MESA_FORMAT_L8:
- t->texelBytes = 1;
- textureFormat = MAPSURF_8BIT | MT_8BIT_L8;
- break;
-
- case MESA_FORMAT_I8:
- t->texelBytes = 1;
- textureFormat = MAPSURF_8BIT | MT_8BIT_I8;
- break;
-
- case MESA_FORMAT_AL88:
- t->texelBytes = 2;
- textureFormat = MAPSURF_16BIT | MT_16BIT_AY88;
- break;
-
- case MESA_FORMAT_RGB565:
- t->texelBytes = 2;
- textureFormat = MAPSURF_16BIT | MT_16BIT_RGB565;
- break;
-
- case MESA_FORMAT_ARGB1555:
- t->texelBytes = 2;
- textureFormat = MAPSURF_16BIT | MT_16BIT_ARGB1555;
- break;
-
- case MESA_FORMAT_ARGB4444:
- t->texelBytes = 2;
- textureFormat = MAPSURF_16BIT | MT_16BIT_ARGB4444;
- break;
-
- case MESA_FORMAT_ARGB8888:
- t->texelBytes = 4;
- textureFormat = MAPSURF_32BIT | MT_32BIT_ARGB8888;
- break;
-
- case MESA_FORMAT_YCBCR_REV:
- t->texelBytes = 2;
- textureFormat = (MAPSURF_422 | MT_422_YCRCB_NORMAL |
- TM0S1_COLORSPACE_CONVERSION);
- break;
-
- case MESA_FORMAT_YCBCR:
- t->texelBytes = 2;
- textureFormat = (MAPSURF_422 | MT_422_YCRCB_SWAPY | /* ??? */
- TM0S1_COLORSPACE_CONVERSION);
- break;
-
- case MESA_FORMAT_RGB_FXT1:
- case MESA_FORMAT_RGBA_FXT1:
- t->texelBytes = 2;
- textureFormat = (MAPSURF_COMPRESSED | MT_COMPRESS_FXT1);
- break;
- case MESA_FORMAT_RGBA_DXT1:
- case MESA_FORMAT_RGB_DXT1:
- /*
- * DXTn pitches are Width/4 * blocksize in bytes
- * for DXT1: blocksize=8 so Width/4*8 = Width * 2
- * for DXT3/5: blocksize=16 so Width/4*16 = Width * 4
- */
- t->texelBytes = 2;
- textureFormat = (MAPSURF_COMPRESSED | MT_COMPRESS_DXT1);
- break;
- case MESA_FORMAT_RGBA_DXT3:
- t->texelBytes = 4;
- textureFormat = (MAPSURF_COMPRESSED | MT_COMPRESS_DXT2_3);
- break;
- case MESA_FORMAT_RGBA_DXT5:
- t->texelBytes = 4;
- textureFormat = (MAPSURF_COMPRESSED | MT_COMPRESS_DXT4_5);
- break;
- default:
- fprintf(stderr, "%s: bad image format\n", __FUNCTION__);
- free( t );
- return;
- }
-
- /* Compute which mipmap levels we really want to send to the hardware.
- */
-
- driCalculateTextureFirstLastLevel( (driTextureObject *) t );
-
-
- /* Figure out the amount of memory required to hold all the mipmap
- * levels. Choose the smallest pitch to accomodate the largest
- * mipmap:
- */
- numLevels = t->base.lastLevel - t->base.firstLevel + 1;
-
- /* Pitch would be subject to additional rules if texture memory were
- * tiled. Currently it isn't.
- */
- if (0) {
- pitch = 128;
- while (pitch < tObj->Image[0][t->base.firstLevel]->Width * t->texelBytes)
- pitch *= 2;
- }
- else {
- pitch = tObj->Image[0][t->base.firstLevel]->Width * t->texelBytes;
- pitch = (pitch + 3) & ~3;
- }
-
-
- /* All images must be loaded at this pitch. Count the number of
- * lines required:
- */
- for ( total_height = i = 0 ; i < numLevels ; i++ ) {
- t->image[0][i].image = tObj->Image[0][t->base.firstLevel + i];
- if (!t->image[0][i].image)
- break;
-
- t->image[0][i].offset = total_height * pitch;
- if (t->image[0][i].image->IsCompressed)
- {
- if (t->image[0][i].image->Height > 4)
- total_height += t->image[0][i].image->Height/4;
- else
- total_height += 1;
- }
- else
- total_height += t->image[0][i].image->Height;
- t->image[0][i].internalFormat = baseImage->Format;
- }
-
- t->Pitch = pitch;
- t->base.totalSize = total_height*pitch;
- t->Setup[I830_TEXREG_TM0S1] =
- (((tObj->Image[0][t->base.firstLevel]->Height - 1) << TM0S1_HEIGHT_SHIFT) |
- ((tObj->Image[0][t->base.firstLevel]->Width - 1) << TM0S1_WIDTH_SHIFT) |
- textureFormat);
- t->Setup[I830_TEXREG_TM0S2] =
- ((((pitch / 4) - 1) << TM0S2_PITCH_SHIFT));
- t->Setup[I830_TEXREG_TM0S3] &= ~TM0S3_MAX_MIP_MASK;
- t->Setup[I830_TEXREG_TM0S3] &= ~TM0S3_MIN_MIP_MASK;
- t->Setup[I830_TEXREG_TM0S3] |= ((numLevels - 1)*4) << TM0S3_MIN_MIP_SHIFT;
- t->dirty = I830_UPLOAD_TEX0 | I830_UPLOAD_TEX1
- | I830_UPLOAD_TEX2 | I830_UPLOAD_TEX3;
-
- LOCK_HARDWARE( imesa );
- i830UploadTexImagesLocked( imesa, t );
- UNLOCK_HARDWARE( imesa );
-}
-
-/* ================================================================
- * Texture combine functions
- */
-
-
-/**
- * Calculate the hardware instuctions to setup the current texture enviromnemt
- * settings. Since \c gl_texture_unit::_CurrentCombine is used, both
- * "classic" texture enviroments and GL_ARB_texture_env_combine type texture
- * environments are treated identically.
- *
- * \todo
- * This function should return \c GLboolean. When \c GL_FALSE is returned,
- * it means that an environment is selected that the hardware cannot do. This
- * is the way the Radeon and R200 drivers work.
- *
- * \todo
- * Looking at i830_3d_regs.h, it seems the i830 can do part of
- * GL_ATI_texture_env_combine3. It can handle using \c GL_ONE and
- * \c GL_ZERO as combine inputs (which the code already supports). It can
- * also handle the \c GL_MODULATE_ADD_ATI mode. Is it worth investigating
- * partial support for the extension?
- *
- * \todo
- * Some thought needs to be put into the way combiners work. The driver
- * treats the hardware as if there's a specific combine unit tied to each
- * texture unit. That's why there's the special case for a disabled texture
- * unit. That's not the way the hardware works. In reality, there are 4
- * texture units and four general instruction slots. Each instruction slot
- * can use any texture as an input. There's no need for this wierd "no-op"
- * stuff. If texture units 0 and 3 are enabled, the instructions to combine
- * them should be in slots 0 and 1, not 0 and 3 with two no-ops inbetween.
- */
-
-static void i830UpdateTexEnv( GLcontext *ctx, GLuint unit )
-{
- i830ContextPtr imesa = I830_CONTEXT(ctx);
- const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
- const GLuint numColorArgs = texUnit->_CurrentCombine->_NumArgsRGB;
- const GLuint numAlphaArgs = texUnit->_CurrentCombine->_NumArgsA;
-
- GLboolean need_constant_color = GL_FALSE;
- GLuint blendop;
- GLuint ablendop;
- GLuint args_RGB[3];
- GLuint args_A[3];
- GLuint rgb_shift = texUnit->Combine.ScaleShiftRGB;
- GLuint alpha_shift = texUnit->Combine.ScaleShiftA;
- int i;
- unsigned used;
- static const GLuint tex_blend_rgb[3] = {
- TEXPIPE_COLOR | TEXBLEND_ARG1 | TEXBLENDARG_MODIFY_PARMS,
- TEXPIPE_COLOR | TEXBLEND_ARG2 | TEXBLENDARG_MODIFY_PARMS,
- TEXPIPE_COLOR | TEXBLEND_ARG0 | TEXBLENDARG_MODIFY_PARMS,
- };
- static const GLuint tex_blend_a[3] = {
- TEXPIPE_ALPHA | TEXBLEND_ARG1 | TEXBLENDARG_MODIFY_PARMS,
- TEXPIPE_ALPHA | TEXBLEND_ARG2 | TEXBLENDARG_MODIFY_PARMS,
- TEXPIPE_ALPHA | TEXBLEND_ARG0 | TEXBLENDARG_MODIFY_PARMS,
- };
- static const GLuint op_rgb[4] = {
- 0,
- TEXBLENDARG_INV_ARG,
- TEXBLENDARG_REPLICATE_ALPHA,
- TEXBLENDARG_REPLICATE_ALPHA | TEXBLENDARG_INV_ARG,
- };
-
-
-
- imesa->TexBlendWordsUsed[unit] = 0;
-
- if(I830_DEBUG&DEBUG_TEXTURE)
- fprintf(stderr, "[%s:%u] env. mode = %s\n", __FUNCTION__, __LINE__,
- _mesa_lookup_enum_by_nr(texUnit->EnvMode));
-
-
- if ( !texUnit->_ReallyEnabled ) {
- imesa->TexBlend[unit][0] = (STATE3D_MAP_BLEND_OP_CMD(unit) |
- TEXPIPE_COLOR |
- ENABLE_TEXOUTPUT_WRT_SEL |
- TEXOP_OUTPUT_CURRENT |
- DISABLE_TEX_CNTRL_STAGE |
- TEXOP_SCALE_1X |
- TEXOP_MODIFY_PARMS |
- TEXBLENDOP_ARG1);
- imesa->TexBlend[unit][1] = (STATE3D_MAP_BLEND_OP_CMD(unit) |
- TEXPIPE_ALPHA |
- ENABLE_TEXOUTPUT_WRT_SEL |
- TEXOP_OUTPUT_CURRENT |
- TEXOP_SCALE_1X |
- TEXOP_MODIFY_PARMS |
- TEXBLENDOP_ARG1);
- imesa->TexBlend[unit][2] = (STATE3D_MAP_BLEND_ARG_CMD(unit) |
- TEXPIPE_COLOR |
- TEXBLEND_ARG1 |
- TEXBLENDARG_MODIFY_PARMS |
- TEXBLENDARG_CURRENT);
- imesa->TexBlend[unit][3] = (STATE3D_MAP_BLEND_ARG_CMD(unit) |
- TEXPIPE_ALPHA |
- TEXBLEND_ARG1 |
- TEXBLENDARG_MODIFY_PARMS |
- TEXBLENDARG_CURRENT);
- imesa->TexBlendWordsUsed[unit] = 4;
- }
- else {
- switch(texUnit->_CurrentCombine->ModeRGB) {
- case GL_REPLACE:
- blendop = TEXBLENDOP_ARG1;
- break;
- case GL_MODULATE:
- blendop = TEXBLENDOP_MODULATE;
- break;
- case GL_ADD:
- blendop = TEXBLENDOP_ADD;
- break;
- case GL_ADD_SIGNED:
- blendop = TEXBLENDOP_ADDSIGNED;
- break;
- case GL_INTERPOLATE:
- blendop = TEXBLENDOP_BLEND;
- break;
- case GL_SUBTRACT:
- blendop = TEXBLENDOP_SUBTRACT;
- break;
- case GL_DOT3_RGB_EXT:
- case GL_DOT3_RGBA_EXT:
- /* The EXT version of the DOT3 extension does not support the
- * scale factor, but the ARB version (and the version in OpenGL
- * 1.3) does.
- */
- rgb_shift = 0;
- alpha_shift = 0;
- /* FALLTHROUGH */
-
- case GL_DOT3_RGB:
- case GL_DOT3_RGBA:
- blendop = TEXBLENDOP_DOT3;
- break;
- default:
- return;
- }
-
- blendop |= (rgb_shift << TEXOP_SCALE_SHIFT);
-
- switch(texUnit->_CurrentCombine->ModeA) {
- case GL_REPLACE:
- ablendop = TEXBLENDOP_ARG1;
- break;
- case GL_MODULATE:
- ablendop = TEXBLENDOP_MODULATE;
- break;
- case GL_ADD:
- ablendop = TEXBLENDOP_ADD;
- break;
- case GL_ADD_SIGNED:
- ablendop = TEXBLENDOP_ADDSIGNED;
- break;
- case GL_INTERPOLATE:
- ablendop = TEXBLENDOP_BLEND;
- break;
- case GL_SUBTRACT:
- ablendop = TEXBLENDOP_SUBTRACT;
- break;
- default:
- return;
- }
-
- if ( (texUnit->_CurrentCombine->ModeRGB == GL_DOT3_RGBA_EXT)
- || (texUnit->_CurrentCombine->ModeRGB == GL_DOT3_RGBA) ) {
- ablendop = TEXBLENDOP_DOT3;
- }
-
- ablendop |= (alpha_shift << TEXOP_SCALE_SHIFT);
-
- /* Handle RGB args */
- for( i = 0 ; i < numColorArgs ; i++ ) {
- const int op = texUnit->_CurrentCombine->OperandRGB[i] - GL_SRC_COLOR;
-
- assert( (op >= 0) && (op <= 3) );
- switch(texUnit->_CurrentCombine->SourceRGB[i]) {
- case GL_TEXTURE:
- args_RGB[i] = TEXBLENDARG_TEXEL0 + unit;
- break;
- case GL_TEXTURE0:
- case GL_TEXTURE1:
- case GL_TEXTURE2:
- case GL_TEXTURE3:
- args_RGB[i] = TEXBLENDARG_TEXEL0
- + (texUnit->_CurrentCombine->SourceRGB[i] & 0x03);
- break;
- case GL_CONSTANT:
- args_RGB[i] = TEXBLENDARG_FACTOR_N;
- need_constant_color = GL_TRUE;
- break;
- case GL_PRIMARY_COLOR:
- args_RGB[i] = TEXBLENDARG_DIFFUSE;
- break;
- case GL_PREVIOUS:
- args_RGB[i] = TEXBLENDARG_CURRENT;
- break;
- case GL_ONE:
- args_RGB[i] = TEXBLENDARG_ONE;
- break;
- case GL_ZERO:
- args_RGB[i] = TEXBLENDARG_ONE | TEXBLENDARG_INV_ARG;
- break;
- default:
- return;
- }
-
- /* Xor is used so that GL_ONE_MINUS_SRC_COLOR with GL_ZERO
- * works correctly.
- */
- args_RGB[i] ^= op_rgb[op];
- }
-
- /* Handle A args */
- for( i = 0 ; i < numAlphaArgs ; i++ ) {
- const int op = texUnit->_CurrentCombine->OperandA[i] - GL_SRC_ALPHA;
-
- assert( (op >= 0) && (op <= 1) );
- switch(texUnit->_CurrentCombine->SourceA[i]) {
- case GL_TEXTURE:
- args_A[i] = TEXBLENDARG_TEXEL0 + unit;
- break;
- case GL_TEXTURE0:
- case GL_TEXTURE1:
- case GL_TEXTURE2:
- case GL_TEXTURE3:
- args_A[i] = TEXBLENDARG_TEXEL0
- + (texUnit->_CurrentCombine->SourceA[i] & 0x03);
- break;
- case GL_CONSTANT:
- args_A[i] = TEXBLENDARG_FACTOR_N;
- need_constant_color = GL_TRUE;
- break;
- case GL_PRIMARY_COLOR:
- args_A[i] = TEXBLENDARG_DIFFUSE;
- break;
- case GL_PREVIOUS:
- args_A[i] = TEXBLENDARG_CURRENT;
- break;
- case GL_ONE:
- args_A[i] = TEXBLENDARG_ONE;
- break;
- case GL_ZERO:
- args_A[i] = TEXBLENDARG_ONE | TEXBLENDARG_INV_ARG;
- break;
- default:
- return;
- }
-
- /* We cheat. :) The register values for this are the same as for
- * RGB. Xor is used so that GL_ONE_MINUS_SRC_ALPHA with GL_ZERO
- * works correctly.
- */
- args_A[i] ^= op_rgb[op];
- }
-
- /* Native Arg1 == Arg0 in GL_EXT_texture_env_combine spec */
- /* Native Arg2 == Arg1 in GL_EXT_texture_env_combine spec */
- /* Native Arg0 == Arg2 in GL_EXT_texture_env_combine spec */
-
- /* Build color pipeline */
-
- used = 0;
- imesa->TexBlend[unit][used++] = (STATE3D_MAP_BLEND_OP_CMD(unit) |
- TEXPIPE_COLOR |
- ENABLE_TEXOUTPUT_WRT_SEL |
- TEXOP_OUTPUT_CURRENT |
- DISABLE_TEX_CNTRL_STAGE |
- TEXOP_MODIFY_PARMS |
- blendop);
-
- imesa->TexBlend[unit][used++] = (STATE3D_MAP_BLEND_OP_CMD(unit) |
- TEXPIPE_ALPHA |
- ENABLE_TEXOUTPUT_WRT_SEL |
- TEXOP_OUTPUT_CURRENT |
- TEXOP_MODIFY_PARMS |
- ablendop);
-
- for ( i = 0 ; i < numColorArgs ; i++ ) {
- imesa->TexBlend[unit][used++] = (STATE3D_MAP_BLEND_ARG_CMD(unit) |
- tex_blend_rgb[i] |
- args_RGB[i]);
- }
-
- for ( i = 0 ; i < numAlphaArgs ; i++ ) {
- imesa->TexBlend[unit][used++] = (STATE3D_MAP_BLEND_ARG_CMD(unit) |
- tex_blend_a[i] |
- args_A[i]);
- }
-
-
- if ( need_constant_color ) {
- GLubyte r, g, b, a;
- const GLfloat * const fc = texUnit->EnvColor;
-
- FLOAT_COLOR_TO_UBYTE_COLOR(r, fc[RCOMP]);
- FLOAT_COLOR_TO_UBYTE_COLOR(g, fc[GCOMP]);
- FLOAT_COLOR_TO_UBYTE_COLOR(b, fc[BCOMP]);
- FLOAT_COLOR_TO_UBYTE_COLOR(a, fc[ACOMP]);
-
- imesa->TexBlend[unit][used++] = STATE3D_COLOR_FACTOR_CMD(unit);
- imesa->TexBlend[unit][used++] = ((a << 24) | (r << 16) | (g << 8) | b);
- }
-
- imesa->TexBlendWordsUsed[unit] = used;
- }
-
- I830_STATECHANGE( imesa, I830_UPLOAD_TEXBLEND_N(unit) );
-}
-
-
-/* This is bogus -- can't load the same texture object on two units.
- */
-static void i830TexSetUnit( i830TextureObjectPtr t, GLuint unit )
-{
- if(I830_DEBUG&DEBUG_TEXTURE)
- fprintf(stderr, "%s unit(%d)\n", __FUNCTION__, unit);
-
- t->Setup[I830_TEXREG_TM0LI] = (STATE3D_LOAD_STATE_IMMEDIATE_2 |
- (LOAD_TEXTURE_MAP0 << unit) | 4);
-
- I830_SET_FIELD(t->Setup[I830_TEXREG_MCS], MAP_UNIT_MASK, MAP_UNIT(unit));
-
- t->current_unit = unit;
- t->base.bound |= (1U << unit);
-}
-
-#define TEXCOORDTYPE_MASK (~((1<<13)|(1<<12)|(1<<11)))
-
-
-static GLboolean enable_tex_common( GLcontext *ctx, GLuint unit )
-{
- i830ContextPtr imesa = I830_CONTEXT(ctx);
- struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
- struct gl_texture_object *tObj = texUnit->_Current;
- i830TextureObjectPtr t = (i830TextureObjectPtr)tObj->DriverData;
-
- /* Fallback if there's a texture border */
- if ( tObj->Image[0][tObj->BaseLevel]->Border > 0 ) {
- return GL_FALSE;
- }
-
- /* Upload teximages (not pipelined)
- */
- if (t->base.dirty_images[0]) {
- i830SetTexImages( imesa, tObj );
- if (!t->base.memBlock) {
- return GL_FALSE;
- }
- }
-
- /* Update state if this is a different texture object to last
- * time.
- */
- if (imesa->CurrentTexObj[unit] != t) {
-
- if ( imesa->CurrentTexObj[unit] != NULL ) {
- /* The old texture is no longer bound to this texture unit.
- * Mark it as such.
- */
-
- imesa->CurrentTexObj[unit]->base.bound &= ~(1U << unit);
- }
-
- I830_STATECHANGE( imesa, I830_UPLOAD_TEX_N(unit) );
- imesa->CurrentTexObj[unit] = t;
- i830TexSetUnit(t, unit);
- }
-
- /* Update texture environment if texture object image format or
- * texture environment state has changed.
- *
- * KW: doesn't work -- change from tex0 only to tex0+tex1 gets
- * missed (need to update last stage flag?). Call
- * i830UpdateTexEnv always.
- */
- if (tObj->Image[0][tObj->BaseLevel]->Format !=
- imesa->TexEnvImageFmt[unit]) {
- imesa->TexEnvImageFmt[unit] = tObj->Image[0][tObj->BaseLevel]->Format;
- }
- i830UpdateTexEnv( ctx, unit );
- imesa->TexEnabledMask |= I830_TEX_UNIT_ENABLED(unit);
-
- return GL_TRUE;
-}
-
-static GLboolean enable_tex_rect( GLcontext *ctx, GLuint unit )
-{
- i830ContextPtr imesa = I830_CONTEXT(ctx);
- struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
- struct gl_texture_object *tObj = texUnit->_Current;
- i830TextureObjectPtr t = (i830TextureObjectPtr)tObj->DriverData;
- GLuint mcs = t->Setup[I830_TEXREG_MCS];
-
- mcs &= ~TEXCOORDS_ARE_NORMAL;
- mcs |= TEXCOORDS_ARE_IN_TEXELUNITS;
-
- if (mcs != t->Setup[I830_TEXREG_MCS]) {
- I830_STATECHANGE( imesa, I830_UPLOAD_TEX_N(unit) );
- t->Setup[I830_TEXREG_MCS] = mcs;
- }
-
- return GL_TRUE;
-}
-
-
-static GLboolean enable_tex_2d( GLcontext *ctx, GLuint unit )
-{
- i830ContextPtr imesa = I830_CONTEXT(ctx);
- struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
- struct gl_texture_object *tObj = texUnit->_Current;
- i830TextureObjectPtr t = (i830TextureObjectPtr)tObj->DriverData;
- GLuint mcs = t->Setup[I830_TEXREG_MCS];
-
- mcs &= ~TEXCOORDS_ARE_IN_TEXELUNITS;
- mcs |= TEXCOORDS_ARE_NORMAL;
-
- if (mcs != t->Setup[I830_TEXREG_MCS]) {
- I830_STATECHANGE( imesa, I830_UPLOAD_TEX_N(unit) );
- t->Setup[I830_TEXREG_MCS] = mcs;
- }
-
- return GL_TRUE;
-}
-
-
-static GLboolean disable_tex( GLcontext *ctx, int unit )
-{
- i830ContextPtr imesa = I830_CONTEXT(ctx);
-
- /* This is happening too often. I need to conditionally send diffuse
- * state to the card. Perhaps a diffuse dirty flag of some kind.
- * Will need to change this logic if more than 2 texture units are
- * used. We need to only do this up to the last unit enabled, or unit
- * one if nothing is enabled.
- */
-
- if ( imesa->CurrentTexObj[unit] != NULL ) {
- /* The old texture is no longer bound to this texture unit.
- * Mark it as such.
- */
-
- imesa->CurrentTexObj[unit]->base.bound &= ~(1U << unit);
- imesa->CurrentTexObj[unit] = NULL;
- }
-
- imesa->TexEnvImageFmt[unit] = 0;
- imesa->dirty &= ~(I830_UPLOAD_TEX_N(unit));
-
- i830UpdateTexEnv( ctx, unit );
-
- return GL_TRUE;
-}
-
-static GLboolean i830UpdateTexUnit( GLcontext *ctx, GLuint unit )
-{
- i830ContextPtr imesa = I830_CONTEXT(ctx);
- struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
-
- imesa->TexEnabledMask &= ~(I830_TEX_UNIT_ENABLED(unit));
-
- if (texUnit->_ReallyEnabled == TEXTURE_2D_BIT) {
- return (enable_tex_common( ctx, unit ) &&
- enable_tex_2d( ctx, unit ));
- }
- else if (texUnit->_ReallyEnabled == TEXTURE_RECT_BIT) {
- return (enable_tex_common( ctx, unit ) &&
- enable_tex_rect( ctx, unit ));
- }
- else if (texUnit->_ReallyEnabled) {
- return GL_FALSE;
- }
- else {
- return disable_tex( ctx, unit );
- }
-}
-
-
-
-void i830UpdateTextureState( GLcontext *ctx )
-{
- i830ContextPtr imesa = I830_CONTEXT(ctx);
- int i;
- int last_stage = 0;
- GLboolean ok;
-
- for ( i = 0 ; i < ctx->Const.MaxTextureUnits ; i++ ) {
- if ( (ctx->Texture.Unit[i]._ReallyEnabled == TEXTURE_2D_BIT)
- || (ctx->Texture.Unit[i]._ReallyEnabled == TEXTURE_RECT_BIT) ) {
- last_stage = i;
- }
- }
-
- ok = GL_TRUE;
- for ( i = 0 ; i <= last_stage ; i++ ) {
- ok = ok && i830UpdateTexUnit( ctx, i );
- }
-
- FALLBACK( imesa, I830_FALLBACK_TEXTURE, !ok );
-
-
- /* Make sure last stage is set correctly */
- imesa->TexBlend[last_stage][0] |= TEXOP_LAST_STAGE;
-}