diff options
23 files changed, 168 insertions, 152 deletions
| diff --git a/src/mesa/drivers/dri/i915/i915_reg.h b/src/mesa/drivers/dri/i915/i915_reg.h index 3ba792a234..694cd4c8c3 100644 --- a/src/mesa/drivers/dri/i915/i915_reg.h +++ b/src/mesa/drivers/dri/i915/i915_reg.h @@ -138,7 +138,7 @@  /* 3DSTATE_DEPTH_SUBRECT_DISABLE, p160 */ -#define _3DSTATE_DEPTH_SUBRECT_DISABLE    (CMD_3D | (0x1c<<24) | (0x11<19) | 0x2) +#define _3DSTATE_DEPTH_SUBRECT_DISABLE    (CMD_3D | (0x1c<<24) | (0x11<<19) | 0x2)  /* p161 */  #define _3DSTATE_DST_BUF_VARS_CMD	(CMD_3D | (0x1d<<24) | (0x85<<16)) diff --git a/src/mesa/drivers/dri/i915/i915_state.c b/src/mesa/drivers/dri/i915/i915_state.c index fd11e10652..5e00e6597b 100644 --- a/src/mesa/drivers/dri/i915/i915_state.c +++ b/src/mesa/drivers/dri/i915/i915_state.c @@ -813,7 +813,7 @@ static void i915_init_packets( i915ContextPtr i915 )  				       I1_LOAD_S(4) |  				       I1_LOAD_S(5) |  				       I1_LOAD_S(6) |  -				       (4)); +				       (3));        i915->state.Ctx[I915_CTXREG_LIS2] = 0;        i915->state.Ctx[I915_CTXREG_LIS4] = 0;        i915->state.Ctx[I915_CTXREG_LIS5] = 0; diff --git a/src/mesa/drivers/dri/i915/i915_vtbl.c b/src/mesa/drivers/dri/i915/i915_vtbl.c index 2936a0fb72..b533e153be 100644 --- a/src/mesa/drivers/dri/i915/i915_vtbl.c +++ b/src/mesa/drivers/dri/i915/i915_vtbl.c @@ -180,7 +180,7 @@ static void i915_emit_invarient_state( intelContextPtr intel )      */     OUT_BATCH(_3DSTATE_LOAD_STATE_IMMEDIATE_1 |   	     I1_LOAD_S(3) | -	     (1)); +	     (0));     OUT_BATCH(0);     /* XXX: Use this */ diff --git a/src/mesa/drivers/dri/i915tex/i915_reg.h b/src/mesa/drivers/dri/i915tex/i915_reg.h index 04b199905c..34c6821405 100644 --- a/src/mesa/drivers/dri/i915tex/i915_reg.h +++ b/src/mesa/drivers/dri/i915tex/i915_reg.h @@ -138,7 +138,7 @@  /* 3DSTATE_DEPTH_SUBRECT_DISABLE, p160 */ -#define _3DSTATE_DEPTH_SUBRECT_DISABLE    (CMD_3D | (0x1c<<24) | (0x11<19) | 0x2) +#define _3DSTATE_DEPTH_SUBRECT_DISABLE    (CMD_3D | (0x1c<<24) | (0x11<<19) | 0x2)  /* p161 */  #define _3DSTATE_DST_BUF_VARS_CMD	(CMD_3D | (0x1d<<24) | (0x85<<16)) diff --git a/src/mesa/drivers/dri/i965/brw_tex.c b/src/mesa/drivers/dri/i965/brw_tex.c index c3ffa9e657..467aec64a0 100644 --- a/src/mesa/drivers/dri/i965/brw_tex.c +++ b/src/mesa/drivers/dri/i965/brw_tex.c @@ -148,18 +148,25 @@ brwChooseTextureFormat( GLcontext *ctx, GLint internalFormat,           return &_mesa_texformat_ycbcr_rev;     case GL_COMPRESSED_RGB_FXT1_3DFX: +       return &_mesa_texformat_rgb_fxt1;     case GL_COMPRESSED_RGBA_FXT1_3DFX: -     return &_mesa_texformat_rgb_fxt1; +       return &_mesa_texformat_rgba_fxt1;     case GL_RGB_S3TC:     case GL_RGB4_S3TC: +   case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: +       return &_mesa_texformat_rgb_dxt1; + +   case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: +       return &_mesa_texformat_rgba_dxt1; +     case GL_RGBA_S3TC:     case GL_RGBA4_S3TC:     case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: +       return &_mesa_texformat_rgba_dxt3; +     case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: -   case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: -   case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: -     return &_mesa_texformat_rgb_dxt1; /* there is no rgba support? */ +       return &_mesa_texformat_rgba_dxt5;     case GL_DEPTH_COMPONENT:     case GL_DEPTH_COMPONENT16: diff --git a/src/mesa/drivers/dri/nouveau/nouveau_shader_0.c b/src/mesa/drivers/dri/nouveau/nouveau_shader_0.c index 73c1f7c2a5..211483dc02 100644 --- a/src/mesa/drivers/dri/nouveau/nouveau_shader_0.c +++ b/src/mesa/drivers/dri/nouveau/nouveau_shader_0.c @@ -263,6 +263,23 @@ pass0_make_mask(GLuint mesa_mask)  	return mask;  } +static GLboolean +pass0_opcode_is_tex(enum prog_opcode op) +{ +	switch (op) { +	case OPCODE_TEX: +	case OPCODE_TXB: +	case OPCODE_TXD: +	case OPCODE_TXL: +	case OPCODE_TXP: +		return GL_TRUE; +	default: +		break; +	} + +	return GL_FALSE; +} +  static nvsTexTarget  pass0_make_tex_target(GLuint mesa)  { @@ -721,7 +738,11 @@ pass0_translate_arith(nouveauShader *nvs, struct gl_program *prog,  				(inst->SaturateMode != SATURATE_OFF),  				src[0], src[1], src[2]);  		nvsinst->tex_unit   = inst->TexSrcUnit; -		nvsinst->tex_target = pass0_make_tex_target(inst->TexSrcTarget); +		if (pass0_opcode_is_tex(inst->Opcode)) +			nvsinst->tex_target = +				pass0_make_tex_target(inst->TexSrcTarget); +		else +			nvsinst->tex_target = NVS_TEX_TARGET_UNKNOWN;  		ret = GL_TRUE;  	} else diff --git a/src/mesa/drivers/dri/r300/r300_cmdbuf.c b/src/mesa/drivers/dri/r300/r300_cmdbuf.c index a106bbc6ab..0fb2e5a2e0 100644 --- a/src/mesa/drivers/dri/r300/r300_cmdbuf.c +++ b/src/mesa/drivers/dri/r300/r300_cmdbuf.c @@ -338,7 +338,7 @@ void r300InitCmdBuf(r300ContextPtr r300)  		r300->hw.unk4260.cmd[0] = cmdpacket0(0x4260, 3);  	ALLOC_STATE( shade, always, 5, "shade", 0 );  		r300->hw.shade.cmd[0] = cmdpacket0(R300_RE_SHADE, 4); -	ALLOC_STATE( polygon_mode, always, 4, "unk4288", 0 ); +	ALLOC_STATE( polygon_mode, always, 4, "polygon_mode", 0 );  		r300->hw.polygon_mode.cmd[0] = cmdpacket0(R300_RE_POLYGON_MODE, 3);  	ALLOC_STATE( fogp, always, 3, "fogp", 0 );  		r300->hw.fogp.cmd[0] = cmdpacket0(R300_RE_FOG_SCALE, 2); diff --git a/src/mesa/drivers/dri/r300/r300_maos.c b/src/mesa/drivers/dri/r300/r300_maos.c index fcb87cbbb5..b0d96f7601 100644 --- a/src/mesa/drivers/dri/r300/r300_maos.c +++ b/src/mesa/drivers/dri/r300/r300_maos.c @@ -1,4 +1,3 @@ -/* $XFree86: xc/lib/GL/mesa/src/drv/r300/r300_maos_arrays.c,v 1.3 2003/02/23 23:59:01 dawes Exp $ */  /*  Copyright (C) The Weather Channel, Inc.  2002.  All Rights Reserved. diff --git a/src/mesa/drivers/dri/r300/r300_maos.h b/src/mesa/drivers/dri/r300/r300_maos.h index 679f1c2558..ab28317894 100644 --- a/src/mesa/drivers/dri/r300/r300_maos.h +++ b/src/mesa/drivers/dri/r300/r300_maos.h @@ -1,4 +1,3 @@ -/* $XFree86: xc/lib/GL/mesa/src/drv/r200/r200_maos.h,v 1.1 2002/10/30 12:51:52 alanh Exp $ */  /*  Copyright (C) The Weather Channel, Inc.  2002.  All Rights Reserved. diff --git a/src/mesa/drivers/dri/r300/r300_tex.c b/src/mesa/drivers/dri/r300/r300_tex.c index 6348ba1982..eb72802f8b 100644 --- a/src/mesa/drivers/dri/r300/r300_tex.c +++ b/src/mesa/drivers/dri/r300/r300_tex.c @@ -1,4 +1,3 @@ -/* $XFree86: xc/lib/GL/mesa/src/drv/r300/r300_tex.c,v 1.2 2002/11/05 17:46:08 tsi Exp $ */  /*  Copyright (C) The Weather Channel, Inc.  2002.  All Rights Reserved. diff --git a/src/mesa/drivers/dri/r300/r300_tex.h b/src/mesa/drivers/dri/r300/r300_tex.h index a18ff0e2ce..10aabc8b4b 100644 --- a/src/mesa/drivers/dri/r300/r300_tex.h +++ b/src/mesa/drivers/dri/r300/r300_tex.h @@ -1,4 +1,3 @@ -/* $XFree86: xc/lib/GL/mesa/src/drv/r300/r300_tex.h,v 1.1 2002/10/30 12:51:53 alanh Exp $ */  /*  Copyright (C) The Weather Channel, Inc.  2002.  All Rights Reserved. diff --git a/src/mesa/drivers/dri/r300/r300_texmem.c b/src/mesa/drivers/dri/r300/r300_texmem.c index 96973c0098..f531b54d11 100644 --- a/src/mesa/drivers/dri/r300/r300_texmem.c +++ b/src/mesa/drivers/dri/r300/r300_texmem.c @@ -1,4 +1,3 @@ -/* $XFree86: xc/lib/GL/mesa/src/drv/r300/r300_texmem.c,v 1.5 2002/12/17 00:32:56 dawes Exp $ */  /**************************************************************************  Copyright (C) Tungsten Graphics 2002.  All Rights Reserved. diff --git a/src/mesa/drivers/dri/r300/r300_texstate.c b/src/mesa/drivers/dri/r300/r300_texstate.c index cc356afb23..4bc0ea14f8 100644 --- a/src/mesa/drivers/dri/r300/r300_texstate.c +++ b/src/mesa/drivers/dri/r300/r300_texstate.c @@ -1,4 +1,3 @@ -/* $XFree86: xc/lib/GL/mesa/src/drv/r300/r300_texstate.c,v 1.3 2003/02/15 22:18:47 dawes Exp $ */  /*  Copyright (C) The Weather Channel, Inc.  2002.  All Rights Reserved. diff --git a/src/mesa/drivers/dri/r300/radeon_span.c b/src/mesa/drivers/dri/r300/radeon_span.c index 1b74f6779b..cc779d684f 100644 --- a/src/mesa/drivers/dri/r300/radeon_span.c +++ b/src/mesa/drivers/dri/r300/radeon_span.c @@ -1,4 +1,3 @@ -/* $XFree86: xc/lib/GL/mesa/src/drv/radeon/radeon_span.c,v 1.6 2002/10/30 12:51:56 alanh Exp $ */  /**************************************************************************  Copyright (C) The Weather Channel, Inc.  2002.  All Rights Reserved. diff --git a/src/mesa/drivers/dri/unichrome/via_context.c b/src/mesa/drivers/dri/unichrome/via_context.c index 89533421b4..4d25d328e3 100644 --- a/src/mesa/drivers/dri/unichrome/via_context.c +++ b/src/mesa/drivers/dri/unichrome/via_context.c @@ -768,9 +768,7 @@ void viaXMesaWindowMoved(struct via_context *vmesa)  				  drawable);     } -   draw_buffer->drawXoff = (GLuint)(((drawable->x * bytePerPixel) & 0x1f) /  -			      bytePerPixel);   -   draw_buffer->drawX = drawable->x - draw_buffer->drawXoff; +   draw_buffer->drawX = drawable->x;     draw_buffer->drawY = drawable->y;     draw_buffer->drawW = drawable->w;     draw_buffer->drawH = drawable->h; @@ -782,9 +780,7 @@ void viaXMesaWindowMoved(struct via_context *vmesa)  				     readable);        } -      read_buffer->drawXoff = (GLuint)(((readable->x * bytePerPixel) & 0x1f) /  -				       bytePerPixel);   -      read_buffer->drawX = readable->x - read_buffer->drawXoff; +      read_buffer->drawX = readable->x;        read_buffer->drawY = readable->y;        read_buffer->drawW = readable->w;        read_buffer->drawH = readable->h; @@ -795,13 +791,24 @@ void viaXMesaWindowMoved(struct via_context *vmesa)  			draw_buffer->drawX * bytePerPixel);     vmesa->front.origMap = (vmesa->front.map +  -			   draw_buffer->drawY * vmesa->front.pitch +  -			   draw_buffer->drawX * bytePerPixel); +			draw_buffer->drawY * vmesa->front.pitch +  +			draw_buffer->drawX * bytePerPixel); + +   vmesa->back.orig = (vmesa->back.offset + +			draw_buffer->drawY * vmesa->back.pitch + +			draw_buffer->drawX * bytePerPixel); -   vmesa->back.orig = vmesa->back.offset; -   vmesa->depth.orig = vmesa->depth.offset;    -   vmesa->back.origMap = vmesa->back.map; -   vmesa->depth.origMap = vmesa->depth.map; +   vmesa->back.origMap = (vmesa->back.map + +			draw_buffer->drawY * vmesa->back.pitch + +			draw_buffer->drawX * bytePerPixel); + +   vmesa->depth.orig = (vmesa->depth.offset + +			draw_buffer->drawY * vmesa->depth.pitch + +			draw_buffer->drawX * bytePerPixel);    + +   vmesa->depth.origMap = (vmesa->depth.map + +			draw_buffer->drawY * vmesa->depth.pitch + +			draw_buffer->drawX * bytePerPixel);     viaCalcViewport(vmesa->glCtx);  } diff --git a/src/mesa/drivers/dri/unichrome/via_context.h b/src/mesa/drivers/dri/unichrome/via_context.h index 77161a8d5d..fecd2782fb 100644 --- a/src/mesa/drivers/dri/unichrome/via_context.h +++ b/src/mesa/drivers/dri/unichrome/via_context.h @@ -104,11 +104,6 @@ struct via_renderbuffer {     int drawW;                       int drawH;     -   int drawXoff;		/* drawX is 32byte aligned - this is -				 * the delta to the real origin, in -				 * pixel units. -				 */ -     __DRIdrawablePrivate *dPriv;  }; diff --git a/src/mesa/drivers/dri/unichrome/via_ioctl.c b/src/mesa/drivers/dri/unichrome/via_ioctl.c index 5d102de93e..4a733fb00c 100644 --- a/src/mesa/drivers/dri/unichrome/via_ioctl.c +++ b/src/mesa/drivers/dri/unichrome/via_ioctl.c @@ -187,7 +187,7 @@ static void viaFillBuffer(struct via_context *vmesa,        int w = pbox[i].x2 - pbox[i].x1;        int h = pbox[i].y2 - pbox[i].y1; -      int offset = (buffer->orig +  +      int offset = (buffer->offset +   		    y * buffer->pitch +   		    x * bytePerPixel); @@ -276,7 +276,7 @@ static void viaClear(GLcontext *ctx, GLbitfield mask)        /* flip top to bottom */        cy = dPriv->h - cy - ch; -      cx += vrb->drawX + vrb->drawXoff; +      cx += vrb->drawX;        cy += vrb->drawY;        if (!all) { @@ -359,8 +359,8 @@ static void viaDoSwapBuffers(struct via_context *vmesa,        GLint w = b->x2 - b->x1;        GLint h = b->y2 - b->y1; -      GLuint src = back->orig + y * back->pitch + x * bytePerPixel; -      GLuint dest = front->orig + y * front->pitch + x * bytePerPixel; +      GLuint src = back->offset + y * back->pitch + x * bytePerPixel; +      GLuint dest = front->offset + y * front->pitch + x * bytePerPixel;        viaBlit(vmesa,   	      bytePerPixel << 3,  @@ -747,7 +747,7 @@ static void via_emit_cliprect(struct via_context *vmesa,  		    : HC_HDBFM_RGB565);     GLuint pitch = buffer->pitch; -   GLuint offset = buffer->orig; +   GLuint offset = buffer->offset;     if (0)        fprintf(stderr, "emit cliprect for box %d,%d %d,%d\n",  @@ -768,7 +768,7 @@ static void via_emit_cliprect(struct via_context *vmesa,     vb[4] = (HC_SubA_HDBBasL << 24) | (offset & 0xFFFFFF);     vb[5] = (HC_SubA_HDBBasH << 24) | ((offset & 0xFF000000) >> 24);  -   vb[6] = (HC_SubA_HSPXYOS << 24) | ((31 - buffer->drawXoff) << HC_HSPXOS_SHIFT); +   vb[6] = (HC_SubA_HSPXYOS << 24);     vb[7] = (HC_SubA_HDBFM << 24) | HC_HDBLoc_Local | format | pitch;  } @@ -887,22 +887,18 @@ void viaFlushDmaLocked(struct via_context *vmesa, GLuint flags)        struct via_renderbuffer *const vrb =   	(struct via_renderbuffer *) dPriv->driverPrivate; -        for (i = 0; i < vmesa->numClipRects; i++) {  	 drm_clip_rect_t b; -	 b.x1 = pbox[i].x1 - (vrb->drawX + vrb->drawXoff); -	 b.x2 = pbox[i].x2 - (vrb->drawX + vrb->drawXoff); -	 b.y1 = pbox[i].y1 - vrb->drawY; -	 b.y2 = pbox[i].y2 - vrb->drawY; +	 b.x1 = pbox[i].x1; +	 b.x2 = pbox[i].x2; +	 b.y1 = pbox[i].y1; +	 b.y2 = pbox[i].y2;  	 if (vmesa->scissor &&  	     !intersect_rect(&b, &b, &vmesa->scissorRect))   	    continue; -	 b.x1 += vrb->drawXoff; -	 b.x2 += vrb->drawXoff; -  	 via_emit_cliprect(vmesa, &b);  	 if (fire_buffer(vmesa) != 0) { diff --git a/src/mesa/drivers/dri/unichrome/via_span.c b/src/mesa/drivers/dri/unichrome/via_span.c index f1ed98036b..3a16dadd23 100644 --- a/src/mesa/drivers/dri/unichrome/via_span.c +++ b/src/mesa/drivers/dri/unichrome/via_span.c @@ -46,7 +46,7 @@      GLuint pitch = vrb->pitch;                                          \      GLuint height = dPriv->h;                                        	\      GLint p = 0;							\ -    char *buf = (char *)(vrb->origMap + vrb->drawXoff * vrb->bpp);      \ +    char *buf = (char *)(vrb->origMap);					\      (void) p;  /* ================================================================ @@ -82,7 +82,7 @@      __DRIdrawablePrivate *dPriv = vrb->dPriv;                       \      GLuint depth_pitch = vrb->pitch;                                \      GLuint height = dPriv->h;                                       \ -    char *buf = (char *)(vrb->map + (vrb->drawXoff * vrb->bpp/8)) +    char *buf = (char *)(vrb->map)  #define LOCAL_STENCIL_VARS LOCAL_DEPTH_VARS  diff --git a/src/mesa/drivers/dri/unichrome/via_state.c b/src/mesa/drivers/dri/unichrome/via_state.c index 30b9dc289a..bccdbe9326 100644 --- a/src/mesa/drivers/dri/unichrome/via_state.c +++ b/src/mesa/drivers/dri/unichrome/via_state.c @@ -500,10 +500,8 @@ void viaEmitState(struct via_context *vmesa)        OUT_RING( HC_HEADER2 );                             OUT_RING( (HC_ParaType_NotTex << 16) ); -      OUT_RING( (HC_SubA_HSPXYOS << 24) |  -		(((32- vrb->drawXoff) & 0x1f) << HC_HSPXOS_SHIFT)); -      OUT_RING( (HC_SubA_HSPXYOS << 24) |  -		(((32 - vrb->drawXoff) & 0x1f) << HC_HSPXOS_SHIFT)); +      OUT_RING( (HC_SubA_HSPXYOS << 24) ); +      OUT_RING( (HC_SubA_HSPXYOS << 24) );        ADVANCE_RING();     } @@ -712,12 +710,8 @@ static void viaColorMask(GLcontext *ctx,  } -/* ============================================================= - */ - -/* Using drawXoff like this is incorrect outside of locked regions. - * This hardware just isn't capable of private back buffers without +/* This hardware just isn't capable of private back buffers without   * glitches and/or a hefty locking scheme.   */  void viaCalcViewport(GLcontext *ctx) @@ -729,12 +723,10 @@ void viaCalcViewport(GLcontext *ctx)      const GLfloat *v = ctx->Viewport._WindowMap.m;      GLfloat *m = vmesa->ViewportMatrix.m; -    /* See also via_translate_vertex. -     */      m[MAT_SX] =   v[MAT_SX]; -    m[MAT_TX] =   v[MAT_TX] + SUBPIXEL_X + vrb->drawXoff; +    m[MAT_TX] =   v[MAT_TX] + vrb->drawX + SUBPIXEL_X;      m[MAT_SY] = - v[MAT_SY]; -    m[MAT_TY] = - v[MAT_TY] + dPriv->h + SUBPIXEL_Y; +    m[MAT_TY] = - v[MAT_TY] + vrb->drawY + SUBPIXEL_Y + vrb->drawH;      m[MAT_SZ] =   v[MAT_SZ] * (1.0 / vmesa->depth_max);      m[MAT_TZ] =   v[MAT_TZ] * (1.0 / vmesa->depth_max);  } diff --git a/src/mesa/main/image.c b/src/mesa/main/image.c index cad9736b30..44729b7419 100644 --- a/src/mesa/main/image.c +++ b/src/mesa/main/image.c @@ -3877,6 +3877,22 @@ _mesa_pack_stencil_span( const GLcontext *ctx, GLuint n,     }  } +#define DEPTH_VALUES(GLTYPE, GLTYPE2FLOAT)                              \ +    do {                                                                \ +        GLuint i;                                                       \ +        const GLTYPE *src = (const GLTYPE *)source;                     \ +        for (i = 0; i < n; i++) {                                       \ +            GLTYPE value = src[i];                                      \ +            if (srcPacking->SwapBytes) {                                \ +                if (sizeof(GLTYPE) == 2) {                              \ +                    SWAP2BYTE(value);                                   \ +                } else if (sizeof(GLTYPE) == 4) {                       \ +                    SWAP4BYTE(value);                                   \ +                }                                                       \ +            }                                                           \ +            depthValues[i] = CLAMP(GLTYPE2FLOAT(value), 0.0F, 1.0F);    \ +        }                                                               \ +    } while (0)  void  _mesa_unpack_depth_span( const GLcontext *ctx, GLuint n, @@ -3898,59 +3914,23 @@ _mesa_unpack_depth_span( const GLcontext *ctx, GLuint n,     switch (srcType) {        case GL_BYTE: -         { -            GLuint i; -            const GLubyte *src = (const GLubyte *) source; -            for (i = 0; i < n; i++) { -               depthValues[i] = BYTE_TO_FLOAT(src[i]); -            } -         } -         break; +          DEPTH_VALUES(GLbyte, BYTE_TO_FLOAT); +          break;        case GL_UNSIGNED_BYTE: -         { -            GLuint i; -            const GLubyte *src = (const GLubyte *) source; -            for (i = 0; i < n; i++) { -               depthValues[i] = UBYTE_TO_FLOAT(src[i]); -            } -         } -         break; +          DEPTH_VALUES(GLubyte, UBYTE_TO_FLOAT); +          break;        case GL_SHORT: -         { -            GLuint i; -            const GLshort *src = (const GLshort *) source; -            for (i = 0; i < n; i++) { -               depthValues[i] = SHORT_TO_FLOAT(src[i]); -            } -         } -         break; +          DEPTH_VALUES(GLshort, SHORT_TO_FLOAT); +          break;        case GL_UNSIGNED_SHORT: -         { -            GLuint i; -            const GLushort *src = (const GLushort *) source; -            for (i = 0; i < n; i++) { -               depthValues[i] = USHORT_TO_FLOAT(src[i]); -            } -         } -         break; +          DEPTH_VALUES(GLushort, USHORT_TO_FLOAT); +          break;        case GL_INT: -         { -            GLuint i; -            const GLint *src = (const GLint *) source; -            for (i = 0; i < n; i++) { -               depthValues[i] = INT_TO_FLOAT(src[i]); -            } -         } -         break; +          DEPTH_VALUES(GLint, INT_TO_FLOAT); +          break;        case GL_UNSIGNED_INT: -         { -            GLuint i; -            const GLuint *src = (const GLuint *) source; -            for (i = 0; i < n; i++) { -               depthValues[i] = UINT_TO_FLOAT(src[i]); -            } -         } -         break; +          DEPTH_VALUES(GLuint, UINT_TO_FLOAT); +          break;        case GL_UNSIGNED_INT_24_8_EXT: /* GL_EXT_packed_depth_stencil */           if (dstType == GL_UNSIGNED_INT &&               depthScale == (GLfloat) 0xffffff && @@ -3960,7 +3940,11 @@ _mesa_unpack_depth_span( const GLcontext *ctx, GLuint n,              GLuint *zValues = (GLuint *) dest;              GLuint i;              for (i = 0; i < n; i++) { -               zValues[i] = src[i] & 0xffffff00; +                GLuint value = src[i]; +                if (srcPacking->SwapBytes) { +                    SWAP4BYTE(value); +                } +                zValues[i] = value & 0xffffff00;              }              return;           } @@ -3969,19 +3953,27 @@ _mesa_unpack_depth_span( const GLcontext *ctx, GLuint n,              const GLfloat scale = 1.0f / 0xffffff;              GLuint i;              for (i = 0; i < n; i++) { -               depthValues[i] = (src[i] >> 8) * scale; +                GLuint value = src[i]; +                if (srcPacking->SwapBytes) { +                    SWAP4BYTE(value); +                } +                depthValues[i] = (value >> 8) * scale;              }           }           break;        case GL_FLOAT: -         _mesa_memcpy(depthValues, source, n * sizeof(GLfloat)); -         break; +          DEPTH_VALUES(GLfloat, 1*); +          break;        case GL_HALF_FLOAT_ARB:           {              GLuint i;              const GLhalfARB *src = (const GLhalfARB *) source;              for (i = 0; i < n; i++) { -               depthValues[i] = _mesa_half_to_float(src[i]); +                GLhalfARB value = src[i]; +                if (srcPacking->SwapBytes) { +                    SWAP2BYTE(value); +                } +               depthValues[i] = _mesa_half_to_float(value);              }           }           break; diff --git a/src/mesa/main/texcompress_fxt1.c b/src/mesa/main/texcompress_fxt1.c index d3011cedce..411d51cfcc 100644 --- a/src/mesa/main/texcompress_fxt1.c +++ b/src/mesa/main/texcompress_fxt1.c @@ -752,44 +752,55 @@ fxt1_quantize_ALPHA1 (GLuint *cc,     GLint minColL = 0, maxColL = 0;     GLint minColR = 0, maxColR = 0;     GLint sumL = 0, sumR = 0; - +   GLint nn_comp;     /* Our solution here is to find the darkest and brightest colors in      * the 4x4 tile and use those as the two representative colors.      * There are probably better algorithms to use (histogram-based).      */ -   minSum = 2000; /* big enough */ -   maxSum = -1; /* small enough */ -   for (k = 0; k < N_TEXELS / 2; k++) { -      GLint sum = 0; -      for (i = 0; i < n_comp; i++) { -         sum += input[k][i]; -      } -      if (minSum > sum) { -         minSum = sum; -         minColL = k; -      } -      if (maxSum < sum) { -         maxSum = sum; -         maxColL = k; -      } -      sumL += sum; +   nn_comp = n_comp; +   while ((minColL == maxColL) && nn_comp) { +       minSum = 2000; /* big enough */ +       maxSum = -1; /* small enough */ +       for (k = 0; k < N_TEXELS / 2; k++) { +           GLint sum = 0; +           for (i = 0; i < nn_comp; i++) { +               sum += input[k][i]; +           } +           if (minSum > sum) { +               minSum = sum; +               minColL = k; +           } +           if (maxSum < sum) { +               maxSum = sum; +               maxColL = k; +           } +           sumL += sum; +       } +        +       nn_comp--;     } -   minSum = 2000; /* big enough */ -   maxSum = -1; /* small enough */ -   for (; k < N_TEXELS; k++) { -      GLint sum = 0; -      for (i = 0; i < n_comp; i++) { -         sum += input[k][i]; -      } -      if (minSum > sum) { -         minSum = sum; -         minColR = k; -      } -      if (maxSum < sum) { -         maxSum = sum; -         maxColR = k; -      } -      sumR += sum; + +   nn_comp = n_comp; +   while ((minColR == maxColR) && nn_comp) { +       minSum = 2000; /* big enough */ +       maxSum = -1; /* small enough */ +       for (k = N_TEXELS / 2; k < N_TEXELS; k++) { +           GLint sum = 0; +           for (i = 0; i < nn_comp; i++) { +               sum += input[k][i]; +           } +           if (minSum > sum) { +               minSum = sum; +               minColR = k; +           } +           if (maxSum < sum) { +               maxSum = sum; +               maxColR = k; +           } +           sumR += sum; +       } + +       nn_comp--;     }     /* choose the common vector (yuck!) */ diff --git a/src/mesa/swrast/s_drawpix.c b/src/mesa/swrast/s_drawpix.c index d945a871ae..d97d53e83b 100644 --- a/src/mesa/swrast/s_drawpix.c +++ b/src/mesa/swrast/s_drawpix.c @@ -452,7 +452,8 @@ draw_depth_pixels( GLcontext *ctx, GLint x, GLint y,         && !scaleOrBias         && !zoom         && ctx->Visual.rgbMode -       && width <= MAX_WIDTH) { +       && width <= MAX_WIDTH +       && !unpack->SwapBytes) {        /* Special case: directly write 16-bit depth values */        GLint row;        for (row = 0; row < height; row++) { @@ -472,7 +473,8 @@ draw_depth_pixels( GLcontext *ctx, GLint x, GLint y,              && !scaleOrBias              && !zoom              && ctx->Visual.rgbMode -            && width <= MAX_WIDTH) { +            && width <= MAX_WIDTH +            && !unpack->SwapBytes) {        /* Special case: shift 32-bit values down to Visual.depthBits */        const GLint shift = 32 - ctx->DrawBuffer->Visual.depthBits;        GLint row; diff --git a/src/mesa/swrast/s_readpix.c b/src/mesa/swrast/s_readpix.c index 15dc8106b4..c5524c0630 100644 --- a/src/mesa/swrast/s_readpix.c +++ b/src/mesa/swrast/s_readpix.c @@ -119,7 +119,7 @@ read_depth_pixels( GLcontext *ctx,              && !biasOrScale && !packing->SwapBytes) {        /* Special case: directly read 24-bit unsigned depth values. */        GLint j; -      ASSERT(rb->InternalFormat == GL_DEPTH_COMPONENT32); +      ASSERT(rb->InternalFormat == GL_DEPTH_COMPONENT24);        ASSERT(rb->DataType == GL_UNSIGNED_INT);        for (j = 0; j < height; j++, y++) {           GLuint *dest = (GLuint *) | 
