On Wed, Feb 18, 2015 at 7:40 AM, Martin Peres
<martin.pe...@linux.intel.com <mailto:martin.pe...@linux.intel.com>>
wrote:
On 12/02/15 04:05, Laura Ekstrand wrote:
v2: review from Ian Romanick
- Fix space in ARB_direct_state_access.xml.
- Remove "_mesa" from the name of buffer_data static fallback.
- Restore VBO_DEBUG and BOUNDS_CHECK.
- Fix beginning of comment to start on same line as /*
---
src/mapi/glapi/gen/ARB_direct_state_access.xml | 7 +++
src/mesa/main/bufferobj.c | 67
++++++++++++++++++--------
src/mesa/main/bufferobj.h | 13 ++++-
src/mesa/main/tests/dispatch_sanity.cpp | 1 +
4 files changed, 67 insertions(+), 21 deletions(-)
diff --git a/src/mapi/glapi/gen/ARB_direct_state_access.xml
b/src/mapi/glapi/gen/ARB_direct_state_access.xml
index ff81c21..7779262 100644
--- a/src/mapi/glapi/gen/ARB_direct_state_access.xml
+++ b/src/mapi/glapi/gen/ARB_direct_state_access.xml
@@ -21,6 +21,13 @@
<param name="flags" type="GLbitfield" />
</function>
+ <function name="NamedBufferData" offset="assign">
+ <param name="buffer" type="GLuint" />
+ <param name="size" type="GLsizeiptr" />
+ <param name="data" type="const GLvoid *" />
+ <param name="usage" type="GLenum" />
+ </function>
+
<!-- Texture object functions -->
<function name="CreateTextures" offset="assign">
diff --git a/src/mesa/main/bufferobj.c b/src/mesa/main/bufferobj.c
index 6259db1..ac8eed1 100644
--- a/src/mesa/main/bufferobj.c
+++ b/src/mesa/main/bufferobj.c
@@ -556,9 +556,9 @@ _mesa_total_buffer_object_memory(struct
gl_context *ctx)
* \sa glBufferDataARB, dd_function_table::BufferData.
*/
static GLboolean
-_mesa_buffer_data( struct gl_context *ctx, GLenum target,
GLsizeiptrARB size,
- const GLvoid * data, GLenum usage, GLenum
storageFlags,
- struct gl_buffer_object * bufObj )
+buffer_data_fallback(struct gl_context *ctx, GLenum target,
GLsizeiptr size,
+ const GLvoid *data, GLenum usage, GLenum
storageFlags,
+ struct gl_buffer_object *bufObj)
{
void * new_data;
@@ -1112,7 +1112,7 @@
_mesa_init_buffer_object_functions(struct dd_function_table
*driver)
/* GL_ARB_vertex/pixel_buffer_object */
driver->NewBufferObject = _mesa_new_buffer_object;
driver->DeleteBuffer = _mesa_delete_buffer_object;
- driver->BufferData = _mesa_buffer_data;
+ driver->BufferData = buffer_data_fallback;
driver->BufferSubData = _mesa_buffer_subdata;
driver->GetBufferSubData = _mesa_buffer_get_subdata;
driver->UnmapBuffer = _mesa_buffer_unmap;
@@ -1474,23 +1474,22 @@ _mesa_NamedBufferStorage(GLuint
buffer, GLsizeiptr size, const GLvoid *data,
}
-
-void GLAPIENTRY
-_mesa_BufferData(GLenum target, GLsizeiptrARB size,
- const GLvoid * data, GLenum usage)
+void
+_mesa_buffer_data(struct gl_context *ctx, struct
gl_buffer_object *bufObj,
+ GLenum target, GLsizeiptr size, const
GLvoid *data,
+ GLenum usage, const char *func)
{
- GET_CURRENT_CONTEXT(ctx);
- struct gl_buffer_object *bufObj;
bool valid_usage;
if (MESA_VERBOSE & VERBOSE_API)
- _mesa_debug(ctx, "glBufferData(%s, %ld, %p, %s)\n",
+ _mesa_debug(ctx, "%s(%s, %ld, %p, %s)\n",
Func could be on this line but I really don't care.
+ func,
_mesa_lookup_enum_by_nr(target),
(long int) size, data,
_mesa_lookup_enum_by_nr(usage));
if (size < 0) {
- _mesa_error(ctx, GL_INVALID_VALUE,
"glBufferDataARB(size < 0)");
+ _mesa_error(ctx, GL_INVALID_VALUE, "%s(size < 0)", func);
return;
}
@@ -1519,16 +1518,13 @@ _mesa_BufferData(GLenum target,
GLsizeiptrARB size,
}
if (!valid_usage) {
- _mesa_error(ctx, GL_INVALID_ENUM, "glBufferData(usage)");
+ _mesa_error(ctx, GL_INVALID_ENUM, "%s(invalid usage:
%s)", func,
+ _mesa_lookup_enum_by_nr(usage));
return;
}
- bufObj = get_buffer(ctx, "glBufferDataARB", target,
GL_INVALID_OPERATION);
- if (!bufObj)
- return;
-
if (bufObj->Immutable) {
- _mesa_error(ctx, GL_INVALID_OPERATION,
"glBufferData(immutable)");
+ _mesa_error(ctx, GL_INVALID_OPERATION, "%s(immutable)",
func);
return;
}
@@ -1554,10 +1550,43 @@ _mesa_BufferData(GLenum target,
GLsizeiptrARB size,
GL_MAP_WRITE_BIT |
GL_DYNAMIC_STORAGE_BIT,
bufObj)) {
- _mesa_error(ctx, GL_OUT_OF_MEMORY, "glBufferDataARB()");
+ _mesa_error(ctx, GL_OUT_OF_MEMORY, "%s", func);
}
}
+void GLAPIENTRY
+_mesa_BufferData(GLenum target, GLsizeiptr size,
+ const GLvoid *data, GLenum usage)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ struct gl_buffer_object *bufObj;
+
+ bufObj = get_buffer(ctx, "glBufferData", target,
GL_INVALID_OPERATION);
+ if (!bufObj)
+ return;
+
+ _mesa_buffer_data(ctx, bufObj, target, size, data, usage,
+ "glBufferData");
+}
+
+void GLAPIENTRY
+_mesa_NamedBufferData(GLuint buffer, GLsizeiptr size, const
GLvoid *data,
+ GLenum usage)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ struct gl_buffer_object *bufObj;
+
+ bufObj = _mesa_lookup_bufferobj_err(ctx, buffer,
"glNamedBufferData");
+ if (!bufObj)
+ return;
+
+ /* In direct state access, buffer objects have an
unspecified target since
+ * they are not required to be bound.
+ */
+ _mesa_buffer_data(ctx, bufObj, GL_NONE, size, data, usage,
+ "glNamedBufferData");
+}
+
void GLAPIENTRY
_mesa_BufferSubData(GLenum target, GLintptrARB offset,
diff --git a/src/mesa/main/bufferobj.h b/src/mesa/main/bufferobj.h
index 3c337aa..ddd240c 100644
--- a/src/mesa/main/bufferobj.h
+++ b/src/mesa/main/bufferobj.h
@@ -135,6 +135,11 @@ _mesa_buffer_storage(struct gl_context
*ctx, struct gl_buffer_object *bufObj,
GLbitfield flags, const char *func);
extern void
+_mesa_buffer_data(struct gl_context *ctx, struct
gl_buffer_object *bufObj,
+ GLenum target, GLsizeiptr size, const
GLvoid *data,
+ GLenum usage, const char *func);
is there a reason to export this function? Why not having it static?
Meta (mesa/src/main/drivers/common/) uses _mesa_BufferData. It would
be simpler to use this function _mesa_buffer_data. After most of DSA
is done, I get to start making Meta use the backend functions rather
than api entry points. This will hopefully save us from storing
internal driver objects in hash tables and getting the context everywhere.
Reviewed-by: Martin Peres <martin.pe...@linux.intel.com
<mailto:martin.pe...@linux.intel.com>>
+
+extern void
_mesa_buffer_unmap_all_mappings(struct gl_context *ctx,
struct gl_buffer_object
*bufObj);
@@ -172,8 +177,12 @@ _mesa_NamedBufferStorage(GLuint buffer,
GLsizeiptr size, const GLvoid *data,
GLbitfield flags);
void GLAPIENTRY
-_mesa_BufferData(GLenum target, GLsizeiptrARB size,
- const GLvoid * data, GLenum usage);
+_mesa_BufferData(GLenum target, GLsizeiptr size,
+ const GLvoid *data, GLenum usage);
+
+void GLAPIENTRY
+_mesa_NamedBufferData(GLuint buffer, GLsizeiptr size,
+ const GLvoid *data, GLenum usage);
void GLAPIENTRY
_mesa_BufferSubData(GLenum target, GLintptrARB offset,
diff --git a/src/mesa/main/tests/dispatch_sanity.cpp
b/src/mesa/main/tests/dispatch_sanity.cpp
index 9f663be..595ee90 100644
--- a/src/mesa/main/tests/dispatch_sanity.cpp
+++ b/src/mesa/main/tests/dispatch_sanity.cpp
@@ -957,6 +957,7 @@ const struct function
gl_core_functions_possible[] = {
/* GL_ARB_direct_state_access */
{ "glCreateBuffers", 45, -1 },
{ "glNamedBufferStorage", 45, -1 },
+ { "glNamedBufferData", 45, -1 },
{ "glCreateTextures", 45, -1 },
{ "glTextureStorage1D", 45, -1 },
{ "glTextureStorage2D", 45, -1 },