diff options
| -rw-r--r-- | src/gallium/auxiliary/tgsi/tgsi_sse2.c | 10 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/r300/r300_fragprog_common.c | 18 | ||||
| -rw-r--r-- | src/mesa/main/texenvprogram.c | 1 | ||||
| -rw-r--r-- | src/mesa/shader/prog_execute.c | 7 | ||||
| -rw-r--r-- | src/mesa/shader/slang/slang_builtin.c | 4 | ||||
| -rw-r--r-- | src/mesa/shader/slang/slang_codegen.c | 2 | ||||
| -rw-r--r-- | src/mesa/state_tracker/st_draw.c | 12 | ||||
| -rw-r--r-- | src/mesa/swrast/s_fragprog.c | 11 | 
8 files changed, 43 insertions, 22 deletions
| diff --git a/src/gallium/auxiliary/tgsi/tgsi_sse2.c b/src/gallium/auxiliary/tgsi/tgsi_sse2.c index 6f1532ad20..5f6b83b236 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_sse2.c +++ b/src/gallium/auxiliary/tgsi/tgsi_sse2.c @@ -1445,11 +1445,11 @@ fetch_texel( struct tgsi_sampler **sampler,     {        float rgba[NUM_CHANNELS][QUAD_SIZE];        (*sampler)->get_samples(*sampler,  -                              &store[0],  -                              &store[4],  -                              &store[8],  -                              0.0f, /*store[12],  lodbias */ -                              rgba); +                              &store[0],  /* s */ +                              &store[4],  /* t */ +                              &store[8],  /* r */ +                              store[12],  /* lodbias */ +                              rgba);      /* results */        memcpy( store, rgba, 16 * sizeof(float));     } diff --git a/src/mesa/drivers/dri/r300/r300_fragprog_common.c b/src/mesa/drivers/dri/r300/r300_fragprog_common.c index 469c278b51..0bdc90b4a8 100644 --- a/src/mesa/drivers/dri/r300/r300_fragprog_common.c +++ b/src/mesa/drivers/dri/r300/r300_fragprog_common.c @@ -99,8 +99,8 @@ static void insert_WPOS_trailer(struct r300_fragment_program_compiler *compiler,  {  	int i; +	fp->wpos_attr = FRAG_ATTRIB_MAX;  	if (!(compiler->Base.Program.InputsRead & FRAG_BIT_WPOS)) { -		fp->wpos_attr = FRAG_ATTRIB_MAX;  		return;  	} @@ -112,6 +112,13 @@ static void insert_WPOS_trailer(struct r300_fragment_program_compiler *compiler,  		}  	} +	/* No free texcoord found, fall-back to software rendering */ +	if (fp->wpos_attr == FRAG_ATTRIB_MAX) +	{ +		compiler->Base.Error = 1; +		return; +	} +  	rc_transform_fragment_wpos(&compiler->Base, FRAG_ATTRIB_WPOS, fp->wpos_attr);  } @@ -127,8 +134,8 @@ static void rewriteFog(struct r300_fragment_program_compiler *compiler, struct r  	struct prog_src_register src;  	int i; +	fp->fog_attr = FRAG_ATTRIB_MAX;  	if (!(compiler->Base.Program.InputsRead & FRAG_BIT_FOGC)) { -		fp->fog_attr = FRAG_ATTRIB_MAX;  		return;  	} @@ -140,6 +147,13 @@ static void rewriteFog(struct r300_fragment_program_compiler *compiler, struct r  		}  	} +	/* No free texcoord found, fall-back to software rendering */ +	if (fp->fog_attr == FRAG_ATTRIB_MAX) +	{ +		compiler->Base.Error = 1; +		return; +	} +  	memset(&src, 0, sizeof(src));  	src.File = PROGRAM_INPUT;  	src.Index = fp->fog_attr; diff --git a/src/mesa/main/texenvprogram.c b/src/mesa/main/texenvprogram.c index 2f3e47e69e..d7e77e759e 100644 --- a/src/mesa/main/texenvprogram.c +++ b/src/mesa/main/texenvprogram.c @@ -276,6 +276,7 @@ need_saturate( GLuint mode )        return GL_TRUE;     default:        assert(0); +      return GL_FALSE;     }  } diff --git a/src/mesa/shader/prog_execute.c b/src/mesa/shader/prog_execute.c index c8a762f8ff..69b81e724a 100644 --- a/src/mesa/shader/prog_execute.c +++ b/src/mesa/shader/prog_execute.c @@ -1555,17 +1555,12 @@ _mesa_execute_program(GLcontext * ctx,        case OPCODE_TXB:         /* GL_ARB_fragment_program only */           /* Texel lookup with LOD bias */           { -            const GLuint unit = machine->Samplers[inst->TexSrcUnit]; -            const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];              GLfloat texcoord[4], color[4], lodBias;              fetch_vector4(&inst->SrcReg[0], machine, texcoord);              /* texcoord[3] is the bias to add to lambda */ -            lodBias = texUnit->LodBias + texcoord[3]; -            if (texUnit->_Current) { -               lodBias += texUnit->_Current->LodBias; -            } +            lodBias = texcoord[3];              fetch_texel(ctx, machine, inst, texcoord, lodBias, color); diff --git a/src/mesa/shader/slang/slang_builtin.c b/src/mesa/shader/slang/slang_builtin.c index bef0f85653..e5809509c9 100644 --- a/src/mesa/shader/slang/slang_builtin.c +++ b/src/mesa/shader/slang/slang_builtin.c @@ -741,7 +741,7 @@ static const struct input_info vertInputs[] = {     { "gl_MultiTexCoord5", VERT_ATTRIB_TEX5, GL_FLOAT_VEC4, SWIZZLE_NOOP },     { "gl_MultiTexCoord6", VERT_ATTRIB_TEX6, GL_FLOAT_VEC4, SWIZZLE_NOOP },     { "gl_MultiTexCoord7", VERT_ATTRIB_TEX7, GL_FLOAT_VEC4, SWIZZLE_NOOP }, -   { NULL, 0, SWIZZLE_NOOP } +   { NULL, 0, GL_NONE, SWIZZLE_NOOP }  };  /** Predefined fragment shader inputs */ @@ -754,7 +754,7 @@ static const struct input_info fragInputs[] = {     { "gl_FogFragCoord", FRAG_ATTRIB_FOGC, GL_FLOAT, SWIZZLE_XXXX },     { "gl_FrontFacing", FRAG_ATTRIB_FACE, GL_FLOAT, SWIZZLE_XXXX },     { "gl_PointCoord", FRAG_ATTRIB_PNTC, GL_FLOAT_VEC2, SWIZZLE_XYZW }, -   { NULL, 0, SWIZZLE_NOOP } +   { NULL, 0, GL_NONE, SWIZZLE_NOOP }  }; diff --git a/src/mesa/shader/slang/slang_codegen.c b/src/mesa/shader/slang/slang_codegen.c index 349f432dec..703af9f874 100644 --- a/src/mesa/shader/slang/slang_codegen.c +++ b/src/mesa/shader/slang/slang_codegen.c @@ -2775,7 +2775,7 @@ _slang_gen_while(slang_assemble_ctx * A, slang_operation *oper)      *    body code (child[1])      */     slang_ir_node *loop, *breakIf, *body; -   GLboolean isConst, constTrue; +   GLboolean isConst, constTrue = GL_FALSE;     if (!A->EmitContReturn) {        /* We don't want to emit CONT instructions.  If this while-loop has diff --git a/src/mesa/state_tracker/st_draw.c b/src/mesa/state_tracker/st_draw.c index 503a5f34a3..c76bff9181 100644 --- a/src/mesa/state_tracker/st_draw.c +++ b/src/mesa/state_tracker/st_draw.c @@ -328,23 +328,29 @@ get_arrays_bounds(const struct st_vertex_program *vp,                         const GLubyte **low, const GLubyte **high)  {     const GLubyte *low_addr = NULL; +   const GLubyte *high_addr = NULL;     GLuint attr; -   GLint stride;     for (attr = 0; attr < vp->num_inputs; attr++) {        const GLuint mesaAttr = vp->index_to_input[attr]; +      const GLint stride = arrays[mesaAttr]->StrideB;        const GLubyte *start = arrays[mesaAttr]->Ptr; -      stride = arrays[mesaAttr]->StrideB; +      const unsigned sz = (arrays[mesaAttr]->Size *  +                           _mesa_sizeof_type(arrays[mesaAttr]->Type)); +      const GLubyte *end = start + (max_index * stride) + sz; +        if (attr == 0) {           low_addr = start; +         high_addr = end;        }        else {           low_addr = MIN2(low_addr, start); +         high_addr = MAX2(high_addr, end);        }     }     *low = low_addr; -   *high = low_addr + (max_index + 1) * stride; +   *high = high_addr;  } diff --git a/src/mesa/swrast/s_fragprog.c b/src/mesa/swrast/s_fragprog.c index 613a91b0ec..77a77f0bcb 100644 --- a/src/mesa/swrast/s_fragprog.c +++ b/src/mesa/swrast/s_fragprog.c @@ -89,6 +89,8 @@ fetch_texel_lod( GLcontext *ctx, const GLfloat texcoord[4], GLfloat lambda,   * Fetch a texel with the given partial derivatives to compute a level   * of detail in the mipmap.   * Called via machine->FetchTexelDeriv() + * \param lodBias  the lod bias which may be specified by a TXB instruction, + *                 otherwise zero.   */  static void  fetch_texel_deriv( GLcontext *ctx, const GLfloat texcoord[4], @@ -96,7 +98,8 @@ fetch_texel_deriv( GLcontext *ctx, const GLfloat texcoord[4],                     GLfloat lodBias, GLuint unit, GLfloat color[4] )  {     SWcontext *swrast = SWRAST_CONTEXT(ctx); -   const struct gl_texture_object *texObj = ctx->Texture.Unit[unit]._Current; +   const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit]; +   const struct gl_texture_object *texObj = texUnit->_Current;     if (texObj) {        const struct gl_texture_image *texImg = @@ -108,10 +111,12 @@ fetch_texel_deriv( GLcontext *ctx, const GLfloat texcoord[4],        lambda = _swrast_compute_lambda(texdx[0], texdy[0], /* ds/dx, ds/dy */                                        texdx[1], texdy[1], /* dt/dx, dt/dy */ -                                      texdx[3], texdy[2], /* dq/dx, dq/dy */ +                                      texdx[3], texdy[3], /* dq/dx, dq/dy */                                        texW, texH,                                        texcoord[0], texcoord[1], texcoord[3], -                                      1.0F / texcoord[3]) + lodBias; +                                      1.0F / texcoord[3]); + +      lambda += lodBias + texUnit->LodBias + texObj->LodBias;        lambda = CLAMP(lambda, texObj->MinLod, texObj->MaxLod); | 
