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