diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/glu/sgi/glu.exports | 59 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/common/dri_util.c | 20 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/i965/brw_eu.h | 1 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/i965/brw_eu_emit.c | 1 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/i965/brw_vs_emit.c | 4 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/i965/brw_wm_glsl.c | 2 | ||||
| -rw-r--r-- | src/mesa/main/image.c | 2 | ||||
| -rw-r--r-- | src/mesa/main/image.h | 3 | ||||
| -rw-r--r-- | src/mesa/main/mipmap.c | 6 | ||||
| -rw-r--r-- | src/mesa/main/texformat.c | 2 | ||||
| -rw-r--r-- | src/mesa/main/texrender.c | 52 | ||||
| -rw-r--r-- | src/mesa/shader/slang/slang_codegen.c | 20 | ||||
| -rw-r--r-- | src/mesa/shader/slang/slang_emit.c | 10 | 
13 files changed, 167 insertions, 15 deletions
| diff --git a/src/glu/sgi/glu.exports b/src/glu/sgi/glu.exports index 1d1b6da24f..aeb7272916 100644 --- a/src/glu/sgi/glu.exports +++ b/src/glu/sgi/glu.exports @@ -57,3 +57,62 @@  	gluTessVertex  	gluUnProject  	gluUnProject4 +	mgluBeginCurve +	mgluBeginPolygon +	mgluBeginSurface +	mgluBeginTrim +	mgluBuild1DMipmapLevels +	mgluBuild1DMipmaps +	mgluBuild2DMipmapLevels +	mgluBuild2DMipmaps +	mgluBuild3DMipmapLevels +	mgluBuild3DMipmaps +	mgluCheckExtension +	mgluCylinder +	mgluDeleteNurbsRenderer +	mgluDeleteQuadric +	mgluDeleteTess +	mgluDisk +	mgluEndCurve +	mgluEndPolygon +	mgluEndSurface +	mgluEndTrim +	mgluErrorString +	mgluGetNurbsProperty +	mgluGetString +	mgluGetTessProperty +	mgluLoadSamplingMatrices +	mgluLookAt +	mgluNewNurbsRenderer +	mgluNewQuadric +	mgluNewTess +	mgluNextContour +	mgluNurbsCallback +	mgluNurbsCallbackData +	mgluNurbsCallbackDataEXT +	mgluNurbsCurve +	mgluNurbsProperty +	mgluNurbsSurface +	mgluOrtho2D +	mgluPartialDisk +	mgluPerspective +	mgluPickMatrix +	mgluProject +	mgluPwlCurve +	mgluQuadricCallback +	mgluQuadricDrawStyle +	mgluQuadricNormals +	mgluQuadricOrientation +	mgluQuadricTexture +	mgluScaleImage +	mgluSphere +	mgluTessBeginContour +	mgluTessBeginPolygon +	mgluTessCallback +	mgluTessEndContour +	mgluTessEndPolygon +	mgluTessNormal +	mgluTessProperty +	mgluTessVertex +	mgluUnProject +	mgluUnProject4 diff --git a/src/mesa/drivers/dri/common/dri_util.c b/src/mesa/drivers/dri/common/dri_util.c index a2316e2662..ae79055405 100644 --- a/src/mesa/drivers/dri/common/dri_util.c +++ b/src/mesa/drivers/dri/common/dri_util.c @@ -314,10 +314,28 @@ static void driReportDamage(__DRIdrawable *pdp,  static void driSwapBuffers(__DRIdrawable *dPriv)  {      __DRIscreen *psp = dPriv->driScreenPriv; +    drm_clip_rect_t *rects; +    int i; +     +    if (!dPriv->numClipRects) +        return;      psp->DriverAPI.SwapBuffers(dPriv); -    driReportDamage(dPriv, dPriv->pClipRects, dPriv->numClipRects); +    rects = _mesa_malloc(sizeof(*rects) * dPriv->numClipRects); + +    if (!rects) +        return; + +    for (i = 0; i < dPriv->numClipRects; i++) { +        rects[i].x1 = dPriv->pClipRects[i].x1 - dPriv->x; +        rects[i].y1 = dPriv->pClipRects[i].y1 - dPriv->y; +        rects[i].x2 = dPriv->pClipRects[i].x2 - dPriv->x; +        rects[i].y2 = dPriv->pClipRects[i].y2 - dPriv->y; +    } + +    driReportDamage(dPriv, rects, dPriv->numClipRects); +    _mesa_free(rects);  }  static int driDrawableGetMSC( __DRIscreen *sPriv, __DRIdrawable *dPriv, diff --git a/src/mesa/drivers/dri/i965/brw_eu.h b/src/mesa/drivers/dri/i965/brw_eu.h index 31e9ceb42e..9e2b39af9b 100644 --- a/src/mesa/drivers/dri/i965/brw_eu.h +++ b/src/mesa/drivers/dri/i965/brw_eu.h @@ -753,6 +753,7 @@ ALU2(ADD)  ALU2(MUL)  ALU1(FRC)  ALU1(RNDD) +ALU1(RNDZ)  ALU2(MAC)  ALU2(MACH)  ALU1(LZD) diff --git a/src/mesa/drivers/dri/i965/brw_eu_emit.c b/src/mesa/drivers/dri/i965/brw_eu_emit.c index ce4cf46cfa..4e099b5945 100644 --- a/src/mesa/drivers/dri/i965/brw_eu_emit.c +++ b/src/mesa/drivers/dri/i965/brw_eu_emit.c @@ -439,6 +439,7 @@ ALU2(ADD)  ALU2(MUL)  ALU1(FRC)  ALU1(RNDD) +ALU1(RNDZ)  ALU2(MAC)  ALU2(MACH)  ALU1(LZD) diff --git a/src/mesa/drivers/dri/i965/brw_vs_emit.c b/src/mesa/drivers/dri/i965/brw_vs_emit.c index 80ff7437ba..71e2a95bfd 100644 --- a/src/mesa/drivers/dri/i965/brw_vs_emit.c +++ b/src/mesa/drivers/dri/i965/brw_vs_emit.c @@ -1133,6 +1133,10 @@ void brw_vs_emit(struct brw_vs_compile *c )  	  */  	 emit_swz(c, dst, inst->SrcReg[0] );  	 break; +      case OPCODE_TRUNC: +         /* round toward zero */ +	 brw_RNDZ(p, dst, args[0]); +	 break;        case OPCODE_XPD:  	 emit_xpd(p, dst, args[0], args[1]);  	 break; diff --git a/src/mesa/drivers/dri/i965/brw_wm_glsl.c b/src/mesa/drivers/dri/i965/brw_wm_glsl.c index baecfdcb79..d43e326f7d 100644 --- a/src/mesa/drivers/dri/i965/brw_wm_glsl.c +++ b/src/mesa/drivers/dri/i965/brw_wm_glsl.c @@ -267,7 +267,7 @@ static void emit_trunc( struct brw_wm_compile *c,  	    struct brw_reg src, dst;  	    dst = get_dst_reg(c, inst, i, 1) ;  	    src = get_src_reg(c, &inst->SrcReg[0], i, 1); -	    brw_RNDD(p, dst, src); +	    brw_RNDZ(p, dst, src);  	}      }      brw_set_saturate(p, 0); diff --git a/src/mesa/main/image.c b/src/mesa/main/image.c index c205b4b766..4d86c54777 100644 --- a/src/mesa/main/image.c +++ b/src/mesa/main/image.c @@ -61,7 +61,7 @@  /**   * \return GL_TRUE if type is packed pixel type, GL_FALSE otherwise.   */ -static GLboolean +GLboolean  _mesa_type_is_packed(GLenum type)  {     switch (type) { diff --git a/src/mesa/main/image.h b/src/mesa/main/image.h index 38e1374c20..0e0bbd96d8 100644 --- a/src/mesa/main/image.h +++ b/src/mesa/main/image.h @@ -36,6 +36,9 @@ _mesa_swap2( GLushort *p, GLuint n );  extern void  _mesa_swap4( GLuint *p, GLuint n ); +extern GLboolean +_mesa_type_is_packed(GLenum type); +  extern GLint  _mesa_sizeof_type( GLenum type ); diff --git a/src/mesa/main/mipmap.c b/src/mesa/main/mipmap.c index 9e051ace25..3dd4b3391b 100644 --- a/src/mesa/main/mipmap.c +++ b/src/mesa/main/mipmap.c @@ -41,7 +41,11 @@ bytes_per_pixel(GLenum datatype, GLuint comps)  {     GLint b = _mesa_sizeof_packed_type(datatype);     assert(b >= 0); -   return b * comps; + +   if (_mesa_type_is_packed(datatype)) +       return b; +   else +       return b * comps;  } diff --git a/src/mesa/main/texformat.c b/src/mesa/main/texformat.c index db3525666a..50e8d7a3b8 100644 --- a/src/mesa/main/texformat.c +++ b/src/mesa/main/texformat.c @@ -1685,7 +1685,7 @@ _mesa_format_to_type_and_comps(const struct gl_texture_format *format,     case MESA_FORMAT_ARGB1555:     case MESA_FORMAT_ARGB1555_REV:        *datatype = GL_UNSIGNED_SHORT_1_5_5_5_REV; -      *comps = 3; +      *comps = 4;        return;     case MESA_FORMAT_AL88: diff --git a/src/mesa/main/texrender.c b/src/mesa/main/texrender.c index 163bda4501..4ae13a7b9b 100644 --- a/src/mesa/main/texrender.c +++ b/src/mesa/main/texrender.c @@ -49,6 +49,14 @@ texture_get_row(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,           trb->TexImage->FetchTexelc(trb->TexImage, x + i, y, z, rgbaOut + 4 * i);        }     } +   else if (rb->DataType == GL_UNSIGNED_SHORT) { +      GLushort *zValues = (GLushort *) values; +      for (i = 0; i < count; i++) { +         GLfloat flt; +         trb->TexImage->FetchTexelf(trb->TexImage, x + i, y, z, &flt); +         zValues[i] = (GLushort) (flt * 0xffff); +      } +   }     else if (rb->DataType == GL_UNSIGNED_INT) {        GLuint *zValues = (GLuint *) values;        /* @@ -96,6 +104,15 @@ texture_get_values(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,  				    z, rgbaOut + 4 * i);        }     } +   else if (rb->DataType == GL_UNSIGNED_SHORT) { +      GLushort *zValues = (GLushort *) values; +      for (i = 0; i < count; i++) { +         GLfloat flt; +         trb->TexImage->FetchTexelf(trb->TexImage, x[i], y[i] + trb->Yoffset, +				    z, &flt); +         zValues[i] = (GLushort) (flt * 0xffff); +      } +   }     else if (rb->DataType == GL_UNSIGNED_INT) {        GLuint *zValues = (GLuint *) values;        for (i = 0; i < count; i++) { @@ -147,6 +164,14 @@ texture_put_row(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,           rgba += 4;        }     } +   else if (rb->DataType == GL_UNSIGNED_SHORT) { +      const GLushort *zValues = (const GLushort *) values; +      for (i = 0; i < count; i++) { +         if (!mask || mask[i]) { +            trb->Store(trb->TexImage, x + i, y, z, zValues + i); +         } +      } +   }     else if (rb->DataType == GL_UNSIGNED_INT) {        const GLuint *zValues = (const GLuint *) values;        for (i = 0; i < count; i++) { @@ -189,6 +214,14 @@ texture_put_mono_row(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,           }        }     } +   else if (rb->DataType == GL_UNSIGNED_SHORT) { +      const GLushort zValue = *((const GLushort *) value); +      for (i = 0; i < count; i++) { +         if (!mask || mask[i]) { +            trb->Store(trb->TexImage, x + i, y, z, &zValue); +         } +      } +   }     else if (rb->DataType == GL_UNSIGNED_INT) {        const GLuint zValue = *((const GLuint *) value);        for (i = 0; i < count; i++) { @@ -231,12 +264,19 @@ texture_put_values(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,           rgba += 4;        }     } +   else if (rb->DataType == GL_UNSIGNED_SHORT) { +      const GLushort *zValues = (const GLushort *) values; +      for (i = 0; i < count; i++) { +         if (!mask || mask[i]) { +            trb->Store(trb->TexImage, x[i], y[i] + trb->Yoffset, z, zValues + i); +         } +      } +   }     else if (rb->DataType == GL_UNSIGNED_INT) {        const GLuint *zValues = (const GLuint *) values;        for (i = 0; i < count; i++) {           if (!mask || mask[i]) { -            trb->Store(trb->TexImage, x[i], y[i] + trb->Yoffset, z, -		       zValues + i); +            trb->Store(trb->TexImage, x[i], y[i] + trb->Yoffset, z, zValues + i);           }        }     } @@ -281,6 +321,14 @@ texture_put_mono_values(GLcontext *ctx, struct gl_renderbuffer *rb,           }        }     } +   else if (rb->DataType == GL_UNSIGNED_SHORT) { +      const GLushort zValue = *((const GLushort *) value); +      for (i = 0; i < count; i++) { +         if (!mask || mask[i]) { +            trb->Store(trb->TexImage, x[i], y[i] + trb->Yoffset, z, &zValue); +         } +      } +   }     else if (rb->DataType == GL_UNSIGNED_INT_24_8_EXT) {        const GLuint zValue = *((const GLuint *) value);        const GLfloat flt = (GLfloat) ((zValue >> 8) * (1.0 / 0xffffff)); diff --git a/src/mesa/shader/slang/slang_codegen.c b/src/mesa/shader/slang/slang_codegen.c index 4976daf533..8e28be8abd 100644 --- a/src/mesa/shader/slang/slang_codegen.c +++ b/src/mesa/shader/slang/slang_codegen.c @@ -3323,6 +3323,22 @@ is_store_writable(const slang_assemble_ctx *A, const slang_ir_storage *store)  /** + * Walk up an IR storage path to compute the final swizzle. + * This is used when we find an expression such as "foo.xz.yx". + */ +static GLuint +root_swizzle(const slang_ir_storage *st) +{ +   GLuint swizzle = st->Swizzle; +   while (st->Parent) { +      st = st->Parent; +      swizzle = _slang_swizzle_swizzle(st->Swizzle, swizzle); +   } +   return swizzle; +} + + +/**   * Generate IR tree for an assignment (=).   */  static slang_ir_node * @@ -3397,9 +3413,9 @@ _slang_gen_assignment(slang_assemble_ctx * A, slang_operation *oper)        rhs = _slang_gen_operation(A, &oper->children[1]);        if (lhs && rhs) {           /* convert lhs swizzle into writemask */ +         const GLuint swizzle = root_swizzle(lhs->Store);           GLuint writemask, newSwizzle; -         if (!swizzle_to_writemask(A, lhs->Store->Swizzle, -                                   &writemask, &newSwizzle)) { +         if (!swizzle_to_writemask(A, swizzle, &writemask, &newSwizzle)) {              /* Non-simple writemask, need to swizzle right hand side in               * order to put components into the right place.               */ diff --git a/src/mesa/shader/slang/slang_emit.c b/src/mesa/shader/slang/slang_emit.c index b7a3cfb617..1c0a7bbbd6 100644 --- a/src/mesa/shader/slang/slang_emit.c +++ b/src/mesa/shader/slang/slang_emit.c @@ -310,24 +310,22 @@ storage_to_dst_reg(struct prog_dst_register *dst, const slang_ir_storage *st)        dst->WriteMask = swizzle_to_writemask(swizzle);     }     else { -      GLuint writemask;        switch (size) {        case 1: -         writemask = WRITEMASK_X << GET_SWZ(st->Swizzle, 0); +         dst->WriteMask = WRITEMASK_X << GET_SWZ(st->Swizzle, 0);           break;        case 2: -         writemask = WRITEMASK_XY; +         dst->WriteMask = WRITEMASK_XY;           break;        case 3: -         writemask = WRITEMASK_XYZ; +         dst->WriteMask = WRITEMASK_XYZ;           break;        case 4: -         writemask = WRITEMASK_XYZW; +         dst->WriteMask = WRITEMASK_XYZW;           break;        default:           ; /* error would have been caught above */        } -      dst->WriteMask = writemask;     }     dst->RelAddr = relAddr; | 
