From f0ea46790f8f4df9a39b0cfab5c5f1bf02c136fc Mon Sep 17 00:00:00 2001 From: Ian Romanick Date: Tue, 17 Jan 2012 16:24:05 -0800 Subject: [PATCH] mesa: Set default access flags based on the run-time API The default access flags for OpenGL ES (via GL_OES_map_buffer) and desktop OpenGL are different. The code previously tried to handle this, but the decision was made at compile time. Since the same driver binary can be used for both OpenGL ES and desktop OpenGL, the decision must be made at run-time. This should fix bug #44433. It appears that the test case does various map and unmap operations and inspects the state of the buffer object around each. When it sees that GL_BUFFER_ACCESS does not match its expectations, it fails. NOTE: This is a candidate for release branches. Signed-off-by: Ian Romanick Reviewed-by: Brian Paul Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=44433 --- .../drivers/dri/intel/intel_buffer_objects.c | 2 +- .../drivers/dri/nouveau/nouveau_bufferobj.c | 2 +- .../dri/radeon/radeon_buffer_objects.c | 2 +- src/mesa/main/bufferobj.c | 44 +++++++++++++------ src/mesa/main/bufferobj.h | 3 +- src/mesa/state_tracker/st_cb_bufferobjects.c | 2 +- 6 files changed, 37 insertions(+), 18 deletions(-) diff --git a/src/mesa/drivers/dri/intel/intel_buffer_objects.c b/src/mesa/drivers/dri/intel/intel_buffer_objects.c index 03dd179ee0b..600f01ca6f0 100644 --- a/src/mesa/drivers/dri/intel/intel_buffer_objects.c +++ b/src/mesa/drivers/dri/intel/intel_buffer_objects.c @@ -72,7 +72,7 @@ intel_bufferobj_alloc(struct gl_context * ctx, GLuint name, GLenum target) { struct intel_buffer_object *obj = CALLOC_STRUCT(intel_buffer_object); - _mesa_initialize_buffer_object(&obj->Base, name, target); + _mesa_initialize_buffer_object(ctx, &obj->Base, name, target); obj->buffer = NULL; diff --git a/src/mesa/drivers/dri/nouveau/nouveau_bufferobj.c b/src/mesa/drivers/dri/nouveau/nouveau_bufferobj.c index dc5b1528b07..f7ad895ac9a 100644 --- a/src/mesa/drivers/dri/nouveau/nouveau_bufferobj.c +++ b/src/mesa/drivers/dri/nouveau/nouveau_bufferobj.c @@ -56,7 +56,7 @@ nouveau_bufferobj_new(struct gl_context *ctx, GLuint buffer, GLenum target) if (!nbo) return NULL; - _mesa_initialize_buffer_object(&nbo->base, buffer, target); + _mesa_initialize_buffer_object(ctx, &nbo->base, buffer, target); return &nbo->base; } diff --git a/src/mesa/drivers/dri/radeon/radeon_buffer_objects.c b/src/mesa/drivers/dri/radeon/radeon_buffer_objects.c index 7b59c0377f8..5abc52ba3f7 100644 --- a/src/mesa/drivers/dri/radeon/radeon_buffer_objects.c +++ b/src/mesa/drivers/dri/radeon/radeon_buffer_objects.c @@ -46,7 +46,7 @@ radeonNewBufferObject(struct gl_context * ctx, { struct radeon_buffer_object *obj = CALLOC_STRUCT(radeon_buffer_object); - _mesa_initialize_buffer_object(&obj->Base, name, target); + _mesa_initialize_buffer_object(ctx, &obj->Base, name, target); obj->bo = NULL; diff --git a/src/mesa/main/bufferobj.c b/src/mesa/main/bufferobj.c index 5f8071f587f..5b6db78d821 100644 --- a/src/mesa/main/bufferobj.c +++ b/src/mesa/main/bufferobj.c @@ -49,13 +49,6 @@ /*#define BOUNDS_CHECK*/ -#if FEATURE_OES_mapbuffer -#define DEFAULT_ACCESS GL_MAP_WRITE_BIT -#else -#define DEFAULT_ACCESS (GL_MAP_READ_BIT | GL_MAP_WRITE_BIT) -#endif - - /** * Used as a placeholder for buffer objects between glGenBuffers() and * glBindBuffer() so that glIsBuffer() can work correctly. @@ -122,6 +115,30 @@ get_buffer(struct gl_context *ctx, GLenum target) } +static inline GLenum +default_access_mode(const struct gl_context *ctx) +{ + /* Table 2.6 on page 31 (page 44 of the PDF) of the OpenGL 1.5 spec says: + * + * Name Type Initial Value Legal Values + * ... ... ... ... + * BUFFER_ACCESS enum READ_WRITE READ_ONLY, WRITE_ONLY + * READ_WRITE + * + * However, table 6.8 in the GL_OES_mapbuffer extension says: + * + * Get Value Type Get Command Value Description + * --------- ---- ----------- ----- ----------- + * BUFFER_ACCESS_OES Z1 GetBufferParameteriv WRITE_ONLY_OES buffer map flag + * + * The difference is because GL_OES_mapbuffer only supports mapping buffers + * write-only. + */ + return (ctx->API == API_OPENGLES) + ? GL_MAP_WRITE_BIT : (GL_MAP_READ_BIT | GL_MAP_WRITE_BIT); +} + + /** * Convert a GLbitfield describing the mapped buffer access flags * into one of GL_READ_WRITE, GL_READ_ONLY, or GL_WRITE_ONLY. @@ -213,7 +230,7 @@ _mesa_new_buffer_object( struct gl_context *ctx, GLuint name, GLenum target ) (void) ctx; obj = MALLOC_STRUCT(gl_buffer_object); - _mesa_initialize_buffer_object(obj, name, target); + _mesa_initialize_buffer_object(ctx, obj, name, target); return obj; } @@ -311,7 +328,8 @@ _mesa_reference_buffer_object_(struct gl_context *ctx, * Initialize a buffer object to default values. */ void -_mesa_initialize_buffer_object( struct gl_buffer_object *obj, +_mesa_initialize_buffer_object( struct gl_context *ctx, + struct gl_buffer_object *obj, GLuint name, GLenum target ) { (void) target; @@ -321,7 +339,7 @@ _mesa_initialize_buffer_object( struct gl_buffer_object *obj, obj->RefCount = 1; obj->Name = name; obj->Usage = GL_STATIC_DRAW_ARB; - obj->AccessFlags = DEFAULT_ACCESS; + obj->AccessFlags = default_access_mode(ctx); } @@ -740,7 +758,7 @@ _mesa_DeleteBuffersARB(GLsizei n, const GLuint *ids) if (_mesa_bufferobj_mapped(bufObj)) { /* if mapped, unmap it now */ ctx->Driver.UnmapBuffer(ctx, bufObj); - bufObj->AccessFlags = DEFAULT_ACCESS; + bufObj->AccessFlags = default_access_mode(ctx); bufObj->Pointer = NULL; } @@ -900,7 +918,7 @@ _mesa_BufferDataARB(GLenum target, GLsizeiptrARB size, if (_mesa_bufferobj_mapped(bufObj)) { /* Unmap the existing buffer. We'll replace it now. Not an error. */ ctx->Driver.UnmapBuffer(ctx, bufObj); - bufObj->AccessFlags = DEFAULT_ACCESS; + bufObj->AccessFlags = default_access_mode(ctx); ASSERT(bufObj->Pointer == NULL); } @@ -1119,7 +1137,7 @@ _mesa_UnmapBufferARB(GLenum target) #endif status = ctx->Driver.UnmapBuffer( ctx, bufObj ); - bufObj->AccessFlags = DEFAULT_ACCESS; + bufObj->AccessFlags = default_access_mode(ctx); ASSERT(bufObj->Pointer == NULL); ASSERT(bufObj->Offset == 0); ASSERT(bufObj->Length == 0); diff --git a/src/mesa/main/bufferobj.h b/src/mesa/main/bufferobj.h index c0d5a641a46..a7ce3792898 100644 --- a/src/mesa/main/bufferobj.h +++ b/src/mesa/main/bufferobj.h @@ -71,7 +71,8 @@ extern struct gl_buffer_object * _mesa_lookup_bufferobj(struct gl_context *ctx, GLuint buffer); extern void -_mesa_initialize_buffer_object( struct gl_buffer_object *obj, +_mesa_initialize_buffer_object( struct gl_context *ctx, + struct gl_buffer_object *obj, GLuint name, GLenum target ); extern void diff --git a/src/mesa/state_tracker/st_cb_bufferobjects.c b/src/mesa/state_tracker/st_cb_bufferobjects.c index 6d95d57c1b3..6534a4347ab 100644 --- a/src/mesa/state_tracker/st_cb_bufferobjects.c +++ b/src/mesa/state_tracker/st_cb_bufferobjects.c @@ -58,7 +58,7 @@ st_bufferobj_alloc(struct gl_context *ctx, GLuint name, GLenum target) if (!st_obj) return NULL; - _mesa_initialize_buffer_object(&st_obj->Base, name, target); + _mesa_initialize_buffer_object(ctx, &st_obj->Base, name, target); return &st_obj->Base; } -- 2.30.2