[Mesa-dev] [PATCH 1/7] mesa: implement glBindBuffersBase() and gl BindBuffersRange()
Maxence Le Doré
maxence.ledore at gmail.com
Thu Jan 2 16:27:31 PST 2014
---
src/mesa/main/bufferobj.c | 158 ++++++++++++++++++++++++++++++++++++++++++++++
src/mesa/main/bufferobj.h | 9 ++-
2 files changed, 165 insertions(+), 2 deletions(-)
diff --git a/src/mesa/main/bufferobj.c b/src/mesa/main/bufferobj.c
index a3d8f24..bad8f90 100644
--- a/src/mesa/main/bufferobj.c
+++ b/src/mesa/main/bufferobj.c
@@ -2706,3 +2706,161 @@ _mesa_InvalidateBufferData(GLuint buffer)
*/
return;
}
+
+void GLAPIENTRY
+_mesa_BindBuffersBase(GLenum target, GLuint first, GLsizei count,
+ const GLuint *buffers)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ int i = 0;
+ GLboolean exceedMaxBindings = GL_FALSE;
+
+ switch(target) {
+ case GL_TRANSFORM_FEEDBACK_BUFFER:
+ first + count > ctx->Const.MaxTransformFeedbackBuffers ?
+ exceedMaxBindings = GL_TRUE : exceedMaxBindings = GL_FALSE;
+ break;
+ case GL_UNIFORM_BUFFER:
+ first + count > ctx->Const.MaxUniformBufferBindings ?
+ exceedMaxBindings = GL_TRUE : exceedMaxBindings = GL_FALSE;
+ break;
+ case GL_ATOMIC_COUNTER_BUFFER:
+ first + count > ctx->Const.MaxAtomicBufferBindings ?
+ exceedMaxBindings = GL_TRUE : exceedMaxBindings = GL_FALSE;
+ break;
+ default:
+ _mesa_error(ctx, GL_INVALID_ENUM,
+ "glBindBuffersBase(invalid target)");
+ return;
+ }
+
+ if(exceedMaxBindings) {
+ _mesa_error(ctx, GL_INVALID_OPERATION,
+ "glBindBuffersBase(first+count)");
+ return;
+ }
+
+ for(i = 0 ; i < count ; i++) {
+ GLuint buffer;
+ struct gl_buffer_object *bufferObj;
+
+ if(buffers == NULL)
+ buffer = 0;
+ else
+ buffer = buffers[i];
+
+ if(buffer != 0) {
+ bufferObj = _mesa_lookup_bufferobj(ctx, buffer);
+ if(bufferObj) {
+ _mesa_BindBufferBase(target, first+i, buffer);
+ }
+ else
+ _mesa_error(ctx, GL_INVALID_OPERATION,
+ "glBindBufferBase(buffer[%i] is invalid)", i);
+ }
+ else
+ _mesa_BindBufferBase(target, first + i, 0);
+ }
+}
+
+void GLAPIENTRY
+_mesa_BindBuffersRange(GLenum target, GLuint first, GLsizei count,
+ const GLuint *buffers, const GLintptr *offsets,
+ const GLsizeiptr *sizes)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ int i = 0;
+ GLboolean exceedMaxBindings = GL_FALSE;
+
+ switch(target) {
+ case GL_TRANSFORM_FEEDBACK_BUFFER:
+ first + count > ctx->Const.MaxTransformFeedbackBuffers ?
+ exceedMaxBindings = GL_TRUE : exceedMaxBindings = GL_FALSE;
+ break;
+ case GL_UNIFORM_BUFFER:
+ first + count > ctx->Const.MaxUniformBufferBindings ?
+ exceedMaxBindings = GL_TRUE : exceedMaxBindings = GL_FALSE;
+ break;
+ case GL_ATOMIC_COUNTER_BUFFER:
+ first + count > ctx->Const.MaxAtomicBufferBindings ?
+ exceedMaxBindings = GL_TRUE : exceedMaxBindings = GL_FALSE;
+ break;
+ default:
+ _mesa_error(ctx, GL_INVALID_ENUM,
+ "glBindBuffersRange(invalid target)");
+ return;
+ }
+
+ if(exceedMaxBindings) {
+ _mesa_error(ctx, GL_INVALID_OPERATION,
+ "glBindBuffersRange(first+count)");
+ return;
+ }
+
+ for(i = 0 ; i < count ; i++) {
+ GLuint buffer;
+ GLintptr offset;
+ GLsizeiptr size;
+ struct gl_buffer_object *bufferObj;
+
+ if(buffers == NULL)
+ buffer = 0;
+ else {
+ buffer = buffers[i];
+ offset = offsets[i];
+ size = sizes[i];
+ }
+
+ if(buffer != 0) {
+ bufferObj = _mesa_lookup_bufferobj(ctx, buffer);
+ if(bufferObj) {
+ GLboolean validOffet, validSize;
+
+ switch(target) {
+ case GL_TRANSFORM_FEEDBACK_BUFFER:
+ (offset >= 0) ?
+ validOffset = GL_TRUE : validOffet = GL_FALSE;
+ (size >= 0) ?
+ validSize = GL_TRUE : validSize = GL_FALSE;
+ /* TODO : add target specific checks */
+ break;
+ case GL_UNIFORM_BUFFER:
+ (offset >= 0) ?
+ validOffset = GL_TRUE : validOffet = GL_FALSE;
+ (size >= 0) ?
+ validSize = GL_TRUE : validSize = GL_FALSE;
+ /* TODO : add target specific checks */
+ break;
+ case GL_ATOMIC_COUNTER_BUFFER:
+ (offset >= 0) ?
+ validOffset = GL_TRUE : validOffet = GL_FALSE;
+ (size >= 0) ?
+ validSize = GL_TRUE : validSize = GL_FALSE;
+ /* TODO : add target specific checks */
+ break;
+ default:
+ /* should not get there at this point */
+ return;
+ }
+
+ if(!validOffet || !validSize) {
+ _mesa_error(ctx, GL_INVALID_VALUE,
+ "glBindBuffersRange(offsets and/or sizes invalid)");
+ return;
+ }
+
+ if(offset+size > bufferObj->Size) {
+ _mesa_error(ctx, GL_INVALID_VALUE,
+ "glBindBuffersRange(offset+size > GL_BUFFER_SIZE)");
+ return;
+ }
+ _mesa_BindBufferRange(target, first+i, buffer, offset, size);
+ }
+ else
+ _mesa_error(ctx, GL_INVALID_OPERATION,
+ "glBindBuffersRange(buffers)");
+ }
+ else
+ _mesa_BindBufferRange(target, first + i, 0, 0, 0);
+ }
+}
diff --git a/src/mesa/main/bufferobj.h b/src/mesa/main/bufferobj.h
index 71988b0..5bc3734 100644
--- a/src/mesa/main/bufferobj.h
+++ b/src/mesa/main/bufferobj.h
@@ -191,6 +191,11 @@ _mesa_InvalidateBufferSubData(GLuint buffer, GLintptr offset,
void GLAPIENTRY
_mesa_InvalidateBufferData(GLuint buffer);
-
-
+void GLAPIENTRY
+_mesa_BindBuffersBase(GLenum target, GLuint first, GLsizei count,
+ const GLuint *buffers);
+void GLAPIENTRY
+_mesa_BindBuffersRange(GLenum target, GLuint first, GLsizei count,
+ const GLuint *buffers, const GLintptr *offsets,
+ const GLsizeiptr *sizes);
#endif
--
1.8.5.2
More information about the mesa-dev
mailing list