diff options
-rw-r--r-- | src/mesa/drivers/dri/intel/intel_buffer_objects.c | 2 | ||||
-rw-r--r-- | src/mesa/drivers/dri/nouveau/nouveau_bufferobj.c | 2 | ||||
-rw-r--r-- | src/mesa/drivers/dri/radeon/radeon_buffer_objects.c | 2 | ||||
-rw-r--r-- | src/mesa/main/bufferobj.c | 44 | ||||
-rw-r--r-- | src/mesa/main/bufferobj.h | 3 | ||||
-rw-r--r-- | 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; } |