mesa: Move glBindBufferBase and glBindBufferRange() to bufferobj.
The rest of the TFB implementation remains in transformfeedback.c, and this will be shared with UBOs. v2: Move the size/offset checks shared with UBOs to common code as well. (Kenneth's review) Reviewed-by: Brian Paul <brianp@vmware.com> (v1) Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
@@ -1994,6 +1994,78 @@ _mesa_GetObjectParameterivAPPLE(GLenum objectType, GLuint name, GLenum pname,
|
||||
|
||||
#endif /* FEATURE_APPLE_object_purgeable */
|
||||
|
||||
|
||||
void GLAPIENTRY
|
||||
_mesa_BindBufferRange(GLenum target, GLuint index,
|
||||
GLuint buffer, GLintptr offset, GLsizeiptr size)
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
struct gl_buffer_object *bufObj;
|
||||
|
||||
if (buffer == 0) {
|
||||
bufObj = ctx->Shared->NullBufferObj;
|
||||
} else {
|
||||
bufObj = _mesa_lookup_bufferobj(ctx, buffer);
|
||||
}
|
||||
|
||||
if (!bufObj) {
|
||||
_mesa_error(ctx, GL_INVALID_OPERATION,
|
||||
"glBindBufferRange(invalid buffer=%u)", buffer);
|
||||
return;
|
||||
}
|
||||
|
||||
if (size <= 0) {
|
||||
_mesa_error(ctx, GL_INVALID_VALUE, "glBindBufferRange(size=%d)",
|
||||
(int) size);
|
||||
return;
|
||||
}
|
||||
|
||||
if (offset + size > bufObj->Size) {
|
||||
_mesa_error(ctx, GL_INVALID_VALUE,
|
||||
"glBindBufferRange(offset + size %d > buffer size %d)",
|
||||
(int) (offset + size), (int) (bufObj->Size));
|
||||
return;
|
||||
}
|
||||
|
||||
switch (target) {
|
||||
case GL_TRANSFORM_FEEDBACK_BUFFER:
|
||||
_mesa_bind_buffer_range_transform_feedback(ctx, index, bufObj,
|
||||
offset, size);
|
||||
return;
|
||||
default:
|
||||
_mesa_error(ctx, GL_INVALID_ENUM, "glBindBufferRange(target)");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
_mesa_BindBufferBase(GLenum target, GLuint index, GLuint buffer)
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
struct gl_buffer_object *bufObj;
|
||||
|
||||
if (buffer == 0) {
|
||||
bufObj = ctx->Shared->NullBufferObj;
|
||||
} else {
|
||||
bufObj = _mesa_lookup_bufferobj(ctx, buffer);
|
||||
}
|
||||
|
||||
if (!bufObj) {
|
||||
_mesa_error(ctx, GL_INVALID_OPERATION,
|
||||
"glBindBufferBase(invalid buffer=%u)", buffer);
|
||||
return;
|
||||
}
|
||||
|
||||
switch (target) {
|
||||
case GL_TRANSFORM_FEEDBACK_BUFFER:
|
||||
_mesa_bind_buffer_base_transform_feedback(ctx, index, bufObj);
|
||||
return;
|
||||
default:
|
||||
_mesa_error(ctx, GL_INVALID_ENUM, "glBindBufferBase(target)");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
_mesa_init_bufferobj_dispatch(struct _glapi_table *disp)
|
||||
{
|
||||
@@ -2008,4 +2080,6 @@ _mesa_init_bufferobj_dispatch(struct _glapi_table *disp)
|
||||
SET_IsBufferARB(disp, _mesa_IsBufferARB);
|
||||
SET_MapBufferARB(disp, _mesa_MapBufferARB);
|
||||
SET_UnmapBufferARB(disp, _mesa_UnmapBufferARB);
|
||||
SET_BindBufferRangeEXT(disp, _mesa_BindBufferRange);
|
||||
SET_BindBufferBaseEXT(disp, _mesa_BindBufferBase);
|
||||
}
|
||||
|
@@ -159,6 +159,13 @@ extern void GLAPIENTRY
|
||||
_mesa_GetObjectParameterivAPPLE(GLenum objectType, GLuint name, GLenum pname, GLint* params);
|
||||
#endif
|
||||
|
||||
void GLAPIENTRY
|
||||
_mesa_BindBufferBase(GLenum target, GLuint index, GLuint buffer);
|
||||
|
||||
void GLAPIENTRY
|
||||
_mesa_BindBufferRange(GLenum target, GLuint index,
|
||||
GLuint buffer, GLintptr offset, GLsizeiptr size);
|
||||
|
||||
extern void
|
||||
_mesa_init_bufferobj_dispatch(struct _glapi_table *disp);
|
||||
|
||||
|
@@ -291,8 +291,6 @@ _mesa_init_transform_feedback_dispatch(struct _glapi_table *disp)
|
||||
/* EXT_transform_feedback */
|
||||
SET_BeginTransformFeedbackEXT(disp, _mesa_BeginTransformFeedback);
|
||||
SET_EndTransformFeedbackEXT(disp, _mesa_EndTransformFeedback);
|
||||
SET_BindBufferRangeEXT(disp, _mesa_BindBufferRange);
|
||||
SET_BindBufferBaseEXT(disp, _mesa_BindBufferBase);
|
||||
SET_BindBufferOffsetEXT(disp, _mesa_BindBufferOffsetEXT);
|
||||
SET_TransformFeedbackVaryingsEXT(disp, _mesa_TransformFeedbackVaryings);
|
||||
SET_GetTransformFeedbackVaryingEXT(disp, _mesa_GetTransformFeedbackVarying);
|
||||
@@ -431,18 +429,14 @@ bind_buffer_range(struct gl_context *ctx, GLuint index,
|
||||
* Specify a buffer object to receive vertex shader results. Plus,
|
||||
* specify the starting offset to place the results, and max size.
|
||||
*/
|
||||
void GLAPIENTRY
|
||||
_mesa_BindBufferRange(GLenum target, GLuint index,
|
||||
GLuint buffer, GLintptr offset, GLsizeiptr size)
|
||||
void
|
||||
_mesa_bind_buffer_range_transform_feedback(struct gl_context *ctx,
|
||||
GLuint index,
|
||||
struct gl_buffer_object *bufObj,
|
||||
GLintptr offset,
|
||||
GLsizeiptr size)
|
||||
{
|
||||
struct gl_transform_feedback_object *obj;
|
||||
struct gl_buffer_object *bufObj;
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
|
||||
if (target != GL_TRANSFORM_FEEDBACK_BUFFER) {
|
||||
_mesa_error(ctx, GL_INVALID_ENUM, "glBindBufferRange(target)");
|
||||
return;
|
||||
}
|
||||
|
||||
obj = ctx->TransformFeedback.CurrentObject;
|
||||
|
||||
@@ -457,8 +451,8 @@ _mesa_BindBufferRange(GLenum target, GLuint index,
|
||||
return;
|
||||
}
|
||||
|
||||
if ((size <= 0) || (size & 0x3)) {
|
||||
/* must be positive and multiple of four */
|
||||
if (size & 0x3) {
|
||||
/* must a multiple of four */
|
||||
_mesa_error(ctx, GL_INVALID_VALUE, "glBindBufferRange(size=%d)", (int) size);
|
||||
return;
|
||||
}
|
||||
@@ -470,25 +464,6 @@ _mesa_BindBufferRange(GLenum target, GLuint index,
|
||||
return;
|
||||
}
|
||||
|
||||
if (buffer == 0) {
|
||||
bufObj = ctx->Shared->NullBufferObj;
|
||||
} else {
|
||||
bufObj = _mesa_lookup_bufferobj(ctx, buffer);
|
||||
}
|
||||
|
||||
if (!bufObj) {
|
||||
_mesa_error(ctx, GL_INVALID_OPERATION,
|
||||
"glBindBufferRange(invalid buffer=%u)", buffer);
|
||||
return;
|
||||
}
|
||||
|
||||
if (offset + size > bufObj->Size) {
|
||||
_mesa_error(ctx, GL_INVALID_VALUE,
|
||||
"glBindBufferRange(offset + size %d > buffer size %d)",
|
||||
(int) (offset + size), (int) (bufObj->Size));
|
||||
return;
|
||||
}
|
||||
|
||||
bind_buffer_range(ctx, index, bufObj, offset, size);
|
||||
}
|
||||
|
||||
@@ -497,18 +472,13 @@ _mesa_BindBufferRange(GLenum target, GLuint index,
|
||||
* Specify a buffer object to receive vertex shader results.
|
||||
* As above, but start at offset = 0.
|
||||
*/
|
||||
void GLAPIENTRY
|
||||
_mesa_BindBufferBase(GLenum target, GLuint index, GLuint buffer)
|
||||
void
|
||||
_mesa_bind_buffer_base_transform_feedback(struct gl_context *ctx,
|
||||
GLuint index,
|
||||
struct gl_buffer_object *bufObj)
|
||||
{
|
||||
struct gl_transform_feedback_object *obj;
|
||||
struct gl_buffer_object *bufObj;
|
||||
GLsizeiptr size;
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
|
||||
if (target != GL_TRANSFORM_FEEDBACK_BUFFER) {
|
||||
_mesa_error(ctx, GL_INVALID_ENUM, "glBindBufferBase(target)");
|
||||
return;
|
||||
}
|
||||
|
||||
obj = ctx->TransformFeedback.CurrentObject;
|
||||
|
||||
@@ -523,18 +493,6 @@ _mesa_BindBufferBase(GLenum target, GLuint index, GLuint buffer)
|
||||
return;
|
||||
}
|
||||
|
||||
if (buffer == 0) {
|
||||
bufObj = ctx->Shared->NullBufferObj;
|
||||
} else {
|
||||
bufObj = _mesa_lookup_bufferobj(ctx, buffer);
|
||||
}
|
||||
|
||||
if (!bufObj) {
|
||||
_mesa_error(ctx, GL_INVALID_OPERATION,
|
||||
"glBindBufferBase(invalid buffer=%u)", buffer);
|
||||
return;
|
||||
}
|
||||
|
||||
/* default size is the buffer size rounded down to nearest
|
||||
* multiple of four.
|
||||
*/
|
||||
|
@@ -60,12 +60,17 @@ _mesa_BeginTransformFeedback(GLenum mode);
|
||||
extern void GLAPIENTRY
|
||||
_mesa_EndTransformFeedback(void);
|
||||
|
||||
extern void GLAPIENTRY
|
||||
_mesa_BindBufferRange(GLenum target, GLuint index,
|
||||
GLuint buffer, GLintptr offset, GLsizeiptr size);
|
||||
extern void
|
||||
_mesa_bind_buffer_range_transform_feedback(struct gl_context *ctx,
|
||||
GLuint index,
|
||||
struct gl_buffer_object *bufObj,
|
||||
GLintptr offset,
|
||||
GLsizeiptr size);
|
||||
|
||||
extern void GLAPIENTRY
|
||||
_mesa_BindBufferBase(GLenum target, GLuint index, GLuint buffer);
|
||||
extern void
|
||||
_mesa_bind_buffer_base_transform_feedback(struct gl_context *ctx,
|
||||
GLuint index,
|
||||
struct gl_buffer_object *bufObj);
|
||||
|
||||
extern void GLAPIENTRY
|
||||
_mesa_BindBufferOffsetEXT(GLenum target, GLuint index, GLuint buffer,
|
||||
|
Reference in New Issue
Block a user