transformfeedback.h revision 01e04c3f
1/* 2 * Mesa 3-D graphics library 3 * 4 * Copyright (C) 2010 VMware, Inc. All Rights Reserved. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the "Software"), 8 * to deal in the Software without restriction, including without limitation 9 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 10 * and/or sell copies of the Software, and to permit persons to whom the 11 * Software is furnished to do so, subject to the following conditions: 12 * 13 * The above copyright notice and this permission notice shall be included 14 * in all copies or substantial portions of the Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 17 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 * OTHER DEALINGS IN THE SOFTWARE. 23 */ 24 25 26#ifndef TRANSFORM_FEEDBACK_H 27#define TRANSFORM_FEEDBACK_H 28 29#include <stdbool.h> 30#include "bufferobj.h" 31#include "compiler.h" 32#include "glheader.h" 33#include "mtypes.h" 34 35struct _glapi_table; 36struct dd_function_table; 37struct gl_context; 38 39extern void 40_mesa_init_transform_feedback(struct gl_context *ctx); 41 42extern void 43_mesa_free_transform_feedback(struct gl_context *ctx); 44 45extern void 46_mesa_init_transform_feedback_functions(struct dd_function_table *driver); 47 48extern unsigned 49_mesa_compute_max_transform_feedback_vertices( struct gl_context *ctx, 50 const struct gl_transform_feedback_object *obj, 51 const struct gl_transform_feedback_info *info); 52 53 54/*** GL_EXT_transform_feedback ***/ 55 56void GLAPIENTRY 57_mesa_BeginTransformFeedback_no_error(GLenum mode); 58 59extern void GLAPIENTRY 60_mesa_BeginTransformFeedback(GLenum mode); 61 62void GLAPIENTRY 63_mesa_EndTransformFeedback_no_error(void); 64 65extern void GLAPIENTRY 66_mesa_EndTransformFeedback(void); 67 68extern bool 69_mesa_validate_buffer_range_xfb(struct gl_context *ctx, 70 struct gl_transform_feedback_object *obj, 71 GLuint index, struct gl_buffer_object *bufObj, 72 GLintptr offset, GLsizeiptr size, bool dsa); 73 74extern void 75_mesa_bind_buffer_base_transform_feedback(struct gl_context *ctx, 76 struct gl_transform_feedback_object *obj, 77 GLuint index, 78 struct gl_buffer_object *bufObj, 79 bool dsa); 80 81void GLAPIENTRY 82_mesa_BindBufferOffsetEXT_no_error(GLenum target, GLuint index, GLuint buffer, 83 GLintptr offset); 84 85extern void GLAPIENTRY 86_mesa_BindBufferOffsetEXT(GLenum target, GLuint index, GLuint buffer, 87 GLintptr offset); 88 89void GLAPIENTRY 90_mesa_TransformFeedbackVaryings_no_error(GLuint program, GLsizei count, 91 const GLchar *const *varyings, 92 GLenum bufferMode); 93 94extern void GLAPIENTRY 95_mesa_TransformFeedbackVaryings(GLuint program, GLsizei count, 96 const GLchar * const *varyings, 97 GLenum bufferMode); 98 99extern void GLAPIENTRY 100_mesa_GetTransformFeedbackVarying(GLuint program, GLuint index, 101 GLsizei bufSize, GLsizei *length, 102 GLsizei *size, GLenum *type, GLchar *name); 103 104 105 106/*** GL_ARB_transform_feedback2 ***/ 107extern void 108_mesa_init_transform_feedback_object(struct gl_transform_feedback_object *obj, 109 GLuint name); 110 111struct gl_transform_feedback_object * 112_mesa_lookup_transform_feedback_object(struct gl_context *ctx, GLuint name); 113 114extern void GLAPIENTRY 115_mesa_GenTransformFeedbacks(GLsizei n, GLuint *names); 116 117extern void GLAPIENTRY 118_mesa_CreateTransformFeedbacks(GLsizei n, GLuint *names); 119 120extern GLboolean GLAPIENTRY 121_mesa_IsTransformFeedback(GLuint name); 122 123void GLAPIENTRY 124_mesa_BindTransformFeedback_no_error(GLenum target, GLuint name); 125 126extern void GLAPIENTRY 127_mesa_BindTransformFeedback(GLenum target, GLuint name); 128 129extern void GLAPIENTRY 130_mesa_DeleteTransformFeedbacks(GLsizei n, const GLuint *names); 131 132void GLAPIENTRY 133_mesa_PauseTransformFeedback_no_error(void); 134 135extern void GLAPIENTRY 136_mesa_PauseTransformFeedback(void); 137 138void GLAPIENTRY 139_mesa_ResumeTransformFeedback_no_error(void); 140 141extern void GLAPIENTRY 142_mesa_ResumeTransformFeedback(void); 143 144static inline bool 145_mesa_is_xfb_active_and_unpaused(const struct gl_context *ctx) 146{ 147 return ctx->TransformFeedback.CurrentObject->Active && 148 !ctx->TransformFeedback.CurrentObject->Paused; 149} 150 151extern bool 152_mesa_transform_feedback_is_using_program(struct gl_context *ctx, 153 struct gl_shader_program *shProg); 154 155static inline void 156_mesa_set_transform_feedback_binding(struct gl_context *ctx, 157 struct gl_transform_feedback_object *tfObj, GLuint index, 158 struct gl_buffer_object *bufObj, 159 GLintptr offset, GLsizeiptr size) 160{ 161 _mesa_reference_buffer_object(ctx, &tfObj->Buffers[index], bufObj); 162 163 tfObj->BufferNames[index] = bufObj->Name; 164 tfObj->Offset[index] = offset; 165 tfObj->RequestedSize[index] = size; 166 167 if (bufObj != ctx->Shared->NullBufferObj) 168 bufObj->UsageHistory |= USAGE_TRANSFORM_FEEDBACK_BUFFER; 169} 170 171static inline void 172_mesa_bind_buffer_range_xfb(struct gl_context *ctx, 173 struct gl_transform_feedback_object *obj, 174 GLuint index, struct gl_buffer_object *bufObj, 175 GLintptr offset, GLsizeiptr size) 176{ 177 /* Note: no need to FLUSH_VERTICES or flag NewTransformFeedback, because 178 * transform feedback buffers can't be changed while transform feedback is 179 * active. 180 */ 181 182 /* The general binding point */ 183 _mesa_reference_buffer_object(ctx, 184 &ctx->TransformFeedback.CurrentBuffer, 185 bufObj); 186 187 /* The per-attribute binding point */ 188 _mesa_set_transform_feedback_binding(ctx, obj, index, bufObj, offset, size); 189} 190 191/*** GL_ARB_direct_state_access ***/ 192 193extern void GLAPIENTRY 194_mesa_TransformFeedbackBufferBase(GLuint xfb, GLuint index, GLuint buffer); 195 196extern void GLAPIENTRY 197_mesa_TransformFeedbackBufferRange(GLuint xfb, GLuint index, GLuint buffer, 198 GLintptr offset, GLsizeiptr size); 199 200extern void GLAPIENTRY 201_mesa_GetTransformFeedbackiv(GLuint xfb, GLenum pname, GLint *param); 202 203extern void GLAPIENTRY 204_mesa_GetTransformFeedbacki_v(GLuint xfb, GLenum pname, GLuint index, 205 GLint *param); 206 207extern void GLAPIENTRY 208_mesa_GetTransformFeedbacki64_v(GLuint xfb, GLenum pname, GLuint index, 209 GLint64 *param); 210 211#endif /* TRANSFORM_FEEDBACK_H */ 212