diff options
Diffstat (limited to 'src/mesa/drivers')
68 files changed, 2144 insertions, 911 deletions
diff --git a/src/mesa/drivers/common/driverfuncs.c b/src/mesa/drivers/common/driverfuncs.c index a9f3c8e727..f09106b77c 100644 --- a/src/mesa/drivers/common/driverfuncs.c +++ b/src/mesa/drivers/common/driverfuncs.c @@ -56,6 +56,7 @@  #include "swrast/swrast.h"  #include "driverfuncs.h" +#include "meta.h" @@ -100,11 +101,11 @@ _mesa_init_driver_functions(struct dd_function_table *driver)     driver->TexSubImage2D = _mesa_store_texsubimage2d;     driver->TexSubImage3D = _mesa_store_texsubimage3d;     driver->GetTexImage = _mesa_get_teximage; -   driver->CopyTexImage1D = _swrast_copy_teximage1d; -   driver->CopyTexImage2D = _swrast_copy_teximage2d; -   driver->CopyTexSubImage1D = _swrast_copy_texsubimage1d; -   driver->CopyTexSubImage2D = _swrast_copy_texsubimage2d; -   driver->CopyTexSubImage3D = _swrast_copy_texsubimage3d; +   driver->CopyTexImage1D = _mesa_meta_CopyTexImage1D; +   driver->CopyTexImage2D = _mesa_meta_CopyTexImage2D; +   driver->CopyTexSubImage1D = _mesa_meta_CopyTexSubImage1D; +   driver->CopyTexSubImage2D = _mesa_meta_CopyTexSubImage2D; +   driver->CopyTexSubImage3D = _mesa_meta_CopyTexSubImage3D;     driver->GenerateMipmap = _mesa_generate_mipmap;     driver->TestProxyTexImage = _mesa_test_proxy_teximage;     driver->CompressedTexImage1D = _mesa_store_compressed_teximage1d; @@ -129,10 +130,10 @@ _mesa_init_driver_functions(struct dd_function_table *driver)     driver->UpdateTexturePalette = NULL;     /* imaging */ -   driver->CopyColorTable = _swrast_CopyColorTable; -   driver->CopyColorSubTable = _swrast_CopyColorSubTable; -   driver->CopyConvolutionFilter1D = _swrast_CopyConvolutionFilter1D; -   driver->CopyConvolutionFilter2D = _swrast_CopyConvolutionFilter2D; +   driver->CopyColorTable = _mesa_meta_CopyColorTable; +   driver->CopyColorSubTable = _mesa_meta_CopyColorSubTable; +   driver->CopyConvolutionFilter1D = _mesa_meta_CopyConvolutionFilter1D; +   driver->CopyConvolutionFilter2D = _mesa_meta_CopyConvolutionFilter2D;     /* Vertex/fragment programs */     driver->BindProgram = NULL; diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c index ddd476eba1..532b2c9263 100644 --- a/src/mesa/drivers/common/meta.c +++ b/src/mesa/drivers/common/meta.c @@ -37,15 +37,21 @@  #include "main/arrayobj.h"  #include "main/blend.h"  #include "main/bufferobj.h" +#include "main/buffers.h" +#include "main/colortab.h" +#include "main/convolve.h"  #include "main/depth.h"  #include "main/enable.h" +#include "main/fbobject.h"  #include "main/image.h"  #include "main/macros.h"  #include "main/matrix.h" +#include "main/mipmap.h"  #include "main/polygon.h"  #include "main/readpix.h"  #include "main/scissor.h"  #include "main/shaders.h" +#include "main/state.h"  #include "main/stencil.h"  #include "main/texobj.h"  #include "main/texenv.h" @@ -60,6 +66,33 @@  #include "drivers/common/meta.h" +/** Return offset in bytes of the field within a vertex struct */ +#define OFFSET(FIELD) ((void *) offsetof(struct vertex, FIELD)) + + +/** + * 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... @@ -87,6 +120,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; @@ -138,6 +182,24 @@ struct save_state  /** + * Temporary texture used for glBlitFramebuffer, glDrawPixels, etc. + * This is currently shared by all the meta ops.  But we could create a + * separate one for each of glDrawPixel, glBlitFramebuffer, glCopyPixels, etc. + */ +struct temp_texture +{ +   GLuint TexObj; +   GLenum Target;         /**< GL_TEXTURE_2D or GL_TEXTURE_RECTANGLE */ +   GLsizei MinSize;       /**< Min texture size to allocate */ +   GLsizei MaxSize;       /**< Max possible texture size */ +   GLboolean NPOT;        /**< Non-power of two size OK? */ +   GLsizei Width, Height; /**< Current texture size */ +   GLenum IntFormat; +   GLfloat Sright, Ttop;  /**< right, top texcoords */ +}; + + +/**   * State for glBlitFramebufer()   */  struct blit_state @@ -182,19 +244,24 @@ struct drawpix_state  /** - * Temporary texture used for glBlitFramebuffer, glDrawPixels, etc. - * This is currently shared by all the meta ops.  But we could create a - * separate one for each of glDrawPixel, glBlitFramebuffer, glCopyPixels, etc. + * State for glBitmap()   */ -struct temp_texture +struct bitmap_state  { -   GLuint TexObj; -   GLenum Target;         /**< GL_TEXTURE_2D or GL_TEXTURE_RECTANGLE */ -   GLsizei MaxSize;       /**< Max possible texture size */ -   GLboolean NPOT;        /**< Non-power of two size OK? */ -   GLsizei Width, Height; /**< Current texture size */ -   GLenum IntFormat; -   GLfloat Sright, Ttop;  /**< right, top texcoords */ +   GLuint ArrayObj; +   GLuint VBO; +   struct temp_texture Tex;  /**< separate texture from other meta ops */ +}; + + +/** + * State for _mesa_meta_generate_mipmap() + */ +struct gen_mipmap_state +{ +   GLuint ArrayObj; +   GLuint VBO; +   GLuint FBO;  }; @@ -207,15 +274,12 @@ struct gl_meta_state     struct temp_texture TempTex; -   struct blit_state Blit;    /**< For _mesa_meta_blit_framebuffer() */ -   struct clear_state Clear;  /**< For _mesa_meta_clear() */ -   struct copypix_state CopyPix;  /**< For _mesa_meta_copy_pixels() */ -   struct drawpix_state DrawPix;  /**< For _mesa_meta_draw_pixels() */ - -   /* other possible meta-ops: -    * glBitmap() -    * glGenerateMipmap() -    */ +   struct blit_state Blit;    /**< For _mesa_meta_BlitFramebuffer() */ +   struct clear_state Clear;  /**< For _mesa_meta_Clear() */ +   struct copypix_state CopyPix;  /**< For _mesa_meta_CopyPixels() */ +   struct drawpix_state DrawPix;  /**< For _mesa_meta_DrawPixels() */ +   struct bitmap_state Bitmap;    /**< For _mesa_meta_Bitmap() */ +   struct gen_mipmap_state Mipmap;    /**< For _mesa_meta_GenerateMipmap() */  }; @@ -246,6 +310,7 @@ _mesa_meta_free(GLcontext *ctx)         * still get freed by _mesa_free_context_data().         */ +      /* the temporary texture */        _mesa_DeleteTextures(1, &meta->TempTex.TexObj);        /* glBlitFramebuffer */ @@ -266,6 +331,11 @@ _mesa_meta_free(GLcontext *ctx)        _mesa_DeleteVertexArraysAPPLE(1, &meta->DrawPix.ArrayObj);        _mesa_DeletePrograms(1, &meta->DrawPix.DepthFP);        _mesa_DeletePrograms(1, &meta->DrawPix.StencilFP); + +      /* glBitmap */ +      _mesa_DeleteBuffersARB(1, & meta->Bitmap.VBO); +      _mesa_DeleteVertexArraysAPPLE(1, &meta->Bitmap.ArrayObj); +      _mesa_DeleteTextures(1, &meta->Bitmap.Tex.TexObj);     }     _mesa_free(ctx->Meta); @@ -290,16 +360,16 @@ _mesa_meta_begin(GLcontext *ctx, GLbitfield state)     if (state & META_ALPHA_TEST) {        save->AlphaEnabled = ctx->Color.AlphaEnabled;        if (ctx->Color.AlphaEnabled) -         _mesa_Disable(GL_ALPHA_TEST); +         _mesa_set_enable(ctx, GL_ALPHA_TEST, GL_FALSE);     }     if (state & META_BLEND) {        save->BlendEnabled = ctx->Color.BlendEnabled;        if (ctx->Color.BlendEnabled) -         _mesa_Disable(GL_BLEND); +         _mesa_set_enable(ctx, GL_BLEND, GL_FALSE);        save->ColorLogicOpEnabled = ctx->Color.ColorLogicOpEnabled;        if (ctx->Color.ColorLogicOpEnabled) -         _mesa_Disable(GL_COLOR_LOGIC_OP); +         _mesa_set_enable(ctx, GL_COLOR_LOGIC_OP, GL_FALSE);     }     if (state & META_COLOR_MASK) { @@ -314,7 +384,7 @@ _mesa_meta_begin(GLcontext *ctx, GLbitfield state)     if (state & META_DEPTH_TEST) {        save->Depth = ctx->Depth; /* struct copy */        if (ctx->Depth.Test) -         _mesa_Disable(GL_DEPTH_TEST); +         _mesa_set_enable(ctx, GL_DEPTH_TEST, GL_FALSE);     }     if (state & META_FOG) { @@ -330,6 +400,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; @@ -371,7 +470,7 @@ _mesa_meta_begin(GLcontext *ctx, GLbitfield state)     if (state & META_STENCIL_TEST) {        save->Stencil = ctx->Stencil; /* struct copy */        if (ctx->Stencil.Enabled) -         _mesa_Disable(GL_STENCIL_TEST); +         _mesa_set_enable(ctx, GL_STENCIL_TEST, GL_FALSE);        /* NOTE: other stencil state not reset */     } @@ -525,6 +624,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); @@ -695,8 +811,35 @@ _mesa_meta_end(GLcontext *ctx)  /** - * Return pointer to temp_texture info.  This does some one-time init - * if needed. + * One-time init for a temp_texture object. + * Choose tex target, compute max tex size, etc. + */ +static void +init_temp_texture(GLcontext *ctx, struct temp_texture *tex) +{ +   /* prefer texture rectangle */ +   if (ctx->Extensions.NV_texture_rectangle) { +      tex->Target = GL_TEXTURE_RECTANGLE; +      tex->MaxSize = ctx->Const.MaxTextureRectSize; +      tex->NPOT = GL_TRUE; +   } +   else { +      /* use 2D texture, NPOT if possible */ +      tex->Target = GL_TEXTURE_2D; +      tex->MaxSize = 1 << (ctx->Const.MaxTextureLevels - 1); +      tex->NPOT = ctx->Extensions.ARB_texture_non_power_of_two; +   } +   tex->MinSize = 16;  /* 16 x 16 at least */ +   assert(tex->MaxSize > 0); + +   _mesa_GenTextures(1, &tex->TexObj); +   _mesa_BindTexture(tex->Target, tex->TexObj); +} + + +/** + * Return pointer to temp_texture info for non-bitmap ops. + * This does some one-time init if needed.   */  static struct temp_texture *  get_temp_texture(GLcontext *ctx) @@ -704,24 +847,25 @@ get_temp_texture(GLcontext *ctx)     struct temp_texture *tex = &ctx->Meta->TempTex;     if (!tex->TexObj) { -      /* do one-time init */ +      init_temp_texture(ctx, tex); +   } + +   return tex; +} -      /* prefer texture rectangle */ -      if (ctx->Extensions.NV_texture_rectangle) { -         tex->Target = GL_TEXTURE_RECTANGLE; -         tex->MaxSize = ctx->Const.MaxTextureRectSize; -         tex->NPOT = GL_TRUE; -      } -      else { -         /* use 2D texture, NPOT if possible */ -         tex->Target = GL_TEXTURE_2D; -         tex->MaxSize = 1 << (ctx->Const.MaxTextureLevels - 1); -         tex->NPOT = ctx->Extensions.ARB_texture_non_power_of_two; -      } -      assert(tex->MaxSize > 0); -      _mesa_GenTextures(1, &tex->TexObj); -      _mesa_BindTexture(tex->Target, tex->TexObj); +/** + * Return pointer to temp_texture info for _mesa_meta_bitmap(). + * We use a separate texture for bitmaps to reduce texture + * allocation/deallocation. + */ +static struct temp_texture * +get_bitmap_temp_texture(GLcontext *ctx) +{ +   struct temp_texture *tex = &ctx->Meta->Bitmap.Tex; + +   if (!tex->TexObj) { +      init_temp_texture(ctx, tex);     }     return tex; @@ -743,6 +887,9 @@ alloc_texture(struct temp_texture *tex,  {     GLboolean newTex = GL_FALSE; +   ASSERT(width <= tex->MaxSize); +   ASSERT(height <= tex->MaxSize); +     if (width > tex->Width ||         height > tex->Height ||         intFormat != tex->IntFormat) { @@ -750,13 +897,13 @@ alloc_texture(struct temp_texture *tex,        if (tex->NPOT) {           /* use non-power of two size */ -         tex->Width = width; -         tex->Height = height; +         tex->Width = MAX2(tex->MinSize, width); +         tex->Height = MAX2(tex->MinSize, height);        }        else {           /* find power of two size */           GLsizei w, h; -         w = h = 16; +         w = h = tex->MinSize;           while (w < width)              w *= 2;           while (h < height) @@ -904,10 +1051,10 @@ init_blit_depth_pixels(GLcontext *ctx)   * of texture mapping and polygon rendering.   */  void -_mesa_meta_blit_framebuffer(GLcontext *ctx, -                            GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, -                            GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, -                            GLbitfield mask, GLenum filter) +_mesa_meta_BlitFramebuffer(GLcontext *ctx, +                           GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, +                           GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, +                           GLbitfield mask, GLenum filter)  {     struct blit_state *blit = &ctx->Meta->Blit;     struct temp_texture *tex = get_temp_texture(ctx); @@ -918,7 +1065,10 @@ _mesa_meta_blit_framebuffer(GLcontext *ctx,     const GLint srcH = abs(srcY1 - srcY0);     const GLboolean srcFlipX = srcX1 < srcX0;     const GLboolean srcFlipY = srcY1 < srcY0; -   GLfloat verts[4][4]; /* four verts of X,Y,S,T */ +   struct vertex { +      GLfloat x, y, s, t; +   }; +   struct vertex verts[4];     GLboolean newTex;     if (srcW > maxTexSize || srcH > maxTexSize) { @@ -957,10 +1107,8 @@ _mesa_meta_blit_framebuffer(GLcontext *ctx,                            NULL, GL_DYNAMIC_DRAW_ARB);        /* setup vertex arrays */ -      _mesa_VertexPointer(2, GL_FLOAT, sizeof(verts[0]), -                          (void *) (0 * sizeof(GLfloat))); -      _mesa_TexCoordPointer(2, GL_FLOAT, sizeof(verts[0]), -                            (void *) (2 * sizeof(GLfloat))); +      _mesa_VertexPointer(2, GL_FLOAT, sizeof(struct vertex), OFFSET(x)); +      _mesa_TexCoordPointer(2, GL_FLOAT, sizeof(struct vertex), OFFSET(s));        _mesa_EnableClientState(GL_VERTEX_ARRAY);        _mesa_EnableClientState(GL_TEXTURE_COORD_ARRAY);     } @@ -973,29 +1121,29 @@ _mesa_meta_blit_framebuffer(GLcontext *ctx,     /* vertex positions/texcoords (after texture allocation!) */     { -      verts[0][0] = (GLfloat) dstX0; -      verts[0][1] = (GLfloat) dstY0; -      verts[1][0] = (GLfloat) dstX1; -      verts[1][1] = (GLfloat) dstY0; -      verts[2][0] = (GLfloat) dstX1; -      verts[2][1] = (GLfloat) dstY1; -      verts[3][0] = (GLfloat) dstX0; -      verts[3][1] = (GLfloat) dstY1; +      verts[0].x = (GLfloat) dstX0; +      verts[0].y = (GLfloat) dstY0; +      verts[1].x = (GLfloat) dstX1; +      verts[1].y = (GLfloat) dstY0; +      verts[2].x = (GLfloat) dstX1; +      verts[2].y = (GLfloat) dstY1; +      verts[3].x = (GLfloat) dstX0; +      verts[3].y = (GLfloat) dstY1; -      verts[0][2] = 0.0F; -      verts[0][3] = 0.0F; -      verts[1][2] = tex->Sright; -      verts[1][3] = 0.0F; -      verts[2][2] = tex->Sright; -      verts[2][3] = tex->Ttop; -      verts[3][2] = 0.0F; -      verts[3][3] = tex->Ttop; +      verts[0].s = 0.0F; +      verts[0].t = 0.0F; +      verts[1].s = tex->Sright; +      verts[1].t = 0.0F; +      verts[2].s = tex->Sright; +      verts[2].t = tex->Ttop; +      verts[3].s = 0.0F; +      verts[3].t = tex->Ttop;        /* upload new vertex data */        _mesa_BufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, sizeof(verts), verts);     } -   _mesa_Enable(tex->Target); +   _mesa_set_enable(ctx, tex->Target, GL_TRUE);     if (mask & GL_COLOR_BUFFER_BIT) {        setup_copypix_texture(tex, newTex, srcX, srcY, srcW, srcH, @@ -1037,7 +1185,7 @@ _mesa_meta_blit_framebuffer(GLcontext *ctx,        /* XXX can't easily do stencil */     } -   _mesa_Disable(tex->Target); +   _mesa_set_enable(ctx, tex->Target, GL_FALSE);     _mesa_meta_end(ctx); @@ -1052,10 +1200,13 @@ _mesa_meta_blit_framebuffer(GLcontext *ctx,   * Meta implementation of ctx->Driver.Clear() in terms of polygon rendering.   */  void -_mesa_meta_clear(GLcontext *ctx, GLbitfield buffers) +_mesa_meta_Clear(GLcontext *ctx, GLbitfield buffers)  {     struct clear_state *clear = &ctx->Meta->Clear; -   GLfloat verts[4][7]; /* four verts of X,Y,Z,R,G,B,A */ +   struct vertex { +      GLfloat x, y, z, r, g, b, a; +   }; +   struct vertex verts[4];     /* save all state but scissor, pixel pack/unpack */     GLbitfield metaSave = META_ALL - META_SCISSOR - META_PIXEL_STORE; @@ -1080,10 +1231,8 @@ _mesa_meta_clear(GLcontext *ctx, GLbitfield buffers)                            NULL, GL_DYNAMIC_DRAW_ARB);        /* setup vertex arrays */ -      _mesa_VertexPointer(3, GL_FLOAT, sizeof(verts[0]), -                          (void *) (0 * sizeof(GLfloat))); -      _mesa_ColorPointer(4, GL_FLOAT, sizeof(verts[0]), -                         (void *) (3 * sizeof(GLfloat))); +      _mesa_VertexPointer(3, GL_FLOAT, sizeof(struct vertex), OFFSET(x)); +      _mesa_ColorPointer(4, GL_FLOAT, sizeof(struct vertex), OFFSET(r));        _mesa_EnableClientState(GL_VERTEX_ARRAY);        _mesa_EnableClientState(GL_COLOR_ARRAY);     } @@ -1133,22 +1282,25 @@ _mesa_meta_clear(GLcontext *ctx, GLbitfield buffers)        const GLfloat z = 1.0 - 2.0 * ctx->Depth.Clear;        GLuint i; -      verts[0][0] = x0; -      verts[0][1] = y0; -      verts[0][2] = z; -      verts[1][0] = x1; -      verts[1][1] = y0; -      verts[1][2] = z; -      verts[2][0] = x1; -      verts[2][1] = y1; -      verts[2][2] = z; -      verts[3][0] = x0; -      verts[3][1] = y1; -      verts[3][2] = z; +      verts[0].x = x0; +      verts[0].y = y0; +      verts[0].z = z; +      verts[1].x = x1; +      verts[1].y = y0; +      verts[1].z = z; +      verts[2].x = x1; +      verts[2].y = y1; +      verts[2].z = z; +      verts[3].x = x0; +      verts[3].y = y1; +      verts[3].z = z;        /* vertex colors */        for (i = 0; i < 4; i++) { -         COPY_4FV(&verts[i][3], ctx->Color.ClearColor); +         verts[i].r = ctx->Color.ClearColor[0]; +         verts[i].g = ctx->Color.ClearColor[1]; +         verts[i].b = ctx->Color.ClearColor[2]; +         verts[i].a = ctx->Color.ClearColor[3];        }        /* upload new vertex data */ @@ -1167,13 +1319,16 @@ _mesa_meta_clear(GLcontext *ctx, GLbitfield buffers)   * of texture mapping and polygon rendering.   */  void -_mesa_meta_copy_pixels(GLcontext *ctx, GLint srcX, GLint srcY, -                       GLsizei width, GLsizei height, -                       GLint dstX, GLint dstY, GLenum type) +_mesa_meta_CopyPixels(GLcontext *ctx, GLint srcX, GLint srcY, +                      GLsizei width, GLsizei height, +                      GLint dstX, GLint dstY, GLenum type)  {     struct copypix_state *copypix = &ctx->Meta->CopyPix;     struct temp_texture *tex = get_temp_texture(ctx); -   GLfloat verts[4][5]; /* four verts of X,Y,Z,S,T */ +   struct vertex { +      GLfloat x, y, z, s, t; +   }; +   struct vertex verts[4];     GLboolean newTex;     GLenum intFormat = GL_RGBA; @@ -1211,10 +1366,8 @@ _mesa_meta_copy_pixels(GLcontext *ctx, GLint srcX, GLint srcY,                            NULL, GL_DYNAMIC_DRAW_ARB);        /* setup vertex arrays */ -      _mesa_VertexPointer(3, GL_FLOAT, sizeof(verts[0]), -                          (void *) (0 * sizeof(GLfloat))); -      _mesa_TexCoordPointer(2, GL_FLOAT, sizeof(verts[0]), -                            (void *) (3 * sizeof(GLfloat))); +      _mesa_VertexPointer(3, GL_FLOAT, sizeof(struct vertex), OFFSET(x)); +      _mesa_TexCoordPointer(2, GL_FLOAT, sizeof(struct vertex), OFFSET(s));        _mesa_EnableClientState(GL_VERTEX_ARRAY);        _mesa_EnableClientState(GL_TEXTURE_COORD_ARRAY);     } @@ -1233,26 +1386,26 @@ _mesa_meta_copy_pixels(GLcontext *ctx, GLint srcX, GLint srcY,        const GLfloat dstY1 = dstY + height * ctx->Pixel.ZoomY;        const GLfloat z = ctx->Current.RasterPos[2]; -      verts[0][0] = dstX0; -      verts[0][1] = dstY0; -      verts[0][2] = z; -      verts[0][3] = 0.0F; -      verts[0][4] = 0.0F; -      verts[1][0] = dstX1; -      verts[1][1] = dstY0; -      verts[1][2] = z; -      verts[1][3] = tex->Sright; -      verts[1][4] = 0.0F; -      verts[2][0] = dstX1; -      verts[2][1] = dstY1; -      verts[2][2] = z; -      verts[2][3] = tex->Sright; -      verts[2][4] = tex->Ttop; -      verts[3][0] = dstX0; -      verts[3][1] = dstY1; -      verts[3][2] = z; -      verts[3][3] = 0.0F; -      verts[3][4] = tex->Ttop; +      verts[0].x = dstX0; +      verts[0].y = dstY0; +      verts[0].z = z; +      verts[0].s = 0.0F; +      verts[0].t = 0.0F; +      verts[1].x = dstX1; +      verts[1].y = dstY0; +      verts[1].z = z; +      verts[1].s = tex->Sright; +      verts[1].t = 0.0F; +      verts[2].x = dstX1; +      verts[2].y = dstY1; +      verts[2].z = z; +      verts[2].s = tex->Sright; +      verts[2].t = tex->Ttop; +      verts[3].x = dstX0; +      verts[3].y = dstY1; +      verts[3].z = z; +      verts[3].s = 0.0F; +      verts[3].t = tex->Ttop;        /* upload new vertex data */        _mesa_BufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, sizeof(verts), verts); @@ -1262,12 +1415,12 @@ _mesa_meta_copy_pixels(GLcontext *ctx, GLint srcX, GLint srcY,     setup_copypix_texture(tex, newTex, srcX, srcY, width, height,                           GL_RGBA, GL_NEAREST); -   _mesa_Enable(tex->Target); +   _mesa_set_enable(ctx, tex->Target, GL_TRUE);     /* draw textured quad */     _mesa_DrawArrays(GL_TRIANGLE_FAN, 0, 4); -   _mesa_Disable(tex->Target); +   _mesa_set_enable(ctx, tex->Target, GL_FALSE);     _mesa_meta_end(ctx);  } @@ -1305,9 +1458,8 @@ tiled_draw_pixels(GLcontext *ctx,           tileUnpack.SkipRows = unpack->SkipRows + j; -         _mesa_meta_draw_pixels(ctx, tileX, tileY, -                                tileWidth, tileHeight, -                                format, type, &tileUnpack, pixels); +         _mesa_meta_DrawPixels(ctx, tileX, tileY, tileWidth, tileHeight, +                               format, type, &tileUnpack, pixels);        }     }  } @@ -1416,17 +1568,20 @@ init_draw_depth_pixels(GLcontext *ctx)   * of texture mapping and polygon rendering.   */  void -_mesa_meta_draw_pixels(GLcontext *ctx, -		       GLint x, GLint y, GLsizei width, GLsizei height, -		       GLenum format, GLenum type, -		       const struct gl_pixelstore_attrib *unpack, -		       const GLvoid *pixels) +_mesa_meta_DrawPixels(GLcontext *ctx, +                      GLint x, GLint y, GLsizei width, GLsizei height, +                      GLenum format, GLenum type, +                      const struct gl_pixelstore_attrib *unpack, +                      const GLvoid *pixels)  {     struct drawpix_state *drawpix = &ctx->Meta->DrawPix;     struct temp_texture *tex = get_temp_texture(ctx);     const struct gl_pixelstore_attrib unpackSave = ctx->Unpack;     const GLuint origStencilMask = ctx->Stencil.WriteMask[0]; -   GLfloat verts[4][5]; /* four verts of X,Y,Z,S,T */ +   struct vertex { +      GLfloat x, y, z, s, t; +   }; +   struct vertex verts[4];     GLenum texIntFormat;     GLboolean fallback, newTex;     GLbitfield metaExtraSave = 0x0; @@ -1523,10 +1678,8 @@ _mesa_meta_draw_pixels(GLcontext *ctx,                            NULL, GL_DYNAMIC_DRAW_ARB);        /* setup vertex arrays */ -      _mesa_VertexPointer(3, GL_FLOAT, sizeof(verts[0]), -                          (void *) (0 * sizeof(GLfloat))); -      _mesa_TexCoordPointer(2, GL_FLOAT, sizeof(verts[0]), -                            (void *) (3 * sizeof(GLfloat))); +      _mesa_VertexPointer(3, GL_FLOAT, sizeof(struct vertex), OFFSET(x)); +      _mesa_TexCoordPointer(2, GL_FLOAT, sizeof(struct vertex), OFFSET(s));        _mesa_EnableClientState(GL_VERTEX_ARRAY);        _mesa_EnableClientState(GL_TEXTURE_COORD_ARRAY);     } @@ -1545,26 +1698,26 @@ _mesa_meta_draw_pixels(GLcontext *ctx,        const GLfloat y1 = y + height * ctx->Pixel.ZoomY;        const GLfloat z = ctx->Current.RasterPos[2]; -      verts[0][0] = x0; -      verts[0][1] = y0; -      verts[0][2] = z; -      verts[0][3] = 0.0F; -      verts[0][4] = 0.0F; -      verts[1][0] = x1; -      verts[1][1] = y0; -      verts[1][2] = z; -      verts[1][3] = tex->Sright; -      verts[1][4] = 0.0F; -      verts[2][0] = x1; -      verts[2][1] = y1; -      verts[2][2] = z; -      verts[2][3] = tex->Sright; -      verts[2][4] = tex->Ttop; -      verts[3][0] = x0; -      verts[3][1] = y1; -      verts[3][2] = z; -      verts[3][3] = 0.0F; -      verts[3][4] = tex->Ttop; +      verts[0].x = x0; +      verts[0].y = y0; +      verts[0].z = z; +      verts[0].s = 0.0F; +      verts[0].t = 0.0F; +      verts[1].x = x1; +      verts[1].y = y0; +      verts[1].z = z; +      verts[1].s = tex->Sright; +      verts[1].t = 0.0F; +      verts[2].x = x1; +      verts[2].y = y1; +      verts[2].z = z; +      verts[2].s = tex->Sright; +      verts[2].t = tex->Ttop; +      verts[3].x = x0; +      verts[3].y = y1; +      verts[3].z = z; +      verts[3].s = 0.0F; +      verts[3].t = tex->Ttop;        /* upload new vertex data */        _mesa_BufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, sizeof(verts), verts); @@ -1573,7 +1726,7 @@ _mesa_meta_draw_pixels(GLcontext *ctx,     /* set given unpack params */     ctx->Unpack = *unpack; -   _mesa_Enable(tex->Target); +   _mesa_set_enable(ctx, tex->Target, GL_TRUE);     if (_mesa_is_stencil_format(format)) {        /* Drawing stencil */ @@ -1637,10 +1790,690 @@ _mesa_meta_draw_pixels(GLcontext *ctx,        _mesa_DrawArrays(GL_TRIANGLE_FAN, 0, 4);     } -   _mesa_Disable(tex->Target); +   _mesa_set_enable(ctx, tex->Target, GL_FALSE);     /* restore unpack params */     ctx->Unpack = unpackSave;     _mesa_meta_end(ctx);  } + + +/** + * Do glBitmap with a alpha texture quad.  Use the alpha test to + * cull the 'off' bits.  If alpha test is already enabled, fall back + * to swrast (should be a rare case). + * A bitmap cache as in the gallium/mesa state tracker would + * improve performance a lot. + */ +void +_mesa_meta_Bitmap(GLcontext *ctx, +                  GLint x, GLint y, GLsizei width, GLsizei height, +                  const struct gl_pixelstore_attrib *unpack, +                  const GLubyte *bitmap1) +{ +   struct bitmap_state *bitmap = &ctx->Meta->Bitmap; +   struct temp_texture *tex = get_bitmap_temp_texture(ctx); +   const GLenum texIntFormat = GL_ALPHA; +   const struct gl_pixelstore_attrib unpackSave = *unpack; +   struct vertex { +      GLfloat x, y, z, s, t, r, g, b, a; +   }; +   struct vertex verts[4]; +   GLboolean newTex; +   GLubyte *bitmap8; + +   /* +    * Check if swrast fallback is needed. +    */ +   if (ctx->_ImageTransferState || +       ctx->Color.AlphaEnabled || +       ctx->Fog.Enabled || +       ctx->Texture._EnabledUnits || +       width > tex->MaxSize || +       height > tex->MaxSize) { +      _swrast_Bitmap(ctx, x, y, width, height, unpack, bitmap1); +      return; +   } + +   /* Most GL state applies to glBitmap (like blending, stencil, etc), +    * but a there's a few things we need to override: +    */ +   _mesa_meta_begin(ctx, (META_ALPHA_TEST | +                          META_PIXEL_STORE | +                          META_RASTERIZATION | +                          META_SHADER | +                          META_TEXTURE | +                          META_TRANSFORM | +                          META_VERTEX | +                          META_VIEWPORT)); + +   if (bitmap->ArrayObj == 0) { +      /* one-time setup */ + +      /* create vertex array object */ +      _mesa_GenVertexArraysAPPLE(1, &bitmap->ArrayObj); +      _mesa_BindVertexArrayAPPLE(bitmap->ArrayObj); + +      /* create vertex array buffer */ +      _mesa_GenBuffersARB(1, &bitmap->VBO); +      _mesa_BindBufferARB(GL_ARRAY_BUFFER_ARB, bitmap->VBO); +      _mesa_BufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(verts), +                          NULL, GL_DYNAMIC_DRAW_ARB); + +      /* setup vertex arrays */ +      _mesa_VertexPointer(3, GL_FLOAT, sizeof(struct vertex), OFFSET(x)); +      _mesa_TexCoordPointer(2, GL_FLOAT, sizeof(struct vertex), OFFSET(s)); +      _mesa_ColorPointer(4, GL_FLOAT, sizeof(struct vertex), OFFSET(r)); +      _mesa_EnableClientState(GL_VERTEX_ARRAY); +      _mesa_EnableClientState(GL_TEXTURE_COORD_ARRAY); +      _mesa_EnableClientState(GL_COLOR_ARRAY); +   } +   else { +      _mesa_BindVertexArray(bitmap->ArrayObj); +      _mesa_BindBufferARB(GL_ARRAY_BUFFER_ARB, bitmap->VBO); +   } + +   newTex = alloc_texture(tex, width, height, texIntFormat); + +   /* vertex positions, texcoords, colors (after texture allocation!) */ +   { +      const GLfloat x0 = (GLfloat) x; +      const GLfloat y0 = (GLfloat) y; +      const GLfloat x1 = (GLfloat) (x + width); +      const GLfloat y1 = (GLfloat) (y + height); +      const GLfloat z = ctx->Current.RasterPos[2]; +      GLuint i; + +      verts[0].x = x0; +      verts[0].y = y0; +      verts[0].z = z; +      verts[0].s = 0.0F; +      verts[0].t = 0.0F; +      verts[1].x = x1; +      verts[1].y = y0; +      verts[1].z = z; +      verts[1].s = tex->Sright; +      verts[1].t = 0.0F; +      verts[2].x = x1; +      verts[2].y = y1; +      verts[2].z = z; +      verts[2].s = tex->Sright; +      verts[2].t = tex->Ttop; +      verts[3].x = x0; +      verts[3].y = y1; +      verts[3].z = z; +      verts[3].s = 0.0F; +      verts[3].t = tex->Ttop; + +      for (i = 0; i < 4; i++) { +         verts[i].r = ctx->Current.RasterColor[0]; +         verts[i].g = ctx->Current.RasterColor[1]; +         verts[i].b = ctx->Current.RasterColor[2]; +         verts[i].a = ctx->Current.RasterColor[3]; +      } + +      /* upload new vertex data */ +      _mesa_BufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, sizeof(verts), verts); +   } + +   bitmap1 = _mesa_map_pbo_source(ctx, &unpackSave, bitmap1); +   if (!bitmap1) +      return; + +   bitmap8 = (GLubyte *) _mesa_calloc(width * height); +   if (bitmap8) { +      _mesa_expand_bitmap(width, height, &unpackSave, bitmap1, +                          bitmap8, width, 0xff); + +      _mesa_set_enable(ctx, tex->Target, GL_TRUE); + +      _mesa_set_enable(ctx, GL_ALPHA_TEST, GL_TRUE); +      _mesa_AlphaFunc(GL_GREATER, 0.0); + +      setup_drawpix_texture(tex, newTex, texIntFormat, width, height, +                            GL_ALPHA, GL_UNSIGNED_BYTE, bitmap8); + +      _mesa_DrawArrays(GL_TRIANGLE_FAN, 0, 4); + +      _mesa_set_enable(ctx, tex->Target, GL_FALSE); + +      _mesa_free(bitmap8); +   } + +   _mesa_unmap_pbo_source(ctx, &unpackSave); + +   _mesa_meta_end(ctx); +} + + +void +_mesa_meta_GenerateMipmap(GLcontext *ctx, GLenum target, +                          struct gl_texture_object *texObj) +{ +   struct gen_mipmap_state *mipmap = &ctx->Meta->Mipmap; +   struct vertex { +      GLfloat x, y, s, t, r; +   }; +   struct vertex verts[4]; +   const GLuint baseLevel = texObj->BaseLevel; +   const GLuint maxLevel = texObj->MaxLevel; +   const GLenum minFilterSave = texObj->MinFilter; +   const GLenum magFilterSave = texObj->MagFilter; +   const GLuint fboSave = ctx->DrawBuffer->Name; +   GLenum faceTarget; +   GLuint level; +   GLuint border = 0; + +   /* check for fallbacks */ +   if (!ctx->Extensions.EXT_framebuffer_object) { +      _mesa_generate_mipmap(ctx, target, texObj); +      return; +   } + +   if (target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X && +       target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z) { +      faceTarget = target; +      target = GL_TEXTURE_CUBE_MAP; +   } +   else { +      faceTarget = target; +   } + +   _mesa_meta_begin(ctx, META_ALL); + +   if (mipmap->ArrayObj == 0) { +      /* one-time setup */ + +      /* create vertex array object */ +      _mesa_GenVertexArraysAPPLE(1, &mipmap->ArrayObj); +      _mesa_BindVertexArrayAPPLE(mipmap->ArrayObj); + +      /* create vertex array buffer */ +      _mesa_GenBuffersARB(1, &mipmap->VBO); +      _mesa_BindBufferARB(GL_ARRAY_BUFFER_ARB, mipmap->VBO); +      _mesa_BufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(verts), +                          NULL, GL_DYNAMIC_DRAW_ARB); + +      /* setup vertex arrays */ +      _mesa_VertexPointer(2, GL_FLOAT, sizeof(struct vertex), OFFSET(x)); +      _mesa_TexCoordPointer(3, GL_FLOAT, sizeof(struct vertex), OFFSET(s)); +      _mesa_EnableClientState(GL_VERTEX_ARRAY); +      _mesa_EnableClientState(GL_TEXTURE_COORD_ARRAY); +   } +   else { +      _mesa_BindVertexArray(mipmap->ArrayObj); +      _mesa_BindBufferARB(GL_ARRAY_BUFFER_ARB, mipmap->VBO); +   } + +   if (!mipmap->FBO) { +      /* Bind the new renderbuffer to the color attachment point. */ +      _mesa_GenFramebuffersEXT(1, &mipmap->FBO); +   } + +   _mesa_BindFramebufferEXT(GL_FRAMEBUFFER_EXT, mipmap->FBO); + +   _mesa_TexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_LINEAR); +   _mesa_TexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_LINEAR); +   _mesa_set_enable(ctx, target, GL_TRUE); + +   /* setup texcoords once (XXX what about border?) */ +   switch (faceTarget) { +   case GL_TEXTURE_CUBE_MAP_POSITIVE_X: +      break; +   case GL_TEXTURE_2D: +      verts[0].s = 0.0F; +      verts[0].t = 0.0F; +      verts[0].r = 0.0F; +      verts[1].s = 1.0F; +      verts[1].t = 0.0F; +      verts[1].r = 0.0F; +      verts[2].s = 1.0F; +      verts[2].t = 1.0F; +      verts[2].r = 0.0F; +      verts[3].s = 0.0F; +      verts[3].t = 1.0F; +      verts[3].r = 0.0F; +      break; +   } + + +   for (level = baseLevel + 1; level <= maxLevel; level++) { +      const struct gl_texture_image *srcImage; +      const GLuint srcLevel = level - 1; +      GLsizei srcWidth, srcHeight; +      GLsizei newWidth, newHeight; +      GLenum status; + +      srcImage = _mesa_select_tex_image(ctx, texObj, target, srcLevel); +      assert(srcImage->Border == 0); /* XXX we can fix this */ + +      srcWidth = srcImage->Width - 2 * border; +      srcHeight = srcImage->Height - 2 * border; + +      newWidth = MAX2(1, srcWidth / 2) + 2 * border; +      newHeight = MAX2(1, srcHeight / 2) + 2 * border; + +      if (newWidth == srcImage->Width && newHeight == srcImage->Height) { +	 break; +      } + +      /* Create empty image */ +      _mesa_TexImage2D(GL_TEXTURE_2D, level, srcImage->InternalFormat, +		       newWidth, newHeight, border, +		       GL_RGBA, GL_UNSIGNED_BYTE, NULL); + +      /* vertex positions */ +      { +         verts[0].x = 0.0F; +         verts[0].y = 0.0F; +         verts[1].x = (GLfloat) newWidth; +         verts[1].y = 0.0F; +         verts[2].x = (GLfloat) newWidth; +         verts[2].y = (GLfloat) newHeight; +         verts[3].x = 0.0F; +         verts[3].y = (GLfloat) newHeight; + +         /* upload new vertex data */ +         _mesa_BufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, sizeof(verts), verts); +      } + +      /* limit sampling to src level */ +      _mesa_TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, srcLevel); +      _mesa_TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, srcLevel); + +      /* Set to draw into the current level */ +      _mesa_FramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, +                                    GL_COLOR_ATTACHMENT0_EXT, +                                    target, +                                    texObj->Name, +                                    level); + +      /* Choose to render to the color attachment. */ +      _mesa_DrawBuffer(GL_COLOR_ATTACHMENT0_EXT); + +      status = _mesa_CheckFramebufferStatusEXT (GL_FRAMEBUFFER_EXT); +      if (status != GL_FRAMEBUFFER_COMPLETE_EXT) { +         abort(); +         break; +      } + +      _mesa_DrawArrays(GL_TRIANGLE_FAN, 0, 4); +   } + +   _mesa_meta_end(ctx); + +   _mesa_TexParameteri(target, GL_TEXTURE_MIN_FILTER, minFilterSave); +   _mesa_TexParameteri(target, GL_TEXTURE_MAG_FILTER, magFilterSave); + +   /* 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; +   GLsizei postConvWidth = width, postConvHeight = height; +   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); + +   /* +    * Prepare for new texture image size/data +    */ +#if FEATURE_convolve +   if (_mesa_is_color_format(internalFormat)) { +      _mesa_adjust_image_for_convolution(ctx, 2, +                                         &postConvWidth, &postConvHeight); +   } +#endif + +   if (texImage->Data) { +      ctx->Driver.FreeTexImageData(ctx, texImage); +   } + +   _mesa_init_teximage_fields(ctx, target, texImage, +                              postConvWidth, postConvHeight, 1, +                              border, internalFormat); + +   /* +    * Store texture data (with pixel transfer ops) +    */ +   _mesa_meta_begin(ctx, META_PIXEL_STORE); + +   _mesa_update_state(ctx); /* to update pixel transfer state */ + +   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); + +   _mesa_update_state(ctx); /* to update pixel transfer state */ + +   /* +    * 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); +} + + +void +_mesa_meta_CopyColorTable(GLcontext *ctx, +                          GLenum target, GLenum internalformat, +                          GLint x, GLint y, GLsizei width) +{ +   GLfloat *buf; + +   buf = (GLfloat *) _mesa_malloc(width * 4 * sizeof(GLfloat)); +   if (!buf) { +      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCopyColorTable"); +      return; +   } + +   /* +    * 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, 1, +                          GL_RGBA, GL_FLOAT, &ctx->Pack, buf); + +   _mesa_ColorTable(target, internalformat, width, GL_RGBA, GL_FLOAT, buf); + +   _mesa_meta_end(ctx); + +   _mesa_free(buf); +} + + +void +_mesa_meta_CopyColorSubTable(GLcontext *ctx,GLenum target, GLsizei start, +                             GLint x, GLint y, GLsizei width) +{ +   GLfloat *buf; + +   buf = (GLfloat *) _mesa_malloc(width * 4 * sizeof(GLfloat)); +   if (!buf) { +      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCopyColorSubTable"); +      return; +   } + +   /* +    * 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, 1, +                          GL_RGBA, GL_FLOAT, &ctx->Pack, buf); + +   _mesa_ColorSubTable(target, start, width, GL_RGBA, GL_FLOAT, buf); + +   _mesa_meta_end(ctx); + +   _mesa_free(buf); +} + + +void +_mesa_meta_CopyConvolutionFilter1D(GLcontext *ctx, GLenum target, +                                   GLenum internalFormat, +                                   GLint x, GLint y, GLsizei width) +{ +   GLfloat *buf; + +   buf = (GLfloat *) _mesa_malloc(width * 4 * sizeof(GLfloat)); +   if (!buf) { +      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCopyConvolutionFilter2D"); +      return; +   } + +   /* +    * Read image from framebuffer (disable pixel transfer ops) +    */ +   _mesa_meta_begin(ctx, META_PIXEL_STORE | META_PIXEL_TRANSFER); +   _mesa_update_state(ctx); +   ctx->Driver.ReadPixels(ctx, x, y, width, 1, +                          GL_RGBA, GL_FLOAT, &ctx->Pack, buf); + +   _mesa_ConvolutionFilter1D(target, internalFormat, width, +                             GL_RGBA, GL_FLOAT, buf); + +   _mesa_meta_end(ctx); + +   _mesa_free(buf); +} + + +void +_mesa_meta_CopyConvolutionFilter2D(GLcontext *ctx, GLenum target, +                                   GLenum internalFormat, GLint x, GLint y, +                                   GLsizei width, GLsizei height) +{ +   GLfloat *buf; + +   buf = (GLfloat *) _mesa_malloc(width * height * 4 * sizeof(GLfloat)); +   if (!buf) { +      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCopyConvolutionFilter2D"); +      return; +   } + +   /* +    * Read image from framebuffer (disable pixel transfer ops) +    */ +   _mesa_meta_begin(ctx, META_PIXEL_STORE | META_PIXEL_TRANSFER); +   _mesa_update_state(ctx); + +   ctx->Driver.ReadPixels(ctx, x, y, width, height, +                          GL_RGBA, GL_FLOAT, &ctx->Pack, buf); + +   _mesa_ConvolutionFilter2D(target, internalFormat, width, height, +                             GL_RGBA, GL_FLOAT, buf); + +   _mesa_meta_end(ctx); + +   _mesa_free(buf); +} diff --git a/src/mesa/drivers/common/meta.h b/src/mesa/drivers/common/meta.h index b03b64c48a..7f659528dc 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); @@ -57,25 +34,81 @@ extern void  _mesa_meta_free(GLcontext *ctx);  extern void -_mesa_meta_blit_framebuffer(GLcontext *ctx, -                            GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, -                            GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, -                            GLbitfield mask, GLenum filter); +_mesa_meta_BlitFramebuffer(GLcontext *ctx, +                           GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, +                           GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, +                           GLbitfield mask, GLenum filter); + +extern void +_mesa_meta_Clear(GLcontext *ctx, GLbitfield buffers); + +extern void +_mesa_meta_CopyPixels(GLcontext *ctx, GLint srcx, GLint srcy, +                      GLsizei width, GLsizei height, +                      GLint dstx, GLint dsty, GLenum type); + +extern void +_mesa_meta_DrawPixels(GLcontext *ctx, +                      GLint x, GLint y, GLsizei width, GLsizei height, +                      GLenum format, GLenum type, +                      const struct gl_pixelstore_attrib *unpack, +                      const GLvoid *pixels); + +extern void +_mesa_meta_Bitmap(GLcontext *ctx, +                  GLint x, GLint y, GLsizei width, GLsizei height, +                  const struct gl_pixelstore_attrib *unpack, +                  const GLubyte *bitmap); + +extern void +_mesa_meta_GenerateMipmap(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); + +extern void +_mesa_meta_CopyColorTable(GLcontext *ctx, +                          GLenum target, GLenum internalformat, +                          GLint x, GLint y, GLsizei width);  extern void -_mesa_meta_clear(GLcontext *ctx, GLbitfield buffers); +_mesa_meta_CopyColorSubTable(GLcontext *ctx,GLenum target, GLsizei start, +                             GLint x, GLint y, GLsizei width);  extern void -_mesa_meta_copy_pixels(GLcontext *ctx, GLint srcx, GLint srcy, -                       GLsizei width, GLsizei height, -                       GLint dstx, GLint dsty, GLenum type); +_mesa_meta_CopyConvolutionFilter1D(GLcontext *ctx, GLenum target, +                                   GLenum internalFormat, +                                   GLint x, GLint y, GLsizei width);  extern void -_mesa_meta_draw_pixels(GLcontext *ctx, -		       GLint x, GLint y, GLsizei width, GLsizei height, -		       GLenum format, GLenum type, -		       const struct gl_pixelstore_attrib *unpack, -		       const GLvoid *pixels); +_mesa_meta_CopyConvolutionFilter2D(GLcontext *ctx, GLenum target, +                                   GLenum internalFormat, GLint x, GLint y, +                                   GLsizei width, GLsizei height);  #endif /* META_H */ diff --git a/src/mesa/drivers/dri/common/extension_helper.h b/src/mesa/drivers/dri/common/extension_helper.h index 40a030ce0d..5e86324eec 100644 --- a/src/mesa/drivers/dri/common/extension_helper.h +++ b/src/mesa/drivers/dri/common/extension_helper.h @@ -316,6 +316,13 @@ static const char CombinerOutputNV_names[] =      "";  #endif +#if defined(need_GL_NV_vertex_program) +static const char VertexAttribs3fvNV_names[] = +    "iip\0" /* Parameter signature */ +    "glVertexAttribs3fvNV\0" +    ""; +#endif +  #if defined(need_GL_VERSION_2_0) || defined(need_GL_ARB_shader_objects)  static const char Uniform2fARB_names[] =      "iff\0" /* Parameter signature */ @@ -575,6 +582,13 @@ static const char MatrixIndexusvARB_names[] =      "";  #endif +#if defined(need_GL_ARB_draw_elements_base_vertex) +static const char DrawElementsBaseVertex_names[] = +    "iiipi\0" /* Parameter signature */ +    "glDrawElementsBaseVertex\0" +    ""; +#endif +  #if defined(need_GL_VERSION_2_0) || defined(need_GL_ARB_vertex_program)  static const char DisableVertexAttribArrayARB_names[] =      "i\0" /* Parameter signature */ @@ -970,10 +984,10 @@ static const char GlobalAlphaFactordSUN_names[] =      "";  #endif -#if defined(need_GL_NV_vertex_program) -static const char VertexAttribs3fvNV_names[] = +#if defined(need_GL_NV_register_combiners) +static const char GetFinalCombinerInputParameterfvNV_names[] =      "iip\0" /* Parameter signature */ -    "glVertexAttribs3fvNV\0" +    "glGetFinalCombinerInputParameterfvNV\0"      "";  #endif @@ -3918,6 +3932,13 @@ static const char MapBufferARB_names[] =      "";  #endif +#if defined(need_GL_ARB_draw_elements_base_vertex) +static const char MultiDrawElementsBaseVertex_names[] = +    "ipipip\0" /* Parameter signature */ +    "glMultiDrawElementsBaseVertex\0" +    ""; +#endif +  #if defined(need_GL_EXT_coordinate_frame)  static const char Binormal3svEXT_names[] =      "p\0" /* Parameter signature */ @@ -4396,10 +4417,11 @@ static const char SpriteParameterivSGIX_names[] =      "";  #endif -#if defined(need_GL_EXT_provoking_vertex) +#if defined(need_GL_EXT_provoking_vertex) || defined(need_GL_ARB_provoking_vertex)  static const char ProvokingVertexEXT_names[] =      "i\0" /* Parameter signature */      "glProvokingVertexEXT\0" +    "glProvokingVertex\0"      "";  #endif @@ -4554,10 +4576,10 @@ static const char UniformMatrix3x4fv_names[] =      "";  #endif -#if defined(need_GL_EXT_coordinate_frame) -static const char Binormal3fvEXT_names[] = -    "p\0" /* Parameter signature */ -    "glBinormal3fvEXT\0" +#if defined(need_GL_ARB_draw_elements_base_vertex) +static const char DrawRangeElementsBaseVertex_names[] = +    "iiiiipi\0" /* Parameter signature */ +    "glDrawRangeElementsBaseVertex\0"      "";  #endif @@ -4710,10 +4732,10 @@ static const char GetFragmentLightfvSGIX_names[] =      "";  #endif -#if defined(need_GL_NV_register_combiners) -static const char GetFinalCombinerInputParameterfvNV_names[] = -    "iip\0" /* Parameter signature */ -    "glGetFinalCombinerInputParameterfvNV\0" +#if defined(need_GL_EXT_coordinate_frame) +static const char Binormal3fvEXT_names[] = +    "p\0" /* Parameter signature */ +    "glBinormal3fvEXT\0"      "";  #endif @@ -5090,6 +5112,15 @@ static const struct dri_extension_function GL_ARB_draw_buffers_functions[] = {  };  #endif +#if defined(need_GL_ARB_draw_elements_base_vertex) +static const struct dri_extension_function GL_ARB_draw_elements_base_vertex_functions[] = { +    { DrawElementsBaseVertex_names, DrawElementsBaseVertex_remap_index, -1 }, +    { MultiDrawElementsBaseVertex_names, MultiDrawElementsBaseVertex_remap_index, -1 }, +    { DrawRangeElementsBaseVertex_names, DrawRangeElementsBaseVertex_remap_index, -1 }, +    { NULL, 0, 0 } +}; +#endif +  #if defined(need_GL_ARB_framebuffer_object)  static const struct dri_extension_function GL_ARB_framebuffer_object_functions[] = {      { BlitFramebufferEXT_names, BlitFramebufferEXT_remap_index, -1 }, @@ -5164,6 +5195,13 @@ static const struct dri_extension_function GL_ARB_point_parameters_functions[] =  };  #endif +#if defined(need_GL_ARB_provoking_vertex) +static const struct dri_extension_function GL_ARB_provoking_vertex_functions[] = { +    { ProvokingVertexEXT_names, ProvokingVertexEXT_remap_index, -1 }, +    { NULL, 0, 0 } +}; +#endif +  #if defined(need_GL_ARB_shader_objects)  static const struct dri_extension_function GL_ARB_shader_objects_functions[] = {      { UniformMatrix3fvARB_names, UniformMatrix3fvARB_remap_index, -1 }, @@ -5520,8 +5558,8 @@ static const struct dri_extension_function GL_EXT_coordinate_frame_functions[] =      { Binormal3dvEXT_names, Binormal3dvEXT_remap_index, -1 },      { Tangent3iEXT_names, Tangent3iEXT_remap_index, -1 },      { Tangent3bvEXT_names, Tangent3bvEXT_remap_index, -1 }, -    { Binormal3fvEXT_names, Binormal3fvEXT_remap_index, -1 },      { Tangent3bEXT_names, Tangent3bEXT_remap_index, -1 }, +    { Binormal3fvEXT_names, Binormal3fvEXT_remap_index, -1 },      { BinormalPointerEXT_names, BinormalPointerEXT_remap_index, -1 },      { Tangent3svEXT_names, Tangent3svEXT_remap_index, -1 },      { Binormal3bEXT_names, Binormal3bEXT_remap_index, -1 }, @@ -5963,6 +6001,7 @@ static const struct dri_extension_function GL_NV_point_sprite_functions[] = {  static const struct dri_extension_function GL_NV_register_combiners_functions[] = {      { CombinerOutputNV_names, CombinerOutputNV_remap_index, -1 },      { CombinerParameterfvNV_names, CombinerParameterfvNV_remap_index, -1 }, +    { GetFinalCombinerInputParameterfvNV_names, GetFinalCombinerInputParameterfvNV_remap_index, -1 },      { GetCombinerOutputParameterfvNV_names, GetCombinerOutputParameterfvNV_remap_index, -1 },      { FinalCombinerInputNV_names, FinalCombinerInputNV_remap_index, -1 },      { GetCombinerInputParameterfvNV_names, GetCombinerInputParameterfvNV_remap_index, -1 }, @@ -5971,7 +6010,6 @@ static const struct dri_extension_function GL_NV_register_combiners_functions[]      { GetFinalCombinerInputParameterivNV_names, GetFinalCombinerInputParameterivNV_remap_index, -1 },      { CombinerInputNV_names, CombinerInputNV_remap_index, -1 },      { CombinerParameterfNV_names, CombinerParameterfNV_remap_index, -1 }, -    { GetFinalCombinerInputParameterfvNV_names, GetFinalCombinerInputParameterfvNV_remap_index, -1 },      { GetCombinerInputParameterivNV_names, GetCombinerInputParameterivNV_remap_index, -1 },      { CombinerParameterivNV_names, CombinerParameterivNV_remap_index, -1 },      { NULL, 0, 0 } @@ -5998,6 +6036,7 @@ static const struct dri_extension_function GL_NV_vertex_array_range_functions[]  static const struct dri_extension_function GL_NV_vertex_program_functions[] = {      { VertexAttrib4ubvNV_names, VertexAttrib4ubvNV_remap_index, -1 },      { VertexAttrib4svNV_names, VertexAttrib4svNV_remap_index, -1 }, +    { VertexAttribs3fvNV_names, VertexAttribs3fvNV_remap_index, -1 },      { VertexAttribs1dvNV_names, VertexAttribs1dvNV_remap_index, -1 },      { VertexAttrib1fvNV_names, VertexAttrib1fvNV_remap_index, -1 },      { VertexAttrib4fNV_names, VertexAttrib4fNV_remap_index, -1 }, @@ -6006,7 +6045,6 @@ static const struct dri_extension_function GL_NV_vertex_program_functions[] = {      { VertexAttribs3dvNV_names, VertexAttribs3dvNV_remap_index, -1 },      { VertexAttribs4fvNV_names, VertexAttribs4fvNV_remap_index, -1 },      { VertexAttrib2sNV_names, VertexAttrib2sNV_remap_index, -1 }, -    { VertexAttribs3fvNV_names, VertexAttribs3fvNV_remap_index, -1 },      { ProgramEnvParameter4fvARB_names, ProgramEnvParameter4fvARB_remap_index, -1 },      { LoadProgramNV_names, LoadProgramNV_remap_index, -1 },      { VertexAttrib4fvNV_names, VertexAttrib4fvNV_remap_index, -1 }, 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/i965/brw_cc.c b/src/mesa/drivers/dri/i965/brw_cc.c index c724218cf5..1088a7a607 100644 --- a/src/mesa/drivers/dri/i965/brw_cc.c +++ b/src/mesa/drivers/dri/i965/brw_cc.c @@ -39,12 +39,14 @@  static void prepare_cc_vp( struct brw_context *brw )  { +   GLcontext *ctx = &brw->intel.ctx;     struct brw_cc_viewport ccv;     memset(&ccv, 0, sizeof(ccv)); -   ccv.min_depth = 0.0; -   ccv.max_depth = 1.0; +   /* _NEW_VIEWPORT */ +   ccv.min_depth = ctx->Viewport.Near; +   ccv.max_depth = ctx->Viewport.Far;     dri_bo_unreference(brw->cc.vp_bo);     brw->cc.vp_bo = brw_cache_data( &brw->cache, BRW_CC_VP, &ccv, NULL, 0 ); @@ -52,7 +54,7 @@ static void prepare_cc_vp( struct brw_context *brw )  const struct brw_tracked_state brw_cc_vp = {     .dirty = { -      .mesa = 0, +      .mesa = _NEW_VIEWPORT,        .brw = BRW_NEW_CONTEXT,        .cache = 0     }, diff --git a/src/mesa/drivers/dri/i965/brw_clip_state.c b/src/mesa/drivers/dri/i965/brw_clip_state.c index 5762c9577c..234b3744bf 100644 --- a/src/mesa/drivers/dri/i965/brw_clip_state.c +++ b/src/mesa/drivers/dri/i965/brw_clip_state.c @@ -43,11 +43,14 @@ struct brw_clip_unit_key {     unsigned int curbe_offset;     unsigned int nr_urb_entries, urb_size; + +   GLboolean depth_clamp;  };  static void  clip_unit_populate_key(struct brw_context *brw, struct brw_clip_unit_key *key)  { +   GLcontext *ctx = &brw->intel.ctx;     memset(key, 0, sizeof(*key));     /* CACHE_NEW_CLIP_PROG */ @@ -62,6 +65,9 @@ clip_unit_populate_key(struct brw_context *brw, struct brw_clip_unit_key *key)     /* BRW_NEW_URB_FENCE */     key->nr_urb_entries = brw->urb.nr_clip_entries;     key->urb_size = brw->urb.vsize; + +   /* _NEW_TRANSOFORM */ +   key->depth_clamp = ctx->Transform.DepthClamp;  }  static dri_bo * @@ -117,7 +123,8 @@ clip_unit_create_from_key(struct brw_context *brw,     clip.clip5.userclip_enable_flags = 0x7f;     clip.clip5.userclip_must_clip = 1;     clip.clip5.guard_band_enable = 0; -   clip.clip5.viewport_z_clip_enable = 1; +   if (!key->depth_clamp) +      clip.clip5.viewport_z_clip_enable = 1;     clip.clip5.viewport_xy_clip_enable = 1;     clip.clip5.vertex_position_space = BRW_CLIP_NDCSPACE;     clip.clip5.api_mode = BRW_CLIP_API_OGL; @@ -168,7 +175,7 @@ static void upload_clip_unit( struct brw_context *brw )  const struct brw_tracked_state brw_clip_unit = {     .dirty = { -      .mesa  = 0, +      .mesa  = _NEW_TRANSFORM,        .brw   = (BRW_NEW_CURBE_OFFSETS |  		BRW_NEW_URB_FENCE),        .cache = CACHE_NEW_CLIP_PROG diff --git a/src/mesa/drivers/dri/i965/brw_draw.c b/src/mesa/drivers/dri/i965/brw_draw.c index c53bd47bb5..44bb7bd588 100644 --- a/src/mesa/drivers/dri/i965/brw_draw.c +++ b/src/mesa/drivers/dri/i965/brw_draw.c @@ -25,13 +25,15 @@   *    **************************************************************************/ -#include <stdlib.h>  #include "main/glheader.h"  #include "main/context.h"  #include "main/state.h" -#include "main/api_validate.h"  #include "main/enums.h" +#include "tnl/tnl.h" +#include "vbo/vbo_context.h" +#include "swrast/swrast.h" +#include "swrast_setup/swrast_setup.h"  #include "brw_draw.h"  #include "brw_defines.h" @@ -42,11 +44,6 @@  #include "intel_batchbuffer.h"  #include "intel_buffer_objects.h" -#include "tnl/tnl.h" -#include "vbo/vbo_context.h" -#include "swrast/swrast.h" -#include "swrast_setup/swrast_setup.h" -  #define FILE_DEBUG_FLAG DEBUG_BATCH  static GLuint prim_to_hw_prim[GL_POLYGON+1] = { @@ -145,7 +142,7 @@ static void brw_emit_prim(struct brw_context *brw,        prim_packet.start_vert_location += brw->ib.start_vertex_offset;     prim_packet.instance_count = 1;     prim_packet.start_instance_location = 0; -   prim_packet.base_vert_location = 0; +   prim_packet.base_vert_location = prim->basevertex;     /* Can't wrap here, since we rely on the validated state. */     brw->no_batch_wrap = GL_TRUE; diff --git a/src/mesa/drivers/dri/i965/brw_draw_upload.c b/src/mesa/drivers/dri/i965/brw_draw_upload.c index 4aa17fa02d..765ae5a2fe 100644 --- a/src/mesa/drivers/dri/i965/brw_draw_upload.c +++ b/src/mesa/drivers/dri/i965/brw_draw_upload.c @@ -25,9 +25,9 @@   *    **************************************************************************/ -#include <stdlib.h>  #include "main/glheader.h" +#include "main/bufferobj.h"  #include "main/context.h"  #include "main/state.h"  #include "main/api_validate.h" @@ -384,7 +384,7 @@ static void brw_prepare_vertices(struct brw_context *brw)        input->element_size = get_size(input->glarray->Type) * input->glarray->Size; -      if (input->glarray->BufferObj->Name != 0) { +      if (_mesa_is_bufferobj(input->glarray->BufferObj)) {  	 struct intel_buffer_object *intel_buffer =  	    intel_buffer_object(input->glarray->BufferObj); @@ -623,7 +623,7 @@ static void brw_prepare_indices(struct brw_context *brw)     /* Turn into a proper VBO:      */ -   if (!bufferobj->Name) { +   if (!_mesa_is_bufferobj(bufferobj)) {        brw->ib.start_vertex_offset = 0;        /* Get new bufferobj, offset: diff --git a/src/mesa/drivers/dri/i965/brw_gs_state.c b/src/mesa/drivers/dri/i965/brw_gs_state.c index a761c03153..ed9d2ffe60 100644 --- a/src/mesa/drivers/dri/i965/brw_gs_state.c +++ b/src/mesa/drivers/dri/i965/brw_gs_state.c @@ -93,7 +93,10 @@ gs_unit_create_from_key(struct brw_context *brw, struct brw_gs_unit_key *key)     gs.thread4.nr_urb_entries = key->nr_urb_entries;     gs.thread4.urb_entry_allocation_size = key->urb_size - 1; -   gs.thread4.max_threads = 0; /* Hardware requirement */ +   if (key->nr_urb_entries >= 8) +      gs.thread4.max_threads = 1; +   else +      gs.thread4.max_threads = 0;     if (BRW_IS_IGDNG(brw))        gs.thread4.rendering_enable = 1; diff --git a/src/mesa/drivers/dri/i965/brw_vs_emit.c b/src/mesa/drivers/dri/i965/brw_vs_emit.c index 108e19cdbc..1638ef8111 100644 --- a/src/mesa/drivers/dri/i965/brw_vs_emit.c +++ b/src/mesa/drivers/dri/i965/brw_vs_emit.c @@ -1208,7 +1208,7 @@ static void emit_vertex_write( struct brw_vs_compile *c)  		 MIN2(c->nr_outputs + 1 + len_vertext_header, (BRW_MAX_MRF-1)), /* msg len */  		 0,		/* response len */  		 eot, 		/* eot */ -		 1, 		/* writes complete */ +		 eot, 		/* writes complete */  		 0, 		/* urb destination offset */  		 BRW_URB_SWIZZLE_INTERLEAVE); @@ -1270,9 +1270,27 @@ post_vs_emit( struct brw_vs_compile *c,  }  static uint32_t -get_predicate(uint32_t swizzle) +get_predicate(const struct prog_instruction *inst)  { -   switch (swizzle) { +   if (inst->DstReg.CondMask == COND_TR) +      return BRW_PREDICATE_NONE; + +   /* All of GLSL only produces predicates for COND_NE and one channel per +    * vector.  Fail badly if someone starts doing something else, as it might +    * mean infinite looping or something. +    * +    * We'd like to support all the condition codes, but our hardware doesn't +    * quite match the Mesa IR, which is modeled after the NV extensions.  For +    * those, the instruction may update the condition codes or not, then any +    * later instruction may use one of those condition codes.  For gen4, the +    * instruction may update the flags register based on one of the condition +    * codes output by the instruction, and then further instructions may +    * predicate on that.  We can probably support this, but it won't +    * necessarily be easy. +    */ +   assert(inst->DstReg.CondMask == COND_NE); + +   switch (inst->DstReg.CondSwizzle) {     case SWIZZLE_XXXX:        return BRW_PREDICATE_ALIGN16_REPLICATE_X;     case SWIZZLE_YYYY: @@ -1282,7 +1300,8 @@ get_predicate(uint32_t swizzle)     case SWIZZLE_WWWW:        return BRW_PREDICATE_ALIGN16_REPLICATE_W;     default: -      _mesa_problem(NULL, "Unexpected predicate: 0x%08x\n", swizzle); +      _mesa_problem(NULL, "Unexpected predicate: 0x%08x\n", +		    inst->DstReg.CondMask);        return BRW_PREDICATE_NORMAL;     }  } @@ -1294,6 +1313,7 @@ void brw_vs_emit(struct brw_vs_compile *c )  #define MAX_IF_DEPTH 32  #define MAX_LOOP_DEPTH 32     struct brw_compile *p = &c->func; +   struct brw_context *brw = p->brw;     const GLuint nr_insns = c->vp->program.Base.NumInstructions;     GLuint insn, if_depth = 0, loop_depth = 0;     GLuint end_offset = 0; @@ -1492,8 +1512,8 @@ void brw_vs_emit(struct brw_vs_compile *c )        case OPCODE_IF:  	 assert(if_depth < MAX_IF_DEPTH);  	 if_inst[if_depth] = brw_IF(p, BRW_EXECUTE_8); -	 if_inst[if_depth]->header.predicate_control = -	    get_predicate(inst->DstReg.CondSwizzle); +	 /* Note that brw_IF smashes the predicate_control field. */ +	 if_inst[if_depth]->header.predicate_control = get_predicate(inst);  	 if_depth++;  	 break;        case OPCODE_ELSE: @@ -1503,45 +1523,48 @@ void brw_vs_emit(struct brw_vs_compile *c )           assert(if_depth > 0);  	 brw_ENDIF(p, if_inst[--if_depth]);  	 break;			 -#if 0        case OPCODE_BGNLOOP:           loop_inst[loop_depth++] = brw_DO(p, BRW_EXECUTE_8);           break;        case OPCODE_BRK: +	 brw_set_predicate_control(p, get_predicate(inst));           brw_BREAK(p); -         brw_set_predicate_control(p, BRW_PREDICATE_NONE); +	 brw_set_predicate_control(p, BRW_PREDICATE_NONE);           break;        case OPCODE_CONT: +	 brw_set_predicate_control(p, get_predicate(inst));           brw_CONT(p);           brw_set_predicate_control(p, BRW_PREDICATE_NONE);           break;        case OPCODE_ENDLOOP:            {              struct brw_instruction *inst0, *inst1; +	    GLuint br = 1; +              loop_depth--; + +	    if (BRW_IS_IGDNG(brw)) +	       br = 2; +              inst0 = inst1 = brw_WHILE(p, loop_inst[loop_depth]);              /* patch all the BREAK/CONT instructions from last BEGINLOOP */              while (inst0 > loop_inst[loop_depth]) {                 inst0--;                 if (inst0->header.opcode == BRW_OPCODE_BREAK) { -                  inst0->bits3.if_else.jump_count = inst1 - inst0 + 1; +                  inst0->bits3.if_else.jump_count = br * (inst1 - inst0 + 1);                    inst0->bits3.if_else.pop_count = 0;                 }                 else if (inst0->header.opcode == BRW_OPCODE_CONTINUE) { -                  inst0->bits3.if_else.jump_count = inst1 - inst0; +                  inst0->bits3.if_else.jump_count = br * (inst1 - inst0);                    inst0->bits3.if_else.pop_count = 0;                 }              }           }           break; -#else -         (void) loop_inst; -         (void) loop_depth; -#endif        case OPCODE_BRA: -         brw_set_predicate_control(p, BRW_PREDICATE_NORMAL); +	 brw_set_predicate_control(p, get_predicate(inst));           brw_ADD(p, brw_ip_reg(), brw_ip_reg(), brw_imm_d(1*16)); -         brw_set_predicate_control_flag_value(p, 0xff); +	 brw_set_predicate_control(p, BRW_PREDICATE_NONE);           break;        case OPCODE_CAL:  	 brw_set_access_mode(p, BRW_ALIGN_1); diff --git a/src/mesa/drivers/dri/i965/brw_wm.h b/src/mesa/drivers/dri/i965/brw_wm.h index ae98b5492d..872b1f3ecf 100644 --- a/src/mesa/drivers/dri/i965/brw_wm.h +++ b/src/mesa/drivers/dri/i965/brw_wm.h @@ -38,6 +38,8 @@  #include "brw_context.h"  #include "brw_eu.h" +#define SATURATE (1<<5) +  /* A big lookup table is used to figure out which and how many   * additional regs will inserted before the main payload in the WM   * program execution.  These mainly relate to depth and stencil @@ -203,7 +205,6 @@ struct brw_wm_compile {     GLuint fp_temp;     GLuint fp_interp_emitted;     GLuint fp_fragcolor_emitted; -   GLuint fp_deriv_emitted;     struct prog_src_register pixel_xy;     struct prog_src_register delta_xy; @@ -299,5 +300,10 @@ void brw_wm_lookup_iz( GLuint line_aa,  GLboolean brw_wm_is_glsl(const struct gl_fragment_program *fp);  void brw_wm_glsl_emit(struct brw_context *brw, struct brw_wm_compile *c); +void emit_ddxy(struct brw_compile *p, +	       const struct brw_reg *dst, +	       GLuint mask, +	       GLboolean is_ddx, +	       const struct brw_reg *arg0);  #endif diff --git a/src/mesa/drivers/dri/i965/brw_wm_emit.c b/src/mesa/drivers/dri/i965/brw_wm_emit.c index 268f7965c0..bf80a2942a 100644 --- a/src/mesa/drivers/dri/i965/brw_wm_emit.c +++ b/src/mesa/drivers/dri/i965/brw_wm_emit.c @@ -34,8 +34,6 @@  #include "brw_context.h"  #include "brw_wm.h" -#define SATURATE (1<<5) -  /* Not quite sure how correct this is - need to understand horiz   * vs. vertical strides a little better.   */ @@ -281,6 +279,79 @@ static void emit_frontfacing( struct brw_compile *p,     brw_set_predicate_control_flag_value(p, 0xff);  } +/* For OPCODE_DDX and OPCODE_DDY, per channel of output we've got input + * looking like: + * + * arg0: ss0.tl ss0.tr ss0.bl ss0.br ss1.tl ss1.tr ss1.bl ss1.br + * + * and we're trying to produce: + * + *           DDX                     DDY + * dst: (ss0.tr - ss0.tl)     (ss0.tl - ss0.bl) + *      (ss0.tr - ss0.tl)     (ss0.tr - ss0.br) + *      (ss0.br - ss0.bl)     (ss0.tl - ss0.bl) + *      (ss0.br - ss0.bl)     (ss0.tr - ss0.br) + *      (ss1.tr - ss1.tl)     (ss1.tl - ss1.bl) + *      (ss1.tr - ss1.tl)     (ss1.tr - ss1.br) + *      (ss1.br - ss1.bl)     (ss1.tl - ss1.bl) + *      (ss1.br - ss1.bl)     (ss1.tr - ss1.br) + * + * and add another set of two more subspans if in 16-pixel dispatch mode. + * + * For DDX, it ends up being easy: width = 2, horiz=0 gets us the same result + * for each pair, and vertstride = 2 jumps us 2 elements after processing a + * pair. But for DDY, it's harder, as we want to produce the pairs swizzled + * between each other.  We could probably do it like ddx and swizzle the right + * order later, but bail for now and just produce + * ((ss0.tl - ss0.bl)x4 (ss1.tl - ss1.bl)x4) + */ +void emit_ddxy(struct brw_compile *p, +	       const struct brw_reg *dst, +	       GLuint mask, +	       GLboolean is_ddx, +	       const struct brw_reg *arg0) +{ +   int i; +   struct brw_reg src0, src1; + +   if (mask & SATURATE) +      brw_set_saturate(p, 1); +   for (i = 0; i < 4; i++ ) { +      if (mask & (1<<i)) { +	 if (is_ddx) { +	    src0 = brw_reg(arg0[i].file, arg0[i].nr, 1, +			   BRW_REGISTER_TYPE_F, +			   BRW_VERTICAL_STRIDE_2, +			   BRW_WIDTH_2, +			   BRW_HORIZONTAL_STRIDE_0, +			   BRW_SWIZZLE_XYZW, WRITEMASK_XYZW); +	    src1 = brw_reg(arg0[i].file, arg0[i].nr, 0, +			   BRW_REGISTER_TYPE_F, +			   BRW_VERTICAL_STRIDE_2, +			   BRW_WIDTH_2, +			   BRW_HORIZONTAL_STRIDE_0, +			   BRW_SWIZZLE_XYZW, WRITEMASK_XYZW); +	 } else { +	    src0 = brw_reg(arg0[i].file, arg0[i].nr, 0, +			   BRW_REGISTER_TYPE_F, +			   BRW_VERTICAL_STRIDE_4, +			   BRW_WIDTH_4, +			   BRW_HORIZONTAL_STRIDE_0, +			   BRW_SWIZZLE_XYZW, WRITEMASK_XYZW); +	    src1 = brw_reg(arg0[i].file, arg0[i].nr, 2, +			   BRW_REGISTER_TYPE_F, +			   BRW_VERTICAL_STRIDE_4, +			   BRW_WIDTH_4, +			   BRW_HORIZONTAL_STRIDE_0, +			   BRW_SWIZZLE_XYZW, WRITEMASK_XYZW); +	 } +	 brw_ADD(p, dst[i], src0, negate(src1)); +      } +   } +   if (mask & SATURATE) +      brw_set_saturate(p, 0); +} +  static void emit_alu1( struct brw_compile *p,   		       struct brw_instruction *(*func)(struct brw_compile *,   						       struct brw_reg,  @@ -908,6 +979,20 @@ static void emit_kil( struct brw_wm_compile *c,     }  } +/* KIL_NV kills the pixels that are currently executing, not based on a test + * of the arguments. + */ +static void emit_kil_nv( struct brw_wm_compile *c ) +{ +   struct brw_compile *p = &c->func; +   struct brw_reg r0uw = retype(brw_vec1_grf(0, 0), BRW_REGISTER_TYPE_UW); + +   brw_push_insn_state(p); +   brw_set_mask_control(p, BRW_MASK_DISABLE); +   brw_NOT(p, c->emit_mask_reg, brw_mask_reg(1)); //IMASK +   brw_AND(p, r0uw, c->emit_mask_reg, r0uw); +   brw_pop_insn_state(p); +}  static void fire_fb_write( struct brw_wm_compile *c,  			   GLuint base_reg, @@ -1258,6 +1343,14 @@ void brw_wm_emit( struct brw_wm_compile *c )  	 emit_alu1(p, brw_RNDD, dst, dst_flags, args[0]);  	 break; +      case OPCODE_DDX: +	 emit_ddxy(p, dst, dst_flags, GL_TRUE, args[0]); +	 break; + +      case OPCODE_DDY: +	 emit_ddxy(p, dst, dst_flags, GL_FALSE, args[0]); +	 break; +        case OPCODE_DP3:  	 emit_dp3(p, dst, dst_flags, args[0], args[1]);  	 break; @@ -1387,6 +1480,10 @@ void brw_wm_emit( struct brw_wm_compile *c )  	 emit_kil(c, args[0]);  	 break; +      case OPCODE_KIL_NV: +	 emit_kil_nv(c); +	 break; +        default:  	 _mesa_printf("Unsupported opcode %i (%s) in fragment shader\n",  		      inst->opcode, inst->opcode < MAX_OPCODE ? diff --git a/src/mesa/drivers/dri/i965/brw_wm_fp.c b/src/mesa/drivers/dri/i965/brw_wm_fp.c index 123fe841c3..4e3edfbbff 100644 --- a/src/mesa/drivers/dri/i965/brw_wm_fp.c +++ b/src/mesa/drivers/dri/i965/brw_wm_fp.c @@ -494,38 +494,6 @@ static void emit_interp( struct brw_wm_compile *c,     c->fp_interp_emitted |= 1<<idx;  } -static void emit_ddx( struct brw_wm_compile *c, -        const struct prog_instruction *inst ) -{ -    GLuint idx = inst->SrcReg[0].Index; -    struct prog_src_register interp = src_reg(PROGRAM_PAYLOAD, idx); - -    c->fp_deriv_emitted |= 1<<idx; -    emit_op(c, -            OPCODE_DDX, -            inst->DstReg, -            0, -            interp, -            get_pixel_w(c), -            src_undef()); -} - -static void emit_ddy( struct brw_wm_compile *c, -        const struct prog_instruction *inst ) -{ -    GLuint idx = inst->SrcReg[0].Index; -    struct prog_src_register interp = src_reg(PROGRAM_PAYLOAD, idx); - -    c->fp_deriv_emitted |= 1<<idx; -    emit_op(c, -            OPCODE_DDY, -            inst->DstReg, -            0, -            interp, -            get_pixel_w(c), -            src_undef()); -} -  /***********************************************************************   * Hacks to extend the program parameter and constant lists.   */ @@ -1186,12 +1154,6 @@ void brw_wm_pass_fp( struct brw_wm_compile *c )  	  */  	 out->DstReg.WriteMask = 0;  	 break; -      case OPCODE_DDX: -	 emit_ddx(c, inst); -	 break; -      case OPCODE_DDY: -         emit_ddy(c, inst); -	break;        case OPCODE_END:  	 emit_fb_write(c);  	 break; diff --git a/src/mesa/drivers/dri/i965/brw_wm_glsl.c b/src/mesa/drivers/dri/i965/brw_wm_glsl.c index 7c210abbce..c9fe1dd8ad 100644 --- a/src/mesa/drivers/dri/i965/brw_wm_glsl.c +++ b/src/mesa/drivers/dri/i965/brw_wm_glsl.c @@ -22,6 +22,7 @@ static struct brw_reg get_dst_reg(struct brw_wm_compile *c,  GLboolean brw_wm_is_glsl(const struct gl_fragment_program *fp)  {      int i; +      for (i = 0; i < fp->Base.NumInstructions; i++) {  	const struct prog_instruction *inst = &fp->Base.Instructions[i];  	switch (inst->Opcode) { @@ -31,8 +32,6 @@ GLboolean brw_wm_is_glsl(const struct gl_fragment_program *fp)  	    case OPCODE_CAL:  	    case OPCODE_BRK:  	    case OPCODE_RET: -	    case OPCODE_DDX: -	    case OPCODE_DDY:  	    case OPCODE_NOISE1:  	    case OPCODE_NOISE2:  	    case OPCODE_NOISE3: @@ -293,7 +292,7 @@ static void prealloc_reg(struct brw_wm_compile *c)      int i, j;      struct brw_reg reg;      int urb_read_length = 0; -    GLuint inputs = FRAG_BIT_WPOS | c->fp_interp_emitted | c->fp_deriv_emitted; +    GLuint inputs = FRAG_BIT_WPOS | c->fp_interp_emitted;      GLuint reg_index = 0;      memset(c->used_grf, GL_FALSE, sizeof(c->used_grf)); @@ -1474,61 +1473,6 @@ static void emit_sne(struct brw_wm_compile *c,      emit_sop(c, inst, BRW_CONDITIONAL_NEQ);  } -static void emit_ddx(struct brw_wm_compile *c, -                     const struct prog_instruction *inst) -{ -    struct brw_compile *p = &c->func; -    GLuint mask = inst->DstReg.WriteMask; -    struct brw_reg interp[4]; -    struct brw_reg dst; -    struct brw_reg src0, w; -    GLuint nr, i; -    src0 = get_src_reg(c, inst, 0, 0); -    w = get_src_reg(c, inst, 1, 3); -    nr = src0.nr; -    interp[0] = brw_vec1_grf(nr, 0); -    interp[1] = brw_vec1_grf(nr, 4); -    interp[2] = brw_vec1_grf(nr+1, 0); -    interp[3] = brw_vec1_grf(nr+1, 4); -    brw_set_saturate(p, inst->SaturateMode != SATURATE_OFF); -    for(i = 0; i < 4; i++ ) { -        if (mask & (1<<i)) { -            dst = get_dst_reg(c, inst, i); -            brw_MOV(p, dst, interp[i]); -            brw_MUL(p, dst, dst, w); -        } -    } -    brw_set_saturate(p, 0); -} - -static void emit_ddy(struct brw_wm_compile *c, -                     const struct prog_instruction *inst) -{ -    struct brw_compile *p = &c->func; -    GLuint mask = inst->DstReg.WriteMask; -    struct brw_reg interp[4]; -    struct brw_reg dst; -    struct brw_reg src0, w; -    GLuint nr, i; - -    src0 = get_src_reg(c, inst, 0, 0); -    nr = src0.nr; -    w = get_src_reg(c, inst, 1, 3); -    interp[0] = brw_vec1_grf(nr, 0); -    interp[1] = brw_vec1_grf(nr, 4); -    interp[2] = brw_vec1_grf(nr+1, 0); -    interp[3] = brw_vec1_grf(nr+1, 4); -    brw_set_saturate(p, inst->SaturateMode != SATURATE_OFF); -    for(i = 0; i < 4; i++ ) { -        if (mask & (1<<i)) { -            dst = get_dst_reg(c, inst, i); -            brw_MOV(p, dst, suboffset(interp[i], 1)); -            brw_MUL(p, dst, dst, w); -        } -    } -    brw_set_saturate(p, 0); -} -  static INLINE struct brw_reg high_words( struct brw_reg reg )  {      return stride( suboffset( retype( reg, BRW_REGISTER_TYPE_W ), 1 ), @@ -2780,6 +2724,21 @@ static void post_wm_emit( struct brw_wm_compile *c )      brw_resolve_cals(&c->func);  } +static void +get_argument_regs(struct brw_wm_compile *c, +		  const struct prog_instruction *inst, +		  int index, +		  struct brw_reg *regs, +		  int mask) +{ +    int i; + +    for (i = 0; i < 4; i++) { +	if (mask & (1 << i)) +	    regs[i] = get_src_reg(c, inst, index, i); +    } +} +  static void brw_wm_emit_glsl(struct brw_context *brw, struct brw_wm_compile *c)  {  #define MAX_IF_DEPTH 32 @@ -2797,6 +2756,9 @@ static void brw_wm_emit_glsl(struct brw_context *brw, struct brw_wm_compile *c)      for (i = 0; i < c->nr_fp_insns; i++) {          const struct prog_instruction *inst = &c->prog_instructions[i]; +	int dst_flags; +	struct brw_reg args[3][4], dst[4]; +	int j;          c->cur_inst = i; @@ -2814,6 +2776,10 @@ static void brw_wm_emit_glsl(struct brw_context *brw, struct brw_wm_compile *c)  	else  	    brw_set_conditionalmod(p, BRW_CONDITIONAL_NONE); +	dst_flags = inst->DstReg.WriteMask; +	if (inst->SaturateMode == SATURATE_ZERO_ONE) +	    dst_flags |= SATURATE; +  	switch (inst->Opcode) {  	    case WM_PIXELXY:  		emit_pixel_xy(c, inst); @@ -2899,10 +2865,16 @@ static void brw_wm_emit_glsl(struct brw_context *brw, struct brw_wm_compile *c)  		emit_min_max(c, inst);  		break;  	    case OPCODE_DDX: -		emit_ddx(c, inst); -		break;  	    case OPCODE_DDY: -                emit_ddy(c, inst); +		for (j = 0; j < 4; j++) { +		    if (inst->DstReg.WriteMask & (1 << j)) +			dst[j] = get_dst_reg(c, inst, j); +		    else +			dst[j] = brw_null_reg(); +		} +		get_argument_regs(c, inst, 0, args[0], WRITEMASK_XYZW); +		emit_ddxy(p, dst, dst_flags, (inst->Opcode == OPCODE_DDX), +			  args[0]);                  break;  	    case OPCODE_SLT:  		emit_slt(c, inst); diff --git a/src/mesa/drivers/dri/i965/brw_wm_pass1.c b/src/mesa/drivers/dri/i965/brw_wm_pass1.c index 3436a24717..b449394029 100644 --- a/src/mesa/drivers/dri/i965/brw_wm_pass1.c +++ b/src/mesa/drivers/dri/i965/brw_wm_pass1.c @@ -178,6 +178,11 @@ void brw_wm_pass1( struct brw_wm_compile *c )  	 read1 = writemask;  	 break; +      case OPCODE_DDX: +      case OPCODE_DDY: +	 read0 = writemask; +	 break; +        case OPCODE_MAD:	        case OPCODE_CMP:        case OPCODE_LRP: @@ -270,6 +275,7 @@ void brw_wm_pass1( struct brw_wm_compile *c )        case OPCODE_DST:        case WM_FRONTFACING: +      case OPCODE_KIL_NV:        default:  	 break;        } diff --git a/src/mesa/drivers/dri/i965/brw_wm_state.c b/src/mesa/drivers/dri/i965/brw_wm_state.c index 39f8c6d522..361f91292b 100644 --- a/src/mesa/drivers/dri/i965/brw_wm_state.c +++ b/src/mesa/drivers/dri/i965/brw_wm_state.c @@ -107,6 +107,12 @@ wm_unit_populate_key(struct brw_context *brw, struct brw_wm_unit_key *key)     /* as far as we can tell */     key->computes_depth =        (fp->Base.OutputsWritten & (1 << FRAG_RESULT_DEPTH)) != 0; +   /* BRW_NEW_DEPTH_BUFFER +    * Override for NULL depthbuffer case, required by the Pixel Shader Computed +    * Depth field. +    */ +   if (brw->state.depth_region == NULL) +      key->computes_depth = 0;     /* _NEW_COLOR */     key->uses_kill = fp->UsesKill || ctx->Color.AlphaEnabled; @@ -300,6 +306,7 @@ const struct brw_tracked_state brw_wm_unit = {        .brw = (BRW_NEW_FRAGMENT_PROGRAM |   	      BRW_NEW_CURBE_OFFSETS | +	      BRW_NEW_DEPTH_BUFFER |  	      BRW_NEW_NR_WM_SURFACES),        .cache = (CACHE_NEW_WM_PROG | 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 3dcc592bde..51539ac1e7 100644 --- a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c +++ b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c @@ -545,15 +545,20 @@ brw_update_renderbuffer_surface(struct brw_context *brw,  		       irb->texformat->MesaFormat);        }        key.tiling = region->tiling; -      key.width = region->width; -      key.height = region->height; +      if (brw->intel.intelScreen->driScrnPriv->dri2.enabled) { +	 key.width = rb->Width; +	 key.height = rb->Height; +      } else { +	 key.width = region->width; +	 key.height = region->height; +      }        key.pitch = region->pitch;        key.cpp = region->cpp;        key.draw_offset = region->draw_offset; /* cur 3d or cube face offset */     } else {        key.surface_type = BRW_SURFACE_NULL;        key.surface_format = BRW_SURFACEFORMAT_B8G8R8A8_UNORM; -      key.tiling = 0; +      key.tiling = I915_TILING_X;        key.width = 1;        key.height = 1;        key.cpp = 4; diff --git a/src/mesa/drivers/dri/intel/intel_blit.c b/src/mesa/drivers/dri/intel/intel_blit.c index 0c5be4c798..43141c509c 100644 --- a/src/mesa/drivers/dri/intel/intel_blit.c +++ b/src/mesa/drivers/dri/intel/intel_blit.c @@ -26,9 +26,6 @@   **************************************************************************/ -#include <stdio.h> -#include <errno.h> -  #include "main/mtypes.h"  #include "main/context.h"  #include "main/enums.h" diff --git a/src/mesa/drivers/dri/intel/intel_context.c b/src/mesa/drivers/dri/intel/intel_context.c index 3dffc82445..ab1cf40387 100644 --- a/src/mesa/drivers/dri/intel/intel_context.c +++ b/src/mesa/drivers/dri/intel/intel_context.c @@ -38,7 +38,6 @@  #include "swrast_setup/swrast_setup.h"  #include "tnl/tnl.h"  #include "drivers/common/driverfuncs.h" -#include "drivers/common/meta.h"  #include "i830_dri.h" @@ -587,11 +586,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); @@ -644,10 +638,6 @@ intelInitContext(struct intel_context *intel,        intel->maxBatchSize = BATCH_SZ;     intel->bufmgr = intelScreen->bufmgr; - -   if (0) /* for debug */ -      drm_intel_bufmgr_set_debug(intel->bufmgr, 1); -     intel->ttm = intelScreen->ttm;     if (intel->ttm) {        int bo_reuse_mode; @@ -721,8 +711,6 @@ intelInitContext(struct intel_context *intel,     _swrast_allow_pixel_fog(ctx, GL_FALSE);     _swrast_allow_vertex_fog(ctx, GL_TRUE); -   _mesa_meta_init(ctx); -     intel->hw_stencil = mesaVis->stencilBits && mesaVis->depthBits == 24;     intel->hw_stipple = 1; @@ -826,8 +814,6 @@ intelDestroyContext(__DRIcontextPrivate * driContextPriv)        INTEL_FIREVERTICES(intel); -      _mesa_meta_free(&intel->ctx); -        meta_destroy_metaops(&intel->meta);        intel->vtbl.destroy(intel); diff --git a/src/mesa/drivers/dri/intel/intel_extensions.c b/src/mesa/drivers/dri/intel/intel_extensions.c index 2e61c556d8..5431cf90a1 100644 --- a/src/mesa/drivers/dri/intel/intel_extensions.c +++ b/src/mesa/drivers/dri/intel/intel_extensions.c @@ -31,6 +31,7 @@  #define need_GL_ARB_copy_buffer +#define need_GL_ARB_draw_elements_base_vertex  #define need_GL_ARB_framebuffer_object  #define need_GL_ARB_map_buffer_range  #define need_GL_ARB_occlusion_query @@ -73,6 +74,7 @@   */  static const struct dri_extension card_extensions[] = {     { "GL_ARB_copy_buffer",                GL_ARB_copy_buffer_functions }, +   { "GL_ARB_draw_elements_base_vertex",  GL_ARB_draw_elements_base_vertex_functions },     { "GL_ARB_half_float_pixel",           NULL },     { "GL_ARB_map_buffer_range",           GL_ARB_map_buffer_range_functions },     { "GL_ARB_multitexture",               NULL }, @@ -139,6 +141,7 @@ static const struct dri_extension i915_extensions[] = {  /** i965-only extensions */  static const struct dri_extension brw_extensions[] = { +   { "GL_ARB_depth_clamp",                NULL },     { "GL_ARB_depth_texture",              NULL },     { "GL_ARB_fragment_program",           NULL },     { "GL_ARB_fragment_program_shadow",    NULL }, diff --git a/src/mesa/drivers/dri/intel/intel_fbo.c b/src/mesa/drivers/dri/intel/intel_fbo.c index 804c034840..8dfb24290d 100644 --- a/src/mesa/drivers/dri/intel/intel_fbo.c +++ b/src/mesa/drivers/dri/intel/intel_fbo.c @@ -715,5 +715,5 @@ intel_fbo_init(struct intel_context *intel)     intel->ctx.Driver.FinishRenderTexture = intel_finish_render_texture;     intel->ctx.Driver.ResizeBuffers = intel_resize_buffers;     intel->ctx.Driver.ValidateFramebuffer = intel_validate_framebuffer; -   intel->ctx.Driver.BlitFramebuffer = _mesa_meta_blit_framebuffer; +   intel->ctx.Driver.BlitFramebuffer = _mesa_meta_BlitFramebuffer;  } 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_pixel_bitmap.c b/src/mesa/drivers/dri/intel/intel_pixel_bitmap.c index b543a0bbc3..9a0bcc07a5 100644 --- a/src/mesa/drivers/dri/intel/intel_pixel_bitmap.c +++ b/src/mesa/drivers/dri/intel/intel_pixel_bitmap.c @@ -209,7 +209,7 @@ do_blit_bitmap( GLcontext *ctx,     if (!dst)         return GL_FALSE; -   if (unpack->BufferObj->Name) { +   if (_mesa_is_bufferobj(unpack->BufferObj)) {        bitmap = map_pbo(ctx, width, height, unpack, bitmap);        if (bitmap == NULL)  	 return GL_TRUE;	/* even though this is an error, we're done */ @@ -329,7 +329,7 @@ out:     if (INTEL_DEBUG & DEBUG_SYNC)        intel_batchbuffer_flush(intel->batch); -   if (unpack->BufferObj->Name) { +   if (_mesa_is_bufferobj(unpack->BufferObj)) {        /* done with PBO so unmap it now */        ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT,                                unpack->BufferObj); @@ -418,7 +418,7 @@ intel_texture_bitmap(GLcontext * ctx,        return GL_FALSE;     } -   if (unpack->BufferObj->Name) { +   if (_mesa_is_bufferobj(unpack->BufferObj)) {        bitmap = map_pbo(ctx, width, height, unpack, bitmap);        if (bitmap == NULL)  	 return GL_TRUE;	/* even though this is an error, we're done */ @@ -428,7 +428,7 @@ intel_texture_bitmap(GLcontext * ctx,     a8_bitmap = _mesa_calloc(width * height);     _mesa_expand_bitmap(width, height, unpack, bitmap, a8_bitmap, width, 0xff); -   if (unpack->BufferObj->Name) { +   if (_mesa_is_bufferobj(unpack->BufferObj)) {        /* done with PBO so unmap it now */        ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT,                                unpack->BufferObj); diff --git a/src/mesa/drivers/dri/intel/intel_pixel_copy.c b/src/mesa/drivers/dri/intel/intel_pixel_copy.c index 07ca8f7ddb..f058b3c8e4 100644 --- a/src/mesa/drivers/dri/intel/intel_pixel_copy.c +++ b/src/mesa/drivers/dri/intel/intel_pixel_copy.c @@ -240,5 +240,5 @@ intelCopyPixels(GLcontext * ctx,        return;     /* this will use swrast if needed */ -   _mesa_meta_copy_pixels(ctx, srcx, srcy, width, height, destx, desty, type); +   _mesa_meta_CopyPixels(ctx, srcx, srcy, width, height, destx, desty, type);  } diff --git a/src/mesa/drivers/dri/intel/intel_pixel_draw.c b/src/mesa/drivers/dri/intel/intel_pixel_draw.c index 7fbb89fd6a..5ffa847fd4 100644 --- a/src/mesa/drivers/dri/intel/intel_pixel_draw.c +++ b/src/mesa/drivers/dri/intel/intel_pixel_draw.c @@ -54,7 +54,7 @@  #include "intel_fbo.h" -/** XXX compare perf of this vs. _mesa_meta_draw_pixels(STENCIL) */ +/** XXX compare perf of this vs. _mesa_meta_DrawPixels(STENCIL) */  static GLboolean  intel_stencil_drawpixels(GLcontext * ctx,  			 GLint x, GLint y, @@ -265,7 +265,7 @@ intelDrawPixels(GLcontext * ctx,     /* XXX this function doesn't seem to work reliably even when all      * the pre-requisite conditions are met.      * Note that this function is never hit with conform. -    * Fall back to swrast because even the _mesa_meta_draw_pixels() approach +    * Fall back to swrast because even the _mesa_meta_DrawPixels() approach      * isn't working because of an apparent stencil bug.      */     if (intel_stencil_drawpixels(ctx, x, y, width, height, format, type, @@ -280,6 +280,6 @@ intelDrawPixels(GLcontext * ctx,     }  #endif -   _mesa_meta_draw_pixels(ctx, x, y, width, height, format, type, -                          unpack, pixels); +   _mesa_meta_DrawPixels(ctx, x, y, width, height, format, type, +                         unpack, pixels);  } diff --git a/src/mesa/drivers/dri/intel/intel_pixel_read.c b/src/mesa/drivers/dri/intel/intel_pixel_read.c index 8713463ace..bc67f6242a 100644 --- a/src/mesa/drivers/dri/intel/intel_pixel_read.c +++ b/src/mesa/drivers/dri/intel/intel_pixel_read.c @@ -180,16 +180,7 @@ do_blit_readpixels(GLcontext * ctx,     if (!src)        return GL_FALSE; -   if (pack->BufferObj->Name) { -      /* XXX This validation should be done by core mesa: -       */ -      if (!_mesa_validate_pbo_access(2, pack, width, height, 1, -                                     format, type, pixels)) { -         _mesa_error(ctx, GL_INVALID_OPERATION, "glDrawPixels"); -         return GL_TRUE; -      } -   } -   else { +   if (!_mesa_is_bufferobj(pack->BufferObj)) {        /* PBO only for now:         */        if (INTEL_DEBUG & DEBUG_PIXEL) diff --git a/src/mesa/drivers/dri/intel/intel_span.c b/src/mesa/drivers/dri/intel/intel_span.c index 8df4990880..28eabbc005 100644 --- a/src/mesa/drivers/dri/intel/intel_span.c +++ b/src/mesa/drivers/dri/intel/intel_span.c @@ -444,23 +444,30 @@ intel_renderbuffer_unmap(struct intel_context *intel,   * _ColorReadBuffer, _DepthBuffer or _StencilBuffer fields.   */  static void -intel_map_unmap_buffers(struct intel_context *intel, GLboolean map) +intel_map_unmap_framebuffer(struct intel_context *intel, +			    struct gl_framebuffer *fb, +			    GLboolean map)  { -   GLcontext *ctx = &intel->ctx; -   GLuint i, j; +   GLuint i;     /* color draw buffers */ -   for (j = 0; j < ctx->DrawBuffer->_NumColorDrawBuffers; j++) { +   for (i = 0; i < fb->_NumColorDrawBuffers; i++) {        if (map) -	 intel_renderbuffer_map(intel, ctx->DrawBuffer->_ColorDrawBuffers[j]); +         intel_renderbuffer_map(intel, fb->_ColorDrawBuffers[i]);        else -	 intel_renderbuffer_unmap(intel, ctx->DrawBuffer->_ColorDrawBuffers[j]); +         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 = -         ctx->DrawBuffer->Attachment + i; +         fb->Attachment + i;        struct gl_texture_object *tex = att->Texture;        if (tex) {           /* render to texture */ @@ -472,34 +479,23 @@ intel_map_unmap_buffers(struct intel_context *intel, GLboolean map)        }     } -   /* color read buffers */ -   if (map) -      intel_renderbuffer_map(intel, ctx->ReadBuffer->_ColorReadBuffer); -   else -      intel_renderbuffer_unmap(intel, ctx->ReadBuffer->_ColorReadBuffer); -     /* depth buffer (Note wrapper!) */ -   if (ctx->DrawBuffer->_DepthBuffer) { +   if (fb->_DepthBuffer) {        if (map) -	 intel_renderbuffer_map(intel, ctx->DrawBuffer->_DepthBuffer->Wrapped); +         intel_renderbuffer_map(intel, fb->_DepthBuffer->Wrapped);        else -	 intel_renderbuffer_unmap(intel, -				  ctx->DrawBuffer->_DepthBuffer->Wrapped); +         intel_renderbuffer_unmap(intel, fb->_DepthBuffer->Wrapped);     }     /* stencil buffer (Note wrapper!) */ -   if (ctx->DrawBuffer->_StencilBuffer) { +   if (fb->_StencilBuffer) {        if (map) -	 intel_renderbuffer_map(intel, -				ctx->DrawBuffer->_StencilBuffer->Wrapped); +         intel_renderbuffer_map(intel, fb->_StencilBuffer->Wrapped);        else -	 intel_renderbuffer_unmap(intel, -				  ctx->DrawBuffer->_StencilBuffer->Wrapped); +         intel_renderbuffer_unmap(intel, fb->_StencilBuffer->Wrapped);     }  } - -  /**   * Prepare for software rendering.  Map current read/draw framebuffers'   * renderbuffes and all currently bound texture objects. @@ -522,7 +518,9 @@ intelSpanRenderStart(GLcontext * ctx)        }     } -   intel_map_unmap_buffers(intel, GL_TRUE); +   intel_map_unmap_framebuffer(intel, ctx->DrawBuffer, GL_TRUE); +   if (ctx->ReadBuffer != ctx->DrawBuffer) +      intel_map_unmap_framebuffer(intel, ctx->ReadBuffer, GL_TRUE);  }  /** @@ -544,7 +542,9 @@ intelSpanRenderFinish(GLcontext * ctx)        }     } -   intel_map_unmap_buffers(intel, GL_FALSE); +   intel_map_unmap_framebuffer(intel, ctx->DrawBuffer, GL_FALSE); +   if (ctx->ReadBuffer != ctx->DrawBuffer) +      intel_map_unmap_framebuffer(intel, ctx->ReadBuffer, GL_FALSE);     UNLOCK_HARDWARE(intel);  } @@ -711,6 +711,9 @@ intel_set_span_functions(struct intel_context *intel,  	    intel_YTile_InitStencilPointers_z24_s8(rb);  	    break;  	 } +      } else { +	 _mesa_problem(NULL, +		       "Unexpected ActualFormat in intelSetSpanFunctions");        }        break;     default: diff --git a/src/mesa/drivers/dri/intel/intel_tex_copy.c b/src/mesa/drivers/dri/intel/intel_tex_copy.c index 028b49c14d..ac557a9200 100644 --- a/src/mesa/drivers/dri/intel/intel_tex_copy.c +++ b/src/mesa/drivers/dri/intel/intel_tex_copy.c @@ -30,7 +30,8 @@  #include "main/image.h"  #include "main/teximage.h"  #include "main/mipmap.h" -#include "swrast/swrast.h" + +#include "drivers/common/meta.h"  #include "intel_screen.h"  #include "intel_context.h" @@ -90,7 +91,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 +170,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;  } @@ -221,8 +216,8 @@ intelCopyTexImage1D(GLcontext * ctx, GLenum target, GLint level,     return;   fail: -   _swrast_copy_teximage1d(ctx, target, level, internalFormat, x, y, -                           width, border); +   _mesa_meta_CopyTexImage1D(ctx, target, level, internalFormat, x, y, +                             width, border);  } @@ -269,8 +264,8 @@ intelCopyTexImage2D(GLcontext * ctx, GLenum target, GLint level,     return;   fail: -   _swrast_copy_teximage2d(ctx, target, level, internalFormat, x, y, -                           width, height, border); +   _mesa_meta_CopyTexImage2D(ctx, target, level, internalFormat, x, y, +                             width, height, border);  } @@ -294,7 +289,7 @@ intelCopyTexSubImage1D(GLcontext * ctx, GLenum target, GLint level,     if (!do_copy_texsubimage(intel_context(ctx), target,                              intel_texture_image(texImage),                              internalFormat, xoffset, 0, x, y, width, 1)) { -      _swrast_copy_texsubimage1d(ctx, target, level, xoffset, x, y, width); +      _mesa_meta_CopyTexSubImage1D(ctx, target, level, xoffset, x, y, width);     }  } @@ -320,10 +315,10 @@ intelCopyTexSubImage2D(GLcontext * ctx, GLenum target, GLint level,                              internalFormat,                              xoffset, yoffset, x, y, width, height)) { -      DBG("%s - fallback to swrast\n", __FUNCTION__); +      DBG("%s - fallback to _mesa_meta_CopyTexSubImage2D\n", __FUNCTION__); -      _swrast_copy_texsubimage2d(ctx, target, level, -                                 xoffset, yoffset, x, y, width, height); +      _mesa_meta_CopyTexSubImage2D(ctx, target, level, +                                   xoffset, yoffset, x, y, width, height);     }  } diff --git a/src/mesa/drivers/dri/intel/intel_tex_image.c b/src/mesa/drivers/dri/intel/intel_tex_image.c index c5f5220837..66201b1f46 100644 --- a/src/mesa/drivers/dri/intel/intel_tex_image.c +++ b/src/mesa/drivers/dri/intel/intel_tex_image.c @@ -1,15 +1,11 @@ -#include <stdlib.h> -#include <stdio.h> -  #include "main/glheader.h"  #include "main/macros.h"  #include "main/mtypes.h"  #include "main/enums.h" -#include "main/colortab.h" +#include "main/bufferobj.h"  #include "main/convolve.h"  #include "main/context.h" -#include "main/simple_list.h"  #include "main/texcompress.h"  #include "main/texformat.h"  #include "main/texgetimage.h" @@ -206,7 +202,7 @@ try_pbo_upload(struct intel_context *intel,     GLuint src_offset, src_stride;     GLuint dst_offset, dst_stride; -   if (unpack->BufferObj->Name == 0 || +   if (!_mesa_is_bufferobj(unpack->BufferObj) ||         intel->ctx._ImageTransferState ||         unpack->SkipPixels || unpack->SkipRows) {        DBG("%s: failure 1\n", __FUNCTION__); @@ -264,7 +260,7 @@ try_pbo_zcopy(struct intel_context *intel,     GLuint src_offset, src_stride;     GLuint dst_offset, dst_stride; -   if (unpack->BufferObj->Name == 0 || +   if (!_mesa_is_bufferobj(unpack->BufferObj) ||         intel->ctx._ImageTransferState ||         unpack->SkipPixels || unpack->SkipRows) {        DBG("%s: failure 1\n", __FUNCTION__); @@ -427,7 +423,7 @@ intelTexImage(GLcontext * ctx,      */     if (dims <= 2 &&         intelImage->mt && -       unpack->BufferObj->Name != 0 && +       _mesa_is_bufferobj(unpack->BufferObj) &&         check_pbo_format(internalFormat, format,                          type, intelImage->base.TexFormat)) { @@ -550,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/r300_cmdbuf.c b/src/mesa/drivers/dri/r300/r300_cmdbuf.c index 0fe32a5443..da5b7ba642 100644 --- a/src/mesa/drivers/dri/r300/r300_cmdbuf.c +++ b/src/mesa/drivers/dri/r300/r300_cmdbuf.c @@ -684,11 +684,7 @@ void r300InitCmdBuf(r300ContextPtr r300)  	r300->hw.rb3d_dither_ctl.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_RB3D_DITHER_CTL, 9);  	ALLOC_STATE(rb3d_aaresolve_ctl, always, 2, 0);  	r300->hw.rb3d_aaresolve_ctl.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_RB3D_AARESOLVE_CTL, 1); -	if ((r300->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515) || -	      ( !r300->radeon.radeonScreen->kernel_mm && ( -	    (r300->radeon.radeonScreen->chip_family == CHIP_FAMILY_RS400) || -	    (r300->radeon.radeonScreen->chip_family == CHIP_FAMILY_RV410) || -	    (r300->radeon.radeonScreen->chip_family == CHIP_FAMILY_R420) ) ) ) { +	if (r300->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV350) {  		ALLOC_STATE(rb3d_discard_src_pixel_lte_threshold, always, 3, 0);  	} else {  		ALLOC_STATE(rb3d_discard_src_pixel_lte_threshold, never, 3, 0); @@ -697,6 +693,14 @@ void r300InitCmdBuf(r300ContextPtr r300)  	ALLOC_STATE(zs, always, R300_ZS_CMDSIZE, 0);  	r300->hw.zs.cmd[R300_ZS_CMD_0] =  	    cmdpacket0(r300->radeon.radeonScreen, R300_ZB_CNTL, 3); +	if (is_r500) { +		if (r300->radeon.radeonScreen->kernel_mm) +			ALLOC_STATE(zsb, always, R300_ZSB_CMDSIZE, 0); +		else +			ALLOC_STATE(zsb, never, R300_ZSB_CMDSIZE, 0); +		r300->hw.zsb.cmd[R300_ZSB_CMD_0] = +			cmdpacket0(r300->radeon.radeonScreen, R500_ZB_STENCILREFMASK_BF, 1); +	}  	ALLOC_STATE(zstencil_format, always, 5, 0);  	r300->hw.zstencil_format.cmd[0] = diff --git a/src/mesa/drivers/dri/r300/r300_context.c b/src/mesa/drivers/dri/r300/r300_context.c index 2ea1b826de..6fcf209af6 100644 --- a/src/mesa/drivers/dri/r300/r300_context.c +++ b/src/mesa/drivers/dri/r300/r300_context.c @@ -84,6 +84,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  #define need_GL_EXT_framebuffer_object  #define need_GL_EXT_fog_coord  #define need_GL_EXT_gpu_program_parameters +#define need_GL_EXT_provoking_vertex  #define need_GL_EXT_secondary_color  #define need_GL_EXT_stencil_two_side  #define need_GL_ATI_separate_stencil @@ -116,6 +117,7 @@ const struct dri_extension card_extensions[] = {    {"GL_EXT_packed_depth_stencil",	NULL},    {"GL_EXT_fog_coord",			GL_EXT_fog_coord_functions },    {"GL_EXT_gpu_program_parameters",     GL_EXT_gpu_program_parameters_functions}, +  {"GL_EXT_provoking_vertex",           GL_EXT_provoking_vertex_functions },    {"GL_EXT_secondary_color", 		GL_EXT_secondary_color_functions},    {"GL_EXT_shadow_funcs",		NULL},    {"GL_EXT_stencil_two_side",		GL_EXT_stencil_two_side_functions}, diff --git a/src/mesa/drivers/dri/r300/r300_context.h b/src/mesa/drivers/dri/r300/r300_context.h index 1dadcc0a69..518d5cdbf4 100644 --- a/src/mesa/drivers/dri/r300/r300_context.h +++ b/src/mesa/drivers/dri/r300/r300_context.h @@ -234,6 +234,10 @@ typedef struct r300_context *r300ContextPtr;  #define R300_ZS_CNTL_2		3  #define R300_ZS_CMDSIZE		4 +#define R300_ZSB_CMD_0		0 +#define R300_ZSB_CNTL_0		1 +#define R300_ZSB_CMDSIZE	2 +  #define R300_ZB_CMD_0		0  #define R300_ZB_OFFSET		1  #define R300_ZB_PITCH		2 @@ -343,6 +347,7 @@ struct r300_hw_state {  	struct radeon_state_atom rb3d_aaresolve_ctl;	/* (4E88) */  	struct radeon_state_atom rb3d_discard_src_pixel_lte_threshold;	/* (4E88) I saw it only written on RV350 hardware..  */  	struct radeon_state_atom zs;	/* zstencil control (4F00) */ +	struct radeon_state_atom zsb;	/* zstencil bf */  	struct radeon_state_atom zstencil_format;  	struct radeon_state_atom zb;	/* z buffer (4F20) */  	struct radeon_state_atom zb_depthclearvalue;	/* (4F28) */ diff --git a/src/mesa/drivers/dri/r300/r300_reg.h b/src/mesa/drivers/dri/r300/r300_reg.h index 39b4b61a10..b9ccd098dc 100644 --- a/src/mesa/drivers/dri/r300/r300_reg.h +++ b/src/mesa/drivers/dri/r300/r300_reg.h @@ -1022,15 +1022,13 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.  	R300_GA_COLOR_CONTROL_RGB0_SHADING_GOURAUD | R300_GA_COLOR_CONTROL_ALPHA0_SHADING_GOURAUD | \  	R300_GA_COLOR_CONTROL_RGB1_SHADING_GOURAUD | R300_GA_COLOR_CONTROL_ALPHA1_SHADING_GOURAUD | \  	R300_GA_COLOR_CONTROL_RGB2_SHADING_GOURAUD | R300_GA_COLOR_CONTROL_ALPHA2_SHADING_GOURAUD | \ -	R300_GA_COLOR_CONTROL_RGB3_SHADING_GOURAUD | R300_GA_COLOR_CONTROL_ALPHA3_SHADING_GOURAUD | \ -	R300_GA_COLOR_CONTROL_PROVOKING_VERTEX_LAST ) +	R300_GA_COLOR_CONTROL_RGB3_SHADING_GOURAUD | R300_GA_COLOR_CONTROL_ALPHA3_SHADING_GOURAUD)  /** TODO: might be candidate for removal, the GOURAUD stuff also looks buggy to me */  #	define R300_RE_SHADE_MODEL_FLAT     ( \  	R300_GA_COLOR_CONTROL_RGB0_SHADING_FLAT | R300_GA_COLOR_CONTROL_ALPHA0_SHADING_FLAT | \  	R300_GA_COLOR_CONTROL_RGB1_SHADING_FLAT | R300_GA_COLOR_CONTROL_ALPHA1_SHADING_GOURAUD | \  	R300_GA_COLOR_CONTROL_RGB2_SHADING_FLAT | R300_GA_COLOR_CONTROL_ALPHA2_SHADING_FLAT | \ -	R300_GA_COLOR_CONTROL_RGB3_SHADING_FLAT | R300_GA_COLOR_CONTROL_ALPHA3_SHADING_GOURAUD | \ -	R300_GA_COLOR_CONTROL_PROVOKING_VERTEX_LAST ) +	R300_GA_COLOR_CONTROL_RGB3_SHADING_FLAT | R300_GA_COLOR_CONTROL_ALPHA3_SHADING_GOURAUD)  /* Specifies red & green components of fill color -- S312 format -- Backwards comp. */  #define R300_GA_SOLID_RG                         0x427c @@ -2315,6 +2313,8 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.  #	define R300_Z_WRITE_ENABLE		 (1 << 2)  #	define R300_Z_SIGNED_COMPARE		 (1 << 3)  #	define R300_STENCIL_FRONT_BACK		 (1 << 4) +#	define R400_ZSIGNED_MAGNITUDE		 (1 << 5) +#	define R500_STENCIL_REFMASK_FRONT_BACK	 (1 << 6)  #define R300_ZB_ZSTENCILCNTL                   0x4f04  	/* functions */ diff --git a/src/mesa/drivers/dri/r300/r300_state.c b/src/mesa/drivers/dri/r300/r300_state.c index 9301543d38..3060f49aaf 100644 --- a/src/mesa/drivers/dri/r300/r300_state.c +++ b/src/mesa/drivers/dri/r300/r300_state.c @@ -590,7 +590,9 @@ static void r300SetDepthState(GLcontext * ctx)  	r300ContextPtr r300 = R300_CONTEXT(ctx);  	R300_STATECHANGE(r300, zs); -	r300->hw.zs.cmd[R300_ZS_CNTL_0] &= R300_STENCIL_ENABLE|R300_STENCIL_FRONT_BACK; +	r300->hw.zs.cmd[R300_ZS_CNTL_0] &= (R300_STENCIL_ENABLE | +					    R300_STENCIL_FRONT_BACK | +					    R500_STENCIL_REFMASK_FRONT_BACK);  	r300->hw.zs.cmd[R300_ZS_CNTL_1] &= ~(R300_ZS_MASK << R300_Z_FUNC_SHIFT);  	if (ctx->Depth.Test) { @@ -604,11 +606,16 @@ static void r300SetDepthState(GLcontext * ctx)  static void r300CatchStencilFallback(GLcontext *ctx)  { +	r300ContextPtr rmesa = R300_CONTEXT(ctx);  	const unsigned back = ctx->Stencil._BackFace; -	if (ctx->Stencil._Enabled && (ctx->Stencil.Ref[0] != ctx->Stencil.Ref[back] -		|| ctx->Stencil.ValueMask[0] != ctx->Stencil.ValueMask[back] -		|| ctx->Stencil.WriteMask[0] != ctx->Stencil.WriteMask[back])) { +	if (rmesa->radeon.radeonScreen->kernel_mm && +	    (rmesa->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515)) { +		r300SwitchFallback(ctx, R300_FALLBACK_STENCIL_TWOSIDE, GL_FALSE); +	} else if (ctx->Stencil._Enabled && +		   (ctx->Stencil.Ref[0] != ctx->Stencil.Ref[back] +		    || ctx->Stencil.ValueMask[0] != ctx->Stencil.ValueMask[back] +		    || ctx->Stencil.WriteMask[0] != ctx->Stencil.WriteMask[back])) {  		r300SwitchFallback(ctx, R300_FALLBACK_STENCIL_TWOSIDE, GL_TRUE);  	} else {  		r300SwitchFallback(ctx, R300_FALLBACK_STENCIL_TWOSIDE, GL_FALSE); @@ -915,11 +922,24 @@ static void r300StencilFuncSeparate(GLcontext * ctx, GLenum face,  	rmesa->hw.zs.cmd[R300_ZS_CNTL_1] |=  	    (flag << R300_S_BACK_FUNC_SHIFT);  	rmesa->hw.zs.cmd[R300_ZS_CNTL_2] |= refmask; + +	if (rmesa->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515) { +		rmesa->hw.zs.cmd[R300_ZS_CNTL_0] |= R500_STENCIL_REFMASK_FRONT_BACK; +		R300_STATECHANGE(rmesa, zsb); +		refmask = ((ctx->Stencil.Ref[back] & 0xff) << R300_STENCILREF_SHIFT) +			| ((ctx->Stencil.ValueMask[back] & 0xff) << R300_STENCILMASK_SHIFT); + +		rmesa->hw.zsb.cmd[R300_ZSB_CNTL_0] &= +			~((R300_STENCILREF_MASK << R300_STENCILREF_SHIFT) | +			  (R300_STENCILREF_MASK << R300_STENCILMASK_SHIFT)); +		rmesa->hw.zsb.cmd[R300_ZSB_CNTL_0] |= refmask; +	}  }  static void r300StencilMaskSeparate(GLcontext * ctx, GLenum face, GLuint mask)  {  	r300ContextPtr rmesa = R300_CONTEXT(ctx); +	const unsigned back = ctx->Stencil._BackFace;  	r300CatchStencilFallback(ctx); @@ -931,6 +951,13 @@ static void r300StencilMaskSeparate(GLcontext * ctx, GLenum face, GLuint mask)  	    (ctx->Stencil.  	     WriteMask[0] & R300_STENCILREF_MASK) <<  	     R300_STENCILWRITEMASK_SHIFT; +	if (rmesa->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515) { +		R300_STATECHANGE(rmesa, zsb); +		rmesa->hw.zsb.cmd[R300_ZSB_CNTL_0] |= +			(ctx->Stencil. +			 WriteMask[back] & R300_STENCILREF_MASK) << +			R300_STENCILWRITEMASK_SHIFT; +	}  }  static void r300StencilOpSeparate(GLcontext * ctx, GLenum face, @@ -2253,6 +2280,14 @@ static void r300InvalidateState(GLcontext * ctx, GLuint new_state)  		R300_STATECHANGE(r300, zb);  	} +	if (new_state & (_NEW_LIGHT)) { +		R300_STATECHANGE(r300, shade2); +		if (ctx->Light.ProvokingVertex == GL_LAST_VERTEX_CONVENTION) +			r300->hw.shade2.cmd[1] |= R300_GA_COLOR_CONTROL_PROVOKING_VERTEX_LAST; +		else +			r300->hw.shade2.cmd[1] &= ~R300_GA_COLOR_CONTROL_PROVOKING_VERTEX_LAST; +	} +  	r300->radeon.NewGLState |= new_state;  } 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 251c124cbf..f8fd9c13d7 100644 --- a/src/mesa/drivers/dri/r600/r600_context.c +++ b/src/mesa/drivers/dri/r600/r600_context.c @@ -85,6 +85,7 @@ int hw_tcl_on = 1;  #define need_GL_EXT_framebuffer_object  #define need_GL_EXT_fog_coord  #define need_GL_EXT_gpu_program_parameters +#define need_GL_EXT_provoking_vertex  #define need_GL_EXT_secondary_color  #define need_GL_EXT_stencil_two_side  #define need_GL_ATI_separate_stencil @@ -117,6 +118,7 @@ const struct dri_extension card_extensions[] = {    {"GL_EXT_packed_depth_stencil",	NULL},    {"GL_EXT_fog_coord",			GL_EXT_fog_coord_functions },    {"GL_EXT_gpu_program_parameters",     GL_EXT_gpu_program_parameters_functions}, +  {"GL_EXT_provoking_vertex",           GL_EXT_provoking_vertex_functions },    {"GL_EXT_secondary_color", 		GL_EXT_secondary_color_functions},    {"GL_EXT_shadow_funcs",		NULL},    {"GL_EXT_stencil_two_side",		GL_EXT_stencil_two_side_functions}, @@ -128,6 +130,7 @@ const struct dri_extension card_extensions[] = {    {"GL_EXT_texture_lod_bias",		NULL},    {"GL_EXT_texture_mirror_clamp",	NULL},    {"GL_EXT_texture_rectangle",		NULL}, +  {"GL_EXT_texture_sRGB",               NULL},    {"GL_ATI_separate_stencil",		GL_ATI_separate_stencil_functions},    {"GL_ATI_texture_env_combine3",	NULL},    {"GL_ATI_texture_mirror_once",	NULL}, @@ -382,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_context.h b/src/mesa/drivers/dri/r600/r600_context.h index 8ae05a301c..c59df7505a 100644 --- a/src/mesa/drivers/dri/r600/r600_context.h +++ b/src/mesa/drivers/dri/r600/r600_context.h @@ -51,6 +51,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  #include "r700_chip.h"  #include "r600_tex.h"  #include "r700_oglprog.h" +#include "r700_vertprog.h"  struct r600_context;  typedef struct r600_context context_t; @@ -155,6 +156,8 @@ struct r600_context {  	struct r600_hw_state atoms; +	struct r700_vertex_program *selected_vp; +  	/* Vertex buffers  	 */  	GLvector4f dummy_attrib[_TNL_ATTRIB_MAX]; 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/r600_texstate.c b/src/mesa/drivers/dri/r600/r600_texstate.c index 49b603b65e..7d7e77d355 100644 --- a/src/mesa/drivers/dri/r600/r600_texstate.c +++ b/src/mesa/drivers/dri/r600/r600_texstate.c @@ -69,7 +69,7 @@ void r600UpdateTextureState(GLcontext * ctx)  	for (unit = 0; unit < R700_MAX_TEXTURE_UNITS; unit++) {  		texUnit = &ctx->Texture.Unit[unit];  		t = radeon_tex_obj(ctx->Texture.Unit[unit]._Current); - +		r700->textures[unit] = NULL;  		if (texUnit->_ReallyEnabled) {  			if (!t)  				continue; @@ -531,6 +531,49 @@ static GLboolean r600GetTexFormat(struct gl_texture_object *tObj, GLuint mesa_fo  			return GL_FALSE;  		}  		break; +	/* EXT_texture_sRGB */ +	case MESA_FORMAT_SRGBA8: +		SETfield(t->SQ_TEX_RESOURCE1, FMT_8_8_8_8, +			 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask); + +		SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W, +			 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask); +		SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z, +			 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask); +		SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y, +			 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask); +		SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X, +			 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask); +		SETbit(t->SQ_TEX_RESOURCE4, SQ_TEX_RESOURCE_WORD4_0__FORCE_DEGAMMA_bit); +		break; +	case MESA_FORMAT_SLA8: +		SETfield(t->SQ_TEX_RESOURCE1, FMT_8_8, +			 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask); + +		SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X, +			 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask); +		SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X, +			 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask); +		SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X, +			 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask); +		SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y, +			 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask); +		SETbit(t->SQ_TEX_RESOURCE4, SQ_TEX_RESOURCE_WORD4_0__FORCE_DEGAMMA_bit); +		break; +	case MESA_FORMAT_SL8: /* X, X, X, ONE */ +		SETfield(t->SQ_TEX_RESOURCE1, FMT_8, +			 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask); + +		SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X, +			 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask); +		SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X, +			 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask); +		SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X, +			 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask); +		SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1, +			 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask); +		SETbit(t->SQ_TEX_RESOURCE4, SQ_TEX_RESOURCE_WORD4_0__FORCE_DEGAMMA_bit); +		break;  	default:  		/* Not supported format */  		return GL_FALSE; @@ -565,6 +608,11 @@ static void setup_hardware_state(context_t *rmesa, struct gl_texture_object *tex  	int firstlevel = t->mt ? t->mt->firstLevel : 0;  	GLuint uTexelPitch, row_align; +	if (rmesa->radeon.radeonScreen->driScreen->dri2.enabled && +	    t->image_override && +	    t->bo) +		return; +  	firstImage = t->base.Image[0][firstlevel];  	if (!t->image_override) { diff --git a/src/mesa/drivers/dri/r600/r700_assembler.c b/src/mesa/drivers/dri/r600/r700_assembler.c index 2d8480daaf..efeccb25f1 100644 --- a/src/mesa/drivers/dri/r600/r700_assembler.c +++ b/src/mesa/drivers/dri/r600/r700_assembler.c @@ -1149,41 +1149,49 @@ GLboolean tex_dst(r700_AssemblerBase *pAsm)  GLboolean tex_src(r700_AssemblerBase *pAsm)  {      struct prog_instruction *pILInst = &(pAsm->pILInst[pAsm->uiCurInst]); -  +      GLboolean bValidTexCoord = GL_FALSE; -    switch (pILInst->SrcReg[0].File) -    { +    switch (pILInst->SrcReg[0].File) { +    case PROGRAM_CONSTANT: +    case PROGRAM_LOCAL_PARAM: +    case PROGRAM_ENV_PARAM: +    case PROGRAM_STATE_VAR: +	    bValidTexCoord = GL_TRUE; +	    setaddrmode_PVSSRC(&(pAsm->S[0].src), ADDR_ABSOLUTE); +	    pAsm->S[0].src.rtype = SRC_REG_TEMPORARY; +	    pAsm->S[0].src.reg   = pAsm->aArgSubst[1]; +	    break;      case PROGRAM_TEMPORARY: -        bValidTexCoord = GL_TRUE; - -        pAsm->S[0].src.reg   = pILInst->SrcReg[0].Index + pAsm->starting_temp_register_number; -        pAsm->S[0].src.rtype = SRC_REG_TEMPORARY; - -        break; +	    bValidTexCoord = GL_TRUE; +	    pAsm->S[0].src.reg   = pILInst->SrcReg[0].Index + +		    pAsm->starting_temp_register_number; +	    pAsm->S[0].src.rtype = SRC_REG_TEMPORARY; +       break;      case PROGRAM_INPUT: -        switch (pILInst->SrcReg[0].Index) -        { -        case FRAG_ATTRIB_COL0: -        case FRAG_ATTRIB_COL1: -        case FRAG_ATTRIB_TEX0: -        case FRAG_ATTRIB_TEX1: -        case FRAG_ATTRIB_TEX2: -        case FRAG_ATTRIB_TEX3: -        case FRAG_ATTRIB_TEX4: -        case FRAG_ATTRIB_TEX5: -        case FRAG_ATTRIB_TEX6: -        case FRAG_ATTRIB_TEX7: -            bValidTexCoord = GL_TRUE; - -            pAsm->S[0].src.reg   = pAsm->uiFP_AttributeMap[pILInst->SrcReg[0].Index]; -            pAsm->S[0].src.rtype = SRC_REG_INPUT; -        } -        break; +	    switch (pILInst->SrcReg[0].Index) +	    { +	    case FRAG_ATTRIB_COL0: +	    case FRAG_ATTRIB_COL1: +	    case FRAG_ATTRIB_TEX0: +	    case FRAG_ATTRIB_TEX1: +	    case FRAG_ATTRIB_TEX2: +	    case FRAG_ATTRIB_TEX3: +	    case FRAG_ATTRIB_TEX4: +	    case FRAG_ATTRIB_TEX5: +	    case FRAG_ATTRIB_TEX6: +	    case FRAG_ATTRIB_TEX7: +		    bValidTexCoord = GL_TRUE; +		    pAsm->S[0].src.reg   = +			    pAsm->uiFP_AttributeMap[pILInst->SrcReg[0].Index]; +		    pAsm->S[0].src.rtype = SRC_REG_INPUT; +		    break; +	    } +	    break;      }      if(GL_TRUE == bValidTexCoord) -    {  +    {          setaddrmode_PVSSRC(&(pAsm->S[0].src), ADDR_ABSOLUTE);      }      else @@ -1201,7 +1209,7 @@ GLboolean tex_src(r700_AssemblerBase *pAsm)      pAsm->S[0].src.negy = (pILInst->SrcReg[0].Negate >> 1) & 0x1;      pAsm->S[0].src.negz = (pILInst->SrcReg[0].Negate >> 2) & 0x1;      pAsm->S[0].src.negw = (pILInst->SrcReg[0].Negate >> 3) & 0x1; -      +      return GL_TRUE;  } @@ -2202,7 +2210,9 @@ GLboolean next_ins(r700_AssemblerBase *pAsm)  {      struct prog_instruction *pILInst = &(pAsm->pILInst[pAsm->uiCurInst]); -    if( GL_TRUE == IsTex(pILInst->Opcode) ) +    if( GL_TRUE == IsTex(pILInst->Opcode) && +        /* handle const moves to temp register */  +        !(pAsm->D.dst.opcode == SQ_OP2_INST_MOV) )      {  	    if (pILInst->TexSrcTarget == TEXTURE_RECT_INDEX) {  		    if( GL_FALSE == assemble_tex_instruction(pAsm, GL_FALSE) )  @@ -3374,28 +3384,31 @@ GLboolean assemble_TEX(r700_AssemblerBase *pAsm)      case PROGRAM_ENV_PARAM:      case PROGRAM_STATE_VAR:          src_const = GL_TRUE; +        break;      case PROGRAM_TEMPORARY:      case PROGRAM_INPUT: +    default:          src_const = GL_FALSE; +	break;      } -    if (GL_TRUE == src_const)  +    if (GL_TRUE == src_const)      { -        radeon_error("TODO: Texture coordinates from a constant register not supported.\n"); -        return GL_FALSE; +	    if ( GL_FALSE == mov_temp(pAsm, 0) ) +		    return GL_FALSE;      } -    switch (pAsm->pILInst[pAsm->uiCurInst].Opcode)  +    switch (pAsm->pILInst[pAsm->uiCurInst].Opcode)      {          case OPCODE_TEX: -            pAsm->D.dst.opcode = SQ_TEX_INST_SAMPLE;             +            pAsm->D.dst.opcode = SQ_TEX_INST_SAMPLE;              break; -        case OPCODE_TXB:             +        case OPCODE_TXB:              radeon_error("do not support TXB yet\n");              return GL_FALSE;              break; -        case OPCODE_TXP:             -            /* TODO : tex proj version : divid first 3 components by 4th */  +        case OPCODE_TXP: +            /* TODO : tex proj version : divid first 3 components by 4th */              pAsm->D.dst.opcode = SQ_TEX_INST_SAMPLE;              break;          default: @@ -3418,13 +3431,13 @@ GLboolean assemble_TEX(r700_AssemblerBase *pAsm)      {          return GL_FALSE;      } -  +      if( GL_FALSE == tex_src(pAsm) )      {          return GL_FALSE;      } -    if ( GL_FALSE == next_ins(pAsm) )  +    if ( GL_FALSE == next_ins(pAsm) )      {          return GL_FALSE;      } diff --git a/src/mesa/drivers/dri/r600/r700_chip.c b/src/mesa/drivers/dri/r600/r700_chip.c index 37bff56f5a..06d7e9c9ab 100644 --- a/src/mesa/drivers/dri/r600/r700_chip.c +++ b/src/mesa/drivers/dri/r600/r700_chip.c @@ -52,38 +52,40 @@ static void r700SendTexState(GLcontext *ctx, struct radeon_state_atom *atom)  	radeon_print(RADEON_STATE, RADEON_VERBOSE, "%s\n", __func__);  	for (i = 0; i < R700_TEXTURE_NUMBERUNITS; i++) { -		radeonTexObj *t = r700->textures[i]; -		if (t) { -			if (!t->image_override) -				bo = t->mt->bo; -			else -				bo = t->bo; -			if (bo) { +		if (ctx->Texture.Unit[i]._ReallyEnabled) { +			radeonTexObj *t = r700->textures[i]; +			if (t) { +				if (!t->image_override) +					bo = t->mt->bo; +				else +					bo = t->bo; +				if (bo) { -				r700SyncSurf(context, bo, -					     RADEON_GEM_DOMAIN_GTT|RADEON_GEM_DOMAIN_VRAM, -					     0, TC_ACTION_ENA_bit); +					r700SyncSurf(context, bo, +						     RADEON_GEM_DOMAIN_GTT|RADEON_GEM_DOMAIN_VRAM, +						     0, TC_ACTION_ENA_bit); -				BEGIN_BATCH_NO_AUTOSTATE(9 + 4); -				R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_RESOURCE, 7)); -				R600_OUT_BATCH(i * 7); -				R600_OUT_BATCH(r700->textures[i]->SQ_TEX_RESOURCE0); -				R600_OUT_BATCH(r700->textures[i]->SQ_TEX_RESOURCE1); -				R600_OUT_BATCH(r700->textures[i]->SQ_TEX_RESOURCE2); -				R600_OUT_BATCH(r700->textures[i]->SQ_TEX_RESOURCE3); -				R600_OUT_BATCH(r700->textures[i]->SQ_TEX_RESOURCE4); -				R600_OUT_BATCH(r700->textures[i]->SQ_TEX_RESOURCE5); -				R600_OUT_BATCH(r700->textures[i]->SQ_TEX_RESOURCE6); -				R600_OUT_BATCH_RELOC(r700->textures[i]->SQ_TEX_RESOURCE2, -						     bo, -						     0, -						     RADEON_GEM_DOMAIN_GTT|RADEON_GEM_DOMAIN_VRAM, 0, 0); -				R600_OUT_BATCH_RELOC(r700->textures[i]->SQ_TEX_RESOURCE3, -						     bo, -						     r700->textures[i]->SQ_TEX_RESOURCE3, -						     RADEON_GEM_DOMAIN_GTT|RADEON_GEM_DOMAIN_VRAM, 0, 0); -				END_BATCH(); -				COMMIT_BATCH(); +					BEGIN_BATCH_NO_AUTOSTATE(9 + 4); +					R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_RESOURCE, 7)); +					R600_OUT_BATCH(i * 7); +					R600_OUT_BATCH(r700->textures[i]->SQ_TEX_RESOURCE0); +					R600_OUT_BATCH(r700->textures[i]->SQ_TEX_RESOURCE1); +					R600_OUT_BATCH(r700->textures[i]->SQ_TEX_RESOURCE2); +					R600_OUT_BATCH(r700->textures[i]->SQ_TEX_RESOURCE3); +					R600_OUT_BATCH(r700->textures[i]->SQ_TEX_RESOURCE4); +					R600_OUT_BATCH(r700->textures[i]->SQ_TEX_RESOURCE5); +					R600_OUT_BATCH(r700->textures[i]->SQ_TEX_RESOURCE6); +					R600_OUT_BATCH_RELOC(r700->textures[i]->SQ_TEX_RESOURCE2, +							     bo, +							     0, +							     RADEON_GEM_DOMAIN_GTT|RADEON_GEM_DOMAIN_VRAM, 0, 0); +					R600_OUT_BATCH_RELOC(r700->textures[i]->SQ_TEX_RESOURCE3, +							     bo, +							     r700->textures[i]->SQ_TEX_RESOURCE3, +							     RADEON_GEM_DOMAIN_GTT|RADEON_GEM_DOMAIN_VRAM, 0, 0); +					END_BATCH(); +					COMMIT_BATCH(); +				}  			}  		}  	} @@ -98,16 +100,18 @@ static void r700SendTexSamplerState(GLcontext *ctx, struct radeon_state_atom *at  	radeon_print(RADEON_STATE, RADEON_VERBOSE, "%s\n", __func__);  	for (i = 0; i < R700_TEXTURE_NUMBERUNITS; i++) { -		radeonTexObj *t = r700->textures[i]; -		if (t) { -			BEGIN_BATCH_NO_AUTOSTATE(5); -			R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_SAMPLER, 3)); -			R600_OUT_BATCH(i * 3); -			R600_OUT_BATCH(r700->textures[i]->SQ_TEX_SAMPLER0); -			R600_OUT_BATCH(r700->textures[i]->SQ_TEX_SAMPLER1); -			R600_OUT_BATCH(r700->textures[i]->SQ_TEX_SAMPLER2); -			END_BATCH(); -			COMMIT_BATCH(); +		if (ctx->Texture.Unit[i]._ReallyEnabled) { +			radeonTexObj *t = r700->textures[i]; +			if (t) { +				BEGIN_BATCH_NO_AUTOSTATE(5); +				R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_SAMPLER, 3)); +				R600_OUT_BATCH(i * 3); +				R600_OUT_BATCH(r700->textures[i]->SQ_TEX_SAMPLER0); +				R600_OUT_BATCH(r700->textures[i]->SQ_TEX_SAMPLER1); +				R600_OUT_BATCH(r700->textures[i]->SQ_TEX_SAMPLER2); +				END_BATCH(); +				COMMIT_BATCH(); +			}  		}  	}  } @@ -121,16 +125,18 @@ static void r700SendTexBorderColorState(GLcontext *ctx, struct radeon_state_atom  	radeon_print(RADEON_STATE, RADEON_VERBOSE, "%s\n", __func__);  	for (i = 0; i < R700_TEXTURE_NUMBERUNITS; i++) { -		radeonTexObj *t = r700->textures[i]; -		if (t) { -			BEGIN_BATCH_NO_AUTOSTATE(2 + 4); -			R600_OUT_BATCH_REGSEQ((TD_PS_SAMPLER0_BORDER_RED + (i * 16)), 4); -			R600_OUT_BATCH(r700->textures[i]->TD_PS_SAMPLER0_BORDER_RED); -			R600_OUT_BATCH(r700->textures[i]->TD_PS_SAMPLER0_BORDER_GREEN); -			R600_OUT_BATCH(r700->textures[i]->TD_PS_SAMPLER0_BORDER_BLUE); -			R600_OUT_BATCH(r700->textures[i]->TD_PS_SAMPLER0_BORDER_ALPHA); -			END_BATCH(); -			COMMIT_BATCH(); +		if (ctx->Texture.Unit[i]._ReallyEnabled) { +			radeonTexObj *t = r700->textures[i]; +			if (t) { +				BEGIN_BATCH_NO_AUTOSTATE(2 + 4); +				R600_OUT_BATCH_REGSEQ((TD_PS_SAMPLER0_BORDER_RED + (i * 16)), 4); +				R600_OUT_BATCH(r700->textures[i]->TD_PS_SAMPLER0_BORDER_RED); +				R600_OUT_BATCH(r700->textures[i]->TD_PS_SAMPLER0_BORDER_GREEN); +				R600_OUT_BATCH(r700->textures[i]->TD_PS_SAMPLER0_BORDER_BLUE); +				R600_OUT_BATCH(r700->textures[i]->TD_PS_SAMPLER0_BORDER_ALPHA); +				END_BATCH(); +				COMMIT_BATCH(); +			}  		}  	}  } @@ -205,8 +211,7 @@ static void r700SetupVTXConstants(GLcontext  * ctx,  void r700SetupStreams(GLcontext *ctx)  {      context_t         *context = R700_CONTEXT(ctx); -     struct r700_vertex_program *vpc -             = (struct r700_vertex_program *)ctx->VertexProgram._Current; +    struct r700_vertex_program *vp = context->selected_vp;      TNLcontext *tnl = TNL_CONTEXT(ctx);      struct vertex_buffer *vb = &tnl->vb;      unsigned int i, j = 0; @@ -215,7 +220,7 @@ void r700SetupStreams(GLcontext *ctx)      R600_STATECHANGE(context, vtx);      for(i=0; i<VERT_ATTRIB_MAX; i++) { -	    if(vpc->mesa_program.Base.InputsRead & (1 << i)) { +	    if(vp->mesa_program->Base.InputsRead & (1 << i)) {  		    rcommon_emit_vector(ctx,  					&context->radeon.tcl.aos[j],  					vb->AttribPtr[i]->data, @@ -231,8 +236,7 @@ void r700SetupStreams(GLcontext *ctx)  static void r700SendVTXState(GLcontext *ctx, struct radeon_state_atom *atom)  {      context_t         *context = R700_CONTEXT(ctx); -    struct r700_vertex_program *vpc -             = (struct r700_vertex_program *)ctx->VertexProgram._Current; +    struct r700_vertex_program *vp = context->selected_vp;      unsigned int i, j = 0;      BATCH_LOCALS(&context->radeon);  	radeon_print(RADEON_STATE, RADEON_VERBOSE, "%s\n", __func__); @@ -252,7 +256,7 @@ static void r700SendVTXState(GLcontext *ctx, struct radeon_state_atom *atom)      COMMIT_BATCH();      for(i=0; i<VERT_ATTRIB_MAX; i++) { -	    if(vpc->mesa_program.Base.InputsRead & (1 << i)) { +	    if(vp->mesa_program->Base.InputsRead & (1 << i)) {  		    /* currently aos are packed */  		    r700SetupVTXConstants(ctx,  					  i, @@ -347,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. */  } @@ -1176,9 +1180,11 @@ static int check_tx(GLcontext *ctx, struct radeon_state_atom *atom)  	R700_CHIP_CONTEXT *r700 = (R700_CHIP_CONTEXT*)(&context->hw);  	for (i = 0; i < R700_TEXTURE_NUMBERUNITS; i++) { -		radeonTexObj *t = r700->textures[i]; -		if (t) -			count++; +		if (ctx->Texture.Unit[i]._ReallyEnabled) { +			radeonTexObj *t = r700->textures[i]; +			if (t) +				count++; +		}  	}  	radeon_print(RADEON_STATE, RADEON_TRACE, "%s %d\n", __func__, count);  	return count * 31; diff --git a/src/mesa/drivers/dri/r600/r700_oglprog.c b/src/mesa/drivers/dri/r600/r700_oglprog.c index 3c8c1fd7a3..5290ef31be 100644 --- a/src/mesa/drivers/dri/r600/r700_oglprog.c +++ b/src/mesa/drivers/dri/r600/r700_oglprog.c @@ -46,7 +46,7 @@ static struct gl_program *r700NewProgram(GLcontext * ctx,  {  	struct gl_program *pProgram = NULL; -    struct r700_vertex_program *vp; +    struct r700_vertex_program_cont *vpc;  	struct r700_fragment_program *fp;  	radeon_print(RADEON_SHADER, RADEON_VERBOSE, @@ -56,16 +56,11 @@ static struct gl_program *r700NewProgram(GLcontext * ctx,      {      case GL_VERTEX_STATE_PROGRAM_NV:      case GL_VERTEX_PROGRAM_ARB:	     -        vp       = CALLOC_STRUCT(r700_vertex_program); +        vpc       = CALLOC_STRUCT(r700_vertex_program_cont);  	    pProgram = _mesa_init_vertex_program(ctx,  -                                             &vp->mesa_program, +                                             &vpc->mesa_program,  					                         target,                                                id); -        vp->translated = GL_FALSE; -        vp->loaded     = GL_FALSE; -  -        vp->shaderbo   = NULL; -  	    break;      case GL_FRAGMENT_PROGRAM_NV:      case GL_FRAGMENT_PROGRAM_ARB: @@ -89,7 +84,8 @@ static struct gl_program *r700NewProgram(GLcontext * ctx,  static void r700DeleteProgram(GLcontext * ctx, struct gl_program *prog)  { -    struct r700_vertex_program   * vp; +    struct r700_vertex_program_cont   * vpc; +    struct r700_vertex_program *vp, *tmp;      struct r700_fragment_program * fp;  	radeon_print(RADEON_SHADER, RADEON_VERBOSE, @@ -99,14 +95,20 @@ static void r700DeleteProgram(GLcontext * ctx, struct gl_program *prog)      {      case GL_VERTEX_STATE_PROGRAM_NV:      case GL_VERTEX_PROGRAM_ARB:	     -        vp = (struct r700_vertex_program*)prog; -        /* Release DMA region */ +        vpc = (struct r700_vertex_program_cont*)prog; +        vp = vpc->progs; +	while (vp) { +		tmp = vp->next; +		/* Release DMA region */ +	  +	        r600DeleteShader(ctx, vp->shaderbo); -        r600DeleteShader(ctx, vp->shaderbo); - -        /* Clean up */ -        Clean_Up_Assembler(&(vp->r700AsmCode)); -        Clean_Up_Shader(&(vp->r700Shader)); +	        /* Clean up */ +	        Clean_Up_Assembler(&(vp->r700AsmCode)); +	        Clean_Up_Shader(&(vp->r700Shader)); +		_mesa_free(vp); +		vp = tmp; +	}  	    break;      case GL_FRAGMENT_PROGRAM_NV:      case GL_FRAGMENT_PROGRAM_ARB: diff --git a/src/mesa/drivers/dri/r600/r700_render.c b/src/mesa/drivers/dri/r600/r700_render.c index 3566bf3ca7..b1c3648ca5 100644 --- a/src/mesa/drivers/dri/r600/r700_render.c +++ b/src/mesa/drivers/dri/r600/r700_render.c @@ -319,14 +319,13 @@ static GLuint r700PredictRenderSize(GLcontext* ctx)  {      context_t *context = R700_CONTEXT(ctx);      TNLcontext *tnl = TNL_CONTEXT(ctx); -    struct r700_vertex_program *vpc -        = (struct r700_vertex_program *)ctx->VertexProgram._Current; +    struct r700_vertex_program *vp = context->selected_vp;      struct vertex_buffer *vb = &tnl->vb;      GLboolean flushed;      GLuint dwords, i;      GLuint state_size;      /* pre calculate aos count so state prediction works */ -    context->radeon.tcl.aos_count = _mesa_bitcount(vpc->mesa_program.Base.InputsRead); +    context->radeon.tcl.aos_count = _mesa_bitcount(vp->mesa_program->Base.InputsRead);      dwords = PRE_EMIT_STATE_BUFSZ;      for (i = 0; i < vb->PrimitiveCount; i++) @@ -365,7 +364,6 @@ static GLboolean r700RunRender(GLcontext * ctx,      /* mark vtx as dirty since it changes per-draw */      R600_STATECHANGE(context, vtx); -    r700UpdateShaders(ctx);      r700SetScissor(context);      r700SetupVertexProgram(ctx);      r700SetupFragmentProgram(ctx); @@ -427,7 +425,10 @@ static GLboolean r700RunTCLRender(GLcontext * ctx,  /*----------------------*/      /* TODO : sw fallback */ +    /* Need shader bo's setup before bo check */ +    r700UpdateShaders(ctx);      /** +      * Ensure all enabled and complete textures are uploaded along with any buffers being used.      */      if(!r600ValidateBuffers(ctx)) diff --git a/src/mesa/drivers/dri/r600/r700_state.c b/src/mesa/drivers/dri/r600/r700_state.c index 1f4724e838..fc0b511684 100644 --- a/src/mesa/drivers/dri/r600/r700_state.c +++ b/src/mesa/drivers/dri/r600/r700_state.c @@ -171,6 +171,14 @@ static void r700InvalidateState(GLcontext * ctx, GLuint new_state) //-----------  	    R600_STATECHANGE(context, db_target);      } +    if (new_state & (_NEW_LIGHT)) { +	    R600_STATECHANGE(context, su); +	    if (ctx->Light.ProvokingVertex == GL_LAST_VERTEX_CONVENTION) +		    SETbit(r700->PA_SU_SC_MODE_CNTL.u32All, PROVOKING_VTX_LAST_bit); +	    else +		    CLEARbit(r700->PA_SU_SC_MODE_CNTL.u32All, PROVOKING_VTX_LAST_bit); +    } +      r700UpdateStateParameters(ctx, new_state);      R600_STATECHANGE(context, cl); @@ -837,9 +845,9 @@ static void r700PointSize(GLcontext * ctx, GLfloat size)  	size = CLAMP(size, ctx->Const.MinPointSize, ctx->Const.MaxPointSize);  	/* format is 12.4 fixed point */ -	SETfield(r700->PA_SU_POINT_SIZE.u32All, (int)(size * 16), +	SETfield(r700->PA_SU_POINT_SIZE.u32All, (int)(size * 8.0),  		 PA_SU_POINT_SIZE__HEIGHT_shift, PA_SU_POINT_SIZE__HEIGHT_mask); -	SETfield(r700->PA_SU_POINT_SIZE.u32All, (int)(size * 16), +	SETfield(r700->PA_SU_POINT_SIZE.u32All, (int)(size * 8.0),  		 PA_SU_POINT_SIZE__WIDTH_shift, PA_SU_POINT_SIZE__WIDTH_mask);  } @@ -854,11 +862,11 @@ static void r700PointParameter(GLcontext * ctx, GLenum pname, const GLfloat * pa  	/* format is 12.4 fixed point */  	switch (pname) {  	case GL_POINT_SIZE_MIN: -		SETfield(r700->PA_SU_POINT_MINMAX.u32All, (int)(ctx->Point.MinSize * 16.0), +		SETfield(r700->PA_SU_POINT_MINMAX.u32All, (int)(ctx->Point.MinSize * 8.0),  			 MIN_SIZE_shift, MIN_SIZE_mask);  		break;  	case GL_POINT_SIZE_MAX: -		SETfield(r700->PA_SU_POINT_MINMAX.u32All, (int)(ctx->Point.MaxSize * 16.0), +		SETfield(r700->PA_SU_POINT_MINMAX.u32All, (int)(ctx->Point.MaxSize * 8.0),  			 MAX_SIZE_shift, MAX_SIZE_mask);  		break;  	case GL_POINT_DISTANCE_ATTENUATION: @@ -1122,20 +1130,25 @@ static void r700PolygonOffset(GLcontext * ctx, GLfloat factor, GLfloat units) //  	context_t *context = R700_CONTEXT(ctx);  	R700_CHIP_CONTEXT *r700 = (R700_CHIP_CONTEXT*)(&context->hw);  	GLfloat constant = units; +	GLchar depth = 0; + +	R600_STATECHANGE(context, poly);  	switch (ctx->Visual.depthBits) {  	case 16:  		constant *= 4.0; +		depth = -16;  		break;  	case 24:  		constant *= 2.0; +		depth = -24;  		break;  	}  	factor *= 12.0; - -	R600_STATECHANGE(context, poly); - +	SETfield(r700->PA_SU_POLY_OFFSET_DB_FMT_CNTL.u32All, depth, +		 POLY_OFFSET_NEG_NUM_DB_BITS_shift, POLY_OFFSET_NEG_NUM_DB_BITS_mask); +	//r700->PA_SU_POLY_OFFSET_CLAMP.f32All = constant; //???  	r700->PA_SU_POLY_OFFSET_FRONT_SCALE.f32All = factor;  	r700->PA_SU_POLY_OFFSET_FRONT_OFFSET.f32All = constant;  	r700->PA_SU_POLY_OFFSET_BACK_SCALE.f32All = factor; @@ -1272,8 +1285,8 @@ void r700SetScissor(context_t *context) //---------------  		if (context->radeon.radeonScreen->driScreen->dri2.enabled) {  			x1 = 0;  			y1 = 0; -			x2 = rrb->base.Width - 1; -			y2 = rrb->base.Height - 1; +			x2 = rrb->base.Width; +			y2 = rrb->base.Height;  		} else {  			x1 = rrb->dPriv->x;  			y1 = rrb->dPriv->y; diff --git a/src/mesa/drivers/dri/r600/r700_vertprog.c b/src/mesa/drivers/dri/r600/r700_vertprog.c index d107f99e7b..9ee26286d9 100644 --- a/src/mesa/drivers/dri/r600/r700_vertprog.c +++ b/src/mesa/drivers/dri/r600/r700_vertprog.c @@ -35,12 +35,14 @@  #include "main/mtypes.h"  #include "tnl/t_context.h" +#include "shader/program.h"  #include "shader/prog_parameter.h"  #include "shader/prog_statevars.h"  #include "radeon_debug.h"  #include "r600_context.h"  #include "r600_cmdbuf.h" +#include "shader/programopt.c"  #include "r700_debug.h"  #include "r700_vertprog.h" @@ -258,28 +260,59 @@ GLboolean Find_Instruction_Dependencies_vp(struct r700_vertex_program *vp,      return GL_TRUE;  } -GLboolean r700TranslateVertexShader(struct r700_vertex_program *vp, -							   struct gl_vertex_program   *mesa_vp) +struct r700_vertex_program* r700TranslateVertexShader(GLcontext *ctx, +						struct gl_vertex_program *mesa_vp)  { +	context_t *context = R700_CONTEXT(ctx); +	struct r700_vertex_program *vp; +	TNLcontext *tnl = TNL_CONTEXT(ctx); +	struct vertex_buffer *vb = &tnl->vb; +	unsigned int unBit; +	unsigned int i; + +	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; +		if(vp->mesa_program->Base.InputsRead & unBit) /* ctx->Array.ArrayObj->xxxxxxx */ +		{ +			vp->aos_desc[i].size   = vb->AttribPtr[i]->size; +			vp->aos_desc[i].stride = vb->AttribPtr[i]->size * sizeof(GL_FLOAT);/* when emit array, data is packed. vb->AttribPtr[i]->stride;*/ +			vp->aos_desc[i].type   = GL_FLOAT; +		} +	} +	 +	if (context->radeon.radeonScreen->chip_family < CHIP_FAMILY_RV770) +	{ +		vp->r700AsmCode.bR6xx = 1; +	} +  	//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 GL_FALSE; +		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 GL_FALSE; +		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 GL_FALSE; +        return NULL;      }      vp->r700Shader.nRegs = (vp->r700AsmCode.number_used_registers == 0) ? 0  @@ -289,72 +322,82 @@ GLboolean r700TranslateVertexShader(struct r700_vertex_program *vp,      vp->translated = GL_TRUE; -	return GL_TRUE; +	return vp;  }  void r700SelectVertexShader(GLcontext *ctx)  {      context_t *context = R700_CONTEXT(ctx); -    struct r700_vertex_program *vpc -             = (struct r700_vertex_program *)ctx->VertexProgram._Current; +    struct r700_vertex_program_cont *vpc; +    struct r700_vertex_program *vp;      TNLcontext *tnl = TNL_CONTEXT(ctx);      struct vertex_buffer *vb = &tnl->vb;      unsigned int unBit;      unsigned int i; +    GLboolean match; +    GLbitfield InputsRead; -    if (context->radeon.NewGLState & (_NEW_PROGRAM_CONSTANTS|_NEW_PROGRAM)) -    { -	vpc->needUpdateVF = 1; -    } +    vpc = (struct r700_vertex_program_cont *)ctx->VertexProgram._Current; -    if (context->radeon.radeonScreen->chip_family < CHIP_FAMILY_RV770) +    InputsRead = vpc->mesa_program.Base.InputsRead; +    if (vpc->mesa_program.IsPositionInvariant)      { -        vpc->r700AsmCode.bR6xx = 1; -    } - +	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) /* ctx->Array.ArrayObj->xxxxxxx */ +		if(InputsRead & unBit)  		{ -			vpc->aos_desc[i].size   = vb->AttribPtr[i]->size; -			vpc->aos_desc[i].stride = vb->AttribPtr[i]->size * sizeof(GL_FLOAT);/* when emit array, data is packed. vb->AttribPtr[i]->stride;*/ -			vpc->aos_desc[i].type   = GL_FLOAT; +			if (vp->aos_desc[i].size != vb->AttribPtr[i]->size) +				match = GL_FALSE; +				break;  		}  	} - -	if(GL_FALSE == vpc->translated) { -		r700TranslateVertexShader(vpc, &(vpc->mesa_program) ); +	if (match)  +	{ +		context->selected_vp = vp; +		return;  	} +    } + +    vp = r700TranslateVertexShader(ctx, &(vpc->mesa_program) ); +    if(!vp) +    { +	radeon_error("Failed to translate vertex shader. \n"); +	return; +    } +    vp->next = vpc->progs; +    vpc->progs = vp; +    context->selected_vp = vp; +    return;  }  void * r700GetActiveVpShaderBo(GLcontext * ctx)  { -    struct r700_vertex_program *vp -             = (struct r700_vertex_program *)ctx->VertexProgram._Current; +    context_t *context = R700_CONTEXT(ctx); +    struct r700_vertex_program *vp = context->selected_vp;; -    return vp->shaderbo; +    if (vp) +	return vp->shaderbo; +    else +	return NULL;  }  GLboolean r700SetupVertexProgram(GLcontext * ctx)  {      context_t *context = R700_CONTEXT(ctx);      R700_CHIP_CONTEXT *r700 = (R700_CHIP_CONTEXT*)(&context->hw); -    struct r700_vertex_program *vp -             = (struct r700_vertex_program *)ctx->VertexProgram._Current; +    struct r700_vertex_program *vp = context->selected_vp;      struct gl_program_parameter_list *paramList;      unsigned int unNumParamData;      unsigned int ui; -    if (vp->needUpdateVF) -    { -	vp->loaded = GL_FALSE; -	vp->r700Shader.bNeedsAssembly = GL_TRUE; -	Process_Vertex_Program_Vfetch_Instructions(vp, &(vp->mesa_program)); -	r600DeleteShader(ctx, vp->shaderbo); -    } -      if(GL_FALSE == vp->loaded)      {  	    if(vp->r700Shader.bNeedsAssembly == GL_TRUE) @@ -410,7 +453,7 @@ GLboolean r700SetupVertexProgram(GLcontext * ctx)      */      /* sent out shader constants. */ -    paramList = vp->mesa_program.Base.Parameters; +    paramList = vp->mesa_program->Base.Parameters;      if(NULL != paramList) {  	    _mesa_load_state_parameters(ctx, paramList); diff --git a/src/mesa/drivers/dri/r600/r700_vertprog.h b/src/mesa/drivers/dri/r600/r700_vertprog.h index e2e65021fd..c48764c43b 100644 --- a/src/mesa/drivers/dri/r600/r700_vertprog.h +++ b/src/mesa/drivers/dri/r600/r700_vertprog.h @@ -43,7 +43,7 @@ typedef struct ArrayDesc //TEMP  struct r700_vertex_program   { -    struct gl_vertex_program mesa_program; /* Must be first */ +    struct gl_vertex_program *mesa_program; /* Must be first */      struct r700_vertex_program *next; @@ -59,6 +59,13 @@ struct r700_vertex_program      ArrayDesc              aos_desc[VERT_ATTRIB_MAX];  }; +struct r700_vertex_program_cont +{ +    struct gl_vertex_program mesa_program; + +    struct r700_vertex_program *progs; +}; +  //Internal  unsigned int Map_Vertex_Output(r700_AssemblerBase       *pAsm,   			       struct gl_vertex_program *mesa_vp, @@ -74,7 +81,7 @@ void Map_Vertex_Program(struct r700_vertex_program *vp,  GLboolean Find_Instruction_Dependencies_vp(struct r700_vertex_program *vp,  					   struct gl_vertex_program   *mesa_vp); -GLboolean r700TranslateVertexShader(struct r700_vertex_program *vp, +struct r700_vertex_program* r700TranslateVertexShader(GLcontext *ctx,  				    struct gl_vertex_program   *mesa_vp);  /* Interface */ 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.c b/src/mesa/drivers/dri/radeon/radeon_common.c index a4c7b40798..264392b327 100644 --- a/src/mesa/drivers/dri/radeon/radeon_common.c +++ b/src/mesa/drivers/dri/radeon/radeon_common.c @@ -1345,5 +1345,5 @@ void rcommonBeginBatch(radeonContextPtr rmesa, int n,  void radeonUserClear(GLcontext *ctx, GLuint mask)  { -   _mesa_meta_clear(ctx, mask); +   _mesa_meta_Clear(ctx, mask);  } diff --git a/src/mesa/drivers/dri/radeon/radeon_common_context.c b/src/mesa/drivers/dri/radeon/radeon_common_context.c index 71ee06d9a7..d4bea86796 100644 --- a/src/mesa/drivers/dri/radeon/radeon_common_context.c +++ b/src/mesa/drivers/dri/radeon/radeon_common_context.c @@ -37,7 +37,6 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  #include "utils.h"  #include "vblank.h"  #include "drirenderbuffer.h" -#include "drivers/common/meta.h"  #include "main/context.h"  #include "main/framebuffer.h"  #include "main/renderbuffer.h" @@ -47,7 +46,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 @@ -209,8 +208,6 @@ GLboolean radeonInitContext(radeonContextPtr radeon,  	meta_init_metaops(ctx, &radeon->meta); -	_mesa_meta_init(ctx); -  	/* DRI fields */  	radeon->dri.context = driContextPriv;  	radeon->dri.screen = sPriv; @@ -306,8 +303,6 @@ void radeonDestroyContext(__DRIcontextPrivate *driContextPriv )  	assert(radeon); -	_mesa_meta_free(radeon->glCtx); -  	if (radeon == current) {  		radeon_firevertices(radeon);  		_mesa_make_current(NULL, NULL, NULL); diff --git a/src/mesa/drivers/dri/radeon/radeon_fbo.c b/src/mesa/drivers/dri/radeon/radeon_fbo.c index d83b166742..7ac53ec0ca 100644 --- a/src/mesa/drivers/dri/radeon/radeon_fbo.c +++ b/src/mesa/drivers/dri/radeon/radeon_fbo.c @@ -583,7 +583,7 @@ void radeon_fbo_init(struct radeon_context *radeon)    radeon->glCtx->Driver.FinishRenderTexture = radeon_finish_render_texture;    radeon->glCtx->Driver.ResizeBuffers = radeon_resize_buffers;    radeon->glCtx->Driver.ValidateFramebuffer = radeon_validate_framebuffer; -  radeon->glCtx->Driver.BlitFramebuffer = _mesa_meta_blit_framebuffer; +  radeon->glCtx->Driver.BlitFramebuffer = _mesa_meta_BlitFramebuffer;  } 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/swrast/swrast.c b/src/mesa/drivers/dri/swrast/swrast.c index a858af30c1..3016987d56 100644 --- a/src/mesa/drivers/dri/swrast/swrast.c +++ b/src/mesa/drivers/dri/swrast/swrast.c @@ -62,6 +62,7 @@  #define need_GL_SGI_color_table  /* sw extensions not associated with some GL version */ +#define need_GL_ARB_draw_elements_base_vertex  #define need_GL_ARB_shader_objects  #define need_GL_ARB_vertex_array_object  #define need_GL_ARB_vertex_program @@ -95,6 +96,8 @@ const struct dri_extension card_extensions[] =      { "GL_EXT_histogram",		GL_EXT_histogram_functions },      { "GL_SGI_color_table",		GL_SGI_color_table_functions }, +    { "GL_ARB_depth_clamp",		NULL }, +    { "GL_ARB_draw_elements_base_vertex", GL_ARB_draw_elements_base_vertex_functions },      { "GL_ARB_shader_objects",		GL_ARB_shader_objects_functions },      { "GL_ARB_vertex_array_object",	GL_ARB_vertex_array_object_functions },      { "GL_ARB_vertex_program",		GL_ARB_vertex_program_functions }, @@ -109,6 +112,7 @@ const struct dri_extension card_extensions[] =      { "GL_EXT_paletted_texture",	GL_EXT_paletted_texture_functions },      { "GL_EXT_stencil_two_side",	GL_EXT_stencil_two_side_functions },      { "GL_MESA_resize_buffers",		GL_MESA_resize_buffers_functions }, +    { "GL_NV_depth_clamp",		NULL },      { "GL_NV_vertex_program",		GL_NV_vertex_program_functions },      { "GL_NV_fragment_program",		GL_NV_fragment_program_functions },      { NULL,				NULL } 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/drivers/windows/gdi/mesa.def b/src/mesa/drivers/windows/gdi/mesa.def index bd3e5b2137..5abcd1d927 100644 --- a/src/mesa/drivers/windows/gdi/mesa.def +++ b/src/mesa/drivers/windows/gdi/mesa.def @@ -943,6 +943,15 @@ EXPORTS  	_mesa_update_framebuffer_visual  	_mesa_use_program  	_mesa_Viewport +	_mesa_meta_CopyColorSubTable +	_mesa_meta_CopyColorTable +	_mesa_meta_CopyConvolutionFilter1D +	_mesa_meta_CopyConvolutionFilter2D +	_mesa_meta_CopyTexImage1D +	_mesa_meta_CopyTexImage2D +	_mesa_meta_CopyTexSubImage1D +	_mesa_meta_CopyTexSubImage2D +	_mesa_meta_CopyTexSubImage3D  	_mesa_wait_query  	_swrast_Accum  	_swrast_Bitmap @@ -953,15 +962,6 @@ EXPORTS  	_swrast_Clear  	_swrast_choose_line  	_swrast_choose_triangle -	_swrast_CopyColorSubTable -	_swrast_CopyColorTable -	_swrast_CopyConvolutionFilter1D -	_swrast_CopyConvolutionFilter2D -	_swrast_copy_teximage1d -	_swrast_copy_teximage2d -	_swrast_copy_texsubimage1d -	_swrast_copy_texsubimage2d -	_swrast_copy_texsubimage3d  	_swrast_CreateContext  	_swrast_DestroyContext  	_swrast_exec_fragment_program diff --git a/src/mesa/drivers/windows/gldirect/mesasw/gld_wgl_mesasw.c b/src/mesa/drivers/windows/gldirect/mesasw/gld_wgl_mesasw.c index 342a742867..7ac425a109 100644 --- a/src/mesa/drivers/windows/gldirect/mesasw/gld_wgl_mesasw.c +++ b/src/mesa/drivers/windows/gldirect/mesasw/gld_wgl_mesasw.c @@ -1346,6 +1346,8 @@ static void wmesa_update_state_first_time(  	struct swrast_device_driver	*swdd = _swrast_GetDeviceDriverReference( ctx );  	TNLcontext					*tnl = TNL_CONTEXT(ctx); +        _mesa_init_driver_functions(&ctx->Driver); +  	/*  	* XXX these function pointers could be initialized just once during  	* context creation since they don't depend on any state changes. @@ -1362,8 +1364,6 @@ static void wmesa_update_state_first_time(  	ctx->Driver.Viewport				= wmesa_viewport; -	ctx->Driver.Accum					= _swrast_Accum; -	ctx->Driver.Bitmap					= _swrast_Bitmap;  	ctx->Driver.Clear					= clear;  	ctx->Driver.Flush					= flush; @@ -1371,28 +1371,6 @@ static void wmesa_update_state_first_time(  	ctx->Driver.ClearColor				= clear_color;  	ctx->Driver.Enable					= enable; -	ctx->Driver.CopyPixels				= _swrast_CopyPixels; -	ctx->Driver.DrawPixels				= _swrast_DrawPixels; -	ctx->Driver.ReadPixels				= _swrast_ReadPixels; -	 -	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.TestProxyTexImage		= _mesa_test_proxy_teximage; -	 -	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.CopyColorTable			= _swrast_CopyColorTable; -	ctx->Driver.CopyColorSubTable		= _swrast_CopyColorSubTable; -	ctx->Driver.CopyConvolutionFilter1D	= _swrast_CopyConvolutionFilter1D; -	ctx->Driver.CopyConvolutionFilter2D	= _swrast_CopyConvolutionFilter2D;  	// Does not apply for Mesa 5.x  	//ctx->Driver.BaseCompressedTexFormat	= _mesa_base_compressed_texformat; diff --git a/src/mesa/drivers/windows/icd/mesa.def b/src/mesa/drivers/windows/icd/mesa.def index 465b380a0c..25ac08a2f0 100644 --- a/src/mesa/drivers/windows/icd/mesa.def +++ b/src/mesa/drivers/windows/icd/mesa.def @@ -75,6 +75,15 @@ EXPORTS  	_mesa_strcmp  	_mesa_test_proxy_teximage  	_mesa_Viewport +	_mesa_meta_CopyColorSubTable +	_mesa_meta_CopyColorTable +	_mesa_meta_CopyConvolutionFilter1D +	_mesa_meta_CopyConvolutionFilter2D +	_mesa_meta_CopyTexImage1D +	_mesa_meta_CopyTexImage2D +	_mesa_meta_CopyTexSubImage1D +	_mesa_meta_CopyTexSubImage2D +	_mesa_meta_CopyTexSubImage3D  	_swrast_Accum  	_swrast_Bitmap  	_swrast_CopyPixels @@ -84,15 +93,6 @@ EXPORTS  	_swrast_Clear  	_swrast_choose_line  	_swrast_choose_triangle -	_swrast_CopyColorSubTable -	_swrast_CopyColorTable -	_swrast_CopyConvolutionFilter1D -	_swrast_CopyConvolutionFilter2D -	_swrast_copy_teximage1d -	_swrast_copy_teximage2d -	_swrast_copy_texsubimage1d -	_swrast_copy_texsubimage2d -	_swrast_copy_texsubimage3d  	_swrast_CreateContext  	_swrast_DestroyContext  	_swrast_InvalidateState diff --git a/src/mesa/drivers/x11/xm_api.c b/src/mesa/drivers/x11/xm_api.c index 2c7be9f182..90efd86a6b 100644 --- a/src/mesa/drivers/x11/xm_api.c +++ b/src/mesa/drivers/x11/xm_api.c @@ -79,7 +79,6 @@  #include "tnl/t_context.h"  #include "tnl/t_pipeline.h"  #include "drivers/common/driverfuncs.h" -#include "drivers/common/meta.h"  /**   * Global X driver lock @@ -1317,6 +1316,7 @@ xmesa_convert_from_x_visual_type( int visualType )  #define need_GL_SGI_color_table  /* sw extensions not associated with some GL version */ +#define need_GL_ARB_draw_elements_base_vertex  #define need_GL_ARB_shader_objects  #define need_GL_ARB_sync  #define need_GL_ARB_vertex_program @@ -1347,6 +1347,8 @@ const struct dri_extension card_extensions[] =     { "GL_EXT_histogram",		GL_EXT_histogram_functions },     { "GL_SGI_color_table",		GL_SGI_color_table_functions }, +   { "GL_ARB_depth_clamp",		NULL }, +   { "GL_ARB_draw_elements_base_vertex", GL_ARB_draw_elements_base_vertex_functions },     { "GL_ARB_shader_objects",		GL_ARB_shader_objects_functions },     { "GL_ARB_sync",			GL_ARB_sync_functions },     { "GL_ARB_vertex_program",		GL_ARB_vertex_program_functions }, @@ -1358,6 +1360,7 @@ const struct dri_extension card_extensions[] =     { "GL_EXT_gpu_program_parameters",	GL_EXT_gpu_program_parameters_functions },     { "GL_EXT_paletted_texture",		GL_EXT_paletted_texture_functions },     { "GL_MESA_resize_buffers",		GL_MESA_resize_buffers_functions }, +   { "GL_NV_depth_clamp",		NULL },     { "GL_NV_vertex_program",		GL_NV_vertex_program_functions },     { "GL_NV_fragment_program",		GL_NV_fragment_program_functions },     { NULL,				NULL } @@ -1644,9 +1647,6 @@ XMesaContext XMesaCreateContext( XMesaVisual v, XMesaContext share_list )     xmesa_register_swrast_functions( mesaCtx );     _swsetup_Wakeup(mesaCtx); -   if (TEST_META_FUNCS) -      _mesa_meta_init(mesaCtx); -     return c;  } @@ -1661,9 +1661,6 @@ void XMesaDestroyContext( XMesaContext c )     FXdestroyContext( XMESA_BUFFER(mesaCtx->DrawBuffer) );  #endif -   if (TEST_META_FUNCS) -      _mesa_meta_free( mesaCtx ); -     _swsetup_DestroyContext( mesaCtx );     _swrast_DestroyContext( mesaCtx );     _tnl_DestroyContext( mesaCtx ); diff --git a/src/mesa/drivers/x11/xm_dd.c b/src/mesa/drivers/x11/xm_dd.c index 465a40ac8d..e2d4aa9b2d 100644 --- a/src/mesa/drivers/x11/xm_dd.c +++ b/src/mesa/drivers/x11/xm_dd.c @@ -1150,10 +1150,11 @@ xmesa_init_driver_functions( XMesaVisual xmvisual,     driver->Enable = enable;     driver->Viewport = xmesa_viewport;     if (TEST_META_FUNCS) { -      driver->Clear = _mesa_meta_clear; -      driver->CopyPixels = _mesa_meta_copy_pixels; -      driver->BlitFramebuffer = _mesa_meta_blit_framebuffer; -      driver->DrawPixels = _mesa_meta_draw_pixels; +      driver->Clear = _mesa_meta_Clear; +      driver->CopyPixels = _mesa_meta_CopyPixels; +      driver->BlitFramebuffer = _mesa_meta_BlitFramebuffer; +      driver->DrawPixels = _mesa_meta_DrawPixels; +      driver->Bitmap = _mesa_meta_Bitmap;     }     else {        driver->Clear = clear_buffers; @@ -1167,8 +1168,8 @@ xmesa_init_driver_functions( XMesaVisual xmvisual,        else if (xmvisual->undithered_pf == PF_5R6G5B) {           driver->DrawPixels = xmesa_DrawPixels_5R6G5B;        } -   }  #endif +   }     driver->TestProxyTexImage = test_proxy_teximage;  #if ENABLE_EXT_texure_compression_s3tc     driver->ChooseTextureFormat = choose_tex_format;  | 
