diff options
Diffstat (limited to 'src/mesa/main')
| -rw-r--r-- | src/mesa/main/bufferobj.c | 47 | ||||
| -rw-r--r-- | src/mesa/main/config.h | 4 | ||||
| -rw-r--r-- | src/mesa/main/debug.c | 2 | ||||
| -rw-r--r-- | src/mesa/main/image.c | 2 | ||||
| -rw-r--r-- | src/mesa/main/matrix.c | 10 | ||||
| -rw-r--r-- | src/mesa/main/queryobj.c | 16 | ||||
| -rw-r--r-- | src/mesa/main/queryobj.h | 3 | ||||
| -rw-r--r-- | src/mesa/main/shared.c | 2 | ||||
| -rw-r--r-- | src/mesa/main/texstore.c | 39 | 
9 files changed, 112 insertions, 13 deletions
| diff --git a/src/mesa/main/bufferobj.c b/src/mesa/main/bufferobj.c index 6b22881072..ba19e58cdb 100644 --- a/src/mesa/main/bufferobj.c +++ b/src/mesa/main/bufferobj.c @@ -39,6 +39,11 @@  #include "bufferobj.h" +/* Debug flags */ +/*#define VBO_DEBUG*/ +/*#define BOUNDS_CHECK*/ + +  #ifdef FEATURE_OES_mapbuffer  #define DEFAULT_ACCESS GL_MAP_WRITE_BIT  #else @@ -520,11 +525,15 @@ _mesa_copy_buffer_subdata(GLcontext *ctx,  void  _mesa_init_buffer_objects( GLcontext *ctx )  { -   ctx->Array.ArrayBufferObj = ctx->Shared->NullBufferObj; -   ctx->Array.ElementArrayBufferObj = ctx->Shared->NullBufferObj; +   _mesa_reference_buffer_object(ctx, &ctx->Array.ArrayBufferObj, +                                 ctx->Shared->NullBufferObj); +   _mesa_reference_buffer_object(ctx, &ctx->Array.ElementArrayBufferObj, +                                 ctx->Shared->NullBufferObj); -   ctx->CopyReadBuffer = ctx->Shared->NullBufferObj; -   ctx->CopyWriteBuffer = ctx->Shared->NullBufferObj; +   _mesa_reference_buffer_object(ctx, &ctx->CopyReadBuffer, +                                 ctx->Shared->NullBufferObj); +   _mesa_reference_buffer_object(ctx, &ctx->CopyWriteBuffer, +                                 ctx->Shared->NullBufferObj);  } @@ -1074,6 +1083,9 @@ _mesa_BufferDataARB(GLenum target, GLsizeiptrARB size,                  bufObj->Name, size, data, usage);  #endif +#ifdef BOUNDS_CHECK +   size += 100; +#endif     /* Give the buffer object to the driver!  <data> may be null! */     ctx->Driver.BufferData( ctx, target, size, data, usage, bufObj );  } @@ -1182,6 +1194,17 @@ _mesa_MapBufferARB(GLenum target, GLenum access)     }  #endif +#ifdef BOUNDS_CHECK +   { +      GLubyte *buf = (GLubyte *) bufObj->Pointer; +      GLuint i; +      /* buffer is 100 bytes larger than requested, fill with magic value */ +      for (i = 0; i < 100; i++) { +         buf[bufObj->Size - i - 1] = 123; +      } +   } +#endif +     return bufObj->Pointer;  } @@ -1208,6 +1231,22 @@ _mesa_UnmapBufferARB(GLenum target)        return GL_FALSE;     } +#ifdef BOUNDS_CHECK +   if (bufObj->Access != GL_READ_ONLY_ARB) { +      GLubyte *buf = (GLubyte *) bufObj->Pointer; +      GLuint i; +      /* check that last 100 bytes are still = magic value */ +      for (i = 0; i < 100; i++) { +         GLuint pos = bufObj->Size - i - 1; +         if (buf[pos] != 123) { +            _mesa_warning(ctx, "Out of bounds buffer object write detected" +                          " at position %d (value = %u)\n", +                          pos, buf[pos]); +         } +      } +   } +#endif +  #ifdef VBO_DEBUG     if (bufObj->AccessFlags & GL_MAP_WRITE_BIT) {        GLuint i, unchanged = 0; diff --git a/src/mesa/main/config.h b/src/mesa/main/config.h index 5a05a65396..f77a29a43e 100644 --- a/src/mesa/main/config.h +++ b/src/mesa/main/config.h @@ -179,7 +179,7 @@  /*@{*/  #define MAX_PROGRAM_INSTRUCTIONS  (16 * 1024)  #define MAX_PROGRAM_LOCAL_PARAMS 256 /**< per-program constants (power of two) */ -#define MAX_PROGRAM_ENV_PARAMS 128 +#define MAX_PROGRAM_ENV_PARAMS 256   /**< per-context constants (power of two) */  #define MAX_PROGRAM_MATRICES 8  #define MAX_PROGRAM_MATRIX_STACK_DEPTH 4  #define MAX_PROGRAM_CALL_DEPTH 8 @@ -196,7 +196,7 @@  /*@{*/  #define MAX_NV_VERTEX_PROGRAM_INSTRUCTIONS 128  #define MAX_NV_VERTEX_PROGRAM_TEMPS         12 -#define MAX_NV_VERTEX_PROGRAM_PARAMS        MAX_PROGRAM_ENV_PARAMS +#define MAX_NV_VERTEX_PROGRAM_PARAMS        96  #define MAX_NV_VERTEX_PROGRAM_INPUTS        16  #define MAX_NV_VERTEX_PROGRAM_OUTPUTS       15  /*@}*/ diff --git a/src/mesa/main/debug.c b/src/mesa/main/debug.c index 7276c22742..1c8c44fcb9 100644 --- a/src/mesa/main/debug.c +++ b/src/mesa/main/debug.c @@ -285,7 +285,7 @@ write_texture_image(struct gl_texture_object *texObj)        case MESA_FORMAT_RGB565:           {              GLubyte *buf2 = (GLubyte *) _mesa_malloc(img->Width * img->Height * 3); -            GLint i; +            GLuint i;              for (i = 0; i < img->Width * img->Height; i++) {                 GLint r, g, b;                 GLushort s = ((GLushort *) img->Data)[i]; diff --git a/src/mesa/main/image.c b/src/mesa/main/image.c index c06031e6cb..090e5eb330 100644 --- a/src/mesa/main/image.c +++ b/src/mesa/main/image.c @@ -2874,7 +2874,7 @@ extract_uint_indexes(GLuint n, GLuint indexes[],              }              else {                 for (i = 0; i < n; i++) -                  indexes[i] = s[i] & 0xfff;  /* lower 8 bits */ +                  indexes[i] = s[i] & 0xff;  /* lower 8 bits */              }           }           break; diff --git a/src/mesa/main/matrix.c b/src/mesa/main/matrix.c index 39b4967a58..ebc3cbd59c 100644 --- a/src/mesa/main/matrix.c +++ b/src/mesa/main/matrix.c @@ -160,11 +160,21 @@ _mesa_MatrixMode( GLenum mode )        ctx->CurrentStack = &ctx->ProjectionMatrixStack;        break;     case GL_TEXTURE: +      /* This error check is disabled because if we're called from +       * glPopAttrib() when the active texture unit is >= MaxTextureCoordUnits +       * we'll generate an unexpected error. +       * From the GL_ARB_vertex_shader spec it sounds like we should instead +       * do error checking in other places when we actually try to access +       * texture matrices beyond MaxTextureCoordUnits. +       */ +#if 0        if (ctx->Texture.CurrentUnit >= ctx->Const.MaxTextureCoordUnits) {           _mesa_error(ctx, GL_INVALID_OPERATION, "glMatrixMode(invalid tex unit %d)",                       ctx->Texture.CurrentUnit);           return;        } +#endif +      ASSERT(ctx->Texture.CurrentUnit < Elements(ctx->TextureMatrixStack));        ctx->CurrentStack = &ctx->TextureMatrixStack[ctx->Texture.CurrentUnit];        break;     case GL_COLOR: diff --git a/src/mesa/main/queryobj.c b/src/mesa/main/queryobj.c index 554e0b0d18..c25b31af02 100644 --- a/src/mesa/main/queryobj.c +++ b/src/mesa/main/queryobj.c @@ -83,13 +83,27 @@ void  _mesa_wait_query(GLcontext *ctx, struct gl_query_object *q)  {     /* For software drivers, _mesa_end_query() should have completed the query. -    * For real hardware, implement a proper WaitQuery() driver function. +    * For real hardware, implement a proper WaitQuery() driver function, +    * which may require issuing a flush.      */     assert(q->Ready);  }  /** + * Check if a query results are ready.  Software driver fallback. + * Called via ctx->Driver.CheckQuery(). + */ +void +_mesa_check_query(GLcontext *ctx, struct gl_query_object *q) +{ +   /* No-op for sw rendering. +    * HW drivers may need to flush at this time. +    */ +} + + +/**   * Delete a query object.  Called via ctx->Driver.DeleteQuery().   * Not removed from hash table here.   */ diff --git a/src/mesa/main/queryobj.h b/src/mesa/main/queryobj.h index 9a9774641b..bc02b65b54 100644 --- a/src/mesa/main/queryobj.h +++ b/src/mesa/main/queryobj.h @@ -48,6 +48,9 @@ _mesa_end_query(GLcontext *ctx, struct gl_query_object *q);  extern void  _mesa_wait_query(GLcontext *ctx, struct gl_query_object *q); +extern void +_mesa_check_query(GLcontext *ctx, struct gl_query_object *q); +  extern void GLAPIENTRY  _mesa_GenQueriesARB(GLsizei n, GLuint *ids); diff --git a/src/mesa/main/shared.c b/src/mesa/main/shared.c index 759883743d..731a154040 100644 --- a/src/mesa/main/shared.c +++ b/src/mesa/main/shared.c @@ -98,7 +98,7 @@ _mesa_alloc_shared_state(GLcontext *ctx)      * XXX with recent/improved refcounting this may not longer be needed.      */     shared->NullBufferObj = _mesa_new_buffer_object(ctx, 0, 0); -   shared->NullBufferObj->RefCount = 1000; +   shared->NullBufferObj->RefCount = 1000 * 1000 * 1000;     shared->ArrayObjects = _mesa_NewHashTable(); diff --git a/src/mesa/main/texstore.c b/src/mesa/main/texstore.c index f3739f950b..bfced1b3f4 100644 --- a/src/mesa/main/texstore.c +++ b/src/mesa/main/texstore.c @@ -2689,12 +2689,45 @@ GLboolean  _mesa_texstore_z24_s8(TEXSTORE_PARAMS)  {     const GLfloat depthScale = (GLfloat) 0xffffff; +   const GLint srcRowStride +      = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType) +      / sizeof(GLuint); +   GLint img, row;     ASSERT(dstFormat == &_mesa_texformat_z24_s8); -   ASSERT(srcFormat == GL_DEPTH_STENCIL_EXT); -   ASSERT(srcType == GL_UNSIGNED_INT_24_8_EXT); +   ASSERT(srcFormat == GL_DEPTH_STENCIL_EXT || srcFormat == GL_DEPTH_COMPONENT); +   ASSERT(srcFormat != GL_DEPTH_STENCIL_EXT || srcType == GL_UNSIGNED_INT_24_8_EXT); -   if (ctx->Pixel.DepthScale == 1.0f && +   /* In case we only upload depth we need to preserve the stencil */ +   if (srcFormat == GL_DEPTH_COMPONENT) { +      for (img = 0; img < srcDepth; img++) { +         GLuint *dstRow = (GLuint *) dstAddr +            + dstImageOffsets[dstZoffset + img] +            + dstYoffset * dstRowStride / sizeof(GLuint) +            + dstXoffset; +         const GLuint *src +            = (const GLuint *) _mesa_image_address(dims, srcPacking, srcAddr, +                  srcWidth, srcHeight, +                  srcFormat, srcType, +                  img, 0, 0); +         for (row = 0; row < srcHeight; row++) { +            GLuint depth[MAX_WIDTH]; +            GLint i; +            _mesa_unpack_depth_span(ctx, srcWidth, +                                    GL_UNSIGNED_INT, /* dst type */ +                                    depth, /* dst addr */ +                                    depthScale, +                                    srcType, src, srcPacking); + +            for (i = 0; i < srcWidth; i++) +               dstRow[i] = depth[i] << 8 | (dstRow[i] & 0x000000FF); + +            src += srcRowStride; +            dstRow += dstRowStride / sizeof(GLuint); +         } +      } +   } +   else if (ctx->Pixel.DepthScale == 1.0f &&         ctx->Pixel.DepthBias == 0.0f &&         !srcPacking->SwapBytes) {        /* simple path */ | 
