#include <stdbool.h>
#include "bufferobj.h"
-#include "compiler.h"
+#include "util/compiler.h"
#include "glheader.h"
#include "mtypes.h"
extern void
_mesa_free_transform_feedback(struct gl_context *ctx);
-extern GLboolean
-_mesa_validate_transform_feedback_buffers(struct gl_context *ctx);
-
-
extern void
_mesa_init_transform_feedback_functions(struct dd_function_table *driver);
/*** GL_EXT_transform_feedback ***/
+void GLAPIENTRY
+_mesa_BeginTransformFeedback_no_error(GLenum mode);
+
extern void GLAPIENTRY
_mesa_BeginTransformFeedback(GLenum mode);
+void GLAPIENTRY
+_mesa_EndTransformFeedback_no_error(void);
+
extern void GLAPIENTRY
_mesa_EndTransformFeedback(void);
-extern void
-_mesa_bind_buffer_range_transform_feedback(struct gl_context *ctx,
- struct gl_transform_feedback_object *obj,
- GLuint index,
- struct gl_buffer_object *bufObj,
- GLintptr offset,
- GLsizeiptr size, bool dsa);
+extern bool
+_mesa_validate_buffer_range_xfb(struct gl_context *ctx,
+ struct gl_transform_feedback_object *obj,
+ GLuint index, struct gl_buffer_object *bufObj,
+ GLintptr offset, GLsizeiptr size, bool dsa);
extern void
_mesa_bind_buffer_base_transform_feedback(struct gl_context *ctx,
struct gl_buffer_object *bufObj,
bool dsa);
+void GLAPIENTRY
+_mesa_BindBufferOffsetEXT_no_error(GLenum target, GLuint index, GLuint buffer,
+ GLintptr offset);
+
extern void GLAPIENTRY
_mesa_BindBufferOffsetEXT(GLenum target, GLuint index, GLuint buffer,
GLintptr offset);
+void GLAPIENTRY
+_mesa_TransformFeedbackVaryings_no_error(GLuint program, GLsizei count,
+ const GLchar *const *varyings,
+ GLenum bufferMode);
+
extern void GLAPIENTRY
_mesa_TransformFeedbackVaryings(GLuint program, GLsizei count,
const GLchar * const *varyings,
_mesa_init_transform_feedback_object(struct gl_transform_feedback_object *obj,
GLuint name);
+extern void
+_mesa_delete_transform_feedback_object(struct gl_context *ctx,
+ struct gl_transform_feedback_object
+ *obj);
+
struct gl_transform_feedback_object *
_mesa_lookup_transform_feedback_object(struct gl_context *ctx, GLuint name);
extern GLboolean GLAPIENTRY
_mesa_IsTransformFeedback(GLuint name);
+void GLAPIENTRY
+_mesa_BindTransformFeedback_no_error(GLenum target, GLuint name);
+
extern void GLAPIENTRY
_mesa_BindTransformFeedback(GLenum target, GLuint name);
extern void GLAPIENTRY
_mesa_DeleteTransformFeedbacks(GLsizei n, const GLuint *names);
+void GLAPIENTRY
+_mesa_PauseTransformFeedback_no_error(void);
+
extern void GLAPIENTRY
_mesa_PauseTransformFeedback(void);
+void GLAPIENTRY
+_mesa_ResumeTransformFeedback_no_error(void);
+
extern void GLAPIENTRY
_mesa_ResumeTransformFeedback(void);
{
_mesa_reference_buffer_object(ctx, &tfObj->Buffers[index], bufObj);
- tfObj->BufferNames[index] = bufObj->Name;
+ tfObj->BufferNames[index] = bufObj ? bufObj->Name : 0;
tfObj->Offset[index] = offset;
tfObj->RequestedSize[index] = size;
- if (bufObj != ctx->Shared->NullBufferObj)
+ if (bufObj)
bufObj->UsageHistory |= USAGE_TRANSFORM_FEEDBACK_BUFFER;
}
+static inline void
+_mesa_bind_buffer_range_xfb(struct gl_context *ctx,
+ struct gl_transform_feedback_object *obj,
+ GLuint index, struct gl_buffer_object *bufObj,
+ GLintptr offset, GLsizeiptr size)
+{
+ /* Note: no need to FLUSH_VERTICES or flag NewTransformFeedback, because
+ * transform feedback buffers can't be changed while transform feedback is
+ * active.
+ */
+
+ /* The general binding point */
+ _mesa_reference_buffer_object(ctx,
+ &ctx->TransformFeedback.CurrentBuffer,
+ bufObj);
+
+ /* The per-attribute binding point */
+ _mesa_set_transform_feedback_binding(ctx, obj, index, bufObj, offset, size);
+}
+
/*** GL_ARB_direct_state_access ***/
extern void GLAPIENTRY