diff --git a/src/mesa/drivers/dri/i915/intel_context.c b/src/mesa/drivers/dri/i915/intel_context.c index bb5ce64..9bca64a 100644 --- a/src/mesa/drivers/dri/i915/intel_context.c +++ b/src/mesa/drivers/dri/i915/intel_context.c @@ -117,6 +117,8 @@ const GLubyte *intelGetString( GLcontext *ctx, GLenum name ) chipset = "Intel(R) 865G"; break; case PCI_CHIP_I915_G: chipset = "Intel(R) 915G"; break; + case PCI_CHIP_E7221_G: + chipset = "Intel (R) E7221G (i915)"; break; case PCI_CHIP_I915_GM: chipset = "Intel(R) 915GM"; break; case PCI_CHIP_I945_G: diff --git a/src/mesa/drivers/dri/i915/intel_context.h b/src/mesa/drivers/dri/i915/intel_context.h index 50e6178..3dfc502 100644 --- a/src/mesa/drivers/dri/i915/intel_context.h +++ b/src/mesa/drivers/dri/i915/intel_context.h @@ -451,6 +451,7 @@ extern int INTEL_DEBUG; #define PCI_CHIP_I855_GM 0x3582 #define PCI_CHIP_I865_G 0x2572 #define PCI_CHIP_I915_G 0x2582 +#define PCI_CHIP_E7221_G 0x258A #define PCI_CHIP_I915_GM 0x2592 #define PCI_CHIP_I945_G 0x2772 #define PCI_CHIP_I945_GM 0x27A2 diff --git a/src/mesa/drivers/dri/i915/intel_screen.c b/src/mesa/drivers/dri/i915/intel_screen.c index 1cc7418..a66cfd6 100644 --- a/src/mesa/drivers/dri/i915/intel_screen.c +++ b/src/mesa/drivers/dri/i915/intel_screen.c @@ -511,6 +511,7 @@ static GLboolean intelCreateContext( const __GLcontextModes *mesaVis, sharedContextPrivate ); case PCI_CHIP_I915_G: + case PCI_CHIP_E7221_G: case PCI_CHIP_I915_GM: case PCI_CHIP_I945_G: case PCI_CHIP_I945_GM: diff --git a/src/mesa/drivers/dri/i915/intel_state.c b/src/mesa/drivers/dri/i915/intel_state.c index e5988a5..b333ec5 100644 --- a/src/mesa/drivers/dri/i915/intel_state.c +++ b/src/mesa/drivers/dri/i915/intel_state.c @@ -189,12 +189,12 @@ static void intelDrawBuffer(GLcontext *ctx, GLenum mode ) if ( intel->sarea->pf_current_page == 1 ) front ^= 1; - intelSetFrontClipRects( intel ); - if (front) { + intelSetFrontClipRects( intel ); intel->drawRegion = &intel->intelScreen->front; intel->readRegion = &intel->intelScreen->front; } else { + intelSetBackClipRects( intel ); intel->drawRegion = &intel->intelScreen->back; intel->readRegion = &intel->intelScreen->back; } diff --git a/src/mesa/drivers/dri/i965/intel_buffers.c b/src/mesa/drivers/dri/i965/intel_buffers.c index de6a867..769f75c 100644 --- a/src/mesa/drivers/dri/i965/intel_buffers.c +++ b/src/mesa/drivers/dri/i965/intel_buffers.c @@ -545,15 +545,14 @@ static void intelDrawBuffer(GLcontext *ctx, GLenum mode ) if ( intel->sarea->pf_current_page == 1 ) front ^= 1; - intelSetFrontClipRects( intel ); - - if (front) { + intelSetFrontClipRects(intel); if (intel->draw_region != intel->front_region) { intel_region_release(intel, &intel->draw_region); intel_region_reference(&intel->draw_region, intel->front_region); } } else { + intelSetBackClipRects(intel); if (intel->draw_region != intel->back_region) { intel_region_release(intel, &intel->draw_region); intel_region_reference(&intel->draw_region, intel->back_region); diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c index e79a905..a240baf 100644 --- a/src/mesa/main/context.c +++ b/src/mesa/main/context.c @@ -610,6 +610,21 @@ delete_arrayobj_cb(GLuint id, void *data, void *userData) } /** + * Callback for freeing shader program data. Call it before delete_shader_cb + * to avoid memory access error. + */ +static void +free_shader_program_data_cb(GLuint id, void *data, void *userData) +{ + GLcontext *ctx = (GLcontext *) userData; + struct gl_shader_program *shProg = (struct gl_shader_program *) data; + + if (shProg->Type == GL_SHADER_PROGRAM_MESA) { + _mesa_free_shader_program_data(ctx, shProg); + } +} + +/** * Callback for deleting shader and shader programs objects. * Called by _mesa_HashDeleteAll(). */ @@ -708,6 +723,7 @@ free_shared_state( GLcontext *ctx, struct gl_shared_state *ss ) _mesa_DeleteHashTable(ss->ArrayObjects); #if FEATURE_ARB_shader_objects + _mesa_HashWalk(ss->ShaderObjects, free_shader_program_data_cb, ctx); _mesa_HashDeleteAll(ss->ShaderObjects, delete_shader_cb, ctx); _mesa_DeleteHashTable(ss->ShaderObjects); #endif diff --git a/src/mesa/swrast/s_aatriangle.c b/src/mesa/swrast/s_aatriangle.c index 0d95f06..587c868 100644 --- a/src/mesa/swrast/s_aatriangle.c +++ b/src/mesa/swrast/s_aatriangle.c @@ -368,11 +368,14 @@ index_aa_tri(GLcontext *ctx, * Compute mipmap level of detail. * XXX we should really include the R coordinate in this computation * in order to do 3-D texture mipmapping. + * \param cx, cy fragment center position + * \param unit texture unit */ static INLINE GLfloat -compute_lambda(const GLfloat sPlane[4], const GLfloat tPlane[4], +compute_lambda(GLcontext *ctx, + const GLfloat sPlane[4], const GLfloat tPlane[4], const GLfloat qPlane[4], GLfloat cx, GLfloat cy, - GLfloat invQ, GLfloat texWidth, GLfloat texHeight) + GLfloat invQ, GLuint unit) { const GLfloat s = solve_plane(cx, cy, sPlane); const GLfloat t = solve_plane(cx, cy, tPlane); @@ -387,6 +390,15 @@ compute_lambda(const GLfloat sPlane[4], const GLfloat tPlane[4], GLfloat dtdx = t_x1 * invQ_x1 - t * invQ; GLfloat dtdy = t_y1 * invQ_y1 - t * invQ; GLfloat maxU, maxV, rho, lambda; + GLfloat texWidth = 1.0, texHeight = 1.0; + const struct gl_texture_object *obj = ctx->Texture.Unit[unit]._Current; + if (obj) { + const struct gl_texture_image *texImage = obj->Image[0][obj->BaseLevel]; + if (texImage){ + texWidth = (GLfloat) texImage->Width; + texHeight = (GLfloat) texImage->Height; + } + } dsdx = FABSF(dsdx); dsdy = FABSF(dsdy); dtdx = FABSF(dtdx); diff --git a/src/mesa/swrast/s_aatritemp.h b/src/mesa/swrast/s_aatritemp.h index b26f21f..f323701 100644 --- a/src/mesa/swrast/s_aatritemp.h +++ b/src/mesa/swrast/s_aatritemp.h @@ -75,8 +75,6 @@ GLfloat tPlane[FRAG_ATTRIB_MAX][4]; /* texture T */ GLfloat uPlane[FRAG_ATTRIB_MAX][4]; /* texture R */ GLfloat vPlane[FRAG_ATTRIB_MAX][4]; /* texture Q */ - GLfloat texWidth[FRAG_ATTRIB_MAX]; - GLfloat texHeight[FRAG_ATTRIB_MAX]; #endif GLfloat bf = SWRAST_CONTEXT(ctx)->_BackfaceCullSign; @@ -206,16 +204,6 @@ compute_plane(p0, p1, p2, t0, t1, t2, tPlane[attr]); compute_plane(p0, p1, p2, r0, r1, r2, uPlane[attr]); compute_plane(p0, p1, p2, q0, q1, q2, vPlane[attr]); - if (attr < FRAG_ATTRIB_VAR0 && attr >= FRAG_ATTRIB_TEX0) { - const GLuint u = attr - FRAG_ATTRIB_TEX0; - const struct gl_texture_object *obj = ctx->Texture.Unit[u]._Current; - const struct gl_texture_image *texImage = obj->Image[0][obj->BaseLevel]; - texWidth[attr] = (GLfloat) texImage->Width; - texHeight[attr] = (GLfloat) texImage->Height; - } - else { - texWidth[attr] = texHeight[attr] = 1.0; - } ATTRIB_LOOP_END } span.arrayMask |= (SPAN_TEXTURE | SPAN_LAMBDA | SPAN_VARYING); @@ -292,11 +280,14 @@ array->attribs[attr][count][0] = solve_plane(cx, cy, sPlane[attr]) * invQ; array->attribs[attr][count][1] = solve_plane(cx, cy, tPlane[attr]) * invQ; array->attribs[attr][count][2] = solve_plane(cx, cy, uPlane[attr]) * invQ; - if (attr < FRAG_ATTRIB_VAR0 && attr >= FRAG_ATTRIB_TEX0) { + if (attr >= FRAG_ATTRIB_TEX0 && attr < FRAG_ATTRIB_VAR0) { const GLuint unit = attr - FRAG_ATTRIB_TEX0; - array->lambda[unit][count] = compute_lambda(sPlane[attr], tPlane[attr], - vPlane[attr], cx, cy, invQ, - texWidth[attr], texHeight[attr]); + array->lambda[unit][count] = compute_lambda(ctx, + sPlane[attr], + tPlane[attr], + vPlane[attr], + cx, cy, invQ, + unit); } ATTRIB_LOOP_END #endif @@ -385,14 +376,14 @@ array->attribs[attr][ix][0] = solve_plane(cx, cy, sPlane[attr]) * invQ; array->attribs[attr][ix][1] = solve_plane(cx, cy, tPlane[attr]) * invQ; array->attribs[attr][ix][2] = solve_plane(cx, cy, uPlane[attr]) * invQ; - if (attr < FRAG_ATTRIB_VAR0 && attr >= FRAG_ATTRIB_TEX0) { + if (attr >= FRAG_ATTRIB_TEX0 && attr < FRAG_ATTRIB_VAR0) { const GLuint unit = attr - FRAG_ATTRIB_TEX0; - array->lambda[unit][ix] = compute_lambda(sPlane[attr], + array->lambda[unit][ix] = compute_lambda(ctx, + sPlane[attr], tPlane[attr], vPlane[attr], cx, cy, invQ, - texWidth[attr], - texHeight[attr]); + unit); } ATTRIB_LOOP_END #endif diff --git a/src/mesa/vbo/vbo_exec_draw.c b/src/mesa/vbo/vbo_exec_draw.c index d8f167b..893a5e8 100644 --- a/src/mesa/vbo/vbo_exec_draw.c +++ b/src/mesa/vbo/vbo_exec_draw.c @@ -187,7 +187,7 @@ static void vbo_exec_bind_arrays( GLcontext *ctx ) arrays[attr].BufferObj = exec->vtx.bufferobj; /* NullBufferObj */ arrays[attr]._MaxElement = count; /* ??? */ - data += exec->vtx.attrsz[attr] * sizeof(GLfloat); + data += exec->vtx.attrsz[src] * sizeof(GLfloat); } } } diff --git a/src/mesa/vbo/vbo_save_draw.c b/src/mesa/vbo/vbo_save_draw.c index 697d00e..95af854 100644 --- a/src/mesa/vbo/vbo_save_draw.c +++ b/src/mesa/vbo/vbo_save_draw.c @@ -131,7 +131,7 @@ static void vbo_bind_vertex_list( GLcontext *ctx, break; } - for (attr = 0; attr < VBO_ATTRIB_MAX; attr++) { + for (attr = 0; attr < VERT_ATTRIB_MAX; attr++) { GLuint src = map[attr]; if (node->attrsz[src]) { @@ -146,7 +146,7 @@ static void vbo_bind_vertex_list( GLcontext *ctx, assert(arrays[attr].BufferObj->Name); - data += node->attrsz[attr] * sizeof(GLfloat); + data += node->attrsz[src] * sizeof(GLfloat); } } }