diff options
| author | Michal Krol <michal@vmware.com> | 2009-09-17 12:44:24 +0200 | 
|---|---|---|
| committer | Michal Krol <michal@vmware.com> | 2009-09-17 12:44:24 +0200 | 
| commit | 2a661c383fee65bc4413541e706925fa3e9b9cf5 (patch) | |
| tree | dbea0c9d65d17b81720fe2f161604dfc91eb0546 /src/mesa | |
| parent | 90daefd1c474a6e0502df5053b581987c12b8673 (diff) | |
| parent | 21caa29fbd332a2ee05a58df91e1664fbbc4e61f (diff) | |
Merge commit 'origin/master' into glsl-pp-rework-2
Conflicts:
	src/gallium/winsys/gdi/SConscript
Diffstat (limited to 'src/mesa')
44 files changed, 2619 insertions, 1902 deletions
| diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c index 05909cfa30..aa7c73ba36 100644 --- a/src/mesa/drivers/common/meta.c +++ b/src/mesa/drivers/common/meta.c @@ -68,6 +68,29 @@  /** + * Flags passed to _mesa_meta_begin(). + */ +/*@{*/ +#define META_ALL              ~0x0 +#define META_ALPHA_TEST        0x1 +#define META_BLEND             0x2  /**< includes logicop */ +#define META_COLOR_MASK        0x4 +#define META_DEPTH_TEST        0x8 +#define META_FOG              0x10 +#define META_PIXEL_STORE      0x20 +#define META_PIXEL_TRANSFER   0x40 +#define META_RASTERIZATION    0x80 +#define META_SCISSOR         0x100 +#define META_SHADER          0x200 +#define META_STENCIL_TEST    0x400 +#define META_TRANSFORM       0x800 /**< modelview, projection, clip planes */ +#define META_TEXTURE        0x1000 +#define META_VERTEX         0x2000 +#define META_VIEWPORT       0x4000 +/*@}*/ + + +/**   * State which we may save/restore across meta ops.   * XXX this may be incomplete...   */ @@ -94,6 +117,17 @@ struct save_state     /** META_PIXEL_STORE */     struct gl_pixelstore_attrib Pack, Unpack; +   /** META_PIXEL_TRANSFER */ +   GLfloat RedBias, RedScale; +   GLfloat GreenBias, GreenScale; +   GLfloat BlueBias, BlueScale; +   GLfloat AlphaBias, AlphaScale; +   GLfloat DepthBias, DepthScale; +   GLboolean MapColorFlag; +   GLboolean Convolution1DEnabled; +   GLboolean Convolution2DEnabled; +   GLboolean Separable2DEnabled; +     /** META_RASTERIZATION */     GLenum FrontPolygonMode, BackPolygonMode;     GLboolean PolygonOffset; @@ -363,6 +397,35 @@ _mesa_meta_begin(GLcontext *ctx, GLbitfield state)        ctx->Unpack = ctx->DefaultPacking;     } +   if (state & META_PIXEL_TRANSFER) { +      save->RedScale = ctx->Pixel.RedScale; +      save->RedBias = ctx->Pixel.RedBias; +      save->GreenScale = ctx->Pixel.GreenScale; +      save->GreenBias = ctx->Pixel.GreenBias; +      save->BlueScale = ctx->Pixel.BlueScale; +      save->BlueBias = ctx->Pixel.BlueBias; +      save->AlphaScale = ctx->Pixel.AlphaScale; +      save->AlphaBias = ctx->Pixel.AlphaBias; +      save->MapColorFlag = ctx->Pixel.MapColorFlag; +      save->Convolution1DEnabled = ctx->Pixel.Convolution1DEnabled; +      save->Convolution2DEnabled = ctx->Pixel.Convolution2DEnabled; +      save->Separable2DEnabled = ctx->Pixel.Separable2DEnabled; +      ctx->Pixel.RedScale = 1.0F; +      ctx->Pixel.RedBias = 0.0F; +      ctx->Pixel.GreenScale = 1.0F; +      ctx->Pixel.GreenBias = 0.0F; +      ctx->Pixel.BlueScale = 1.0F; +      ctx->Pixel.BlueBias = 0.0F; +      ctx->Pixel.AlphaScale = 1.0F; +      ctx->Pixel.AlphaBias = 0.0F; +      ctx->Pixel.MapColorFlag = GL_FALSE; +      ctx->Pixel.Convolution1DEnabled = GL_FALSE; +      ctx->Pixel.Convolution2DEnabled = GL_FALSE; +      ctx->Pixel.Separable2DEnabled = GL_FALSE; +      /* XXX more state */ +      ctx->NewState |=_NEW_PIXEL; +   } +     if (state & META_RASTERIZATION) {        save->FrontPolygonMode = ctx->Polygon.FrontMode;        save->BackPolygonMode = ctx->Polygon.BackMode; @@ -415,11 +478,6 @@ _mesa_meta_begin(GLcontext *ctx, GLbitfield state)        save->ClientActiveUnit = ctx->Array.ActiveTexture;        save->EnvMode = ctx->Texture.Unit[0].EnvMode; -      if (ctx->Texture._EnabledUnits | -          ctx->Texture._EnabledCoordUnits | -          ctx->Texture._TexGenEnabled | -          ctx->Texture._TexMatEnabled) { -        /* Disable all texture units */        for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {           save->TexEnabled[u] = ctx->Texture.Unit[u].Enabled; @@ -438,7 +496,6 @@ _mesa_meta_begin(GLcontext *ctx, GLbitfield state)              _mesa_set_enable(ctx, GL_TEXTURE_GEN_Q, GL_FALSE);           }        } -      }        /* save current texture objects for unit[0] only */        for (tgt = 0; tgt < NUM_TEXTURE_TARGETS; tgt++) { @@ -564,6 +621,23 @@ _mesa_meta_end(GLcontext *ctx)        ctx->Unpack = save->Unpack;     } +   if (state & META_PIXEL_TRANSFER) { +      ctx->Pixel.RedScale = save->RedScale; +      ctx->Pixel.RedBias = save->RedBias; +      ctx->Pixel.GreenScale = save->GreenScale; +      ctx->Pixel.GreenBias = save->GreenBias; +      ctx->Pixel.BlueScale = save->BlueScale; +      ctx->Pixel.BlueBias = save->BlueBias; +      ctx->Pixel.AlphaScale = save->AlphaScale; +      ctx->Pixel.AlphaBias = save->AlphaBias; +      ctx->Pixel.MapColorFlag = save->MapColorFlag; +      ctx->Pixel.Convolution1DEnabled = save->Convolution1DEnabled; +      ctx->Pixel.Convolution2DEnabled = save->Convolution2DEnabled; +      ctx->Pixel.Separable2DEnabled = save->Separable2DEnabled; +      /* XXX more state */ +      ctx->NewState |=_NEW_PIXEL; +   } +     if (state & META_RASTERIZATION) {        _mesa_PolygonMode(GL_FRONT, save->FrontPolygonMode);        _mesa_PolygonMode(GL_BACK, save->BackPolygonMode); @@ -2037,3 +2111,231 @@ _mesa_meta_generate_mipmap(GLcontext *ctx, GLenum target,     /* restore (XXX add to meta_begin/end()? */     _mesa_BindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboSave);  } + + +/** + * Determine the GL data type to use for the temporary image read with + * ReadPixels() and passed to Tex[Sub]Image(). + */ +static GLenum +get_temp_image_type(GLcontext *ctx, GLenum baseFormat) +{ +   switch (baseFormat) { +   case GL_RGBA: +   case GL_RGB: +   case GL_ALPHA: +   case GL_LUMINANCE: +   case GL_LUMINANCE_ALPHA: +   case GL_INTENSITY: +      if (ctx->DrawBuffer->Visual.redBits <= 8) +         return GL_UNSIGNED_BYTE; +      else if (ctx->DrawBuffer->Visual.redBits <= 8) +         return GL_UNSIGNED_SHORT; +      else +         return GL_FLOAT; +   case GL_DEPTH_COMPONENT: +      return GL_UNSIGNED_INT; +   case GL_DEPTH_STENCIL: +      return GL_UNSIGNED_INT_24_8; +   default: +      _mesa_problem(ctx, "Unexpected format in get_temp_image_type()"); +      return 0; +   } +} + + +/** + * Helper for _mesa_meta_CopyTexImage1/2D() functions. + * Have to be careful with locking and meta state for pixel transfer. + */ +static void +copy_tex_image(GLcontext *ctx, GLuint dims, GLenum target, GLint level, +               GLenum internalFormat, GLint x, GLint y, +               GLsizei width, GLsizei height, GLint border) +{ +   struct gl_texture_unit *texUnit; +   struct gl_texture_object *texObj; +   struct gl_texture_image *texImage; +   GLenum format, type; +   GLint bpp; +   void *buf; + +   texUnit = _mesa_get_current_tex_unit(ctx); +   texObj = _mesa_select_tex_object(ctx, texUnit, target); +   texImage = _mesa_get_tex_image(ctx, texObj, target, level); + +   format = _mesa_base_tex_format(ctx, internalFormat); +   type = get_temp_image_type(ctx, format); +   bpp = _mesa_bytes_per_pixel(format, type); +   if (bpp <= 0) { +      _mesa_problem(ctx, "Bad bpp in meta copy_tex_image()"); +      return; +   } + +   /* +    * Alloc image buffer (XXX could use a PBO) +    */ +   buf = _mesa_malloc(width * height * bpp); +   if (!buf) { +      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCopyTexImage%uD", dims); +      return; +   } + +   _mesa_unlock_texture(ctx, texObj); /* need to unlock first */ + +   /* +    * Read image from framebuffer (disable pixel transfer ops) +    */ +   _mesa_meta_begin(ctx, META_PIXEL_STORE | META_PIXEL_TRANSFER); +   ctx->Driver.ReadPixels(ctx, x, y, width, height, +			  format, type, &ctx->Pack, buf); +   _mesa_meta_end(ctx); + +   /* +    * Store texture data (with pixel transfer ops) +    */ +   _mesa_meta_begin(ctx, META_PIXEL_STORE); +   if (target == GL_TEXTURE_1D) { +      ctx->Driver.TexImage1D(ctx, target, level, internalFormat, +                             width, border, format, type, +                             buf, &ctx->Unpack, texObj, texImage); +   } +   else { +      ctx->Driver.TexImage2D(ctx, target, level, internalFormat, +                             width, height, border, format, type, +                             buf, &ctx->Unpack, texObj, texImage); +   } +   _mesa_meta_end(ctx); + +   _mesa_lock_texture(ctx, texObj); /* re-lock */ + +   _mesa_free(buf); +} + + +void +_mesa_meta_CopyTexImage1D(GLcontext *ctx, GLenum target, GLint level, +                          GLenum internalFormat, GLint x, GLint y, +                          GLsizei width, GLint border) +{ +   copy_tex_image(ctx, 1, target, level, internalFormat, x, y, +                  width, 1, border); +} + + +void +_mesa_meta_CopyTexImage2D(GLcontext *ctx, GLenum target, GLint level, +                          GLenum internalFormat, GLint x, GLint y, +                          GLsizei width, GLsizei height, GLint border) +{ +   copy_tex_image(ctx, 2, target, level, internalFormat, x, y, +                  width, height, border); +} + + + +/** + * Helper for _mesa_meta_CopyTexSubImage1/2/3D() functions. + * Have to be careful with locking and meta state for pixel transfer. + */ +static void +copy_tex_sub_image(GLcontext *ctx, GLuint dims, GLenum target, GLint level, +                   GLint xoffset, GLint yoffset, GLint zoffset, +                   GLint x, GLint y, +                   GLsizei width, GLsizei height) +{ +   struct gl_texture_unit *texUnit; +   struct gl_texture_object *texObj; +   struct gl_texture_image *texImage; +   GLenum format, type; +   GLint bpp; +   void *buf; + +   texUnit = _mesa_get_current_tex_unit(ctx); +   texObj = _mesa_select_tex_object(ctx, texUnit, target); +   texImage = _mesa_select_tex_image(ctx, texObj, target, level); + +   format = texImage->TexFormat->BaseFormat; +   type = get_temp_image_type(ctx, format); +   bpp = _mesa_bytes_per_pixel(format, type); +   if (bpp <= 0) { +      _mesa_problem(ctx, "Bad bpp in meta copy_tex_sub_image()"); +      return; +   } + +   /* +    * Alloc image buffer (XXX could use a PBO) +    */ +   buf = _mesa_malloc(width * height * bpp); +   if (!buf) { +      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCopyTexSubImage%uD", dims); +      return; +   } + +   _mesa_unlock_texture(ctx, texObj); /* need to unlock first */ + +   /* +    * Read image from framebuffer (disable pixel transfer ops) +    */ +   _mesa_meta_begin(ctx, META_PIXEL_STORE | META_PIXEL_TRANSFER); +   ctx->Driver.ReadPixels(ctx, x, y, width, height, +			  format, type, &ctx->Pack, buf); +   _mesa_meta_end(ctx); + +   /* +    * Store texture data (with pixel transfer ops) +    */ +   _mesa_meta_begin(ctx, META_PIXEL_STORE); +   if (target == GL_TEXTURE_1D) { +      ctx->Driver.TexSubImage1D(ctx, target, level, xoffset, +                                width, format, type, buf, +                                &ctx->Unpack, texObj, texImage); +   } +   else if (target == GL_TEXTURE_3D) { +      ctx->Driver.TexSubImage3D(ctx, target, level, xoffset, yoffset, zoffset, +                                width, height, 1, format, type, buf, +                                &ctx->Unpack, texObj, texImage); +   } +   else { +      ctx->Driver.TexSubImage2D(ctx, target, level, xoffset, yoffset, +                                width, height, format, type, buf, +                                &ctx->Unpack, texObj, texImage); +   } +   _mesa_meta_end(ctx); + +   _mesa_lock_texture(ctx, texObj); /* re-lock */ + +   _mesa_free(buf); +} + + +void +_mesa_meta_CopyTexSubImage1D(GLcontext *ctx, GLenum target, GLint level, +                             GLint xoffset, +                             GLint x, GLint y, GLsizei width) +{ +   copy_tex_sub_image(ctx, 1, target, level, xoffset, 0, 0, +                      x, y, width, 1); +} + + +void +_mesa_meta_CopyTexSubImage2D(GLcontext *ctx, GLenum target, GLint level, +                             GLint xoffset, GLint yoffset, +                             GLint x, GLint y, +                             GLsizei width, GLsizei height) +{ +   copy_tex_sub_image(ctx, 2, target, level, xoffset, yoffset, 0, +                      x, y, width, height); +} + + +void +_mesa_meta_CopyTexSubImage3D(GLcontext *ctx, GLenum target, GLint level, +                             GLint xoffset, GLint yoffset, GLint zoffset, +                             GLint x, GLint y, +                             GLsizei width, GLsizei height) +{ +   copy_tex_sub_image(ctx, 3, target, level, xoffset, yoffset, zoffset, +                      x, y, width, height); +} diff --git a/src/mesa/drivers/common/meta.h b/src/mesa/drivers/common/meta.h index 171ad27f26..9f7100f09c 100644 --- a/src/mesa/drivers/common/meta.h +++ b/src/mesa/drivers/common/meta.h @@ -27,29 +27,6 @@  #define META_H -/** - * Flags passed to _mesa_meta_begin(). - * XXX these flags may evolve... - */ -/*@{*/ -#define META_ALPHA_TEST      0x1 -#define META_BLEND           0x2  /**< includes logicop */ -#define META_COLOR_MASK      0x4 -#define META_DEPTH_TEST      0x8 -#define META_FOG            0x10 -#define META_RASTERIZATION  0x20 -#define META_SCISSOR        0x40 -#define META_SHADER         0x80 -#define META_STENCIL_TEST  0x100 -#define META_TRANSFORM     0x200 /**< modelview, projection */ -#define META_TEXTURE       0x400 -#define META_VERTEX        0x800 -#define META_VIEWPORT     0x1000 -#define META_PIXEL_STORE  0x2000 -#define META_ALL            ~0x0 -/*@}*/ - -  extern void  _mesa_meta_init(GLcontext *ctx); @@ -87,5 +64,32 @@ extern void  _mesa_meta_generate_mipmap(GLcontext *ctx, GLenum target,                             struct gl_texture_object *texObj); +extern void +_mesa_meta_CopyTexImage1D(GLcontext *ctx, GLenum target, GLint level, +                          GLenum internalFormat, GLint x, GLint y, +                          GLsizei width, GLint border); + +extern void +_mesa_meta_CopyTexImage2D(GLcontext *ctx, GLenum target, GLint level, +                          GLenum internalFormat, GLint x, GLint y, +                          GLsizei width, GLsizei height, GLint border); + +extern void +_mesa_meta_CopyTexSubImage1D(GLcontext *ctx, GLenum target, GLint level, +                             GLint xoffset, +                             GLint x, GLint y, GLsizei width); + +extern void +_mesa_meta_CopyTexSubImage2D(GLcontext *ctx, GLenum target, GLint level, +                             GLint xoffset, GLint yoffset, +                             GLint x, GLint y, +                             GLsizei width, GLsizei height); + +extern void +_mesa_meta_CopyTexSubImage3D(GLcontext *ctx, GLenum target, GLint level, +                             GLint xoffset, GLint yoffset, GLint zoffset, +                             GLint x, GLint y, +                             GLsizei width, GLsizei height); +  #endif /* META_H */ diff --git a/src/mesa/drivers/dri/ffb/ffb_tex.c b/src/mesa/drivers/dri/ffb/ffb_tex.c index 69d30aedba..95058e9069 100644 --- a/src/mesa/drivers/dri/ffb/ffb_tex.c +++ b/src/mesa/drivers/dri/ffb/ffb_tex.c @@ -30,24 +30,6 @@  #include "ffb_tex.h"  /* No texture unit, all software. */ -/* XXX this function isn't needed since _mesa_init_driver_functions() - * will make all these assignments. - */  void ffbDDInitTexFuncs(GLcontext *ctx)  { -        /* -	ctx->Driver.ChooseTextureFormat = _mesa_choose_tex_format; -	ctx->Driver.TexImage1D = _mesa_store_teximage1d; -	ctx->Driver.TexImage2D = _mesa_store_teximage2d; -	ctx->Driver.TexImage3D = _mesa_store_teximage3d; -	ctx->Driver.TexSubImage1D = _mesa_store_texsubimage1d; -	ctx->Driver.TexSubImage2D = _mesa_store_texsubimage2d; -	ctx->Driver.TexSubImage3D = _mesa_store_texsubimage3d; -	ctx->Driver.CopyTexImage1D = _swrast_copy_teximage1d; -	ctx->Driver.CopyTexImage2D = _swrast_copy_teximage2d; -	ctx->Driver.CopyTexSubImage1D = _swrast_copy_texsubimage1d; -	ctx->Driver.CopyTexSubImage2D = _swrast_copy_texsubimage2d; -	ctx->Driver.CopyTexSubImage3D = _swrast_copy_texsubimage3d; -	ctx->Driver.TestProxyTexImage = _mesa_test_proxy_teximage; -	*/  } diff --git a/src/mesa/drivers/dri/intel/intel_clear.c b/src/mesa/drivers/dri/intel/intel_clear.c index bce23724b3..9efe6a277c 100644 --- a/src/mesa/drivers/dri/intel/intel_clear.c +++ b/src/mesa/drivers/dri/intel/intel_clear.c @@ -170,6 +170,7 @@ intelClear(GLcontext *ctx, GLbitfield mask)  	 }  	 DBG("\n");        } +      intelFlush(&intel->ctx);        _mesa_meta_clear(&intel->ctx, tri_mask);     } diff --git a/src/mesa/drivers/dri/intel/intel_context.c b/src/mesa/drivers/dri/intel/intel_context.c index 7e21b94acc..03db8b1c68 100644 --- a/src/mesa/drivers/dri/intel/intel_context.c +++ b/src/mesa/drivers/dri/intel/intel_context.c @@ -587,11 +587,6 @@ intelInitDriverFunctions(struct dd_function_table *functions)     functions->GetString = intelGetString;     functions->UpdateState = intelInvalidateState; -   functions->CopyColorTable = _swrast_CopyColorTable; -   functions->CopyColorSubTable = _swrast_CopyColorSubTable; -   functions->CopyConvolutionFilter1D = _swrast_CopyConvolutionFilter1D; -   functions->CopyConvolutionFilter2D = _swrast_CopyConvolutionFilter2D; -     intelInitTextureFuncs(functions);     intelInitTextureImageFuncs(functions);     intelInitTextureSubImageFuncs(functions); @@ -922,6 +917,14 @@ intelDestroyContext(__DRIcontextPrivate * driContextPriv)  GLboolean  intelUnbindContext(__DRIcontextPrivate * driContextPriv)  { +   struct intel_context *intel = +      (struct intel_context *) driContextPriv->driverPrivate; + +   /* Deassociate the context with the drawables. +    */ +   intel->driDrawable = NULL; +   intel->driReadDrawable = NULL; +     return GL_TRUE;  } diff --git a/src/mesa/drivers/dri/intel/intel_generatemipmap.c b/src/mesa/drivers/dri/intel/intel_generatemipmap.c index fe986092db..237754d469 100644 --- a/src/mesa/drivers/dri/intel/intel_generatemipmap.c +++ b/src/mesa/drivers/dri/intel/intel_generatemipmap.c @@ -223,10 +223,6 @@ fail:   *   * The texture object's miptree must be mapped.   * - * It would be really nice if this was just called by Mesa whenever mipmaps - * needed to be regenerated, rather than us having to remember to do so in - * each texture image modification path. - *   * This function should also include an accelerated path.   */  void diff --git a/src/mesa/drivers/dri/intel/intel_span.c b/src/mesa/drivers/dri/intel/intel_span.c index 1e73943457..28eabbc005 100644 --- a/src/mesa/drivers/dri/intel/intel_span.c +++ b/src/mesa/drivers/dri/intel/intel_span.c @@ -448,24 +448,22 @@ intel_map_unmap_framebuffer(struct intel_context *intel,  			    struct gl_framebuffer *fb,  			    GLboolean map)  { -   GLcontext *ctx = &intel->ctx; -   GLuint i, j; +   GLuint i; -   /* color buffers */ -   if (fb == ctx->DrawBuffer) { -      for (j = 0; j < fb->_NumColorDrawBuffers; j++) { -	 if (map) -	    intel_renderbuffer_map(intel, fb->_ColorDrawBuffers[j]); -	 else -	    intel_renderbuffer_unmap(intel, fb->_ColorDrawBuffers[j]); -      } -   } else { +   /* color draw buffers */ +   for (i = 0; i < fb->_NumColorDrawBuffers; i++) {        if (map) -	 intel_renderbuffer_map(intel, fb->_ColorReadBuffer); +         intel_renderbuffer_map(intel, fb->_ColorDrawBuffers[i]);        else -	 intel_renderbuffer_unmap(intel, fb->_ColorReadBuffer); +         intel_renderbuffer_unmap(intel, fb->_ColorDrawBuffers[i]);     } +   /* color read buffer */ +   if (map) +      intel_renderbuffer_map(intel, fb->_ColorReadBuffer); +   else +      intel_renderbuffer_unmap(intel, fb->_ColorReadBuffer); +     /* check for render to textures */     for (i = 0; i < BUFFER_COUNT; i++) {        struct gl_renderbuffer_attachment *att = @@ -484,20 +482,17 @@ intel_map_unmap_framebuffer(struct intel_context *intel,     /* depth buffer (Note wrapper!) */     if (fb->_DepthBuffer) {        if (map) -	 intel_renderbuffer_map(intel, fb->_DepthBuffer->Wrapped); +         intel_renderbuffer_map(intel, fb->_DepthBuffer->Wrapped);        else -	 intel_renderbuffer_unmap(intel, -				  fb->_DepthBuffer->Wrapped); +         intel_renderbuffer_unmap(intel, fb->_DepthBuffer->Wrapped);     }     /* stencil buffer (Note wrapper!) */     if (fb->_StencilBuffer) {        if (map) -	 intel_renderbuffer_map(intel, -				fb->_StencilBuffer->Wrapped); +         intel_renderbuffer_map(intel, fb->_StencilBuffer->Wrapped);        else -	 intel_renderbuffer_unmap(intel, -				  fb->_StencilBuffer->Wrapped); +         intel_renderbuffer_unmap(intel, fb->_StencilBuffer->Wrapped);     }  } @@ -524,7 +519,8 @@ intelSpanRenderStart(GLcontext * ctx)     }     intel_map_unmap_framebuffer(intel, ctx->DrawBuffer, GL_TRUE); -   intel_map_unmap_framebuffer(intel, ctx->ReadBuffer, GL_TRUE); +   if (ctx->ReadBuffer != ctx->DrawBuffer) +      intel_map_unmap_framebuffer(intel, ctx->ReadBuffer, GL_TRUE);  }  /** @@ -547,7 +543,8 @@ intelSpanRenderFinish(GLcontext * ctx)     }     intel_map_unmap_framebuffer(intel, ctx->DrawBuffer, GL_FALSE); -   intel_map_unmap_framebuffer(intel, ctx->ReadBuffer, GL_FALSE); +   if (ctx->ReadBuffer != ctx->DrawBuffer) +      intel_map_unmap_framebuffer(intel, ctx->ReadBuffer, GL_FALSE);     UNLOCK_HARDWARE(intel);  } diff --git a/src/mesa/drivers/dri/intel/intel_tex_copy.c b/src/mesa/drivers/dri/intel/intel_tex_copy.c index 028b49c14d..148e8c048c 100644 --- a/src/mesa/drivers/dri/intel/intel_tex_copy.c +++ b/src/mesa/drivers/dri/intel/intel_tex_copy.c @@ -90,7 +90,6 @@ do_copy_texsubimage(struct intel_context *intel,                      GLint x, GLint y, GLsizei width, GLsizei height)  {     GLcontext *ctx = &intel->ctx; -   struct gl_texture_object *texObj = intelImage->base.TexObject;     const struct intel_region *src =        get_teximage_source(intel, internalFormat); @@ -170,11 +169,6 @@ do_copy_texsubimage(struct intel_context *intel,     UNLOCK_HARDWARE(intel); -   /* GL_SGIS_generate_mipmap */ -   if (intelImage->level == texObj->BaseLevel && texObj->GenerateMipmap) { -      intel_generate_mipmap(ctx, target, texObj); -   } -     return GL_TRUE;  } diff --git a/src/mesa/drivers/dri/intel/intel_tex_image.c b/src/mesa/drivers/dri/intel/intel_tex_image.c index a206fe6805..66201b1f46 100644 --- a/src/mesa/drivers/dri/intel/intel_tex_image.c +++ b/src/mesa/drivers/dri/intel/intel_tex_image.c @@ -546,11 +546,6 @@ intelTexImage(GLcontext * ctx,     }     UNLOCK_HARDWARE(intel); - -   /* GL_SGIS_generate_mipmap */ -   if (level == texObj->BaseLevel && texObj->GenerateMipmap) { -      intel_generate_mipmap(ctx, target, texObj); -   }  } diff --git a/src/mesa/drivers/dri/intel/intel_tex_subimage.c b/src/mesa/drivers/dri/intel/intel_tex_subimage.c index 89037073f8..751ec2c98c 100644 --- a/src/mesa/drivers/dri/intel/intel_tex_subimage.c +++ b/src/mesa/drivers/dri/intel/intel_tex_subimage.c @@ -129,11 +129,6 @@ intelTexSubimage(GLcontext * ctx,     }     UNLOCK_HARDWARE(intel); - -   /* GL_SGIS_generate_mipmap */ -   if (level == texObj->BaseLevel && texObj->GenerateMipmap) { -      intel_generate_mipmap(ctx, target, texObj); -   }  } diff --git a/src/mesa/drivers/dri/r200/Makefile b/src/mesa/drivers/dri/r200/Makefile index 42635bf9d9..fbce70c37b 100644 --- a/src/mesa/drivers/dri/r200/Makefile +++ b/src/mesa/drivers/dri/r200/Makefile @@ -55,8 +55,7 @@ C_SOURCES = $(COMMON_SOURCES) $(DRIVER_SOURCES)  X86_SOURCES =  -DRIVER_DEFINES = -DRADEON_COMMON=1 -DRADEON_COMMON_FOR_R200 \ -				 -Wall +DRIVER_DEFINES = -DRADEON_R200 -Wall  DRI_LIB_DEPS += $(RADEON_LDFLAGS) diff --git a/src/mesa/drivers/dri/r300/Makefile b/src/mesa/drivers/dri/r300/Makefile index 5d8d6f6658..fe775eac99 100644 --- a/src/mesa/drivers/dri/r300/Makefile +++ b/src/mesa/drivers/dri/r300/Makefile @@ -62,8 +62,7 @@ DRIVER_SOURCES = \  C_SOURCES = $(COMMON_SOURCES) $(DRIVER_SOURCES) -DRIVER_DEFINES = -DCOMPILE_R300 -DR200_MERGED=0 \ -	-DRADEON_COMMON=1 -DRADEON_COMMON_FOR_R300 \ +DRIVER_DEFINES = -DRADEON_R300  #	-DRADEON_BO_TRACK \  	-Wall diff --git a/src/mesa/drivers/dri/r300/radeon_context.h b/src/mesa/drivers/dri/r300/radeon_context.h index 250570f6b8..da4812d323 100644 --- a/src/mesa/drivers/dri/r300/radeon_context.h +++ b/src/mesa/drivers/dri/r300/radeon_context.h @@ -51,26 +51,12 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  #include "radeon_screen.h" -#if R200_MERGED -extern void radeonFallback(GLcontext * ctx, GLuint bit, GLboolean mode); - -#define FALLBACK( radeon, bit, mode ) do {			\ -   if ( 0 ) fprintf( stderr, "FALLBACK in %s: #%d=%d\n",	\ -		     __FUNCTION__, bit, mode );			\ -   radeonFallback( (radeon)->glCtx, bit, mode );		\ -} while (0) -#else  #define FALLBACK( radeon, bit, mode ) fprintf(stderr, "%s:%s\n", __LINE__, __FILE__); -#endif  /* TCL fallbacks */  extern void radeonTclFallback(GLcontext * ctx, GLuint bit, GLboolean mode); -#if R200_MERGED -#define TCL_FALLBACK( ctx, bit, mode )	radeonTclFallback( ctx, bit, mode ) -#else  #define TCL_FALLBACK( ctx, bit, mode )	; -#endif  #endif				/* __RADEON_CONTEXT_H__ */ diff --git a/src/mesa/drivers/dri/r600/Makefile b/src/mesa/drivers/dri/r600/Makefile index d925a2dfe3..36bf773c05 100644 --- a/src/mesa/drivers/dri/r600/Makefile +++ b/src/mesa/drivers/dri/r600/Makefile @@ -65,8 +65,7 @@ DRIVER_SOURCES = \  C_SOURCES = $(COMMON_SOURCES) $(DRIVER_SOURCES) -DRIVER_DEFINES = -DCOMPILE_R600 -DR200_MERGED=0 \ -	-DRADEON_COMMON=1 -DRADEON_COMMON_FOR_R600 \ +DRIVER_DEFINES = -DRADEON_R600 \  #	-DRADEON_BO_TRACK \  	-Wall diff --git a/src/mesa/drivers/dri/r600/r600_context.c b/src/mesa/drivers/dri/r600/r600_context.c index 07a7bcf11f..f8fd9c13d7 100644 --- a/src/mesa/drivers/dri/r600/r600_context.c +++ b/src/mesa/drivers/dri/r600/r600_context.c @@ -385,9 +385,6 @@ GLboolean r600CreateContext(const __GLcontextModes * glVisual,  	if (driQueryOptionb(&r600->radeon.optionCache, "no_rast")) {  		radeon_warning("disabling 3D acceleration\n"); -#if R200_MERGED -		FALLBACK(&r600->radeon, RADEON_FALLBACK_DISABLE, 1); -#endif  	}  	return GL_TRUE; diff --git a/src/mesa/drivers/dri/r600/r600_reg_auto_r6xx.h b/src/mesa/drivers/dri/r600/r600_reg_auto_r6xx.h index 9d5aa3c7e4..edd85b0fac 100644 --- a/src/mesa/drivers/dri/r600/r600_reg_auto_r6xx.h +++ b/src/mesa/drivers/dri/r600/r600_reg_auto_r6xx.h @@ -1366,6 +1366,7 @@ enum {  	DB_DEPTH_INFO__READ_SIZE_bit                      = 1 << 3,  	DB_DEPTH_INFO__ARRAY_MODE_mask                    = 0x0f << 15,  	DB_DEPTH_INFO__ARRAY_MODE_shift                   = 15, +	    ARRAY_1D_TILED_THIN1                          = 0x02,  	    ARRAY_2D_TILED_THIN1                          = 0x04,  	TILE_SURFACE_ENABLE_bit                           = 1 << 25,  	TILE_COMPACT_bit                                  = 1 << 26, @@ -1449,6 +1450,7 @@ enum {  	CB_COLOR0_INFO__ARRAY_MODE_shift                  = 8,  	    ARRAY_LINEAR_GENERAL                          = 0x00,  	    ARRAY_LINEAR_ALIGNED                          = 0x01, +/*	    ARRAY_1D_TILED_THIN1                          = 0x02, */  /* 	    ARRAY_2D_TILED_THIN1                          = 0x04, */  	NUMBER_TYPE_mask                                  = 0x07 << 12,  	NUMBER_TYPE_shift                                 = 12, diff --git a/src/mesa/drivers/dri/r600/r700_assembler.c b/src/mesa/drivers/dri/r600/r700_assembler.c index fda6692725..efeccb25f1 100644 --- a/src/mesa/drivers/dri/r600/r700_assembler.c +++ b/src/mesa/drivers/dri/r600/r700_assembler.c @@ -3387,6 +3387,7 @@ GLboolean assemble_TEX(r700_AssemblerBase *pAsm)          break;      case PROGRAM_TEMPORARY:      case PROGRAM_INPUT: +    default:          src_const = GL_FALSE;  	break;      } diff --git a/src/mesa/drivers/dri/r600/r700_chip.c b/src/mesa/drivers/dri/r600/r700_chip.c index 1b56059197..06d7e9c9ab 100644 --- a/src/mesa/drivers/dri/r600/r700_chip.c +++ b/src/mesa/drivers/dri/r600/r700_chip.c @@ -351,7 +351,7 @@ static void r700SetDepthTarget(context_t *context)          SETfield(r700->DB_DEPTH_INFO.u32All, DEPTH_16,                       DB_DEPTH_INFO__FORMAT_shift, DB_DEPTH_INFO__FORMAT_mask);      } -    SETfield(r700->DB_DEPTH_INFO.u32All, ARRAY_2D_TILED_THIN1, +    SETfield(r700->DB_DEPTH_INFO.u32All, ARRAY_1D_TILED_THIN1,               DB_DEPTH_INFO__ARRAY_MODE_shift, DB_DEPTH_INFO__ARRAY_MODE_mask);      /* r700->DB_PREFETCH_LIMIT.bits.DEPTH_HEIGHT_TILE_MAX = (context->currentDraw->h >> 3) - 1; */ /* z buffer sie may much bigger than what need, so use actual used h. */  } diff --git a/src/mesa/drivers/dri/r600/r700_vertprog.c b/src/mesa/drivers/dri/r600/r700_vertprog.c index 8c2b0071df..9ee26286d9 100644 --- a/src/mesa/drivers/dri/r600/r700_vertprog.c +++ b/src/mesa/drivers/dri/r600/r700_vertprog.c @@ -42,6 +42,7 @@  #include "radeon_debug.h"  #include "r600_context.h"  #include "r600_cmdbuf.h" +#include "shader/programopt.c"  #include "r700_debug.h"  #include "r700_vertprog.h" @@ -272,6 +273,11 @@ struct r700_vertex_program* r700TranslateVertexShader(GLcontext *ctx,  	vp = _mesa_calloc(sizeof(*vp));  	vp->mesa_program = (struct gl_vertex_program *)_mesa_clone_program(ctx, &mesa_vp->Base); +	if (mesa_vp->IsPositionInvariant) +	{ +                _mesa_insert_mvp_code(ctx, vp->mesa_program); +        } +  	for(i=0; i<VERT_ATTRIB_MAX; i++)  	{  		unBit = 1 << i; @@ -290,21 +296,21 @@ struct r700_vertex_program* r700TranslateVertexShader(GLcontext *ctx,  	//Init_Program  	Init_r700_AssemblerBase(SPT_VP, &(vp->r700AsmCode), &(vp->r700Shader) ); -	Map_Vertex_Program( vp, mesa_vp ); +	Map_Vertex_Program( vp, vp->mesa_program ); -	if(GL_FALSE == Find_Instruction_Dependencies_vp(vp, mesa_vp)) +	if(GL_FALSE == Find_Instruction_Dependencies_vp(vp, vp->mesa_program))  	{  		return NULL;      } -	if(GL_FALSE == AssembleInstr(mesa_vp->Base.NumInstructions, -                                 &(mesa_vp->Base.Instructions[0]),  +	if(GL_FALSE == AssembleInstr(vp->mesa_program->Base.NumInstructions, +                                 &(vp->mesa_program->Base.Instructions[0]),                                    &(vp->r700AsmCode)) )  	{  		return NULL;  	}  -    if(GL_FALSE == Process_Vertex_Exports(&(vp->r700AsmCode), mesa_vp->Base.OutputsWritten) ) +    if(GL_FALSE == Process_Vertex_Exports(&(vp->r700AsmCode), vp->mesa_program->Base.OutputsWritten) )      {          return NULL;      } @@ -329,23 +335,23 @@ void r700SelectVertexShader(GLcontext *ctx)      unsigned int unBit;      unsigned int i;      GLboolean match; +    GLbitfield InputsRead;      vpc = (struct r700_vertex_program_cont *)ctx->VertexProgram._Current; -#if 0 -    if (context->radeon.NewGLState & (_NEW_PROGRAM_CONSTANTS|_NEW_PROGRAM)) +    InputsRead = vpc->mesa_program.Base.InputsRead; +    if (vpc->mesa_program.IsPositionInvariant)      { -	vpc->needUpdateVF = 1; -    } -#endif - +	InputsRead |= VERT_BIT_POS; +    }  +          for (vp = vpc->progs; vp; vp = vp->next)      {  	match = GL_TRUE;	  	for(i=0; i<VERT_ATTRIB_MAX; i++)  	{  		unBit = 1 << i; -                if(vpc->mesa_program.Base.InputsRead & unBit) +		if(InputsRead & unBit)  		{  			if (vp->aos_desc[i].size != vb->AttribPtr[i]->size)  				match = GL_FALSE; diff --git a/src/mesa/drivers/dri/radeon/Makefile b/src/mesa/drivers/dri/radeon/Makefile index 1f286776b5..b1efc72872 100644 --- a/src/mesa/drivers/dri/radeon/Makefile +++ b/src/mesa/drivers/dri/radeon/Makefile @@ -47,8 +47,7 @@ C_SOURCES = \  	$(DRIVER_SOURCES) \  	$(CS_SOURCES) -DRIVER_DEFINES = -DRADEON_COMMON=0 \ -				 -Wall +DRIVER_DEFINES = -DRADEON_R100 -Wall  DRI_LIB_DEPS += $(RADEON_LDFLAGS) diff --git a/src/mesa/drivers/dri/radeon/radeon_common_context.c b/src/mesa/drivers/dri/radeon/radeon_common_context.c index 71ee06d9a7..1c53c04da7 100644 --- a/src/mesa/drivers/dri/radeon/radeon_common_context.c +++ b/src/mesa/drivers/dri/radeon/radeon_common_context.c @@ -47,7 +47,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  #include "swrast_setup/swrast_setup.h"  #include "tnl/tnl.h" -#if RADEON_COMMON && defined(RADEON_COMMON_FOR_R600) /* +r6/r7 */ +#if defined(RADEON_R600)  #include "r600_context.h"  #endif diff --git a/src/mesa/drivers/dri/radeon/radeon_dma.c b/src/mesa/drivers/dri/radeon/radeon_dma.c index 2eefa3f2b1..c9a32c808b 100644 --- a/src/mesa/drivers/dri/radeon/radeon_dma.c +++ b/src/mesa/drivers/dri/radeon/radeon_dma.c @@ -263,7 +263,7 @@ void radeonAllocDmaRegion(radeonContextPtr rmesa,  void radeonFreeDmaRegions(radeonContextPtr rmesa)  { -	struct radeon_dma_bo *dma_bo = CALLOC_STRUCT(radeon_dma_bo); +	struct radeon_dma_bo *dma_bo;  	struct radeon_dma_bo *temp;  	if (RADEON_DEBUG & RADEON_DMA)  		fprintf(stderr, "%s\n", __FUNCTION__); diff --git a/src/mesa/drivers/dri/radeon/radeon_screen.c b/src/mesa/drivers/dri/radeon/radeon_screen.c index 5ffb55db5e..573eb6c9c1 100644 --- a/src/mesa/drivers/dri/radeon/radeon_screen.c +++ b/src/mesa/drivers/dri/radeon/radeon_screen.c @@ -48,17 +48,17 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  #include "radeon_screen.h"  #include "radeon_common.h"  #include "radeon_span.h" -#if !RADEON_COMMON +#if defined(RADEON_R100)  #include "radeon_context.h"  #include "radeon_tex.h" -#elif RADEON_COMMON && defined(RADEON_COMMON_FOR_R200) +#elif defined(RADEON_R200)  #include "r200_context.h"  #include "r200_ioctl.h"  #include "r200_tex.h" -#elif RADEON_COMMON && defined(RADEON_COMMON_FOR_R300) +#elif defined(RADEON_R300)  #include "r300_context.h"  #include "r300_tex.h" -#elif RADEON_COMMON && defined(RADEON_COMMON_FOR_R600) +#elif defined(RADEON_R600)  #include "r600_context.h"  #include "r700_driconf.h" /* +r6/r7 */  #include "r600_tex.h"     /* +r6/r7 */ @@ -82,7 +82,7 @@ DRI_CONF_OPT_BEGIN_V(command_buffer_size,int,def, # min ":" # max ) \          DRI_CONF_DESC(de,"Grösse des Befehlspuffers (in KB)") \  DRI_CONF_OPT_END -#if !RADEON_COMMON	/* R100 */ +#if defined(RADEON_R100)	/* R100 */  PUBLIC const char __driConfigOptions[] =  DRI_CONF_BEGIN      DRI_CONF_SECTION_PERFORMANCE @@ -109,7 +109,7 @@ DRI_CONF_BEGIN  DRI_CONF_END;  static const GLuint __driNConfigOptions = 15; -#elif RADEON_COMMON && defined(RADEON_COMMON_FOR_R200) +#elif defined(RADEON_R200)  PUBLIC const char __driConfigOptions[] =  DRI_CONF_BEGIN @@ -147,7 +147,7 @@ extern const struct dri_extension NV_vp_extension[];  extern const struct dri_extension ATI_fs_extension[];  extern const struct dri_extension point_extensions[]; -#elif RADEON_COMMON && (defined(RADEON_COMMON_FOR_R300) || defined(RADEON_COMMON_FOR_R600)) +#elif defined(RADEON_R300) || defined(RADEON_R600)  #define DRI_CONF_FP_OPTIMIZATION_SPEED   0  #define DRI_CONF_FP_OPTIMIZATION_QUALITY 1 @@ -220,7 +220,7 @@ static const GLuint __driNConfigOptions = 17;  extern const struct dri_extension gl_20_extension[]; -#endif /* RADEON_COMMON && defined(RADEON_COMMON_FOR_R300) */ +#endif  extern const struct dri_extension card_extensions[];  extern const struct dri_extension mm_extensions[]; @@ -337,7 +337,7 @@ radeonFillInModes( __DRIscreenPrivate *psp,      return (const __DRIconfig **) configs;  } -#if !RADEON_COMMON +#if defined(RADEON_R100)  static const __DRItexOffsetExtension radeonTexOffsetExtension = {      { __DRI_TEX_OFFSET, __DRI_TEX_OFFSET_VERSION },      radeonSetTexOffset, @@ -350,7 +350,7 @@ static const __DRItexBufferExtension radeonTexBufferExtension = {  };  #endif -#if RADEON_COMMON && defined(RADEON_COMMON_FOR_R200) +#if defined(RADEON_R200)  static const __DRIallocateExtension r200AllocateExtension = {      { __DRI_ALLOCATE, __DRI_ALLOCATE_VERSION },      r200AllocateMemoryMESA, @@ -370,7 +370,7 @@ static const __DRItexBufferExtension r200TexBufferExtension = {  };  #endif -#if RADEON_COMMON && defined(RADEON_COMMON_FOR_R300) +#if defined(RADEON_R300)  static const __DRItexOffsetExtension r300texOffsetExtension = {      { __DRI_TEX_OFFSET, __DRI_TEX_OFFSET_VERSION },     r300SetTexOffset, @@ -383,7 +383,7 @@ static const __DRItexBufferExtension r300TexBufferExtension = {  };  #endif -#if RADEON_COMMON && defined(RADEON_COMMON_FOR_R600) +#if defined(RADEON_R600)  static const __DRItexOffsetExtension r600texOffsetExtension = {      { __DRI_TEX_OFFSET, __DRI_TEX_OFFSET_VERSION },     r600SetTexOffset, /* +r6/r7 */ @@ -1222,22 +1222,22 @@ radeonCreateScreen( __DRIscreenPrivate *sPriv )         screen->extensions[i++] = &driMediaStreamCounterExtension.base;     } -#if !RADEON_COMMON +#if defined(RADEON_R100)     screen->extensions[i++] = &radeonTexOffsetExtension.base;  #endif -#if RADEON_COMMON && defined(RADEON_COMMON_FOR_R200) +#if defined(RADEON_R200)     if (IS_R200_CLASS(screen))        screen->extensions[i++] = &r200AllocateExtension.base;     screen->extensions[i++] = &r200texOffsetExtension.base;  #endif -#if RADEON_COMMON && defined(RADEON_COMMON_FOR_R300) +#if defined(RADEON_R300)     screen->extensions[i++] = &r300texOffsetExtension.base;  #endif -#if RADEON_COMMON && defined(RADEON_COMMON_FOR_R600) +#if defined(RADEON_R600)     screen->extensions[i++] = &r600texOffsetExtension.base;  #endif @@ -1376,22 +1376,22 @@ radeonCreateScreen2(__DRIscreenPrivate *sPriv)         screen->extensions[i++] = &driMediaStreamCounterExtension.base;     } -#if !RADEON_COMMON +#if defined(RADEON_R100)     screen->extensions[i++] = &radeonTexBufferExtension.base;  #endif -#if RADEON_COMMON && defined(RADEON_COMMON_FOR_R200) +#if defined(RADEON_R200)     if (IS_R200_CLASS(screen))         screen->extensions[i++] = &r200AllocateExtension.base;     screen->extensions[i++] = &r200TexBufferExtension.base;  #endif -#if RADEON_COMMON && defined(RADEON_COMMON_FOR_R300) +#if defined(RADEON_R300)     screen->extensions[i++] = &r300TexBufferExtension.base;  #endif -#if RADEON_COMMON && defined(RADEON_COMMON_FOR_R600) +#if defined(RADEON_R600)     screen->extensions[i++] = &r600TexBufferExtension.base;  #endif @@ -1589,22 +1589,22 @@ radeonDestroyBuffer(__DRIdrawablePrivate *driDrawPriv)  static const __DRIconfig **  radeonInitScreen(__DRIscreenPrivate *psp)  { -#if !RADEON_COMMON +#if defined(RADEON_R100)     static const char *driver_name = "Radeon";     static const __DRIutilversion2 ddx_expected = { 4, 5, 0, 0 };     static const __DRIversion dri_expected = { 4, 0, 0 };     static const __DRIversion drm_expected = { 1, 6, 0 }; -#elif RADEON_COMMON && defined(RADEON_COMMON_FOR_R200) +#elif defined(RADEON_R200)     static const char *driver_name = "R200";     static const __DRIutilversion2 ddx_expected = { 4, 5, 0, 0 };     static const __DRIversion dri_expected = { 4, 0, 0 };     static const __DRIversion drm_expected = { 1, 6, 0 }; -#elif RADEON_COMMON && defined(RADEON_COMMON_FOR_R300) +#elif defined(RADEON_R300)     static const char *driver_name = "R300";     static const __DRIutilversion2 ddx_expected = { 4, 5, 0, 0 };     static const __DRIversion dri_expected = { 4, 0, 0 };     static const __DRIversion drm_expected = { 1, 24, 0 }; -#elif RADEON_COMMON && defined(RADEON_COMMON_FOR_R600) +#elif defined(RADEON_R600)     static const char *driver_name = "R600";     static const __DRIutilversion2 ddx_expected = { 4, 5, 0, 0 };     static const __DRIversion dri_expected = { 4, 0, 0 }; @@ -1630,13 +1630,13 @@ radeonInitScreen(__DRIscreenPrivate *psp)      * Hello chicken.  Hello egg.  How are you two today?      */     driInitExtensions( NULL, card_extensions, GL_FALSE ); -#if RADEON_COMMON && defined(RADEON_COMMON_FOR_R200) +#if defined(RADEON_R200)     driInitExtensions( NULL, blend_extensions, GL_FALSE );     driInitSingleExtension( NULL, ARB_vp_extension );     driInitSingleExtension( NULL, NV_vp_extension );     driInitSingleExtension( NULL, ATI_fs_extension );     driInitExtensions( NULL, point_extensions, GL_FALSE ); -#elif (defined(RADEON_COMMON_FOR_R300) || defined(RADEON_COMMON_FOR_R600)) +#elif (defined(RADEON_R300) || defined(RADEON_R600))     driInitSingleExtension( NULL, gl_20_extension );  #endif @@ -1684,13 +1684,13 @@ __DRIconfig **radeonInitScreen2(__DRIscreenPrivate *psp)      */     driInitExtensions( NULL, card_extensions, GL_FALSE );     driInitExtensions( NULL, mm_extensions, GL_FALSE ); -#if RADEON_COMMON && defined(RADEON_COMMON_FOR_R200) +#if defined(RADEON_R200)     driInitExtensions( NULL, blend_extensions, GL_FALSE );     driInitSingleExtension( NULL, ARB_vp_extension );     driInitSingleExtension( NULL, NV_vp_extension );     driInitSingleExtension( NULL, ATI_fs_extension );     driInitExtensions( NULL, point_extensions, GL_FALSE ); -#elif (defined(RADEON_COMMON_FOR_R300) || defined(RADEON_COMMON_FOR_R600)) +#elif (defined(RADEON_R300) || defined(RADEON_R600))     driInitSingleExtension( NULL, gl_20_extension );  #endif @@ -1772,13 +1772,13 @@ getSwapInfo( __DRIdrawablePrivate *dPriv, __DRIswapInfo * sInfo )  const struct __DriverAPIRec driDriverAPI = {     .InitScreen      = radeonInitScreen,     .DestroyScreen   = radeonDestroyScreen, -#if RADEON_COMMON && defined(RADEON_COMMON_FOR_R200) +#if defined(RADEON_R200)     .CreateContext   = r200CreateContext,     .DestroyContext  = r200DestroyContext, -#elif RADEON_COMMON && defined(RADEON_COMMON_FOR_R600) +#elif defined(RADEON_R600)     .CreateContext   = r600CreateContext,     .DestroyContext  = radeonDestroyContext, -#elif RADEON_COMMON && defined(RADEON_COMMON_FOR_R300) +#elif defined(RADEON_R300)     .CreateContext   = r300CreateContext,     .DestroyContext  = radeonDestroyContext,  #else diff --git a/src/mesa/drivers/dri/radeon/radeon_span.c b/src/mesa/drivers/dri/radeon/radeon_span.c index 4e100d854e..0c49c3713a 100644 --- a/src/mesa/drivers/dri/radeon/radeon_span.c +++ b/src/mesa/drivers/dri/radeon/radeon_span.c @@ -55,7 +55,7 @@ static void radeonSetSpanFunctions(struct radeon_renderbuffer *rrb);  /* r200 depth buffer is always tiled - this is the formula     according to the docs unless I typo'ed in it  */ -#if defined(RADEON_COMMON_FOR_R200) +#if defined(RADEON_R200)  static GLubyte *r200_depth_2byte(const struct radeon_renderbuffer * rrb,  				 GLint x, GLint y)  { @@ -106,6 +106,141 @@ static GLubyte *r200_depth_4byte(const struct radeon_renderbuffer * rrb,  }  #endif +/* r600 tiling + * two main types: + * - 1D (akin to macro-linear/micro-tiled on older asics) + * - 2D (akin to macro-tiled/micro-tiled on older asics) + * only 1D tiling is implemented below + */ +#if defined(RADEON_R600) +static inline GLint r600_1d_tile_helper(const struct radeon_renderbuffer * rrb, +					GLint x, GLint y, GLint is_depth, GLint is_stencil) +{ +    GLint element_bytes = rrb->cpp; +    GLint num_samples = 1; +    GLint tile_width = 8; +    GLint tile_height = 8; +    GLint tile_thickness = 1; +    GLint pitch_elements = rrb->pitch / element_bytes; +    GLint height = rrb->base.Height; +    GLint z = 0; +    GLint sample_number = 0; +    /* */ +    GLint tile_bytes; +    GLint tiles_per_row; +    GLint tiles_per_slice; +    GLint slice_offset; +    GLint tile_row_index; +    GLint tile_column_index; +    GLint tile_offset; +    GLint pixel_number = 0; +    GLint element_offset; +    GLint offset = 0; + +    tile_bytes = tile_width * tile_height * tile_thickness * element_bytes * num_samples; +    tiles_per_row = pitch_elements / tile_width; +    tiles_per_slice = tiles_per_row * (height / tile_height); +    slice_offset = (z / tile_thickness) * tiles_per_slice * tile_bytes; +    tile_row_index = y / tile_height; +    tile_column_index = x / tile_width; +    tile_offset = ((tile_row_index * tiles_per_row) + tile_column_index) * tile_bytes; + +    if (is_depth) { +	    GLint pixel_offset = 0; + +	    pixel_number |= ((x >> 0) & 1) << 0; // pn[0] = x[0] +	    pixel_number |= ((y >> 0) & 1) << 1; // pn[1] = y[0] +	    pixel_number |= ((x >> 1) & 1) << 2; // pn[2] = x[1] +	    pixel_number |= ((y >> 1) & 1) << 3; // pn[3] = y[1] +	    pixel_number |= ((x >> 2) & 1) << 4; // pn[4] = x[2] +	    pixel_number |= ((y >> 2) & 1) << 5; // pn[5] = y[2] +	    switch (element_bytes) { +	    case 2: +		    pixel_offset = pixel_number * element_bytes * num_samples; +		    break; +	    case 4: +		    /* stencil and depth data are stored separately within a tile. +		     * stencil is stored in a contiguous tile before the depth tile. +		     * stencil element is 1 byte, depth element is 3 bytes. +		     * stencil tile is 64 bytes. +		     */ +		    if (is_stencil) +			    pixel_offset = pixel_number * 1 * num_samples; +		    else +			    pixel_offset = (pixel_number * 3 * num_samples) + 64; +		    break; +	    } +	    element_offset = pixel_offset + (sample_number * element_bytes); +    } else { +	    GLint sample_offset; + +	    switch (element_bytes) { +	    case 1: +		    pixel_number |= ((x >> 0) & 1) << 0; // pn[0] = x[0] +		    pixel_number |= ((x >> 1) & 1) << 1; // pn[1] = x[1] +		    pixel_number |= ((x >> 2) & 1) << 2; // pn[2] = x[2] +		    pixel_number |= ((y >> 1) & 1) << 3; // pn[3] = y[1] +		    pixel_number |= ((y >> 0) & 1) << 4; // pn[4] = y[0] +		    pixel_number |= ((y >> 2) & 1) << 5; // pn[5] = y[2] +		    break; +	    case 2: +		    pixel_number |= ((x >> 0) & 1) << 0; // pn[0] = x[0] +		    pixel_number |= ((x >> 1) & 1) << 1; // pn[1] = x[1] +		    pixel_number |= ((x >> 2) & 1) << 2; // pn[2] = x[2] +		    pixel_number |= ((y >> 0) & 1) << 3; // pn[3] = y[0] +		    pixel_number |= ((y >> 1) & 1) << 4; // pn[4] = y[1] +		    pixel_number |= ((y >> 2) & 1) << 5; // pn[5] = y[2] +		    break; +	    case 4: +		    pixel_number |= ((x >> 0) & 1) << 0; // pn[0] = x[0] +		    pixel_number |= ((x >> 1) & 1) << 1; // pn[1] = x[1] +		    pixel_number |= ((y >> 0) & 1) << 2; // pn[2] = y[0] +		    pixel_number |= ((x >> 2) & 1) << 3; // pn[3] = x[2] +		    pixel_number |= ((y >> 1) & 1) << 4; // pn[4] = y[1] +		    pixel_number |= ((y >> 2) & 1) << 5; // pn[5] = y[2] +		    break; +	    } +	    sample_offset = sample_number * (tile_bytes / num_samples); +	    element_offset = sample_offset + (pixel_number * element_bytes); +    } +    offset = slice_offset + tile_offset + element_offset; +    return offset; +} + +/* depth buffers */ +static GLubyte *r600_ptr_depth(const struct radeon_renderbuffer * rrb, +			       GLint x, GLint y) +{ +    GLubyte *ptr = rrb->bo->ptr; +    GLint offset = r600_1d_tile_helper(rrb, x, y, 1, 0); +    return &ptr[offset]; +} + +static GLubyte *r600_ptr_stencil(const struct radeon_renderbuffer * rrb, +				 GLint x, GLint y) +{ +    GLubyte *ptr = rrb->bo->ptr; +    GLint offset = r600_1d_tile_helper(rrb, x, y, 1, 1); +    return &ptr[offset]; +} + +static GLubyte *r600_ptr_color(const struct radeon_renderbuffer * rrb, +			       GLint x, GLint y) +{ +    GLubyte *ptr = rrb->bo->ptr; +    uint32_t mask = RADEON_BO_FLAGS_MACRO_TILE | RADEON_BO_FLAGS_MICRO_TILE; +    GLint offset; + +    if (rrb->has_surface || !(rrb->bo->flags & mask)) { +        offset = x * rrb->cpp + y * rrb->pitch; +    } else { +	    offset = r600_1d_tile_helper(rrb, x, y, 0, 0); +    } +    return &ptr[offset]; +} + +#else +  /* radeon tiling on r300-r500 has 4 states,     macro-linear/micro-linear     macro-linear/micro-tiled @@ -197,7 +332,10 @@ static GLubyte *radeon_ptr_2byte_8x2(const struct radeon_renderbuffer * rrb,      return &ptr[offset];  } -#ifndef COMPILE_R300 +#endif + +#ifndef RADEON_R300 +#ifndef RADEON_R600  static uint32_t  z24s8_to_s8z24(uint32_t val)  { @@ -210,6 +348,7 @@ s8z24_to_z24s8(uint32_t val)     return (val >> 24) | (val << 8);  }  #endif +#endif  /*   * Note that all information needed to access pixels in a renderbuffer @@ -270,7 +409,11 @@ s8z24_to_z24s8(uint32_t val)  #define TAG(x)    radeon##x##_RGB565  #define TAG2(x,y) radeon##x##_RGB565##y +#if defined(RADEON_R600) +#define GET_PTR(X,Y) r600_ptr_color(rrb, (X) + x_off, (Y) + y_off) +#else  #define GET_PTR(X,Y) radeon_ptr_2byte_8x2(rrb, (X) + x_off, (Y) + y_off) +#endif  #include "spantmp2.h"  /* 16 bit, ARGB1555 color spanline and pixel functions @@ -280,7 +423,11 @@ s8z24_to_z24s8(uint32_t val)  #define TAG(x)    radeon##x##_ARGB1555  #define TAG2(x,y) radeon##x##_ARGB1555##y +#if defined(RADEON_R600) +#define GET_PTR(X,Y) r600_ptr_color(rrb, (X) + x_off, (Y) + y_off) +#else  #define GET_PTR(X,Y) radeon_ptr_2byte_8x2(rrb, (X) + x_off, (Y) + y_off) +#endif  #include "spantmp2.h"  /* 16 bit, RGBA4 color spanline and pixel functions @@ -290,7 +437,11 @@ s8z24_to_z24s8(uint32_t val)  #define TAG(x)    radeon##x##_ARGB4444  #define TAG2(x,y) radeon##x##_ARGB4444##y +#if defined(RADEON_R600) +#define GET_PTR(X,Y) r600_ptr_color(rrb, (X) + x_off, (Y) + y_off) +#else  #define GET_PTR(X,Y) radeon_ptr_2byte_8x2(rrb, (X) + x_off, (Y) + y_off) +#endif  #include "spantmp2.h"  /* 32 bit, xRGB8888 color spanline and pixel functions @@ -300,11 +451,19 @@ s8z24_to_z24s8(uint32_t val)  #define TAG(x)    radeon##x##_xRGB8888  #define TAG2(x,y) radeon##x##_xRGB8888##y +#if defined(RADEON_R600) +#define GET_VALUE(_x, _y) ((*(GLuint*)(r600_ptr_color(rrb, _x + x_off, _y + y_off)) | 0xff000000)) +#define PUT_VALUE(_x, _y, d) { \ +   GLuint *_ptr = (GLuint*)r600_ptr_color( rrb, _x + x_off, _y + y_off );		\ +   *_ptr = d;								\ +} while (0) +#else  #define GET_VALUE(_x, _y) ((*(GLuint*)(radeon_ptr_4byte(rrb, _x + x_off, _y + y_off)) | 0xff000000))  #define PUT_VALUE(_x, _y, d) { \     GLuint *_ptr = (GLuint*)radeon_ptr_4byte( rrb, _x + x_off, _y + y_off );		\     *_ptr = d;								\  } while (0) +#endif  #include "spantmp2.h"  /* 32 bit, ARGB8888 color spanline and pixel functions @@ -314,11 +473,19 @@ s8z24_to_z24s8(uint32_t val)  #define TAG(x)    radeon##x##_ARGB8888  #define TAG2(x,y) radeon##x##_ARGB8888##y +#if defined(RADEON_R600) +#define GET_VALUE(_x, _y) (*(GLuint*)(r600_ptr_color(rrb, _x + x_off, _y + y_off))) +#define PUT_VALUE(_x, _y, d) { \ +   GLuint *_ptr = (GLuint*)r600_ptr_color( rrb, _x + x_off, _y + y_off );		\ +   *_ptr = d;								\ +} while (0) +#else  #define GET_VALUE(_x, _y) (*(GLuint*)(radeon_ptr_4byte(rrb, _x + x_off, _y + y_off)))  #define PUT_VALUE(_x, _y, d) { \     GLuint *_ptr = (GLuint*)radeon_ptr_4byte( rrb, _x + x_off, _y + y_off );		\     *_ptr = d;								\  } while (0) +#endif  #include "spantmp2.h"  /* ================================================================ @@ -339,17 +506,23 @@ s8z24_to_z24s8(uint32_t val)   */  #define VALUE_TYPE GLushort -#if defined(RADEON_COMMON_FOR_R200) +#if defined(RADEON_R200)  #define WRITE_DEPTH( _x, _y, d )					\     *(GLushort *)r200_depth_2byte(rrb, _x + x_off, _y + y_off) = d +#elif defined(RADEON_R600) +#define WRITE_DEPTH( _x, _y, d )					\ +   *(GLushort *)r600_ptr_depth(rrb, _x + x_off, _y + y_off) = d  #else  #define WRITE_DEPTH( _x, _y, d )					\     *(GLushort *)radeon_ptr_2byte_8x2(rrb, _x + x_off, _y + y_off) = d  #endif -#if defined(RADEON_COMMON_FOR_R200) +#if defined(RADEON_R200)  #define READ_DEPTH( d, _x, _y )						\     d = *(GLushort *)r200_depth_2byte(rrb, _x + x_off, _y + y_off) +#elif defined(RADEON_R600) +#define READ_DEPTH( d, _x, _y )						\ +   d = *(GLushort *)r600_ptr_depth(rrb, _x + x_off, _y + y_off)  #else  #define READ_DEPTH( d, _x, _y )						\     d = *(GLushort *)radeon_ptr_2byte_8x2(rrb, _x + x_off, _y + y_off) @@ -365,7 +538,7 @@ s8z24_to_z24s8(uint32_t val)   */  #define VALUE_TYPE GLuint -#if defined(COMPILE_R300) +#if defined(RADEON_R300)  #define WRITE_DEPTH( _x, _y, d )					\  do {									\     GLuint *_ptr = (GLuint*)radeon_ptr_4byte( rrb, _x + x_off, _y + y_off );		\ @@ -374,7 +547,16 @@ do {									\     tmp |= ((d << 8) & 0xffffff00);					\     *_ptr = tmp;					\  } while (0) -#elif defined(RADEON_COMMON_FOR_R200) +#elif defined(RADEON_R600) +#define WRITE_DEPTH( _x, _y, d )					\ +do {									\ +   GLuint *_ptr = (GLuint*)r600_ptr_depth( rrb, _x + x_off, _y + y_off );		\ +   GLuint tmp = *_ptr;				\ +   tmp &= 0xff000000;							\ +   tmp |= ((d) & 0x00ffffff);					\ +   *_ptr = tmp;					\ +} while (0) +#elif defined(RADEON_R200)  #define WRITE_DEPTH( _x, _y, d )					\  do {									\     GLuint *_ptr = (GLuint*)r200_depth_4byte( rrb, _x + x_off, _y + y_off );		\ @@ -394,12 +576,17 @@ do {									\  } while (0)  #endif -#if defined(COMPILE_R300) +#if defined(RADEON_R300)  #define READ_DEPTH( d, _x, _y )						\    do {									\      d = (*(GLuint*)(radeon_ptr_4byte(rrb, _x + x_off, _y + y_off)) & 0xffffff00) >> 8; \    }while(0) -#elif defined(RADEON_COMMON_FOR_R200) +#elif defined(RADEON_R600) +#define READ_DEPTH( d, _x, _y )						\ +  do {									\ +    d = (*(GLuint*)(r600_ptr_depth(rrb, _x + x_off, _y + y_off)) & 0x00ffffff); \ +  }while(0) +#elif defined(RADEON_R200)  #define READ_DEPTH( d, _x, _y )						\    do {									\      d = *(GLuint*)(r200_depth_4byte(rrb, _x + x_off, _y + y_off)) & 0x00ffffff; \ @@ -420,13 +607,27 @@ do {									\   */  #define VALUE_TYPE GLuint -#if defined(COMPILE_R300) +#if defined(RADEON_R300)  #define WRITE_DEPTH( _x, _y, d )					\  do {									\     GLuint *_ptr = (GLuint*)radeon_ptr_4byte( rrb, _x + x_off, _y + y_off );		\     *_ptr = d;								\  } while (0) -#elif defined(RADEON_COMMON_FOR_R200) +#elif defined(RADEON_R600) +#define WRITE_DEPTH( _x, _y, d )					\ +do {									\ +   GLuint *_ptr = (GLuint*)r600_ptr_depth( rrb, _x + x_off, _y + y_off );		\ +   GLuint tmp = *_ptr;				\ +   tmp &= 0xff000000;							\ +   tmp |= (((d) >> 8) & 0x00ffffff);					\ +   *_ptr = tmp;					\ +   _ptr = (GLuint*)r600_ptr_stencil(rrb, _x + x_off, _y + y_off);		\ +   tmp = *_ptr;				\ +   tmp &= 0xffffff00;							\ +   tmp |= (d) & 0xff;							\ +   *_ptr = tmp;					\ +} while (0) +#elif defined(RADEON_R200)  #define WRITE_DEPTH( _x, _y, d )					\  do {									\     GLuint *_ptr = (GLuint*)r200_depth_4byte( rrb, _x + x_off, _y + y_off );		\ @@ -442,12 +643,18 @@ do {									\  } while (0)  #endif -#if defined(COMPILE_R300) +#if defined(RADEON_R300)  #define READ_DEPTH( d, _x, _y )						\    do { \      d = (*(GLuint*)(radeon_ptr_4byte(rrb, _x + x_off, _y + y_off)));	\    }while(0) -#elif defined(RADEON_COMMON_FOR_R200) +#elif defined(RADEON_R600) +#define READ_DEPTH( d, _x, _y )						\ +  do { \ +    d = ((*(GLuint*)(r600_ptr_depth(rrb, _x + x_off, _y + y_off))) << 8) & 0xffffff00; \ +    d |= (*(GLuint*)(r600_ptr_stencil(rrb, _x + x_off, _y + y_off))) & 0x000000ff;	\ +  }while(0) +#elif defined(RADEON_R200)  #define READ_DEPTH( d, _x, _y )						\    do { \      d = s8z24_to_z24s8(*(GLuint*)(r200_depth_4byte(rrb, _x + x_off, _y + y_off)));	\ @@ -467,7 +674,7 @@ do {									\  /* 24 bit depth, 8 bit stencil depthbuffer functions   */ -#ifdef COMPILE_R300 +#ifdef RADEON_R300  #define WRITE_STENCIL( _x, _y, d )					\  do {									\     GLuint *_ptr = (GLuint*)radeon_ptr_4byte(rrb, _x + x_off, _y + y_off);		\ @@ -476,7 +683,16 @@ do {									\     tmp |= (d) & 0xff;							\     *_ptr = tmp;					\  } while (0) -#elif defined(RADEON_COMMON_FOR_R200) +#elif defined(RADEON_R600) +#define WRITE_STENCIL( _x, _y, d )					\ +do {									\ +   GLuint *_ptr = (GLuint*)r600_ptr_stencil(rrb, _x + x_off, _y + y_off);		\ +   GLuint tmp = *_ptr;				\ +   tmp &= 0xffffff00;							\ +   tmp |= (d) & 0xff;							\ +   *_ptr = tmp;					\ +} while (0) +#elif defined(RADEON_R200)  #define WRITE_STENCIL( _x, _y, d )					\  do {									\     GLuint *_ptr = (GLuint*)r200_depth_4byte(rrb, _x + x_off, _y + y_off);		\ @@ -496,14 +712,21 @@ do {									\  } while (0)  #endif -#ifdef COMPILE_R300 +#ifdef RADEON_R300  #define READ_STENCIL( d, _x, _y )					\  do {									\     GLuint *_ptr = (GLuint*)radeon_ptr_4byte( rrb, _x + x_off, _y + y_off );		\     GLuint tmp = *_ptr;				\     d = tmp & 0x000000ff;						\  } while (0) -#elif defined(RADEON_COMMON_FOR_R200) +#elif defined(RADEON_R600) +#define READ_STENCIL( d, _x, _y )					\ +do {									\ +   GLuint *_ptr = (GLuint*)r600_ptr_stencil( rrb, _x + x_off, _y + y_off );		\ +   GLuint tmp = *_ptr;				\ +   d = tmp & 0x000000ff;						\ +} while (0) +#elif defined(RADEON_R200)  #define READ_STENCIL( d, _x, _y )					\  do {									\     GLuint *_ptr = (GLuint*)r200_depth_4byte( rrb, _x + x_off, _y + y_off );		\ diff --git a/src/mesa/drivers/dri/radeon/radeon_texstate.c b/src/mesa/drivers/dri/radeon/radeon_texstate.c index 9d252aa74c..ae41b90efe 100644 --- a/src/mesa/drivers/dri/radeon/radeon_texstate.c +++ b/src/mesa/drivers/dri/radeon/radeon_texstate.c @@ -833,11 +833,14 @@ static void import_tex_obj_state( r100ContextPtr rmesa,     cmd[TEX_PP_TXFORMAT] |= texobj->pp_txformat & TEXOBJ_TXFORMAT_MASK;     cmd[TEX_PP_BORDER_COLOR] = texobj->pp_border_color; -   if (texobj->base.Target == GL_TEXTURE_RECTANGLE_NV) { -      GLuint *txr_cmd = RADEON_DB_STATE( txr[unit] ); +   if (texobj->pp_txformat & RADEON_TXFORMAT_NON_POWER2) { +      uint32_t *txr_cmd = &rmesa->hw.txr[unit].cmd[TXR_CMD_0];        txr_cmd[TXR_PP_TEX_SIZE] = texobj->pp_txsize; /* NPOT only! */        txr_cmd[TXR_PP_TEX_PITCH] = texobj->pp_txpitch; /* NPOT only! */ -      RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.txr[unit] ); +      RADEON_STATECHANGE( rmesa, txr[unit] ); +   } + +   if (texobj->base.Target == GL_TEXTURE_RECTANGLE_NV) {        se_coord_fmt |= RADEON_VTX_ST0_NONPARAMETRIC << unit;     }     else { @@ -1114,7 +1117,6 @@ static GLboolean radeon_validate_texture(GLcontext *ctx, struct gl_texture_objec     RADEON_STATECHANGE( rmesa, ctx );     rmesa->hw.ctx.cmd[CTX_PP_CNTL] |=        (RADEON_TEX_0_ENABLE | RADEON_TEX_BLEND_0_ENABLE) << unit; -     RADEON_STATECHANGE( rmesa, tcl );     rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_ST_BIT(unit); diff --git a/src/mesa/drivers/dri/radeon/radeon_texture.c b/src/mesa/drivers/dri/radeon/radeon_texture.c index fad3d1ceda..049284ef8c 100644 --- a/src/mesa/drivers/dri/radeon/radeon_texture.c +++ b/src/mesa/drivers/dri/radeon/radeon_texture.c @@ -659,11 +659,6 @@ static void radeon_teximage(  			if (dims == 3)  				_mesa_free(dstImageOffsets);  		} - -		/* SGIS_generate_mipmap */ -		if (level == texObj->BaseLevel && texObj->GenerateMipmap) { -			radeon_generate_mipmap(ctx, target, texObj); -		}  	}  	_mesa_unmap_teximage_pbo(ctx, packing); @@ -792,11 +787,6 @@ static void radeon_texsubimage(GLcontext* ctx, int dims, GLenum target, int leve  							     format, type, pixels, packing))  				_mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage");  		} - -		/* GL_SGIS_generate_mipmap */ -		if (level == texObj->BaseLevel && texObj->GenerateMipmap) { -			radeon_generate_mipmap(ctx, target, texObj); -		}  	}  	radeon_teximage_unmap(image); diff --git a/src/mesa/drivers/dri/s3v/s3v_tex.c b/src/mesa/drivers/dri/s3v/s3v_tex.c index 9b92519862..ec1182f34f 100644 --- a/src/mesa/drivers/dri/s3v/s3v_tex.c +++ b/src/mesa/drivers/dri/s3v/s3v_tex.c @@ -536,24 +536,13 @@ void s3vInitTextureFuncs( GLcontext *ctx )  #endif  	ctx->Driver.TexEnv = s3vTexEnv; -	ctx->Driver.ChooseTextureFormat = _mesa_choose_tex_format; -	ctx->Driver.TexImage1D = _mesa_store_teximage1d;  	ctx->Driver.TexImage2D = s3vTexImage2D; -	ctx->Driver.TexImage3D = _mesa_store_teximage3d; -	ctx->Driver.TexSubImage1D = _mesa_store_texsubimage1d;  	ctx->Driver.TexSubImage2D = s3vTexSubImage2D; -	ctx->Driver.TexSubImage3D = _mesa_store_texsubimage3d; -	ctx->Driver.CopyTexImage1D = _swrast_copy_teximage1d; -	ctx->Driver.CopyTexImage2D = _swrast_copy_teximage2d; -	ctx->Driver.CopyTexSubImage1D = _swrast_copy_texsubimage1d; -	ctx->Driver.CopyTexSubImage2D = _swrast_copy_texsubimage2d; -	ctx->Driver.CopyTexSubImage3D = _swrast_copy_texsubimage3d;  	ctx->Driver.BindTexture = s3vBindTexture;  	ctx->Driver.DeleteTexture = s3vDeleteTexture;  	ctx->Driver.TexParameter = s3vTexParameter;  	ctx->Driver.UpdateTexturePalette = 0;  	ctx->Driver.IsTextureResident = s3vIsTextureResident; -	ctx->Driver.TestProxyTexImage = _mesa_test_proxy_teximage;  	s3vInitTextureObjects( ctx );  } diff --git a/src/mesa/drivers/dri/tdfx/tdfx_tex.c b/src/mesa/drivers/dri/tdfx/tdfx_tex.c index 1f7257eaea..f6a48b3ae1 100644 --- a/src/mesa/drivers/dri/tdfx/tdfx_tex.c +++ b/src/mesa/drivers/dri/tdfx/tdfx_tex.c @@ -176,6 +176,54 @@ logbase2(int n)  } +static void +tdfxGenerateMipmap(GLcontext *ctx, GLenum target, +                   struct gl_texture_object *texObj) +{ +   GLint mipWidth, mipHeight; +   tdfxMipMapLevel *mip; +   struct gl_texture_image *mipImage; /* the new/next image */ +   struct gl_texture_image *texImage; +   const GLint maxLevels = _mesa_max_texture_levels(ctx, texObj->Target); +   GLint level = texObj->BaseLevel; +   GLsizei width, height, texelBytes; +   const tdfxMipMapLevel *mml; + +   texImage = _mesa_get_tex_image(ctx, texObj, target, level); +   assert(!texImage->IsCompressed); + +   mml = TDFX_TEXIMAGE_DATA(texImage); + +   width = texImage->Width; +   height = texImage->Height; +   while (level < texObj->MaxLevel && level < maxLevels - 1) { +      mipWidth = width / 2; +      if (!mipWidth) { +         mipWidth = 1; +      } +      mipHeight = height / 2; +      if (!mipHeight) { +         mipHeight = 1; +      } +      if ((mipWidth == width) && (mipHeight == height)) { +         break; +      } +      ++level; +      mipImage = _mesa_select_tex_image(ctx, texObj, target, level); +      mip = TDFX_TEXIMAGE_DATA(mipImage); +      _mesa_halve2x2_teximage2d(ctx, +                                texImage, +                                texelBytes, +                                mml->width, mml->height, +                                texImage->Data, mipImage->Data); +      texImage = mipImage; +      mml = mip; +      width = mipWidth; +      height = mipHeight; +   } +} + +  /*   * Compute various texture image parameters.   * Input:  w, h - source texture width and height @@ -1397,45 +1445,6 @@ tdfxTexImage2D(GLcontext *ctx, GLenum target, GLint level,                                            width, height, 1,                                            format, type, pixels, packing);         } - -      /* GL_SGIS_generate_mipmap */ -      if (level == texObj->BaseLevel && texObj->GenerateMipmap) { -         GLint mipWidth, mipHeight; -         tdfxMipMapLevel *mip; -         struct gl_texture_image *mipImage; -         const GLint maxLevels = _mesa_max_texture_levels(ctx, texObj->Target); -    -         assert(!texImage->IsCompressed); -    -         while (level < texObj->MaxLevel && level < maxLevels - 1) { -            mipWidth = width / 2; -            if (!mipWidth) { -               mipWidth = 1; -            } -            mipHeight = height / 2; -            if (!mipHeight) { -               mipHeight = 1; -            } -            if ((mipWidth == width) && (mipHeight == height)) { -               break; -            } -            _mesa_TexImage2D(target, ++level, internalFormat, -                             mipWidth, mipHeight, border, -                             format, type, -                             NULL); -            mipImage = _mesa_select_tex_image(ctx, texObj, target, level); -            mip = TDFX_TEXIMAGE_DATA(mipImage); -            _mesa_halve2x2_teximage2d(ctx, -                                      texImage, -                                      texelBytes, -                                      mml->width, mml->height, -                                      texImage->Data, mipImage->Data); -            texImage = mipImage; -            mml = mip; -            width = mipWidth; -            height = mipHeight; -         } -      }      }      RevalidateTexture(ctx, texObj); @@ -1507,44 +1516,6 @@ tdfxTexSubImage2D(GLcontext *ctx, GLenum target, GLint level,                                          format, type, pixels, packing);      } -   /* GL_SGIS_generate_mipmap */ -   if (level == texObj->BaseLevel && texObj->GenerateMipmap) { -      GLint mipWidth, mipHeight; -      tdfxMipMapLevel *mip; -      struct gl_texture_image *mipImage; -      const GLint maxLevels = _mesa_max_texture_levels(ctx, texObj->Target); - -      assert(!texImage->IsCompressed); - -      width = texImage->Width; -      height = texImage->Height; -      while (level < texObj->MaxLevel && level < maxLevels - 1) { -         mipWidth = width / 2; -         if (!mipWidth) { -            mipWidth = 1; -         } -         mipHeight = height / 2; -         if (!mipHeight) { -            mipHeight = 1; -         } -         if ((mipWidth == width) && (mipHeight == height)) { -            break; -         } -         ++level; -         mipImage = _mesa_select_tex_image(ctx, texObj, target, level); -         mip = TDFX_TEXIMAGE_DATA(mipImage); -         _mesa_halve2x2_teximage2d(ctx, -                                   texImage, -                                   texelBytes, -                                   mml->width, mml->height, -                                   texImage->Data, mipImage->Data); -         texImage = mipImage; -         mml = mip; -         width = mipWidth; -         height = mipHeight; -      } -   } -      ti->reloadImages = GL_TRUE; /* signal the image needs to be reloaded */      fxMesa->new_state |= TDFX_NEW_TEXTURE;  /* XXX this might be a bit much */  } @@ -1703,11 +1674,6 @@ tdfxCompressedTexImage2D (GLcontext *ctx, GLenum target,         MEMCPY(texImage->Data, data, texImage->CompressedSize);      } -    /* GL_SGIS_generate_mipmap */ -    if (level == texObj->BaseLevel && texObj->GenerateMipmap) { -       assert(!texImage->IsCompressed); -    } -      RevalidateTexture(ctx, texObj);      ti->reloadImages = GL_TRUE; @@ -1770,11 +1736,6 @@ tdfxCompressedTexSubImage2D( GLcontext *ctx, GLenum target,                                  texImage->Data);      } -    /* GL_SGIS_generate_mipmap */ -    if (level == texObj->BaseLevel && texObj->GenerateMipmap) { -       assert(!texImage->IsCompressed); -    } -      RevalidateTexture(ctx, texObj);      ti->reloadImages = GL_TRUE; @@ -1914,4 +1875,5 @@ void tdfxInitTextureFuncs( struct dd_function_table *functions )     functions->CompressedTexImage2D	= tdfxCompressedTexImage2D;     functions->CompressedTexSubImage2D	= tdfxCompressedTexSubImage2D;     functions->UpdateTexturePalette      = tdfxUpdateTexturePalette; +   functions->GenerateMipmap            = tdfxGenerateMipmap;  } diff --git a/src/mesa/drivers/dri/unichrome/via_tex.c b/src/mesa/drivers/dri/unichrome/via_tex.c index d2010f0907..54073e7691 100644 --- a/src/mesa/drivers/dri/unichrome/via_tex.c +++ b/src/mesa/drivers/dri/unichrome/via_tex.c @@ -818,11 +818,6 @@ static void viaTexImage(GLcontext *ctx,        }     } -   /* GL_SGIS_generate_mipmap */ -   if (level == texObj->BaseLevel && texObj->GenerateMipmap) { -      _mesa_generate_mipmap(ctx, target, texObj); -   } -     _mesa_unmap_teximage_pbo(ctx, packing);  } diff --git a/src/mesa/main/dlist.c b/src/mesa/main/dlist.c index d721f699fd..9c25de4187 100644 --- a/src/mesa/main/dlist.c +++ b/src/mesa/main/dlist.c @@ -329,6 +329,34 @@ typedef enum     OPCODE_STENCIL_OP_SEPARATE,     OPCODE_STENCIL_MASK_SEPARATE, +   /* GL_ARB_shader_objects */ +   OPCODE_USE_PROGRAM, +   OPCODE_UNIFORM_1F, +   OPCODE_UNIFORM_2F, +   OPCODE_UNIFORM_3F, +   OPCODE_UNIFORM_4F, +   OPCODE_UNIFORM_1FV, +   OPCODE_UNIFORM_2FV, +   OPCODE_UNIFORM_3FV, +   OPCODE_UNIFORM_4FV, +   OPCODE_UNIFORM_1I, +   OPCODE_UNIFORM_2I, +   OPCODE_UNIFORM_3I, +   OPCODE_UNIFORM_4I, +   OPCODE_UNIFORM_1IV, +   OPCODE_UNIFORM_2IV, +   OPCODE_UNIFORM_3IV, +   OPCODE_UNIFORM_4IV, +   OPCODE_UNIFORM_MATRIX22, +   OPCODE_UNIFORM_MATRIX33, +   OPCODE_UNIFORM_MATRIX44, +   OPCODE_UNIFORM_MATRIX23, +   OPCODE_UNIFORM_MATRIX32, +   OPCODE_UNIFORM_MATRIX24, +   OPCODE_UNIFORM_MATRIX42, +   OPCODE_UNIFORM_MATRIX34, +   OPCODE_UNIFORM_MATRIX43, +     /* GL_EXT_framebuffer_blit */     OPCODE_BLIT_FRAMEBUFFER, @@ -576,6 +604,30 @@ _mesa_delete_list(GLcontext *ctx, struct gl_display_list *dlist)              n += InstSize[n[0].opcode];              break;  #endif +         case OPCODE_UNIFORM_1FV: +         case OPCODE_UNIFORM_2FV: +         case OPCODE_UNIFORM_3FV: +         case OPCODE_UNIFORM_4FV: +         case OPCODE_UNIFORM_1IV: +         case OPCODE_UNIFORM_2IV: +         case OPCODE_UNIFORM_3IV: +         case OPCODE_UNIFORM_4IV: +            _mesa_free(n[3].data); +            n += InstSize[n[0].opcode]; +            break; +         case OPCODE_UNIFORM_MATRIX22: +         case OPCODE_UNIFORM_MATRIX33: +         case OPCODE_UNIFORM_MATRIX44: +         case OPCODE_UNIFORM_MATRIX24: +         case OPCODE_UNIFORM_MATRIX42: +         case OPCODE_UNIFORM_MATRIX23: +         case OPCODE_UNIFORM_MATRIX32: +         case OPCODE_UNIFORM_MATRIX34: +         case OPCODE_UNIFORM_MATRIX43: +            _mesa_free(n[4].data); +            n += InstSize[n[0].opcode]; +            break; +           case OPCODE_CONTINUE:              n = (Node *) n[1].next;              _mesa_free(block); @@ -5804,6 +5856,493 @@ save_ProvokingVertexEXT(GLenum mode)  } +/* aka UseProgram() */ +static void GLAPIENTRY +save_UseProgramObjectARB(GLhandleARB program) +{ +   GET_CURRENT_CONTEXT(ctx); +   Node *n; +   ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); +   n = ALLOC_INSTRUCTION(ctx, OPCODE_USE_PROGRAM, 1); +   if (n) { +      n[1].ui = program; +   } +   if (ctx->ExecuteFlag) { +      CALL_UseProgramObjectARB(ctx->Exec, (program)); +   } +} + + +static void GLAPIENTRY +save_Uniform1fARB(GLint location, GLfloat x) +{ +   GET_CURRENT_CONTEXT(ctx); +   Node *n; +   ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); +   n = ALLOC_INSTRUCTION(ctx, OPCODE_UNIFORM_1F, 2); +   if (n) { +      n[1].i = location; +      n[2].f = x; +   } +   if (ctx->ExecuteFlag) { +      CALL_Uniform1fARB(ctx->Exec, (location, x)); +   } +} + + +static void GLAPIENTRY +save_Uniform2fARB(GLint location, GLfloat x, GLfloat y) +{ +   GET_CURRENT_CONTEXT(ctx); +   Node *n; +   ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); +   n = ALLOC_INSTRUCTION(ctx, OPCODE_UNIFORM_2F, 3); +   if (n) { +      n[1].i = location; +      n[2].f = x; +      n[3].f = y; +   } +   if (ctx->ExecuteFlag) { +      CALL_Uniform2fARB(ctx->Exec, (location, x, y)); +   } +} + + +static void GLAPIENTRY +save_Uniform3fARB(GLint location, GLfloat x, GLfloat y, GLfloat z) +{ +   GET_CURRENT_CONTEXT(ctx); +   Node *n; +   ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); +   n = ALLOC_INSTRUCTION(ctx, OPCODE_UNIFORM_3F, 4); +   if (n) { +      n[1].i = location; +      n[2].f = x; +      n[3].f = y; +      n[4].f = z; +   } +   if (ctx->ExecuteFlag) { +      CALL_Uniform3fARB(ctx->Exec, (location, x, y, z)); +   } +} + + +static void GLAPIENTRY +save_Uniform4fARB(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w) +{ +   GET_CURRENT_CONTEXT(ctx); +   Node *n; +   ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); +   n = ALLOC_INSTRUCTION(ctx, OPCODE_UNIFORM_4F, 5); +   if (n) { +      n[1].i = location; +      n[2].f = x; +      n[3].f = y; +      n[4].f = z; +      n[5].f = w; +   } +   if (ctx->ExecuteFlag) { +      CALL_Uniform4fARB(ctx->Exec, (location, x, y, z, w)); +   } +} + + +/** Return copy of memory */ +static void * +memdup(const void *src, GLsizei bytes) +{ +   void *b = bytes >= 0 ? _mesa_malloc(bytes) : NULL; +   if (b) +      _mesa_memcpy(b, src, bytes); +   return b; +} + + +static void GLAPIENTRY +save_Uniform1fvARB(GLint location, GLsizei count, const GLfloat *v) +{ +   GET_CURRENT_CONTEXT(ctx); +   Node *n; +   ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); +   n = ALLOC_INSTRUCTION(ctx, OPCODE_UNIFORM_1FV, 3); +   if (n) { +      n[1].i = location; +      n[2].i = count; +      n[3].data = memdup(v, count * 1 * sizeof(GLfloat)); +   } +   if (ctx->ExecuteFlag) { +      CALL_Uniform1fvARB(ctx->Exec, (location, count, v)); +   } +} + +static void GLAPIENTRY +save_Uniform2fvARB(GLint location, GLsizei count, const GLfloat *v) +{ +   GET_CURRENT_CONTEXT(ctx); +   Node *n; +   ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); +   n = ALLOC_INSTRUCTION(ctx, OPCODE_UNIFORM_2FV, 3); +   if (n) { +      n[1].i = location; +      n[2].i = count; +      n[3].data = memdup(v, count * 2 * sizeof(GLfloat)); +   } +   if (ctx->ExecuteFlag) { +      CALL_Uniform2fvARB(ctx->Exec, (location, count, v)); +   } +} + +static void GLAPIENTRY +save_Uniform3fvARB(GLint location, GLsizei count, const GLfloat *v) +{ +   GET_CURRENT_CONTEXT(ctx); +   Node *n; +   ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); +   n = ALLOC_INSTRUCTION(ctx, OPCODE_UNIFORM_3FV, 3); +   if (n) { +      n[1].i = location; +      n[2].i = count; +      n[3].data = memdup(v, count * 3 * sizeof(GLfloat)); +   } +   if (ctx->ExecuteFlag) { +      CALL_Uniform3fvARB(ctx->Exec, (location, count, v)); +   } +} + +static void GLAPIENTRY +save_Uniform4fvARB(GLint location, GLsizei count, const GLfloat *v) +{ +   GET_CURRENT_CONTEXT(ctx); +   Node *n; +   ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); +   n = ALLOC_INSTRUCTION(ctx, OPCODE_UNIFORM_4FV, 3); +   if (n) { +      n[1].i = location; +      n[2].i = count; +      n[3].data = memdup(v, count * 4 * sizeof(GLfloat)); +   } +   if (ctx->ExecuteFlag) { +      CALL_Uniform4fvARB(ctx->Exec, (location, count, v)); +   } +} + + +static void GLAPIENTRY +save_Uniform1iARB(GLint location, GLint x) +{ +   GET_CURRENT_CONTEXT(ctx); +   Node *n; +   ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); +   n = ALLOC_INSTRUCTION(ctx, OPCODE_UNIFORM_1I, 2); +   if (n) { +      n[1].i = location; +      n[2].i = x; +   } +   if (ctx->ExecuteFlag) { +      CALL_Uniform1iARB(ctx->Exec, (location, x)); +   } +} + +static void GLAPIENTRY +save_Uniform2iARB(GLint location, GLint x, GLint y) +{ +   GET_CURRENT_CONTEXT(ctx); +   Node *n; +   ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); +   n = ALLOC_INSTRUCTION(ctx, OPCODE_UNIFORM_2I, 3); +   if (n) { +      n[1].i = location; +      n[2].i = x; +      n[3].i = y; +   } +   if (ctx->ExecuteFlag) { +      CALL_Uniform2iARB(ctx->Exec, (location, x, y)); +   } +} + +static void GLAPIENTRY +save_Uniform3iARB(GLint location, GLint x, GLint y, GLint z) +{ +   GET_CURRENT_CONTEXT(ctx); +   Node *n; +   ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); +   n = ALLOC_INSTRUCTION(ctx, OPCODE_UNIFORM_3I, 4); +   if (n) { +      n[1].i = location; +      n[2].i = x; +      n[3].i = y; +      n[4].i = z; +   } +   if (ctx->ExecuteFlag) { +      CALL_Uniform3iARB(ctx->Exec, (location, x, y, z)); +   } +} + +static void GLAPIENTRY +save_Uniform4iARB(GLint location, GLint x, GLint y, GLint z, GLint w) +{ +   GET_CURRENT_CONTEXT(ctx); +   Node *n; +   ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); +   n = ALLOC_INSTRUCTION(ctx, OPCODE_UNIFORM_4I, 5); +   if (n) { +      n[1].i = location; +      n[2].i = x; +      n[3].i = y; +      n[4].i = z; +      n[5].i = w; +   } +   if (ctx->ExecuteFlag) { +      CALL_Uniform4iARB(ctx->Exec, (location, x, y, z, w)); +   } +} + + + +static void GLAPIENTRY +save_Uniform1ivARB(GLint location, GLsizei count, const GLint *v) +{ +   GET_CURRENT_CONTEXT(ctx); +   Node *n; +   ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); +   n = ALLOC_INSTRUCTION(ctx, OPCODE_UNIFORM_1IV, 3); +   if (n) { +      n[1].i = location; +      n[2].i = count; +      n[3].data = memdup(v, count * 1 * sizeof(GLint)); +   } +   if (ctx->ExecuteFlag) { +      CALL_Uniform1ivARB(ctx->Exec, (location, count, v)); +   } +} + +static void GLAPIENTRY +save_Uniform2ivARB(GLint location, GLsizei count, const GLint *v) +{ +   GET_CURRENT_CONTEXT(ctx); +   Node *n; +   ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); +   n = ALLOC_INSTRUCTION(ctx, OPCODE_UNIFORM_2IV, 3); +   if (n) { +      n[1].i = location; +      n[2].i = count; +      n[3].data = memdup(v, count * 2 * sizeof(GLint)); +   } +   if (ctx->ExecuteFlag) { +      CALL_Uniform2ivARB(ctx->Exec, (location, count, v)); +   } +} + +static void GLAPIENTRY +save_Uniform3ivARB(GLint location, GLsizei count, const GLint *v) +{ +   GET_CURRENT_CONTEXT(ctx); +   Node *n; +   ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); +   n = ALLOC_INSTRUCTION(ctx, OPCODE_UNIFORM_3IV, 3); +   if (n) { +      n[1].i = location; +      n[2].i = count; +      n[3].data = memdup(v, count * 3 * sizeof(GLint)); +   } +   if (ctx->ExecuteFlag) { +      CALL_Uniform3ivARB(ctx->Exec, (location, count, v)); +   } +} + +static void GLAPIENTRY +save_Uniform4ivARB(GLint location, GLsizei count, const GLint *v) +{ +   GET_CURRENT_CONTEXT(ctx); +   Node *n; +   ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); +   n = ALLOC_INSTRUCTION(ctx, OPCODE_UNIFORM_4IV, 3); +   if (n) { +      n[1].i = location; +      n[2].i = count; +      n[3].data = memdup(v, count * 4 * sizeof(GLfloat)); +   } +   if (ctx->ExecuteFlag) { +      CALL_Uniform4ivARB(ctx->Exec, (location, count, v)); +   } +} + + +static void GLAPIENTRY +save_UniformMatrix2fvARB(GLint location, GLsizei count, GLboolean transpose, +                         const GLfloat *m) +{ +   GET_CURRENT_CONTEXT(ctx); +   Node *n; +   ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); +   n = ALLOC_INSTRUCTION(ctx, OPCODE_UNIFORM_MATRIX22, 4); +   if (n) { +      n[1].i = location; +      n[2].i = count; +      n[3].b = transpose; +      n[4].data = memdup(m, count * 2 * 2 * sizeof(GLfloat)); +   } +   if (ctx->ExecuteFlag) { +      CALL_UniformMatrix2fvARB(ctx->Exec, (location, count, transpose, m)); +   } +} + +static void GLAPIENTRY +save_UniformMatrix3fvARB(GLint location, GLsizei count, GLboolean transpose, +                         const GLfloat *m) +{ +   GET_CURRENT_CONTEXT(ctx); +   Node *n; +   ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); +   n = ALLOC_INSTRUCTION(ctx, OPCODE_UNIFORM_MATRIX33, 4); +   if (n) { +      n[1].i = location; +      n[2].i = count; +      n[3].b = transpose; +      n[4].data = memdup(m, count * 3 * 3 * sizeof(GLfloat)); +   } +   if (ctx->ExecuteFlag) { +      CALL_UniformMatrix3fvARB(ctx->Exec, (location, count, transpose, m)); +   } +} + +static void GLAPIENTRY +save_UniformMatrix4fvARB(GLint location, GLsizei count, GLboolean transpose, +                         const GLfloat *m) +{ +   GET_CURRENT_CONTEXT(ctx); +   Node *n; +   ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); +   n = ALLOC_INSTRUCTION(ctx, OPCODE_UNIFORM_MATRIX44, 4); +   if (n) { +      n[1].i = location; +      n[2].i = count; +      n[3].b = transpose; +      n[4].data = memdup(m, count * 4 * 4 * sizeof(GLfloat)); +   } +   if (ctx->ExecuteFlag) { +      CALL_UniformMatrix4fvARB(ctx->Exec, (location, count, transpose, m)); +   } +} + + +static void GLAPIENTRY +save_UniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, +                        const GLfloat *m) +{ +   GET_CURRENT_CONTEXT(ctx); +   Node *n; +   ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); +   n = ALLOC_INSTRUCTION(ctx, OPCODE_UNIFORM_MATRIX23, 4); +   if (n) { +      n[1].i = location; +      n[2].i = count; +      n[3].b = transpose; +      n[4].data = memdup(m, count * 2 * 3 * sizeof(GLfloat)); +   } +   if (ctx->ExecuteFlag) { +      CALL_UniformMatrix2x3fv(ctx->Exec, (location, count, transpose, m)); +   } +} + +static void GLAPIENTRY +save_UniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, +                        const GLfloat *m) +{ +   GET_CURRENT_CONTEXT(ctx); +   Node *n; +   ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); +   n = ALLOC_INSTRUCTION(ctx, OPCODE_UNIFORM_MATRIX32, 4); +   if (n) { +      n[1].i = location; +      n[2].i = count; +      n[3].b = transpose; +      n[4].data = memdup(m, count * 3 * 2 * sizeof(GLfloat)); +   } +   if (ctx->ExecuteFlag) { +      CALL_UniformMatrix3x2fv(ctx->Exec, (location, count, transpose, m)); +   } +} + + +static void GLAPIENTRY +save_UniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, +                        const GLfloat *m) +{ +   GET_CURRENT_CONTEXT(ctx); +   Node *n; +   ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); +   n = ALLOC_INSTRUCTION(ctx, OPCODE_UNIFORM_MATRIX24, 4); +   if (n) { +      n[1].i = location; +      n[2].i = count; +      n[3].b = transpose; +      n[4].data = memdup(m, count * 2 * 4 * sizeof(GLfloat)); +   } +   if (ctx->ExecuteFlag) { +      CALL_UniformMatrix2x4fv(ctx->Exec, (location, count, transpose, m)); +   } +} + +static void GLAPIENTRY +save_UniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, +                        const GLfloat *m) +{ +   GET_CURRENT_CONTEXT(ctx); +   Node *n; +   ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); +   n = ALLOC_INSTRUCTION(ctx, OPCODE_UNIFORM_MATRIX42, 4); +   if (n) { +      n[1].i = location; +      n[2].i = count; +      n[3].b = transpose; +      n[4].data = memdup(m, count * 4 * 2 * sizeof(GLfloat)); +   } +   if (ctx->ExecuteFlag) { +      CALL_UniformMatrix4x2fv(ctx->Exec, (location, count, transpose, m)); +   } +} + + +static void GLAPIENTRY +save_UniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, +                        const GLfloat *m) +{ +   GET_CURRENT_CONTEXT(ctx); +   Node *n; +   ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); +   n = ALLOC_INSTRUCTION(ctx, OPCODE_UNIFORM_MATRIX34, 4); +   if (n) { +      n[1].i = location; +      n[2].i = count; +      n[3].b = transpose; +      n[4].data = memdup(m, count * 3 * 4 * sizeof(GLfloat)); +   } +   if (ctx->ExecuteFlag) { +      CALL_UniformMatrix3x4fv(ctx->Exec, (location, count, transpose, m)); +   } +} + +static void GLAPIENTRY +save_UniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, +                        const GLfloat *m) +{ +   GET_CURRENT_CONTEXT(ctx); +   Node *n; +   ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); +   n = ALLOC_INSTRUCTION(ctx, OPCODE_UNIFORM_MATRIX43, 4); +   if (n) { +      n[1].i = location; +      n[2].i = count; +      n[3].b = transpose; +      n[4].data = memdup(m, count * 4 * 3 * sizeof(GLfloat)); +   } +   if (ctx->ExecuteFlag) { +      CALL_UniformMatrix4x3fv(ctx->Exec, (location, count, transpose, m)); +   } +} + +  /**   * Save an error-generating command into display list. @@ -6640,6 +7179,98 @@ execute_list(GLcontext *ctx, GLuint list)                                                  n[9].i, n[10].e));  	    break;  #endif + +	 case OPCODE_USE_PROGRAM: +	    CALL_UseProgramObjectARB(ctx->Exec, (n[1].ui)); +	    break; +	 case OPCODE_UNIFORM_1F: +	    CALL_Uniform1fARB(ctx->Exec, (n[1].i, n[2].f)); +	    break; +	 case OPCODE_UNIFORM_2F: +	    CALL_Uniform2fARB(ctx->Exec, (n[1].i, n[2].f, n[3].f)); +	    break; +	 case OPCODE_UNIFORM_3F: +	    CALL_Uniform3fARB(ctx->Exec, (n[1].i, n[2].f, n[3].f, n[4].f)); +	    break; +	 case OPCODE_UNIFORM_4F: +	    CALL_Uniform4fARB(ctx->Exec, +                              (n[1].i, n[2].f, n[3].f, n[4].f, n[5].f)); +	    break; +	 case OPCODE_UNIFORM_1FV: +	    CALL_Uniform1fvARB(ctx->Exec, (n[1].i, n[2].i, n[3].data)); +	    break; +	 case OPCODE_UNIFORM_2FV: +	    CALL_Uniform2fvARB(ctx->Exec, (n[1].i, n[2].i, n[3].data)); +	    break; +	 case OPCODE_UNIFORM_3FV: +	    CALL_Uniform3fvARB(ctx->Exec, (n[1].i, n[2].i, n[3].data)); +	    break; +	 case OPCODE_UNIFORM_4FV: +	    CALL_Uniform4fvARB(ctx->Exec, (n[1].i, n[2].i, n[3].data)); +	    break; +	 case OPCODE_UNIFORM_1I: +	    CALL_Uniform1iARB(ctx->Exec, (n[1].i, n[2].i)); +	    break; +	 case OPCODE_UNIFORM_2I: +	    CALL_Uniform2iARB(ctx->Exec, (n[1].i, n[2].i, n[3].i)); +	    break; +	 case OPCODE_UNIFORM_3I: +	    CALL_Uniform3iARB(ctx->Exec, (n[1].i, n[2].i, n[3].i, n[4].i)); +	    break; +	 case OPCODE_UNIFORM_4I: +	    CALL_Uniform4iARB(ctx->Exec, +                              (n[1].i, n[2].i, n[3].i, n[4].i, n[5].i)); +	    break; +	 case OPCODE_UNIFORM_1IV: +	    CALL_Uniform1ivARB(ctx->Exec, (n[1].i, n[2].i, n[3].data)); +	    break; +	 case OPCODE_UNIFORM_2IV: +	    CALL_Uniform2ivARB(ctx->Exec, (n[1].i, n[2].i, n[3].data)); +	    break; +	 case OPCODE_UNIFORM_3IV: +	    CALL_Uniform3ivARB(ctx->Exec, (n[1].i, n[2].i, n[3].data)); +	    break; +	 case OPCODE_UNIFORM_4IV: +	    CALL_Uniform4ivARB(ctx->Exec, (n[1].i, n[2].i, n[3].data)); +	    break; + +	 case OPCODE_UNIFORM_MATRIX22: +	    CALL_UniformMatrix2fvARB(ctx->Exec, +                                     (n[1].i, n[2].i, n[3].b, n[4].data)); +	    break; +	 case OPCODE_UNIFORM_MATRIX33: +	    CALL_UniformMatrix3fvARB(ctx->Exec, +                                     (n[1].i, n[2].i, n[3].b, n[4].data)); +	    break; +	 case OPCODE_UNIFORM_MATRIX44: +	    CALL_UniformMatrix4fvARB(ctx->Exec, +                                     (n[1].i, n[2].i, n[3].b, n[4].data)); +	    break; +	 case OPCODE_UNIFORM_MATRIX23: +	    CALL_UniformMatrix2x3fv(ctx->Exec, +                                    (n[1].i, n[2].i, n[3].b, n[4].data)); +	    break; +	 case OPCODE_UNIFORM_MATRIX32: +	    CALL_UniformMatrix3x2fv(ctx->Exec, +                                    (n[1].i, n[2].i, n[3].b, n[4].data)); +	    break; +	 case OPCODE_UNIFORM_MATRIX24: +	    CALL_UniformMatrix2x4fv(ctx->Exec, +                                    (n[1].i, n[2].i, n[3].b, n[4].data)); +	    break; +	 case OPCODE_UNIFORM_MATRIX42: +	    CALL_UniformMatrix4x2fv(ctx->Exec, +                                    (n[1].i, n[2].i, n[3].b, n[4].data)); +	    break; +	 case OPCODE_UNIFORM_MATRIX34: +	    CALL_UniformMatrix3x4fv(ctx->Exec, +                                    (n[1].i, n[2].i, n[3].b, n[4].data)); +	    break; +	 case OPCODE_UNIFORM_MATRIX43: +	    CALL_UniformMatrix4x3fv(ctx->Exec, +                                    (n[1].i, n[2].i, n[3].b, n[4].data)); +	    break; +           case OPCODE_TEX_BUMP_PARAMETER_ATI:              {                 GLfloat values[4]; @@ -8309,6 +8940,34 @@ _mesa_init_dlist_table(struct _glapi_table *table)     SET_BlitFramebufferEXT(table, save_BlitFramebufferEXT);  #endif +   /* GL_ARB_shader_objects */ +   SET_UseProgramObjectARB(table, save_UseProgramObjectARB); +   SET_Uniform1fARB(table, save_Uniform1fARB); +   SET_Uniform2fARB(table, save_Uniform2fARB); +   SET_Uniform3fARB(table, save_Uniform3fARB); +   SET_Uniform4fARB(table, save_Uniform4fARB); +   SET_Uniform1fvARB(table, save_Uniform1fvARB); +   SET_Uniform2fvARB(table, save_Uniform2fvARB); +   SET_Uniform3fvARB(table, save_Uniform3fvARB); +   SET_Uniform4fvARB(table, save_Uniform4fvARB); +   SET_Uniform1iARB(table, save_Uniform1iARB); +   SET_Uniform2iARB(table, save_Uniform2iARB); +   SET_Uniform3iARB(table, save_Uniform3iARB); +   SET_Uniform4iARB(table, save_Uniform4iARB); +   SET_Uniform1ivARB(table, save_Uniform1ivARB); +   SET_Uniform2ivARB(table, save_Uniform2ivARB); +   SET_Uniform3ivARB(table, save_Uniform3ivARB); +   SET_Uniform4ivARB(table, save_Uniform4ivARB); +   SET_UniformMatrix2fvARB(table, save_UniformMatrix2fvARB); +   SET_UniformMatrix3fvARB(table, save_UniformMatrix3fvARB); +   SET_UniformMatrix4fvARB(table, save_UniformMatrix4fvARB); +   SET_UniformMatrix2x3fv(table, save_UniformMatrix2x3fv); +   SET_UniformMatrix3x2fv(table, save_UniformMatrix3x2fv); +   SET_UniformMatrix2x4fv(table, save_UniformMatrix2x4fv); +   SET_UniformMatrix4x2fv(table, save_UniformMatrix4x2fv); +   SET_UniformMatrix3x4fv(table, save_UniformMatrix3x4fv); +   SET_UniformMatrix4x3fv(table, save_UniformMatrix4x3fv); +     /* ARB 30/31/32. GL_ARB_shader_objects, GL_ARB_vertex/fragment_shader */     SET_BindAttribLocationARB(table, exec_BindAttribLocationARB);     SET_GetAttribLocationARB(table, exec_GetAttribLocationARB); diff --git a/src/mesa/main/extensions.c b/src/mesa/main/extensions.c index 2ad66de7dd..6b11aceb5c 100644 --- a/src/mesa/main/extensions.c +++ b/src/mesa/main/extensions.c @@ -63,6 +63,7 @@ static const struct {     { OFF, "GL_ARB_pixel_buffer_object",        F(EXT_pixel_buffer_object) },     { OFF, "GL_ARB_point_parameters",           F(EXT_point_parameters) },     { OFF, "GL_ARB_point_sprite",               F(ARB_point_sprite) }, +   { OFF, "GL_ARB_provoking_vertex",           F(EXT_provoking_vertex) },     { OFF, "GL_ARB_seamless_cube_map",          F(ARB_seamless_cube_map) },     { OFF, "GL_ARB_shader_objects",             F(ARB_shader_objects) },     { OFF, "GL_ARB_shading_language_100",       F(ARB_shading_language_100) }, diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c index 825a23090b..13f49da5a7 100644 --- a/src/mesa/main/fbobject.c +++ b/src/mesa/main/fbobject.c @@ -46,6 +46,10 @@  #include "texstore.h" +/** Set this to 1 to help debug FBO incompleteness problems */ +#define DEBUG_FBO 0 + +  /**   * Notes:   * @@ -308,8 +312,8 @@ _mesa_framebuffer_renderbuffer(GLcontext *ctx, struct gl_framebuffer *fb,  static void  att_incomplete(const char *msg)  { -#if 0 -   _mesa_printf("attachment incomplete: %s\n", msg); +#if DEBUG_FBO +   _mesa_debug(NULL, "attachment incomplete: %s\n", msg);  #else     (void) msg;  #endif @@ -317,6 +321,23 @@ att_incomplete(const char *msg)  /** + * For debug only. + */ +static void +fbo_incomplete(const char *msg, int index) +{ +#if DEBUG_FBO +   _mesa_debug(NULL, "FBO Incomplete: %s [%d]\n", msg, index); +#else +   (void) msg; +   (void) index; +#endif +} + + + + +/**   * Test if an attachment point is complete and update its Complete field.   * \param format if GL_COLOR, this is a color attachment point,   *               if GL_DEPTH, this is a depth component attachment point, @@ -468,20 +489,6 @@ test_attachment_completeness(const GLcontext *ctx, GLenum format,  /** - * Helpful for debugging - */ -static void -fbo_incomplete(const char *msg, int index) -{ -   (void) msg; -   (void) index; -   /* -   _mesa_debug(NULL, "FBO Incomplete: %s [%d]\n", msg, index); -   */ -} - - -/**   * Test if the given framebuffer object is complete and update its   * Status field with the results.   * Calls the ctx->Driver.ValidateFramebuffer() function to allow the @@ -1953,13 +1960,13 @@ _mesa_GenerateMipmapEXT(GLenum target)     _mesa_lock_texture(ctx, texObj);     if (target == GL_TEXTURE_CUBE_MAP) { -      int face; - +      GLuint face;        for (face = 0; face < 6; face++)  	 ctx->Driver.GenerateMipmap(ctx,  				    GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB + face,  				    texObj); -   } else { +   } +   else {        ctx->Driver.GenerateMipmap(ctx, target, texObj);     }     _mesa_unlock_texture(ctx, texObj); diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c index 8228303040..b0aa04e9aa 100644 --- a/src/mesa/main/teximage.c +++ b/src/mesa/main/teximage.c @@ -2075,6 +2075,23 @@ update_fbo_texture(GLcontext *ctx, struct gl_texture_object *texObj,  } +/** + * If the texture object's GenerateMipmap flag is set and we've + * changed the texture base level image, regenerate the rest of the + * mipmap levels now. + */ +static INLINE void +check_gen_mipmap(GLcontext *ctx, GLenum target, +                 struct gl_texture_object *texObj, GLint level) +{ +   ASSERT(target != GL_TEXTURE_CUBE_MAP); +   if (texObj->GenerateMipmap && level == texObj->BaseLevel) { +      ASSERT(ctx->Driver.GenerateMipmap); +      ctx->Driver.GenerateMipmap(ctx, target, texObj); +   } +} + +  /** Debug helper: override the user-requested internal format */  static GLenum  override_internal_format(GLenum internalFormat, GLint width, GLint height) @@ -2161,36 +2178,36 @@ _mesa_TexImage1D( GLenum target, GLint level, GLint internalFormat,  	 texImage = _mesa_get_tex_image(ctx, texObj, target, level);  	 if (!texImage) {  	    _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage1D"); -	    goto out; -	 } -       -	 if (texImage->Data) { -	    ctx->Driver.FreeTexImageData( ctx, texImage );  	 } +         else { +            if (texImage->Data) { +               ctx->Driver.FreeTexImageData( ctx, texImage ); +            } + +            ASSERT(texImage->Data == NULL); + +            clear_teximage_fields(texImage); /* not really needed, but helpful */ +            _mesa_init_teximage_fields(ctx, target, texImage, +                                       postConvWidth, 1, 1, +                                       border, internalFormat); + +            /* Give the texture to the driver.  <pixels> may be null. */ +            ASSERT(ctx->Driver.TexImage1D); +            ctx->Driver.TexImage1D(ctx, target, level, internalFormat, +                                   width, border, format, type, pixels, +                                   &ctx->Unpack, texObj, texImage); -	 ASSERT(texImage->Data == NULL); +            ASSERT(texImage->TexFormat); -	 clear_teximage_fields(texImage); /* not really needed, but helpful */ -	 _mesa_init_teximage_fields(ctx, target, texImage, -				    postConvWidth, 1, 1, -				    border, internalFormat); -	  -	 ASSERT(ctx->Driver.TexImage1D); +            check_gen_mipmap(ctx, target, texObj, level); -	 /* Give the texture to the driver!  <pixels> may be null! */ -	 (*ctx->Driver.TexImage1D)(ctx, target, level, internalFormat, -				   width, border, format, type, pixels, -				   &ctx->Unpack, texObj, texImage); -	  -	 ASSERT(texImage->TexFormat); +            update_fbo_texture(ctx, texObj, face, level); -	 update_fbo_texture(ctx, texObj, face, level); -	  -	 /* state update */ -	 texObj->_Complete = GL_FALSE; -	 ctx->NewState |= _NEW_TEXTURE; +            /* state update */ +            texObj->_Complete = GL_FALSE; +            ctx->NewState |= _NEW_TEXTURE; +         }        } -   out:        _mesa_unlock_texture(ctx, texObj);     }     else if (target == GL_PROXY_TEXTURE_1D) { @@ -2269,35 +2286,35 @@ _mesa_TexImage2D( GLenum target, GLint level, GLint internalFormat,  	 texImage = _mesa_get_tex_image(ctx, texObj, target, level);  	 if (!texImage) {  	    _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D"); -	    goto out; -	 } -	  -	 if (texImage->Data) { -	    ctx->Driver.FreeTexImageData( ctx, texImage );  	 } -	  -	 ASSERT(texImage->Data == NULL); -	 clear_teximage_fields(texImage); /* not really needed, but helpful */ -	 _mesa_init_teximage_fields(ctx, target, texImage, -				    postConvWidth, postConvHeight, 1, -				    border, internalFormat); -	  -	 ASSERT(ctx->Driver.TexImage2D); +         else { +            if (texImage->Data) { +               ctx->Driver.FreeTexImageData( ctx, texImage ); +            } + +            ASSERT(texImage->Data == NULL); +            clear_teximage_fields(texImage); /* not really needed, but helpful */ +            _mesa_init_teximage_fields(ctx, target, texImage, +                                       postConvWidth, postConvHeight, 1, +                                       border, internalFormat); + +            /* Give the texture to the driver.  <pixels> may be null. */ +            ASSERT(ctx->Driver.TexImage2D); +            ctx->Driver.TexImage2D(ctx, target, level, internalFormat, +                                   width, height, border, format, type, +                                   pixels, &ctx->Unpack, texObj, texImage); + +            ASSERT(texImage->TexFormat); -	 /* Give the texture to the driver!  <pixels> may be null! */ -	 (*ctx->Driver.TexImage2D)(ctx, target, level, internalFormat, -				   width, height, border, format, type, pixels, -				   &ctx->Unpack, texObj, texImage); -	  -	 ASSERT(texImage->TexFormat); +            check_gen_mipmap(ctx, target, texObj, level); -	 update_fbo_texture(ctx, texObj, face, level); +            update_fbo_texture(ctx, texObj, face, level); -	 /* state update */ -	 texObj->_Complete = GL_FALSE; -	 ctx->NewState |= _NEW_TEXTURE; +            /* state update */ +            texObj->_Complete = GL_FALSE; +            ctx->NewState |= _NEW_TEXTURE; +         }        } -   out:        _mesa_unlock_texture(ctx, texObj);     }     else if (target == GL_PROXY_TEXTURE_2D || @@ -2372,35 +2389,35 @@ _mesa_TexImage3D( GLenum target, GLint level, GLint internalFormat,  	 texImage = _mesa_get_tex_image(ctx, texObj, target, level);  	 if (!texImage) {  	    _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage3D"); -	    goto out; -	 } -	  -	 if (texImage->Data) { -	    ctx->Driver.FreeTexImageData( ctx, texImage );  	 } -	  -	 ASSERT(texImage->Data == NULL); -	 clear_teximage_fields(texImage); /* not really needed, but helpful */ -	 _mesa_init_teximage_fields(ctx, target, texImage, -				    width, height, depth, -				    border, internalFormat); +         else { +            if (texImage->Data) { +               ctx->Driver.FreeTexImageData( ctx, texImage ); +            } -	 ASSERT(ctx->Driver.TexImage3D); +            ASSERT(texImage->Data == NULL); +            clear_teximage_fields(texImage); /* not really needed, but helpful */ +            _mesa_init_teximage_fields(ctx, target, texImage, +                                       width, height, depth, +                                       border, internalFormat); -	 /* Give the texture to the driver!  <pixels> may be null! */ -	 (*ctx->Driver.TexImage3D)(ctx, target, level, internalFormat, -				   width, height, depth, border, format, type, -				   pixels, &ctx->Unpack, texObj, texImage); +            /* Give the texture to the driver.  <pixels> may be null. */ +            ASSERT(ctx->Driver.TexImage3D); +            ctx->Driver.TexImage3D(ctx, target, level, internalFormat, +                                   width, height, depth, border, format, type, +                                   pixels, &ctx->Unpack, texObj, texImage); -	 ASSERT(texImage->TexFormat); +            ASSERT(texImage->TexFormat); -	 update_fbo_texture(ctx, texObj, face, level); +            check_gen_mipmap(ctx, target, texObj, level); -	 /* state update */ -	 texObj->_Complete = GL_FALSE; -	 ctx->NewState |= _NEW_TEXTURE; +            update_fbo_texture(ctx, texObj, face, level); + +            /* state update */ +            texObj->_Complete = GL_FALSE; +            ctx->NewState |= _NEW_TEXTURE; +         }        } -   out:        _mesa_unlock_texture(ctx, texObj);     }     else if (target == GL_PROXY_TEXTURE_3D || @@ -2480,23 +2497,24 @@ _mesa_TexSubImage1D( GLenum target, GLint level,        texImage = _mesa_select_tex_image(ctx, texObj, target, level);        if (subtexture_error_check2(ctx, 1, target, level, xoffset, 0, 0, -				  postConvWidth, 1, 1, format, type, texImage)) { -	 goto out;   /* error was detected */ +				  postConvWidth, 1, 1, +                                  format, type, texImage)) { +         /* error was recorded */        } +      else if (width > 0) { +         /* If we have a border, xoffset=-1 is legal.  Bias by border width */ +         xoffset += texImage->Border; -      if (width == 0) -	 goto out;  /* no-op, not an error */ +         ASSERT(ctx->Driver.TexSubImage1D); +         ctx->Driver.TexSubImage1D(ctx, target, level, xoffset, width, +                                   format, type, pixels, &ctx->Unpack, +                                   texObj, texImage); -      /* If we have a border, xoffset=-1 is legal.  Bias by border width */ -      xoffset += texImage->Border; +         check_gen_mipmap(ctx, target, texObj, level); -      ASSERT(ctx->Driver.TexSubImage1D); -      (*ctx->Driver.TexSubImage1D)(ctx, target, level, xoffset, width, -				   format, type, pixels, &ctx->Unpack, -				   texObj, texImage); -      ctx->NewState |= _NEW_TEXTURE; +         ctx->NewState |= _NEW_TEXTURE; +      }     } - out:     _mesa_unlock_texture(ctx, texObj);  } @@ -2533,30 +2551,31 @@ _mesa_TexSubImage2D( GLenum target, GLint level,     texUnit = _mesa_get_current_tex_unit(ctx);     texObj = _mesa_select_tex_object(ctx, texUnit, target); +     _mesa_lock_texture(ctx, texObj);     {        texImage = _mesa_select_tex_image(ctx, texObj, target, level);        if (subtexture_error_check2(ctx, 2, target, level, xoffset, yoffset, 0, -				  postConvWidth, postConvHeight, 1, format, type,  -				  texImage)) { -	 goto out;   /* error was detected */ +				  postConvWidth, postConvHeight, 1, +                                  format, type, texImage)) { +	 /* error was recorded */        } +      else if (width > 0 && height >= 0) { +         /* If we have a border, xoffset=-1 is legal.  Bias by border width */ +         xoffset += texImage->Border; +         yoffset += texImage->Border; + +         ASSERT(ctx->Driver.TexSubImage2D); +         ctx->Driver.TexSubImage2D(ctx, target, level, xoffset, yoffset, +                                   width, height, format, type, pixels, +                                   &ctx->Unpack, texObj, texImage); -      if (width == 0 || height == 0) -	 goto out;  /* no-op, not an error */ +         check_gen_mipmap(ctx, target, texObj, level); -      /* If we have a border, xoffset=-1 is legal.  Bias by border width */ -      xoffset += texImage->Border; -      yoffset += texImage->Border; -       -      ASSERT(ctx->Driver.TexSubImage2D); -      (*ctx->Driver.TexSubImage2D)(ctx, target, level, xoffset, yoffset, -				   width, height, format, type, pixels, -				   &ctx->Unpack, texObj, texImage); -      ctx->NewState |= _NEW_TEXTURE; +         ctx->NewState |= _NEW_TEXTURE; +      }     } - out:     _mesa_unlock_texture(ctx, texObj);  } @@ -2590,28 +2609,30 @@ _mesa_TexSubImage3D( GLenum target, GLint level,     {        texImage = _mesa_select_tex_image(ctx, texObj, target, level); -      if (subtexture_error_check2(ctx, 3, target, level, xoffset, yoffset, zoffset, -				  width, height, depth, format, type, texImage)) { -	 goto out;   /* error was detected */ +      if (subtexture_error_check2(ctx, 3, target, level, +                                  xoffset, yoffset, zoffset, +				  width, height, depth, +                                  format, type, texImage)) { +         /* error was recorded */        } +      else if (width > 0 && height > 0 && height > 0) { +         /* If we have a border, xoffset=-1 is legal.  Bias by border width */ +         xoffset += texImage->Border; +         yoffset += texImage->Border; +         zoffset += texImage->Border; -      if (width == 0 || height == 0 || height == 0) -	 goto out;  /* no-op, not an error */ +         ASSERT(ctx->Driver.TexSubImage3D); +         ctx->Driver.TexSubImage3D(ctx, target, level, +                                   xoffset, yoffset, zoffset, +                                   width, height, depth, +                                   format, type, pixels, +                                   &ctx->Unpack, texObj, texImage ); -      /* If we have a border, xoffset=-1 is legal.  Bias by border width */ -      xoffset += texImage->Border; -      yoffset += texImage->Border; -      zoffset += texImage->Border; +         check_gen_mipmap(ctx, target, texObj, level); -      ASSERT(ctx->Driver.TexSubImage3D); -      (*ctx->Driver.TexSubImage3D)(ctx, target, level, -				   xoffset, yoffset, zoffset, -				   width, height, depth, -				   format, type, pixels, -				   &ctx->Unpack, texObj, texImage ); -      ctx->NewState |= _NEW_TEXTURE; +         ctx->NewState |= _NEW_TEXTURE; +      }     } - out:     _mesa_unlock_texture(ctx, texObj);  } @@ -2646,38 +2667,39 @@ _mesa_CopyTexImage1D( GLenum target, GLint level,     texUnit = _mesa_get_current_tex_unit(ctx);     texObj = _mesa_select_tex_object(ctx, texUnit, target); +     _mesa_lock_texture(ctx, texObj);     {        texImage = _mesa_get_tex_image(ctx, texObj, target, level);        if (!texImage) {  	 _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCopyTexImage1D"); -	 goto out;        } +      else { +         if (texImage->Data) { +            ctx->Driver.FreeTexImageData( ctx, texImage ); +         } -      if (texImage->Data) { -	 ctx->Driver.FreeTexImageData( ctx, texImage ); -      } -       -      ASSERT(texImage->Data == NULL); +         ASSERT(texImage->Data == NULL); -      clear_teximage_fields(texImage); /* not really needed, but helpful */ -      _mesa_init_teximage_fields(ctx, target, texImage, postConvWidth, 1, 1, -				 border, internalFormat); +         clear_teximage_fields(texImage); /* not really needed, but helpful */ +         _mesa_init_teximage_fields(ctx, target, texImage, postConvWidth, 1, 1, +                                    border, internalFormat); +         ASSERT(ctx->Driver.CopyTexImage1D); +         ctx->Driver.CopyTexImage1D(ctx, target, level, internalFormat, +                                    x, y, width, border); -      ASSERT(ctx->Driver.CopyTexImage1D); -      (*ctx->Driver.CopyTexImage1D)(ctx, target, level, internalFormat, -				    x, y, width, border); +         ASSERT(texImage->TexFormat); -      ASSERT(texImage->TexFormat); +         check_gen_mipmap(ctx, target, texObj, level); -      update_fbo_texture(ctx, texObj, face, level); +         update_fbo_texture(ctx, texObj, face, level); -      /* state update */ -      texObj->_Complete = GL_FALSE; -      ctx->NewState |= _NEW_TEXTURE; +         /* state update */ +         texObj->_Complete = GL_FALSE; +         ctx->NewState |= _NEW_TEXTURE; +      }     } - out:     _mesa_unlock_texture(ctx, texObj);  } @@ -2719,33 +2741,34 @@ _mesa_CopyTexImage2D( GLenum target, GLint level, GLenum internalFormat,        if (!texImage) {  	 _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCopyTexImage2D"); -	 goto out; -      } -       -      if (texImage->Data) { -	 ctx->Driver.FreeTexImageData( ctx, texImage );        } -       -      ASSERT(texImage->Data == NULL); +      else { +         if (texImage->Data) { +            ctx->Driver.FreeTexImageData( ctx, texImage ); +         } + +         ASSERT(texImage->Data == NULL); + +         clear_teximage_fields(texImage); /* not really needed, but helpful */ +         _mesa_init_teximage_fields(ctx, target, texImage, +                                    postConvWidth, postConvHeight, 1, +                                    border, internalFormat); -      clear_teximage_fields(texImage); /* not really needed, but helpful */ -      _mesa_init_teximage_fields(ctx, target, texImage, -				 postConvWidth, postConvHeight, 1, -				 border, internalFormat); -       -      ASSERT(ctx->Driver.CopyTexImage2D); -      (*ctx->Driver.CopyTexImage2D)(ctx, target, level, internalFormat, -				    x, y, width, height, border); -       -      ASSERT(texImage->TexFormat); +         ASSERT(ctx->Driver.CopyTexImage2D); +         ctx->Driver.CopyTexImage2D(ctx, target, level, internalFormat, +                                    x, y, width, height, border); -      update_fbo_texture(ctx, texObj, face, level); +         ASSERT(texImage->TexFormat); -      /* state update */ -      texObj->_Complete = GL_FALSE; -      ctx->NewState |= _NEW_TEXTURE; +         check_gen_mipmap(ctx, target, texObj, level); + +         update_fbo_texture(ctx, texObj, face, level); + +         /* state update */ +         texObj->_Complete = GL_FALSE; +         ctx->NewState |= _NEW_TEXTURE; +      }     } - out:     _mesa_unlock_texture(ctx, texObj);  } @@ -2785,23 +2808,25 @@ _mesa_CopyTexSubImage1D( GLenum target, GLint level,        if (copytexsubimage_error_check2(ctx, 1, target, level,  				       xoffset, 0, 0, postConvWidth, 1, -				       texImage)) -	 goto out; -       +				       texImage)) { +         /* error was recorded */ +      } +      else { +         /* If we have a border, xoffset=-1 is legal.  Bias by border width */ +         xoffset += texImage->Border; -      /* If we have a border, xoffset=-1 is legal.  Bias by border width */ -      xoffset += texImage->Border; +         if (_mesa_clip_copytexsubimage(ctx, &xoffset, &yoffset, &x, &y, +                                        &width, &height)) { +            ASSERT(ctx->Driver.CopyTexSubImage1D); +            ctx->Driver.CopyTexSubImage1D(ctx, target, level, +                                          xoffset, x, y, width); -      if (_mesa_clip_copytexsubimage(ctx, &xoffset, &yoffset, &x, &y, -                                     &width, &height)) { -         ASSERT(ctx->Driver.CopyTexSubImage1D); -         ctx->Driver.CopyTexSubImage1D(ctx, target, level, -                                       xoffset, x, y, width); -      } +            check_gen_mipmap(ctx, target, texObj, level); -      ctx->NewState |= _NEW_TEXTURE; +            ctx->NewState |= _NEW_TEXTURE; +         } +      }     } - out:     _mesa_unlock_texture(ctx, texObj);  } @@ -2839,24 +2864,29 @@ _mesa_CopyTexSubImage2D( GLenum target, GLint level,        }  #endif -      if (copytexsubimage_error_check2(ctx, 2, target, level, xoffset, yoffset, 0, -				       postConvWidth, postConvHeight, texImage)) -	 goto out; +      if (copytexsubimage_error_check2(ctx, 2, target, level, +                                       xoffset, yoffset, 0, +				       postConvWidth, postConvHeight, +                                       texImage)) { +         /* error was recorded */ +      } +      else { +         /* If we have a border, xoffset=-1 is legal.  Bias by border width */ +         xoffset += texImage->Border; +         yoffset += texImage->Border; -      /* If we have a border, xoffset=-1 is legal.  Bias by border width */ -      xoffset += texImage->Border; -      yoffset += texImage->Border; +         if (_mesa_clip_copytexsubimage(ctx, &xoffset, &yoffset, &x, &y, +                                        &width, &height)) { +            ASSERT(ctx->Driver.CopyTexSubImage2D); +            ctx->Driver.CopyTexSubImage2D(ctx, target, level, xoffset, yoffset, +                                          x, y, width, height); -      if (_mesa_clip_copytexsubimage(ctx, &xoffset, &yoffset, &x, &y, -                                     &width, &height)) { -         ASSERT(ctx->Driver.CopyTexSubImage2D); -         ctx->Driver.CopyTexSubImage2D(ctx, target, level, -				       xoffset, yoffset, x, y, width, height); -      } +            check_gen_mipmap(ctx, target, texObj, level); -      ctx->NewState |= _NEW_TEXTURE; +            ctx->NewState |= _NEW_TEXTURE; +         } +      }     } - out:     _mesa_unlock_texture(ctx, texObj);  } @@ -2896,25 +2926,28 @@ _mesa_CopyTexSubImage3D( GLenum target, GLint level,        if (copytexsubimage_error_check2(ctx, 3, target, level, xoffset, yoffset,  				       zoffset, postConvWidth, postConvHeight, -				       texImage)) -	 goto out; - -      /* If we have a border, xoffset=-1 is legal.  Bias by border width */ -      xoffset += texImage->Border; -      yoffset += texImage->Border; -      zoffset += texImage->Border; -       -      if (_mesa_clip_copytexsubimage(ctx, &xoffset, &yoffset, &x, &y, -                                     &width, &height)) { -         ASSERT(ctx->Driver.CopyTexSubImage3D); -         ctx->Driver.CopyTexSubImage3D(ctx, target, level, -				       xoffset, yoffset, zoffset, -				       x, y, width, height); +				       texImage)) { +         /* error was recored */        } +      else { +         /* If we have a border, xoffset=-1 is legal.  Bias by border width */ +         xoffset += texImage->Border; +         yoffset += texImage->Border; +         zoffset += texImage->Border; + +         if (_mesa_clip_copytexsubimage(ctx, &xoffset, &yoffset, &x, &y, +                                        &width, &height)) { +            ASSERT(ctx->Driver.CopyTexSubImage3D); +            ctx->Driver.CopyTexSubImage3D(ctx, target, level, +                                          xoffset, yoffset, zoffset, +                                          x, y, width, height); + +            check_gen_mipmap(ctx, target, texObj, level); -      ctx->NewState |= _NEW_TEXTURE; +            ctx->NewState |= _NEW_TEXTURE; +         } +      }     } - out:     _mesa_unlock_texture(ctx, texObj);  } @@ -3142,28 +3175,29 @@ _mesa_CompressedTexImage1DARB(GLenum target, GLint level,  	 texImage = _mesa_get_tex_image(ctx, texObj, target, level);  	 if (!texImage) {  	    _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexImage1D"); -	    goto out; -	 } -	  -	 if (texImage->Data) { -	    ctx->Driver.FreeTexImageData( ctx, texImage );  	 } -	 ASSERT(texImage->Data == NULL); +         else { +            if (texImage->Data) { +               ctx->Driver.FreeTexImageData( ctx, texImage ); +            } +            ASSERT(texImage->Data == NULL); + +            _mesa_init_teximage_fields(ctx, target, texImage, width, 1, 1, +                                       border, internalFormat); -	 _mesa_init_teximage_fields(ctx, target, texImage, width, 1, 1, -				    border, internalFormat); +            ASSERT(ctx->Driver.CompressedTexImage1D); +            ctx->Driver.CompressedTexImage1D(ctx, target, level, +                                             internalFormat, width, border, +                                             imageSize, data, +                                             texObj, texImage); -	 ASSERT(ctx->Driver.CompressedTexImage1D); -	 (*ctx->Driver.CompressedTexImage1D)(ctx, target, level, -					     internalFormat, width, border, -					     imageSize, data, -					     texObj, texImage); +            check_gen_mipmap(ctx, target, texObj, level); -	 /* state update */ -	 texObj->_Complete = GL_FALSE; -	 ctx->NewState |= _NEW_TEXTURE; +            /* state update */ +            texObj->_Complete = GL_FALSE; +            ctx->NewState |= _NEW_TEXTURE; +         }        } -   out:        _mesa_unlock_texture(ctx, texObj);     }     else if (target == GL_PROXY_TEXTURE_1D) { @@ -3239,28 +3273,29 @@ _mesa_CompressedTexImage2DARB(GLenum target, GLint level,  	 texImage = _mesa_get_tex_image(ctx, texObj, target, level);  	 if (!texImage) {  	    _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexImage2D"); -	    goto out;  	 } -	  -	 if (texImage->Data) { -	    ctx->Driver.FreeTexImageData( ctx, texImage ); -	 } -	 ASSERT(texImage->Data == NULL); +         else { +            if (texImage->Data) { +               ctx->Driver.FreeTexImageData( ctx, texImage ); +            } +            ASSERT(texImage->Data == NULL); + +            _mesa_init_teximage_fields(ctx, target, texImage, width, height, 1, +                                       border, internalFormat); -	 _mesa_init_teximage_fields(ctx, target, texImage, width, height, 1, -				    border, internalFormat); +            ASSERT(ctx->Driver.CompressedTexImage2D); +            ctx->Driver.CompressedTexImage2D(ctx, target, level, +                                             internalFormat, width, height, +                                             border, imageSize, data, +                                             texObj, texImage); -	 ASSERT(ctx->Driver.CompressedTexImage2D); -	 (*ctx->Driver.CompressedTexImage2D)(ctx, target, level, -					     internalFormat, width, height, -					     border, imageSize, data, -					     texObj, texImage); -	  -	 /* state update */ -	 texObj->_Complete = GL_FALSE; -	 ctx->NewState |= _NEW_TEXTURE; +            check_gen_mipmap(ctx, target, texObj, level); + +            /* state update */ +            texObj->_Complete = GL_FALSE; +            ctx->NewState |= _NEW_TEXTURE; +         }        } -   out:        _mesa_unlock_texture(ctx, texObj);     }     else if (target == GL_PROXY_TEXTURE_2D || @@ -3334,29 +3369,31 @@ _mesa_CompressedTexImage3DARB(GLenum target, GLint level,  	 texImage = _mesa_get_tex_image(ctx, texObj, target, level);  	 if (!texImage) {  	    _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexImage3D"); -	    goto out;  	 } -	  -	 if (texImage->Data) { -	    ctx->Driver.FreeTexImageData( ctx, texImage ); -	 } -	 ASSERT(texImage->Data == NULL); +         else { +            if (texImage->Data) { +               ctx->Driver.FreeTexImageData( ctx, texImage ); +            } +            ASSERT(texImage->Data == NULL); + +            _mesa_init_teximage_fields(ctx, target, texImage, +                                       width, height, depth, +                                       border, internalFormat); -	 _mesa_init_teximage_fields(ctx, target, texImage, width, height, depth, -				    border, internalFormat); +            ASSERT(ctx->Driver.CompressedTexImage3D); +            ctx->Driver.CompressedTexImage3D(ctx, target, level, +                                             internalFormat, +                                             width, height, depth, +                                             border, imageSize, data, +                                             texObj, texImage); -	 ASSERT(ctx->Driver.CompressedTexImage3D); -	 (*ctx->Driver.CompressedTexImage3D)(ctx, target, level, -					     internalFormat, -					     width, height, depth, -					     border, imageSize, data, -					     texObj, texImage); -	  -	 /* state update */ -	 texObj->_Complete = GL_FALSE; -	 ctx->NewState |= _NEW_TEXTURE; +            check_gen_mipmap(ctx, target, texObj, level); + +            /* state update */ +            texObj->_Complete = GL_FALSE; +            ctx->NewState |= _NEW_TEXTURE; +         }        } -   out:        _mesa_unlock_texture(ctx, texObj);     }     else if (target == GL_PROXY_TEXTURE_3D) { @@ -3422,6 +3459,7 @@ _mesa_CompressedTexSubImage1DARB(GLenum target, GLint level, GLint xoffset,     texUnit = _mesa_get_current_tex_unit(ctx);     texObj = _mesa_select_tex_object(ctx, texUnit, target); +     _mesa_lock_texture(ctx, texObj);     {        texImage = _mesa_select_tex_image(ctx, texObj, target, level); @@ -3430,26 +3468,25 @@ _mesa_CompressedTexSubImage1DARB(GLenum target, GLint level, GLint xoffset,        if ((GLint) format != texImage->InternalFormat) {  	 _mesa_error(ctx, GL_INVALID_OPERATION,  		     "glCompressedTexSubImage1D(format)"); -	 goto out;        } - -      if ((width == 1 || width == 2) && (GLuint) width != texImage->Width) { -	 _mesa_error(ctx, GL_INVALID_VALUE, "glCompressedTexSubImage1D(width)"); -	 goto out; +      else if ((width == 1 || width == 2) && +               (GLuint) width != texImage->Width) { +	 _mesa_error(ctx, GL_INVALID_VALUE, +                     "glCompressedTexSubImage1D(width)");        } -       -      if (width == 0) -	 goto out;  /* no-op, not an error */ +      else if (width > 0) { +         if (ctx->Driver.CompressedTexSubImage1D) { +            ctx->Driver.CompressedTexSubImage1D(ctx, target, level, +                                                xoffset, width, +                                                format, imageSize, data, +                                                texObj, texImage); +         } -      if (ctx->Driver.CompressedTexSubImage1D) { -	 (*ctx->Driver.CompressedTexSubImage1D)(ctx, target, level, -						xoffset, width, -						format, imageSize, data, -						texObj, texImage); +         check_gen_mipmap(ctx, target, texObj, level); + +         ctx->NewState |= _NEW_TEXTURE;        } -      ctx->NewState |= _NEW_TEXTURE;     } - out:     _mesa_unlock_texture(ctx, texObj);  } @@ -3479,6 +3516,7 @@ _mesa_CompressedTexSubImage2DARB(GLenum target, GLint level, GLint xoffset,     texUnit = _mesa_get_current_tex_unit(ctx);     texObj = _mesa_select_tex_object(ctx, texUnit, target); +     _mesa_lock_texture(ctx, texObj);     {        texImage = _mesa_select_tex_image(ctx, texObj, target, level); @@ -3487,27 +3525,26 @@ _mesa_CompressedTexSubImage2DARB(GLenum target, GLint level, GLint xoffset,        if ((GLint) format != texImage->InternalFormat) {  	 _mesa_error(ctx, GL_INVALID_OPERATION,  		     "glCompressedTexSubImage2D(format)"); -	 goto out;        } - -      if (((width == 1 || width == 2) && (GLuint) width != texImage->Width) || -	  ((height == 1 || height == 2) && (GLuint) height != texImage->Height)) { +      else if (((width == 1 || width == 2) +                && (GLuint) width != texImage->Width) || +               ((height == 1 || height == 2) +                && (GLuint) height != texImage->Height)) {  	 _mesa_error(ctx, GL_INVALID_VALUE, "glCompressedTexSubImage2D(size)"); -	 goto out;        } -       -      if (width == 0 || height == 0) -	 goto out;  /* no-op, not an error */ - -      if (ctx->Driver.CompressedTexSubImage2D) { -	 (*ctx->Driver.CompressedTexSubImage2D)(ctx, target, level, +      else if (width > 0 && height > 0) { +         if (ctx->Driver.CompressedTexSubImage2D) { +            ctx->Driver.CompressedTexSubImage2D(ctx, target, level,  						xoffset, yoffset, width, height,  						format, imageSize, data,  						texObj, texImage); +         } + +         check_gen_mipmap(ctx, target, texObj, level); + +         ctx->NewState |= _NEW_TEXTURE;        } -      ctx->NewState |= _NEW_TEXTURE;     } - out:     _mesa_unlock_texture(ctx, texObj);  } @@ -3536,6 +3573,7 @@ _mesa_CompressedTexSubImage3DARB(GLenum target, GLint level, GLint xoffset,     texUnit = _mesa_get_current_tex_unit(ctx);     texObj = _mesa_select_tex_object(ctx, texUnit, target); +     _mesa_lock_texture(ctx, texObj);     {        texImage = _mesa_select_tex_image(ctx, texObj, target, level); @@ -3544,29 +3582,29 @@ _mesa_CompressedTexSubImage3DARB(GLenum target, GLint level, GLint xoffset,        if ((GLint) format != texImage->InternalFormat) {  	 _mesa_error(ctx, GL_INVALID_OPERATION,  		     "glCompressedTexSubImage3D(format)"); -	 goto out;        } - -      if (((width == 1 || width == 2) && (GLuint) width != texImage->Width) || -	  ((height == 1 || height == 2) && (GLuint) height != texImage->Height) || -	  ((depth == 1 || depth == 2) && (GLuint) depth != texImage->Depth)) { +      else if (((width == 1 || width == 2) +                && (GLuint) width != texImage->Width) || +               ((height == 1 || height == 2) +                && (GLuint) height != texImage->Height) || +               ((depth == 1 || depth == 2) +                && (GLuint) depth != texImage->Depth)) {  	 _mesa_error(ctx, GL_INVALID_VALUE, "glCompressedTexSubImage3D(size)"); -	 goto out;        } -       -      if (width == 0 || height == 0 || depth == 0) -	 goto out;  /* no-op, not an error */ - -      if (ctx->Driver.CompressedTexSubImage3D) { -	 (*ctx->Driver.CompressedTexSubImage3D)(ctx, target, level, +      else if (width > 0 && height > 0 && depth > 0) { +         if (ctx->Driver.CompressedTexSubImage3D) { +            ctx->Driver.CompressedTexSubImage3D(ctx, target, level,  						xoffset, yoffset, zoffset,  						width, height, depth,  						format, imageSize, data,  						texObj, texImage); +         } + +         check_gen_mipmap(ctx, target, texObj, level); + +         ctx->NewState |= _NEW_TEXTURE;        } -      ctx->NewState |= _NEW_TEXTURE;     } - out:     _mesa_unlock_texture(ctx, texObj);  } diff --git a/src/mesa/main/texparam.c b/src/mesa/main/texparam.c index 05d144270e..b2fbe2205b 100644 --- a/src/mesa/main/texparam.c +++ b/src/mesa/main/texparam.c @@ -70,7 +70,7 @@ validate_texture_wrap_mode(GLcontext * ctx, GLenum target, GLenum wrap)        return GL_TRUE;     } -   _mesa_error( ctx, GL_INVALID_VALUE, "glTexParameter(param=0x%x)", wrap ); +   _mesa_error( ctx, GL_INVALID_ENUM, "glTexParameter(param=0x%x)", wrap );     return GL_FALSE;  } @@ -210,7 +210,7 @@ set_tex_parameteri(GLcontext *ctx,           }           /* fall-through */        default: -         _mesa_error( ctx, GL_INVALID_VALUE, "glTexParameter(param=0x%x)", +         _mesa_error( ctx, GL_INVALID_ENUM, "glTexParameter(param=0x%x)",                        params[0] );        }        return GL_FALSE; @@ -225,7 +225,7 @@ set_tex_parameteri(GLcontext *ctx,           texObj->MagFilter = params[0];           return GL_TRUE;        default: -         _mesa_error( ctx, GL_INVALID_VALUE, "glTexParameter(param=0x%x)", +         _mesa_error( ctx, GL_INVALID_ENUM, "glTexParameter(param=0x%x)",                        params[0]);        }        return GL_FALSE; diff --git a/src/mesa/main/texstore.c b/src/mesa/main/texstore.c index a22db628d3..ab9973b810 100644 --- a/src/mesa/main/texstore.c +++ b/src/mesa/main/texstore.c @@ -3302,32 +3302,9 @@ _mesa_set_fetch_functions(struct gl_texture_image *texImage, GLuint dims)  } -/** - * Choose the actual storage format for a new texture image. - * Mainly, this is a wrapper for the driver's ChooseTextureFormat() function. - * Also set some other texImage fields related to texture compression, etc. - * \param ctx  rendering context - * \param texImage  the gl_texture_image - * \param dims  texture dimensions (1, 2 or 3) - * \param format  the user-specified format parameter - * \param type  the user-specified type parameter - * \param internalFormat  the user-specified internal format hint - */  static void -choose_texture_format(GLcontext *ctx, struct gl_texture_image *texImage, -                      GLuint dims, -                      GLenum format, GLenum type, GLint internalFormat) +compute_texture_size(GLcontext *ctx, struct gl_texture_image *texImage)  { -   ASSERT(dims == 1 || dims == 2 || dims == 3); -   ASSERT(ctx->Driver.ChooseTextureFormat); - -   texImage->TexFormat -      = ctx->Driver.ChooseTextureFormat(ctx, internalFormat, format, type); - -   ASSERT(texImage->TexFormat); - -   _mesa_set_fetch_functions(texImage, dims); -     if (texImage->TexFormat->TexelBytes == 0) {        /* must be a compressed format */        texImage->IsCompressed = GL_TRUE; @@ -3365,7 +3342,12 @@ _mesa_store_teximage1d(GLcontext *ctx, GLenum target, GLint level,     GLint sizeInBytes;     (void) border; -   choose_texture_format(ctx, texImage, 1, format, type, internalFormat); +   texImage->TexFormat +      = ctx->Driver.ChooseTextureFormat(ctx, internalFormat, format, type); +   ASSERT(texImage->TexFormat); + +   _mesa_set_fetch_functions(texImage, 1); +   compute_texture_size(ctx, texImage);     /* allocate memory */     if (texImage->IsCompressed) @@ -3403,11 +3385,6 @@ _mesa_store_teximage1d(GLcontext *ctx, GLenum target, GLint level,        }     } -   /* GL_SGIS_generate_mipmap */ -   if (level == texObj->BaseLevel && texObj->GenerateMipmap) { -      ctx->Driver.GenerateMipmap(ctx, target, texObj); -   } -     _mesa_unmap_teximage_pbo(ctx, packing);  } @@ -3434,7 +3411,12 @@ _mesa_store_teximage2d(GLcontext *ctx, GLenum target, GLint level,     GLint texelBytes, sizeInBytes;     (void) border; -   choose_texture_format(ctx, texImage, 2, format, type, internalFormat); +   texImage->TexFormat +      = ctx->Driver.ChooseTextureFormat(ctx, internalFormat, format, type); +   ASSERT(texImage->TexFormat); + +   _mesa_set_fetch_functions(texImage, 2); +   compute_texture_size(ctx, texImage);     texelBytes = texImage->TexFormat->TexelBytes; @@ -3481,11 +3463,6 @@ _mesa_store_teximage2d(GLcontext *ctx, GLenum target, GLint level,        }     } -   /* GL_SGIS_generate_mipmap */ -   if (level == texObj->BaseLevel && texObj->GenerateMipmap) { -      ctx->Driver.GenerateMipmap(ctx, target, texObj); -   } -     _mesa_unmap_teximage_pbo(ctx, packing);  } @@ -3508,7 +3485,12 @@ _mesa_store_teximage3d(GLcontext *ctx, GLenum target, GLint level,     GLint texelBytes, sizeInBytes;     (void) border; -   choose_texture_format(ctx, texImage, 3, format, type, internalFormat); +   texImage->TexFormat +      = ctx->Driver.ChooseTextureFormat(ctx, internalFormat, format, type); +   ASSERT(texImage->TexFormat); + +   _mesa_set_fetch_functions(texImage, 3); +   compute_texture_size(ctx, texImage);     texelBytes = texImage->TexFormat->TexelBytes; @@ -3555,11 +3537,6 @@ _mesa_store_teximage3d(GLcontext *ctx, GLenum target, GLint level,        }     } -   /* GL_SGIS_generate_mipmap */ -   if (level == texObj->BaseLevel && texObj->GenerateMipmap) { -      ctx->Driver.GenerateMipmap(ctx, target, texObj); -   } -     _mesa_unmap_teximage_pbo(ctx, packing);  } @@ -3601,11 +3578,6 @@ _mesa_store_texsubimage1d(GLcontext *ctx, GLenum target, GLint level,        }     } -   /* GL_SGIS_generate_mipmap */ -   if (level == texObj->BaseLevel && texObj->GenerateMipmap) { -      ctx->Driver.GenerateMipmap(ctx, target, texObj); -   } -     _mesa_unmap_teximage_pbo(ctx, packing);  } @@ -3654,11 +3626,6 @@ _mesa_store_texsubimage2d(GLcontext *ctx, GLenum target, GLint level,        }     } -   /* GL_SGIS_generate_mipmap */ -   if (level == texObj->BaseLevel && texObj->GenerateMipmap) { -      ctx->Driver.GenerateMipmap(ctx, target, texObj); -   } -     _mesa_unmap_teximage_pbo(ctx, packing);  } @@ -3707,11 +3674,6 @@ _mesa_store_texsubimage3d(GLcontext *ctx, GLenum target, GLint level,        }     } -   /* GL_SGIS_generate_mipmap */ -   if (level == texObj->BaseLevel && texObj->GenerateMipmap) { -      ctx->Driver.GenerateMipmap(ctx, target, texObj); -   } -     _mesa_unmap_teximage_pbo(ctx, packing);  } @@ -3762,7 +3724,12 @@ _mesa_store_compressed_teximage2d(GLcontext *ctx, GLenum target, GLint level,     ASSERT(texImage->Depth == 1);     ASSERT(texImage->Data == NULL); /* was freed in glCompressedTexImage2DARB */ -   choose_texture_format(ctx, texImage, 2, 0, 0, internalFormat); +   texImage->TexFormat +      = ctx->Driver.ChooseTextureFormat(ctx, internalFormat, 0, 0); +   ASSERT(texImage->TexFormat); + +   _mesa_set_fetch_functions(texImage, 2); +   compute_texture_size(ctx, texImage);     /* allocate storage */     texImage->Data = _mesa_alloc_texmemory(imageSize); @@ -3781,11 +3748,6 @@ _mesa_store_compressed_teximage2d(GLcontext *ctx, GLenum target, GLint level,     ASSERT(texImage->CompressedSize == (GLuint) imageSize);     MEMCPY(texImage->Data, data, imageSize); -   /* GL_SGIS_generate_mipmap */ -   if (level == texObj->BaseLevel && texObj->GenerateMipmap) { -      ctx->Driver.GenerateMipmap(ctx, target, texObj); -   } -     _mesa_unmap_teximage_pbo(ctx, &ctx->Unpack);  } @@ -3891,11 +3853,6 @@ _mesa_store_compressed_texsubimage2d(GLcontext *ctx, GLenum target,        src += srcRowStride;     } -   /* GL_SGIS_generate_mipmap */ -   if (level == texObj->BaseLevel && texObj->GenerateMipmap) { -      ctx->Driver.GenerateMipmap(ctx, target, texObj); -   } -     _mesa_unmap_teximage_pbo(ctx, &ctx->Unpack);  } diff --git a/src/mesa/shader/program_parse.tab.c b/src/mesa/shader/program_parse.tab.c index 9f2d4de90f..2de950b73b 100644 --- a/src/mesa/shader/program_parse.tab.c +++ b/src/mesa/shader/program_parse.tab.c @@ -769,27 +769,27 @@ static const yytype_uint16 yyrline[] =       440,   447,   453,   454,   455,   456,   457,   458,   459,   460,       461,   462,   463,   464,   467,   480,   493,   506,   528,   537,       570,   577,   592,   642,   684,   695,   716,   726,   732,   763, -     780,   780,   782,   789,   801,   802,   803,   806,   818,   830, -     848,   859,   871,   873,   874,   875,   876,   879,   879,   879, -     879,   880,   883,   884,   885,   886,   887,   888,   891,   909, -     913,   919,   923,   927,   931,   940,   949,   953,   958,   964, -     975,   975,   976,   978,   982,   986,   990,   996,   996,   998, -    1014,  1037,  1040,  1051,  1057,  1063,  1064,  1071,  1077,  1083, -    1091,  1097,  1103,  1111,  1117,  1123,  1131,  1132,  1135,  1136, -    1137,  1138,  1139,  1140,  1141,  1142,  1143,  1144,  1145,  1148, -    1157,  1161,  1165,  1171,  1180,  1184,  1188,  1197,  1201,  1207, -    1213,  1220,  1225,  1233,  1243,  1245,  1253,  1259,  1263,  1267, -    1273,  1284,  1293,  1297,  1302,  1306,  1310,  1314,  1320,  1327, -    1331,  1337,  1345,  1356,  1363,  1367,  1373,  1383,  1394,  1398, -    1416,  1425,  1428,  1434,  1438,  1442,  1448,  1459,  1464,  1469, -    1474,  1479,  1484,  1492,  1495,  1500,  1513,  1521,  1532,  1540, -    1540,  1542,  1542,  1544,  1554,  1559,  1566,  1576,  1585,  1590, -    1597,  1607,  1617,  1629,  1629,  1630,  1630,  1632,  1642,  1650, -    1660,  1668,  1676,  1685,  1696,  1700,  1706,  1707,  1708,  1711, -    1711,  1714,  1714,  1717,  1723,  1731,  1744,  1753,  1762,  1766, -    1775,  1784,  1795,  1802,  1807,  1816,  1828,  1831,  1840,  1851, -    1852,  1853,  1856,  1857,  1858,  1861,  1862,  1865,  1866,  1869, -    1870,  1873,  1884,  1895,  1906 +     780,   780,   782,   789,   801,   802,   803,   806,   820,   834, +     852,   863,   875,   877,   878,   879,   880,   883,   883,   883, +     883,   884,   887,   888,   889,   890,   891,   892,   895,   913, +     917,   923,   927,   931,   935,   944,   953,   957,   962,   968, +     979,   979,   980,   982,   986,   990,   994,  1000,  1000,  1002, +    1018,  1041,  1044,  1055,  1061,  1067,  1068,  1075,  1081,  1087, +    1095,  1101,  1107,  1115,  1121,  1127,  1135,  1136,  1139,  1140, +    1141,  1142,  1143,  1144,  1145,  1146,  1147,  1148,  1149,  1152, +    1161,  1165,  1169,  1175,  1184,  1188,  1192,  1201,  1205,  1211, +    1217,  1224,  1229,  1237,  1247,  1249,  1257,  1263,  1267,  1271, +    1277,  1288,  1297,  1301,  1306,  1310,  1314,  1318,  1324,  1331, +    1335,  1341,  1349,  1360,  1367,  1371,  1377,  1387,  1398,  1402, +    1420,  1429,  1432,  1438,  1442,  1446,  1452,  1463,  1468,  1473, +    1478,  1483,  1488,  1496,  1499,  1504,  1517,  1525,  1536,  1544, +    1544,  1546,  1546,  1548,  1558,  1563,  1570,  1580,  1589,  1594, +    1601,  1611,  1621,  1633,  1633,  1634,  1634,  1636,  1646,  1654, +    1664,  1672,  1680,  1689,  1700,  1704,  1710,  1711,  1712,  1715, +    1715,  1718,  1718,  1721,  1727,  1735,  1748,  1757,  1766,  1770, +    1779,  1788,  1799,  1806,  1811,  1820,  1832,  1835,  1844,  1855, +    1856,  1857,  1860,  1861,  1862,  1865,  1866,  1869,  1870,  1873, +    1874,  1877,  1888,  1899,  1910  };  #endif @@ -2791,8 +2791,10 @@ yyreduce:  #line 807 "program_parse.y"      {  	   if (((yyvsp[(1) - (1)].integer) < 0) || ((yyvsp[(1) - (1)].integer) > 63)) { -	      yyerror(& (yylsp[(1) - (1)]), state, -		      "relative address offset too large (positive)"); +              char s[100]; +              _mesa_snprintf(s, sizeof(s), +                             "relative address offset too large (%d)", (yyvsp[(1) - (1)].integer)); +	      yyerror(& (yylsp[(1) - (1)]), state, s);  	      YYERROR;  	   } else {  	      (yyval.integer) = (yyvsp[(1) - (1)].integer); @@ -2803,11 +2805,13 @@ yyreduce:    case 68:  /* Line 1455 of yacc.c  */ -#line 819 "program_parse.y" +#line 821 "program_parse.y"      {  	   if (((yyvsp[(1) - (1)].integer) < 0) || ((yyvsp[(1) - (1)].integer) > 64)) { -	      yyerror(& (yylsp[(1) - (1)]), state, -		      "relative address offset too large (negative)"); +              char s[100]; +              _mesa_snprintf(s, sizeof(s), +                             "relative address offset too large (%d)", (yyvsp[(1) - (1)].integer)); +	      yyerror(& (yylsp[(1) - (1)]), state, s);  	      YYERROR;  	   } else {  	      (yyval.integer) = (yyvsp[(1) - (1)].integer); @@ -2818,7 +2822,7 @@ yyreduce:    case 69:  /* Line 1455 of yacc.c  */ -#line 831 "program_parse.y" +#line 835 "program_parse.y"      {  	   struct asm_symbol *const s = (struct asm_symbol *)  	      _mesa_symbol_table_find_symbol(state->st, 0, (yyvsp[(1) - (1)].string)); @@ -2839,7 +2843,7 @@ yyreduce:    case 70:  /* Line 1455 of yacc.c  */ -#line 849 "program_parse.y" +#line 853 "program_parse.y"      {  	   if ((yyvsp[(1) - (1)].swiz_mask).mask != WRITEMASK_X) {  	      yyerror(& (yylsp[(1) - (1)]), state, "invalid address component selector"); @@ -2853,7 +2857,7 @@ yyreduce:    case 71:  /* Line 1455 of yacc.c  */ -#line 860 "program_parse.y" +#line 864 "program_parse.y"      {  	   if ((yyvsp[(1) - (1)].swiz_mask).mask != WRITEMASK_X) {  	      yyerror(& (yylsp[(1) - (1)]), state, @@ -2868,21 +2872,21 @@ yyreduce:    case 76:  /* Line 1455 of yacc.c  */ -#line 876 "program_parse.y" +#line 880 "program_parse.y"      { (yyval.swiz_mask).swizzle = SWIZZLE_NOOP; (yyval.swiz_mask).mask = WRITEMASK_XYZW; ;}      break;    case 81:  /* Line 1455 of yacc.c  */ -#line 880 "program_parse.y" +#line 884 "program_parse.y"      { (yyval.swiz_mask).swizzle = SWIZZLE_NOOP; (yyval.swiz_mask).mask = WRITEMASK_XYZW; ;}      break;    case 88:  /* Line 1455 of yacc.c  */ -#line 892 "program_parse.y" +#line 896 "program_parse.y"      {  	   struct asm_symbol *const s =  	      declare_variable(state, (yyvsp[(2) - (4)].string), at_attrib, & (yylsp[(2) - (4)])); @@ -2903,7 +2907,7 @@ yyreduce:    case 89:  /* Line 1455 of yacc.c  */ -#line 910 "program_parse.y" +#line 914 "program_parse.y"      {  	   (yyval.attrib) = (yyvsp[(2) - (2)].attrib);  	;} @@ -2912,7 +2916,7 @@ yyreduce:    case 90:  /* Line 1455 of yacc.c  */ -#line 914 "program_parse.y" +#line 918 "program_parse.y"      {  	   (yyval.attrib) = (yyvsp[(2) - (2)].attrib);  	;} @@ -2921,7 +2925,7 @@ yyreduce:    case 91:  /* Line 1455 of yacc.c  */ -#line 920 "program_parse.y" +#line 924 "program_parse.y"      {  	   (yyval.attrib) = VERT_ATTRIB_POS;  	;} @@ -2930,7 +2934,7 @@ yyreduce:    case 92:  /* Line 1455 of yacc.c  */ -#line 924 "program_parse.y" +#line 928 "program_parse.y"      {  	   (yyval.attrib) = VERT_ATTRIB_WEIGHT;  	;} @@ -2939,7 +2943,7 @@ yyreduce:    case 93:  /* Line 1455 of yacc.c  */ -#line 928 "program_parse.y" +#line 932 "program_parse.y"      {  	   (yyval.attrib) = VERT_ATTRIB_NORMAL;  	;} @@ -2948,7 +2952,7 @@ yyreduce:    case 94:  /* Line 1455 of yacc.c  */ -#line 932 "program_parse.y" +#line 936 "program_parse.y"      {  	   if (!state->ctx->Extensions.EXT_secondary_color) {  	      yyerror(& (yylsp[(2) - (2)]), state, "GL_EXT_secondary_color not supported"); @@ -2962,7 +2966,7 @@ yyreduce:    case 95:  /* Line 1455 of yacc.c  */ -#line 941 "program_parse.y" +#line 945 "program_parse.y"      {  	   if (!state->ctx->Extensions.EXT_fog_coord) {  	      yyerror(& (yylsp[(1) - (1)]), state, "GL_EXT_fog_coord not supported"); @@ -2976,7 +2980,7 @@ yyreduce:    case 96:  /* Line 1455 of yacc.c  */ -#line 950 "program_parse.y" +#line 954 "program_parse.y"      {  	   (yyval.attrib) = VERT_ATTRIB_TEX0 + (yyvsp[(2) - (2)].integer);  	;} @@ -2985,7 +2989,7 @@ yyreduce:    case 97:  /* Line 1455 of yacc.c  */ -#line 954 "program_parse.y" +#line 958 "program_parse.y"      {  	   yyerror(& (yylsp[(1) - (4)]), state, "GL_ARB_matrix_palette not supported");  	   YYERROR; @@ -2995,7 +2999,7 @@ yyreduce:    case 98:  /* Line 1455 of yacc.c  */ -#line 959 "program_parse.y" +#line 963 "program_parse.y"      {  	   (yyval.attrib) = VERT_ATTRIB_GENERIC0 + (yyvsp[(3) - (4)].integer);  	;} @@ -3004,7 +3008,7 @@ yyreduce:    case 99:  /* Line 1455 of yacc.c  */ -#line 965 "program_parse.y" +#line 969 "program_parse.y"      {  	   if ((unsigned) (yyvsp[(1) - (1)].integer) >= state->limits->MaxAttribs) {  	      yyerror(& (yylsp[(1) - (1)]), state, "invalid vertex attribute reference"); @@ -3018,7 +3022,7 @@ yyreduce:    case 103:  /* Line 1455 of yacc.c  */ -#line 979 "program_parse.y" +#line 983 "program_parse.y"      {  	   (yyval.attrib) = FRAG_ATTRIB_WPOS;  	;} @@ -3027,7 +3031,7 @@ yyreduce:    case 104:  /* Line 1455 of yacc.c  */ -#line 983 "program_parse.y" +#line 987 "program_parse.y"      {  	   (yyval.attrib) = FRAG_ATTRIB_COL0 + (yyvsp[(2) - (2)].integer);  	;} @@ -3036,7 +3040,7 @@ yyreduce:    case 105:  /* Line 1455 of yacc.c  */ -#line 987 "program_parse.y" +#line 991 "program_parse.y"      {  	   (yyval.attrib) = FRAG_ATTRIB_FOGC;  	;} @@ -3045,7 +3049,7 @@ yyreduce:    case 106:  /* Line 1455 of yacc.c  */ -#line 991 "program_parse.y" +#line 995 "program_parse.y"      {  	   (yyval.attrib) = FRAG_ATTRIB_TEX0 + (yyvsp[(2) - (2)].integer);  	;} @@ -3054,7 +3058,7 @@ yyreduce:    case 109:  /* Line 1455 of yacc.c  */ -#line 999 "program_parse.y" +#line 1003 "program_parse.y"      {  	   struct asm_symbol *const s =  	      declare_variable(state, (yyvsp[(2) - (3)].string), at_param, & (yylsp[(2) - (3)])); @@ -3073,7 +3077,7 @@ yyreduce:    case 110:  /* Line 1455 of yacc.c  */ -#line 1015 "program_parse.y" +#line 1019 "program_parse.y"      {  	   if (((yyvsp[(4) - (6)].integer) != 0) && ((unsigned) (yyvsp[(4) - (6)].integer) != (yyvsp[(6) - (6)].temp_sym).param_binding_length)) {  	      yyerror(& (yylsp[(4) - (6)]), state,  @@ -3098,7 +3102,7 @@ yyreduce:    case 111:  /* Line 1455 of yacc.c  */ -#line 1037 "program_parse.y" +#line 1041 "program_parse.y"      {  	   (yyval.integer) = 0;  	;} @@ -3107,7 +3111,7 @@ yyreduce:    case 112:  /* Line 1455 of yacc.c  */ -#line 1041 "program_parse.y" +#line 1045 "program_parse.y"      {  	   if (((yyvsp[(1) - (1)].integer) < 1) || ((unsigned) (yyvsp[(1) - (1)].integer) >= state->limits->MaxParameters)) {  	      yyerror(& (yylsp[(1) - (1)]), state, "invalid parameter array size"); @@ -3121,7 +3125,7 @@ yyreduce:    case 113:  /* Line 1455 of yacc.c  */ -#line 1052 "program_parse.y" +#line 1056 "program_parse.y"      {  	   (yyval.temp_sym) = (yyvsp[(2) - (2)].temp_sym);  	;} @@ -3130,7 +3134,7 @@ yyreduce:    case 114:  /* Line 1455 of yacc.c  */ -#line 1058 "program_parse.y" +#line 1062 "program_parse.y"      {  	   (yyval.temp_sym) = (yyvsp[(3) - (4)].temp_sym);  	;} @@ -3139,7 +3143,7 @@ yyreduce:    case 116:  /* Line 1455 of yacc.c  */ -#line 1065 "program_parse.y" +#line 1069 "program_parse.y"      {  	   (yyvsp[(1) - (3)].temp_sym).param_binding_length += (yyvsp[(3) - (3)].temp_sym).param_binding_length;  	   (yyval.temp_sym) = (yyvsp[(1) - (3)].temp_sym); @@ -3149,7 +3153,7 @@ yyreduce:    case 117:  /* Line 1455 of yacc.c  */ -#line 1072 "program_parse.y" +#line 1076 "program_parse.y"      {  	   memset(& (yyval.temp_sym), 0, sizeof((yyval.temp_sym)));  	   (yyval.temp_sym).param_binding_begin = ~0; @@ -3160,7 +3164,7 @@ yyreduce:    case 118:  /* Line 1455 of yacc.c  */ -#line 1078 "program_parse.y" +#line 1082 "program_parse.y"      {  	   memset(& (yyval.temp_sym), 0, sizeof((yyval.temp_sym)));  	   (yyval.temp_sym).param_binding_begin = ~0; @@ -3171,7 +3175,7 @@ yyreduce:    case 119:  /* Line 1455 of yacc.c  */ -#line 1084 "program_parse.y" +#line 1088 "program_parse.y"      {  	   memset(& (yyval.temp_sym), 0, sizeof((yyval.temp_sym)));  	   (yyval.temp_sym).param_binding_begin = ~0; @@ -3182,7 +3186,7 @@ yyreduce:    case 120:  /* Line 1455 of yacc.c  */ -#line 1092 "program_parse.y" +#line 1096 "program_parse.y"      {  	   memset(& (yyval.temp_sym), 0, sizeof((yyval.temp_sym)));  	   (yyval.temp_sym).param_binding_begin = ~0; @@ -3193,7 +3197,7 @@ yyreduce:    case 121:  /* Line 1455 of yacc.c  */ -#line 1098 "program_parse.y" +#line 1102 "program_parse.y"      {  	   memset(& (yyval.temp_sym), 0, sizeof((yyval.temp_sym)));  	   (yyval.temp_sym).param_binding_begin = ~0; @@ -3204,7 +3208,7 @@ yyreduce:    case 122:  /* Line 1455 of yacc.c  */ -#line 1104 "program_parse.y" +#line 1108 "program_parse.y"      {  	   memset(& (yyval.temp_sym), 0, sizeof((yyval.temp_sym)));  	   (yyval.temp_sym).param_binding_begin = ~0; @@ -3215,7 +3219,7 @@ yyreduce:    case 123:  /* Line 1455 of yacc.c  */ -#line 1112 "program_parse.y" +#line 1116 "program_parse.y"      {  	   memset(& (yyval.temp_sym), 0, sizeof((yyval.temp_sym)));  	   (yyval.temp_sym).param_binding_begin = ~0; @@ -3226,7 +3230,7 @@ yyreduce:    case 124:  /* Line 1455 of yacc.c  */ -#line 1118 "program_parse.y" +#line 1122 "program_parse.y"      {  	   memset(& (yyval.temp_sym), 0, sizeof((yyval.temp_sym)));  	   (yyval.temp_sym).param_binding_begin = ~0; @@ -3237,7 +3241,7 @@ yyreduce:    case 125:  /* Line 1455 of yacc.c  */ -#line 1124 "program_parse.y" +#line 1128 "program_parse.y"      {  	   memset(& (yyval.temp_sym), 0, sizeof((yyval.temp_sym)));  	   (yyval.temp_sym).param_binding_begin = ~0; @@ -3248,98 +3252,98 @@ yyreduce:    case 126:  /* Line 1455 of yacc.c  */ -#line 1131 "program_parse.y" +#line 1135 "program_parse.y"      { memcpy((yyval.state), (yyvsp[(1) - (1)].state), sizeof((yyval.state))); ;}      break;    case 127:  /* Line 1455 of yacc.c  */ -#line 1132 "program_parse.y" +#line 1136 "program_parse.y"      { memcpy((yyval.state), (yyvsp[(2) - (2)].state), sizeof((yyval.state))); ;}      break;    case 128:  /* Line 1455 of yacc.c  */ -#line 1135 "program_parse.y" +#line 1139 "program_parse.y"      { memcpy((yyval.state), (yyvsp[(2) - (2)].state), sizeof((yyval.state))); ;}      break;    case 129:  /* Line 1455 of yacc.c  */ -#line 1136 "program_parse.y" +#line 1140 "program_parse.y"      { memcpy((yyval.state), (yyvsp[(2) - (2)].state), sizeof((yyval.state))); ;}      break;    case 130:  /* Line 1455 of yacc.c  */ -#line 1137 "program_parse.y" +#line 1141 "program_parse.y"      { memcpy((yyval.state), (yyvsp[(2) - (2)].state), sizeof((yyval.state))); ;}      break;    case 131:  /* Line 1455 of yacc.c  */ -#line 1138 "program_parse.y" +#line 1142 "program_parse.y"      { memcpy((yyval.state), (yyvsp[(2) - (2)].state), sizeof((yyval.state))); ;}      break;    case 132:  /* Line 1455 of yacc.c  */ -#line 1139 "program_parse.y" +#line 1143 "program_parse.y"      { memcpy((yyval.state), (yyvsp[(2) - (2)].state), sizeof((yyval.state))); ;}      break;    case 133:  /* Line 1455 of yacc.c  */ -#line 1140 "program_parse.y" +#line 1144 "program_parse.y"      { memcpy((yyval.state), (yyvsp[(2) - (2)].state), sizeof((yyval.state))); ;}      break;    case 134:  /* Line 1455 of yacc.c  */ -#line 1141 "program_parse.y" +#line 1145 "program_parse.y"      { memcpy((yyval.state), (yyvsp[(2) - (2)].state), sizeof((yyval.state))); ;}      break;    case 135:  /* Line 1455 of yacc.c  */ -#line 1142 "program_parse.y" +#line 1146 "program_parse.y"      { memcpy((yyval.state), (yyvsp[(2) - (2)].state), sizeof((yyval.state))); ;}      break;    case 136:  /* Line 1455 of yacc.c  */ -#line 1143 "program_parse.y" +#line 1147 "program_parse.y"      { memcpy((yyval.state), (yyvsp[(2) - (2)].state), sizeof((yyval.state))); ;}      break;    case 137:  /* Line 1455 of yacc.c  */ -#line 1144 "program_parse.y" +#line 1148 "program_parse.y"      { memcpy((yyval.state), (yyvsp[(2) - (2)].state), sizeof((yyval.state))); ;}      break;    case 138:  /* Line 1455 of yacc.c  */ -#line 1145 "program_parse.y" +#line 1149 "program_parse.y"      { memcpy((yyval.state), (yyvsp[(2) - (2)].state), sizeof((yyval.state))); ;}      break;    case 139:  /* Line 1455 of yacc.c  */ -#line 1149 "program_parse.y" +#line 1153 "program_parse.y"      {  	   memset((yyval.state), 0, sizeof((yyval.state)));  	   (yyval.state)[0] = STATE_MATERIAL; @@ -3351,7 +3355,7 @@ yyreduce:    case 140:  /* Line 1455 of yacc.c  */ -#line 1158 "program_parse.y" +#line 1162 "program_parse.y"      {  	   (yyval.integer) = (yyvsp[(1) - (1)].integer);  	;} @@ -3360,7 +3364,7 @@ yyreduce:    case 141:  /* Line 1455 of yacc.c  */ -#line 1162 "program_parse.y" +#line 1166 "program_parse.y"      {  	   (yyval.integer) = STATE_EMISSION;  	;} @@ -3369,7 +3373,7 @@ yyreduce:    case 142:  /* Line 1455 of yacc.c  */ -#line 1166 "program_parse.y" +#line 1170 "program_parse.y"      {  	   (yyval.integer) = STATE_SHININESS;  	;} @@ -3378,7 +3382,7 @@ yyreduce:    case 143:  /* Line 1455 of yacc.c  */ -#line 1172 "program_parse.y" +#line 1176 "program_parse.y"      {  	   memset((yyval.state), 0, sizeof((yyval.state)));  	   (yyval.state)[0] = STATE_LIGHT; @@ -3390,7 +3394,7 @@ yyreduce:    case 144:  /* Line 1455 of yacc.c  */ -#line 1181 "program_parse.y" +#line 1185 "program_parse.y"      {  	   (yyval.integer) = (yyvsp[(1) - (1)].integer);  	;} @@ -3399,7 +3403,7 @@ yyreduce:    case 145:  /* Line 1455 of yacc.c  */ -#line 1185 "program_parse.y" +#line 1189 "program_parse.y"      {  	   (yyval.integer) = STATE_POSITION;  	;} @@ -3408,7 +3412,7 @@ yyreduce:    case 146:  /* Line 1455 of yacc.c  */ -#line 1189 "program_parse.y" +#line 1193 "program_parse.y"      {  	   if (!state->ctx->Extensions.EXT_point_parameters) {  	      yyerror(& (yylsp[(1) - (1)]), state, "GL_ARB_point_parameters not supported"); @@ -3422,7 +3426,7 @@ yyreduce:    case 147:  /* Line 1455 of yacc.c  */ -#line 1198 "program_parse.y" +#line 1202 "program_parse.y"      {  	   (yyval.integer) = (yyvsp[(2) - (2)].integer);  	;} @@ -3431,7 +3435,7 @@ yyreduce:    case 148:  /* Line 1455 of yacc.c  */ -#line 1202 "program_parse.y" +#line 1206 "program_parse.y"      {  	   (yyval.integer) = STATE_HALF_VECTOR;  	;} @@ -3440,7 +3444,7 @@ yyreduce:    case 149:  /* Line 1455 of yacc.c  */ -#line 1208 "program_parse.y" +#line 1212 "program_parse.y"      {  	   (yyval.integer) = STATE_SPOT_DIRECTION;  	;} @@ -3449,7 +3453,7 @@ yyreduce:    case 150:  /* Line 1455 of yacc.c  */ -#line 1214 "program_parse.y" +#line 1218 "program_parse.y"      {  	   (yyval.state)[0] = (yyvsp[(2) - (2)].state)[0];  	   (yyval.state)[1] = (yyvsp[(2) - (2)].state)[1]; @@ -3459,7 +3463,7 @@ yyreduce:    case 151:  /* Line 1455 of yacc.c  */ -#line 1221 "program_parse.y" +#line 1225 "program_parse.y"      {  	   memset((yyval.state), 0, sizeof((yyval.state)));  	   (yyval.state)[0] = STATE_LIGHTMODEL_AMBIENT; @@ -3469,7 +3473,7 @@ yyreduce:    case 152:  /* Line 1455 of yacc.c  */ -#line 1226 "program_parse.y" +#line 1230 "program_parse.y"      {  	   memset((yyval.state), 0, sizeof((yyval.state)));  	   (yyval.state)[0] = STATE_LIGHTMODEL_SCENECOLOR; @@ -3480,7 +3484,7 @@ yyreduce:    case 153:  /* Line 1455 of yacc.c  */ -#line 1234 "program_parse.y" +#line 1238 "program_parse.y"      {  	   memset((yyval.state), 0, sizeof((yyval.state)));  	   (yyval.state)[0] = STATE_LIGHTPROD; @@ -3493,7 +3497,7 @@ yyreduce:    case 155:  /* Line 1455 of yacc.c  */ -#line 1246 "program_parse.y" +#line 1250 "program_parse.y"      {  	   memset((yyval.state), 0, sizeof((yyval.state)));  	   (yyval.state)[0] = (yyvsp[(3) - (3)].integer); @@ -3504,7 +3508,7 @@ yyreduce:    case 156:  /* Line 1455 of yacc.c  */ -#line 1254 "program_parse.y" +#line 1258 "program_parse.y"      {  	   (yyval.integer) = STATE_TEXENV_COLOR;  	;} @@ -3513,7 +3517,7 @@ yyreduce:    case 157:  /* Line 1455 of yacc.c  */ -#line 1260 "program_parse.y" +#line 1264 "program_parse.y"      {  	   (yyval.integer) = STATE_AMBIENT;  	;} @@ -3522,7 +3526,7 @@ yyreduce:    case 158:  /* Line 1455 of yacc.c  */ -#line 1264 "program_parse.y" +#line 1268 "program_parse.y"      {  	   (yyval.integer) = STATE_DIFFUSE;  	;} @@ -3531,7 +3535,7 @@ yyreduce:    case 159:  /* Line 1455 of yacc.c  */ -#line 1268 "program_parse.y" +#line 1272 "program_parse.y"      {  	   (yyval.integer) = STATE_SPECULAR;  	;} @@ -3540,7 +3544,7 @@ yyreduce:    case 160:  /* Line 1455 of yacc.c  */ -#line 1274 "program_parse.y" +#line 1278 "program_parse.y"      {  	   if ((unsigned) (yyvsp[(1) - (1)].integer) >= state->MaxLights) {  	      yyerror(& (yylsp[(1) - (1)]), state, "invalid light selector"); @@ -3554,7 +3558,7 @@ yyreduce:    case 161:  /* Line 1455 of yacc.c  */ -#line 1285 "program_parse.y" +#line 1289 "program_parse.y"      {  	   memset((yyval.state), 0, sizeof((yyval.state)));  	   (yyval.state)[0] = STATE_TEXGEN; @@ -3566,7 +3570,7 @@ yyreduce:    case 162:  /* Line 1455 of yacc.c  */ -#line 1294 "program_parse.y" +#line 1298 "program_parse.y"      {  	   (yyval.integer) = STATE_TEXGEN_EYE_S;  	;} @@ -3575,7 +3579,7 @@ yyreduce:    case 163:  /* Line 1455 of yacc.c  */ -#line 1298 "program_parse.y" +#line 1302 "program_parse.y"      {  	   (yyval.integer) = STATE_TEXGEN_OBJECT_S;  	;} @@ -3584,7 +3588,7 @@ yyreduce:    case 164:  /* Line 1455 of yacc.c  */ -#line 1303 "program_parse.y" +#line 1307 "program_parse.y"      {  	   (yyval.integer) = STATE_TEXGEN_EYE_S - STATE_TEXGEN_EYE_S;  	;} @@ -3593,7 +3597,7 @@ yyreduce:    case 165:  /* Line 1455 of yacc.c  */ -#line 1307 "program_parse.y" +#line 1311 "program_parse.y"      {  	   (yyval.integer) = STATE_TEXGEN_EYE_T - STATE_TEXGEN_EYE_S;  	;} @@ -3602,7 +3606,7 @@ yyreduce:    case 166:  /* Line 1455 of yacc.c  */ -#line 1311 "program_parse.y" +#line 1315 "program_parse.y"      {  	   (yyval.integer) = STATE_TEXGEN_EYE_R - STATE_TEXGEN_EYE_S;  	;} @@ -3611,7 +3615,7 @@ yyreduce:    case 167:  /* Line 1455 of yacc.c  */ -#line 1315 "program_parse.y" +#line 1319 "program_parse.y"      {  	   (yyval.integer) = STATE_TEXGEN_EYE_Q - STATE_TEXGEN_EYE_S;  	;} @@ -3620,7 +3624,7 @@ yyreduce:    case 168:  /* Line 1455 of yacc.c  */ -#line 1321 "program_parse.y" +#line 1325 "program_parse.y"      {  	   memset((yyval.state), 0, sizeof((yyval.state)));  	   (yyval.state)[0] = (yyvsp[(2) - (2)].integer); @@ -3630,7 +3634,7 @@ yyreduce:    case 169:  /* Line 1455 of yacc.c  */ -#line 1328 "program_parse.y" +#line 1332 "program_parse.y"      {  	   (yyval.integer) = STATE_FOG_COLOR;  	;} @@ -3639,7 +3643,7 @@ yyreduce:    case 170:  /* Line 1455 of yacc.c  */ -#line 1332 "program_parse.y" +#line 1336 "program_parse.y"      {  	   (yyval.integer) = STATE_FOG_PARAMS;  	;} @@ -3648,7 +3652,7 @@ yyreduce:    case 171:  /* Line 1455 of yacc.c  */ -#line 1338 "program_parse.y" +#line 1342 "program_parse.y"      {  	   memset((yyval.state), 0, sizeof((yyval.state)));  	   (yyval.state)[0] = STATE_CLIPPLANE; @@ -3659,7 +3663,7 @@ yyreduce:    case 172:  /* Line 1455 of yacc.c  */ -#line 1346 "program_parse.y" +#line 1350 "program_parse.y"      {  	   if ((unsigned) (yyvsp[(1) - (1)].integer) >= state->MaxClipPlanes) {  	      yyerror(& (yylsp[(1) - (1)]), state, "invalid clip plane selector"); @@ -3673,7 +3677,7 @@ yyreduce:    case 173:  /* Line 1455 of yacc.c  */ -#line 1357 "program_parse.y" +#line 1361 "program_parse.y"      {  	   memset((yyval.state), 0, sizeof((yyval.state)));  	   (yyval.state)[0] = (yyvsp[(2) - (2)].integer); @@ -3683,7 +3687,7 @@ yyreduce:    case 174:  /* Line 1455 of yacc.c  */ -#line 1364 "program_parse.y" +#line 1368 "program_parse.y"      {  	   (yyval.integer) = STATE_POINT_SIZE;  	;} @@ -3692,7 +3696,7 @@ yyreduce:    case 175:  /* Line 1455 of yacc.c  */ -#line 1368 "program_parse.y" +#line 1372 "program_parse.y"      {  	   (yyval.integer) = STATE_POINT_ATTENUATION;  	;} @@ -3701,7 +3705,7 @@ yyreduce:    case 176:  /* Line 1455 of yacc.c  */ -#line 1374 "program_parse.y" +#line 1378 "program_parse.y"      {  	   (yyval.state)[0] = (yyvsp[(1) - (5)].state)[0];  	   (yyval.state)[1] = (yyvsp[(1) - (5)].state)[1]; @@ -3714,7 +3718,7 @@ yyreduce:    case 177:  /* Line 1455 of yacc.c  */ -#line 1384 "program_parse.y" +#line 1388 "program_parse.y"      {  	   (yyval.state)[0] = (yyvsp[(1) - (2)].state)[0];  	   (yyval.state)[1] = (yyvsp[(1) - (2)].state)[1]; @@ -3727,7 +3731,7 @@ yyreduce:    case 178:  /* Line 1455 of yacc.c  */ -#line 1394 "program_parse.y" +#line 1398 "program_parse.y"      {  	   (yyval.state)[2] = 0;  	   (yyval.state)[3] = 3; @@ -3737,7 +3741,7 @@ yyreduce:    case 179:  /* Line 1455 of yacc.c  */ -#line 1399 "program_parse.y" +#line 1403 "program_parse.y"      {  	   /* It seems logical that the matrix row range specifier would have  	    * to specify a range or more than one row (i.e., $5 > $3). @@ -3758,7 +3762,7 @@ yyreduce:    case 180:  /* Line 1455 of yacc.c  */ -#line 1417 "program_parse.y" +#line 1421 "program_parse.y"      {  	   (yyval.state)[0] = (yyvsp[(2) - (3)].state)[0];  	   (yyval.state)[1] = (yyvsp[(2) - (3)].state)[1]; @@ -3769,7 +3773,7 @@ yyreduce:    case 181:  /* Line 1455 of yacc.c  */ -#line 1425 "program_parse.y" +#line 1429 "program_parse.y"      {  	   (yyval.integer) = 0;  	;} @@ -3778,7 +3782,7 @@ yyreduce:    case 182:  /* Line 1455 of yacc.c  */ -#line 1429 "program_parse.y" +#line 1433 "program_parse.y"      {  	   (yyval.integer) = (yyvsp[(1) - (1)].integer);  	;} @@ -3787,7 +3791,7 @@ yyreduce:    case 183:  /* Line 1455 of yacc.c  */ -#line 1435 "program_parse.y" +#line 1439 "program_parse.y"      {  	   (yyval.integer) = STATE_MATRIX_INVERSE;  	;} @@ -3796,7 +3800,7 @@ yyreduce:    case 184:  /* Line 1455 of yacc.c  */ -#line 1439 "program_parse.y" +#line 1443 "program_parse.y"      {  	   (yyval.integer) = STATE_MATRIX_TRANSPOSE;  	;} @@ -3805,7 +3809,7 @@ yyreduce:    case 185:  /* Line 1455 of yacc.c  */ -#line 1443 "program_parse.y" +#line 1447 "program_parse.y"      {  	   (yyval.integer) = STATE_MATRIX_INVTRANS;  	;} @@ -3814,7 +3818,7 @@ yyreduce:    case 186:  /* Line 1455 of yacc.c  */ -#line 1449 "program_parse.y" +#line 1453 "program_parse.y"      {  	   if ((yyvsp[(1) - (1)].integer) > 3) {  	      yyerror(& (yylsp[(1) - (1)]), state, "invalid matrix row reference"); @@ -3828,7 +3832,7 @@ yyreduce:    case 187:  /* Line 1455 of yacc.c  */ -#line 1460 "program_parse.y" +#line 1464 "program_parse.y"      {  	   (yyval.state)[0] = STATE_MODELVIEW_MATRIX;  	   (yyval.state)[1] = (yyvsp[(2) - (2)].integer); @@ -3838,7 +3842,7 @@ yyreduce:    case 188:  /* Line 1455 of yacc.c  */ -#line 1465 "program_parse.y" +#line 1469 "program_parse.y"      {  	   (yyval.state)[0] = STATE_PROJECTION_MATRIX;  	   (yyval.state)[1] = 0; @@ -3848,7 +3852,7 @@ yyreduce:    case 189:  /* Line 1455 of yacc.c  */ -#line 1470 "program_parse.y" +#line 1474 "program_parse.y"      {  	   (yyval.state)[0] = STATE_MVP_MATRIX;  	   (yyval.state)[1] = 0; @@ -3858,7 +3862,7 @@ yyreduce:    case 190:  /* Line 1455 of yacc.c  */ -#line 1475 "program_parse.y" +#line 1479 "program_parse.y"      {  	   (yyval.state)[0] = STATE_TEXTURE_MATRIX;  	   (yyval.state)[1] = (yyvsp[(2) - (2)].integer); @@ -3868,7 +3872,7 @@ yyreduce:    case 191:  /* Line 1455 of yacc.c  */ -#line 1480 "program_parse.y" +#line 1484 "program_parse.y"      {  	   yyerror(& (yylsp[(1) - (4)]), state, "GL_ARB_matrix_palette not supported");  	   YYERROR; @@ -3878,7 +3882,7 @@ yyreduce:    case 192:  /* Line 1455 of yacc.c  */ -#line 1485 "program_parse.y" +#line 1489 "program_parse.y"      {  	   (yyval.state)[0] = STATE_PROGRAM_MATRIX;  	   (yyval.state)[1] = (yyvsp[(3) - (4)].integer); @@ -3888,7 +3892,7 @@ yyreduce:    case 193:  /* Line 1455 of yacc.c  */ -#line 1492 "program_parse.y" +#line 1496 "program_parse.y"      {  	   (yyval.integer) = 0;  	;} @@ -3897,7 +3901,7 @@ yyreduce:    case 194:  /* Line 1455 of yacc.c  */ -#line 1496 "program_parse.y" +#line 1500 "program_parse.y"      {  	   (yyval.integer) = (yyvsp[(2) - (3)].integer);  	;} @@ -3906,7 +3910,7 @@ yyreduce:    case 195:  /* Line 1455 of yacc.c  */ -#line 1501 "program_parse.y" +#line 1505 "program_parse.y"      {  	   /* Since GL_ARB_vertex_blend isn't supported, only modelview matrix  	    * zero is valid. @@ -3923,7 +3927,7 @@ yyreduce:    case 196:  /* Line 1455 of yacc.c  */ -#line 1514 "program_parse.y" +#line 1518 "program_parse.y"      {  	   /* Since GL_ARB_matrix_palette isn't supported, just let any value  	    * through here.  The error will be generated later. @@ -3935,7 +3939,7 @@ yyreduce:    case 197:  /* Line 1455 of yacc.c  */ -#line 1522 "program_parse.y" +#line 1526 "program_parse.y"      {  	   if ((unsigned) (yyvsp[(1) - (1)].integer) >= state->MaxProgramMatrices) {  	      yyerror(& (yylsp[(1) - (1)]), state, "invalid program matrix selector"); @@ -3949,7 +3953,7 @@ yyreduce:    case 198:  /* Line 1455 of yacc.c  */ -#line 1533 "program_parse.y" +#line 1537 "program_parse.y"      {  	   memset((yyval.state), 0, sizeof((yyval.state)));  	   (yyval.state)[0] = STATE_DEPTH_RANGE; @@ -3959,7 +3963,7 @@ yyreduce:    case 203:  /* Line 1455 of yacc.c  */ -#line 1545 "program_parse.y" +#line 1549 "program_parse.y"      {  	   memset((yyval.state), 0, sizeof((yyval.state)));  	   (yyval.state)[0] = state->state_param_enum; @@ -3972,7 +3976,7 @@ yyreduce:    case 204:  /* Line 1455 of yacc.c  */ -#line 1555 "program_parse.y" +#line 1559 "program_parse.y"      {  	   (yyval.state)[0] = (yyvsp[(1) - (1)].integer);  	   (yyval.state)[1] = (yyvsp[(1) - (1)].integer); @@ -3982,7 +3986,7 @@ yyreduce:    case 205:  /* Line 1455 of yacc.c  */ -#line 1560 "program_parse.y" +#line 1564 "program_parse.y"      {  	   (yyval.state)[0] = (yyvsp[(1) - (3)].integer);  	   (yyval.state)[1] = (yyvsp[(3) - (3)].integer); @@ -3992,7 +3996,7 @@ yyreduce:    case 206:  /* Line 1455 of yacc.c  */ -#line 1567 "program_parse.y" +#line 1571 "program_parse.y"      {  	   memset((yyval.state), 0, sizeof((yyval.state)));  	   (yyval.state)[0] = state->state_param_enum; @@ -4005,7 +4009,7 @@ yyreduce:    case 207:  /* Line 1455 of yacc.c  */ -#line 1577 "program_parse.y" +#line 1581 "program_parse.y"      {  	   memset((yyval.state), 0, sizeof((yyval.state)));  	   (yyval.state)[0] = state->state_param_enum; @@ -4018,7 +4022,7 @@ yyreduce:    case 208:  /* Line 1455 of yacc.c  */ -#line 1586 "program_parse.y" +#line 1590 "program_parse.y"      {  	   (yyval.state)[0] = (yyvsp[(1) - (1)].integer);  	   (yyval.state)[1] = (yyvsp[(1) - (1)].integer); @@ -4028,7 +4032,7 @@ yyreduce:    case 209:  /* Line 1455 of yacc.c  */ -#line 1591 "program_parse.y" +#line 1595 "program_parse.y"      {  	   (yyval.state)[0] = (yyvsp[(1) - (3)].integer);  	   (yyval.state)[1] = (yyvsp[(3) - (3)].integer); @@ -4038,7 +4042,7 @@ yyreduce:    case 210:  /* Line 1455 of yacc.c  */ -#line 1598 "program_parse.y" +#line 1602 "program_parse.y"      {  	   memset((yyval.state), 0, sizeof((yyval.state)));  	   (yyval.state)[0] = state->state_param_enum; @@ -4051,7 +4055,7 @@ yyreduce:    case 211:  /* Line 1455 of yacc.c  */ -#line 1608 "program_parse.y" +#line 1612 "program_parse.y"      {  	   if ((unsigned) (yyvsp[(1) - (1)].integer) >= state->limits->MaxEnvParams) {  	      yyerror(& (yylsp[(1) - (1)]), state, "invalid environment parameter reference"); @@ -4064,7 +4068,7 @@ yyreduce:    case 212:  /* Line 1455 of yacc.c  */ -#line 1618 "program_parse.y" +#line 1622 "program_parse.y"      {  	   if ((unsigned) (yyvsp[(1) - (1)].integer) >= state->limits->MaxLocalParams) {  	      yyerror(& (yylsp[(1) - (1)]), state, "invalid local parameter reference"); @@ -4077,7 +4081,7 @@ yyreduce:    case 217:  /* Line 1455 of yacc.c  */ -#line 1633 "program_parse.y" +#line 1637 "program_parse.y"      {  	   (yyval.vector).count = 4;  	   (yyval.vector).data[0] = (yyvsp[(1) - (1)].real); @@ -4090,7 +4094,7 @@ yyreduce:    case 218:  /* Line 1455 of yacc.c  */ -#line 1643 "program_parse.y" +#line 1647 "program_parse.y"      {  	   (yyval.vector).count = 1;  	   (yyval.vector).data[0] = (yyvsp[(1) - (1)].real); @@ -4103,7 +4107,7 @@ yyreduce:    case 219:  /* Line 1455 of yacc.c  */ -#line 1651 "program_parse.y" +#line 1655 "program_parse.y"      {  	   (yyval.vector).count = 1;  	   (yyval.vector).data[0] = (float) (yyvsp[(1) - (1)].integer); @@ -4116,7 +4120,7 @@ yyreduce:    case 220:  /* Line 1455 of yacc.c  */ -#line 1661 "program_parse.y" +#line 1665 "program_parse.y"      {  	   (yyval.vector).count = 4;  	   (yyval.vector).data[0] = (yyvsp[(2) - (3)].real); @@ -4129,7 +4133,7 @@ yyreduce:    case 221:  /* Line 1455 of yacc.c  */ -#line 1669 "program_parse.y" +#line 1673 "program_parse.y"      {  	   (yyval.vector).count = 4;  	   (yyval.vector).data[0] = (yyvsp[(2) - (5)].real); @@ -4142,7 +4146,7 @@ yyreduce:    case 222:  /* Line 1455 of yacc.c  */ -#line 1678 "program_parse.y" +#line 1682 "program_parse.y"      {  	   (yyval.vector).count = 4;  	   (yyval.vector).data[0] = (yyvsp[(2) - (7)].real); @@ -4155,7 +4159,7 @@ yyreduce:    case 223:  /* Line 1455 of yacc.c  */ -#line 1687 "program_parse.y" +#line 1691 "program_parse.y"      {  	   (yyval.vector).count = 4;  	   (yyval.vector).data[0] = (yyvsp[(2) - (9)].real); @@ -4168,7 +4172,7 @@ yyreduce:    case 224:  /* Line 1455 of yacc.c  */ -#line 1697 "program_parse.y" +#line 1701 "program_parse.y"      {  	   (yyval.real) = ((yyvsp[(1) - (2)].negate)) ? -(yyvsp[(2) - (2)].real) : (yyvsp[(2) - (2)].real);  	;} @@ -4177,7 +4181,7 @@ yyreduce:    case 225:  /* Line 1455 of yacc.c  */ -#line 1701 "program_parse.y" +#line 1705 "program_parse.y"      {  	   (yyval.real) = (float)(((yyvsp[(1) - (2)].negate)) ? -(yyvsp[(2) - (2)].integer) : (yyvsp[(2) - (2)].integer));  	;} @@ -4186,42 +4190,42 @@ yyreduce:    case 226:  /* Line 1455 of yacc.c  */ -#line 1706 "program_parse.y" +#line 1710 "program_parse.y"      { (yyval.negate) = FALSE; ;}      break;    case 227:  /* Line 1455 of yacc.c  */ -#line 1707 "program_parse.y" +#line 1711 "program_parse.y"      { (yyval.negate) = TRUE;  ;}      break;    case 228:  /* Line 1455 of yacc.c  */ -#line 1708 "program_parse.y" +#line 1712 "program_parse.y"      { (yyval.negate) = FALSE; ;}      break;    case 229:  /* Line 1455 of yacc.c  */ -#line 1711 "program_parse.y" +#line 1715 "program_parse.y"      { (yyval.integer) = (yyvsp[(1) - (1)].integer); ;}      break;    case 231:  /* Line 1455 of yacc.c  */ -#line 1714 "program_parse.y" +#line 1718 "program_parse.y"      { (yyval.integer) = (yyvsp[(1) - (1)].integer); ;}      break;    case 233:  /* Line 1455 of yacc.c  */ -#line 1718 "program_parse.y" +#line 1722 "program_parse.y"      {  	   if (!declare_variable(state, (yyvsp[(3) - (3)].string), (yyvsp[(0) - (3)].integer), & (yylsp[(3) - (3)]))) {  	      YYERROR; @@ -4232,7 +4236,7 @@ yyreduce:    case 234:  /* Line 1455 of yacc.c  */ -#line 1724 "program_parse.y" +#line 1728 "program_parse.y"      {  	   if (!declare_variable(state, (yyvsp[(1) - (1)].string), (yyvsp[(0) - (1)].integer), & (yylsp[(1) - (1)]))) {  	      YYERROR; @@ -4243,7 +4247,7 @@ yyreduce:    case 235:  /* Line 1455 of yacc.c  */ -#line 1732 "program_parse.y" +#line 1736 "program_parse.y"      {  	   struct asm_symbol *const s =  	      declare_variable(state, (yyvsp[(2) - (4)].string), at_output, & (yylsp[(2) - (4)])); @@ -4259,7 +4263,7 @@ yyreduce:    case 236:  /* Line 1455 of yacc.c  */ -#line 1745 "program_parse.y" +#line 1749 "program_parse.y"      {  	   if (state->mode == ARB_vertex) {  	      (yyval.result) = VERT_RESULT_HPOS; @@ -4273,7 +4277,7 @@ yyreduce:    case 237:  /* Line 1455 of yacc.c  */ -#line 1754 "program_parse.y" +#line 1758 "program_parse.y"      {  	   if (state->mode == ARB_vertex) {  	      (yyval.result) = VERT_RESULT_FOGC; @@ -4287,7 +4291,7 @@ yyreduce:    case 238:  /* Line 1455 of yacc.c  */ -#line 1763 "program_parse.y" +#line 1767 "program_parse.y"      {  	   (yyval.result) = (yyvsp[(2) - (2)].result);  	;} @@ -4296,7 +4300,7 @@ yyreduce:    case 239:  /* Line 1455 of yacc.c  */ -#line 1767 "program_parse.y" +#line 1771 "program_parse.y"      {  	   if (state->mode == ARB_vertex) {  	      (yyval.result) = VERT_RESULT_PSIZ; @@ -4310,7 +4314,7 @@ yyreduce:    case 240:  /* Line 1455 of yacc.c  */ -#line 1776 "program_parse.y" +#line 1780 "program_parse.y"      {  	   if (state->mode == ARB_vertex) {  	      (yyval.result) = VERT_RESULT_TEX0 + (yyvsp[(3) - (3)].integer); @@ -4324,7 +4328,7 @@ yyreduce:    case 241:  /* Line 1455 of yacc.c  */ -#line 1785 "program_parse.y" +#line 1789 "program_parse.y"      {  	   if (state->mode == ARB_fragment) {  	      (yyval.result) = FRAG_RESULT_DEPTH; @@ -4338,7 +4342,7 @@ yyreduce:    case 242:  /* Line 1455 of yacc.c  */ -#line 1796 "program_parse.y" +#line 1800 "program_parse.y"      {  	   (yyval.result) = (yyvsp[(2) - (3)].integer) + (yyvsp[(3) - (3)].integer);  	;} @@ -4347,7 +4351,7 @@ yyreduce:    case 243:  /* Line 1455 of yacc.c  */ -#line 1802 "program_parse.y" +#line 1806 "program_parse.y"      {  	   (yyval.integer) = (state->mode == ARB_vertex)  	      ? VERT_RESULT_COL0 @@ -4358,7 +4362,7 @@ yyreduce:    case 244:  /* Line 1455 of yacc.c  */ -#line 1808 "program_parse.y" +#line 1812 "program_parse.y"      {  	   if (state->mode == ARB_vertex) {  	      (yyval.integer) = VERT_RESULT_COL0; @@ -4372,7 +4376,7 @@ yyreduce:    case 245:  /* Line 1455 of yacc.c  */ -#line 1817 "program_parse.y" +#line 1821 "program_parse.y"      {  	   if (state->mode == ARB_vertex) {  	      (yyval.integer) = VERT_RESULT_BFC0; @@ -4386,7 +4390,7 @@ yyreduce:    case 246:  /* Line 1455 of yacc.c  */ -#line 1828 "program_parse.y" +#line 1832 "program_parse.y"      {  	   (yyval.integer) = 0;   	;} @@ -4395,7 +4399,7 @@ yyreduce:    case 247:  /* Line 1455 of yacc.c  */ -#line 1832 "program_parse.y" +#line 1836 "program_parse.y"      {  	   if (state->mode == ARB_vertex) {  	      (yyval.integer) = 0; @@ -4409,7 +4413,7 @@ yyreduce:    case 248:  /* Line 1455 of yacc.c  */ -#line 1841 "program_parse.y" +#line 1845 "program_parse.y"      {  	   if (state->mode == ARB_vertex) {  	      (yyval.integer) = 1; @@ -4423,91 +4427,91 @@ yyreduce:    case 249:  /* Line 1455 of yacc.c  */ -#line 1851 "program_parse.y" +#line 1855 "program_parse.y"      { (yyval.integer) = 0; ;}      break;    case 250:  /* Line 1455 of yacc.c  */ -#line 1852 "program_parse.y" +#line 1856 "program_parse.y"      { (yyval.integer) = 0; ;}      break;    case 251:  /* Line 1455 of yacc.c  */ -#line 1853 "program_parse.y" +#line 1857 "program_parse.y"      { (yyval.integer) = 1; ;}      break;    case 252:  /* Line 1455 of yacc.c  */ -#line 1856 "program_parse.y" +#line 1860 "program_parse.y"      { (yyval.integer) = 0; ;}      break;    case 253:  /* Line 1455 of yacc.c  */ -#line 1857 "program_parse.y" +#line 1861 "program_parse.y"      { (yyval.integer) = 0; ;}      break;    case 254:  /* Line 1455 of yacc.c  */ -#line 1858 "program_parse.y" +#line 1862 "program_parse.y"      { (yyval.integer) = 1; ;}      break;    case 255:  /* Line 1455 of yacc.c  */ -#line 1861 "program_parse.y" +#line 1865 "program_parse.y"      { (yyval.integer) = 0; ;}      break;    case 256:  /* Line 1455 of yacc.c  */ -#line 1862 "program_parse.y" +#line 1866 "program_parse.y"      { (yyval.integer) = (yyvsp[(2) - (3)].integer); ;}      break;    case 257:  /* Line 1455 of yacc.c  */ -#line 1865 "program_parse.y" +#line 1869 "program_parse.y"      { (yyval.integer) = 0; ;}      break;    case 258:  /* Line 1455 of yacc.c  */ -#line 1866 "program_parse.y" +#line 1870 "program_parse.y"      { (yyval.integer) = (yyvsp[(2) - (3)].integer); ;}      break;    case 259:  /* Line 1455 of yacc.c  */ -#line 1869 "program_parse.y" +#line 1873 "program_parse.y"      { (yyval.integer) = 0; ;}      break;    case 260:  /* Line 1455 of yacc.c  */ -#line 1870 "program_parse.y" +#line 1874 "program_parse.y"      { (yyval.integer) = (yyvsp[(2) - (3)].integer); ;}      break;    case 261:  /* Line 1455 of yacc.c  */ -#line 1874 "program_parse.y" +#line 1878 "program_parse.y"      {  	   if ((unsigned) (yyvsp[(1) - (1)].integer) >= state->MaxTextureCoordUnits) {  	      yyerror(& (yylsp[(1) - (1)]), state, "invalid texture coordinate unit selector"); @@ -4521,7 +4525,7 @@ yyreduce:    case 262:  /* Line 1455 of yacc.c  */ -#line 1885 "program_parse.y" +#line 1889 "program_parse.y"      {  	   if ((unsigned) (yyvsp[(1) - (1)].integer) >= state->MaxTextureImageUnits) {  	      yyerror(& (yylsp[(1) - (1)]), state, "invalid texture image unit selector"); @@ -4535,7 +4539,7 @@ yyreduce:    case 263:  /* Line 1455 of yacc.c  */ -#line 1896 "program_parse.y" +#line 1900 "program_parse.y"      {  	   if ((unsigned) (yyvsp[(1) - (1)].integer) >= state->MaxTextureUnits) {  	      yyerror(& (yylsp[(1) - (1)]), state, "invalid texture unit selector"); @@ -4549,7 +4553,7 @@ yyreduce:    case 264:  /* Line 1455 of yacc.c  */ -#line 1907 "program_parse.y" +#line 1911 "program_parse.y"      {  	   struct asm_symbol *exist = (struct asm_symbol *)  	      _mesa_symbol_table_find_symbol(state->st, 0, (yyvsp[(2) - (4)].string)); @@ -4573,7 +4577,7 @@ yyreduce:  /* Line 1455 of yacc.c  */ -#line 4577 "program_parse.tab.c" +#line 4581 "program_parse.tab.c"        default: break;      }    YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); @@ -4792,7 +4796,7 @@ yyreturn:  /* Line 1675 of yacc.c  */ -#line 1927 "program_parse.y" +#line 1931 "program_parse.y"  struct asm_instruction * diff --git a/src/mesa/shader/program_parse.y b/src/mesa/shader/program_parse.y index 06c1915fbe..89da91064b 100644 --- a/src/mesa/shader/program_parse.y +++ b/src/mesa/shader/program_parse.y @@ -806,8 +806,10 @@ addrRegRelOffset:              { $$ = 0; }  addrRegPosOffset: INTEGER  	{  	   if (($1 < 0) || ($1 > 63)) { -	      yyerror(& @1, state, -		      "relative address offset too large (positive)"); +              char s[100]; +              _mesa_snprintf(s, sizeof(s), +                             "relative address offset too large (%d)", $1); +	      yyerror(& @1, state, s);  	      YYERROR;  	   } else {  	      $$ = $1; @@ -818,8 +820,10 @@ addrRegPosOffset: INTEGER  addrRegNegOffset: INTEGER  	{  	   if (($1 < 0) || ($1 > 64)) { -	      yyerror(& @1, state, -		      "relative address offset too large (negative)"); +              char s[100]; +              _mesa_snprintf(s, sizeof(s), +                             "relative address offset too large (%d)", $1); +	      yyerror(& @1, state, s);  	      YYERROR;  	   } else {  	      $$ = $1; diff --git a/src/mesa/shader/shader_api.c b/src/mesa/shader/shader_api.c index 54a25dfaf0..178b7d0dba 100644 --- a/src/mesa/shader/shader_api.c +++ b/src/mesa/shader/shader_api.c @@ -1474,6 +1474,21 @@ _mesa_link_program(GLcontext *ctx, GLuint program)     FLUSH_VERTICES(ctx, _NEW_PROGRAM);     _slang_link(ctx, program, shProg); + +   /* debug code */ +   if (0) { +      GLuint i; + +      _mesa_printf("Link %u shaders in program %u: %s\n", +                   shProg->NumShaders, shProg->Name, +                   shProg->LinkStatus ? "Success" : "Failed"); + +      for (i = 0; i < shProg->NumShaders; i++) { +         _mesa_printf(" shader %u, type 0x%x\n", +                      shProg->Shaders[i]->Name, +                      shProg->Shaders[i]->Type); +      } +   }  } diff --git a/src/mesa/shader/slang/slang_link.c b/src/mesa/shader/slang/slang_link.c index 169c07f8ce..8f2b40d5df 100644 --- a/src/mesa/shader/slang/slang_link.c +++ b/src/mesa/shader/slang/slang_link.c @@ -546,6 +546,32 @@ _slang_update_inputs_outputs(struct gl_program *prog) +/** + * Remove extra #version directives from the concatenated source string. + * Disable the extra ones by converting first two chars to //, a comment. + * This is a bit of hack to work around a preprocessor bug that only + * allows one #version directive per source. + */ +static void +remove_extra_version_directives(GLchar *source) +{ +   GLuint verCount = 0; +   while (1) { +      char *ver = _mesa_strstr(source, "#version"); +      if (ver) { +         verCount++; +         if (verCount > 1) { +            ver[0] = '/'; +            ver[1] = '/'; +         } +         source += 8; +      } +      else { +         break; +      } +   } +} +  /** @@ -593,6 +619,8 @@ concat_shaders(struct gl_shader_program *shProg, GLenum shaderType)     _mesa_printf("---NEW CONCATENATED SHADER---:\n%s\n------------\n", source);     */ +   remove_extra_version_directives(source); +     newShader = CALLOC_STRUCT(gl_shader);     newShader->Type = shaderType;     newShader->Source = source; diff --git a/src/mesa/state_tracker/st_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c index abaf9d2c35..c0ace3b9ea 100644 --- a/src/mesa/state_tracker/st_cb_texture.c +++ b/src/mesa/state_tracker/st_cb_texture.c @@ -760,10 +760,6 @@ done:        st_texture_image_unmap(ctx->st, stImage);        texImage->Data = NULL;     } - -   if (level == texObj->BaseLevel && texObj->GenerateMipmap) { -      ctx->Driver.GenerateMipmap(ctx, target, texObj); -   }  } @@ -1134,10 +1130,6 @@ done:        st_texture_image_unmap(ctx->st, stImage);        texImage->Data = NULL;     } - -   if (level == texObj->BaseLevel && texObj->GenerateMipmap) { -      ctx->Driver.GenerateMipmap(ctx, target, texObj); -   }  } @@ -1601,10 +1593,6 @@ st_copy_texsubimage(GLcontext *ctx,                                  destX, destY, destZ,                                  srcX, srcY, width, height);     } - -   if (level == texObj->BaseLevel && texObj->GenerateMipmap) { -      ctx->Driver.GenerateMipmap(ctx, target, texObj); -   }  } diff --git a/src/mesa/state_tracker/st_mesa_to_tgsi.c b/src/mesa/state_tracker/st_mesa_to_tgsi.c index df0cf8df26..04be57f8ff 100644 --- a/src/mesa/state_tracker/st_mesa_to_tgsi.c +++ b/src/mesa/state_tracker/st_mesa_to_tgsi.c @@ -27,834 +27,648 @@  /*   * \author - * Michal Krol + * Michal Krol, + * Keith Whitwell   */  #include "pipe/p_compiler.h"  #include "pipe/p_shader_tokens.h" -#include "tgsi/tgsi_parse.h" -#include "tgsi/tgsi_build.h" -#include "tgsi/tgsi_util.h" -#include "tgsi/tgsi_dump.h" -#include "tgsi/tgsi_sanity.h" +#include "pipe/p_state.h" +#include "tgsi/tgsi_ureg.h"  #include "st_mesa_to_tgsi.h"  #include "shader/prog_instruction.h"  #include "shader/prog_parameter.h"  #include "shader/prog_print.h"  #include "util/u_debug.h" +#include "util/u_math.h" +#include "util/u_memory.h" + +struct label { +   unsigned branch_target; +   unsigned token; +}; + +struct st_translate { +   struct ureg_program *ureg; + +   struct ureg_dst temps[MAX_PROGRAM_TEMPS]; +   struct ureg_src *constants; +   struct ureg_dst outputs[PIPE_MAX_SHADER_OUTPUTS]; +   struct ureg_src inputs[PIPE_MAX_SHADER_INPUTS]; +   struct ureg_dst address[1]; +   struct ureg_src samplers[PIPE_MAX_SAMPLERS]; + +   const GLuint *inputMapping; +   const GLuint *outputMapping; + +   /* For every instruction that contains a label (eg CALL), keep +    * details so that we can go back afterwards and emit the correct +    * tgsi instruction number for each label. +    */ +   struct label *labels; +   unsigned labels_size; +   unsigned labels_count; + +   /* Keep a record of the tgsi instruction number that each mesa +    * instruction starts at, will be used to fix up labels after +    * translation. +    */ +   unsigned *insn; +   unsigned insn_size; +   unsigned insn_count; + +   unsigned procType;  /**< TGSI_PROCESSOR_VERTEX/FRAGMENT */ + +   boolean error; +}; + + +static unsigned *get_label( struct st_translate *t, +                            unsigned branch_target ) +{ +   unsigned i; + +   if (t->labels_count + 1 >= t->labels_size) { +      unsigned old_size = t->labels_size; +      t->labels_size = 1 << (util_logbase2(t->labels_size) + 1); +      t->labels = REALLOC( t->labels,  +                           old_size * sizeof t->labels[0],  +                           t->labels_size * sizeof t->labels[0] ); +      if (t->labels == NULL) { +         static unsigned dummy; +         t->error = TRUE; +         return &dummy; +      } +   } + +   i = t->labels_count++; +   t->labels[i].branch_target = branch_target; +   return &t->labels[i].token; +} + + +static void set_insn_start( struct st_translate *t, +                            unsigned start ) +{ +   if (t->insn_count + 1 >= t->insn_size) { +      unsigned old_size = t->insn_size; +      t->insn_size = 1 << (util_logbase2(t->insn_size) + 1); +      t->insn = REALLOC( t->insn,  +                         old_size * sizeof t->insn[0],  +                         t->insn_size * sizeof t->insn[0] ); +      if (t->insn == NULL) { +         t->error = TRUE; +         return; +      } +   } + +   t->insn[t->insn_count++] = start; +} +  /*   * Map mesa register file to TGSI register file.   */ -static GLuint -map_register_file( -   gl_register_file file, -   GLuint index, -   const GLuint immediateMapping[], -   GLboolean indirectAccess ) +static struct ureg_dst +dst_register( struct st_translate *t, +              gl_register_file file, +              GLuint index )  {     switch( file ) {     case PROGRAM_UNDEFINED: -      return TGSI_FILE_NULL; +      return ureg_dst_undef(); +     case PROGRAM_TEMPORARY: -      return TGSI_FILE_TEMPORARY; -   /*case PROGRAM_LOCAL_PARAM:*/ -   /*case PROGRAM_ENV_PARAM:*/ +      if (ureg_dst_is_undef(t->temps[index])) +         t->temps[index] = ureg_DECL_temporary( t->ureg ); + +      return t->temps[index]; -      /* Because of the longstanding problem with mesa arb shaders -       * where constants, immediates and state variables are all -       * bundled together as PROGRAM_STATE_VAR, we can't tell from the -       * mesa register file whether this is a CONSTANT or an -       * IMMEDIATE, hence we need all the other information. -       */ -   case PROGRAM_STATE_VAR: -   case PROGRAM_NAMED_PARAM: -   case PROGRAM_UNIFORM: -      if (!indirectAccess && immediateMapping && immediateMapping[index] != ~0) -         return TGSI_FILE_IMMEDIATE; -      else -	 return TGSI_FILE_CONSTANT; -   case PROGRAM_CONSTANT: -      if (indirectAccess) -         return TGSI_FILE_CONSTANT; -      assert(immediateMapping[index] != ~0); -      return TGSI_FILE_IMMEDIATE; -   case PROGRAM_INPUT: -      return TGSI_FILE_INPUT;     case PROGRAM_OUTPUT: -      return TGSI_FILE_OUTPUT; +      return t->outputs[t->outputMapping[index]]; +     case PROGRAM_ADDRESS: -      return TGSI_FILE_ADDRESS; +      return t->address[index]; +     default:        assert( 0 ); -      return TGSI_FILE_NULL; +      return ureg_dst_undef();     }  } -/** - * Map mesa register file index to TGSI index. - * Take special care when processing input and output indices. - * \param file  one of TGSI_FILE_x - * \param index  the mesa register file index - * \param inputMapping  maps Mesa input indexes to TGSI input indexes - * \param outputMapping  maps Mesa output indexes to TGSI output indexes - */ -static GLuint -map_register_file_index( -   GLuint procType, -   GLuint file, -   GLuint index, -   GLuint *swizzle, -   const GLuint inputMapping[], -   const GLuint outputMapping[], -   const GLuint immediateMapping[], -   GLboolean indirectAccess ) + +static struct ureg_src +src_register( struct st_translate *t, +              gl_register_file file, +              GLuint index )  {     switch( file ) { -   case TGSI_FILE_INPUT: -      /* inputs are mapped according to the user-defined map */ -      return inputMapping[index]; +   case PROGRAM_UNDEFINED: +      return ureg_src_undef(); -   case TGSI_FILE_OUTPUT: -      return outputMapping[index]; +   case PROGRAM_TEMPORARY: +      if (ureg_dst_is_undef(t->temps[index])) +         t->temps[index] = ureg_DECL_temporary( t->ureg ); +      return ureg_src(t->temps[index]); + +   case PROGRAM_STATE_VAR: +   case PROGRAM_NAMED_PARAM: +   case PROGRAM_UNIFORM: +   case PROGRAM_CONSTANT: +      return t->constants[index]; -   case TGSI_FILE_IMMEDIATE: -      if (indirectAccess) -         return index; -      assert(immediateMapping[index] != ~0); -      return immediateMapping[index]; +   case PROGRAM_INPUT: +      return t->inputs[t->inputMapping[index]]; + +   case PROGRAM_OUTPUT: +      return ureg_src(t->outputs[t->outputMapping[index]]); /* not needed? */ + +   case PROGRAM_ADDRESS: +      return ureg_src(t->address[index]);     default: -      return index; +      assert( 0 ); +      return ureg_src_undef();     }  } -/* + +/**   * Map mesa texture target to TGSI texture target.   */ -static GLuint -map_texture_target( -    GLuint textarget, -    GLboolean shadow ) +static unsigned +translate_texture_target( GLuint textarget, +                          GLboolean shadow )  { -   switch( textarget ) { -   case TEXTURE_1D_INDEX: -      if (shadow) -         return TGSI_TEXTURE_SHADOW1D; -      else -         return TGSI_TEXTURE_1D; -   case TEXTURE_2D_INDEX: -      if (shadow) -         return TGSI_TEXTURE_SHADOW2D; -      else -         return TGSI_TEXTURE_2D; -   case TEXTURE_3D_INDEX: -      return TGSI_TEXTURE_3D; -   case TEXTURE_CUBE_INDEX: -      return TGSI_TEXTURE_CUBE; -   case TEXTURE_RECT_INDEX: -      if (shadow) -         return TGSI_TEXTURE_SHADOWRECT; -      else -         return TGSI_TEXTURE_RECT; -   default: -      assert( 0 ); +   if (shadow) { +      switch( textarget ) { +      case TEXTURE_1D_INDEX:   return TGSI_TEXTURE_SHADOW1D; +      case TEXTURE_2D_INDEX:   return TGSI_TEXTURE_SHADOW2D; +      case TEXTURE_RECT_INDEX: return TGSI_TEXTURE_SHADOWRECT; +      default: break; +      }     } -   return TGSI_TEXTURE_1D; -} - -static GLuint -convert_sat( -   GLuint sat ) -{ -   switch( sat ) { -   case SATURATE_OFF: -      return TGSI_SAT_NONE; -   case SATURATE_ZERO_ONE: -      return TGSI_SAT_ZERO_ONE; +   switch( textarget ) { +   case TEXTURE_1D_INDEX:   return TGSI_TEXTURE_1D; +   case TEXTURE_2D_INDEX:   return TGSI_TEXTURE_2D; +   case TEXTURE_3D_INDEX:   return TGSI_TEXTURE_3D; +   case TEXTURE_CUBE_INDEX: return TGSI_TEXTURE_CUBE; +   case TEXTURE_RECT_INDEX: return TGSI_TEXTURE_RECT;     default:        assert( 0 ); -      return TGSI_SAT_NONE; +      return TGSI_TEXTURE_1D;     }  } -static GLuint -convert_writemask( -   GLuint writemask ) + +static struct ureg_dst +translate_dst( struct st_translate *t, +               const struct prog_dst_register *DstReg, +               boolean saturate )  { -   assert( WRITEMASK_X == TGSI_WRITEMASK_X ); -   assert( WRITEMASK_Y == TGSI_WRITEMASK_Y ); -   assert( WRITEMASK_Z == TGSI_WRITEMASK_Z ); -   assert( WRITEMASK_W == TGSI_WRITEMASK_W ); -   assert( (writemask & ~TGSI_WRITEMASK_XYZW) == 0 ); +   struct ureg_dst dst = dst_register( t,  +                                       DstReg->File, +                                       DstReg->Index ); + +   dst = ureg_writemask( dst,  +                         DstReg->WriteMask ); +    +   if (saturate) +      dst = ureg_saturate( dst ); -   return writemask; +   if (DstReg->RelAddr) +      dst = ureg_dst_indirect( dst, ureg_src(t->address[0]) ); + +   return dst;  } -static struct tgsi_full_immediate -make_immediate(const float *value, uint size) + +static struct ureg_src +translate_src( struct st_translate *t, +               const struct prog_src_register *SrcReg )  { -   struct tgsi_full_immediate imm; -   unsigned i; +   struct ureg_src src = src_register( t, SrcReg->File, SrcReg->Index ); -   imm = tgsi_default_full_immediate(); -   imm.Immediate.NrTokens += size; -   imm.Immediate.DataType = TGSI_IMM_FLOAT32; +   src = ureg_swizzle( src, +                       GET_SWZ( SrcReg->Swizzle, 0 ) & 0x3, +                       GET_SWZ( SrcReg->Swizzle, 1 ) & 0x3, +                       GET_SWZ( SrcReg->Swizzle, 2 ) & 0x3, +                       GET_SWZ( SrcReg->Swizzle, 3 ) & 0x3); -   for (i = 0; i < size; i++) -      imm.u[i].Float = value[i]; +   if (SrcReg->Negate == NEGATE_XYZW) +      src = ureg_negate(src); -   return imm; +   if (SrcReg->Abs)  +      src = ureg_abs(src); + +   if (SrcReg->RelAddr)  +      src = ureg_src_indirect( src, ureg_src(t->address[0])); +    +   return src;  } -static void -compile_instruction( -   const struct prog_instruction *inst, -   struct tgsi_full_instruction *fullinst, -   const GLuint inputMapping[], -   const GLuint outputMapping[], -   const GLuint immediateMapping[], -   GLboolean indirectAccess, -   GLuint preamble_size, -   GLuint procType, -   GLboolean *insideSubroutine, -   GLint wposTemp) + +static struct ureg_src swizzle_4v( struct ureg_src src, +                                   const unsigned *swz )  { -   GLuint i; -   struct tgsi_full_dst_register *fulldst; -   struct tgsi_full_src_register *fullsrc; +   return ureg_swizzle( src, swz[0], swz[1], swz[2], swz[3] ); +} -   *fullinst = tgsi_default_full_instruction(); -   fullinst->Instruction.Saturate = convert_sat( inst->SaturateMode ); -   fullinst->Instruction.NumDstRegs = _mesa_num_inst_dst_regs( inst->Opcode ); -   fullinst->Instruction.NumSrcRegs = _mesa_num_inst_src_regs( inst->Opcode ); +/** + * Translate SWZ instructions into a single MAD.  EG: + * + *   SWZ dst, src.x-y10  + *  + * becomes: + * + *   MAD dst {1,-1,0,0}, src.xyxx, {0,0,1,0} + */ +static void emit_swz( struct st_translate *t, +                      struct ureg_dst dst, +                      const struct prog_src_register *SrcReg ) +{ +   struct ureg_program *ureg = t->ureg; +   struct ureg_src src = src_register( t, SrcReg->File, SrcReg->Index ); + +   unsigned negate_mask =  SrcReg->Negate; -   fulldst = &fullinst->FullDstRegisters[0]; -   fulldst->DstRegister.File = map_register_file( inst->DstReg.File, 0, NULL, GL_FALSE ); -   fulldst->DstRegister.Index = map_register_file_index( -      procType, -      fulldst->DstRegister.File, -      inst->DstReg.Index, -      NULL, -      inputMapping, -      outputMapping, -      NULL, -      GL_FALSE ); -   fulldst->DstRegister.WriteMask = convert_writemask( inst->DstReg.WriteMask ); -   if (inst->DstReg.RelAddr) { -      fulldst->DstRegister.Indirect = 1; -      fulldst->DstRegisterInd.File = TGSI_FILE_ADDRESS; -      fulldst->DstRegisterInd.Index = 0; +   unsigned one_mask = ((GET_SWZ(SrcReg->Swizzle, 0) == SWIZZLE_ONE) << 0 | +                        (GET_SWZ(SrcReg->Swizzle, 1) == SWIZZLE_ONE) << 1 | +                        (GET_SWZ(SrcReg->Swizzle, 2) == SWIZZLE_ONE) << 2 | +                        (GET_SWZ(SrcReg->Swizzle, 3) == SWIZZLE_ONE) << 3); + +   unsigned zero_mask = ((GET_SWZ(SrcReg->Swizzle, 0) == SWIZZLE_ZERO) << 0 | +                         (GET_SWZ(SrcReg->Swizzle, 1) == SWIZZLE_ZERO) << 1 | +                         (GET_SWZ(SrcReg->Swizzle, 2) == SWIZZLE_ZERO) << 2 | +                         (GET_SWZ(SrcReg->Swizzle, 3) == SWIZZLE_ZERO) << 3); + +   unsigned negative_one_mask = one_mask & negate_mask; +   unsigned positive_one_mask = one_mask & ~negate_mask; +    +   struct ureg_src imm; +   unsigned i; +   unsigned mul_swizzle[4] = {0,0,0,0}; +   unsigned add_swizzle[4] = {0,0,0,0}; +   unsigned src_swizzle[4] = {0,0,0,0}; +   boolean need_add = FALSE; +   boolean need_mul = FALSE; + +   if (dst.WriteMask == 0) +      return; + +   /* Is this just a MOV? +    */ +   if (zero_mask == 0 && +       one_mask == 0 && +       (negate_mask == 0 || negate_mask == TGSI_WRITEMASK_XYZW))  +   { +      ureg_MOV( ureg, dst, translate_src( t, SrcReg )); +      return;     } -   for (i = 0; i < fullinst->Instruction.NumSrcRegs; i++) { -      GLuint j; -      GLuint swizzle = inst->SrcReg[i].Swizzle; +#define IMM_ZERO    0 +#define IMM_ONE     1 +#define IMM_NEG_ONE 2 -      fullsrc = &fullinst->FullSrcRegisters[i]; +   imm = ureg_imm3f( ureg, 0, 1, -1 ); -      if (procType == TGSI_PROCESSOR_FRAGMENT && -          inst->SrcReg[i].File == PROGRAM_INPUT && -          inst->SrcReg[i].Index == FRAG_ATTRIB_WPOS) { -         /* special case of INPUT[WPOS] */ -         fullsrc->SrcRegister.File = TGSI_FILE_TEMPORARY; -         fullsrc->SrcRegister.Index = wposTemp; -      } -      else { -         /* any other src register */ -         fullsrc->SrcRegister.File = map_register_file( -            inst->SrcReg[i].File, -            inst->SrcReg[i].Index, -            immediateMapping, -            indirectAccess ); -         fullsrc->SrcRegister.Index = map_register_file_index( -            procType, -            fullsrc->SrcRegister.File, -            inst->SrcReg[i].Index, -            &swizzle, -            inputMapping, -            outputMapping, -            immediateMapping, -            indirectAccess ); -      } +   for (i = 0; i < 4; i++) { +      unsigned bit = 1 << i; -      /* swizzle (ext swizzle also depends on negation) */ -      { -         GLuint swz[4]; -         GLboolean extended = (inst->SrcReg[i].Negate != NEGATE_NONE && -                               inst->SrcReg[i].Negate != NEGATE_XYZW); -         for( j = 0; j < 4; j++ ) { -            swz[j] = GET_SWZ( swizzle, j ); -            if (swz[j] > SWIZZLE_W) -               extended = GL_TRUE; +      if (dst.WriteMask & bit) { +         if (positive_one_mask & bit) { +            mul_swizzle[i] = IMM_ZERO; +            add_swizzle[i] = IMM_ONE; +            need_add = TRUE;           } -         if (extended) { -            for (j = 0; j < 4; j++) { -               tgsi_util_set_src_register_extswizzle(&fullsrc->SrcRegisterExtSwz, -                                                     swz[j], j); -            } +         else if (negative_one_mask & bit) { +            mul_swizzle[i] = IMM_ZERO; +            add_swizzle[i] = IMM_NEG_ONE; +            need_add = TRUE; +         } +         else if (zero_mask & bit) { +            mul_swizzle[i] = IMM_ZERO; +            add_swizzle[i] = IMM_ZERO; +            need_add = TRUE;           }           else { -            for (j = 0; j < 4; j++) { -               tgsi_util_set_src_register_swizzle(&fullsrc->SrcRegister, -                                                  swz[j], j); +            add_swizzle[i] = IMM_ZERO; +            src_swizzle[i] = GET_SWZ(SrcReg->Swizzle, i); +            need_mul = TRUE; +            if (negate_mask & bit) { +               mul_swizzle[i] = IMM_NEG_ONE; +            } +            else { +               mul_swizzle[i] = IMM_ONE;              }           }        } +   } -      if( inst->SrcReg[i].Negate == NEGATE_XYZW ) { -         fullsrc->SrcRegister.Negate = 1; -      } -      else if( inst->SrcReg[i].Negate != NEGATE_NONE ) { -         if( inst->SrcReg[i].Negate & NEGATE_X ) { -            fullsrc->SrcRegisterExtSwz.NegateX = 1; -         } -         if( inst->SrcReg[i].Negate & NEGATE_Y ) { -            fullsrc->SrcRegisterExtSwz.NegateY = 1; -         } -         if( inst->SrcReg[i].Negate & NEGATE_Z ) { -            fullsrc->SrcRegisterExtSwz.NegateZ = 1; -         } -         if( inst->SrcReg[i].Negate & NEGATE_W ) { -            fullsrc->SrcRegisterExtSwz.NegateW = 1; -         } -      } +   if (need_mul && need_add) { +      ureg_MAD( ureg,  +                dst, +                swizzle_4v( src, src_swizzle ), +                swizzle_4v( imm, mul_swizzle ), +                swizzle_4v( imm, add_swizzle ) ); +   } +   else if (need_mul) { +      ureg_MUL( ureg,  +                dst, +                swizzle_4v( src, src_swizzle ), +                swizzle_4v( imm, mul_swizzle ) ); +   } +   else if (need_add) { +      ureg_MOV( ureg,  +                dst, +                swizzle_4v( imm, add_swizzle ) ); +   } +   else { +      assert(0); +   } -      if( inst->SrcReg[i].Abs ) { -         fullsrc->SrcRegisterExtMod.Absolute = 1; -      } +#undef IMM_ZERO +#undef IMM_ONE +#undef IMM_NEG_ONE +} -      if( inst->SrcReg[i].RelAddr ) { -         fullsrc->SrcRegister.Indirect = 1; -         fullsrc->SrcRegisterInd.File = TGSI_FILE_ADDRESS; -         fullsrc->SrcRegisterInd.Index = 0; -      } -   } -   switch( inst->Opcode ) { +static unsigned +translate_opcode( unsigned op ) +{ +   switch( op ) {     case OPCODE_ARL: -      fullinst->Instruction.Opcode = TGSI_OPCODE_ARL; -      break; +      return TGSI_OPCODE_ARL;     case OPCODE_ABS: -      fullinst->Instruction.Opcode = TGSI_OPCODE_ABS; -      break; +      return TGSI_OPCODE_ABS;     case OPCODE_ADD: -      fullinst->Instruction.Opcode = TGSI_OPCODE_ADD; -      break; +      return TGSI_OPCODE_ADD;     case OPCODE_BGNLOOP: -      fullinst->Instruction.Opcode = TGSI_OPCODE_BGNLOOP; -      fullinst->InstructionExtLabel.Label = inst->BranchTarget + preamble_size; -      break; +      return TGSI_OPCODE_BGNLOOP;     case OPCODE_BGNSUB: -      fullinst->Instruction.Opcode = TGSI_OPCODE_BGNSUB; -      *insideSubroutine = GL_TRUE; -      break; +      return TGSI_OPCODE_BGNSUB;     case OPCODE_BRA: -      fullinst->Instruction.Opcode = TGSI_OPCODE_BRA; -      break; +      return TGSI_OPCODE_BRA;     case OPCODE_BRK: -      fullinst->Instruction.Opcode = TGSI_OPCODE_BRK; -      break; +      return TGSI_OPCODE_BRK;     case OPCODE_CAL: -      fullinst->Instruction.Opcode = TGSI_OPCODE_CAL; -      fullinst->InstructionExtLabel.Label = inst->BranchTarget + preamble_size; -      break; +      return TGSI_OPCODE_CAL;     case OPCODE_CMP: -      fullinst->Instruction.Opcode = TGSI_OPCODE_CMP; -      break; +      return TGSI_OPCODE_CMP;     case OPCODE_CONT: -      fullinst->Instruction.Opcode = TGSI_OPCODE_CONT; -      break; +      return TGSI_OPCODE_CONT;     case OPCODE_COS: -      fullinst->Instruction.Opcode = TGSI_OPCODE_COS; -      break; +      return TGSI_OPCODE_COS;     case OPCODE_DDX: -      fullinst->Instruction.Opcode = TGSI_OPCODE_DDX; -      break; +      return TGSI_OPCODE_DDX;     case OPCODE_DDY: -      fullinst->Instruction.Opcode = TGSI_OPCODE_DDY; -      break; +      return TGSI_OPCODE_DDY;     case OPCODE_DP2: -      fullinst->Instruction.Opcode = TGSI_OPCODE_DP2; -      break; +      return TGSI_OPCODE_DP2;     case OPCODE_DP2A: -      fullinst->Instruction.Opcode = TGSI_OPCODE_DP2A; -      break; +      return TGSI_OPCODE_DP2A;     case OPCODE_DP3: -      fullinst->Instruction.Opcode = TGSI_OPCODE_DP3; -      break; +      return TGSI_OPCODE_DP3;     case OPCODE_DP4: -      fullinst->Instruction.Opcode = TGSI_OPCODE_DP4; -      break; +      return TGSI_OPCODE_DP4;     case OPCODE_DPH: -      fullinst->Instruction.Opcode = TGSI_OPCODE_DPH; -      break; +      return TGSI_OPCODE_DPH;     case OPCODE_DST: -      fullinst->Instruction.Opcode = TGSI_OPCODE_DST; -      break; +      return TGSI_OPCODE_DST;     case OPCODE_ELSE: -      fullinst->Instruction.Opcode = TGSI_OPCODE_ELSE; -      fullinst->InstructionExtLabel.Label = inst->BranchTarget + preamble_size; -      break; +      return TGSI_OPCODE_ELSE;     case OPCODE_ENDIF: -      fullinst->Instruction.Opcode = TGSI_OPCODE_ENDIF; -      break; +      return TGSI_OPCODE_ENDIF;     case OPCODE_ENDLOOP: -      fullinst->Instruction.Opcode = TGSI_OPCODE_ENDLOOP; -      fullinst->InstructionExtLabel.Label = inst->BranchTarget + preamble_size; -      break; +      return TGSI_OPCODE_ENDLOOP;     case OPCODE_ENDSUB: -      fullinst->Instruction.Opcode = TGSI_OPCODE_ENDSUB; -      *insideSubroutine = GL_FALSE; -      break; +      return TGSI_OPCODE_ENDSUB;     case OPCODE_EX2: -      fullinst->Instruction.Opcode = TGSI_OPCODE_EX2; -      break; +      return TGSI_OPCODE_EX2;     case OPCODE_EXP: -      fullinst->Instruction.Opcode = TGSI_OPCODE_EXP; -      break; +      return TGSI_OPCODE_EXP;     case OPCODE_FLR: -      fullinst->Instruction.Opcode = TGSI_OPCODE_FLR; -      break; +      return TGSI_OPCODE_FLR;     case OPCODE_FRC: -      fullinst->Instruction.Opcode = TGSI_OPCODE_FRC; -      break; +      return TGSI_OPCODE_FRC;     case OPCODE_IF: -      fullinst->Instruction.Opcode = TGSI_OPCODE_IF; -      fullinst->InstructionExtLabel.Label = inst->BranchTarget + preamble_size; -      break; +      return TGSI_OPCODE_IF;     case OPCODE_TRUNC: -      fullinst->Instruction.Opcode = TGSI_OPCODE_TRUNC; -      break; +      return TGSI_OPCODE_TRUNC;     case OPCODE_KIL: -      /* conditional */ -      fullinst->Instruction.Opcode = TGSI_OPCODE_KIL; -      break; +      return TGSI_OPCODE_KIL;     case OPCODE_KIL_NV: -      /* predicated */ -      assert(inst->DstReg.CondMask == COND_TR); -      fullinst->Instruction.Opcode = TGSI_OPCODE_KILP; -      break; +      return TGSI_OPCODE_KILP;     case OPCODE_LG2: -      fullinst->Instruction.Opcode = TGSI_OPCODE_LG2; -      break; +      return TGSI_OPCODE_LG2;     case OPCODE_LOG: -      fullinst->Instruction.Opcode = TGSI_OPCODE_LOG; -      break; +      return TGSI_OPCODE_LOG;     case OPCODE_LIT: -      fullinst->Instruction.Opcode = TGSI_OPCODE_LIT; -      break; +      return TGSI_OPCODE_LIT;     case OPCODE_LRP: -      fullinst->Instruction.Opcode = TGSI_OPCODE_LRP; -      break; +      return TGSI_OPCODE_LRP;     case OPCODE_MAD: -      fullinst->Instruction.Opcode = TGSI_OPCODE_MAD; -      break; +      return TGSI_OPCODE_MAD;     case OPCODE_MAX: -      fullinst->Instruction.Opcode = TGSI_OPCODE_MAX; -      break; +      return TGSI_OPCODE_MAX;     case OPCODE_MIN: -      fullinst->Instruction.Opcode = TGSI_OPCODE_MIN; -      break; +      return TGSI_OPCODE_MIN;     case OPCODE_MOV: -      fullinst->Instruction.Opcode = TGSI_OPCODE_MOV; -      break; +      return TGSI_OPCODE_MOV;     case OPCODE_MUL: -      fullinst->Instruction.Opcode = TGSI_OPCODE_MUL; -      break; +      return TGSI_OPCODE_MUL;     case OPCODE_NOISE1: -      fullinst->Instruction.Opcode = TGSI_OPCODE_NOISE1; -      break; +      return TGSI_OPCODE_NOISE1;     case OPCODE_NOISE2: -      fullinst->Instruction.Opcode = TGSI_OPCODE_NOISE2; -      break; +      return TGSI_OPCODE_NOISE2;     case OPCODE_NOISE3: -      fullinst->Instruction.Opcode = TGSI_OPCODE_NOISE3; -      break; +      return TGSI_OPCODE_NOISE3;     case OPCODE_NOISE4: -      fullinst->Instruction.Opcode = TGSI_OPCODE_NOISE4; -      break; +      return TGSI_OPCODE_NOISE4;     case OPCODE_NOP: -      fullinst->Instruction.Opcode = TGSI_OPCODE_NOP; -      break; +      return TGSI_OPCODE_NOP;     case OPCODE_NRM3: -      fullinst->Instruction.Opcode = TGSI_OPCODE_NRM; -      break; +      return TGSI_OPCODE_NRM;     case OPCODE_NRM4: -      fullinst->Instruction.Opcode = TGSI_OPCODE_NRM4; -      break; +      return TGSI_OPCODE_NRM4;     case OPCODE_POW: -      fullinst->Instruction.Opcode = TGSI_OPCODE_POW; -      break; +      return TGSI_OPCODE_POW;     case OPCODE_RCP: -      fullinst->Instruction.Opcode = TGSI_OPCODE_RCP; -      break; +      return TGSI_OPCODE_RCP;     case OPCODE_RET: -      /* If RET is used inside main (not a real subroutine) we may want -       * to execute END instead of RET.  TBD... -       */ -      if (1 /*  *insideSubroutine */) { -         fullinst->Instruction.Opcode = TGSI_OPCODE_RET; -      } -      else { -         /* inside main() pseudo-function */ -         fullinst->Instruction.Opcode = TGSI_OPCODE_END; -      } -      break; +      return TGSI_OPCODE_RET;     case OPCODE_RSQ: -      fullinst->Instruction.Opcode = TGSI_OPCODE_RSQ; -      break; +      return TGSI_OPCODE_RSQ;     case OPCODE_SCS: -      fullinst->Instruction.Opcode = TGSI_OPCODE_SCS; -      fulldst->DstRegister.WriteMask &= TGSI_WRITEMASK_XY; -      break; +      return TGSI_OPCODE_SCS;     case OPCODE_SEQ: -      fullinst->Instruction.Opcode = TGSI_OPCODE_SEQ; -      break; +      return TGSI_OPCODE_SEQ;     case OPCODE_SGE: -      fullinst->Instruction.Opcode = TGSI_OPCODE_SGE; -      break; +      return TGSI_OPCODE_SGE;     case OPCODE_SGT: -      fullinst->Instruction.Opcode = TGSI_OPCODE_SGT; -      break; +      return TGSI_OPCODE_SGT;     case OPCODE_SIN: -      fullinst->Instruction.Opcode = TGSI_OPCODE_SIN; -      break; +      return TGSI_OPCODE_SIN;     case OPCODE_SLE: -      fullinst->Instruction.Opcode = TGSI_OPCODE_SLE; -      break; +      return TGSI_OPCODE_SLE;     case OPCODE_SLT: -      fullinst->Instruction.Opcode = TGSI_OPCODE_SLT; -      break; +      return TGSI_OPCODE_SLT;     case OPCODE_SNE: -      fullinst->Instruction.Opcode = TGSI_OPCODE_SNE; -      break; +      return TGSI_OPCODE_SNE;     case OPCODE_SSG: -      fullinst->Instruction.Opcode = TGSI_OPCODE_SSG; -      break; +      return TGSI_OPCODE_SSG;     case OPCODE_SUB: -      fullinst->Instruction.Opcode = TGSI_OPCODE_SUB; -      break; +      return TGSI_OPCODE_SUB;     case OPCODE_SWZ: -      fullinst->Instruction.Opcode = TGSI_OPCODE_SWZ; -      break; +      return TGSI_OPCODE_SWZ;     case OPCODE_TEX: -      /* ordinary texture lookup */ -      fullinst->Instruction.Opcode = TGSI_OPCODE_TEX; -      fullinst->Instruction.NumSrcRegs = 2; -      fullinst->InstructionExtTexture.Texture = -         map_texture_target( inst->TexSrcTarget, inst->TexShadow ); -      fullinst->FullSrcRegisters[1].SrcRegister.File = TGSI_FILE_SAMPLER; -      fullinst->FullSrcRegisters[1].SrcRegister.Index = inst->TexSrcUnit; -      break; +      return TGSI_OPCODE_TEX;     case OPCODE_TXB: -      /* texture lookup with LOD bias */ -      fullinst->Instruction.Opcode = TGSI_OPCODE_TXB; -      fullinst->Instruction.NumSrcRegs = 2; -      fullinst->InstructionExtTexture.Texture = -         map_texture_target( inst->TexSrcTarget, inst->TexShadow ); -      fullinst->FullSrcRegisters[1].SrcRegister.File = TGSI_FILE_SAMPLER; -      fullinst->FullSrcRegisters[1].SrcRegister.Index = inst->TexSrcUnit; -      break; +      return TGSI_OPCODE_TXB;     case OPCODE_TXD: -      /* texture lookup with explicit partial derivatives */ -      fullinst->Instruction.Opcode = TGSI_OPCODE_TXD; -      fullinst->Instruction.NumSrcRegs = 4; -      fullinst->InstructionExtTexture.Texture = -         map_texture_target( inst->TexSrcTarget, inst->TexShadow ); -      /* src[0] = coord, src[1] = d[strq]/dx, src[2] = d[strq]/dy */ -      fullinst->FullSrcRegisters[3].SrcRegister.File = TGSI_FILE_SAMPLER; -      fullinst->FullSrcRegisters[3].SrcRegister.Index = inst->TexSrcUnit; -      break; +      return TGSI_OPCODE_TXD;     case OPCODE_TXL: -      /* texture lookup with explicit LOD */ -      fullinst->Instruction.Opcode = TGSI_OPCODE_TXL; -      fullinst->Instruction.NumSrcRegs = 2; -      fullinst->InstructionExtTexture.Texture = -         map_texture_target( inst->TexSrcTarget, inst->TexShadow ); -      fullinst->FullSrcRegisters[1].SrcRegister.File = TGSI_FILE_SAMPLER; -      fullinst->FullSrcRegisters[1].SrcRegister.Index = inst->TexSrcUnit; -      break; +      return TGSI_OPCODE_TXL;     case OPCODE_TXP: -      /* texture lookup with divide by Q component */ -      /* convert to TEX w/ special flag for division */ -      fullinst->Instruction.Opcode = TGSI_OPCODE_TXP; -      fullinst->Instruction.NumSrcRegs = 2; -      fullinst->InstructionExtTexture.Texture = -         map_texture_target( inst->TexSrcTarget, inst->TexShadow ); -      fullinst->FullSrcRegisters[1].SrcRegister.File = TGSI_FILE_SAMPLER; -      fullinst->FullSrcRegisters[1].SrcRegister.Index = inst->TexSrcUnit; -      break; +      return TGSI_OPCODE_TXP;     case OPCODE_XPD: -      fullinst->Instruction.Opcode = TGSI_OPCODE_XPD; -      fulldst->DstRegister.WriteMask &= TGSI_WRITEMASK_XYZ; -      break; +      return TGSI_OPCODE_XPD;     case OPCODE_END: -      fullinst->Instruction.Opcode = TGSI_OPCODE_END; -      break; +      return TGSI_OPCODE_END;     default:        assert( 0 ); +      return TGSI_OPCODE_NOP;     }  } -/** - * \param usage_mask  bitfield of TGSI_WRITEMASK_{XYZW} tokens - */ -static struct tgsi_full_declaration -make_input_decl( -   GLuint index, -   GLboolean interpolate_info, -   GLuint interpolate, -   GLuint usage_mask, -   GLboolean semantic_info, -   GLuint semantic_name, -   GLbitfield semantic_index, -   GLbitfield input_flags) -{ -   struct tgsi_full_declaration decl; -   assert(semantic_name < TGSI_SEMANTIC_COUNT); - -   decl = tgsi_default_full_declaration(); -   decl.Declaration.File = TGSI_FILE_INPUT; -   decl.Declaration.UsageMask = usage_mask; -   decl.Declaration.Semantic = semantic_info; -   decl.DeclarationRange.First = index; -   decl.DeclarationRange.Last = index; -   if (semantic_info) { -      decl.Semantic.SemanticName = semantic_name; -      decl.Semantic.SemanticIndex = semantic_index; -   } -   if (interpolate_info) { -      decl.Declaration.Interpolate = interpolate; -   } -   if (input_flags & PROG_PARAM_BIT_CENTROID) -      decl.Declaration.Centroid = 1; -   if (input_flags & PROG_PARAM_BIT_INVARIANT) -      decl.Declaration.Invariant = 1; - -   return decl; -} - -/** - * \param usage_mask  bitfield of TGSI_WRITEMASK_{XYZW} tokens - */ -static struct tgsi_full_declaration -make_output_decl( -   GLuint index, -   GLuint semantic_name, -   GLuint semantic_index, -   GLuint usage_mask, -   GLbitfield output_flags) -{ -   struct tgsi_full_declaration decl; - -   assert(semantic_name < TGSI_SEMANTIC_COUNT); - -   decl = tgsi_default_full_declaration(); -   decl.Declaration.File = TGSI_FILE_OUTPUT; -   decl.Declaration.UsageMask = usage_mask; -   decl.Declaration.Semantic = 1; -   decl.DeclarationRange.First = index; -   decl.DeclarationRange.Last = index; -   decl.Semantic.SemanticName = semantic_name; -   decl.Semantic.SemanticIndex = semantic_index; -   if (output_flags & PROG_PARAM_BIT_CENTROID) -      decl.Declaration.Centroid = 1; -   if (output_flags & PROG_PARAM_BIT_INVARIANT) -      decl.Declaration.Invariant = 1; - -   return decl; -} - - -static struct tgsi_full_declaration -make_temp_decl( -   GLuint start_index, -   GLuint end_index ) -{ -   struct tgsi_full_declaration decl; -   decl = tgsi_default_full_declaration(); -   decl.Declaration.File = TGSI_FILE_TEMPORARY; -   decl.DeclarationRange.First = start_index; -   decl.DeclarationRange.Last = end_index; -   return decl; -} - -static struct tgsi_full_declaration -make_addr_decl( -   GLuint start_index, -   GLuint end_index ) -{ -   struct tgsi_full_declaration decl; - -   decl = tgsi_default_full_declaration(); -   decl.Declaration.File = TGSI_FILE_ADDRESS; -   decl.DeclarationRange.First = start_index; -   decl.DeclarationRange.Last = end_index; -   return decl; -} - -static struct tgsi_full_declaration -make_sampler_decl(GLuint index) -{ -   struct tgsi_full_declaration decl; -   decl = tgsi_default_full_declaration(); -   decl.Declaration.File = TGSI_FILE_SAMPLER; -   decl.DeclarationRange.First = index; -   decl.DeclarationRange.Last = index; -   return decl; -} - -/** Reference into a constant buffer */ -static struct tgsi_full_declaration -make_constant_decl(GLuint first, GLuint last) -{ -   struct tgsi_full_declaration decl; -   decl = tgsi_default_full_declaration(); -   decl.Declaration.File = TGSI_FILE_CONSTANT; -   decl.DeclarationRange.First = first; -   decl.DeclarationRange.Last = last; -   return decl; -} - - - -/** - * Find the temporaries which are used in the given program. - */  static void -find_temporaries(const struct gl_program *program, -                 GLboolean tempsUsed[MAX_PROGRAM_TEMPS]) -{ -   GLuint i, j; - -   for (i = 0; i < MAX_PROGRAM_TEMPS; i++) -      tempsUsed[i] = GL_FALSE; - -   for (i = 0; i < program->NumInstructions; i++) { -      const struct prog_instruction *inst = program->Instructions + i; -      const GLuint n = _mesa_num_inst_src_regs( inst->Opcode ); -      for (j = 0; j < n; j++) { -         if (inst->SrcReg[j].File == PROGRAM_TEMPORARY) -            tempsUsed[inst->SrcReg[j].Index] = GL_TRUE; -         if (inst->DstReg.File == PROGRAM_TEMPORARY) -            tempsUsed[inst->DstReg.Index] = GL_TRUE; -      } -   } -} - - -/** - * Find an unused temporary in the tempsUsed array. - */ -static int -find_free_temporary(GLboolean tempsUsed[MAX_PROGRAM_TEMPS]) +compile_instruction( +   struct st_translate *t, +   const struct prog_instruction *inst )  { -   int i; -   for (i = 0; i < MAX_PROGRAM_TEMPS; i++) { -      if (!tempsUsed[i]) { -         tempsUsed[i] = GL_TRUE; -         return i; -      } -   } -   return -1; -} - +   struct ureg_program *ureg = t->ureg; +   GLuint i; +   struct ureg_dst dst[1]; +   struct ureg_src src[4]; +   unsigned num_dst; +   unsigned num_src; -/** helper for building simple TGSI instruction, one src register */ -static void -build_tgsi_instruction1(struct tgsi_full_instruction *inst, -                        int opcode, -                        int dstFile, int dstIndex, int writemask, -                        int srcFile1, int srcIndex1) -{ -   *inst = tgsi_default_full_instruction(); +   num_dst = _mesa_num_inst_dst_regs( inst->Opcode ); +   num_src = _mesa_num_inst_src_regs( inst->Opcode ); -   inst->Instruction.Opcode = opcode; +   if (num_dst)  +      dst[0] = translate_dst( t,  +                              &inst->DstReg, +                              inst->SaturateMode ); -   inst->Instruction.NumDstRegs = 1; -   inst->FullDstRegisters[0].DstRegister.File = dstFile; -   inst->FullDstRegisters[0].DstRegister.Index = dstIndex; -   inst->FullDstRegisters[0].DstRegister.WriteMask = writemask; +   for (i = 0; i < num_src; i++)  +      src[i] = translate_src( t, &inst->SrcReg[i] ); -   inst->Instruction.NumSrcRegs = 1; -   inst->FullSrcRegisters[0].SrcRegister.File = srcFile1; -   inst->FullSrcRegisters[0].SrcRegister.Index = srcIndex1; -} +   switch( inst->Opcode ) { +   case OPCODE_SWZ: +      emit_swz( t, dst[0], &inst->SrcReg[0] ); +      return; +   case OPCODE_BGNLOOP: +   case OPCODE_CAL: +   case OPCODE_ELSE: +   case OPCODE_ENDLOOP: +   case OPCODE_IF: +      assert(num_dst == 0); +      ureg_label_insn( ureg, +                       translate_opcode( inst->Opcode ), +                       src, num_src, +                       get_label( t, inst->BranchTarget )); +      return; -/** helper for building simple TGSI instruction, two src registers */ -static void -build_tgsi_instruction2(struct tgsi_full_instruction *inst, -                        int opcode, -                        int dstFile, int dstIndex, int writemask, -                        int srcFile1, int srcIndex1, -                        int srcFile2, int srcIndex2) -{ -   *inst = tgsi_default_full_instruction(); +   case OPCODE_TEX: +   case OPCODE_TXB: +   case OPCODE_TXD: +   case OPCODE_TXL: +   case OPCODE_TXP: +      src[num_src++] = t->samplers[inst->TexSrcUnit]; +      ureg_tex_insn( ureg, +                     translate_opcode( inst->Opcode ), +                     dst, num_dst,  +                     translate_texture_target( inst->TexSrcTarget, +                                               inst->TexShadow ), +                     src, num_src ); +      return; -   inst->Instruction.Opcode = opcode; +   case OPCODE_SCS: +      dst[0] = ureg_writemask(dst[0], TGSI_WRITEMASK_XY ); +      ureg_insn( ureg,  +                 translate_opcode( inst->Opcode ),  +                 dst, num_dst,  +                 src, num_src ); +      break; -   inst->Instruction.NumDstRegs = 1; -   inst->FullDstRegisters[0].DstRegister.File = dstFile; -   inst->FullDstRegisters[0].DstRegister.Index = dstIndex; -   inst->FullDstRegisters[0].DstRegister.WriteMask = writemask; +   case OPCODE_XPD: +      dst[0] = ureg_writemask(dst[0], TGSI_WRITEMASK_XYZ ); +      ureg_insn( ureg,  +                 translate_opcode( inst->Opcode ),  +                 dst, num_dst,  +                 src, num_src ); +      break; -   inst->Instruction.NumSrcRegs = 2; -   inst->FullSrcRegisters[0].SrcRegister.File = srcFile1; -   inst->FullSrcRegisters[0].SrcRegister.Index = srcIndex1; -   inst->FullSrcRegisters[1].SrcRegister.File = srcFile2; -   inst->FullSrcRegisters[1].SrcRegister.Index = srcIndex2; +   default: +      ureg_insn( ureg,  +                 translate_opcode( inst->Opcode ),  +                 dst, num_dst,  +                 src, num_src ); +      break; +   }  } -  /**   * Emit the TGSI instructions for inverting the WPOS y coordinate.   */ -static int -emit_inverted_wpos(struct tgsi_token *tokens, -                   int wpos_temp, -                   int winsize_const, -                   int wpos_input, -                   struct tgsi_header *header, int maxTokens) +static void +emit_inverted_wpos( struct st_translate *t, +                    const struct gl_program *program )  { -   struct tgsi_full_instruction fullinst; -   int ti = 0; +   struct ureg_program *ureg = t->ureg; -   /* MOV wpos_temp.xzw, input[wpos]; */ -   build_tgsi_instruction1(&fullinst, -                           TGSI_OPCODE_MOV, -                           TGSI_FILE_TEMPORARY, wpos_temp, WRITEMASK_XZW, -                           TGSI_FILE_INPUT, 0); +   /* Fragment program uses fragment position input. +    * Need to replace instances of INPUT[WPOS] with temp T +    * where T = INPUT[WPOS] by y is inverted. +    */ +   static const gl_state_index winSizeState[STATE_LENGTH] +      = { STATE_INTERNAL, STATE_FB_SIZE, 0, 0, 0 }; +    +   /* XXX: note we are modifying the incoming shader here!  Need to +    * do this before emitting the constant decls below, or this +    * will be missed: +    */ +   unsigned winHeightConst = _mesa_add_state_reference(program->Parameters, +                                                       winSizeState); -   ti += tgsi_build_full_instruction(&fullinst, -                                     &tokens[ti], -                                     header, -                                     maxTokens - ti); +   struct ureg_src winsize = ureg_DECL_constant( ureg, winHeightConst ); +   struct ureg_dst wpos_temp = ureg_DECL_temporary( ureg ); +   struct ureg_src wpos_input = t->inputs[t->inputMapping[FRAG_ATTRIB_WPOS]]; -   /* SUB wpos_temp.y, const[winsize_const] - input[wpos_input]; */ -   build_tgsi_instruction2(&fullinst, -                           TGSI_OPCODE_SUB, -                           TGSI_FILE_TEMPORARY, wpos_temp, WRITEMASK_Y, -                           TGSI_FILE_CONSTANT, winsize_const, -                           TGSI_FILE_INPUT, wpos_input); +   /* MOV wpos_temp, input[wpos] +    */ +   ureg_MOV( ureg, wpos_temp, wpos_input ); -   ti += tgsi_build_full_instruction(&fullinst, -                                     &tokens[ti], -                                     header, -                                     maxTokens - ti); +   /* SUB wpos_temp.y, winsize_const, wpos_input +    */ +   ureg_SUB( ureg, +             ureg_writemask(wpos_temp, TGSI_WRITEMASK_Y ), +             winsize, +             wpos_input); -   return ti; +   /* Use wpos_temp as position input from here on: +    */ +   t->inputs[t->inputMapping[FRAG_ATTRIB_WPOS]] = ureg_src(wpos_temp);  } - -  /**   * Translate Mesa program to TGSI format.   * \param program  the program to translate @@ -862,20 +676,19 @@ emit_inverted_wpos(struct tgsi_token *tokens,   * \param inputMapping  maps Mesa fragment program inputs to TGSI generic   *                      input indexes   * \param inputSemanticName  the TGSI_SEMANTIC flag for each input - * \param inputSemanticIndex  the semantic index (ex: which texcoord) for each input + * \param inputSemanticIndex  the semantic index (ex: which texcoord) for + *                            each input   * \param interpMode  the TGSI_INTERPOLATE_LINEAR/PERSP mode for each input -   * \param numOutputs  number of output registers used   * \param outputMapping  maps Mesa fragment program outputs to TGSI   *                       generic outputs   * \param outputSemanticName  the TGSI_SEMANTIC flag for each output - * \param outputSemanticIndex  the semantic index (ex: which texcoord) for each output - * \param tokens  array to store translated tokens in - * \param maxTokens  size of the tokens array + * \param outputSemanticIndex  the semantic index (ex: which texcoord) for + *                             each output   * - * \return number of tokens placed in 'tokens' buffer, or zero if error + * \return  array of translated tokens, caller's responsibility to free   */ -GLuint +const struct tgsi_token *  st_translate_mesa_program(     GLcontext *ctx,     uint procType, @@ -890,252 +703,124 @@ st_translate_mesa_program(     const GLuint outputMapping[],     const ubyte outputSemanticName[],     const ubyte outputSemanticIndex[], -   const GLbitfield outputFlags[], -   struct tgsi_token *tokens, -   GLuint maxTokens ) +   const GLbitfield outputFlags[] )  { -   GLuint i; -   GLuint ti;  /* token index */ -   struct tgsi_header *header; -   struct tgsi_processor *processor; -   GLuint preamble_size = 0; -   GLuint immediates[1000]; -   GLuint numImmediates = 0; -   GLboolean insideSubroutine = GL_FALSE; -   GLboolean indirectAccess = GL_FALSE; -   GLboolean tempsUsed[MAX_PROGRAM_TEMPS + 1]; -   GLint wposTemp = -1, winHeightConst = -1; - -   assert(procType == TGSI_PROCESSOR_FRAGMENT || -          procType == TGSI_PROCESSOR_VERTEX); - -   find_temporaries(program, tempsUsed); - -   if (procType == TGSI_PROCESSOR_FRAGMENT) { -      if (program->InputsRead & FRAG_BIT_WPOS) { -         /* Fragment program uses fragment position input. -          * Need to replace instances of INPUT[WPOS] with temp T -          * where T = INPUT[WPOS] by y is inverted. -          */ -         static const gl_state_index winSizeState[STATE_LENGTH] -            = { STATE_INTERNAL, STATE_FB_SIZE, 0, 0, 0 }; -         winHeightConst = _mesa_add_state_reference(program->Parameters, -                                                    winSizeState); -         wposTemp = find_free_temporary(tempsUsed); -      } -   } - +   struct st_translate translate, *t; +   struct ureg_program *ureg; +   const struct tgsi_token *tokens = NULL; +   unsigned i; -   *(struct tgsi_version *) &tokens[0] = tgsi_build_version(); +   t = &translate; +   memset(t, 0, sizeof *t); -   header = (struct tgsi_header *) &tokens[1]; -   *header = tgsi_build_header(); +   t->procType = procType; +   t->inputMapping = inputMapping; +   t->outputMapping = outputMapping; +   t->ureg = ureg_create( procType ); +   if (t->ureg == NULL) +      return NULL; -   processor = (struct tgsi_processor *) &tokens[2]; -   *processor = tgsi_build_processor( procType, header ); +   ureg = t->ureg; -   ti = 3; +   /*_mesa_print_program(program);*/     /*      * Declare input attributes.      */     if (procType == TGSI_PROCESSOR_FRAGMENT) {        for (i = 0; i < numInputs; i++) { -         struct tgsi_full_declaration fulldecl; -         fulldecl = make_input_decl(i, -                                    GL_TRUE, interpMode[i], -                                    TGSI_WRITEMASK_XYZW, -                                    GL_TRUE, inputSemanticName[i], -                                    inputSemanticIndex[i], -                                    inputFlags[i]); -         ti += tgsi_build_full_declaration(&fulldecl, -                                           &tokens[ti], -                                           header, -                                           maxTokens - ti ); +         t->inputs[i] = ureg_DECL_fs_input(ureg, +                                           inputSemanticName[i], +                                           inputSemanticIndex[i], +                                           interpMode[i]);        } -   } -   else { -      /* vertex prog */ -      /* XXX: this could probaby be merged with the clause above. -       * the only difference is the semantic tags. -       */ -      for (i = 0; i < numInputs; i++) { -         struct tgsi_full_declaration fulldecl; -         fulldecl = make_input_decl(i, -                                    GL_FALSE, 0, -                                    TGSI_WRITEMASK_XYZW, -                                    GL_FALSE, 0, 0, -                                    inputFlags[i]); -         ti += tgsi_build_full_declaration(&fulldecl, -                                           &tokens[ti], -                                           header, -                                           maxTokens - ti ); + +      if (program->InputsRead & FRAG_BIT_WPOS) { +         /* Must do this after setting up t->inputs, and before +          * emitting constant references, below: +          */ +         emit_inverted_wpos( t, program );        } -   } -   /* -    * Declare output attributes. -    */ -   if (procType == TGSI_PROCESSOR_FRAGMENT) { +      /* +       * Declare output attributes. +       */        for (i = 0; i < numOutputs; i++) { -         struct tgsi_full_declaration fulldecl;           switch (outputSemanticName[i]) {           case TGSI_SEMANTIC_POSITION: -            fulldecl = make_output_decl(i, -                                        TGSI_SEMANTIC_POSITION, /* Z / Depth */ -                                        outputSemanticIndex[i], -                                        TGSI_WRITEMASK_Z, -                                        outputFlags[i]); +            t->outputs[i] = ureg_DECL_output( ureg, +                                              TGSI_SEMANTIC_POSITION, /* Z / Depth */ +                                              outputSemanticIndex[i] ); + +            t->outputs[i] = ureg_writemask( t->outputs[i], +                                            TGSI_WRITEMASK_Z );              break;           case TGSI_SEMANTIC_COLOR: -            fulldecl = make_output_decl(i, -                                        TGSI_SEMANTIC_COLOR, -                                        outputSemanticIndex[i], -                                        TGSI_WRITEMASK_XYZW, -                                        outputFlags[i]); +            t->outputs[i] = ureg_DECL_output( ureg, +                                              TGSI_SEMANTIC_COLOR, +                                              outputSemanticIndex[i] );              break;           default:              assert(0);              return 0;           } -         ti += tgsi_build_full_declaration(&fulldecl, -                                           &tokens[ti], -                                           header, -                                           maxTokens - ti );        }     }     else { -      /* vertex prog */ -      for (i = 0; i < numOutputs; i++) { -         struct tgsi_full_declaration fulldecl; -         fulldecl = make_output_decl(i, -                                     outputSemanticName[i], -                                     outputSemanticIndex[i], -                                     TGSI_WRITEMASK_XYZW, -                                     outputFlags[i]); -         ti += tgsi_build_full_declaration(&fulldecl, -                                           &tokens[ti], -                                           header, -                                           maxTokens - ti ); +      for (i = 0; i < numInputs; i++) { +         t->inputs[i] = ureg_DECL_vs_input(ureg, i);        } -   } - -   /* temporary decls */ -   { -      GLboolean inside_range = GL_FALSE; -      GLuint start_range = 0; -      tempsUsed[MAX_PROGRAM_TEMPS] = GL_FALSE; -      for (i = 0; i < MAX_PROGRAM_TEMPS + 1; i++) { -         if (tempsUsed[i] && !inside_range) { -            inside_range = GL_TRUE; -            start_range = i; -         } -         else if (!tempsUsed[i] && inside_range) { -            struct tgsi_full_declaration fulldecl; - -            inside_range = GL_FALSE; -            fulldecl = make_temp_decl( start_range, i - 1 ); -            ti += tgsi_build_full_declaration( -               &fulldecl, -               &tokens[ti], -               header, -               maxTokens - ti ); -         } +      for (i = 0; i < numOutputs; i++) { +         t->outputs[i] = ureg_DECL_output( ureg, +                                           outputSemanticName[i], +                                           outputSemanticIndex[i] );        }     }     /* Declare address register. -   */ +    */     if (program->NumAddressRegs > 0) { -      struct tgsi_full_declaration fulldecl; -        assert( program->NumAddressRegs == 1 ); - -      fulldecl = make_addr_decl( 0, 0 ); -      ti += tgsi_build_full_declaration( -         &fulldecl, -         &tokens[ti], -         header, -         maxTokens - ti ); - -      indirectAccess = GL_TRUE; +      t->address[0] = ureg_DECL_address( ureg );     } -   /* immediates/literals */ -   memset(immediates, ~0, sizeof(immediates)); -   /* Emit immediates only when there is no address register in use. -    * FIXME: Be smarter and recognize param arrays -- indirect addressing is -    *        only valid within the referenced array. +   /* Emit constants and immediates.  Mesa uses a single index space +    * for these, so we put all the translated regs in t->constants.      */ -   if (program->Parameters && !indirectAccess) { -      for (i = 0; i < program->Parameters->NumParameters; i++) { -         if (program->Parameters->Parameters[i].Type == PROGRAM_CONSTANT) { -            struct tgsi_full_immediate fullimm; - -            fullimm = make_immediate( program->Parameters->ParameterValues[i], 4 ); -            ti += tgsi_build_full_immediate( -               &fullimm, -               &tokens[ti], -               header, -               maxTokens - ti ); -            immediates[i] = numImmediates; -            numImmediates++; -         } -      } -   } - -   /* constant buffer refs */     if (program->Parameters) { -      GLint start = -1, end = -1; - +       +      t->constants = CALLOC( program->Parameters->NumParameters, +                             sizeof t->constants[0] ); +      if (t->constants == NULL) +         goto out; +              for (i = 0; i < program->Parameters->NumParameters; i++) { -         GLboolean emit = (i == program->Parameters->NumParameters - 1); -         GLboolean matches; -           switch (program->Parameters->Parameters[i].Type) {           case PROGRAM_ENV_PARAM:           case PROGRAM_STATE_VAR:           case PROGRAM_NAMED_PARAM:           case PROGRAM_UNIFORM: -            matches = GL_TRUE; +            t->constants[i] = ureg_DECL_constant( ureg, i );              break; + +            /* Emit immediates only when there is no address register +             * in use.  FIXME: Be smarter and recognize param arrays: +             * indirect addressing is only valid within the referenced +             * array. +             */           case PROGRAM_CONSTANT: -            matches = indirectAccess; +            if (program->NumAddressRegs > 0)  +               t->constants[i] = ureg_DECL_constant( ureg, i ); +            else +               t->constants[i] =  +                  ureg_DECL_immediate( ureg, +                                       program->Parameters->ParameterValues[i], +                                       4 );              break;           default: -            matches = GL_FALSE; -         } - -         if (matches) { -            if (start == -1) { -               /* begin a sequence */ -               start = i; -               end = i; -            } -            else { -               /* continue sequence */ -               end = i; -            } -         } -         else { -            if (start != -1) { -               /* end of sequence */ -               emit = GL_TRUE; -            } -         } - -         if (emit && start >= 0) { -            struct tgsi_full_declaration fulldecl; - -            fulldecl = make_constant_decl( start, end ); -            ti += tgsi_build_full_declaration( -               &fulldecl, -               &tokens[ti], -               header, -               maxTokens - ti ); -            start = end = -1; +            break;           }        }     } @@ -1143,58 +828,44 @@ st_translate_mesa_program(     /* texture samplers */     for (i = 0; i < ctx->Const.MaxTextureImageUnits; i++) {        if (program->SamplersUsed & (1 << i)) { -         struct tgsi_full_declaration fulldecl; - -         fulldecl = make_sampler_decl( i ); -         ti += tgsi_build_full_declaration( -            &fulldecl, -            &tokens[ti], -            header, -            maxTokens - ti ); +         t->samplers[i] = ureg_DECL_sampler( ureg, i );        }     } -   /* invert WPOS fragment input */ -   if (wposTemp >= 0) { -      ti += emit_inverted_wpos(&tokens[ti], wposTemp, winHeightConst, -                               inputMapping[FRAG_ATTRIB_WPOS], -                               header, maxTokens - ti); -      preamble_size = 2; /* two instructions added */ +   /* Emit each instruction in turn: +    */ +   for (i = 0; i < program->NumInstructions; i++) { +      set_insn_start( t, ureg_get_instruction_number( ureg )); +      compile_instruction( t, &program->Instructions[i] ); +   } + +   /* Fix up all emitted labels: +    */ +   for (i = 0; i < t->labels_count; i++) { +      ureg_fixup_label( ureg, +                        t->labels[i].token, +                        t->insn[t->labels[i].branch_target] );     } -   for (i = 0; i < program->NumInstructions; i++) { -      struct tgsi_full_instruction fullinst; +   tokens = ureg_get_tokens( ureg, NULL ); +   ureg_destroy( ureg ); -      compile_instruction( -         &program->Instructions[i], -         &fullinst, -         inputMapping, -         outputMapping, -         immediates, -         indirectAccess, -         preamble_size, -         procType, -         &insideSubroutine, -         wposTemp); +out: +   FREE(t->insn); +   FREE(t->labels); +   FREE(t->constants); -      ti += tgsi_build_full_instruction( -         &fullinst, -         &tokens[ti], -         header, -         maxTokens - ti ); +   if (t->error) { +      debug_printf("%s: translate error flag set\n", __FUNCTION__); +      FREE((void *)tokens); +      tokens = NULL;     } -#if DEBUG -   if(!tgsi_sanity_check(tokens)) { -      debug_printf("Due to sanity check failure(s) above the following shader program is invalid:\n"); -      debug_printf("\nOriginal program:\n%s", program->String); -      debug_printf("\nMesa program:\n"); +   if (!tokens) { +      debug_printf("%s: failed to translate Mesa program:\n", __FUNCTION__);        _mesa_print_program(program); -      debug_printf("\nTGSI program:\n"); -      tgsi_dump(tokens, 0);        assert(0);     } -#endif -   return ti; +   return tokens;  } diff --git a/src/mesa/state_tracker/st_mesa_to_tgsi.h b/src/mesa/state_tracker/st_mesa_to_tgsi.h index b465b3bddc..679d0ddd41 100644 --- a/src/mesa/state_tracker/st_mesa_to_tgsi.h +++ b/src/mesa/state_tracker/st_mesa_to_tgsi.h @@ -39,7 +39,7 @@ extern "C" {  struct tgsi_token;  struct gl_program; -GLuint +const struct tgsi_token *  st_translate_mesa_program(     GLcontext *ctx,     uint procType, @@ -54,9 +54,7 @@ st_translate_mesa_program(     const GLuint outputMapping[],     const ubyte outputSemanticName[],     const ubyte outputSemanticIndex[], -   const GLbitfield outputFlags[], -   struct tgsi_token *tokens, -   GLuint maxTokens ); +   const GLbitfield outputFlags[] );  #if defined __cplusplus diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c index d2da20ae42..5f9d2a6dad 100644 --- a/src/mesa/state_tracker/st_program.c +++ b/src/mesa/state_tracker/st_program.c @@ -49,9 +49,6 @@  #include "cso_cache/cso_context.h" -#define ST_MAX_SHADER_TOKENS (8 * 1024) - -  #define TGSI_DEBUG 0 @@ -70,12 +67,9 @@ st_translate_vertex_program(struct st_context *st,                              const ubyte *outputSemanticIndex)  {     struct pipe_context *pipe = st->pipe; -   struct tgsi_token *tokens;     GLuint defaultOutputMapping[VERT_RESULT_MAX]; -   struct pipe_shader_state vs;     GLuint attr, i;     GLuint num_generic = 0; -   GLuint num_tokens;     ubyte vs_input_semantic_name[PIPE_MAX_SHADER_INPUTS];     ubyte vs_input_semantic_index[PIPE_MAX_SHADER_INPUTS]; @@ -88,14 +82,7 @@ st_translate_vertex_program(struct st_context *st,     GLbitfield input_flags[MAX_PROGRAM_INPUTS];     GLbitfield output_flags[MAX_PROGRAM_OUTPUTS]; -   tokens =  (struct tgsi_token *)MALLOC(ST_MAX_SHADER_TOKENS * sizeof *tokens); -   if(!tokens) { -      /* FIXME: propagate error to the caller */ -      assert(0); -      return; -   } - -   memset(&vs, 0, sizeof(vs)); +//   memset(&vs, 0, sizeof(vs));     memset(input_flags, 0, sizeof(input_flags));     memset(output_flags, 0, sizeof(output_flags)); @@ -338,43 +325,32 @@ st_translate_vertex_program(struct st_context *st,        stvp->driver_shader = NULL;     } -   /* XXX: fix static allocation of tokens: -    */ -   num_tokens = st_translate_mesa_program(st->ctx, -                                          TGSI_PROCESSOR_VERTEX, -                                          &stvp->Base.Base, -                                          /* inputs */ -                                          vs_num_inputs, -                                          stvp->input_to_index, -                                          vs_input_semantic_name, -                                          vs_input_semantic_index, -                                          NULL, -                                          input_flags, -                                          /* outputs */ -                                          vs_num_outputs, -                                          outputMapping, -                                          vs_output_semantic_name, -                                          vs_output_semantic_index, -                                          output_flags, -                                          /* tokenized result */ -                                          tokens, ST_MAX_SHADER_TOKENS); - -   assert(num_tokens < ST_MAX_SHADER_TOKENS); - -   vs.tokens = (struct tgsi_token *) -      _mesa_realloc(tokens, -                    ST_MAX_SHADER_TOKENS * sizeof *tokens, -                    num_tokens * sizeof *tokens); +   stvp->state.tokens =  +      st_translate_mesa_program(st->ctx, +                                TGSI_PROCESSOR_VERTEX, +                                &stvp->Base.Base, +                                /* inputs */ +                                vs_num_inputs, +                                stvp->input_to_index, +                                vs_input_semantic_name, +                                vs_input_semantic_index, +                                NULL, +                                input_flags, +                                /* outputs */ +                                vs_num_outputs, +                                outputMapping, +                                vs_output_semantic_name, +                                vs_output_semantic_index, +                                output_flags );     stvp->num_inputs = vs_num_inputs; -   stvp->state = vs; /* struct copy */ -   stvp->driver_shader = pipe->create_vs_state(pipe, &vs); +   stvp->driver_shader = pipe->create_vs_state(pipe, &stvp->state);     if (0)        _mesa_print_program(&stvp->Base.Base);     if (TGSI_DEBUG) -      tgsi_dump( vs.tokens, 0 ); +      tgsi_dump( stvp->state.tokens, 0 );  } @@ -383,7 +359,6 @@ st_translate_vertex_program(struct st_context *st,   * Translate a Mesa fragment shader into a TGSI shader.   * \param inputMapping  to map fragment program input registers to TGSI   *                      input slots - * \param tokensOut  destination for TGSI tokens   * \return  pointer to cached pipe_shader object.   */  void @@ -392,16 +367,13 @@ st_translate_fragment_program(struct st_context *st,                                const GLuint inputMapping[])  {     struct pipe_context *pipe = st->pipe; -   struct tgsi_token *tokens;     GLuint outputMapping[FRAG_RESULT_MAX];     GLuint defaultInputMapping[FRAG_ATTRIB_MAX]; -   struct pipe_shader_state fs;     GLuint interpMode[16];  /* XXX size? */     GLuint attr;     const GLbitfield inputsRead = stfp->Base.Base.InputsRead;     GLuint vslot = 0;     GLuint num_generic = 0; -   GLuint num_tokens;     uint fs_num_inputs = 0; @@ -412,14 +384,7 @@ st_translate_fragment_program(struct st_context *st,     GLbitfield input_flags[MAX_PROGRAM_INPUTS];     GLbitfield output_flags[MAX_PROGRAM_OUTPUTS]; -   tokens =  (struct tgsi_token *)MALLOC(ST_MAX_SHADER_TOKENS * sizeof *tokens); -   if(!tokens) { -      /* FIXME: propagate error to the caller */ -      assert(0); -      return; -   } - -   memset(&fs, 0, sizeof(fs)); +//   memset(&fs, 0, sizeof(fs));     memset(input_flags, 0, sizeof(input_flags));     memset(output_flags, 0, sizeof(output_flags)); @@ -541,42 +506,31 @@ st_translate_fragment_program(struct st_context *st,     if (!inputMapping)        inputMapping = defaultInputMapping; -   /* XXX: fix static allocation of tokens: -    */ -   num_tokens = st_translate_mesa_program(st->ctx, -                                          TGSI_PROCESSOR_FRAGMENT, -                                          &stfp->Base.Base, -                                          /* inputs */ -                                          fs_num_inputs, -                                          inputMapping, -                                          stfp->input_semantic_name, -                                          stfp->input_semantic_index, -                                          interpMode, -                                          input_flags, -                                          /* outputs */ -                                          fs_num_outputs, -                                          outputMapping, -                                          fs_output_semantic_name, -                                          fs_output_semantic_index, -                                          output_flags, -                                          /* tokenized result */ -                                          tokens, ST_MAX_SHADER_TOKENS); - -   assert(num_tokens < ST_MAX_SHADER_TOKENS); - -   fs.tokens = (struct tgsi_token *) -      _mesa_realloc(tokens, -                    ST_MAX_SHADER_TOKENS * sizeof *tokens, -                    num_tokens * sizeof *tokens); +   stfp->state.tokens =  +      st_translate_mesa_program(st->ctx, +                                TGSI_PROCESSOR_FRAGMENT, +                                &stfp->Base.Base, +                                /* inputs */ +                                fs_num_inputs, +                                inputMapping, +                                stfp->input_semantic_name, +                                stfp->input_semantic_index, +                                interpMode, +                                input_flags, +                                /* outputs */ +                                fs_num_outputs, +                                outputMapping, +                                fs_output_semantic_name, +                                fs_output_semantic_index, +                                output_flags ); -   stfp->state = fs; /* struct copy */ -   stfp->driver_shader = pipe->create_fs_state(pipe, &fs); +   stfp->driver_shader = pipe->create_fs_state(pipe, &stfp->state);     if (0)        _mesa_print_program(&stfp->Base.Base);     if (TGSI_DEBUG) -      tgsi_dump( fs.tokens, 0/*TGSI_DUMP_VERBOSE*/ ); +      tgsi_dump( stfp->state.tokens, 0/*TGSI_DUMP_VERBOSE*/ );  } diff --git a/src/mesa/swrast/s_texstore.c b/src/mesa/swrast/s_texstore.c index f9ff9ad6a4..4f19d19ab1 100644 --- a/src/mesa/swrast/s_texstore.c +++ b/src/mesa/swrast/s_texstore.c @@ -299,11 +299,6 @@ _swrast_copy_teximage1d( GLcontext *ctx, GLenum target, GLint level,                               &ctx->DefaultPacking, texObj, texImage);        _mesa_free(image);     } - -   /* GL_SGIS_generate_mipmap */ -   if (level == texObj->BaseLevel && texObj->GenerateMipmap) { -      ctx->Driver.GenerateMipmap(ctx, target, texObj); -   }  } @@ -375,11 +370,6 @@ _swrast_copy_teximage2d( GLcontext *ctx, GLenum target, GLint level,                               &ctx->DefaultPacking, texObj, texImage);        _mesa_free(image);     } - -   /* GL_SGIS_generate_mipmap */ -   if (level == texObj->BaseLevel && texObj->GenerateMipmap) { -      ctx->Driver.GenerateMipmap(ctx, target, texObj); -   }  } @@ -444,11 +434,6 @@ _swrast_copy_texsubimage1d( GLcontext *ctx, GLenum target, GLint level,                                  &ctx->DefaultPacking, texObj, texImage);        _mesa_free(image);     } - -   /* GL_SGIS_generate_mipmap */ -   if (level == texObj->BaseLevel && texObj->GenerateMipmap) { -      ctx->Driver.GenerateMipmap(ctx, target, texObj); -   }  } @@ -520,11 +505,6 @@ _swrast_copy_texsubimage2d( GLcontext *ctx,                                  &ctx->DefaultPacking, texObj, texImage);        _mesa_free(image);     } - -   /* GL_SGIS_generate_mipmap */ -   if (level == texObj->BaseLevel && texObj->GenerateMipmap) { -      ctx->Driver.GenerateMipmap(ctx, target, texObj); -   }  } @@ -593,9 +573,4 @@ _swrast_copy_texsubimage3d( GLcontext *ctx,                                  &ctx->DefaultPacking, texObj, texImage);        _mesa_free(image);     } - -   /* GL_SGIS_generate_mipmap */ -   if (level == texObj->BaseLevel && texObj->GenerateMipmap) { -      ctx->Driver.GenerateMipmap(ctx, target, texObj); -   }  } | 
