mesa: Implement VertexArrayVertexBuffer

Reviewed-by: Laura Ekstrand <laura@jlekstrand.net>
This commit is contained in:
Fredrik Höglund 2015-03-02 18:35:10 +01:00
parent c59b5317fc
commit cc9b68e9c9
4 changed files with 71 additions and 25 deletions

View file

@ -470,6 +470,14 @@
<param name="buffer" type="GLuint" />
</function>
<function name="VertexArrayVertexBuffer" offset="assign">
<param name="vaobj" type="GLuint" />
<param name="bindingindex" type="GLuint" />
<param name="buffer" type="GLuint" />
<param name="offset" type="GLintptr" />
<param name="stride" type="GLsizei" />
</function>
<!-- Sampler object functions -->
<function name="CreateSamplers" offset="assign">

View file

@ -1021,6 +1021,7 @@ const struct function gl_core_functions_possible[] = {
{ "glDisableVertexArrayAttrib", 45, -1 },
{ "glEnableVertexArrayAttrib", 45, -1 },
{ "glVertexArrayElementBuffer", 45, -1 },
{ "glVertexArrayVertexBuffer", 45, -1 },
{ "glCreateSamplers", 45, -1 },
{ "glCreateProgramPipelines", 45, -1 },
{ "glCreateQueries", 45, -1 },

View file

@ -1487,28 +1487,15 @@ _mesa_primitive_restart_index(const struct gl_context *ctx, GLenum ib_type)
/**
* GL_ARB_vertex_attrib_binding
*/
void GLAPIENTRY
_mesa_BindVertexBuffer(GLuint bindingIndex, GLuint buffer, GLintptr offset,
GLsizei stride)
static void
vertex_array_vertex_buffer(struct gl_context *ctx, struct gl_vertex_array_object *vao,
GLuint bindingIndex, GLuint buffer, GLintptr offset,
GLsizei stride, const char *func)
{
GET_CURRENT_CONTEXT(ctx);
struct gl_vertex_array_object * const vao = ctx->Array.VAO;
struct gl_buffer_object *vbo;
ASSERT_OUTSIDE_BEGIN_END(ctx);
/* The ARB_vertex_attrib_binding spec says:
*
* "An INVALID_OPERATION error is generated if no vertex array object
* is bound."
*/
if (ctx->API == API_OPENGL_CORE &&
ctx->Array.VAO == ctx->Array.DefaultVAO) {
_mesa_error(ctx, GL_INVALID_OPERATION,
"glBindVertexBuffer(No array object bound)");
return;
}
/* The ARB_vertex_attrib_binding spec says:
*
* "An INVALID_VALUE error is generated if <bindingindex> is greater than
@ -1516,9 +1503,9 @@ _mesa_BindVertexBuffer(GLuint bindingIndex, GLuint buffer, GLintptr offset,
*/
if (bindingIndex >= ctx->Const.MaxVertexAttribBindings) {
_mesa_error(ctx, GL_INVALID_VALUE,
"glBindVertexBuffer(bindingindex=%u > "
"%s(bindingindex=%u > "
"GL_MAX_VERTEX_ATTRIB_BINDINGS)",
bindingIndex);
func, bindingIndex);
return;
}
@ -1529,21 +1516,21 @@ _mesa_BindVertexBuffer(GLuint bindingIndex, GLuint buffer, GLintptr offset,
*/
if (offset < 0) {
_mesa_error(ctx, GL_INVALID_VALUE,
"glBindVertexBuffer(offset=%" PRId64 " < 0)",
(int64_t) offset);
"%s(offset=%" PRId64 " < 0)",
func, (int64_t) offset);
return;
}
if (stride < 0) {
_mesa_error(ctx, GL_INVALID_VALUE,
"glBindVertexBuffer(stride=%d < 0)", stride);
"%s(stride=%d < 0)", func, stride);
return;
}
if (ctx->API == API_OPENGL_CORE && ctx->Version >= 44 &&
stride > ctx->Const.MaxVertexAttribStride) {
_mesa_error(ctx, GL_INVALID_VALUE, "glBindVertexBuffer(stride=%d > "
"GL_MAX_VERTEX_ATTRIB_STRIDE)", stride);
_mesa_error(ctx, GL_INVALID_VALUE, "%s(stride=%d > "
"GL_MAX_VERTEX_ATTRIB_STRIDE)", func, stride);
return;
}
@ -1563,7 +1550,7 @@ _mesa_BindVertexBuffer(GLuint bindingIndex, GLuint buffer, GLintptr offset,
* object references (automatically gen it).
*/
if (!_mesa_handle_bind_buffer_gen(ctx, GL_ARRAY_BUFFER, buffer,
&vbo, "glBindVertexBuffer"))
&vbo, func))
return;
} else {
/* The ARB_vertex_attrib_binding spec says:
@ -1579,6 +1566,52 @@ _mesa_BindVertexBuffer(GLuint bindingIndex, GLuint buffer, GLintptr offset,
}
void GLAPIENTRY
_mesa_BindVertexBuffer(GLuint bindingIndex, GLuint buffer, GLintptr offset,
GLsizei stride)
{
GET_CURRENT_CONTEXT(ctx);
/* The ARB_vertex_attrib_binding spec says:
*
* "An INVALID_OPERATION error is generated if no vertex array object
* is bound."
*/
if (ctx->API == API_OPENGL_CORE &&
ctx->Array.VAO == ctx->Array.DefaultVAO) {
_mesa_error(ctx, GL_INVALID_OPERATION,
"glBindVertexBuffer(No array object bound)");
return;
}
vertex_array_vertex_buffer(ctx, ctx->Array.VAO, bindingIndex,
buffer, offset, stride, "glBindVertexBuffer");
}
void GLAPIENTRY
_mesa_VertexArrayVertexBuffer(GLuint vaobj, GLuint bindingIndex, GLuint buffer,
GLintptr offset, GLsizei stride)
{
GET_CURRENT_CONTEXT(ctx);
struct gl_vertex_array_object *vao;
/* The ARB_direct_state_access specification says:
*
* "An INVALID_OPERATION error is generated by VertexArrayVertexBuffer
* if <vaobj> is not [compatibility profile: zero or] the name of an
* existing vertex array object."
*/
vao = _mesa_lookup_vao_err(ctx, vaobj, "glVertexArrayVertexBuffer");
if (!vao)
return;
vertex_array_vertex_buffer(ctx, vao, bindingIndex,
buffer, offset, stride,
"glVertexArrayVertexBuffer");
}
void GLAPIENTRY
_mesa_BindVertexBuffers(GLuint first, GLsizei count, const GLuint *buffers,
const GLintptr *offsets, const GLsizei *strides)

View file

@ -290,6 +290,10 @@ extern void GLAPIENTRY
_mesa_BindVertexBuffer(GLuint bindingIndex, GLuint buffer, GLintptr offset,
GLsizei stride);
extern void GLAPIENTRY
_mesa_VertexArrayVertexBuffer(GLuint vaobj, GLuint bindingIndex, GLuint buffer,
GLintptr offset, GLsizei stride);
extern void GLAPIENTRY
_mesa_BindVertexBuffers(GLuint first, GLsizei count, const GLuint *buffers,
const GLintptr *offsets, const GLsizei *strides);