diff options
Diffstat (limited to 'src/mesa/drivers')
29 files changed, 212 insertions, 99 deletions
| diff --git a/src/mesa/drivers/dri/gamma/gamma_tex.c b/src/mesa/drivers/dri/gamma/gamma_tex.c index 0dad250e4d..694e5eba5b 100644 --- a/src/mesa/drivers/dri/gamma/gamma_tex.c +++ b/src/mesa/drivers/dri/gamma/gamma_tex.c @@ -145,7 +145,7 @@ static void gammaTexParameter( GLcontext *ctx, GLenum target,        break;     case GL_TEXTURE_BORDER_COLOR: -      gammaSetTexBorderColor( gmesa, t, tObj->BorderColor ); +      gammaSetTexBorderColor( gmesa, t, tObj->BorderColor.f );        break;     case GL_TEXTURE_BASE_LEVEL: @@ -349,7 +349,7 @@ static void gammaBindTexture( GLcontext *ctx, GLenum target,  	 gammaSetTexWrapping( t, tObj->WrapS, tObj->WrapT );  	 gammaSetTexFilter( gmesa, t, tObj->MinFilter, tObj->MagFilter, bias ); -	 gammaSetTexBorderColor( gmesa, t, tObj->BorderColor ); +	 gammaSetTexBorderColor( gmesa, t, tObj->BorderColor.f );        }  } diff --git a/src/mesa/drivers/dri/i810/i810tex.c b/src/mesa/drivers/dri/i810/i810tex.c index 2f6978f5aa..e764644a6c 100644 --- a/src/mesa/drivers/dri/i810/i810tex.c +++ b/src/mesa/drivers/dri/i810/i810tex.c @@ -210,7 +210,7 @@ i810AllocTexObj( GLcontext *ctx, struct gl_texture_object *texObj )        i810SetTexWrapping( t, texObj->WrapS, texObj->WrapT );        /*i830SetTexMaxAnisotropy( t, texObj->MaxAnisotropy );*/        i810SetTexFilter( imesa, t, texObj->MinFilter, texObj->MagFilter, bias ); -      i810SetTexBorderColor( t, texObj->BorderColor ); +      i810SetTexBorderColor( t, texObj->BorderColor.f );     }     return t; @@ -251,7 +251,7 @@ static void i810TexParameter( GLcontext *ctx, GLenum target,        break;     case GL_TEXTURE_BORDER_COLOR: -      i810SetTexBorderColor( t, tObj->BorderColor ); +      i810SetTexBorderColor( t, tObj->BorderColor.f );        break;     case GL_TEXTURE_BASE_LEVEL: diff --git a/src/mesa/drivers/dri/i810/i810tex.h b/src/mesa/drivers/dri/i810/i810tex.h index d980927030..28958dcb4b 100644 --- a/src/mesa/drivers/dri/i810/i810tex.h +++ b/src/mesa/drivers/dri/i810/i810tex.h @@ -29,7 +29,6 @@  #include "main/mtypes.h"  #include "main/mm.h" -#include "i810context.h"  #include "i810_3d_reg.h"  #include "texmem.h" diff --git a/src/mesa/drivers/dri/i915/i830_texstate.c b/src/mesa/drivers/dri/i915/i830_texstate.c index 27c5aa1e08..7525f9f2e0 100644 --- a/src/mesa/drivers/dri/i915/i830_texstate.c +++ b/src/mesa/drivers/dri/i915/i830_texstate.c @@ -304,10 +304,10 @@ i830_update_tex_unit(struct intel_context *intel, GLuint unit, GLuint ss3)     }     /* convert border color from float to ubyte */ -   CLAMPED_FLOAT_TO_UBYTE(border[0], tObj->BorderColor[0]); -   CLAMPED_FLOAT_TO_UBYTE(border[1], tObj->BorderColor[1]); -   CLAMPED_FLOAT_TO_UBYTE(border[2], tObj->BorderColor[2]); -   CLAMPED_FLOAT_TO_UBYTE(border[3], tObj->BorderColor[3]); +   CLAMPED_FLOAT_TO_UBYTE(border[0], tObj->BorderColor.f[0]); +   CLAMPED_FLOAT_TO_UBYTE(border[1], tObj->BorderColor.f[1]); +   CLAMPED_FLOAT_TO_UBYTE(border[2], tObj->BorderColor.f[2]); +   CLAMPED_FLOAT_TO_UBYTE(border[3], tObj->BorderColor.f[3]);     state[I830_TEXREG_TM0S4] = PACK_COLOR_8888(border[3],  					      border[0], diff --git a/src/mesa/drivers/dri/i915/i915_texstate.c b/src/mesa/drivers/dri/i915/i915_texstate.c index 221bf03332..3ee4c8653a 100644 --- a/src/mesa/drivers/dri/i915/i915_texstate.c +++ b/src/mesa/drivers/dri/i915/i915_texstate.c @@ -197,10 +197,11 @@ i915_update_tex_unit(struct intel_context *intel, GLuint unit, GLuint ss3)  	 state[I915_TEXREG_MS3] |= MS3_TILE_WALK;     } -   /* We get one field with fraction bits to cover the maximum addressable (smallest -    * resolution) LOD.  Use it to cover both MAX_LEVEL and MAX_LOD. +   /* We get one field with fraction bits for the maximum addressable +    * (lowest resolution) LOD.  Use it to cover both MAX_LEVEL and +    * MAX_LOD.      */ -   maxlod = MIN2(tObj->MaxLod, tObj->MaxLevel - tObj->BaseLevel); +   maxlod = MIN2(tObj->MaxLod, tObj->_MaxLevel - tObj->BaseLevel);     state[I915_TEXREG_MS4] =        ((((pitch / 4) - 1) << MS4_PITCH_SHIFT) |         MS4_CUBE_FACE_ENA_MASK | @@ -347,10 +348,10 @@ i915_update_tex_unit(struct intel_context *intel, GLuint unit, GLuint ss3)     }     /* convert border color from float to ubyte */ -   CLAMPED_FLOAT_TO_UBYTE(border[0], tObj->BorderColor[0]); -   CLAMPED_FLOAT_TO_UBYTE(border[1], tObj->BorderColor[1]); -   CLAMPED_FLOAT_TO_UBYTE(border[2], tObj->BorderColor[2]); -   CLAMPED_FLOAT_TO_UBYTE(border[3], tObj->BorderColor[3]); +   CLAMPED_FLOAT_TO_UBYTE(border[0], tObj->BorderColor.f[0]); +   CLAMPED_FLOAT_TO_UBYTE(border[1], tObj->BorderColor.f[1]); +   CLAMPED_FLOAT_TO_UBYTE(border[2], tObj->BorderColor.f[2]); +   CLAMPED_FLOAT_TO_UBYTE(border[3], tObj->BorderColor.f[3]);     if (firstImage->_BaseFormat == GL_DEPTH_COMPONENT) {        /* GL specs that border color for depth textures is taken from the 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 aa2e519588..ad267a4e6a 100644 --- a/src/mesa/drivers/dri/i965/brw_wm_sampler_state.c +++ b/src/mesa/drivers/dri/i965/brw_wm_sampler_state.c @@ -262,10 +262,10 @@ brw_wm_sampler_populate_key(struct brw_context *brw,  	 dri_bo_unreference(brw->wm.sdc_bo[unit]);  	 if (firstImage->_BaseFormat == GL_DEPTH_COMPONENT) {  	    float bordercolor[4] = { -	       texObj->BorderColor[0], -	       texObj->BorderColor[0], -	       texObj->BorderColor[0], -	       texObj->BorderColor[0] +	       texObj->BorderColor.f[0], +	       texObj->BorderColor.f[0], +	       texObj->BorderColor.f[0], +	       texObj->BorderColor.f[0]  	    };  	    /* GL specs that border color for depth textures is taken from the  	     * R channel, while the hardware uses A.  Spam R into all the @@ -274,7 +274,7 @@ brw_wm_sampler_populate_key(struct brw_context *brw,  	    brw->wm.sdc_bo[unit] = upload_default_color(brw, bordercolor);  	 } else {  	    brw->wm.sdc_bo[unit] = upload_default_color(brw, -							texObj->BorderColor); +							texObj->BorderColor.f);  	 }  	 key->sampler_count = unit + 1;        } 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 7aca3aac8e..9db434c596 100644 --- a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c +++ b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c @@ -522,7 +522,8 @@ brw_update_renderbuffer_surface(struct brw_context *brw,        GLubyte color_mask[4];        GLboolean color_blend;        uint32_t tiling; -      uint32_t draw_offset; +      uint32_t draw_x; +      uint32_t draw_y;     } key;     memset(&key, 0, sizeof(key)); @@ -564,7 +565,8 @@ brw_update_renderbuffer_surface(struct brw_context *brw,        }        key.pitch = region->pitch;        key.cpp = region->cpp; -      key.draw_offset = region->draw_offset; /* cur 3d or cube face offset */ +      key.draw_x = region->draw_x; +      key.draw_y = region->draw_y;     } else {        key.surface_type = BRW_SURFACE_NULL;        key.surface_format = BRW_SURFACEFORMAT_B8G8R8A8_UNORM; @@ -572,7 +574,8 @@ brw_update_renderbuffer_surface(struct brw_context *brw,        key.width = 1;        key.height = 1;        key.cpp = 4; -      key.draw_offset = 0; +      key.draw_x = 0; +      key.draw_y = 0;     }     /* _NEW_COLOR */     memcpy(key.color_mask, ctx->Color.ColorMask[0], @@ -602,26 +605,32 @@ brw_update_renderbuffer_surface(struct brw_context *brw,        surf.ss0.surface_format = key.surface_format;        surf.ss0.surface_type = key.surface_type;        if (key.tiling == I915_TILING_NONE) { -	 surf.ss1.base_addr = key.draw_offset; +	 surf.ss1.base_addr = (key.draw_x + key.draw_y * key.pitch) * key.cpp;        } else { -	 uint32_t tile_offset = key.draw_offset % 4096; +	 uint32_t tile_base, tile_x, tile_y; +	 uint32_t pitch = key.pitch * key.cpp; -	 surf.ss1.base_addr = key.draw_offset - tile_offset; - -	 if (brw->has_surface_tile_offset) { -	    if (key.tiling == I915_TILING_X) { -	       /* Note that the low bits of these fields are missing, so -		* there's the possibility of getting in trouble. -		*/ -	       surf.ss5.x_offset = (tile_offset % 512) / key.cpp / 4; -	       surf.ss5.y_offset = tile_offset / 512 / 2; -	    } else { -	       surf.ss5.x_offset = (tile_offset % 128) / key.cpp / 4; -	       surf.ss5.y_offset = tile_offset / 128 / 2; -	    } +	 if (key.tiling == I915_TILING_X) { +	    tile_x = key.draw_x % (512 / key.cpp); +	    tile_y = key.draw_y % 8; +	    tile_base = ((key.draw_y / 8) * (8 * pitch)); +	    tile_base += (key.draw_x - tile_x) / (512 / key.cpp) * 4096;  	 } else { -	    assert(tile_offset == 0); +	    /* Y */ +	    tile_x = key.draw_x % (128 / key.cpp); +	    tile_y = key.draw_y % 32; +	    tile_base = ((key.draw_y / 32) * (32 * pitch)); +	    tile_base += (key.draw_x - tile_x) / (128 / key.cpp) * 4096;  	 } +	 assert(BRW_IS_G4X(brw) || (tile_x == 0 && tile_y == 0)); +	 assert(tile_x % 4 == 0); +	 assert(tile_y % 2 == 0); +	 /* Note that the low bits of these fields are missing, so +	  * there's the possibility of getting in trouble. +	  */ +	 surf.ss1.base_addr = tile_base; +	 surf.ss5.x_offset = tile_x / 4; +	 surf.ss5.y_offset = tile_y / 2;        }        if (region_bo != NULL)  	 surf.ss1.base_addr += region_bo->offset; /* reloc */ diff --git a/src/mesa/drivers/dri/intel/intel_tex_copy.c b/src/mesa/drivers/dri/intel/intel_tex_copy.c index e1d0b12752..d8e71093c4 100644 --- a/src/mesa/drivers/dri/intel/intel_tex_copy.c +++ b/src/mesa/drivers/dri/intel/intel_tex_copy.c @@ -158,13 +158,14 @@ do_copy_texsubimage(struct intel_context *intel,  			     intelImage->mt->cpp,  			     src_pitch,  			     src->buffer, -			     src->draw_offset, +			     0,  			     src->tiling,  			     intelImage->mt->pitch,  			     dst_bo,  			     0,  			     intelImage->mt->region->tiling, -			     x, y, image_x + dstx, image_y + dsty, +			     src->draw_x + x, src->draw_y + y, +			     image_x + dstx, image_y + dsty,  			     width, height,  			     GL_COPY)) {  	 return GL_FALSE; diff --git a/src/mesa/drivers/dri/mach64/mach64_tex.c b/src/mesa/drivers/dri/mach64/mach64_tex.c index 72917ee13b..6627d3c38a 100644 --- a/src/mesa/drivers/dri/mach64/mach64_tex.c +++ b/src/mesa/drivers/dri/mach64/mach64_tex.c @@ -130,7 +130,7 @@ mach64AllocTexObj( struct gl_texture_object *texObj )     mach64SetTexWrap( t, texObj->WrapS, texObj->WrapT );     mach64SetTexFilter( t, texObj->MinFilter, texObj->MagFilter ); -   mach64SetTexBorderColor( t, texObj->BorderColor ); +   mach64SetTexBorderColor( t, texObj->BorderColor.f );     return t;  } @@ -470,7 +470,7 @@ static void mach64DDTexParameter( GLcontext *ctx, GLenum target,     case GL_TEXTURE_BORDER_COLOR:        if ( t->base.bound ) FLUSH_BATCH( mmesa ); -      mach64SetTexBorderColor( t, tObj->BorderColor ); +      mach64SetTexBorderColor( t, tObj->BorderColor.f );        break;     case GL_TEXTURE_BASE_LEVEL: diff --git a/src/mesa/drivers/dri/mga/mgatex.c b/src/mesa/drivers/dri/mga/mgatex.c index 9163371b33..62a9317cd4 100644 --- a/src/mesa/drivers/dri/mga/mgatex.c +++ b/src/mesa/drivers/dri/mga/mgatex.c @@ -332,7 +332,7 @@ mgaAllocTexObj( struct gl_texture_object *tObj )        mgaSetTexWrapping( t, tObj->WrapS, tObj->WrapT );        mgaSetTexFilter( t, tObj->MinFilter, tObj->MagFilter ); -      mgaSetTexBorderColor( t, tObj->BorderColor ); +      mgaSetTexBorderColor( t, tObj->BorderColor.f );     }     return( t ); @@ -461,7 +461,7 @@ mgaTexParameter( GLcontext *ctx, GLenum target,     case GL_TEXTURE_BORDER_COLOR:        FLUSH_BATCH(mmesa); -      mgaSetTexBorderColor(t, tObj->BorderColor); +      mgaSetTexBorderColor(t, tObj->BorderColor.f);        break;     case GL_TEXTURE_BASE_LEVEL: diff --git a/src/mesa/drivers/dri/r128/r128_tex.c b/src/mesa/drivers/dri/r128/r128_tex.c index 0a1207fb89..f1be7cc1c4 100644 --- a/src/mesa/drivers/dri/r128/r128_tex.c +++ b/src/mesa/drivers/dri/r128/r128_tex.c @@ -169,7 +169,7 @@ static r128TexObjPtr r128AllocTexObj( struct gl_texture_object *texObj )        r128SetTexWrap( t, texObj->WrapS, texObj->WrapT );        r128SetTexFilter( t, texObj->MinFilter, texObj->MagFilter ); -      r128SetTexBorderColor( t, texObj->BorderColor ); +      r128SetTexBorderColor( t, texObj->BorderColor.f );     }     return t; @@ -535,7 +535,7 @@ static void r128TexParameter( GLcontext *ctx, GLenum target,     case GL_TEXTURE_BORDER_COLOR:        if ( t->base.bound ) FLUSH_BATCH( rmesa ); -      r128SetTexBorderColor( t, tObj->BorderColor ); +      r128SetTexBorderColor( t, tObj->BorderColor.f );        break;     case GL_TEXTURE_BASE_LEVEL: diff --git a/src/mesa/drivers/dri/r200/r200_tex.c b/src/mesa/drivers/dri/r200/r200_tex.c index a417721553..5b87ba6ccd 100644 --- a/src/mesa/drivers/dri/r200/r200_tex.c +++ b/src/mesa/drivers/dri/r200/r200_tex.c @@ -378,7 +378,7 @@ static void r200TexParameter( GLcontext *ctx, GLenum target,        break;     case GL_TEXTURE_BORDER_COLOR: -      r200SetTexBorderColor( t, texObj->BorderColor ); +      r200SetTexBorderColor( t, texObj->BorderColor.f );        break;     case GL_TEXTURE_BASE_LEVEL: @@ -470,7 +470,7 @@ static struct gl_texture_object *r200NewTextureObject(GLcontext * ctx,     r200SetTexWrap( t, t->base.WrapS, t->base.WrapT, t->base.WrapR );     r200SetTexMaxAnisotropy( t, t->base.MaxAnisotropy );     r200SetTexFilter(t, t->base.MinFilter, t->base.MagFilter); -   r200SetTexBorderColor(t, t->base.BorderColor); +   r200SetTexBorderColor(t, t->base.BorderColor.f);     return &t->base;  } diff --git a/src/mesa/drivers/dri/r300/compiler/memory_pool.c b/src/mesa/drivers/dri/r300/compiler/memory_pool.c index 37aa2b6579..76c7c60d8f 100644 --- a/src/mesa/drivers/dri/r300/compiler/memory_pool.c +++ b/src/mesa/drivers/dri/r300/compiler/memory_pool.c @@ -71,12 +71,14 @@ static void refill_pool(struct memory_pool * pool)  void * memory_pool_malloc(struct memory_pool * pool, unsigned int bytes)  {  	if (bytes < POOL_LARGE_ALLOC) { +		void * ptr; +  		if (pool->head + bytes > pool->end)  			refill_pool(pool);  		assert(pool->head + bytes <= pool->end); -		void * ptr = pool->head; +		ptr = pool->head;  		pool->head += bytes;  		pool->head = (unsigned char*)(((unsigned long)pool->head + POOL_ALIGN - 1) & ~(POOL_ALIGN - 1)); diff --git a/src/mesa/drivers/dri/r300/compiler/radeon_code.c b/src/mesa/drivers/dri/r300/compiler/radeon_code.c index 1a3d8bb641..853b2becd1 100644 --- a/src/mesa/drivers/dri/r300/compiler/radeon_code.c +++ b/src/mesa/drivers/dri/r300/compiler/radeon_code.c @@ -143,7 +143,8 @@ unsigned rc_constants_add_immediate_scalar(struct rc_constant_list * c, float da  	for(index = 0; index < c->Count; ++index) {  		if (c->Constants[index].Type == RC_CONSTANT_IMMEDIATE) { -			for(unsigned comp = 0; comp < c->Constants[index].Size; ++comp) { +			unsigned comp; +			for(comp = 0; comp < c->Constants[index].Size; ++comp) {  				if (c->Constants[index].u.Immediate[comp] == data) {  					*swizzle = RC_MAKE_SWIZZLE(comp, comp, comp, comp);  					return index; diff --git a/src/mesa/drivers/dri/r300/compiler/radeon_compiler.c b/src/mesa/drivers/dri/r300/compiler/radeon_compiler.c index c0e7a7f7a0..41ea23ee32 100644 --- a/src/mesa/drivers/dri/r300/compiler/radeon_compiler.c +++ b/src/mesa/drivers/dri/r300/compiler/radeon_compiler.c @@ -232,12 +232,16 @@ void rc_copy_output(struct radeon_compiler * c, unsigned output, unsigned dup_ou  void rc_transform_fragment_wpos(struct radeon_compiler * c, unsigned wpos, unsigned new_input)  {  	unsigned tempregi = rc_find_free_temporary(c); +	struct rc_instruction * inst_rcp; +	struct rc_instruction * inst_mul; +	struct rc_instruction * inst_mad; +	struct rc_instruction * inst;  	c->Program.InputsRead &= ~(1 << wpos);  	c->Program.InputsRead |= 1 << new_input;  	/* perspective divide */ -	struct rc_instruction * inst_rcp = rc_insert_new_instruction(c, &c->Program.Instructions); +	inst_rcp = rc_insert_new_instruction(c, &c->Program.Instructions);  	inst_rcp->U.I.Opcode = RC_OPCODE_RCP;  	inst_rcp->U.I.DstReg.File = RC_FILE_TEMPORARY; @@ -248,7 +252,7 @@ void rc_transform_fragment_wpos(struct radeon_compiler * c, unsigned wpos, unsig  	inst_rcp->U.I.SrcReg[0].Index = new_input;  	inst_rcp->U.I.SrcReg[0].Swizzle = RC_SWIZZLE_WWWW; -	struct rc_instruction * inst_mul = rc_insert_new_instruction(c, inst_rcp); +	inst_mul = rc_insert_new_instruction(c, inst_rcp);  	inst_mul->U.I.Opcode = RC_OPCODE_MUL;  	inst_mul->U.I.DstReg.File = RC_FILE_TEMPORARY; @@ -263,7 +267,7 @@ void rc_transform_fragment_wpos(struct radeon_compiler * c, unsigned wpos, unsig  	inst_mul->U.I.SrcReg[1].Swizzle = RC_SWIZZLE_WWWW;  	/* viewport transformation */ -	struct rc_instruction * inst_mad = rc_insert_new_instruction(c, inst_mul); +	inst_mad = rc_insert_new_instruction(c, inst_mul);  	inst_mad->U.I.Opcode = RC_OPCODE_MAD;  	inst_mad->U.I.DstReg.File = RC_FILE_TEMPORARY; @@ -282,7 +286,6 @@ void rc_transform_fragment_wpos(struct radeon_compiler * c, unsigned wpos, unsig  	inst_mad->U.I.SrcReg[2].Index = inst_mad->U.I.SrcReg[1].Index;  	inst_mad->U.I.SrcReg[2].Swizzle = RC_MAKE_SWIZZLE(RC_SWIZZLE_X, RC_SWIZZLE_Y, RC_SWIZZLE_Z, RC_SWIZZLE_ZERO); -	struct rc_instruction * inst;  	for (inst = inst_mad->Next; inst != &c->Program.Instructions; inst = inst->Next) {  		const struct rc_opcode_info * opcode = rc_get_opcode_info(inst->U.I.Opcode);  		unsigned i; diff --git a/src/mesa/drivers/dri/r300/compiler/radeon_program_alu.c b/src/mesa/drivers/dri/r300/compiler/radeon_program_alu.c index ced66af1eb..b5c08aea49 100644 --- a/src/mesa/drivers/dri/r300/compiler/radeon_program_alu.c +++ b/src/mesa/drivers/dri/r300/compiler/radeon_program_alu.c @@ -267,9 +267,9 @@ static void transform_LIT(struct radeon_compiler* c,  	temp = inst->U.I.DstReg.Index;  	srctemp = srcreg(RC_FILE_TEMPORARY, temp); -	// tmp.x = max(0.0, Src.x); -	// tmp.y = max(0.0, Src.y); -	// tmp.w = clamp(Src.z, -128+eps, 128-eps); +	/* tmp.x = max(0.0, Src.x); */ +	/* tmp.y = max(0.0, Src.y); */ +	/* tmp.w = clamp(Src.z, -128+eps, 128-eps); */  	emit2(c, inst->Prev, RC_OPCODE_MAX, 0,  		dstregtmpmask(temp, RC_MASK_XYW),  		inst->U.I.SrcReg[0], @@ -280,7 +280,7 @@ static void transform_LIT(struct radeon_compiler* c,  		swizzle(srctemp, RC_SWIZZLE_W, RC_SWIZZLE_W, RC_SWIZZLE_W, RC_SWIZZLE_W),  		negate(srcregswz(RC_FILE_CONSTANT, constant, constant_swizzle))); -	// tmp.w = Pow(tmp.y, tmp.w) +	/* tmp.w = Pow(tmp.y, tmp.w) */  	emit1(c, inst->Prev, RC_OPCODE_LG2, 0,  		dstregtmpmask(temp, RC_MASK_W),  		swizzle(srctemp, RC_SWIZZLE_Y, RC_SWIZZLE_Y, RC_SWIZZLE_Y, RC_SWIZZLE_Y)); @@ -292,14 +292,14 @@ static void transform_LIT(struct radeon_compiler* c,  		dstregtmpmask(temp, RC_MASK_W),  		swizzle(srctemp, RC_SWIZZLE_W, RC_SWIZZLE_W, RC_SWIZZLE_W, RC_SWIZZLE_W)); -	// tmp.z = (tmp.x > 0) ? tmp.w : 0.0 +	/* tmp.z = (tmp.x > 0) ? tmp.w : 0.0 */  	emit3(c, inst->Prev, RC_OPCODE_CMP, inst->U.I.SaturateMode,  		dstregtmpmask(temp, RC_MASK_Z),  		negate(swizzle(srctemp, RC_SWIZZLE_X, RC_SWIZZLE_X, RC_SWIZZLE_X, RC_SWIZZLE_X)),  		swizzle(srctemp, RC_SWIZZLE_W, RC_SWIZZLE_W, RC_SWIZZLE_W, RC_SWIZZLE_W),  		builtin_zero); -	// tmp.x, tmp.y, tmp.w = 1.0, tmp.x, 1.0 +	/* tmp.x, tmp.y, tmp.w = 1.0, tmp.x, 1.0 */  	emit1(c, inst->Prev, RC_OPCODE_MOV, inst->U.I.SaturateMode,  		dstregtmpmask(temp, RC_MASK_XYW),  		swizzle(srctemp, RC_SWIZZLE_ONE, RC_SWIZZLE_X, RC_SWIZZLE_ONE, RC_SWIZZLE_ONE)); @@ -533,16 +533,16 @@ static void sincos_constants(struct radeon_compiler* c, unsigned int *constants)  {  	static const float SinCosConsts[2][4] = {  		{ -			1.273239545,		// 4/PI -			-0.405284735,		// -4/(PI*PI) -			3.141592654,		// PI -			0.2225			// weight +			1.273239545,		/* 4/PI */ +			-0.405284735,		/* -4/(PI*PI) */ +			3.141592654,		/* PI */ +			0.2225			/* weight */  		},  		{  			0.75,  			0.5, -			0.159154943,		// 1/(2*PI) -			6.283185307		// 2*PI +			0.159154943,		/* 1/(2*PI) */ +			6.283185307		/* 2*PI */  		}  	};  	int i; @@ -602,9 +602,9 @@ int radeonTransformTrigSimple(struct radeon_compiler* c,  	sincos_constants(c, constants);  	if (inst->U.I.Opcode == RC_OPCODE_COS) { -		// MAD tmp.x, src, 1/(2*PI), 0.75 -		// FRC tmp.x, tmp.x -		// MAD tmp.z, tmp.x, 2*PI, -PI +		/* MAD tmp.x, src, 1/(2*PI), 0.75 */ +		/* FRC tmp.x, tmp.x */ +		/* MAD tmp.z, tmp.x, 2*PI, -PI */  		emit3(c, inst->Prev, RC_OPCODE_MAD, 0, dstregtmpmask(tempreg, RC_MASK_W),  			swizzle(inst->U.I.SrcReg[0], RC_SWIZZLE_X, RC_SWIZZLE_X, RC_SWIZZLE_X, RC_SWIZZLE_X),  			swizzle(srcreg(RC_FILE_CONSTANT, constants[1]), RC_SWIZZLE_Z, RC_SWIZZLE_Z, RC_SWIZZLE_Z, RC_SWIZZLE_Z), diff --git a/src/mesa/drivers/dri/r300/r300_tex.c b/src/mesa/drivers/dri/r300/r300_tex.c index ac3d5b1bec..963f648cb1 100644 --- a/src/mesa/drivers/dri/r300/r300_tex.c +++ b/src/mesa/drivers/dri/r300/r300_tex.c @@ -215,7 +215,7 @@ static void r300TexParameter(GLcontext * ctx, GLenum target,  		break;  	case GL_TEXTURE_BORDER_COLOR: -		r300SetTexBorderColor(t, texObj->BorderColor); +		r300SetTexBorderColor(t, texObj->BorderColor.f);  		break;  	case GL_TEXTURE_BASE_LEVEL: @@ -307,7 +307,7 @@ static struct gl_texture_object *r300NewTextureObject(GLcontext * ctx,  	/* Initialize hardware state */  	r300UpdateTexWrap(t);  	r300SetTexFilter(t, t->base.MinFilter, t->base.MagFilter, t->base.MaxAnisotropy); -	r300SetTexBorderColor(t, t->base.BorderColor); +	r300SetTexBorderColor(t, t->base.BorderColor.f);  	return &t->base;  } diff --git a/src/mesa/drivers/dri/r600/r600_context.c b/src/mesa/drivers/dri/r600/r600_context.c index 0d8b5b45ac..cb549497f5 100644 --- a/src/mesa/drivers/dri/r600/r600_context.c +++ b/src/mesa/drivers/dri/r600/r600_context.c @@ -99,6 +99,7 @@ static const struct dri_extension card_extensions[] = {    {"GL_ARB_depth_clamp",                NULL},    {"GL_ARB_depth_texture",		NULL},    {"GL_ARB_fragment_program",		NULL}, +  {"GL_ARB_fragment_program_shadow",	NULL},    {"GL_ARB_occlusion_query",            GL_ARB_occlusion_query_functions},    {"GL_ARB_multitexture",		NULL},    {"GL_ARB_point_parameters",		GL_ARB_point_parameters_functions}, @@ -163,6 +164,7 @@ static const struct dri_extension gl_20_extension[] = {  #else    {"GL_VERSION_2_0",			GL_VERSION_2_0_functions },  #endif /* R600_ENABLE_GLSL_TEST */ +  {NULL, NULL}  };  static const struct tnl_pipeline_stage *r600_pipeline[] = { diff --git a/src/mesa/drivers/dri/r600/r600_tex.c b/src/mesa/drivers/dri/r600/r600_tex.c index 9d83a64e22..f745fe3e8a 100644 --- a/src/mesa/drivers/dri/r600/r600_tex.c +++ b/src/mesa/drivers/dri/r600/r600_tex.c @@ -305,7 +305,7 @@ static void r600TexParameter(GLcontext * ctx, GLenum target,  		break;  	case GL_TEXTURE_BORDER_COLOR: -		r600SetTexBorderColor(t, texObj->BorderColor); +		r600SetTexBorderColor(t, texObj->BorderColor.f);  		break;  	case GL_TEXTURE_BASE_LEVEL: @@ -391,7 +391,7 @@ static struct gl_texture_object *r600NewTextureObject(GLcontext * ctx,  	r600SetTexDefaultState(t);  	r600UpdateTexWrap(t);  	r600SetTexFilter(t, t->base.MinFilter, t->base.MagFilter, t->base.MaxAnisotropy); -	r600SetTexBorderColor(t, t->base.BorderColor); +	r600SetTexBorderColor(t, t->base.BorderColor.f);  	return &t->base;  } diff --git a/src/mesa/drivers/dri/r600/r600_texstate.c b/src/mesa/drivers/dri/r600/r600_texstate.c index 2a4a6e6ee1..ae252c995b 100644 --- a/src/mesa/drivers/dri/r600/r600_texstate.c +++ b/src/mesa/drivers/dri/r600/r600_texstate.c @@ -91,7 +91,7 @@ static GLboolean r600GetTexFormat(struct gl_texture_object *tObj, gl_format mesa  	SETfield(t->SQ_TEX_RESOURCE4, SQ_FORMAT_COMP_UNSIGNED,  		 FORMAT_COMP_Y_shift, FORMAT_COMP_Y_mask);  	SETfield(t->SQ_TEX_RESOURCE4, SQ_FORMAT_COMP_UNSIGNED, -		 FORMAT_COMP_X_shift, FORMAT_COMP_Z_mask); +		 FORMAT_COMP_Z_shift, FORMAT_COMP_Z_mask);  	SETfield(t->SQ_TEX_RESOURCE4, SQ_FORMAT_COMP_UNSIGNED,  		 FORMAT_COMP_W_shift, FORMAT_COMP_W_mask); @@ -626,6 +626,31 @@ static GLboolean r600GetTexFormat(struct gl_texture_object *tObj, gl_format mesa  	return GL_TRUE;  } +static GLuint r600_translate_shadow_func(GLenum func) +{ +   switch (func) { +   case GL_NEVER: +      return SQ_TEX_DEPTH_COMPARE_NEVER; +   case GL_LESS: +      return SQ_TEX_DEPTH_COMPARE_LESS; +   case GL_LEQUAL: +      return SQ_TEX_DEPTH_COMPARE_LESSEQUAL; +   case GL_GREATER: +      return SQ_TEX_DEPTH_COMPARE_GREATER; +   case GL_GEQUAL: +      return SQ_TEX_DEPTH_COMPARE_GREATEREQUAL; +   case GL_NOTEQUAL: +      return SQ_TEX_DEPTH_COMPARE_NOTEQUAL; +   case GL_EQUAL: +      return SQ_TEX_DEPTH_COMPARE_EQUAL; +   case GL_ALWAYS: +      return SQ_TEX_DEPTH_COMPARE_ALWAYS; +   default: +      WARN_ONCE("Unknown shadow compare function! %d", func); +      return 0; +   } +} +  void r600SetDepthTexMode(struct gl_texture_object *tObj)  {  	radeonTexObjPtr t; @@ -706,11 +731,22 @@ static void setup_hardware_state(context_t *rmesa, struct gl_texture_object *tex  	SETfield(t->SQ_TEX_RESOURCE1, firstImage->Height - 1,  		 TEX_HEIGHT_shift, TEX_HEIGHT_mask); +	t->SQ_TEX_RESOURCE2 = get_base_teximage_offset(t) / 256; +  	if ((t->maxLod - t->minLod) > 0) { -		t->SQ_TEX_RESOURCE3 = t->mt->levels[t->minLod].size / 256; +		t->SQ_TEX_RESOURCE3 = radeon_miptree_image_offset(t->mt, 0, t->minLod + 1) / 256;  		SETfield(t->SQ_TEX_RESOURCE4, 0, BASE_LEVEL_shift, BASE_LEVEL_mask);  		SETfield(t->SQ_TEX_RESOURCE5, t->maxLod - t->minLod, LAST_LEVEL_shift, LAST_LEVEL_mask);  	} +	if(texObj->CompareMode == GL_COMPARE_R_TO_TEXTURE_ARB) +	{ +		SETfield(t->SQ_TEX_SAMPLER0, r600_translate_shadow_func(texObj->CompareFunc), DEPTH_COMPARE_FUNCTION_shift, DEPTH_COMPARE_FUNCTION_mask); +	} +	else +	{ +		CLEARfield(t->SQ_TEX_SAMPLER0, DEPTH_COMPARE_FUNCTION_mask); +	} +  }  /** diff --git a/src/mesa/drivers/dri/r600/r700_assembler.c b/src/mesa/drivers/dri/r600/r700_assembler.c index 1ff89e18ea..0ff16b4ddd 100644 --- a/src/mesa/drivers/dri/r600/r700_assembler.c +++ b/src/mesa/drivers/dri/r600/r700_assembler.c @@ -4397,7 +4397,10 @@ GLboolean assemble_TEX(r700_AssemblerBase *pAsm)              pAsm->D.dst.opcode = SQ_TEX_INST_SAMPLE_L;              break;          default: -            pAsm->D.dst.opcode = SQ_TEX_INST_SAMPLE; +            if(pAsm->pILInst[pAsm->uiCurInst].TexShadow == 1) +                pAsm->D.dst.opcode = SQ_TEX_INST_SAMPLE_C; +            else +                pAsm->D.dst.opcode = SQ_TEX_INST_SAMPLE;      }      pAsm->is_tex = GL_TRUE; @@ -4443,11 +4446,46 @@ GLboolean assemble_TEX(r700_AssemblerBase *pAsm)          pAsm->S[0].src.swizzlew = SQ_SEL_Y;      } +    if(pAsm->pILInst[pAsm->uiCurInst].TexShadow == 1) +    { +        /* compare value goes to w chan ? */ +        pAsm->S[0].src.swizzlew = SQ_SEL_Z; +    } +      if ( GL_FALSE == next_ins(pAsm) )          {              return GL_FALSE;          } +    /* add ARB shadow ambient but clamp to 0..1 */ +    if(pAsm->pILInst[pAsm->uiCurInst].TexShadow == 1) +    { +	/* ADD_SAT dst,  dst,  ambient[texunit] */ +	pAsm->D.dst.opcode = SQ_OP2_INST_ADD; + +	if( GL_FALSE == assemble_dst(pAsm) ) +	{ +	    return GL_FALSE; +	} +	pAsm->D2.dst2.SaturateMode = 1; + +	pAsm->S[0].src.rtype = pAsm->D.dst.rtype; +	pAsm->S[0].src.reg = pAsm->D.dst.reg; +	noswizzle_PVSSRC(&(pAsm->S[0].src)); +	noneg_PVSSRC(&(pAsm->S[0].src)); + +	pAsm->S[1].src.rtype = SRC_REG_CONSTANT; +	pAsm->S[1].src.reg = pAsm->shadow_regs[pAsm->pILInst[pAsm->uiCurInst].TexSrcUnit]; +	noswizzle_PVSSRC(&(pAsm->S[1].src)); +	noneg_PVSSRC(&(pAsm->S[1].src)); + +	if( GL_FALSE == next_ins(pAsm) ) +	{ +	    return GL_FALSE; +	} + +    } +      return GL_TRUE;  } diff --git a/src/mesa/drivers/dri/r600/r700_assembler.h b/src/mesa/drivers/dri/r600/r700_assembler.h index 86342b814f..56baf5b0d9 100644 --- a/src/mesa/drivers/dri/r600/r700_assembler.h +++ b/src/mesa/drivers/dri/r600/r700_assembler.h @@ -487,6 +487,8 @@ typedef struct r700_AssemblerBase      GLuint    unVetTexBits; +    GLuint    shadow_regs[R700_MAX_TEXTURE_UNITS]; +  } r700_AssemblerBase;  //Internal use diff --git a/src/mesa/drivers/dri/r600/r700_chip.c b/src/mesa/drivers/dri/r600/r700_chip.c index c124e02184..3bc2d2ba02 100644 --- a/src/mesa/drivers/dri/r600/r700_chip.c +++ b/src/mesa/drivers/dri/r600/r700_chip.c @@ -57,14 +57,11 @@ static void r700SendTexState(GLcontext *ctx, struct radeon_state_atom *atom)  	for (i = 0; i < R700_TEXTURE_NUMBERUNITS; i++) {  		if (ctx->Texture.Unit[i]._ReallyEnabled) {              			radeonTexObj *t = r700->textures[i]; -			uint32_t offset;  			if (t) {  				if (!t->image_override) {  					bo = t->mt->bo; -					offset = get_base_teximage_offset(t);  				} else {  					bo = t->bo; -					offset = 0;  				}  				if (bo) { @@ -93,7 +90,7 @@ static void r700SendTexState(GLcontext *ctx, struct radeon_state_atom *atom)  					R600_OUT_BATCH(r700->textures[i]->SQ_TEX_RESOURCE6);  					R600_OUT_BATCH_RELOC(r700->textures[i]->SQ_TEX_RESOURCE2,  							     bo, -							     offset, +							     r700->textures[i]->SQ_TEX_RESOURCE2,  							     RADEON_GEM_DOMAIN_GTT|RADEON_GEM_DOMAIN_VRAM, 0, 0);  					R600_OUT_BATCH_RELOC(r700->textures[i]->SQ_TEX_RESOURCE3,  							     bo, diff --git a/src/mesa/drivers/dri/r600/r700_fragprog.c b/src/mesa/drivers/dri/r600/r700_fragprog.c index ce2d9fdf79..84d51e6606 100644 --- a/src/mesa/drivers/dri/r600/r700_fragprog.c +++ b/src/mesa/drivers/dri/r600/r700_fragprog.c @@ -362,8 +362,11 @@ GLboolean r700TranslateFragmentShader(struct r700_fragment_program *fp,  {  	GLuint    number_of_colors_exported;  	GLboolean z_enabled = GL_FALSE; -	GLuint    unBit; +	GLuint    unBit, shadow_unit;  	int i; +	struct prog_instruction *inst; +	gl_state_index shadow_ambient[STATE_LENGTH] +	    = { STATE_INTERNAL, STATE_SHADOW_AMBIENT, 0, 0, 0};      //Init_Program  	Init_r700_AssemblerBase( SPT_FP, &(fp->r700AsmCode), &(fp->r700Shader) ); @@ -373,6 +376,23 @@ GLboolean r700TranslateFragmentShader(struct r700_fragment_program *fp,          insert_wpos_code(ctx, mesa_fp);      } +    /* add/map  consts for ARB_shadow_ambient */ +    if(mesa_fp->Base.ShadowSamplers) +    { +        inst = mesa_fp->Base.Instructions; +        for (i = 0; i < mesa_fp->Base.NumInstructions; i++) +        { +            if(inst->TexShadow == 1) +            { +                shadow_unit = inst->TexSrcUnit; +                shadow_ambient[2] = shadow_unit; +                fp->r700AsmCode.shadow_regs[shadow_unit] =  +                    _mesa_add_state_reference(mesa_fp->Base.Parameters, shadow_ambient); +            } +            inst++; +        } +    } +      Map_Fragment_Program(&(fp->r700AsmCode), mesa_fp, ctx);       if( GL_FALSE == Find_Instruction_Dependencies_fp(fp, mesa_fp) ) diff --git a/src/mesa/drivers/dri/radeon/radeon_tex.c b/src/mesa/drivers/dri/radeon/radeon_tex.c index 749ab75f20..14163f13af 100644 --- a/src/mesa/drivers/dri/radeon/radeon_tex.c +++ b/src/mesa/drivers/dri/radeon/radeon_tex.c @@ -341,7 +341,7 @@ static void radeonTexParameter( GLcontext *ctx, GLenum target,        break;     case GL_TEXTURE_BORDER_COLOR: -      radeonSetTexBorderColor( t, texObj->BorderColor ); +      radeonSetTexBorderColor( t, texObj->BorderColor.f );        break;     case GL_TEXTURE_BASE_LEVEL: @@ -428,7 +428,7 @@ radeonNewTextureObject( GLcontext *ctx, GLuint name, GLenum target )     radeonSetTexWrap( t, t->base.WrapS, t->base.WrapT );     radeonSetTexMaxAnisotropy( t, t->base.MaxAnisotropy );     radeonSetTexFilter( t, t->base.MinFilter, t->base.MagFilter ); -   radeonSetTexBorderColor( t, t->base.BorderColor ); +   radeonSetTexBorderColor( t, t->base.BorderColor.f );     return &t->base;  } diff --git a/src/mesa/drivers/dri/savage/savagetex.c b/src/mesa/drivers/dri/savage/savagetex.c index 6c97bb6c70..97598f599e 100644 --- a/src/mesa/drivers/dri/savage/savagetex.c +++ b/src/mesa/drivers/dri/savage/savagetex.c @@ -507,7 +507,7 @@ savageAllocTexObj( struct gl_texture_object *texObj )        savageSetTexWrapping(t,texObj->WrapS,texObj->WrapT);        savageSetTexFilter(t,texObj->MinFilter,texObj->MagFilter); -      savageSetTexBorderColor(t,texObj->BorderColor); +      savageSetTexBorderColor(t,texObj->BorderColor.f);     }     return t; @@ -2044,7 +2044,7 @@ static void savageTexParameter( GLcontext *ctx, GLenum target,        break;     case GL_TEXTURE_BORDER_COLOR: -      savageSetTexBorderColor(t,tObj->BorderColor); +      savageSetTexBorderColor(t,tObj->BorderColor.f);        break;     default: diff --git a/src/mesa/drivers/dri/sis/sis_context.c b/src/mesa/drivers/dri/sis/sis_context.c index 1f88e9ccdd..0944f4d8b4 100644 --- a/src/mesa/drivers/dri/sis/sis_context.c +++ b/src/mesa/drivers/dri/sis/sis_context.c @@ -83,6 +83,7 @@ static struct dri_extension card_extensions[] =      { NULL,                                NULL }  }; +#if 0  static struct dri_extension card_extensions_6326[] =  {      /*{ "GL_ARB_texture_border_clamp",       NULL },*/ @@ -90,6 +91,7 @@ static struct dri_extension card_extensions_6326[] =      /*{ "GL_MESA_ycbcr_texture",             NULL },*/      { NULL,                                NULL }  }; +#endif  static const struct dri_debug_control debug_control[] =  { diff --git a/src/mesa/drivers/dri/sis/sis_texstate.c b/src/mesa/drivers/dri/sis/sis_texstate.c index a507173b21..4c22a10cf7 100644 --- a/src/mesa/drivers/dri/sis/sis_texstate.c +++ b/src/mesa/drivers/dri/sis/sis_texstate.c @@ -457,10 +457,10 @@ sis_set_texobj_parm( GLcontext *ctx, struct gl_texture_object *texObj,     {        GLubyte c[4]; -      CLAMPED_FLOAT_TO_UBYTE(c[0], texObj->BorderColor[0]); -      CLAMPED_FLOAT_TO_UBYTE(c[1], texObj->BorderColor[1]); -      CLAMPED_FLOAT_TO_UBYTE(c[2], texObj->BorderColor[2]); -      CLAMPED_FLOAT_TO_UBYTE(c[3], texObj->BorderColor[3]); +      CLAMPED_FLOAT_TO_UBYTE(c[0], texObj->BorderColor.f[0]); +      CLAMPED_FLOAT_TO_UBYTE(c[1], texObj->BorderColor.f[1]); +      CLAMPED_FLOAT_TO_UBYTE(c[2], texObj->BorderColor.f[2]); +      CLAMPED_FLOAT_TO_UBYTE(c[3], texObj->BorderColor.f[3]);        current->texture[hw_unit].hwTextureBorderColor =            PACK_COLOR_8888(c[3], c[0], c[1], c[2]); diff --git a/src/mesa/drivers/dri/unichrome/via_state.c b/src/mesa/drivers/dri/unichrome/via_state.c index 5a8d927de1..e6e5526d34 100644 --- a/src/mesa/drivers/dri/unichrome/via_state.c +++ b/src/mesa/drivers/dri/unichrome/via_state.c @@ -891,10 +891,10 @@ static GLboolean viaChooseTextureState(GLcontext *ctx)              if (texObj->Image[0][texObj->BaseLevel]->Border > 0) {  	       vmesa->regHTXnTB[0] |= (HC_HTXnTB_TBC_S | HC_HTXnTB_TBC_T);  	       vmesa->regHTXnTBC[0] =  -		  PACK_COLOR_888(FLOAT_TO_UBYTE(texObj->BorderColor[0]), -				 FLOAT_TO_UBYTE(texObj->BorderColor[1]), -				 FLOAT_TO_UBYTE(texObj->BorderColor[2])); -	       vmesa->regHTXnTRAH[0] = FLOAT_TO_UBYTE(texObj->BorderColor[3]); +		  PACK_COLOR_888(FLOAT_TO_UBYTE(texObj->BorderColor.f[0]), +				 FLOAT_TO_UBYTE(texObj->BorderColor.f[1]), +				 FLOAT_TO_UBYTE(texObj->BorderColor.f[2])); +	       vmesa->regHTXnTRAH[0] = FLOAT_TO_UBYTE(texObj->BorderColor.f[3]);              }  	    if (texUnit0->LodBias != 0.0f) { @@ -924,10 +924,10 @@ static GLboolean viaChooseTextureState(GLcontext *ctx)              if (texObj->Image[0][texObj->BaseLevel]->Border > 0) {  	       vmesa->regHTXnTB[1] |= (HC_HTXnTB_TBC_S | HC_HTXnTB_TBC_T);  	       vmesa->regHTXnTBC[1] =  -		  PACK_COLOR_888(FLOAT_TO_UBYTE(texObj->BorderColor[0]), -				 FLOAT_TO_UBYTE(texObj->BorderColor[1]), -				 FLOAT_TO_UBYTE(texObj->BorderColor[2])); -	       vmesa->regHTXnTRAH[1] = FLOAT_TO_UBYTE(texObj->BorderColor[3]); +		  PACK_COLOR_888(FLOAT_TO_UBYTE(texObj->BorderColor.f[0]), +				 FLOAT_TO_UBYTE(texObj->BorderColor.f[1]), +				 FLOAT_TO_UBYTE(texObj->BorderColor.f[2])); +	       vmesa->regHTXnTRAH[1] = FLOAT_TO_UBYTE(texObj->BorderColor.f[3]);              } | 
