/** * Delete the given transform feedback objects. * Part of GL_ARB_transform_feedback2. */ void GLAPIENTRY _mesa_DeleteTransformFeedbacks(GLsizei n, const GLuint *names) { GLint i; GET_CURRENT_CONTEXT(ctx); if (n < 0) { _mesa_error(ctx, GL_INVALID_VALUE, "glDeleteTransformFeedbacks(n < 0)"); return; } if (!names) return; for (i = 0; i < n; i++) { if (names[i] > 0) { struct gl_transform_feedback_object *obj = _mesa_lookup_transform_feedback_object(ctx, names[i]); if (obj) { if (obj->Active) { _mesa_error(ctx, GL_INVALID_OPERATION, "glDeleteTransformFeedbacks(object %u is active)", names[i]); return; } _mesa_HashRemove(ctx->TransformFeedback.Objects, names[i]); /* unref, but object may not be deleted until later */ reference_transform_feedback_object(&obj, NULL); } } } }
/** * Bind the given transform feedback object. * Part of GL_ARB_transform_feedback2. */ void GLAPIENTRY _mesa_BindTransformFeedback(GLenum target, GLuint name) { struct gl_transform_feedback_object *obj; GET_CURRENT_CONTEXT(ctx); if (target != GL_TRANSFORM_FEEDBACK) { _mesa_error(ctx, GL_INVALID_ENUM, "glBindTransformFeedback(target)"); return; } if (_mesa_is_xfb_active_and_unpaused(ctx)) { _mesa_error(ctx, GL_INVALID_OPERATION, "glBindTransformFeedback(transform is active, or not paused)"); return; } obj = _mesa_lookup_transform_feedback_object(ctx, name); if (!obj) { _mesa_error(ctx, GL_INVALID_OPERATION, "glBindTransformFeedback(name=%u)", name); return; } reference_transform_feedback_object(&ctx->TransformFeedback.CurrentObject, obj); }
/** * Is the given ID a transform feedback object? * Part of GL_ARB_transform_feedback2. */ GLboolean GLAPIENTRY _mesa_IsTransformFeedback(GLuint name) { GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE); if (name && _mesa_lookup_transform_feedback_object(ctx, name)) return GL_TRUE; else return GL_FALSE; }
static void GLAPIENTRY vbo_exec_DrawTransformFeedbackStream(GLenum mode, GLuint name, GLuint stream) { GET_CURRENT_CONTEXT(ctx); struct gl_transform_feedback_object *obj = _mesa_lookup_transform_feedback_object(ctx, name); if (MESA_VERBOSE & VERBOSE_DRAW) _mesa_debug(ctx, "glDrawTransformFeedbackStream(%s, %u, %u)\n", _mesa_lookup_enum_by_nr(mode), name, stream); vbo_draw_transform_feedback(ctx, mode, obj, stream, 1); }
/** * Wrapper around lookup_transform_feedback_object that throws * GL_INVALID_OPERATION if id is not in the hash table. After calling * _mesa_error, it returns NULL. */ static struct gl_transform_feedback_object * lookup_transform_feedback_object_err(struct gl_context *ctx, GLuint xfb, const char* func) { struct gl_transform_feedback_object *obj; obj = _mesa_lookup_transform_feedback_object(ctx, xfb); if (!obj) { _mesa_error(ctx, GL_INVALID_OPERATION, "%s(xfb=%u: non-generated object name)", func, xfb); } return obj; }
static void GLAPIENTRY vbo_exec_DrawTransformFeedbackInstanced(GLenum mode, GLuint name, GLsizei primcount) { GET_CURRENT_CONTEXT(ctx); struct gl_transform_feedback_object *obj = _mesa_lookup_transform_feedback_object(ctx, name); if (MESA_VERBOSE & VERBOSE_DRAW) _mesa_debug(ctx, "glDrawTransformFeedbackInstanced(%s, %d)\n", _mesa_lookup_enum_by_nr(mode), name); vbo_draw_transform_feedback(ctx, mode, obj, 0, primcount); }
/** * Is the given ID a transform feedback object? * Part of GL_ARB_transform_feedback2. */ GLboolean GLAPIENTRY _mesa_IsTransformFeedback(GLuint name) { struct gl_transform_feedback_object *obj; GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE); if (name == 0) return GL_FALSE; obj = _mesa_lookup_transform_feedback_object(ctx, name); if (obj == NULL) return GL_FALSE; return obj->EverBound; }