diff options
author | marha <marha@users.sourceforge.net> | 2012-02-06 08:33:58 +0100 |
---|---|---|
committer | marha <marha@users.sourceforge.net> | 2012-02-06 08:33:58 +0100 |
commit | ebb6162f9cbc1af0fac0b670b5aa38c8bb7a7446 (patch) | |
tree | 30d7b35b3c3d34b4539b57e1d92951ac5c8a3dfe /mesalib/src/mesa/main | |
parent | 68320ff05946f092b6836754c6267b1dff2f4633 (diff) | |
parent | ada3d2c30b5a7a1a79e128b7326d50c3bab77a8a (diff) | |
download | vcxsrv-ebb6162f9cbc1af0fac0b670b5aa38c8bb7a7446.tar.gz vcxsrv-ebb6162f9cbc1af0fac0b670b5aa38c8bb7a7446.tar.bz2 vcxsrv-ebb6162f9cbc1af0fac0b670b5aa38c8bb7a7446.zip |
Merge remote-tracking branch 'origin/released'
Diffstat (limited to 'mesalib/src/mesa/main')
-rw-r--r-- | mesalib/src/mesa/main/api_validate.c | 2 | ||||
-rw-r--r-- | mesalib/src/mesa/main/arrayobj.c | 6 | ||||
-rw-r--r-- | mesalib/src/mesa/main/attrib.c | 14 | ||||
-rw-r--r-- | mesalib/src/mesa/main/bufferobj.c | 138 | ||||
-rw-r--r-- | mesalib/src/mesa/main/context.c | 28 | ||||
-rw-r--r-- | mesalib/src/mesa/main/format_unpack.c | 32 | ||||
-rw-r--r-- | mesalib/src/mesa/main/mipmap.c | 6 | ||||
-rw-r--r-- | mesalib/src/mesa/main/mtypes.h | 5 | ||||
-rw-r--r-- | mesalib/src/mesa/main/pack.c | 5 | ||||
-rw-r--r-- | mesalib/src/mesa/main/shared.c | 48 | ||||
-rw-r--r-- | mesalib/src/mesa/main/shared.h | 11 | ||||
-rw-r--r-- | mesalib/src/mesa/main/teximage.c | 22 |
12 files changed, 166 insertions, 151 deletions
diff --git a/mesalib/src/mesa/main/api_validate.c b/mesalib/src/mesa/main/api_validate.c index b6871d0db..1ae491f25 100644 --- a/mesalib/src/mesa/main/api_validate.c +++ b/mesalib/src/mesa/main/api_validate.c @@ -187,7 +187,7 @@ check_index_bounds(struct gl_context *ctx, GLsizei count, GLenum type, vbo_get_minmax_indices(ctx, &prim, &ib, &min, &max, 1); if ((int)(min + basevertex) < 0 || - max + basevertex > ctx->Array.ArrayObj->_MaxElement) { + max + basevertex >= ctx->Array.ArrayObj->_MaxElement) { /* the max element is out of bounds of one or more enabled arrays */ _mesa_warning(ctx, "glDrawElements() index=%u is out of bounds (max=%u)", max, ctx->Array.ArrayObj->_MaxElement); diff --git a/mesalib/src/mesa/main/arrayobj.c b/mesalib/src/mesa/main/arrayobj.c index d9ae187bb..c7584d903 100644 --- a/mesalib/src/mesa/main/arrayobj.c +++ b/mesalib/src/mesa/main/arrayobj.c @@ -373,6 +373,10 @@ bind_vertex_array(struct gl_context *ctx, GLuint id, GLboolean genRequired) return; } + save_array_object(ctx, newObj); + } + + if (!newObj->_Used) { /* The "Interactions with APPLE_vertex_array_object" section of the * GL_ARB_vertex_array_object spec says: * @@ -380,7 +384,7 @@ bind_vertex_array(struct gl_context *ctx, GLuint id, GLboolean genRequired) * BindVertexArrayAPPLE, determines the semantic of the object." */ newObj->ARBsemantics = genRequired; - save_array_object(ctx, newObj); + newObj->_Used = GL_TRUE; } } diff --git a/mesalib/src/mesa/main/attrib.c b/mesalib/src/mesa/main/attrib.c index 01e79455c..846da35e9 100644 --- a/mesalib/src/mesa/main/attrib.c +++ b/mesalib/src/mesa/main/attrib.c @@ -47,6 +47,7 @@ #include "multisample.h" #include "points.h" #include "polygon.h" +#include "shared.h" #include "scissor.h" #include "stencil.h" #include "texenv.h" @@ -165,6 +166,13 @@ struct texture_state * deleted while saved in the attribute stack). */ struct gl_texture_object *SavedTexRef[MAX_TEXTURE_UNITS][NUM_TEXTURE_TARGETS]; + + /* We need to keep a reference to the shared state. That's where the + * default texture objects are kept. We don't want that state to be + * freed while the attribute stack contains pointers to any default + * texture objects. + */ + struct gl_shared_state *SharedRef; }; @@ -437,6 +445,8 @@ _mesa_PushAttrib(GLbitfield mask) } } + _mesa_reference_shared_state(ctx, &texstate->SharedRef, ctx->Shared); + _mesa_unlock_context_textures(ctx); save_attrib_data(&head, GL_TEXTURE_BIT, texstate); @@ -806,6 +816,8 @@ pop_texture_group(struct gl_context *ctx, struct texture_state *texstate) _mesa_ActiveTextureARB(GL_TEXTURE0_ARB + texstate->Texture.CurrentUnit); + _mesa_reference_shared_state(ctx, &texstate->SharedRef, NULL); + _mesa_unlock_context_textures(ctx); } @@ -1244,7 +1256,6 @@ _mesa_PopAttrib(void) } break; case GL_TEXTURE_BIT: - /* Take care of texture object reference counters */ { struct texture_state *texstate = (struct texture_state *) attr->data; @@ -1605,6 +1616,7 @@ _mesa_free_attrib_data(struct gl_context *ctx) _mesa_reference_texobj(&texstate->SavedTexRef[u][tgt], NULL); } } + _mesa_reference_shared_state(ctx, &texstate->SharedRef, NULL); } else { /* any other chunks of state that requires special handling? */ diff --git a/mesalib/src/mesa/main/bufferobj.c b/mesalib/src/mesa/main/bufferobj.c index 7238a2d60..b6137d0f6 100644 --- a/mesalib/src/mesa/main/bufferobj.c +++ b/mesalib/src/mesa/main/bufferobj.c @@ -106,12 +106,21 @@ get_buffer_target(struct gl_context *ctx, GLenum target) * specified context or \c NULL if \c target is invalid. */ static inline struct gl_buffer_object * -get_buffer(struct gl_context *ctx, GLenum target) +get_buffer(struct gl_context *ctx, const char *func, GLenum target) { struct gl_buffer_object **bufObj = get_buffer_target(ctx, target); - if (bufObj) - return *bufObj; - return NULL; + + if (!bufObj) { + _mesa_error(ctx, GL_INVALID_ENUM, "%s(target)", func); + return NULL; + } + + if (!_mesa_is_bufferobj(*bufObj)) { + _mesa_error(ctx, GL_INVALID_OPERATION, "%s(buffer 0)", func); + return NULL; + } + + return *bufObj; } @@ -190,15 +199,10 @@ buffer_object_subdata_range_good( struct gl_context * ctx, GLenum target, return NULL; } - bufObj = get_buffer(ctx, target); - if (!bufObj) { - _mesa_error(ctx, GL_INVALID_ENUM, "%s(target)", caller); - return NULL; - } - if (!_mesa_is_bufferobj(bufObj)) { - _mesa_error(ctx, GL_INVALID_OPERATION, "%s", caller); + bufObj = get_buffer(ctx, caller, target); + if (!bufObj) return NULL; - } + if (offset + size > bufObj->Size) { _mesa_error(ctx, GL_INVALID_VALUE, "%s(offset %lu + size %lu > buffer size %lu)", caller, @@ -918,16 +922,10 @@ _mesa_BufferDataARB(GLenum target, GLsizeiptrARB size, return; } - bufObj = get_buffer(ctx, target); - if (!bufObj) { - _mesa_error(ctx, GL_INVALID_ENUM, "glBufferDataARB(target)" ); + bufObj = get_buffer(ctx, "glBufferDataARB", target); + if (!bufObj) return; - } - if (!_mesa_is_bufferobj(bufObj)) { - _mesa_error(ctx, GL_INVALID_OPERATION, "glBufferDataARB(buffer 0)" ); - return; - } - + if (_mesa_bufferobj_mapped(bufObj)) { /* Unmap the existing buffer. We'll replace it now. Not an error. */ ctx->Driver.UnmapBuffer(ctx, bufObj); @@ -1025,15 +1023,10 @@ _mesa_MapBufferARB(GLenum target, GLenum access) return NULL; } - bufObj = get_buffer(ctx, target); - if (!bufObj) { - _mesa_error(ctx, GL_INVALID_ENUM, "glMapBufferARB(target)" ); + bufObj = get_buffer(ctx, "glMapBufferARB", target); + if (!bufObj) return NULL; - } - if (!_mesa_is_bufferobj(bufObj)) { - _mesa_error(ctx, GL_INVALID_OPERATION, "glMapBufferARB(buffer 0)" ); - return NULL; - } + if (_mesa_bufferobj_mapped(bufObj)) { _mesa_error(ctx, GL_INVALID_OPERATION, "glMapBufferARB(already mapped)"); return NULL; @@ -1099,15 +1092,10 @@ _mesa_UnmapBufferARB(GLenum target) GLboolean status = GL_TRUE; ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE); - bufObj = get_buffer(ctx, target); - if (!bufObj) { - _mesa_error(ctx, GL_INVALID_ENUM, "glUnmapBufferARB(target)" ); + bufObj = get_buffer(ctx, "glUnmapBufferARB", target); + if (!bufObj) return GL_FALSE; - } - if (!_mesa_is_bufferobj(bufObj)) { - _mesa_error(ctx, GL_INVALID_OPERATION, "glUnmapBufferARB" ); - return GL_FALSE; - } + if (!_mesa_bufferobj_mapped(bufObj)) { _mesa_error(ctx, GL_INVALID_OPERATION, "glUnmapBufferARB"); return GL_FALSE; @@ -1166,15 +1154,9 @@ _mesa_GetBufferParameterivARB(GLenum target, GLenum pname, GLint *params) struct gl_buffer_object *bufObj; ASSERT_OUTSIDE_BEGIN_END(ctx); - bufObj = get_buffer(ctx, target); - if (!bufObj) { - _mesa_error(ctx, GL_INVALID_ENUM, "glGetBufferParameterivARB(target)" ); - return; - } - if (!_mesa_is_bufferobj(bufObj)) { - _mesa_error(ctx, GL_INVALID_OPERATION, "glGetBufferParameterivARB" ); + bufObj = get_buffer(ctx, "glGetBufferParameterivARB", target); + if (!bufObj) return; - } switch (pname) { case GL_BUFFER_SIZE_ARB: @@ -1226,15 +1208,9 @@ _mesa_GetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params) struct gl_buffer_object *bufObj; ASSERT_OUTSIDE_BEGIN_END(ctx); - bufObj = get_buffer(ctx, target); - if (!bufObj) { - _mesa_error(ctx, GL_INVALID_ENUM, "glGetBufferParameteri64v(target)" ); + bufObj = get_buffer(ctx, "glGetBufferParameteri64v", target); + if (!bufObj) return; - } - if (!_mesa_is_bufferobj(bufObj)) { - _mesa_error(ctx, GL_INVALID_OPERATION, "glGetBufferParameteri64v" ); - return; - } switch (pname) { case GL_BUFFER_SIZE_ARB: @@ -1286,15 +1262,9 @@ _mesa_GetBufferPointervARB(GLenum target, GLenum pname, GLvoid **params) return; } - bufObj = get_buffer(ctx, target); - if (!bufObj) { - _mesa_error(ctx, GL_INVALID_ENUM, "glGetBufferPointervARB(target)" ); - return; - } - if (!_mesa_is_bufferobj(bufObj)) { - _mesa_error(ctx, GL_INVALID_OPERATION, "glGetBufferPointervARB" ); + bufObj = get_buffer(ctx, "glGetBufferPointervARB", target); + if (!bufObj) return; - } *params = bufObj->Pointer; } @@ -1309,19 +1279,13 @@ _mesa_CopyBufferSubData(GLenum readTarget, GLenum writeTarget, struct gl_buffer_object *src, *dst; ASSERT_OUTSIDE_BEGIN_END(ctx); - src = get_buffer(ctx, readTarget); - if (!_mesa_is_bufferobj(src)) { - _mesa_error(ctx, GL_INVALID_ENUM, - "glCopyBuffserSubData(readTarget = 0x%x)", readTarget); + src = get_buffer(ctx, "glCopyBuffserSubData", readTarget); + if (!src) return; - } - dst = get_buffer(ctx, writeTarget); - if (!_mesa_is_bufferobj(dst)) { - _mesa_error(ctx, GL_INVALID_ENUM, - "glCopyBuffserSubData(writeTarget = 0x%x)", writeTarget); + dst = get_buffer(ctx, "glCopyBuffserSubData", writeTarget); + if (!dst) return; - } if (_mesa_bufferobj_mapped(src)) { _mesa_error(ctx, GL_INVALID_OPERATION, @@ -1444,12 +1408,9 @@ _mesa_MapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, return NULL; } - bufObj = get_buffer(ctx, target); - if (!_mesa_is_bufferobj(bufObj)) { - _mesa_error(ctx, GL_INVALID_ENUM, - "glMapBufferRange(target = 0x%x)", target); + bufObj = get_buffer(ctx, "glMapBufferRange", target); + if (!bufObj) return NULL; - } if (offset + length > bufObj->Size) { _mesa_error(ctx, GL_INVALID_VALUE, @@ -1511,51 +1472,42 @@ _mesa_FlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length) if (!ctx->Extensions.ARB_map_buffer_range) { _mesa_error(ctx, GL_INVALID_OPERATION, - "glMapBufferRange(extension not supported)"); + "glFlushMappedBufferRange(extension not supported)"); return; } if (offset < 0) { _mesa_error(ctx, GL_INVALID_VALUE, - "glMapBufferRange(offset = %ld)", (long)offset); + "glFlushMappedBufferRange(offset = %ld)", (long)offset); return; } if (length < 0) { _mesa_error(ctx, GL_INVALID_VALUE, - "glMapBufferRange(length = %ld)", (long)length); + "glFlushMappedBufferRange(length = %ld)", (long)length); return; } - bufObj = get_buffer(ctx, target); - if (!bufObj) { - _mesa_error(ctx, GL_INVALID_ENUM, - "glMapBufferRange(target = 0x%x)", target); - return; - } - - if (!_mesa_is_bufferobj(bufObj)) { - _mesa_error(ctx, GL_INVALID_OPERATION, - "glMapBufferRange(current buffer is 0)"); + bufObj = get_buffer(ctx, "glFlushMappedBufferRange", target); + if (!bufObj) return; - } if (!_mesa_bufferobj_mapped(bufObj)) { /* buffer is not mapped */ _mesa_error(ctx, GL_INVALID_OPERATION, - "glMapBufferRange(buffer is not mapped)"); + "glFlushMappedBufferRange(buffer is not mapped)"); return; } if ((bufObj->AccessFlags & GL_MAP_FLUSH_EXPLICIT_BIT) == 0) { _mesa_error(ctx, GL_INVALID_OPERATION, - "glMapBufferRange(GL_MAP_FLUSH_EXPLICIT_BIT not set)"); + "glFlushMappedBufferRange(GL_MAP_FLUSH_EXPLICIT_BIT not set)"); return; } if (offset + length > bufObj->Length) { _mesa_error(ctx, GL_INVALID_VALUE, - "glMapBufferRange(offset %ld + length %ld > mapped length %ld)", + "glFlushMappedBufferRange(offset %ld + length %ld > mapped length %ld)", (long)offset, (long)length, (long)bufObj->Length); return; } diff --git a/mesalib/src/mesa/main/context.c b/mesalib/src/mesa/main/context.c index f39cab5e4..43e7438ad 100644 --- a/mesalib/src/mesa/main/context.c +++ b/mesalib/src/mesa/main/context.c @@ -939,13 +939,10 @@ _mesa_initialize_context(struct gl_context *ctx, return GL_FALSE; } - _glthread_LOCK_MUTEX(shared->Mutex); - ctx->Shared = shared; - shared->RefCount++; - _glthread_UNLOCK_MUTEX(shared->Mutex); + _mesa_reference_shared_state(ctx, &ctx->Shared, shared); if (!init_attrib_groups( ctx )) { - _mesa_release_shared_state(ctx, ctx->Shared); + _mesa_reference_shared_state(ctx, &ctx->Shared, NULL); return GL_FALSE; } @@ -973,7 +970,7 @@ _mesa_initialize_context(struct gl_context *ctx, } if (!ctx->Exec) { - _mesa_release_shared_state(ctx, ctx->Shared); + _mesa_reference_shared_state(ctx, &ctx->Shared, NULL); return GL_FALSE; } #endif @@ -1002,7 +999,7 @@ _mesa_initialize_context(struct gl_context *ctx, #if FEATURE_dlist ctx->Save = _mesa_create_save_table(); if (!ctx->Save) { - _mesa_release_shared_state(ctx, ctx->Shared); + _mesa_reference_shared_state(ctx, &ctx->Shared, NULL); free(ctx->Exec); return GL_FALSE; } @@ -1140,7 +1137,7 @@ _mesa_free_context_data( struct gl_context *ctx ) free(ctx->Save); /* Shared context state (display lists, textures, etc) */ - _mesa_release_shared_state( ctx, ctx->Shared ); + _mesa_reference_shared_state(ctx, &ctx->Shared, NULL); /* needs to be after freeing shared state */ _mesa_free_display_list_data(ctx); @@ -1540,17 +1537,18 @@ GLboolean _mesa_share_state(struct gl_context *ctx, struct gl_context *ctxToShare) { if (ctx && ctxToShare && ctx->Shared && ctxToShare->Shared) { - struct gl_shared_state *oldSharedState = ctx->Shared; + struct gl_shared_state *oldShared = NULL; - ctx->Shared = ctxToShare->Shared; - - _glthread_LOCK_MUTEX(ctx->Shared->Mutex); - ctx->Shared->RefCount++; - _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex); + /* save ref to old state to prevent it from being deleted immediately */ + _mesa_reference_shared_state(ctx, &oldShared, ctx->Shared); + + /* update ctx's Shared pointer */ + _mesa_reference_shared_state(ctx, &ctx->Shared, ctxToShare->Shared); update_default_objects(ctx); - _mesa_release_shared_state(ctx, oldSharedState); + /* release the old shared state */ + _mesa_reference_shared_state(ctx, &oldShared, NULL); return GL_TRUE; } diff --git a/mesalib/src/mesa/main/format_unpack.c b/mesalib/src/mesa/main/format_unpack.c index cd16a9ea6..a484979e2 100644 --- a/mesalib/src/mesa/main/format_unpack.c +++ b/mesalib/src/mesa/main/format_unpack.c @@ -2916,6 +2916,32 @@ unpack_uint_z_Z32(const void *src, GLuint *dst, GLuint n) memcpy(dst, src, n * sizeof(GLuint)); } +static void +unpack_uint_z_Z32_FLOAT(const void *src, GLuint *dst, GLuint n) +{ + const float *s = (const float *)src; + GLuint i; + for (i = 0; i < n; i++) { + dst[i] = FLOAT_TO_UINT(IROUND(CLAMP((s[i]), 0.0F, 1.0F))); + } +} + +static void +unpack_uint_z_Z32_FLOAT_X24S8(const void *src, GLuint *dst, GLuint n) +{ + struct z32f_x24s8 { + float z; + uint32_t x24s8; + }; + + const struct z32f_x24s8 *s = (const struct z32f_x24s8 *) src; + GLuint i; + + for (i = 0; i < n; i++) { + dst[i] = FLOAT_TO_UINT(IROUND(CLAMP((s[i].z), 0.0F, 1.0F))); + } +} + /** * Unpack Z values. @@ -2943,6 +2969,12 @@ _mesa_unpack_uint_z_row(gl_format format, GLuint n, case MESA_FORMAT_Z32: unpack = unpack_uint_z_Z32; break; + case MESA_FORMAT_Z32_FLOAT: + unpack = unpack_uint_z_Z32_FLOAT; + break; + case MESA_FORMAT_Z32_FLOAT_X24S8: + unpack = unpack_uint_z_Z32_FLOAT_X24S8; + break; default: _mesa_problem(NULL, "bad format %s in _mesa_unpack_uint_z_row", _mesa_get_format_name(format)); diff --git a/mesalib/src/mesa/main/mipmap.c b/mesalib/src/mesa/main/mipmap.c index 03ce5361e..756316a82 100644 --- a/mesalib/src/mesa/main/mipmap.c +++ b/mesalib/src/mesa/main/mipmap.c @@ -991,7 +991,7 @@ do_row_3D(GLenum datatype, GLuint comps, GLint srcWidth, } } else if ((datatype == GL_HALF_FLOAT_ARB) && (comps == 3)) { - DECLARE_ROW_POINTERS(GLhalfARB, 4); + DECLARE_ROW_POINTERS(GLhalfARB, 3); for (i = j = 0, k = k0; i < (GLuint) dstWidth; i++, j += colStride, k += colStride) { @@ -1001,7 +1001,7 @@ do_row_3D(GLenum datatype, GLuint comps, GLint srcWidth, } } else if ((datatype == GL_HALF_FLOAT_ARB) && (comps == 2)) { - DECLARE_ROW_POINTERS(GLhalfARB, 4); + DECLARE_ROW_POINTERS(GLhalfARB, 2); for (i = j = 0, k = k0; i < (GLuint) dstWidth; i++, j += colStride, k += colStride) { @@ -1010,7 +1010,7 @@ do_row_3D(GLenum datatype, GLuint comps, GLint srcWidth, } } else if ((datatype == GL_HALF_FLOAT_ARB) && (comps == 1)) { - DECLARE_ROW_POINTERS(GLhalfARB, 4); + DECLARE_ROW_POINTERS(GLhalfARB, 1); for (i = j = 0, k = k0; i < (GLuint) dstWidth; i++, j += colStride, k += colStride) { diff --git a/mesalib/src/mesa/main/mtypes.h b/mesalib/src/mesa/main/mtypes.h index 99dcb389b..d3001d35c 100644 --- a/mesalib/src/mesa/main/mtypes.h +++ b/mesalib/src/mesa/main/mtypes.h @@ -1631,6 +1631,11 @@ struct gl_array_object */ GLboolean ARBsemantics; + /** + * Has this array object been bound? + */ + GLboolean _Used; + /** Vertex attribute arrays */ struct gl_client_array VertexAttrib[VERT_ATTRIB_MAX]; diff --git a/mesalib/src/mesa/main/pack.c b/mesalib/src/mesa/main/pack.c index d07e2aaa8..41485a1bf 100644 --- a/mesalib/src/mesa/main/pack.c +++ b/mesalib/src/mesa/main/pack.c @@ -1175,9 +1175,8 @@ _mesa_pack_rgba_span_float(struct gl_context *ctx, GLuint n, GLfloat rgba[][4], break; case GL_RG_INTEGER: for (i=0;i<n;i++) { - dst[i*3+0] = (GLshort) rgba[i][RCOMP]; - dst[i*3+1] = (GLshort) rgba[i][GCOMP]; - dst[i*3+2] = (GLshort) rgba[i][BCOMP]; + dst[i*2+0] = (GLshort) rgba[i][RCOMP]; + dst[i*2+1] = (GLshort) rgba[i][GCOMP]; } break; case GL_RGB_INTEGER_EXT: diff --git a/mesalib/src/mesa/main/shared.c b/mesalib/src/mesa/main/shared.c index c3e93b5a5..c07ce8238 100644 --- a/mesalib/src/mesa/main/shared.c +++ b/mesalib/src/mesa/main/shared.c @@ -388,28 +388,40 @@ free_shared_state(struct gl_context *ctx, struct gl_shared_state *shared) /** - * Decrement shared state object reference count and potentially free it - * and all children structures. - * - * \param ctx GL context. - * \param shared shared state pointer. - * - * \sa free_shared_state(). + * gl_shared_state objects are ref counted. + * If ptr's refcount goes to zero, free the shared state. */ void -_mesa_release_shared_state(struct gl_context *ctx, - struct gl_shared_state *shared) +_mesa_reference_shared_state(struct gl_context *ctx, + struct gl_shared_state **ptr, + struct gl_shared_state *state) { - GLint RefCount; - - _glthread_LOCK_MUTEX(shared->Mutex); - RefCount = --shared->RefCount; - _glthread_UNLOCK_MUTEX(shared->Mutex); + if (*ptr == state) + return; + + if (*ptr) { + /* unref old state */ + struct gl_shared_state *old = *ptr; + GLboolean delete; + + _glthread_LOCK_MUTEX(old->Mutex); + assert(old->RefCount >= 1); + old->RefCount--; + delete = (old->RefCount == 0); + _glthread_UNLOCK_MUTEX(old->Mutex); + + if (delete) { + free_shared_state(ctx, old); + } - assert(RefCount >= 0); + *ptr = NULL; + } - if (RefCount == 0) { - /* free shared state */ - free_shared_state( ctx, shared ); + if (state) { + /* reference new state */ + _glthread_LOCK_MUTEX(state->Mutex); + state->RefCount++; + *ptr = state; + _glthread_UNLOCK_MUTEX(state->Mutex); } } diff --git a/mesalib/src/mesa/main/shared.h b/mesalib/src/mesa/main/shared.h index 55516a8c3..3fe4578cf 100644 --- a/mesalib/src/mesa/main/shared.h +++ b/mesalib/src/mesa/main/shared.h @@ -27,13 +27,14 @@ struct gl_context; -struct gl_shared_state * -_mesa_alloc_shared_state(struct gl_context *ctx); +void +_mesa_reference_shared_state(struct gl_context *ctx, + struct gl_shared_state **ptr, + struct gl_shared_state *state); -void -_mesa_release_shared_state(struct gl_context *ctx, - struct gl_shared_state *shared); +struct gl_shared_state * +_mesa_alloc_shared_state(struct gl_context *ctx); #endif diff --git a/mesalib/src/mesa/main/teximage.c b/mesalib/src/mesa/main/teximage.c index d11425d5e..018aca063 100644 --- a/mesalib/src/mesa/main/teximage.c +++ b/mesalib/src/mesa/main/teximage.c @@ -1179,7 +1179,7 @@ _mesa_test_proxy_teximage(struct gl_context *ctx, GLenum target, GLint level, switch (target) { case GL_PROXY_TEXTURE_1D: maxSize = 1 << (ctx->Const.MaxTextureLevels - 1); - if (width < 2 * border || width > 2 + maxSize) + if (width < 2 * border || width > maxSize) return GL_FALSE; if (level >= ctx->Const.MaxTextureLevels) return GL_FALSE; @@ -1191,9 +1191,9 @@ _mesa_test_proxy_teximage(struct gl_context *ctx, GLenum target, GLint level, case GL_PROXY_TEXTURE_2D: maxSize = 1 << (ctx->Const.MaxTextureLevels - 1); - if (width < 2 * border || width > 2 + maxSize) + if (width < 2 * border || width > maxSize) return GL_FALSE; - if (height < 2 * border || height > 2 + maxSize) + if (height < 2 * border || height > maxSize) return GL_FALSE; if (level >= ctx->Const.MaxTextureLevels) return GL_FALSE; @@ -1207,11 +1207,11 @@ _mesa_test_proxy_teximage(struct gl_context *ctx, GLenum target, GLint level, case GL_PROXY_TEXTURE_3D: maxSize = 1 << (ctx->Const.Max3DTextureLevels - 1); - if (width < 2 * border || width > 2 + maxSize) + if (width < 2 * border || width > maxSize) return GL_FALSE; - if (height < 2 * border || height > 2 + maxSize) + if (height < 2 * border || height > maxSize) return GL_FALSE; - if (depth < 2 * border || depth > 2 + maxSize) + if (depth < 2 * border || depth > maxSize) return GL_FALSE; if (level >= ctx->Const.Max3DTextureLevels) return GL_FALSE; @@ -1237,9 +1237,9 @@ _mesa_test_proxy_teximage(struct gl_context *ctx, GLenum target, GLint level, case GL_PROXY_TEXTURE_CUBE_MAP_ARB: maxSize = 1 << (ctx->Const.MaxCubeTextureLevels - 1); - if (width < 2 * border || width > 2 + maxSize) + if (width < 2 * border || width > maxSize) return GL_FALSE; - if (height < 2 * border || height > 2 + maxSize) + if (height < 2 * border || height > maxSize) return GL_FALSE; if (level >= ctx->Const.MaxCubeTextureLevels) return GL_FALSE; @@ -1253,7 +1253,7 @@ _mesa_test_proxy_teximage(struct gl_context *ctx, GLenum target, GLint level, case GL_PROXY_TEXTURE_1D_ARRAY_EXT: maxSize = 1 << (ctx->Const.MaxTextureLevels - 1); - if (width < 2 * border || width > 2 + maxSize) + if (width < 2 * border || width > maxSize) return GL_FALSE; if (height < 1 || height > ctx->Const.MaxArrayTextureLayers) return GL_FALSE; @@ -1267,9 +1267,9 @@ _mesa_test_proxy_teximage(struct gl_context *ctx, GLenum target, GLint level, case GL_PROXY_TEXTURE_2D_ARRAY_EXT: maxSize = 1 << (ctx->Const.MaxTextureLevels - 1); - if (width < 2 * border || width > 2 + maxSize) + if (width < 2 * border || width > maxSize) return GL_FALSE; - if (height < 2 * border || height > 2 + maxSize) + if (height < 2 * border || height > maxSize) return GL_FALSE; if (depth < 1 || depth > ctx->Const.MaxArrayTextureLayers) return GL_FALSE; |