[Mesa-dev] [PATCH] mesa: Set default access flags based on the run-time API
Ian Romanick
idr at freedesktop.org
Wed Jan 18 11:41:49 PST 2012
From: Ian Romanick <ian.d.romanick at intel.com>
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 <ian.d.romanick at intel.com>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=44433
---
v2: Convert DEFAULT_ACCESS macro to default_access_mode inline
function. Add text from the relevant specs justifying the code.
src/mesa/drivers/dri/intel/intel_buffer_objects.c | 2 +-
src/mesa/drivers/dri/nouveau/nouveau_bufferobj.c | 2 +-
.../drivers/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 03dd179..600f01c 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 dc5b152..f7ad895 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 7b59c03..5abc52b 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 5f8071f..5b6db78 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 c0d5a64..a7ce379 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 6d95d57..6534a43 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;
}
--
1.7.6.4
More information about the mesa-dev
mailing list