diff options
Diffstat (limited to 'mesalib/src/mesa/main')
-rw-r--r-- | mesalib/src/mesa/main/config.h | 93 | ||||
-rw-r--r-- | mesalib/src/mesa/main/context.c | 21 | ||||
-rw-r--r-- | mesalib/src/mesa/main/readpix.c | 120 | ||||
-rw-r--r-- | mesalib/src/mesa/main/texstore.c | 39 |
4 files changed, 124 insertions, 149 deletions
diff --git a/mesalib/src/mesa/main/config.h b/mesalib/src/mesa/main/config.h index 7b7740ebe..8bf741f99 100644 --- a/mesalib/src/mesa/main/config.h +++ b/mesalib/src/mesa/main/config.h @@ -46,9 +46,6 @@ /** Maximum texture matrix stack depth */ #define MAX_TEXTURE_STACK_DEPTH 10 -/** Maximum color matrix stack depth */ -#define MAX_COLOR_STACK_DEPTH 4 - /** Maximum attribute stack depth */ #define MAX_ATTRIB_STACK_DEPTH 16 @@ -74,11 +71,7 @@ #define MAX_AUX_BUFFERS 1 /** Maximum order (degree) of curves */ -#ifdef AMIGA -# define MAX_EVAL_ORDER 12 -#else -# define MAX_EVAL_ORDER 30 -#endif +#define MAX_EVAL_ORDER 30 /** Maximum Name stack depth */ #define MAX_NAME_STACK_DEPTH 64 @@ -115,7 +108,9 @@ /** Maximum rectangular texture size - GL_NV_texture_rectangle */ #define MAX_TEXTURE_RECT_SIZE 16384 -/** Maximum number of layers in a 1D or 2D array texture - GL_MESA_texture_array */ +/** + * Maximum number of layers in a 1D or 2D array texture - GL_MESA_texture_array + */ #define MAX_ARRAY_TEXTURE_LAYERS 64 /** @@ -141,34 +136,9 @@ #define MAX_TEXTURE_UNITS ((MAX_TEXTURE_COORD_UNITS > MAX_TEXTURE_IMAGE_UNITS) ? MAX_TEXTURE_COORD_UNITS : MAX_TEXTURE_IMAGE_UNITS) -/** - * Maximum viewport/image width. Must accomodate all texture sizes too. - */ - -#ifndef MAX_WIDTH -# define MAX_WIDTH 16384 -#endif -/** Maximum viewport/image height */ -#ifndef MAX_HEIGHT -# define MAX_HEIGHT 16384 -#endif - -/* XXX: hack to prevent stack overflow on windows until all temporary arrays - * [MAX_WIDTH] are allocated from the heap */ -#ifdef WIN32 -#undef MAX_TEXTURE_LEVELS -#undef MAX_3D_TEXTURE_LEVELS -#undef MAX_CUBE_TEXTURE_LEVELS -#undef MAX_TEXTURE_RECT_SIZE -#undef MAX_WIDTH -#undef MAX_HEIGHT -#define MAX_TEXTURE_LEVELS 13 -#define MAX_3D_TEXTURE_LEVELS 9 -#define MAX_CUBE_TEXTURE_LEVELS 13 -#define MAX_TEXTURE_RECT_SIZE 4096 -#define MAX_WIDTH 4096 -#define MAX_HEIGHT 4096 -#endif +/** Maximum viewport size */ +#define MAX_VIEWPORT_WIDTH 16384 +#define MAX_VIEWPORT_HEIGHT 16384 /** Maxmimum size for CVA. May be overridden by the drivers. */ #define MAX_ARRAY_LOCK_SIZE 3000 @@ -176,14 +146,6 @@ /** Subpixel precision for antialiasing, window coordinate snapping */ #define SUB_PIXEL_BITS 4 -/** Size of histogram tables */ -#define HISTOGRAM_TABLE_SIZE 256 - -/** Max convolution filter width */ -#define MAX_CONVOLUTION_WIDTH 9 -/** Max convolution filter height */ -#define MAX_CONVOLUTION_HEIGHT 9 - /** For GL_ARB_texture_compression */ #define MAX_COMPRESSED_TEXTURE_FORMATS 25 @@ -280,6 +242,7 @@ /** For GL_EXT_framebuffer_object */ /*@{*/ #define MAX_COLOR_ATTACHMENTS 8 +#define MAX_RENDERBUFFER_SIZE 16384 /*@}*/ /** For GL_ATI_envmap_bump - support bump mapping on first 8 units */ @@ -299,46 +262,6 @@ /*@}*/ -/** - * \name Mesa-specific parameters - */ -/*@{*/ - - -/** - * If non-zero use GLdouble for walking triangle edges, for better accuracy. - */ -#define TRIANGLE_WALK_DOUBLE 0 - - -/** - * Bits per depth buffer value (max is 32). - */ -#ifndef DEFAULT_SOFTWARE_DEPTH_BITS -#define DEFAULT_SOFTWARE_DEPTH_BITS 16 -#endif -/** Depth buffer data type */ -#if DEFAULT_SOFTWARE_DEPTH_BITS <= 16 -#define DEFAULT_SOFTWARE_DEPTH_TYPE GLushort -#else -#define DEFAULT_SOFTWARE_DEPTH_TYPE GLuint -#endif - - -/** - * Bits per stencil value: 8 - */ -#define STENCIL_BITS 8 - - -/** - * For swrast, bits per color channel: 8, 16 or 32 - */ -#ifndef CHAN_BITS -#define CHAN_BITS 8 -#endif - - /* * Color channel component order * diff --git a/mesalib/src/mesa/main/context.c b/mesalib/src/mesa/main/context.c index 43e7438ad..8d48904f8 100644 --- a/mesalib/src/mesa/main/context.c +++ b/mesalib/src/mesa/main/context.c @@ -268,7 +268,7 @@ _mesa_initialize_visual( struct gl_config *vis, if (depthBits < 0 || depthBits > 32) { return GL_FALSE; } - if (stencilBits < 0 || stencilBits > STENCIL_BITS) { + if (stencilBits < 0 || stencilBits > 8) { return GL_FALSE; } assert(accumRedBits >= 0); @@ -586,8 +586,8 @@ _mesa_init_constants(struct gl_context *ctx) ctx->Const.MaxLights = MAX_LIGHTS; ctx->Const.MaxShininess = 128.0; ctx->Const.MaxSpotExponent = 128.0; - ctx->Const.MaxViewportWidth = MAX_WIDTH; - ctx->Const.MaxViewportHeight = MAX_HEIGHT; + ctx->Const.MaxViewportWidth = MAX_VIEWPORT_WIDTH; + ctx->Const.MaxViewportHeight = MAX_VIEWPORT_HEIGHT; #if FEATURE_ARB_vertex_program init_program_limits(GL_VERTEX_PROGRAM_ARB, &ctx->Const.VertexProgram); #endif @@ -608,7 +608,7 @@ _mesa_init_constants(struct gl_context *ctx) #if FEATURE_EXT_framebuffer_object ctx->Const.MaxColorAttachments = MAX_COLOR_ATTACHMENTS; - ctx->Const.MaxRenderbufferSize = MAX_WIDTH; + ctx->Const.MaxRenderbufferSize = MAX_RENDERBUFFER_SIZE; #endif #if FEATURE_ARB_vertex_shader @@ -712,20 +712,15 @@ check_context_limits(struct gl_context *ctx) assert(ctx->Const.MaxCubeTextureLevels <= MAX_CUBE_TEXTURE_LEVELS); assert(ctx->Const.MaxTextureRectSize <= MAX_TEXTURE_RECT_SIZE); - /* make sure largest texture image is <= MAX_WIDTH in size */ - assert((1 << (ctx->Const.MaxTextureLevels - 1)) <= MAX_WIDTH); - assert((1 << (ctx->Const.MaxCubeTextureLevels - 1)) <= MAX_WIDTH); - assert((1 << (ctx->Const.Max3DTextureLevels - 1)) <= MAX_WIDTH); - /* Texture level checks */ assert(MAX_TEXTURE_LEVELS >= MAX_3D_TEXTURE_LEVELS); assert(MAX_TEXTURE_LEVELS >= MAX_CUBE_TEXTURE_LEVELS); /* Max texture size should be <= max viewport size (render to texture) */ - assert((1 << (MAX_TEXTURE_LEVELS - 1)) <= MAX_WIDTH); - - assert(ctx->Const.MaxViewportWidth <= MAX_WIDTH); - assert(ctx->Const.MaxViewportHeight <= MAX_WIDTH); + assert((1 << (ctx->Const.MaxTextureLevels - 1)) + <= ctx->Const.MaxViewportWidth); + assert((1 << (ctx->Const.MaxTextureLevels - 1)) + <= ctx->Const.MaxViewportHeight); assert(ctx->Const.MaxDrawBuffers <= MAX_DRAW_BUFFERS); diff --git a/mesalib/src/mesa/main/readpix.c b/mesalib/src/mesa/main/readpix.c index 48708a6eb..0f429ab22 100644 --- a/mesalib/src/mesa/main/readpix.c +++ b/mesalib/src/mesa/main/readpix.c @@ -110,6 +110,7 @@ read_depth_pixels( struct gl_context *ctx, GLint j; GLubyte *dst, *map; int dstStride, stride; + GLfloat *depthValues; if (!rb) return; @@ -119,8 +120,6 @@ read_depth_pixels( struct gl_context *ctx, ASSERT(y >= 0); ASSERT(x + width <= (GLint) rb->Width); ASSERT(y + height <= (GLint) rb->Height); - /* width should never be > MAX_WIDTH since we did clipping earlier */ - ASSERT(width <= MAX_WIDTH); if (fast_read_depth_pixels(ctx, x, y, width, height, type, pixels, packing)) return; @@ -136,16 +135,24 @@ read_depth_pixels( struct gl_context *ctx, return; } - /* General case (slower) */ - for (j = 0; j < height; j++, y++) { - GLfloat depthValues[MAX_WIDTH]; - _mesa_unpack_float_z_row(rb->Format, width, map, depthValues); - _mesa_pack_depth_span(ctx, width, dst, type, depthValues, packing); + depthValues = (GLfloat *) malloc(width * sizeof(GLfloat)); - dst += dstStride; - map += stride; + if (depthValues) { + /* General case (slower) */ + for (j = 0; j < height; j++, y++) { + _mesa_unpack_float_z_row(rb->Format, width, map, depthValues); + _mesa_pack_depth_span(ctx, width, dst, type, depthValues, packing); + + dst += dstStride; + map += stride; + } + } + else { + _mesa_error(ctx, GL_OUT_OF_MEMORY, "glReadPixels"); } + free(depthValues); + ctx->Driver.UnmapRenderbuffer(ctx, rb); } @@ -163,15 +170,12 @@ read_stencil_pixels( struct gl_context *ctx, struct gl_framebuffer *fb = ctx->ReadBuffer; struct gl_renderbuffer *rb = fb->Attachment[BUFFER_STENCIL].Renderbuffer; GLint j; - GLubyte *map; + GLubyte *map, *stencil; GLint stride; if (!rb) return; - /* width should never be > MAX_WIDTH since we did clipping earlier */ - ASSERT(width <= MAX_WIDTH); - ctx->Driver.MapRenderbuffer(ctx, rb, x, y, width, height, GL_MAP_READ_BIT, &map, &stride); if (!map) { @@ -179,19 +183,27 @@ read_stencil_pixels( struct gl_context *ctx, return; } - /* process image row by row */ - for (j = 0; j < height; j++) { - GLvoid *dest; - GLubyte stencil[MAX_WIDTH]; + stencil = (GLubyte *) malloc(width * sizeof(GLubyte)); - _mesa_unpack_ubyte_stencil_row(rb->Format, width, map, stencil); - dest = _mesa_image_address2d(packing, pixels, width, height, - GL_STENCIL_INDEX, type, j, 0); + if (stencil) { + /* process image row by row */ + for (j = 0; j < height; j++) { + GLvoid *dest; - _mesa_pack_stencil_span(ctx, width, type, dest, stencil, packing); + _mesa_unpack_ubyte_stencil_row(rb->Format, width, map, stencil); + dest = _mesa_image_address2d(packing, pixels, width, height, + GL_STENCIL_INDEX, type, j, 0); - map += stride; + _mesa_pack_stencil_span(ctx, width, type, dest, stencil, packing); + + map += stride; + } } + else { + _mesa_error(ctx, GL_OUT_OF_MEMORY, "glReadPixels"); + } + + free(stencil); ctx->Driver.UnmapRenderbuffer(ctx, rb); } @@ -378,7 +390,7 @@ fast_read_depth_stencil_pixels_separate(struct gl_context *ctx, struct gl_framebuffer *fb = ctx->ReadBuffer; struct gl_renderbuffer *depthRb = fb->Attachment[BUFFER_DEPTH].Renderbuffer; struct gl_renderbuffer *stencilRb = fb->Attachment[BUFFER_STENCIL].Renderbuffer; - GLubyte *depthMap, *stencilMap; + GLubyte *depthMap, *stencilMap, *stencilVals; int depthStride, stencilStride, i, j; if (_mesa_get_format_datatype(depthRb->Format) != GL_UNSIGNED_NORMALIZED) @@ -399,21 +411,28 @@ fast_read_depth_stencil_pixels_separate(struct gl_context *ctx, return GL_TRUE; /* don't bother trying the slow path */ } - for (j = 0; j < height; j++) { - GLubyte stencilVals[MAX_WIDTH]; + stencilVals = (GLubyte *) malloc(width * sizeof(GLubyte)); - _mesa_unpack_uint_z_row(depthRb->Format, width, depthMap, dst); - _mesa_unpack_ubyte_stencil_row(stencilRb->Format, width, - stencilMap, stencilVals); + if (stencilVals) { + for (j = 0; j < height; j++) { + _mesa_unpack_uint_z_row(depthRb->Format, width, depthMap, dst); + _mesa_unpack_ubyte_stencil_row(stencilRb->Format, width, + stencilMap, stencilVals); - for (i = 0; i < width; i++) { - dst[i] = (dst[i] & 0xffffff00) | stencilVals[i]; - } + for (i = 0; i < width; i++) { + dst[i] = (dst[i] & 0xffffff00) | stencilVals[i]; + } - depthMap += depthStride; - stencilMap += stencilStride; - dst += dstStride / 4; + depthMap += depthStride; + stencilMap += stencilStride; + dst += dstStride / 4; + } } + else { + _mesa_error(ctx, GL_OUT_OF_MEMORY, "glReadPixels"); + } + + free(stencilVals); ctx->Driver.UnmapRenderbuffer(ctx, depthRb); ctx->Driver.UnmapRenderbuffer(ctx, stencilRb); @@ -434,6 +453,9 @@ slow_read_depth_stencil_pixels_separate(struct gl_context *ctx, struct gl_renderbuffer *stencilRb = fb->Attachment[BUFFER_STENCIL].Renderbuffer; GLubyte *depthMap, *stencilMap; int depthStride, stencilStride, j; + GLubyte *stencilVals; + GLfloat *depthVals; + /* The depth and stencil buffers might be separate, or a single buffer. * If one buffer, only map it once. @@ -460,21 +482,29 @@ slow_read_depth_stencil_pixels_separate(struct gl_context *ctx, stencilStride = depthStride; } - for (j = 0; j < height; j++) { - GLubyte stencilVals[MAX_WIDTH]; - GLfloat depthVals[MAX_WIDTH]; + stencilVals = (GLubyte *) malloc(width * sizeof(GLubyte)); + depthVals = (GLfloat *) malloc(width * sizeof(GLfloat)); - _mesa_unpack_float_z_row(depthRb->Format, width, depthMap, depthVals); - _mesa_unpack_ubyte_stencil_row(stencilRb->Format, width, - stencilMap, stencilVals); + if (stencilVals && depthVals) { + for (j = 0; j < height; j++) { + _mesa_unpack_float_z_row(depthRb->Format, width, depthMap, depthVals); + _mesa_unpack_ubyte_stencil_row(stencilRb->Format, width, + stencilMap, stencilVals); - _mesa_pack_depth_stencil_span(ctx, width, type, (GLuint *)dst, - depthVals, stencilVals, packing); + _mesa_pack_depth_stencil_span(ctx, width, type, (GLuint *)dst, + depthVals, stencilVals, packing); - depthMap += depthStride; - stencilMap += stencilStride; - dst += dstStride; + depthMap += depthStride; + stencilMap += stencilStride; + dst += dstStride; + } } + else { + _mesa_error(ctx, GL_OUT_OF_MEMORY, "glReadPixels"); + } + + free(stencilVals); + free(depthVals); ctx->Driver.UnmapRenderbuffer(ctx, depthRb); if (stencilRb != depthRb) { diff --git a/mesalib/src/mesa/main/texstore.c b/mesalib/src/mesa/main/texstore.c index e8190c392..d368b1868 100644 --- a/mesalib/src/mesa/main/texstore.c +++ b/mesalib/src/mesa/main/texstore.c @@ -2797,6 +2797,15 @@ _mesa_texstore_z24_s8(TEXSTORE_PARAMS) } else if (srcFormat == GL_DEPTH_COMPONENT || srcFormat == GL_STENCIL_INDEX) { + GLuint *depth = (GLuint *) malloc(srcWidth * sizeof(GLuint)); + GLubyte *stencil = (GLubyte *) malloc(srcWidth * sizeof(GLubyte)); + + if (!depth || !stencil) { + free(depth); + free(stencil); + return GL_FALSE; + } + /* In case we only upload depth we need to preserve the stencil */ for (img = 0; img < srcDepth; img++) { GLuint *dstRow = (GLuint *) dstSlices[img]; @@ -2806,8 +2815,6 @@ _mesa_texstore_z24_s8(TEXSTORE_PARAMS) srcFormat, srcType, img, 0, 0); for (row = 0; row < srcHeight; row++) { - GLuint depth[MAX_WIDTH]; - GLubyte stencil[MAX_WIDTH]; GLint i; GLboolean keepdepth = GL_FALSE, keepstencil = GL_FALSE; @@ -2845,6 +2852,9 @@ _mesa_texstore_z24_s8(TEXSTORE_PARAMS) dstRow += dstRowStride / sizeof(GLuint); } } + + free(depth); + free(stencil); } return GL_TRUE; } @@ -2860,6 +2870,8 @@ _mesa_texstore_s8_z24(TEXSTORE_PARAMS) const GLint srcRowStride = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); GLint img, row; + GLuint *depth; + GLubyte *stencil; ASSERT(dstFormat == MESA_FORMAT_S8_Z24); ASSERT(srcFormat == GL_DEPTH_STENCIL_EXT || @@ -2868,6 +2880,15 @@ _mesa_texstore_s8_z24(TEXSTORE_PARAMS) ASSERT(srcFormat != GL_DEPTH_STENCIL_EXT || srcType == GL_UNSIGNED_INT_24_8_EXT); + depth = (GLuint *) malloc(srcWidth * sizeof(GLuint)); + stencil = (GLubyte *) malloc(srcWidth * sizeof(GLubyte)); + + if (!depth || !stencil) { + free(depth); + free(stencil); + return GL_FALSE; + } + for (img = 0; img < srcDepth; img++) { GLuint *dstRow = (GLuint *) dstSlices[img]; const GLubyte *src @@ -2876,8 +2897,6 @@ _mesa_texstore_s8_z24(TEXSTORE_PARAMS) srcFormat, srcType, img, 0, 0); for (row = 0; row < srcHeight; row++) { - GLuint depth[MAX_WIDTH]; - GLubyte stencil[MAX_WIDTH]; GLint i; GLboolean keepdepth = GL_FALSE, keepstencil = GL_FALSE; @@ -2916,6 +2935,10 @@ _mesa_texstore_s8_z24(TEXSTORE_PARAMS) dstRow += dstRowStride / sizeof(GLuint); } } + + free(depth); + free(stencil); + return GL_TRUE; } @@ -2944,7 +2967,11 @@ _mesa_texstore_s8(TEXSTORE_PARAMS) const GLint srcRowStride = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); GLint img, row; - + GLubyte *stencil = (GLubyte *) malloc(srcWidth * sizeof(GLubyte)); + + if (!stencil) + return GL_FALSE; + for (img = 0; img < srcDepth; img++) { GLubyte *dstRow = dstSlices[img]; const GLubyte *src @@ -2953,7 +2980,6 @@ _mesa_texstore_s8(TEXSTORE_PARAMS) srcFormat, srcType, img, 0, 0); for (row = 0; row < srcHeight; row++) { - GLubyte stencil[MAX_WIDTH]; GLint i; /* get the 8-bit stencil values */ @@ -2971,6 +2997,7 @@ _mesa_texstore_s8(TEXSTORE_PARAMS) } } + free(stencil); } return GL_TRUE; |