// Copyright (C) 2015 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

@Doc("https://www.khronos.org/opengles/sdk/docs/man3/html/glBeginTransformFeedback.xhtml","OpenGL ES 3.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man31/html/glBeginTransformFeedback.xhtml","OpenGL ES 3.1")
cmd void glBeginTransformFeedback(GLenum primitiveMode) {
  minRequiredVersion(3, 0)
  switch (primitiveMode) {
    case GL_LINES, GL_POINTS, GL_TRIANGLES: {
      // version 3.0
    }
    default: {
      glErrorInvalidEnum(primitiveMode)
    }
  }
  // TODO
}

@Doc("https://www.khronos.org/opengles/sdk/docs/man3/html/glBindTransformFeedback.xhtml","OpenGL ES 3.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man31/html/glBindTransformFeedback.xhtml","OpenGL ES 3.1")
cmd void glBindTransformFeedback(GLenum target, TransformFeedbackId id) {
  minRequiredVersion(3, 0)
  switch (target) {
    case GL_TRANSFORM_FEEDBACK: {
      // version 3.0
    }
    default: {
      glErrorInvalidEnum(target)
    }
  }
  // TODO
}

@Doc("https://www.khronos.org/opengles/sdk/docs/man3/html/glDeleteTransformFeedbacks.xhtml","OpenGL ES 3.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man31/html/glDeleteTransformFeedbacks.xhtml","OpenGL ES 3.1")
cmd void glDeleteTransformFeedbacks(GLsizei n, const TransformFeedbackId* ids) {
  minRequiredVersion(3, 0)
  // TODO
}

@Doc("https://www.khronos.org/opengles/sdk/docs/man3/html/glBeginTransformFeedback.xhtml","OpenGL ES 3.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man31/html/glBeginTransformFeedback.xhtml","OpenGL ES 3.1")
cmd void glEndTransformFeedback() {
  minRequiredVersion(3, 0)
  // TODO
}

@Doc("https://www.khronos.org/opengles/sdk/docs/man3/html/glGenTransformFeedbacks.xhtml","OpenGL ES 3.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man31/html/glGenTransformFeedbacks.xhtml","OpenGL ES 3.1")
cmd void glGenTransformFeedbacks(GLsizei n, TransformFeedbackId* ids) {
  minRequiredVersion(3, 0)
  // TODO
}

@Doc("https://www.khronos.org/opengles/sdk/docs/man3/html/glGetTransformFeedbackVarying.xhtml","OpenGL ES 3.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man31/html/glGetTransformFeedbackVarying.xhtml","OpenGL ES 3.1")
cmd void glGetTransformFeedbackVarying(ProgramId program,
                                       GLuint    index,
                                       GLsizei   bufSize,
                                       GLsizei*  length,
                                       GLsizei*  size,
                                       GLenum*   type,
                                       GLchar*   name) {
  minRequiredVersion(3, 0)
  // TODO
}

@Doc("https://www.khronos.org/opengles/sdk/docs/man3/html/glIsTransformFeedback.xhtml","OpenGL ES 3.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man31/html/glIsTransformFeedback.xhtml","OpenGL ES 3.1")
cmd bool glIsTransformFeedback(TransformFeedbackId id) {
  minRequiredVersion(3, 0)
  // TODO
  return ?
}

@Doc("https://www.khronos.org/opengles/sdk/docs/man3/html/glPauseTransformFeedback.xhtml","OpenGL ES 3.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man31/html/glPauseTransformFeedback.xhtml","OpenGL ES 3.1")
cmd void glPauseTransformFeedback() {
  minRequiredVersion(3, 0)
  // TODO
}

@Doc("https://www.khronos.org/opengles/sdk/docs/man3/html/glResumeTransformFeedback.xhtml","OpenGL ES 3.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man31/html/glResumeTransformFeedback.xhtml","OpenGL ES 3.1")
cmd void glResumeTransformFeedback() {
  minRequiredVersion(3, 0)
  // TODO
}

@Doc("https://www.khronos.org/opengles/sdk/docs/man3/html/glTransformFeedbackVaryings.xhtml","OpenGL ES 3.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man31/html/glTransformFeedbackVaryings.xhtml","OpenGL ES 3.1")
cmd void glTransformFeedbackVaryings(ProgramId            program,
                                     GLsizei              count,
                                     const GLchar* const* varyings,
                                     GLenum               bufferMode) {
  minRequiredVersion(3, 0)
  switch (bufferMode) {
    case GL_INTERLEAVED_ATTRIBS, GL_SEPARATE_ATTRIBS: {
      // version 3.0
    }
    default: {
      glErrorInvalidEnum(bufferMode)
    }
  }
  // TODO
}

