X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fmain%2Fpixel.c;h=9940eda5250c0c3f54e7153627cbaf43bde066f8;hb=5b0012f5c27b05d3caa8081165dbaebddefc414f;hp=fcef6dfd4225acb5e63b4afd8142911d11a38ef6;hpb=4b1cbfcbe66161a7b56d56cd9e2c35ce49b3a91d;p=mesa.git diff --git a/src/mesa/main/pixel.c b/src/mesa/main/pixel.c index fcef6dfd422..9940eda5250 100644 --- a/src/mesa/main/pixel.c +++ b/src/mesa/main/pixel.c @@ -32,10 +32,12 @@ #include "bufferobj.h" #include "colormac.h" #include "context.h" -#include "image.h" #include "macros.h" +#include "mfeatures.h" #include "pixel.h" +#include "pbo.h" #include "mtypes.h" +#include "main/dispatch.h" /**********************************************************************/ @@ -47,6 +49,8 @@ _mesa_PixelZoom( GLfloat xfactor, GLfloat yfactor ) { GET_CURRENT_CONTEXT(ctx); + ASSERT_OUTSIDE_BEGIN_END(ctx); + if (ctx->Pixel.ZoomX == xfactor && ctx->Pixel.ZoomY == yfactor) return; @@ -66,7 +70,7 @@ _mesa_PixelZoom( GLfloat xfactor, GLfloat yfactor ) * Return pointer to a pixelmap by name. */ static struct gl_pixelmap * -get_pixelmap(GLcontext *ctx, GLenum map) +get_pixelmap(struct gl_context *ctx, GLenum map) { switch (map) { case GL_PIXEL_MAP_I_TO_I: @@ -99,7 +103,7 @@ get_pixelmap(GLcontext *ctx, GLenum map) * Helper routine used by the other _mesa_PixelMap() functions. */ static void -store_pixelmap(GLcontext *ctx, GLenum map, GLsizei mapsize, +store_pixelmap(struct gl_context *ctx, GLenum map, GLsizei mapsize, const GLfloat *values) { GLint i; @@ -130,7 +134,6 @@ store_pixelmap(GLcontext *ctx, GLenum map, GLsizei mapsize, for (i = 0; i < mapsize; i++) { GLfloat val = CLAMP(values[i], 0.0F, 1.0F); pm->Map[i] = val; - pm->Map8[i] = (GLint) (val * 255.0F); } } } @@ -140,24 +143,35 @@ store_pixelmap(GLcontext *ctx, GLenum map, GLsizei mapsize, * Convenience wrapper for _mesa_validate_pbo_access() for gl[Get]PixelMap(). */ static GLboolean -validate_pbo_access(GLcontext *ctx, struct gl_pixelstore_attrib *pack, - GLsizei mapsize, GLenum format, GLenum type, +validate_pbo_access(struct gl_context *ctx, + struct gl_pixelstore_attrib *pack, GLsizei mapsize, + GLenum format, GLenum type, GLsizei clientMemSize, const GLvoid *ptr) { GLboolean ok; /* Note, need to use DefaultPacking and Unpack's buffer object */ - ctx->DefaultPacking.BufferObj = pack->BufferObj; + _mesa_reference_buffer_object(ctx, + &ctx->DefaultPacking.BufferObj, + pack->BufferObj); ok = _mesa_validate_pbo_access(1, &ctx->DefaultPacking, mapsize, 1, 1, - format, type, ptr); + format, type, clientMemSize, ptr); /* restore */ - ctx->DefaultPacking.BufferObj = ctx->Shared->NullBufferObj; + _mesa_reference_buffer_object(ctx, + &ctx->DefaultPacking.BufferObj, + ctx->Shared->NullBufferObj); if (!ok) { - _mesa_error(ctx, GL_INVALID_OPERATION, - "glPixelMap(invalid PBO access)"); + if (_mesa_is_bufferobj(pack->BufferObj)) { + _mesa_error(ctx, GL_INVALID_OPERATION, + "gl[Get]PixelMap*v(out of bounds PBO access)"); + } else { + _mesa_error(ctx, GL_INVALID_OPERATION, + "glGetnPixelMap*vARB(out of bounds access:" + " bufSize (%d) is too small)", clientMemSize); + } } return ok; } @@ -185,8 +199,8 @@ _mesa_PixelMapfv( GLenum map, GLsizei mapsize, const GLfloat *values ) FLUSH_VERTICES(ctx, _NEW_PIXEL); - if (!validate_pbo_access(ctx, &ctx->Unpack, mapsize, - GL_INTENSITY, GL_FLOAT, values)) { + if (!validate_pbo_access(ctx, &ctx->Unpack, mapsize, GL_INTENSITY, + GL_FLOAT, INT_MAX, values)) { return; } @@ -227,8 +241,8 @@ _mesa_PixelMapuiv(GLenum map, GLsizei mapsize, const GLuint *values ) FLUSH_VERTICES(ctx, _NEW_PIXEL); - if (!validate_pbo_access(ctx, &ctx->Unpack, mapsize, - GL_INTENSITY, GL_UNSIGNED_INT, values)) { + if (!validate_pbo_access(ctx, &ctx->Unpack, mapsize, GL_INTENSITY, + GL_UNSIGNED_INT, INT_MAX, values)) { return; } @@ -283,8 +297,8 @@ _mesa_PixelMapusv(GLenum map, GLsizei mapsize, const GLushort *values ) FLUSH_VERTICES(ctx, _NEW_PIXEL); - if (!validate_pbo_access(ctx, &ctx->Unpack, mapsize, - GL_INTENSITY, GL_UNSIGNED_SHORT, values)) { + if (!validate_pbo_access(ctx, &ctx->Unpack, mapsize, GL_INTENSITY, + GL_UNSIGNED_SHORT, INT_MAX, values)) { return; } @@ -318,10 +332,10 @@ _mesa_PixelMapusv(GLenum map, GLsizei mapsize, const GLushort *values ) void GLAPIENTRY -_mesa_GetPixelMapfv( GLenum map, GLfloat *values ) +_mesa_GetnPixelMapfvARB( GLenum map, GLsizei bufSize, GLfloat *values ) { GET_CURRENT_CONTEXT(ctx); - GLuint mapsize, i; + GLint mapsize, i; const struct gl_pixelmap *pm; ASSERT_OUTSIDE_BEGIN_END(ctx); @@ -334,8 +348,8 @@ _mesa_GetPixelMapfv( GLenum map, GLfloat *values ) mapsize = pm->Size; - if (!validate_pbo_access(ctx, &ctx->Pack, mapsize, - GL_INTENSITY, GL_FLOAT, values)) { + if (!validate_pbo_access(ctx, &ctx->Pack, mapsize, GL_INTENSITY, + GL_FLOAT, bufSize, values)) { return; } @@ -355,7 +369,7 @@ _mesa_GetPixelMapfv( GLenum map, GLfloat *values ) } } else { - MEMCPY(values, pm->Map, mapsize * sizeof(GLfloat)); + memcpy(values, pm->Map, mapsize * sizeof(GLfloat)); } _mesa_unmap_pbo_dest(ctx, &ctx->Pack); @@ -363,7 +377,13 @@ _mesa_GetPixelMapfv( GLenum map, GLfloat *values ) void GLAPIENTRY -_mesa_GetPixelMapuiv( GLenum map, GLuint *values ) +_mesa_GetPixelMapfv( GLenum map, GLfloat *values ) +{ + _mesa_GetnPixelMapfvARB(map, INT_MAX, values); +} + +void GLAPIENTRY +_mesa_GetnPixelMapuivARB( GLenum map, GLsizei bufSize, GLuint *values ) { GET_CURRENT_CONTEXT(ctx); GLint mapsize, i; @@ -376,10 +396,11 @@ _mesa_GetPixelMapuiv( GLenum map, GLuint *values ) _mesa_error(ctx, GL_INVALID_ENUM, "glGetPixelMapuiv(map)"); return; } + mapsize = pm->Size; - if (!validate_pbo_access(ctx, &ctx->Pack, mapsize, - GL_INTENSITY, GL_UNSIGNED_INT, values)) { + if (!validate_pbo_access(ctx, &ctx->Pack, mapsize, GL_INTENSITY, + GL_UNSIGNED_INT, bufSize, values)) { return; } @@ -394,7 +415,7 @@ _mesa_GetPixelMapuiv( GLenum map, GLuint *values ) if (map == GL_PIXEL_MAP_S_TO_S) { /* special case */ - MEMCPY(values, ctx->PixelMaps.StoS.Map, mapsize * sizeof(GLint)); + memcpy(values, ctx->PixelMaps.StoS.Map, mapsize * sizeof(GLint)); } else { for (i = 0; i < mapsize; i++) { @@ -407,7 +428,13 @@ _mesa_GetPixelMapuiv( GLenum map, GLuint *values ) void GLAPIENTRY -_mesa_GetPixelMapusv( GLenum map, GLushort *values ) +_mesa_GetPixelMapuiv( GLenum map, GLuint *values ) +{ + _mesa_GetnPixelMapuivARB(map, INT_MAX, values); +} + +void GLAPIENTRY +_mesa_GetnPixelMapusvARB( GLenum map, GLsizei bufSize, GLushort *values ) { GET_CURRENT_CONTEXT(ctx); GLint mapsize, i; @@ -420,10 +447,11 @@ _mesa_GetPixelMapusv( GLenum map, GLushort *values ) _mesa_error(ctx, GL_INVALID_ENUM, "glGetPixelMapusv(map)"); return; } - mapsize = pm ? pm->Size : 0; - if (!validate_pbo_access(ctx, &ctx->Pack, mapsize, - GL_INTENSITY, GL_UNSIGNED_SHORT, values)) { + mapsize = pm->Size; + + if (!validate_pbo_access(ctx, &ctx->Pack, mapsize, GL_INTENSITY, + GL_UNSIGNED_SHORT, bufSize, values)) { return; } @@ -458,6 +486,12 @@ _mesa_GetPixelMapusv( GLenum map, GLushort *values ) } +void GLAPIENTRY +_mesa_GetPixelMapusv( GLenum map, GLushort *values ) +{ + _mesa_GetnPixelMapusvARB(map, INT_MAX, values); +} + /**********************************************************************/ /***** glPixelTransfer *****/ @@ -559,102 +593,6 @@ _mesa_PixelTransferf( GLenum pname, GLfloat param ) FLUSH_VERTICES(ctx, _NEW_PIXEL); ctx->Pixel.DepthBias = param; break; - case GL_POST_COLOR_MATRIX_RED_SCALE: - if (ctx->Pixel.PostColorMatrixScale[0] == param) - return; - FLUSH_VERTICES(ctx, _NEW_PIXEL); - ctx->Pixel.PostColorMatrixScale[0] = param; - break; - case GL_POST_COLOR_MATRIX_RED_BIAS: - if (ctx->Pixel.PostColorMatrixBias[0] == param) - return; - FLUSH_VERTICES(ctx, _NEW_PIXEL); - ctx->Pixel.PostColorMatrixBias[0] = param; - break; - case GL_POST_COLOR_MATRIX_GREEN_SCALE: - if (ctx->Pixel.PostColorMatrixScale[1] == param) - return; - FLUSH_VERTICES(ctx, _NEW_PIXEL); - ctx->Pixel.PostColorMatrixScale[1] = param; - break; - case GL_POST_COLOR_MATRIX_GREEN_BIAS: - if (ctx->Pixel.PostColorMatrixBias[1] == param) - return; - FLUSH_VERTICES(ctx, _NEW_PIXEL); - ctx->Pixel.PostColorMatrixBias[1] = param; - break; - case GL_POST_COLOR_MATRIX_BLUE_SCALE: - if (ctx->Pixel.PostColorMatrixScale[2] == param) - return; - FLUSH_VERTICES(ctx, _NEW_PIXEL); - ctx->Pixel.PostColorMatrixScale[2] = param; - break; - case GL_POST_COLOR_MATRIX_BLUE_BIAS: - if (ctx->Pixel.PostColorMatrixBias[2] == param) - return; - FLUSH_VERTICES(ctx, _NEW_PIXEL); - ctx->Pixel.PostColorMatrixBias[2] = param; - break; - case GL_POST_COLOR_MATRIX_ALPHA_SCALE: - if (ctx->Pixel.PostColorMatrixScale[3] == param) - return; - FLUSH_VERTICES(ctx, _NEW_PIXEL); - ctx->Pixel.PostColorMatrixScale[3] = param; - break; - case GL_POST_COLOR_MATRIX_ALPHA_BIAS: - if (ctx->Pixel.PostColorMatrixBias[3] == param) - return; - FLUSH_VERTICES(ctx, _NEW_PIXEL); - ctx->Pixel.PostColorMatrixBias[3] = param; - break; - case GL_POST_CONVOLUTION_RED_SCALE: - if (ctx->Pixel.PostConvolutionScale[0] == param) - return; - FLUSH_VERTICES(ctx, _NEW_PIXEL); - ctx->Pixel.PostConvolutionScale[0] = param; - break; - case GL_POST_CONVOLUTION_RED_BIAS: - if (ctx->Pixel.PostConvolutionBias[0] == param) - return; - FLUSH_VERTICES(ctx, _NEW_PIXEL); - ctx->Pixel.PostConvolutionBias[0] = param; - break; - case GL_POST_CONVOLUTION_GREEN_SCALE: - if (ctx->Pixel.PostConvolutionScale[1] == param) - return; - FLUSH_VERTICES(ctx, _NEW_PIXEL); - ctx->Pixel.PostConvolutionScale[1] = param; - break; - case GL_POST_CONVOLUTION_GREEN_BIAS: - if (ctx->Pixel.PostConvolutionBias[1] == param) - return; - FLUSH_VERTICES(ctx, _NEW_PIXEL); - ctx->Pixel.PostConvolutionBias[1] = param; - break; - case GL_POST_CONVOLUTION_BLUE_SCALE: - if (ctx->Pixel.PostConvolutionScale[2] == param) - return; - FLUSH_VERTICES(ctx, _NEW_PIXEL); - ctx->Pixel.PostConvolutionScale[2] = param; - break; - case GL_POST_CONVOLUTION_BLUE_BIAS: - if (ctx->Pixel.PostConvolutionBias[2] == param) - return; - FLUSH_VERTICES(ctx, _NEW_PIXEL); - ctx->Pixel.PostConvolutionBias[2] = param; - break; - case GL_POST_CONVOLUTION_ALPHA_SCALE: - if (ctx->Pixel.PostConvolutionScale[3] == param) - return; - FLUSH_VERTICES(ctx, _NEW_PIXEL); - ctx->Pixel.PostConvolutionScale[3] = param; - break; - case GL_POST_CONVOLUTION_ALPHA_BIAS: - if (ctx->Pixel.PostConvolutionBias[3] == param) - return; - FLUSH_VERTICES(ctx, _NEW_PIXEL); - ctx->Pixel.PostConvolutionBias[3] = param; - break; default: _mesa_error( ctx, GL_INVALID_ENUM, "glPixelTransfer(pname)" ); return; @@ -679,7 +617,7 @@ _mesa_PixelTransferi( GLenum pname, GLint param ) * pixel transfer operations are enabled. */ static void -update_image_transfer_state(GLcontext *ctx) +update_image_transfer_state(struct gl_context *ctx) { GLuint mask = 0; @@ -695,48 +633,6 @@ update_image_transfer_state(GLcontext *ctx) if (ctx->Pixel.MapColorFlag) mask |= IMAGE_MAP_COLOR_BIT; - if (ctx->Pixel.ColorTableEnabled[COLORTABLE_PRECONVOLUTION]) - mask |= IMAGE_COLOR_TABLE_BIT; - - if (ctx->Pixel.Convolution1DEnabled || - ctx->Pixel.Convolution2DEnabled || - ctx->Pixel.Separable2DEnabled) { - mask |= IMAGE_CONVOLUTION_BIT; - if (ctx->Pixel.PostConvolutionScale[0] != 1.0F || - ctx->Pixel.PostConvolutionScale[1] != 1.0F || - ctx->Pixel.PostConvolutionScale[2] != 1.0F || - ctx->Pixel.PostConvolutionScale[3] != 1.0F || - ctx->Pixel.PostConvolutionBias[0] != 0.0F || - ctx->Pixel.PostConvolutionBias[1] != 0.0F || - ctx->Pixel.PostConvolutionBias[2] != 0.0F || - ctx->Pixel.PostConvolutionBias[3] != 0.0F) { - mask |= IMAGE_POST_CONVOLUTION_SCALE_BIAS; - } - } - - if (ctx->Pixel.ColorTableEnabled[COLORTABLE_POSTCONVOLUTION]) - mask |= IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT; - - if (ctx->ColorMatrixStack.Top->type != MATRIX_IDENTITY || - ctx->Pixel.PostColorMatrixScale[0] != 1.0F || - ctx->Pixel.PostColorMatrixBias[0] != 0.0F || - ctx->Pixel.PostColorMatrixScale[1] != 1.0F || - ctx->Pixel.PostColorMatrixBias[1] != 0.0F || - ctx->Pixel.PostColorMatrixScale[2] != 1.0F || - ctx->Pixel.PostColorMatrixBias[2] != 0.0F || - ctx->Pixel.PostColorMatrixScale[3] != 1.0F || - ctx->Pixel.PostColorMatrixBias[3] != 0.0F) - mask |= IMAGE_COLOR_MATRIX_BIT; - - if (ctx->Pixel.ColorTableEnabled[COLORTABLE_POSTCOLORMATRIX]) - mask |= IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT; - - if (ctx->Pixel.HistogramEnabled) - mask |= IMAGE_HISTOGRAM_BIT; - - if (ctx->Pixel.MinMaxEnabled) - mask |= IMAGE_MIN_MAX_BIT; - ctx->_ImageTransferState = mask; } @@ -744,14 +640,9 @@ update_image_transfer_state(GLcontext *ctx) /** * Update mesa pixel transfer derived state. */ -void _mesa_update_pixel( GLcontext *ctx, GLuint new_state ) +void _mesa_update_pixel( struct gl_context *ctx, GLuint new_state ) { - if (new_state & _NEW_COLOR_MATRIX) - _math_matrix_analyse( ctx->ColorMatrixStack.Top ); - - /* References ColorMatrix.type (derived above). - */ - if (new_state & _MESA_NEW_TRANSFER_STATE) + if (new_state & _NEW_PIXEL) update_image_transfer_state(ctx); } @@ -765,7 +656,6 @@ init_pixelmap(struct gl_pixelmap *map) { map->Size = 1; map->Map[0] = 0.0; - map->Map8[0] = 0; } @@ -773,10 +663,8 @@ init_pixelmap(struct gl_pixelmap *map) * Initialize the context's PIXEL attribute group. */ void -_mesa_init_pixel( GLcontext *ctx ) +_mesa_init_pixel( struct gl_context *ctx ) { - int i; - /* Pixel group */ ctx->Pixel.RedBias = 0.0; ctx->Pixel.RedScale = 1.0; @@ -804,34 +692,6 @@ _mesa_init_pixel( GLcontext *ctx ) init_pixelmap(&ctx->PixelMaps.GtoG); init_pixelmap(&ctx->PixelMaps.BtoB); init_pixelmap(&ctx->PixelMaps.AtoA); - ctx->Pixel.HistogramEnabled = GL_FALSE; - ctx->Pixel.MinMaxEnabled = GL_FALSE; - ASSIGN_4V(ctx->Pixel.PostColorMatrixScale, 1.0, 1.0, 1.0, 1.0); - ASSIGN_4V(ctx->Pixel.PostColorMatrixBias, 0.0, 0.0, 0.0, 0.0); - for (i = 0; i < COLORTABLE_MAX; i++) { - ASSIGN_4V(ctx->Pixel.ColorTableScale[i], 1.0, 1.0, 1.0, 1.0); - ASSIGN_4V(ctx->Pixel.ColorTableBias[i], 0.0, 0.0, 0.0, 0.0); - ctx->Pixel.ColorTableEnabled[i] = GL_FALSE; - } - ctx->Pixel.Convolution1DEnabled = GL_FALSE; - ctx->Pixel.Convolution2DEnabled = GL_FALSE; - ctx->Pixel.Separable2DEnabled = GL_FALSE; - for (i = 0; i < 3; i++) { - ASSIGN_4V(ctx->Pixel.ConvolutionBorderColor[i], 0.0, 0.0, 0.0, 0.0); - ctx->Pixel.ConvolutionBorderMode[i] = GL_REDUCE; - ASSIGN_4V(ctx->Pixel.ConvolutionFilterScale[i], 1.0, 1.0, 1.0, 1.0); - ASSIGN_4V(ctx->Pixel.ConvolutionFilterBias[i], 0.0, 0.0, 0.0, 0.0); - } - for (i = 0; i < MAX_CONVOLUTION_WIDTH * MAX_CONVOLUTION_WIDTH * 4; i++) { - ctx->Convolution1D.Filter[i] = 0.0; - ctx->Convolution2D.Filter[i] = 0.0; - ctx->Separable2D.Filter[i] = 0.0; - } - ASSIGN_4V(ctx->Pixel.PostConvolutionScale, 1.0, 1.0, 1.0, 1.0); - ASSIGN_4V(ctx->Pixel.PostConvolutionBias, 0.0, 0.0, 0.0, 0.0); - /* GL_SGI_texture_color_table */ - ASSIGN_4V(ctx->Pixel.TextureColorTableScale, 1.0, 1.0, 1.0, 1.0); - ASSIGN_4V(ctx->Pixel.TextureColorTableBias, 0.0, 0.0, 0.0, 0.0); if (ctx->Visual.doubleBufferMode) { ctx->Pixel.ReadBuffer = GL_BACK;