+ if (_mesa_has_EXT_transform_feedback(ctx) || _mesa_is_gles3(ctx))
+ return &ctx->Query.PrimitivesWritten[index];
+ else
+ return NULL;
+ case GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW:
+ if (_mesa_has_ARB_transform_feedback_overflow_query(ctx))
+ return &ctx->Query.TransformFeedbackOverflow[index];
+ else
+ return NULL;
+ case GL_TRANSFORM_FEEDBACK_OVERFLOW:
+ if (_mesa_has_ARB_transform_feedback_overflow_query(ctx))
+ return &ctx->Query.TransformFeedbackOverflowAny;
+ else
+ return NULL;
+
+ case GL_VERTICES_SUBMITTED:
+ case GL_PRIMITIVES_SUBMITTED:
+ case GL_VERTEX_SHADER_INVOCATIONS:
+ case GL_FRAGMENT_SHADER_INVOCATIONS:
+ case GL_CLIPPING_INPUT_PRIMITIVES:
+ case GL_CLIPPING_OUTPUT_PRIMITIVES:
+ return get_pipe_stats_binding_point(ctx, target);
+
+ case GL_GEOMETRY_SHADER_INVOCATIONS:
+ /* GL_GEOMETRY_SHADER_INVOCATIONS is defined in a non-sequential order */
+ target = GL_VERTICES_SUBMITTED + MAX_PIPELINE_STATISTICS - 1;
+ /* fallthrough */
+ case GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED:
+ if (_mesa_has_geometry_shaders(ctx))
+ return get_pipe_stats_binding_point(ctx, target);
+ else
+ return NULL;
+
+ case GL_TESS_CONTROL_SHADER_PATCHES:
+ case GL_TESS_EVALUATION_SHADER_INVOCATIONS:
+ if (_mesa_has_tessellation(ctx))
+ return get_pipe_stats_binding_point(ctx, target);
+ else
+ return NULL;
+
+ case GL_COMPUTE_SHADER_INVOCATIONS:
+ if (_mesa_has_compute_shaders(ctx))
+ return get_pipe_stats_binding_point(ctx, target);