mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-04 20:00:11 +01:00
mesa: Implement VertexArrayVertexBuffer
Reviewed-by: Laura Ekstrand <laura@jlekstrand.net>
This commit is contained in:
parent
c59b5317fc
commit
cc9b68e9c9
4 changed files with 71 additions and 25 deletions
|
|
@ -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">
|
||||
|
|
|
|||
|
|
@ -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 },
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue