diff options
Diffstat (limited to 'src/mesa')
41 files changed, 324 insertions, 329 deletions
| diff --git a/src/mesa/SConscript b/src/mesa/SConscript index 309e0e54d0..ca4a9afce5 100644 --- a/src/mesa/SConscript +++ b/src/mesa/SConscript @@ -164,7 +164,6 @@ if env['platform'] != 'winddk':  		'state_tracker/st_cb_flush.c',  		'state_tracker/st_cb_drawpixels.c',  		'state_tracker/st_cb_fbo.c', -		'state_tracker/st_cb_get.c',  		'state_tracker/st_cb_feedback.c',  		'state_tracker/st_cb_program.c',  		'state_tracker/st_cb_queryobj.c', diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c index a431519143..39b0ab13c6 100644 --- a/src/mesa/drivers/common/meta.c +++ b/src/mesa/drivers/common/meta.c @@ -2149,6 +2149,7 @@ _mesa_meta_GenerateMipmap(GLcontext *ctx, GLenum target,     const GLenum wrapTSave = texObj->WrapT;     const GLenum wrapRSave = texObj->WrapR;     const GLuint fboSave = ctx->DrawBuffer->Name; +   const GLuint original_active_unit = ctx->Texture.CurrentUnit;     GLenum faceTarget;     GLuint dstLevel;     GLuint border = 0; @@ -2288,6 +2289,9 @@ _mesa_meta_GenerateMipmap(GLcontext *ctx, GLenum target,     /* texture is already locked, unlock now */     _mesa_unlock_texture(ctx, texObj); +   if (original_active_unit != 0) +      _mesa_BindTexture(target, texObj->Name); +     for (dstLevel = baseLevel + 1; dstLevel <= maxLevel; dstLevel++) {        const struct gl_texture_image *srcImage;        const GLuint srcLevel = dstLevel - 1; diff --git a/src/mesa/drivers/dri/common/spantmp2.h b/src/mesa/drivers/dri/common/spantmp2.h index 95f97414a9..447f3d15b9 100644 --- a/src/mesa/drivers/dri/common/spantmp2.h +++ b/src/mesa/drivers/dri/common/spantmp2.h @@ -356,6 +356,63 @@       } while (0)  # endif +#elif (SPANTMP_PIXEL_FMT == GL_BGR) && (SPANTMP_PIXEL_TYPE == GL_UNSIGNED_INT_8_8_8_8_REV) + +/** + ** GL_BGR, GL_UNSIGNED_INT_8_8_8_8_REV + ** + ** This is really for MESA_FORMAT_XRGB8888.  The spantmp code needs to be + ** kicked to the curb, and we need to just code-gen this. + **/ + +#ifndef GET_VALUE +#ifndef GET_PTR +#define GET_PTR(_x, _y) (     buf + (_x) * 4 + (_y) * pitch) +#endif + +#define GET_VALUE(_x, _y) *(volatile GLuint *)(GET_PTR(_x, _y)) +#define PUT_VALUE(_x, _y, _v) *(volatile GLuint *)(GET_PTR(_x, _y)) = (_v) +#endif /* GET_VALUE */ + +# define INIT_MONO_PIXEL(p, color)                       \ +     p = PACK_COLOR_8888(0xff, color[0], color[1], color[2]) + +# define WRITE_RGBA(_x, _y, r, g, b, a)					\ +   PUT_VALUE(_x, _y, ((r << 16) |					\ +		      (g << 8) |					\ +		      (b << 0) |					\ +		      (0xff << 24))) + +#define WRITE_PIXEL(_x, _y, p) PUT_VALUE(_x, _y, p) + +# if defined( USE_X86_ASM ) +#  define READ_RGBA(rgba, _x, _y)                                       \ +    do {                                                                \ +       GLuint p = GET_VALUE(_x, _y);					\ +       __asm__ __volatile__( "bswap	%0; rorl $8, %0"                \ +				: "=r" (p) : "0" (p) );                 \ +       ((GLuint *)rgba)[0] = p | 0xff000000;				\ +    } while (0) +# elif defined( MESA_BIG_ENDIAN ) +    /* On PowerPC with GCC 3.4.2 the shift madness below becomes a single +     * rotlwi instruction.  It also produces good code on SPARC. +     */ +#  define READ_RGBA( rgba, _x, _y )				        \ +     do {								\ +        GLuint p = GET_VALUE(_x, _y);					\ +        *((uint32_t *) rgba) = (t << 8) | 0xff;				\ +     } while (0) +# else +#  define READ_RGBA( rgba, _x, _y )				        \ +     do {								\ +        GLuint p = GET_VALUE(_x, _y);					\ +	rgba[0] = (p >> 16) & 0xff;					\ +	rgba[1] = (p >>  8) & 0xff;					\ +	rgba[2] = (p >>  0) & 0xff;					\ +	rgba[3] = 0xff;							\ +     } while (0) +# endif +  #else  #error SPANTMP_PIXEL_FMT must be set to a valid value!  #endif diff --git a/src/mesa/drivers/dri/i915/i830_texstate.c b/src/mesa/drivers/dri/i915/i830_texstate.c index c62281d341..27c5aa1e08 100644 --- a/src/mesa/drivers/dri/i915/i830_texstate.c +++ b/src/mesa/drivers/dri/i915/i830_texstate.c @@ -56,10 +56,7 @@ translate_texture_format(GLuint mesa_format, GLuint internal_format)     case MESA_FORMAT_ARGB4444:        return MAPSURF_16BIT | MT_16BIT_ARGB4444;     case MESA_FORMAT_ARGB8888: -      if (internal_format == GL_RGB) -	 return MAPSURF_32BIT | MT_32BIT_XRGB8888; -      else -	 return MAPSURF_32BIT | MT_32BIT_ARGB8888; +      return MAPSURF_32BIT | MT_32BIT_ARGB8888;     case MESA_FORMAT_XRGB8888:        return MAPSURF_32BIT | MT_32BIT_XRGB8888;     case MESA_FORMAT_YCBCR_REV: diff --git a/src/mesa/drivers/dri/i915/i830_vtbl.c b/src/mesa/drivers/dri/i915/i830_vtbl.c index c05c7759ac..1e3c8301d8 100644 --- a/src/mesa/drivers/dri/i915/i830_vtbl.c +++ b/src/mesa/drivers/dri/i915/i830_vtbl.c @@ -645,7 +645,7 @@ i830_state_draw_region(struct intel_context *intel,              DSTORG_VERT_BIAS(0x8) | DEPTH_IS_Z);    /* .5 */     if (irb != NULL) { -      switch (irb->texformat) { +      switch (irb->Base.Format) {        case MESA_FORMAT_ARGB8888:        case MESA_FORMAT_XRGB8888:  	 value |= DV_PF_8888; @@ -661,7 +661,7 @@ i830_state_draw_region(struct intel_context *intel,  	 break;        default:  	 _mesa_problem(ctx, "Bad renderbuffer format: %d\n", -		       irb->texformat); +		       irb->Base.Format);        }     } diff --git a/src/mesa/drivers/dri/i915/i915_debug.c b/src/mesa/drivers/dri/i915/i915_debug.c index f7bb7ea44c..fecfac3033 100644 --- a/src/mesa/drivers/dri/i915/i915_debug.c +++ b/src/mesa/drivers/dri/i915/i915_debug.c @@ -806,6 +806,7 @@ static GLboolean i915_debug_packet( struct debug_stream *stream )        default:  	 return debug(stream, "", 0);        } +      break;     default:        assert(0);        return 0; diff --git a/src/mesa/drivers/dri/i915/i915_texstate.c b/src/mesa/drivers/dri/i915/i915_texstate.c index 1bacd51aec..2b03331a00 100644 --- a/src/mesa/drivers/dri/i915/i915_texstate.c +++ b/src/mesa/drivers/dri/i915/i915_texstate.c @@ -57,10 +57,7 @@ translate_texture_format(gl_format mesa_format, GLuint internal_format,     case MESA_FORMAT_ARGB4444:        return MAPSURF_16BIT | MT_16BIT_ARGB4444;     case MESA_FORMAT_ARGB8888: -      if (internal_format == GL_RGB) -	 return MAPSURF_32BIT | MT_32BIT_XRGB8888; -      else -	 return MAPSURF_32BIT | MT_32BIT_ARGB8888; +      return MAPSURF_32BIT | MT_32BIT_ARGB8888;     case MESA_FORMAT_XRGB8888:        return MAPSURF_32BIT | MT_32BIT_XRGB8888;     case MESA_FORMAT_YCBCR_REV: diff --git a/src/mesa/drivers/dri/i915/i915_vtbl.c b/src/mesa/drivers/dri/i915/i915_vtbl.c index 3e7b5101cc..ba6be9796e 100644 --- a/src/mesa/drivers/dri/i915/i915_vtbl.c +++ b/src/mesa/drivers/dri/i915/i915_vtbl.c @@ -587,7 +587,7 @@ i915_state_draw_region(struct intel_context *intel,              DSTORG_VERT_BIAS(0x8) |     /* .5 */              LOD_PRECLAMP_OGL | TEX_DEFAULT_COLOR_OGL);     if (irb != NULL) { -      switch (irb->texformat) { +      switch (irb->Base.Format) {        case MESA_FORMAT_ARGB8888:        case MESA_FORMAT_XRGB8888:  	 value |= DV_PF_8888; @@ -603,7 +603,7 @@ i915_state_draw_region(struct intel_context *intel,  	 break;        default:  	 _mesa_problem(ctx, "Bad renderbuffer format: %d\n", -		       irb->texformat); +		       irb->Base.Format);        }     } diff --git a/src/mesa/drivers/dri/i965/brw_cc.c b/src/mesa/drivers/dri/i965/brw_cc.c index d4ccd28c9e..ab301b9a3a 100644 --- a/src/mesa/drivers/dri/i965/brw_cc.c +++ b/src/mesa/drivers/dri/i965/brw_cc.c @@ -34,6 +34,7 @@  #include "brw_state.h"  #include "brw_defines.h"  #include "brw_util.h" +#include "intel_fbo.h"  #include "main/macros.h"  #include "main/enums.h" @@ -89,6 +90,28 @@ struct brw_cc_unit_key {     GLenum depth_func;  }; +/** + * Modify blend function to force destination alpha to 1.0 + * + * If \c function specifies a blend function that uses destination alpha, + * replace it with a function that hard-wires destination alpha to 1.0.  This + * is used when rendering to xRGB targets. + */ +static GLenum +fix_xRGB_alpha(GLenum function) +{ +   switch (function) { +   case GL_DST_ALPHA: +      return GL_ONE; + +   case GL_ONE_MINUS_DST_ALPHA: +   case GL_SRC_ALPHA_SATURATE: +      return GL_ZERO; +   } + +   return function; +} +  static void  cc_unit_populate_key(struct brw_context *brw, struct brw_cc_unit_key *key)  { @@ -132,6 +155,17 @@ cc_unit_populate_key(struct brw_context *brw, struct brw_cc_unit_key *key)        key->blend_dst_rgb = ctx->Color.BlendDstRGB;        key->blend_src_a = ctx->Color.BlendSrcA;        key->blend_dst_a = ctx->Color.BlendDstA; + +      /* If the renderbuffer is XRGB, we have to frob the blend function to +       * force the destination alpha to 1.0.  This means replacing GL_DST_ALPHA +       * with GL_ONE and GL_ONE_MINUS_DST_ALPAH with GL_ZERO. +       */ +      if (ctx->Visual.alphaBits == 0) { +	 key->blend_src_rgb = fix_xRGB_alpha(key->blend_src_rgb); +	 key->blend_src_a   = fix_xRGB_alpha(key->blend_src_a); +	 key->blend_dst_rgb = fix_xRGB_alpha(key->blend_dst_rgb); +	 key->blend_dst_a   = fix_xRGB_alpha(key->blend_dst_a); +      }     }     key->alpha_enabled = ctx->Color.AlphaEnabled; diff --git a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c index 47035cc6fc..3f9b1fbfdc 100644 --- a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c +++ b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c @@ -94,20 +94,14 @@ static GLuint translate_tex_format( gl_format mesa_format,        return BRW_SURFACEFORMAT_R8G8B8_UNORM;           case MESA_FORMAT_ARGB8888: -      if (internal_format == GL_RGB) -	 return BRW_SURFACEFORMAT_B8G8R8X8_UNORM; -      else -	 return BRW_SURFACEFORMAT_B8G8R8A8_UNORM; +      return BRW_SURFACEFORMAT_B8G8R8A8_UNORM;     case MESA_FORMAT_XRGB8888:        return BRW_SURFACEFORMAT_B8G8R8X8_UNORM;     case MESA_FORMAT_RGBA8888_REV:        _mesa_problem(NULL, "unexpected format in i965:translate_tex_format()"); -      if (internal_format == GL_RGB) -	 return BRW_SURFACEFORMAT_R8G8B8X8_UNORM; -      else -	 return BRW_SURFACEFORMAT_R8G8B8A8_UNORM; +      return BRW_SURFACEFORMAT_R8G8B8A8_UNORM;     case MESA_FORMAT_RGB565:        return BRW_SURFACEFORMAT_B5G6R5_UNORM; @@ -537,12 +531,16 @@ brw_update_renderbuffer_surface(struct brw_context *brw,        region_bo = region->buffer;        key.surface_type = BRW_SURFACE_2D; -      switch (irb->texformat) { +      switch (irb->Base.Format) { +      /* XRGB and ARGB are treated the same here because the chips in this +       * family cannot render to XRGB targets.  This means that we have to +       * mask writes to alpha (ala glColorMask) and reconfigure the alpha +       * blending hardware to use GL_ONE (or GL_ZERO) for cases where +       * GL_DST_ALPHA (or GL_ONE_MINUS_DST_ALPHA) is used. +       */        case MESA_FORMAT_ARGB8888: -	 key.surface_format = BRW_SURFACEFORMAT_B8G8R8A8_UNORM; -	 break;        case MESA_FORMAT_XRGB8888: -	 key.surface_format = BRW_SURFACEFORMAT_B8G8R8X8_UNORM; +	 key.surface_format = BRW_SURFACEFORMAT_B8G8R8A8_UNORM;  	 break;        case MESA_FORMAT_RGB565:  	 key.surface_format = BRW_SURFACEFORMAT_B5G6R5_UNORM; @@ -554,7 +552,7 @@ brw_update_renderbuffer_surface(struct brw_context *brw,  	 key.surface_format = BRW_SURFACEFORMAT_B4G4R4A4_UNORM;  	 break;        default: -	 _mesa_problem(ctx, "Bad renderbuffer format: %d\n", irb->texformat); +	 _mesa_problem(ctx, "Bad renderbuffer format: %d\n", irb->Base.Format);        }        key.tiling = region->tiling;        if (brw->intel.intelScreen->driScrnPriv->dri2.enabled) { @@ -579,6 +577,13 @@ brw_update_renderbuffer_surface(struct brw_context *brw,     /* _NEW_COLOR */     memcpy(key.color_mask, ctx->Color.ColorMask,  	  sizeof(key.color_mask)); + +   /* As mentioned above, disable writes to the alpha component when the +    * renderbuffer is XRGB. +    */ +   if (ctx->Visual.alphaBits == 0) +     key.color_mask[3] = GL_FALSE; +     key.color_blend = (!ctx->Color._LogicOpEnabled &&  		      ctx->Color.BlendEnabled); diff --git a/src/mesa/drivers/dri/intel/intel_blit.c b/src/mesa/drivers/dri/intel/intel_blit.c index f14854602b..cdf1408cd3 100644 --- a/src/mesa/drivers/dri/intel/intel_blit.c +++ b/src/mesa/drivers/dri/intel/intel_blit.c @@ -496,7 +496,7 @@ intelClearWithBlit(GLcontext *ctx, GLbitfield mask)  		  CLAMPED_FLOAT_TO_UBYTE(clear[2], color[2]);  		  CLAMPED_FLOAT_TO_UBYTE(clear[3], color[3]); -		  switch (irb->texformat) { +		  switch (irb->Base.Format) {  		  case MESA_FORMAT_ARGB8888:  		  case MESA_FORMAT_XRGB8888:  		     clearVal = PACK_COLOR_8888(clear[3], clear[0], @@ -515,7 +515,7 @@ intelClearWithBlit(GLcontext *ctx, GLbitfield mask)  		     break;  		  default:  		     _mesa_problem(ctx, "Unexpected renderbuffer format: %d\n", -				   irb->texformat); +				   irb->Base.Format);  		     clearVal = 0;  		  }  	       } diff --git a/src/mesa/drivers/dri/intel/intel_fbo.c b/src/mesa/drivers/dri/intel/intel_fbo.c index 5615040946..608f75b824 100644 --- a/src/mesa/drivers/dri/intel/intel_fbo.c +++ b/src/mesa/drivers/dri/intel/intel_fbo.c @@ -37,6 +37,7 @@  #include "drivers/common/meta.h"  #include "intel_context.h" +#include "intel_batchbuffer.h"  #include "intel_buffers.h"  #include "intel_fbo.h"  #include "intel_mipmap_tree.h" @@ -105,8 +106,8 @@ intel_alloc_renderbuffer_storage(GLcontext * ctx, struct gl_renderbuffer *rb,  {     struct intel_context *intel = intel_context(ctx);     struct intel_renderbuffer *irb = intel_renderbuffer(rb); -   GLboolean softwareBuffer = GL_FALSE;     int cpp; +   GLuint pitch;     ASSERT(rb->Name != 0); @@ -116,18 +117,14 @@ intel_alloc_renderbuffer_storage(GLcontext * ctx, struct gl_renderbuffer *rb,     case GL_RGB5:        rb->Format = MESA_FORMAT_RGB565;        rb->DataType = GL_UNSIGNED_BYTE; -      irb->texformat = MESA_FORMAT_RGB565; -      cpp = 2;        break;     case GL_RGB:     case GL_RGB8:     case GL_RGB10:     case GL_RGB12:     case GL_RGB16: -      rb->Format = MESA_FORMAT_ARGB8888; +      rb->Format = MESA_FORMAT_XRGB8888;        rb->DataType = GL_UNSIGNED_BYTE; -      irb->texformat = MESA_FORMAT_ARGB8888; /* XXX: Need xrgb8888 */ -      cpp = 4;        break;     case GL_RGBA:     case GL_RGBA2: @@ -139,8 +136,6 @@ intel_alloc_renderbuffer_storage(GLcontext * ctx, struct gl_renderbuffer *rb,     case GL_RGBA16:        rb->Format = MESA_FORMAT_ARGB8888;        rb->DataType = GL_UNSIGNED_BYTE; -      irb->texformat = MESA_FORMAT_ARGB8888; -      cpp = 4;        break;     case GL_STENCIL_INDEX:     case GL_STENCIL_INDEX1_EXT: @@ -150,29 +145,21 @@ intel_alloc_renderbuffer_storage(GLcontext * ctx, struct gl_renderbuffer *rb,        /* alloc a depth+stencil buffer */        rb->Format = MESA_FORMAT_S8_Z24;        rb->DataType = GL_UNSIGNED_INT_24_8_EXT; -      cpp = 4; -      irb->texformat = MESA_FORMAT_S8_Z24;        break;     case GL_DEPTH_COMPONENT16:        rb->Format = MESA_FORMAT_Z16;        rb->DataType = GL_UNSIGNED_SHORT; -      cpp = 2; -      irb->texformat = MESA_FORMAT_Z16;        break;     case GL_DEPTH_COMPONENT:     case GL_DEPTH_COMPONENT24:     case GL_DEPTH_COMPONENT32:        rb->Format = MESA_FORMAT_S8_Z24;        rb->DataType = GL_UNSIGNED_INT_24_8_EXT; -      cpp = 4; -      irb->texformat = MESA_FORMAT_S8_Z24;        break;     case GL_DEPTH_STENCIL_EXT:     case GL_DEPTH24_STENCIL8_EXT:        rb->Format = MESA_FORMAT_S8_Z24;        rb->DataType = GL_UNSIGNED_INT_24_8_EXT; -      cpp = 4; -      irb->texformat = MESA_FORMAT_S8_Z24;        break;     default:        _mesa_problem(ctx, @@ -181,6 +168,7 @@ intel_alloc_renderbuffer_storage(GLcontext * ctx, struct gl_renderbuffer *rb,     }     rb->_BaseFormat = _mesa_base_fbo_format(ctx, internalFormat); +   cpp = _mesa_get_format_bytes(rb->Format);     intelFlush(ctx); @@ -190,32 +178,25 @@ intel_alloc_renderbuffer_storage(GLcontext * ctx, struct gl_renderbuffer *rb,     }     /* allocate new memory region/renderbuffer */ -   if (softwareBuffer) { -      return _mesa_soft_renderbuffer_storage(ctx, rb, internalFormat, -                                             width, height); -   } -   else { -      /* Choose a pitch to match hardware requirements: -       */ -      GLuint pitch = ((cpp * width + 63) & ~63) / cpp; -      /* alloc hardware renderbuffer */ -      DBG("Allocating %d x %d Intel RBO (pitch %d)\n", width, -	  height, pitch); +   /* Choose a pitch to match hardware requirements: +    */ +   pitch = ((cpp * width + 63) & ~63) / cpp; -      irb->region = intel_region_alloc(intel, I915_TILING_NONE, -				       cpp, width, height, pitch, -				       GL_TRUE); -      if (!irb->region) -         return GL_FALSE;       /* out of memory? */ +   /* alloc hardware renderbuffer */ +   DBG("Allocating %d x %d Intel RBO (pitch %d)\n", width, height, pitch); -      ASSERT(irb->region->buffer); +   irb->region = intel_region_alloc(intel, I915_TILING_NONE, cpp, +				    width, height, pitch, GL_TRUE); +   if (!irb->region) +      return GL_FALSE;       /* out of memory? */ -      rb->Width = width; -      rb->Height = height; +   ASSERT(irb->region->buffer); -      return GL_TRUE; -   } +   rb->Width = width; +   rb->Height = height; + +   return GL_TRUE;  } @@ -297,7 +278,6 @@ intel_create_renderbuffer(gl_format format)     GET_CURRENT_CONTEXT(ctx);     struct intel_renderbuffer *irb; -   const GLuint name = 0;     irb = CALLOC_STRUCT(intel_renderbuffer);     if (!irb) { @@ -305,7 +285,7 @@ intel_create_renderbuffer(gl_format format)        return NULL;     } -   _mesa_init_renderbuffer(&irb->Base, name); +   _mesa_init_renderbuffer(&irb->Base, 0);     irb->Base.ClassID = INTEL_RB_CLASS;     switch (format) { @@ -314,10 +294,6 @@ intel_create_renderbuffer(gl_format format)        irb->Base.DataType = GL_UNSIGNED_BYTE;        break;     case MESA_FORMAT_XRGB8888: -      /* XXX this is a hack since XRGB surfaces don't seem to work -       * properly yet.  Reading the alpha channel returns 0 instead of 1. -       */ -      format = MESA_FORMAT_ARGB8888;        irb->Base._BaseFormat = GL_RGB;        irb->Base.DataType = GL_UNSIGNED_BYTE;        break; @@ -346,7 +322,6 @@ intel_create_renderbuffer(gl_format format)     irb->Base.Format = format;     irb->Base.InternalFormat = irb->Base._BaseFormat; -   irb->texformat = format;     /* intel-specific methods */     irb->Base.Delete = intel_delete_renderbuffer; @@ -423,7 +398,6 @@ static GLboolean  intel_update_wrapper(GLcontext *ctx, struct intel_renderbuffer *irb,   		     struct gl_texture_image *texImage)  { -   irb->texformat = texImage->TexFormat;     gl_format texFormat;     if (texImage->TexFormat == MESA_FORMAT_ARGB8888) { @@ -591,6 +565,7 @@ static void  intel_finish_render_texture(GLcontext * ctx,                              struct gl_renderbuffer_attachment *att)  { +   struct intel_context *intel = intel_context(ctx);     struct gl_texture_object *tex_obj = att->Texture;     struct gl_texture_image *image =        tex_obj->Image[att->CubeMapFace][att->TextureLevel]; @@ -598,8 +573,14 @@ intel_finish_render_texture(GLcontext * ctx,     /* Flag that this image may now be validated into the object's miptree. */     intel_image->used_as_render_target = GL_FALSE; -} +   /* Since we've (probably) rendered to the texture and will (likely) use +    * it in the texture domain later on in this batchbuffer, flush the +    * batch.  Once again, we wish for a domain tracker in libdrm to cover +    * usage inside of a batchbuffer like GEM does in the kernel. +    */ +   intel_batchbuffer_emit_mi_flush(intel->batch); +}  /**   * Do additional "completeness" testing of a framebuffer object. @@ -632,7 +613,7 @@ intel_validate_framebuffer(GLcontext *ctx, struct gl_framebuffer *fb)  	 continue;        } -      switch (irb->texformat) { +      switch (irb->Base.Format) {        case MESA_FORMAT_ARGB8888:        case MESA_FORMAT_XRGB8888:        case MESA_FORMAT_RGB565: diff --git a/src/mesa/drivers/dri/intel/intel_fbo.h b/src/mesa/drivers/dri/intel/intel_fbo.h index 50a8a95985..fa43077d6a 100644 --- a/src/mesa/drivers/dri/intel/intel_fbo.h +++ b/src/mesa/drivers/dri/intel/intel_fbo.h @@ -62,8 +62,6 @@ struct intel_renderbuffer     struct gl_renderbuffer Base;     struct intel_region *region; -   gl_format texformat; -     GLuint vbl_pending;   /**< vblank sequence number of pending flip */     uint8_t *span_cache; diff --git a/src/mesa/drivers/dri/intel/intel_pixel_read.c b/src/mesa/drivers/dri/intel/intel_pixel_read.c index 4707500180..20424e2e58 100644 --- a/src/mesa/drivers/dri/intel/intel_pixel_read.c +++ b/src/mesa/drivers/dri/intel/intel_pixel_read.c @@ -285,11 +285,11 @@ intelReadPixels(GLcontext * ctx,     intelFlush(ctx); -#ifdef I915     if (do_blit_readpixels         (ctx, x, y, width, height, format, type, pack, pixels))        return; +#ifdef I915     if (do_texture_readpixels         (ctx, x, y, width, height, format, type, pack, pixels))        return; diff --git a/src/mesa/drivers/dri/intel/intel_span.c b/src/mesa/drivers/dri/intel/intel_span.c index 2c89a66a95..d1681e9088 100644 --- a/src/mesa/drivers/dri/intel/intel_span.c +++ b/src/mesa/drivers/dri/intel/intel_span.c @@ -334,7 +334,7 @@ static uint32_t y_tile_swizzle(struct intel_renderbuffer *irb,  #include "intel_spantmp.h"  /* x8r8g8b8 color span and pixel functions */ -#define INTEL_PIXEL_FMT GL_BGRA +#define INTEL_PIXEL_FMT GL_BGR  #define INTEL_PIXEL_TYPE GL_UNSIGNED_INT_8_8_8_8_REV  #define INTEL_READ_VALUE(offset) pread_xrgb8888(irb, offset)  #define INTEL_WRITE_VALUE(offset, v) pwrite_xrgb8888(irb, offset, v) @@ -616,7 +616,7 @@ intel_set_span_functions(struct intel_context *intel,     uint32_t tiling = irb->region->tiling;     if (intel->intelScreen->kernel_exec_fencing) { -      switch (irb->texformat) { +      switch (irb->Base.Format) {        case MESA_FORMAT_RGB565:  	 intel_gttmap_InitPointers_RGB565(rb);  	 break; @@ -630,13 +630,7 @@ intel_set_span_functions(struct intel_context *intel,           intel_gttmap_InitPointers_xRGB8888(rb);  	 break;        case MESA_FORMAT_ARGB8888: -	 if (rb->_BaseFormat == GL_RGB) { -	    /* XXX remove this code someday when we enable XRGB surfaces */ -	    /* 8888 RGBx */ -	    intel_gttmap_InitPointers_xRGB8888(rb); -	 } else { -	    intel_gttmap_InitPointers_ARGB8888(rb); -	 } +	 intel_gttmap_InitPointers_ARGB8888(rb);  	 break;        case MESA_FORMAT_Z16:  	 intel_gttmap_InitDepthPointers_z16(rb); @@ -659,7 +653,7 @@ intel_set_span_functions(struct intel_context *intel,        default:  	 _mesa_problem(NULL,  		       "Unexpected MesaFormat %d in intelSetSpanFunctions", -		       irb->texformat); +		       irb->Base.Format);  	 break;        }        return; @@ -668,7 +662,7 @@ intel_set_span_functions(struct intel_context *intel,     /* If in GEM mode, we need to do the tile address swizzling ourselves,      * instead of the fence registers handling it.      */ -   switch (irb->texformat) { +   switch (irb->Base.Format) {     case MESA_FORMAT_RGB565:        switch (tiling) {        case I915_TILING_NONE: @@ -726,35 +720,18 @@ intel_set_span_functions(struct intel_context *intel,        }        break;     case MESA_FORMAT_ARGB8888: -      if (rb->_BaseFormat == GL_RGB) { -         /* XXX remove this code someday when we enable XRGB surfaces */ -	 /* 8888 RGBx */ -	 switch (tiling) { -	 case I915_TILING_NONE: -	 default: -	    intelInitPointers_xRGB8888(rb); -	    break; -	 case I915_TILING_X: -	    intel_XTile_InitPointers_xRGB8888(rb); -	    break; -	 case I915_TILING_Y: -	    intel_YTile_InitPointers_xRGB8888(rb); -	    break; -	 } -      } else { -	 /* 8888 RGBA */ -	 switch (tiling) { -	 case I915_TILING_NONE: -	 default: -	    intelInitPointers_ARGB8888(rb); -	    break; -	 case I915_TILING_X: -	    intel_XTile_InitPointers_ARGB8888(rb); -	    break; -	 case I915_TILING_Y: -	    intel_YTile_InitPointers_ARGB8888(rb); -	    break; -	 } +      /* 8888 RGBA */ +      switch (tiling) { +      case I915_TILING_NONE: +      default: +	 intelInitPointers_ARGB8888(rb); +	 break; +      case I915_TILING_X: +	 intel_XTile_InitPointers_ARGB8888(rb); +	 break; +      case I915_TILING_Y: +	 intel_YTile_InitPointers_ARGB8888(rb); +	 break;        }        break;     case MESA_FORMAT_Z16: diff --git a/src/mesa/drivers/dri/intel/intel_tex_format.c b/src/mesa/drivers/dri/intel/intel_tex_format.c index bfa3dba1f5..87efb72cc5 100644 --- a/src/mesa/drivers/dri/intel/intel_tex_format.c +++ b/src/mesa/drivers/dri/intel/intel_tex_format.c @@ -50,8 +50,7 @@ intelChooseTextureFormat(GLcontext * ctx, GLint internalFormat,        if (format == GL_RGB && type == GL_UNSIGNED_SHORT_5_6_5) {           return MESA_FORMAT_RGB565;        } -      /* XXX use MESA_FORMAT_XRGB8888 someday */ -      return do32bpt ? MESA_FORMAT_ARGB8888 : MESA_FORMAT_RGB565; +      return do32bpt ? MESA_FORMAT_XRGB8888 : MESA_FORMAT_RGB565;     case GL_RGBA8:     case GL_RGB10_A2: @@ -70,8 +69,7 @@ intelChooseTextureFormat(GLcontext * ctx, GLint internalFormat,     case GL_RGB10:     case GL_RGB12:     case GL_RGB16: -      /* XXX use MESA_FORMAT_XRGB8888 someday */ -      return MESA_FORMAT_ARGB8888; +      return MESA_FORMAT_XRGB8888;     case GL_RGB5:     case GL_RGB4: diff --git a/src/mesa/drivers/dri/r600/r700_chip.c b/src/mesa/drivers/dri/r600/r700_chip.c index d702740014..ee2a0a4c8a 100644 --- a/src/mesa/drivers/dri/r600/r700_chip.c +++ b/src/mesa/drivers/dri/r600/r700_chip.c @@ -1163,7 +1163,11 @@ static int check_blnd(GLcontext *ctx, struct radeon_state_atom *atom)  		count += 3;  	if (context->radeon.radeonScreen->chip_family > CHIP_FAMILY_R600) { -		for (ui = 0; ui < R700_MAX_RENDER_TARGETS; ui++) { +		/* targets are enabled in r700SetRenderTarget but state +		   size is calculated before that. Until MRT's are done +		   hardcode target0 as enabled. */ +		count += 3; +		for (ui = 1; ui < R700_MAX_RENDER_TARGETS; ui++) {                          if (r700->render_target[ui].enabled)  				count += 3;  		} diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c index 03fc57e665..5c20ce017f 100644 --- a/src/mesa/main/context.c +++ b/src/mesa/main/context.c @@ -564,10 +564,6 @@ _mesa_init_constants(GLcontext *ctx)     /* GL_ARB_draw_buffers */     ctx->Const.MaxDrawBuffers = MAX_DRAW_BUFFERS; -   /* GL_OES_read_format */ -   ctx->Const.ColorReadFormat = GL_RGBA; -   ctx->Const.ColorReadType = GL_UNSIGNED_BYTE; -  #if FEATURE_EXT_framebuffer_object     ctx->Const.MaxColorAttachments = MAX_COLOR_ATTACHMENTS;     ctx->Const.MaxRenderbufferSize = MAX_WIDTH; diff --git a/src/mesa/main/fog.c b/src/mesa/main/fog.c index 4323d3db82..269ff3f8b9 100644 --- a/src/mesa/main/fog.c +++ b/src/mesa/main/fog.c @@ -34,15 +34,20 @@  void GLAPIENTRY  _mesa_Fogf(GLenum pname, GLfloat param)  { -   _mesa_Fogfv(pname, ¶m); +   GLfloat fparam[4]; +   fparam[0] = param; +   fparam[1] = fparam[2] = fparam[3] = 0.0F; +   _mesa_Fogfv(pname, fparam);  }  void GLAPIENTRY  _mesa_Fogi(GLenum pname, GLint param )  { -   GLfloat fparam = (GLfloat) param; -   _mesa_Fogfv(pname, &fparam); +   GLfloat fparam[4]; +   fparam[0] = (GLfloat) param; +   fparam[1] = fparam[2] = fparam[3] = 0.0F; +   _mesa_Fogfv(pname, fparam);  } diff --git a/src/mesa/main/framebuffer.c b/src/mesa/main/framebuffer.c index 154dedacd5..d958dbf7d4 100644 --- a/src/mesa/main/framebuffer.c +++ b/src/mesa/main/framebuffer.c @@ -969,3 +969,29 @@ _mesa_dest_buffer_exists(GLcontext *ctx, GLenum format)     /* OK */     return GL_TRUE;  } + +GLenum +_mesa_get_color_read_format(GLcontext *ctx) +{ +   switch (ctx->ReadBuffer->_ColorReadBuffer->Format) { +   case MESA_FORMAT_ARGB8888: +      return GL_BGRA; +   case MESA_FORMAT_RGB565: +      return GL_BGR; +   default: +      return GL_RGBA; +   } +} + +GLenum +_mesa_get_color_read_type(GLcontext *ctx) +{ +   switch (ctx->ReadBuffer->_ColorReadBuffer->Format) { +   case MESA_FORMAT_ARGB8888: +      return GL_UNSIGNED_BYTE; +   case MESA_FORMAT_RGB565: +      return GL_UNSIGNED_SHORT_5_6_5_REV; +   default: +      return GL_UNSIGNED_BYTE; +   } +} diff --git a/src/mesa/main/framebuffer.h b/src/mesa/main/framebuffer.h index 45a4703ba9..ef21dd98e8 100644 --- a/src/mesa/main/framebuffer.h +++ b/src/mesa/main/framebuffer.h @@ -81,5 +81,10 @@ _mesa_source_buffer_exists(GLcontext *ctx, GLenum format);  extern GLboolean  _mesa_dest_buffer_exists(GLcontext *ctx, GLenum format); +extern GLenum +_mesa_get_color_read_type(GLcontext *ctx); + +extern GLenum +_mesa_get_color_read_format(GLcontext *ctx);  #endif /* FRAMEBUFFER_H */ diff --git a/src/mesa/main/get.c b/src/mesa/main/get.c index e8932f83b6..3d32649bad 100644 --- a/src/mesa/main/get.c +++ b/src/mesa/main/get.c @@ -13,6 +13,7 @@  #include "mtypes.h"  #include "state.h"  #include "texcompress.h" +#include "framebuffer.h"  #define FLOAT_TO_BOOLEAN(X)   ( (X) ? GL_TRUE : GL_FALSE ) @@ -1767,11 +1768,11 @@ _mesa_GetBooleanv( GLenum pname, GLboolean *params )           break;        case GL_IMPLEMENTATION_COLOR_READ_TYPE_OES:           CHECK_EXT1(OES_read_format, "GetBooleanv"); -         params[0] = INT_TO_BOOLEAN(ctx->Const.ColorReadType); +         params[0] = INT_TO_BOOLEAN(_mesa_get_color_read_type(ctx));           break;        case GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES:           CHECK_EXT1(OES_read_format, "GetBooleanv"); -         params[0] = INT_TO_BOOLEAN(ctx->Const.ColorReadFormat); +         params[0] = INT_TO_BOOLEAN(_mesa_get_color_read_format(ctx));           break;        case GL_NUM_FRAGMENT_REGISTERS_ATI:           CHECK_EXT1(ATI_fragment_shader, "GetBooleanv"); @@ -3602,11 +3603,11 @@ _mesa_GetFloatv( GLenum pname, GLfloat *params )           break;        case GL_IMPLEMENTATION_COLOR_READ_TYPE_OES:           CHECK_EXT1(OES_read_format, "GetFloatv"); -         params[0] = (GLfloat)(ctx->Const.ColorReadType); +         params[0] = (GLfloat)(_mesa_get_color_read_type(ctx));           break;        case GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES:           CHECK_EXT1(OES_read_format, "GetFloatv"); -         params[0] = (GLfloat)(ctx->Const.ColorReadFormat); +         params[0] = (GLfloat)(_mesa_get_color_read_format(ctx));           break;        case GL_NUM_FRAGMENT_REGISTERS_ATI:           CHECK_EXT1(ATI_fragment_shader, "GetFloatv"); @@ -5437,11 +5438,11 @@ _mesa_GetIntegerv( GLenum pname, GLint *params )           break;        case GL_IMPLEMENTATION_COLOR_READ_TYPE_OES:           CHECK_EXT1(OES_read_format, "GetIntegerv"); -         params[0] = ctx->Const.ColorReadType; +         params[0] = _mesa_get_color_read_type(ctx);           break;        case GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES:           CHECK_EXT1(OES_read_format, "GetIntegerv"); -         params[0] = ctx->Const.ColorReadFormat; +         params[0] = _mesa_get_color_read_format(ctx);           break;        case GL_NUM_FRAGMENT_REGISTERS_ATI:           CHECK_EXT1(ATI_fragment_shader, "GetIntegerv"); @@ -7273,11 +7274,11 @@ _mesa_GetInteger64v( GLenum pname, GLint64 *params )           break;        case GL_IMPLEMENTATION_COLOR_READ_TYPE_OES:           CHECK_EXT1(OES_read_format, "GetInteger64v"); -         params[0] = (GLint64)(ctx->Const.ColorReadType); +         params[0] = (GLint64)(_mesa_get_color_read_type(ctx));           break;        case GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES:           CHECK_EXT1(OES_read_format, "GetInteger64v"); -         params[0] = (GLint64)(ctx->Const.ColorReadFormat); +         params[0] = (GLint64)(_mesa_get_color_read_format(ctx));           break;        case GL_NUM_FRAGMENT_REGISTERS_ATI:           CHECK_EXT1(ATI_fragment_shader, "GetInteger64v"); diff --git a/src/mesa/main/get_gen.py b/src/mesa/main/get_gen.py index a29962d334..01170a42a7 100644 --- a/src/mesa/main/get_gen.py +++ b/src/mesa/main/get_gen.py @@ -942,9 +942,9 @@ StateVars = [  	# GL_OES_read_format  	( "GL_IMPLEMENTATION_COLOR_READ_TYPE_OES", GLint, -	  ["ctx->Const.ColorReadType"], "", ["OES_read_format"] ), +	  ["_mesa_get_color_read_type(ctx)"], "", ["OES_read_format"] ),  	( "GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES", GLint, -	  ["ctx->Const.ColorReadFormat"], "", ["OES_read_format"] ), +	  ["_mesa_get_color_read_format(ctx)"], "", ["OES_read_format"] ),  	# GL_ATI_fragment_shader  	( "GL_NUM_FRAGMENT_REGISTERS_ATI", GLint, ["6"], "", ["ATI_fragment_shader"] ), @@ -1159,6 +1159,7 @@ def EmitHeader():  #include "mtypes.h"  #include "state.h"  #include "texcompress.h" +#include "framebuffer.h"  #define FLOAT_TO_BOOLEAN(X)   ( (X) ? GL_TRUE : GL_FALSE ) diff --git a/src/mesa/main/light.c b/src/mesa/main/light.c index 1c8a081e9a..654faa5c77 100644 --- a/src/mesa/main/light.c +++ b/src/mesa/main/light.c @@ -206,7 +206,10 @@ _mesa_light(GLcontext *ctx, GLuint lnum, GLenum pname, const GLfloat *params)  void GLAPIENTRY  _mesa_Lightf( GLenum light, GLenum pname, GLfloat param )  { -   _mesa_Lightfv( light, pname, ¶m ); +   GLfloat fparam[4]; +   fparam[0] = param; +   fparam[1] = fparam[2] = fparam[3] = 0.0F; +   _mesa_Lightfv( light, pname, fparam );  } @@ -285,7 +288,10 @@ _mesa_Lightfv( GLenum light, GLenum pname, const GLfloat *params )  void GLAPIENTRY  _mesa_Lighti( GLenum light, GLenum pname, GLint param )  { -   _mesa_Lightiv( light, pname, ¶m ); +   GLint iparam[4]; +   iparam[0] = param; +   iparam[1] = iparam[2] = iparam[3] = 0; +   _mesa_Lightiv( light, pname, iparam );  } @@ -537,14 +543,20 @@ _mesa_LightModeliv( GLenum pname, const GLint *params )  void GLAPIENTRY  _mesa_LightModeli( GLenum pname, GLint param )  { -   _mesa_LightModeliv( pname, ¶m ); +   GLint iparam[4]; +   iparam[0] = param; +   iparam[1] = iparam[2] = iparam[3] = 0; +   _mesa_LightModeliv( pname, iparam );  }  void GLAPIENTRY  _mesa_LightModelf( GLenum pname, GLfloat param )  { -   _mesa_LightModelfv( pname, ¶m ); +   GLfloat fparam[4]; +   fparam[0] = param; +   fparam[1] = fparam[2] = fparam[3] = 0.0F; +   _mesa_LightModelfv( pname, fparam );  } diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 5f01244827..b52c84b491 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -2356,9 +2356,6 @@ struct gl_constants     GLuint MaxDrawBuffers;    /**< GL_ARB_draw_buffers */ -   GLenum ColorReadFormat;   /**< GL_OES_read_format */ -   GLenum ColorReadType;     /**< GL_OES_read_format */ -     GLuint MaxColorAttachments;   /**< GL_EXT_framebuffer_object */     GLuint MaxRenderbufferSize;   /**< GL_EXT_framebuffer_object */     GLuint MaxSamples;            /**< GL_ARB_framebuffer_object */ diff --git a/src/mesa/main/points.c b/src/mesa/main/points.c index b330544890..dcaeccd90d 100644 --- a/src/mesa/main/points.c +++ b/src/mesa/main/points.c @@ -69,8 +69,10 @@ _mesa_PointSize( GLfloat size )  void GLAPIENTRY  _mesa_PointParameteri( GLenum pname, GLint param )  { -   const GLfloat value = (GLfloat) param; -   _mesa_PointParameterfv(pname, &value); +   GLfloat p[3]; +   p[0] = (GLfloat) param; +   p[1] = p[2] = 0.0F; +   _mesa_PointParameterfv(pname, p);  } @@ -90,7 +92,10 @@ _mesa_PointParameteriv( GLenum pname, const GLint *params )  void GLAPIENTRY  _mesa_PointParameterf( GLenum pname, GLfloat param)  { -   _mesa_PointParameterfv(pname, ¶m); +   GLfloat p[3]; +   p[0] = param; +   p[1] = p[2] = 0.0F; +   _mesa_PointParameterfv(pname, p);  } diff --git a/src/mesa/main/texgen.c b/src/mesa/main/texgen.c index 5abb1ff0ab..be4e03bc56 100644 --- a/src/mesa/main/texgen.c +++ b/src/mesa/main/texgen.c @@ -186,8 +186,10 @@ _mesa_TexGeniv(GLenum coord, GLenum pname, const GLint *params )  static void GLAPIENTRY  _mesa_TexGend(GLenum coord, GLenum pname, GLdouble param )  { -   GLfloat p = (GLfloat) param; -   _mesa_TexGenfv( coord, pname, &p ); +   GLfloat p[4]; +   p[0] = (GLfloat) param; +   p[1] = p[2] = p[3] = 0.0F; +   _mesa_TexGenfv( coord, pname, p );  } diff --git a/src/mesa/main/texobj.c b/src/mesa/main/texobj.c index 7e8a2489ac..09fe7b85ba 100644 --- a/src/mesa/main/texobj.c +++ b/src/mesa/main/texobj.c @@ -415,7 +415,7 @@ _mesa_test_texobj_completeness( const GLcontext *ctx,     /* Detect cases where the application set the base level to an invalid      * value.      */ -   if ((baseLevel < 0) || (baseLevel > MAX_TEXTURE_LEVELS)) { +   if ((baseLevel < 0) || (baseLevel >= MAX_TEXTURE_LEVELS)) {        char s[100];        _mesa_sprintf(s, "base level = %d is invalid", baseLevel);        incomplete(t, s); diff --git a/src/mesa/main/texparam.c b/src/mesa/main/texparam.c index 310d594cd5..db4c7a5eda 100644 --- a/src/mesa/main/texparam.c +++ b/src/mesa/main/texparam.c @@ -595,8 +595,10 @@ _mesa_TexParameterfv(GLenum target, GLenum pname, const GLfloat *params)     case GL_DEPTH_TEXTURE_MODE_ARB:        {           /* convert float param to int */ -         GLint p = (GLint) params[0]; -         need_update = set_tex_parameteri(ctx, texObj, pname, &p); +         GLint p[4]; +         p[0] = (GLint) params[0]; +         p[1] = p[2] = p[3] = 0; +         need_update = set_tex_parameteri(ctx, texObj, pname, p);        }        break; @@ -645,14 +647,21 @@ _mesa_TexParameteri(GLenum target, GLenum pname, GLint param)     case GL_TEXTURE_LOD_BIAS:     case GL_TEXTURE_COMPARE_FAIL_VALUE_ARB:        { -         GLfloat fparam = (GLfloat) param; +         GLfloat fparam[4]; +         fparam[0] = (GLfloat) param; +         fparam[1] = fparam[2] = fparam[3] = 0.0F;           /* convert int param to float */ -         need_update = set_tex_parameterf(ctx, texObj, pname, &fparam); +         need_update = set_tex_parameterf(ctx, texObj, pname, fparam);        }        break;     default:        /* this will generate an error if pname is illegal */ -      need_update = set_tex_parameteri(ctx, texObj, pname, ¶m); +      { +         GLint iparam[4]; +         iparam[0] = param; +         iparam[1] = iparam[2] = iparam[3] = 0; +         need_update = set_tex_parameteri(ctx, texObj, pname, iparam); +      }     }     if (ctx->Driver.TexParameter && need_update) { @@ -694,8 +703,10 @@ _mesa_TexParameteriv(GLenum target, GLenum pname, const GLint *params)     case GL_TEXTURE_COMPARE_FAIL_VALUE_ARB:        {           /* convert int param to float */ -         GLfloat fparam = (GLfloat) params[0]; -         need_update = set_tex_parameterf(ctx, texObj, pname, &fparam); +         GLfloat fparams[4]; +         fparams[0] = (GLfloat) params[0]; +         fparams[1] = fparams[2] = fparams[3] = 0.0F; +         need_update = set_tex_parameterf(ctx, texObj, pname, fparams);        }        break;     default: diff --git a/src/mesa/shader/nvfragparse.c b/src/mesa/shader/nvfragparse.c index 0fd55524ab..b739a6aa07 100644 --- a/src/mesa/shader/nvfragparse.c +++ b/src/mesa/shader/nvfragparse.c @@ -217,6 +217,12 @@ MatchInstruction(const GLubyte *token)     const struct instruction_pattern *inst;     struct instruction_pattern result; +   result.name = NULL; +   result.opcode = MAX_OPCODE; /* i.e. invalid instruction */ +   result.inputs = 0; +   result.outputs = 0; +   result.suffixes = 0; +     for (inst = Instructions; inst->name; inst++) {        if (_mesa_strncmp((const char *) token, inst->name, 3) == 0) {           /* matched! */ @@ -247,7 +253,7 @@ MatchInstruction(const GLubyte *token)           return result;        }     } -   result.opcode = MAX_OPCODE; /* i.e. invalid instruction */ +     return result;  } diff --git a/src/mesa/shader/prog_parameter.c b/src/mesa/shader/prog_parameter.c index 2f029b02e5..f22492e029 100644 --- a/src/mesa/shader/prog_parameter.c +++ b/src/mesa/shader/prog_parameter.c @@ -500,7 +500,7 @@ GLfloat *  _mesa_lookup_parameter_value(const struct gl_program_parameter_list *paramList,                               GLsizei nameLen, const char *name)  { -   GLuint i = _mesa_lookup_parameter_index(paramList, nameLen, name); +   GLint i = _mesa_lookup_parameter_index(paramList, nameLen, name);     if (i < 0)        return NULL;     else diff --git a/src/mesa/shader/program.c b/src/mesa/shader/program.c index 532adf4d36..6b8d94e661 100644 --- a/src/mesa/shader/program.c +++ b/src/mesa/shader/program.c @@ -806,9 +806,17 @@ _mesa_find_free_register(const struct gl_program *prog, GLuint regFile)        const struct prog_instruction *inst = prog->Instructions + i;        const GLuint n = _mesa_num_inst_src_regs(inst->Opcode); -      for (k = 0; k < n; k++) { -         if (inst->SrcReg[k].File == regFile) { -            used[inst->SrcReg[k].Index] = GL_TRUE; +      /* check dst reg first */ +      if (inst->DstReg.File == regFile) { +         used[inst->DstReg.Index] = GL_TRUE; +      } +      else { +         /* check src regs otherwise */ +         for (k = 0; k < n; k++) { +            if (inst->SrcReg[k].File == regFile) { +               used[inst->SrcReg[k].Index] = GL_TRUE; +               break; +            }           }        }     } diff --git a/src/mesa/shader/programopt.c b/src/mesa/shader/programopt.c index a0daac1b80..9514545709 100644 --- a/src/mesa/shader/programopt.c +++ b/src/mesa/shader/programopt.c @@ -528,15 +528,11 @@ _mesa_remove_output_reads(struct gl_program *prog, gl_register_file type)     /* look for instructions which write to the varying vars identified above */     for (i = 0; i < prog->NumInstructions; i++) {        struct prog_instruction *inst = prog->Instructions + i; -      const GLuint numSrc = _mesa_num_inst_src_regs(inst->Opcode); -      GLuint j; -      for (j = 0; j < numSrc; j++) { -         if (inst->DstReg.File == type && -             outputMap[inst->DstReg.Index] >= 0) { -            /* change inst to write to the temp reg, instead of the varying */ -            inst->DstReg.File = PROGRAM_TEMPORARY; -            inst->DstReg.Index = outputMap[inst->DstReg.Index]; -         } +      if (inst->DstReg.File == type && +          outputMap[inst->DstReg.Index] >= 0) { +         /* change inst to write to the temp reg, instead of the varying */ +         inst->DstReg.File = PROGRAM_TEMPORARY; +         inst->DstReg.Index = outputMap[inst->DstReg.Index];        }     } diff --git a/src/mesa/shader/slang/slang_compile_operation.h b/src/mesa/shader/slang/slang_compile_operation.h index 58f1edeed8..1f15c19896 100644 --- a/src/mesa/shader/slang/slang_compile_operation.h +++ b/src/mesa/shader/slang/slang_compile_operation.h @@ -127,7 +127,6 @@ typedef struct slang_operation_      * indicate such.  num_children indicates number of elements.      */     GLboolean array_constructor; -   double x;  } slang_operation; diff --git a/src/mesa/shader/slang/slang_simplify.c b/src/mesa/shader/slang/slang_simplify.c index b8a21f642c..13b9ca3c87 100644 --- a/src/mesa/shader/slang/slang_simplify.c +++ b/src/mesa/shader/slang/slang_simplify.c @@ -84,10 +84,11 @@ _slang_lookup_constant(const char *name)     for (i = 0; info[i].Name; i++) {        if (strcmp(info[i].Name, name) == 0) {           /* found */ -         GLint value = -1; -         _mesa_GetIntegerv(info[i].Token, &value); -         ASSERT(value >= 0);  /* sanity check that glGetFloatv worked */ -         return value; +         GLint values[16]; +         values[0] = -1; +         _mesa_GetIntegerv(info[i].Token, values); +         ASSERT(values[0] >= 0);  /* sanity check that glGetFloatv worked */ +         return values[0];        }     }     return -1; diff --git a/src/mesa/sources.mak b/src/mesa/sources.mak index 615a5588ea..a0d7dbbace 100644 --- a/src/mesa/sources.mak +++ b/src/mesa/sources.mak @@ -191,7 +191,6 @@ STATETRACKER_SOURCES = \  	state_tracker/st_cb_bufferobjects.c \  	state_tracker/st_cb_clear.c \  	state_tracker/st_cb_flush.c \ -	state_tracker/st_cb_get.c \  	state_tracker/st_cb_drawpixels.c \  	state_tracker/st_cb_fbo.c \  	state_tracker/st_cb_feedback.c \ diff --git a/src/mesa/sparc/xform.S b/src/mesa/sparc/xform.S index f2b9674bf2..2a7cce41e5 100644 --- a/src/mesa/sparc/xform.S +++ b/src/mesa/sparc/xform.S @@ -17,7 +17,7 @@  #include "sparc_matrix.h" -#if defined(SVR4) || defined(__SVR4) || defined(__svr4__) +#if defined(SVR4) || defined(__SVR4) || defined(__svr4__) || defined(__arch64__)  	/* Solaris requires this for 64-bit. */          .register %g2, #scratch          .register %g3, #scratch diff --git a/src/mesa/state_tracker/st_cb_get.c b/src/mesa/state_tracker/st_cb_get.c deleted file mode 100644 index e7d7f03bc9..0000000000 --- a/src/mesa/state_tracker/st_cb_get.c +++ /dev/null @@ -1,97 +0,0 @@ -/************************************************************************** - *  - * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas. - * All Rights Reserved. - *  - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sub license, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - *  - * The above copyright notice and this permission notice (including the - * next paragraph) shall be included in all copies or substantial portions - * of the Software. - *  - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. - * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR - * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - *  - **************************************************************************/ - - -/** - * glGet functions - * - * \author Brian Paul - */ - -#include "main/imports.h" -#include "main/context.h" - -#include "pipe/p_defines.h" - -#include "st_cb_fbo.h" -#include "st_cb_get.h" - - - -/** - * Examine the current color read buffer format to determine - * which GL pixel format/type combo is the best match. - */ -static void -get_preferred_read_format_type(GLcontext *ctx, GLint *format, GLint *type) -{ -   struct gl_framebuffer *fb = ctx->ReadBuffer; -   struct st_renderbuffer *strb = st_renderbuffer(fb->_ColorReadBuffer); - -   /* defaults */ -   *format = ctx->Const.ColorReadFormat; -   *type = ctx->Const.ColorReadType; - -   if (strb) { -      /* XXX could add more cases here... */ -      if (strb->format == PIPE_FORMAT_A8R8G8B8_UNORM) { -         *format = GL_BGRA; -         if (_mesa_little_endian()) -            *type = GL_UNSIGNED_INT_8_8_8_8_REV; -         else -            *type = GL_UNSIGNED_INT_8_8_8_8; -      } -   } -} - - -/** - * We only intercept the OES preferred ReadPixels format/type. - * Everything else goes to the default _mesa_GetIntegerv. - */ -static GLboolean  -st_GetIntegerv(GLcontext *ctx, GLenum pname, GLint *params) -{ -   GLint dummy; - -   switch (pname) { -   case GL_IMPLEMENTATION_COLOR_READ_TYPE_OES: -      get_preferred_read_format_type(ctx, &dummy, params); -      return GL_TRUE; -   case GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES: -      get_preferred_read_format_type(ctx, params, &dummy); -      return GL_TRUE; -   default: -      return GL_FALSE; -   } -} - - -void st_init_get_functions(struct dd_function_table *functions) -{ -   functions->GetIntegerv = st_GetIntegerv; -} diff --git a/src/mesa/state_tracker/st_cb_get.h b/src/mesa/state_tracker/st_cb_get.h deleted file mode 100644 index 8e9f3e9306..0000000000 --- a/src/mesa/state_tracker/st_cb_get.h +++ /dev/null @@ -1,37 +0,0 @@ -/************************************************************************** - *  - * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas. - * All Rights Reserved. - *  - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sub license, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - *  - * The above copyright notice and this permission notice (including the - * next paragraph) shall be included in all copies or substantial portions - * of the Software. - *  - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. - * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR - * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - *  - **************************************************************************/ - - -#ifndef ST_CB_GET_H -#define ST_CB_GET_H - - -extern void -st_init_get_functions(struct dd_function_table *functions); - - -#endif diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c index f0eddafd33..d18a25ab51 100644 --- a/src/mesa/state_tracker/st_context.c +++ b/src/mesa/state_tracker/st_context.c @@ -51,7 +51,6 @@  #include "st_cb_drawtex.h"  #endif  #include "st_cb_fbo.h" -#include "st_cb_get.h"  #if FEATURE_feedback  #include "st_cb_feedback.h"  #endif @@ -331,7 +330,6 @@ void st_init_driver_functions(struct dd_function_table *functions)     st_init_rasterpos_functions(functions);  #endif     st_init_fbo_functions(functions); -   st_init_get_functions(functions);  #if FEATURE_feedback     st_init_feedback_functions(functions);  #endif diff --git a/src/mesa/vbo/vbo_exec_eval.c b/src/mesa/vbo/vbo_exec_eval.c index 0c691b3a5c..a7846213d0 100644 --- a/src/mesa/vbo/vbo_exec_eval.c +++ b/src/mesa/vbo/vbo_exec_eval.c @@ -35,17 +35,20 @@  static void clear_active_eval1( struct vbo_exec_context *exec, GLuint attr )   { +   assert(attr < Elements(exec->eval.map1));     exec->eval.map1[attr].map = NULL;  }  static void clear_active_eval2( struct vbo_exec_context *exec, GLuint attr )   { +   assert(attr < Elements(exec->eval.map2));     exec->eval.map2[attr].map = NULL;  }  static void set_active_eval1( struct vbo_exec_context *exec, GLuint attr, GLuint dim,   			      struct gl_1d_map *map )  { +   assert(attr < Elements(exec->eval.map1));     if (!exec->eval.map1[attr].map) {        exec->eval.map1[attr].map = map;        exec->eval.map1[attr].sz = dim; @@ -55,6 +58,7 @@ static void set_active_eval1( struct vbo_exec_context *exec, GLuint attr, GLuint  static void set_active_eval2( struct vbo_exec_context *exec, GLuint attr, GLuint dim,   			      struct gl_2d_map *map )  { +   assert(attr < Elements(exec->eval.map2));     if (!exec->eval.map2[attr].map) {        exec->eval.map2[attr].map = map;        exec->eval.map2[attr].sz = dim; @@ -73,18 +77,6 @@ void vbo_exec_eval_update( struct vbo_exec_context *exec )        clear_active_eval2( exec, attr );     } -   /* _NEW_PROGRAM */ -   if (ctx->VertexProgram._Enabled) { -      for (attr = 0; attr < VBO_ATTRIB_FIRST_MATERIAL; attr++) { -	 /* _NEW_EVAL */ -	 if (ctx->Eval.Map1Attrib[attr])  -	    set_active_eval1( exec, attr, 4, &ctx->EvalMap.Map1Attrib[attr] ); - -	 if (ctx->Eval.Map2Attrib[attr])  -	    set_active_eval2( exec, attr, 4, &ctx->EvalMap.Map2Attrib[attr] ); -      } -   } -     if (ctx->Eval.Map1Color4)         set_active_eval1( exec, VBO_ATTRIB_COLOR0, 4, &ctx->EvalMap.Map1Color4 ); @@ -125,6 +117,23 @@ void vbo_exec_eval_update( struct vbo_exec_context *exec )     else if (ctx->Eval.Map2Vertex3)         set_active_eval2( exec, VBO_ATTRIB_POS, 3, &ctx->EvalMap.Map2Vertex3 ); +   /* _NEW_PROGRAM */ +   if (ctx->VertexProgram._Enabled) { +      /* These are the 16 evaluators which GL_NV_vertex_program defines. +       * They alias and override the conventional vertex attributs. +       */ +      for (attr = 0; attr < 16; attr++) { +         /* _NEW_EVAL */ +         assert(attr < Elements(ctx->Eval.Map1Attrib)); +         if (ctx->Eval.Map1Attrib[attr])  +            set_active_eval1( exec, attr, 4, &ctx->EvalMap.Map1Attrib[attr] ); + +         assert(attr < Elements(ctx->Eval.Map2Attrib)); +         if (ctx->Eval.Map2Attrib[attr])  +            set_active_eval2( exec, attr, 4, &ctx->EvalMap.Map2Attrib[attr] ); +      } +   } +     exec->eval.recalculate_maps = 0;  } | 
