blob: 43fc8e4ed1e8bd91d5f9d77cd29c30ed03454785 [file] [log] [blame]
// 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/man/xhtml/glActiveTexture.xml","OpenGL ES 2.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man3/html/glActiveTexture.xhtml","OpenGL ES 3.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man31/html/glActiveTexture.xhtml","OpenGL ES 3.1")
cmd void glActiveTexture(GLenum unit) {
minRequiredVersion(2, 0)
switch (unit) {
case GL_TEXTURE0, GL_TEXTURE1, GL_TEXTURE10, GL_TEXTURE11, GL_TEXTURE12, GL_TEXTURE13,
GL_TEXTURE14, GL_TEXTURE15, GL_TEXTURE16, GL_TEXTURE17, GL_TEXTURE18, GL_TEXTURE19,
GL_TEXTURE2, GL_TEXTURE20, GL_TEXTURE21, GL_TEXTURE22, GL_TEXTURE23, GL_TEXTURE24,
GL_TEXTURE25, GL_TEXTURE26, GL_TEXTURE27, GL_TEXTURE28, GL_TEXTURE29, GL_TEXTURE3,
GL_TEXTURE30, GL_TEXTURE31, GL_TEXTURE4, GL_TEXTURE5, GL_TEXTURE6, GL_TEXTURE7,
GL_TEXTURE8, GL_TEXTURE9: {
// version 2.0
}
default: {
glErrorInvalidEnum(unit)
}
}
ctx := GetContext()
ctx.ActiveTextureUnit = unit
if !(unit in ctx.TextureUnits) {
ctx.TextureUnits[unit] = ctx.TextureUnits[unit]
}
}
@Doc("https://www.khronos.org/opengles/sdk/docs/man31/html/glBindImageTexture.xhtml","OpenGL ES 3.1")
cmd void glBindImageTexture(GLuint unit,
TextureId texture,
GLint level,
GLboolean layered,
GLint layer,
GLenum access,
GLenum format) {
minRequiredVersion(3, 1)
switch (access) {
case GL_READ_ONLY, GL_READ_WRITE, GL_WRITE_ONLY: {
// version 3.1
}
default: {
glErrorInvalidEnum(access)
}
}
switch (format) {
case GL_R32F, GL_R32I, GL_R32UI, GL_RGBA16F, GL_RGBA16I, GL_RGBA16UI, GL_RGBA32F, GL_RGBA32I,
GL_RGBA32UI, GL_RGBA8, GL_RGBA8I, GL_RGBA8UI, GL_RGBA8_SNORM: {
// version 3.1
}
default: {
glErrorInvalidEnum(format)
}
}
// TODO
}
@Doc("https://www.khronos.org/opengles/sdk/docs/man3/html/glBindSampler.xhtml","OpenGL ES 3.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man31/html/glBindSampler.xhtml","OpenGL ES 3.1")
cmd void glBindSampler(GLuint unit, SamplerId sampler) {
minRequiredVersion(3, 0)
// TODO
}
@Doc("https://www.khronos.org/opengles/sdk/docs/man/xhtml/glBindTexture.xml","OpenGL ES 2.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man3/html/glBindTexture.xhtml","OpenGL ES 3.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man31/html/glBindTexture.xhtml","OpenGL ES 3.1")
cmd void glBindTexture(GLenum target, TextureId texture) {
minRequiredVersion(2, 0)
switch (target) {
case GL_TEXTURE_2D, GL_TEXTURE_CUBE_MAP: {
// version 2.0
}
case GL_TEXTURE_2D_ARRAY, GL_TEXTURE_3D: {
minRequiredVersion(3, 0)
}
case GL_TEXTURE_2D_MULTISAMPLE: {
minRequiredVersion(3, 1)
}
default: {
glErrorInvalidEnum(target)
}
}
ctx := GetContext()
if !(texture in ctx.Instances.Textures) {
ctx.Instances.Textures[texture] = new!Texture()
}
ctx.TextureUnits[ctx.ActiveTextureUnit][target] = texture
}
@Doc("https://www.khronos.org/opengles/sdk/docs/man/xhtml/glCompressedTexImage2D.xml","OpenGL ES 2.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man3/html/glCompressedTexImage2D.xhtml","OpenGL ES 3.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man31/html/glCompressedTexImage2D.xhtml","OpenGL ES 3.1")
cmd void glCompressedTexImage2D(GLenum target,
GLint level,
GLenum format,
GLsizei width,
GLsizei height,
GLint border,
GLsizei image_size,
TexturePointer data) {
minRequiredVersion(2, 0)
switch (target) {
case GL_TEXTURE_2D, GL_TEXTURE_CUBE_MAP_NEGATIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, GL_TEXTURE_CUBE_MAP_POSITIVE_X,
GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GL_TEXTURE_CUBE_MAP_POSITIVE_Z: {
// version 2.0
}
default: {
glErrorInvalidEnum(target)
}
}
switch (format) {
case GL_COMPRESSED_R11_EAC, GL_COMPRESSED_RG11_EAC, GL_COMPRESSED_RGB8_ETC2,
GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, GL_COMPRESSED_RGBA8_ETC2_EAC,
GL_COMPRESSED_SIGNED_R11_EAC, GL_COMPRESSED_SIGNED_RG11_EAC,
GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, GL_COMPRESSED_SRGB8_ETC2,
GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: {
minRequiredVersion(3, 0)
}
case GL_ATC_RGB_AMD, GL_ATC_RGBA_EXPLICIT_ALPHA_AMD, GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD: {
requiresExtension(GL_AMD_compressed_ATC_texture)
// TODO: Add to other commands as well.
}
default: {
glErrorInvalidEnum(format)
}
}
assert(border == 0)
ctx := GetContext()
switch (target) {
case GL_TEXTURE_2D: {
id := ctx.TextureUnits[ctx.ActiveTextureUnit][GL_TEXTURE_2D]
t := ctx.Instances.Textures[id]
l := Image(
Width: width,
Height: height,
Size: as!u32(image_size),
Format: as!GLenum(format) /* TODO: Implicit cast? */,
)
if (ctx.BoundBuffers[GL_PIXEL_UNPACK_BUFFER] == 0) && (data != null) {
l.Data = clone(as!u8*(data)[0:l.Size])
}
t.Texture2D[level] = l
t.Kind = TEXTURE2D // TODO: Warning/Error if kind has changed?
// TODO: Warning/Error if format has changed
t.Format = as!GLenum(format) // TODO: Implicit cast?
}
case GL_TEXTURE_CUBE_MAP_POSITIVE_X, GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
GL_TEXTURE_CUBE_MAP_NEGATIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: {
id := ctx.TextureUnits[ctx.ActiveTextureUnit][GL_TEXTURE_CUBE_MAP]
t := ctx.Instances.Textures[id]
l := Image(
Width: width,
Height: height,
Size: as!u32(image_size),
Format: as!GLenum(format) /* TODO: Implicit cast? */,
)
if (ctx.BoundBuffers[GL_PIXEL_UNPACK_BUFFER] == 0) && (data != null) {
l.Data = clone(as!u8*(data)[0:l.Size])
}
cube := t.Cubemap[level]
cube.Faces[as!GLenum(target)] = l
t.Cubemap[level] = cube
t.Kind = CUBEMAP // TODO: Warning/Error if kind has changed?
// TODO: Warning/Error if format has changed
t.Format = as!GLenum(format) // TODO: Implicit cast?
}
}
}
@Doc("https://www.khronos.org/opengles/sdk/docs/man3/html/glCompressedTexImage3D.xhtml","OpenGL ES 3.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man31/html/glCompressedTexImage3D.xhtml","OpenGL ES 3.1")
cmd void glCompressedTexImage3D(GLenum target,
GLint level,
GLenum internalformat,
GLsizei width,
GLsizei height,
GLsizei depth,
GLint border,
GLsizei imageSize,
const void* data) {
minRequiredVersion(3, 0)
switch (target) {
case GL_TEXTURE_2D_ARRAY, GL_TEXTURE_3D: {
// version 3.0
}
default: {
glErrorInvalidEnum(target)
}
}
switch (internalformat) {
case GL_COMPRESSED_R11_EAC, GL_COMPRESSED_RG11_EAC, GL_COMPRESSED_RGB8_ETC2,
GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, GL_COMPRESSED_RGBA8_ETC2_EAC,
GL_COMPRESSED_SIGNED_R11_EAC, GL_COMPRESSED_SIGNED_RG11_EAC,
GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, GL_COMPRESSED_SRGB8_ETC2,
GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: {
// version 3.0
}
default: {
glErrorInvalidEnum(internalformat)
}
}
// TODO
}
@Doc("https://www.khronos.org/opengles/sdk/docs/man/xhtml/glCompressedTexSubImage2D.xml","OpenGL ES 2.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man3/html/glCompressedTexSubImage2D.xhtml","OpenGL ES 3.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man31/html/glCompressedTexSubImage2D.xhtml","OpenGL ES 3.1")
cmd void glCompressedTexSubImage2D(GLenum target,
GLint level,
GLint xoffset,
GLint yoffset,
GLsizei width,
GLsizei height,
GLenum format,
GLsizei image_size,
TexturePointer data) {
minRequiredVersion(2, 0)
switch (target) {
case GL_TEXTURE_2D, GL_TEXTURE_CUBE_MAP_NEGATIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, GL_TEXTURE_CUBE_MAP_POSITIVE_X,
GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GL_TEXTURE_CUBE_MAP_POSITIVE_Z: {
// version 2.0
}
default: {
glErrorInvalidEnum(target)
}
}
switch (format) {
case GL_COMPRESSED_R11_EAC, GL_COMPRESSED_RG11_EAC, GL_COMPRESSED_RGB8_ETC2,
GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, GL_COMPRESSED_RGBA8_ETC2_EAC,
GL_COMPRESSED_SIGNED_R11_EAC, GL_COMPRESSED_SIGNED_RG11_EAC,
GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, GL_COMPRESSED_SRGB8_ETC2,
GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: {
minRequiredVersion(3, 0)
}
default: {
glErrorInvalidEnum(format)
}
}
}
@Doc("https://www.khronos.org/opengles/sdk/docs/man3/html/glCompressedTexSubImage3D.xhtml","OpenGL ES 3.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man31/html/glCompressedTexSubImage3D.xhtml","OpenGL ES 3.1")
cmd void glCompressedTexSubImage3D(GLenum target,
GLint level,
GLint xoffset,
GLint yoffset,
GLint zoffset,
GLsizei width,
GLsizei height,
GLsizei depth,
GLenum format,
GLsizei imageSize,
const void* data) {
minRequiredVersion(3, 0)
switch (target) {
case GL_TEXTURE_2D_ARRAY, GL_TEXTURE_3D: {
// version 3.0
}
default: {
glErrorInvalidEnum(target)
}
}
switch (format) {
case GL_COMPRESSED_R11_EAC, GL_COMPRESSED_RG11_EAC, GL_COMPRESSED_RGB8_ETC2,
GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, GL_COMPRESSED_RGBA8_ETC2_EAC,
GL_COMPRESSED_SIGNED_R11_EAC, GL_COMPRESSED_SIGNED_RG11_EAC,
GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, GL_COMPRESSED_SRGB8_ETC2,
GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: {
// version 3.0
}
default: {
glErrorInvalidEnum(format)
}
}
// TODO
}
@Doc("https://www.khronos.org/opengles/sdk/docs/man/xhtml/glCopyTexImage2D.xml","OpenGL ES 2.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man3/html/glCopyTexImage2D.xhtml","OpenGL ES 3.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man31/html/glCopyTexImage2D.xhtml","OpenGL ES 3.1")
cmd void glCopyTexImage2D(GLenum target,
GLint level,
GLenum format,
GLint x,
GLint y,
GLsizei width,
GLsizei height,
GLint border) {
minRequiredVersion(2, 0)
switch (target) {
case GL_TEXTURE_2D, GL_TEXTURE_CUBE_MAP_NEGATIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, GL_TEXTURE_CUBE_MAP_POSITIVE_X,
GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GL_TEXTURE_CUBE_MAP_POSITIVE_Z: {
// version 2.0
}
default: {
glErrorInvalidEnum(target)
}
}
switch (format) {
case GL_ALPHA, GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_RGB, GL_RGBA: {
// version 2.0
}
case GL_R16I, GL_R16UI, GL_R32I, GL_R32UI, GL_R8, GL_R8I, GL_R8UI, GL_RG16I, GL_RG16UI,
GL_RG32I, GL_RG32UI, GL_RG8, GL_RG8I, GL_RG8UI, GL_RGB10_A2, GL_RGB10_A2UI, GL_RGB565,
GL_RGB5_A1, GL_RGB8, GL_RGBA16I, GL_RGBA16UI, GL_RGBA32I, GL_RGBA32UI, GL_RGBA4, GL_RGBA8,
GL_RGBA8I, GL_RGBA8UI, GL_SRGB8, GL_SRGB8_ALPHA8: {
minRequiredVersion(3, 0)
}
default: {
glErrorInvalidEnum(format)
}
}
}
@Doc("https://www.khronos.org/opengles/sdk/docs/man/xhtml/glCopyTexSubImage2D.xml","OpenGL ES 2.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man3/html/glCopyTexSubImage2D.xhtml","OpenGL ES 3.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man31/html/glCopyTexSubImage2D.xhtml","OpenGL ES 3.1")
cmd void glCopyTexSubImage2D(GLenum target,
GLint level,
GLint xoffset,
GLint yoffset,
GLint x,
GLint y,
GLsizei width,
GLsizei height) {
minRequiredVersion(2, 0)
switch (target) {
case GL_TEXTURE_2D, GL_TEXTURE_CUBE_MAP_NEGATIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, GL_TEXTURE_CUBE_MAP_POSITIVE_X,
GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GL_TEXTURE_CUBE_MAP_POSITIVE_Z: {
// version 2.0
}
default: {
glErrorInvalidEnum(target)
}
}
}
@Doc("https://www.khronos.org/opengles/sdk/docs/man3/html/glCopyTexSubImage3D.xhtml","OpenGL ES 3.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man31/html/glCopyTexSubImage3D.xhtml","OpenGL ES 3.1")
cmd void glCopyTexSubImage3D(GLenum target,
GLint level,
GLint xoffset,
GLint yoffset,
GLint zoffset,
GLint x,
GLint y,
GLsizei width,
GLsizei height) {
minRequiredVersion(3, 0)
switch (target) {
case GL_TEXTURE_2D_ARRAY, GL_TEXTURE_3D: {
// version 3.0
}
default: {
glErrorInvalidEnum(target)
}
}
// TODO
}
@Doc("https://www.khronos.org/opengles/sdk/docs/man3/html/glDeleteSamplers.xhtml","OpenGL ES 3.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man31/html/glDeleteSamplers.xhtml","OpenGL ES 3.1")
cmd void glDeleteSamplers(GLsizei count, const SamplerId* samplers) {
minRequiredVersion(3, 0)
// TODO
}
@Doc("https://www.khronos.org/opengles/sdk/docs/man/xhtml/glDeleteTextures.xml","OpenGL ES 2.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man3/html/glDeleteTextures.xhtml","OpenGL ES 3.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man31/html/glDeleteTextures.xhtml","OpenGL ES 3.1")
cmd void glDeleteTextures(GLsizei count, const TextureId* textures) {
minRequiredVersion(2, 0)
t := textures[0:count]
ctx := GetContext()
for i in (0 .. count) {
ctx.Instances.Textures[t[i]] = null
}
}
@Doc("https://www.khronos.org/opengles/sdk/docs/man3/html/glGenSamplers.xhtml","OpenGL ES 3.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man31/html/glGenSamplers.xhtml","OpenGL ES 3.1")
cmd void glGenSamplers(GLsizei count, SamplerId* samplers) {
minRequiredVersion(3, 0)
// TODO
}
@Doc("https://www.khronos.org/opengles/sdk/docs/man/xhtml/glGenTextures.xml","OpenGL ES 2.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man3/html/glGenTextures.xhtml","OpenGL ES 3.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man31/html/glGenTextures.xhtml","OpenGL ES 3.1")
cmd void glGenTextures(GLsizei count, TextureId* textures) {
minRequiredVersion(2, 0)
t := textures[0:count]
ctx := GetContext()
for i in (0 .. count) {
id := as!TextureId(?)
ctx.Instances.Textures[id] = new!Texture()
t[i] = id
}
}
@Doc("https://www.khronos.org/opengles/sdk/docs/man/xhtml/glGenerateMipmap.xml","OpenGL ES 2.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man3/html/glGenerateMipmap.xhtml","OpenGL ES 3.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man31/html/glGenerateMipmap.xhtml","OpenGL ES 3.1")
cmd void glGenerateMipmap(GLenum target) {
minRequiredVersion(2, 0)
switch (target) {
case GL_TEXTURE_2D, GL_TEXTURE_CUBE_MAP: {
// version 2.0
}
case GL_TEXTURE_2D_ARRAY, GL_TEXTURE_3D: {
minRequiredVersion(3, 0)
}
default: {
glErrorInvalidEnum(target)
}
}
}
@Doc("https://www.khronos.org/opengles/sdk/docs/man3/html/glGetSamplerParameter.xhtml","OpenGL ES 3.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man31/html/glGetSamplerParameter.xhtml","OpenGL ES 3.1")
cmd void glGetSamplerParameterfv(SamplerId sampler, GLenum pname, GLfloat* params) {
minRequiredVersion(3, 0)
switch (pname) {
case GL_TEXTURE_COMPARE_FUNC, GL_TEXTURE_COMPARE_MODE, GL_TEXTURE_MAG_FILTER,
GL_TEXTURE_MAX_LOD, GL_TEXTURE_MIN_FILTER, GL_TEXTURE_MIN_LOD, GL_TEXTURE_WRAP_R,
GL_TEXTURE_WRAP_S, GL_TEXTURE_WRAP_T: {
// version 3.0
}
default: {
glErrorInvalidEnum(pname)
}
}
// TODO
}
@Doc("https://www.khronos.org/opengles/sdk/docs/man3/html/glGetSamplerParameter.xhtml","OpenGL ES 3.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man31/html/glGetSamplerParameter.xhtml","OpenGL ES 3.1")
cmd void glGetSamplerParameteriv(SamplerId sampler, GLenum pname, GLint* params) {
minRequiredVersion(3, 0)
switch (pname) {
case GL_TEXTURE_COMPARE_FUNC, GL_TEXTURE_COMPARE_MODE, GL_TEXTURE_MAG_FILTER,
GL_TEXTURE_MAX_LOD, GL_TEXTURE_MIN_FILTER, GL_TEXTURE_MIN_LOD, GL_TEXTURE_WRAP_R,
GL_TEXTURE_WRAP_S, GL_TEXTURE_WRAP_T: {
// version 3.0
}
default: {
glErrorInvalidEnum(pname)
}
}
// TODO
}
@Doc("https://www.khronos.org/opengles/sdk/docs/man31/html/glGetTexLevelParameter.xhtml","OpenGL ES 3.1")
cmd void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat* params) {
minRequiredVersion(3, 1)
switch (target) {
case GL_TEXTURE_2D, GL_TEXTURE_2D_ARRAY, GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_3D,
GL_TEXTURE_CUBE_MAP_NEGATIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, GL_TEXTURE_CUBE_MAP_POSITIVE_X,
GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GL_TEXTURE_CUBE_MAP_POSITIVE_Z: {
// version 3.1
}
default: {
glErrorInvalidEnum(target)
}
}
switch (pname) {
case GL_TEXTURE_ALPHA_SIZE, GL_TEXTURE_ALPHA_TYPE, GL_TEXTURE_BLUE_SIZE, GL_TEXTURE_BLUE_TYPE,
GL_TEXTURE_COMPRESSED, GL_TEXTURE_DEPTH, GL_TEXTURE_DEPTH_SIZE, GL_TEXTURE_DEPTH_TYPE,
GL_TEXTURE_FIXED_SAMPLE_LOCATIONS, GL_TEXTURE_GREEN_SIZE, GL_TEXTURE_GREEN_TYPE,
GL_TEXTURE_HEIGHT, GL_TEXTURE_INTERNAL_FORMAT, GL_TEXTURE_RED_SIZE, GL_TEXTURE_RED_TYPE,
GL_TEXTURE_SAMPLES, GL_TEXTURE_SHARED_SIZE, GL_TEXTURE_STENCIL_SIZE, GL_TEXTURE_WIDTH: {
// version 3.1
}
default: {
glErrorInvalidEnum(pname)
}
}
// TODO
}
@Doc("https://www.khronos.org/opengles/sdk/docs/man31/html/glGetTexLevelParameter.xhtml","OpenGL ES 3.1")
cmd void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint* params) {
minRequiredVersion(3, 1)
switch (target) {
case GL_TEXTURE_2D, GL_TEXTURE_2D_ARRAY, GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_3D,
GL_TEXTURE_CUBE_MAP_NEGATIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, GL_TEXTURE_CUBE_MAP_POSITIVE_X,
GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GL_TEXTURE_CUBE_MAP_POSITIVE_Z: {
// version 3.1
}
default: {
glErrorInvalidEnum(target)
}
}
switch (pname) {
case GL_TEXTURE_ALPHA_SIZE, GL_TEXTURE_ALPHA_TYPE, GL_TEXTURE_BLUE_SIZE, GL_TEXTURE_BLUE_TYPE,
GL_TEXTURE_COMPRESSED, GL_TEXTURE_DEPTH, GL_TEXTURE_DEPTH_SIZE, GL_TEXTURE_DEPTH_TYPE,
GL_TEXTURE_FIXED_SAMPLE_LOCATIONS, GL_TEXTURE_GREEN_SIZE, GL_TEXTURE_GREEN_TYPE,
GL_TEXTURE_HEIGHT, GL_TEXTURE_INTERNAL_FORMAT, GL_TEXTURE_RED_SIZE, GL_TEXTURE_RED_TYPE,
GL_TEXTURE_SAMPLES, GL_TEXTURE_SHARED_SIZE, GL_TEXTURE_STENCIL_SIZE, GL_TEXTURE_WIDTH: {
// version 3.1
}
default: {
glErrorInvalidEnum(pname)
}
}
// TODO
}
@Doc("https://www.khronos.org/opengles/sdk/docs/man/xhtml/glGetTexParameter.xml","OpenGL ES 2.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man3/html/glGetTexParameter.xhtml","OpenGL ES 3.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man31/html/glGetTexParameter.xhtml","OpenGL ES 3.1")
cmd void glGetTexParameterfv(GLenum target, GLenum parameter, GLfloat* values) {
minRequiredVersion(2, 0)
switch (target) {
case GL_TEXTURE_2D, GL_TEXTURE_CUBE_MAP: {
// version 2.0
}
case GL_TEXTURE_2D_ARRAY, GL_TEXTURE_3D: {
minRequiredVersion(3, 0)
}
case GL_TEXTURE_2D_MULTISAMPLE: {
minRequiredVersion(3, 1)
}
default: {
glErrorInvalidEnum(target)
}
}
switch (parameter) {
case GL_TEXTURE_MAG_FILTER, GL_TEXTURE_MIN_FILTER, GL_TEXTURE_WRAP_S, GL_TEXTURE_WRAP_T: {
// version 2.0
}
case GL_TEXTURE_BASE_LEVEL, GL_TEXTURE_COMPARE_FUNC, GL_TEXTURE_COMPARE_MODE,
GL_TEXTURE_IMMUTABLE_FORMAT, GL_TEXTURE_MAX_LEVEL, GL_TEXTURE_MAX_LOD, GL_TEXTURE_MIN_LOD,
GL_TEXTURE_SWIZZLE_A, GL_TEXTURE_SWIZZLE_B, GL_TEXTURE_SWIZZLE_G, GL_TEXTURE_SWIZZLE_R,
GL_TEXTURE_WRAP_R: {
minRequiredVersion(3, 0)
}
case GL_DEPTH_STENCIL_TEXTURE_MODE, GL_IMAGE_FORMAT_COMPATIBILITY_TYPE,
GL_TEXTURE_IMMUTABLE_LEVELS: {
minRequiredVersion(3, 1)
}
default: {
glErrorInvalidEnum(parameter)
}
}
ctx := GetContext()
id := ctx.TextureUnits[ctx.ActiveTextureUnit][target]
t := ctx.Instances.Textures[id]
values[0] = switch (parameter) {
case GL_TEXTURE_MAG_FILTER: as!GLfloat(t.MagFilter)
case GL_TEXTURE_MIN_FILTER: as!GLfloat(t.MinFilter)
case GL_TEXTURE_WRAP_S: as!GLfloat(t.WrapS)
case GL_TEXTURE_WRAP_T: as!GLfloat(t.WrapT)
case GL_TEXTURE_MAX_ANISOTROPY_EXT: as!GLfloat(t.MaxAnisotropy)
case GL_TEXTURE_SWIZZLE_R: as!GLfloat(t.SwizzleR)
case GL_TEXTURE_SWIZZLE_G: as!GLfloat(t.SwizzleG)
case GL_TEXTURE_SWIZZLE_B: as!GLfloat(t.SwizzleB)
case GL_TEXTURE_SWIZZLE_A: as!GLfloat(t.SwizzleA)
}
}
@Doc("https://www.khronos.org/opengles/sdk/docs/man/xhtml/glGetTexParameter.xml","OpenGL ES 2.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man3/html/glGetTexParameter.xhtml","OpenGL ES 3.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man31/html/glGetTexParameter.xhtml","OpenGL ES 3.1")
cmd void glGetTexParameteriv(GLenum target, GLenum parameter, GLint* values) {
minRequiredVersion(2, 0)
switch (target) {
case GL_TEXTURE_2D, GL_TEXTURE_CUBE_MAP: {
// version 2.0
}
case GL_TEXTURE_2D_ARRAY, GL_TEXTURE_3D: {
minRequiredVersion(3, 0)
}
case GL_TEXTURE_2D_MULTISAMPLE: {
minRequiredVersion(3, 1)
}
default: {
glErrorInvalidEnum(target)
}
}
switch (parameter) {
case GL_TEXTURE_MAG_FILTER, GL_TEXTURE_MIN_FILTER, GL_TEXTURE_WRAP_S, GL_TEXTURE_WRAP_T: {
// version 2.0
}
case GL_TEXTURE_BASE_LEVEL, GL_TEXTURE_COMPARE_FUNC, GL_TEXTURE_COMPARE_MODE,
GL_TEXTURE_IMMUTABLE_FORMAT, GL_TEXTURE_MAX_LEVEL, GL_TEXTURE_MAX_LOD, GL_TEXTURE_MIN_LOD,
GL_TEXTURE_SWIZZLE_A, GL_TEXTURE_SWIZZLE_B, GL_TEXTURE_SWIZZLE_G, GL_TEXTURE_SWIZZLE_R,
GL_TEXTURE_WRAP_R: {
minRequiredVersion(3, 0)
}
case GL_DEPTH_STENCIL_TEXTURE_MODE, GL_IMAGE_FORMAT_COMPATIBILITY_TYPE,
GL_TEXTURE_IMMUTABLE_LEVELS: {
minRequiredVersion(3, 1)
}
default: {
glErrorInvalidEnum(parameter)
}
}
ctx := GetContext()
id := ctx.TextureUnits[ctx.ActiveTextureUnit][target]
t := ctx.Instances.Textures[id]
values[0] = switch (parameter) {
case GL_TEXTURE_MAG_FILTER: as!GLint(t.MagFilter)
case GL_TEXTURE_MIN_FILTER: as!GLint(t.MinFilter)
case GL_TEXTURE_WRAP_S: as!GLint(t.WrapS)
case GL_TEXTURE_WRAP_T: as!GLint(t.WrapT)
case GL_TEXTURE_MAX_ANISOTROPY_EXT: as!GLint(t.MaxAnisotropy)
case GL_TEXTURE_SWIZZLE_R: as!GLint(t.SwizzleR)
case GL_TEXTURE_SWIZZLE_G: as!GLint(t.SwizzleG)
case GL_TEXTURE_SWIZZLE_B: as!GLint(t.SwizzleB)
case GL_TEXTURE_SWIZZLE_A: as!GLint(t.SwizzleA)
}
}
@Doc("https://www.khronos.org/opengles/sdk/docs/man3/html/glIsSampler.xhtml","OpenGL ES 3.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man31/html/glIsSampler.xhtml","OpenGL ES 3.1")
cmd bool glIsSampler(SamplerId sampler) {
minRequiredVersion(3, 0)
// TODO
return ?
}
@Doc("https://www.khronos.org/opengles/sdk/docs/man/xhtml/glIsTexture.xml","OpenGL ES 2.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man3/html/glIsTexture.xhtml","OpenGL ES 3.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man31/html/glIsTexture.xhtml","OpenGL ES 3.1")
cmd bool glIsTexture(TextureId texture) {
minRequiredVersion(2, 0)
ctx := GetContext()
return texture in ctx.Instances.Textures
}
@Doc("https://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml","OpenGL ES 2.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man3/html/glPixelStorei.xhtml","OpenGL ES 3.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man31/html/glPixelStorei.xhtml","OpenGL ES 3.1")
cmd void glPixelStorei(GLenum parameter, GLint value) {
minRequiredVersion(2, 0)
switch (parameter) {
case GL_PACK_ALIGNMENT, GL_UNPACK_ALIGNMENT: {
// version 2.0
}
case GL_PACK_IMAGE_HEIGHT, GL_PACK_ROW_LENGTH, GL_PACK_SKIP_IMAGES, GL_PACK_SKIP_PIXELS,
GL_PACK_SKIP_ROWS, GL_UNPACK_IMAGE_HEIGHT, GL_UNPACK_ROW_LENGTH, GL_UNPACK_SKIP_IMAGES,
GL_UNPACK_SKIP_PIXELS, GL_UNPACK_SKIP_ROWS: {
minRequiredVersion(3, 0)
}
default: {
glErrorInvalidEnum(parameter)
}
}
assert((value == 1) || (value == 2) || (value == 4) || (value == 8))
ctx := GetContext()
ctx.PixelStorage[parameter] = value
}
@Doc("https://www.khronos.org/opengles/sdk/docs/man3/html/glSamplerParameter.xhtml","OpenGL ES 3.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man31/html/glSamplerParameter.xhtml","OpenGL ES 3.1")
cmd void glSamplerParameterf(SamplerId sampler, GLenum pname, GLfloat param) {
minRequiredVersion(3, 0)
switch (pname) {
case GL_TEXTURE_COMPARE_FUNC, GL_TEXTURE_COMPARE_MODE, GL_TEXTURE_MAG_FILTER,
GL_TEXTURE_MAX_LOD, GL_TEXTURE_MIN_FILTER, GL_TEXTURE_MIN_LOD, GL_TEXTURE_WRAP_R,
GL_TEXTURE_WRAP_S, GL_TEXTURE_WRAP_T: {
// version 3.0
}
default: {
glErrorInvalidEnum(pname)
}
}
// TODO
}
@Doc("https://www.khronos.org/opengles/sdk/docs/man3/html/glSamplerParameter.xhtml","OpenGL ES 3.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man31/html/glSamplerParameter.xhtml","OpenGL ES 3.1")
cmd void glSamplerParameterfv(SamplerId sampler, GLenum pname, const GLfloat* param) {
minRequiredVersion(3, 0)
switch (pname) {
case GL_TEXTURE_COMPARE_FUNC, GL_TEXTURE_COMPARE_MODE, GL_TEXTURE_MAG_FILTER,
GL_TEXTURE_MAX_LOD, GL_TEXTURE_MIN_FILTER, GL_TEXTURE_MIN_LOD, GL_TEXTURE_WRAP_R,
GL_TEXTURE_WRAP_S, GL_TEXTURE_WRAP_T: {
// version 3.0
}
default: {
glErrorInvalidEnum(pname)
}
}
// TODO
}
@Doc("https://www.khronos.org/opengles/sdk/docs/man3/html/glSamplerParameter.xhtml","OpenGL ES 3.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man31/html/glSamplerParameter.xhtml","OpenGL ES 3.1")
cmd void glSamplerParameteri(SamplerId sampler, GLenum pname, GLint param) {
minRequiredVersion(3, 0)
switch (pname) {
case GL_TEXTURE_COMPARE_FUNC, GL_TEXTURE_COMPARE_MODE, GL_TEXTURE_MAG_FILTER,
GL_TEXTURE_MAX_LOD, GL_TEXTURE_MIN_FILTER, GL_TEXTURE_MIN_LOD, GL_TEXTURE_WRAP_R,
GL_TEXTURE_WRAP_S, GL_TEXTURE_WRAP_T: {
// version 3.0
}
default: {
glErrorInvalidEnum(pname)
}
}
// TODO
}
@Doc("https://www.khronos.org/opengles/sdk/docs/man3/html/glSamplerParameter.xhtml","OpenGL ES 3.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man31/html/glSamplerParameter.xhtml","OpenGL ES 3.1")
cmd void glSamplerParameteriv(SamplerId sampler, GLenum pname, const GLint* param) {
minRequiredVersion(3, 0)
switch (pname) {
case GL_TEXTURE_COMPARE_FUNC, GL_TEXTURE_COMPARE_MODE, GL_TEXTURE_MAG_FILTER,
GL_TEXTURE_MAX_LOD, GL_TEXTURE_MIN_FILTER, GL_TEXTURE_MIN_LOD, GL_TEXTURE_WRAP_R,
GL_TEXTURE_WRAP_S, GL_TEXTURE_WRAP_T: {
// version 3.0
}
default: {
glErrorInvalidEnum(pname)
}
}
// TODO
}
@Doc("https://www.khronos.org/opengles/sdk/docs/man/xhtml/glTexImage2D.xml","OpenGL ES 2.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man3/html/glTexImage2D.xhtml","OpenGL ES 3.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man31/html/glTexImage2D.xhtml","OpenGL ES 3.1")
cmd void glTexImage2D(GLenum target,
GLint level,
GLint internal_format,
GLsizei width,
GLsizei height,
GLint border,
GLenum format,
GLenum type,
TexturePointer data) {
minRequiredVersion(2, 0)
switch (target) {
case GL_TEXTURE_2D, GL_TEXTURE_CUBE_MAP_NEGATIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, GL_TEXTURE_CUBE_MAP_POSITIVE_X,
GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GL_TEXTURE_CUBE_MAP_POSITIVE_Z: {
// version 2.0
}
default: {
glErrorInvalidEnum(target)
}
}
switch (format) {
case GL_ALPHA, GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_RGB, GL_RGBA: {
// version 2.0
}
case GL_DEPTH_COMPONENT, GL_DEPTH_STENCIL, GL_RED, GL_RED_INTEGER, GL_RG, GL_RGBA_INTEGER,
GL_RGB_INTEGER, GL_RG_INTEGER: {
minRequiredVersion(3, 0)
}
default: {
glErrorInvalidEnum(format)
}
}
switch (type) {
case GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT_4_4_4_4, GL_UNSIGNED_SHORT_5_5_5_1,
GL_UNSIGNED_SHORT_5_6_5: {
// version 2.0
}
case GL_HALF_FLOAT_OES: {
requiresExtension(GL_OES_texture_half_float)
}
case GL_BYTE, GL_FLOAT, GL_FLOAT_32_UNSIGNED_INT_24_8_REV, GL_HALF_FLOAT, GL_INT, GL_SHORT,
GL_UNSIGNED_INT, GL_UNSIGNED_INT_10F_11F_11F_REV, GL_UNSIGNED_INT_24_8,
GL_UNSIGNED_INT_2_10_10_10_REV, GL_UNSIGNED_INT_5_9_9_9_REV, GL_UNSIGNED_SHORT: {
minRequiredVersion(3, 0)
}
default: {
glErrorInvalidEnum(type)
}
}
assert(internal_format == as!GLint(format))
assert(border == 0)
ctx := GetContext()
switch (target) {
case GL_TEXTURE_2D: {
id := ctx.TextureUnits[ctx.ActiveTextureUnit][GL_TEXTURE_2D]
t := ctx.Instances.Textures[id]
l := Image(
Width: width,
Height: height,
Size: imageSize(as!u32(width), as!u32(height), format, type),
Format: as!GLenum(format) /* TODO: Implicit cast? */,
)
if (data != null) {
if (ctx.BoundBuffers[GL_PIXEL_UNPACK_BUFFER] == 0) {
l.Data = clone(as!u8*(data)[0:l.Size])
}
} else {
l.Data = make!u8(l.Size)
}
t.Texture2D[level] = l
t.Kind = TEXTURE2D // TODO: Warning/Error if kind has changed?
// TODO: Warning/Error if format has changed
t.Format = as!GLenum(format) // TODO: Implicit cast?
}
case GL_TEXTURE_CUBE_MAP_POSITIVE_X, GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
GL_TEXTURE_CUBE_MAP_NEGATIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: {
id := ctx.TextureUnits[ctx.ActiveTextureUnit][GL_TEXTURE_CUBE_MAP]
t := ctx.Instances.Textures[id]
l := Image(
Width: width,
Height: height,
Size: imageSize(as!u32(width), as!u32(height), format, type),
Format: as!GLenum(format) /* TODO: Implicit cast? */,
)
if (data != null) {
if (ctx.BoundBuffers[GL_PIXEL_UNPACK_BUFFER] == 0) {
l.Data = clone(as!u8*(data)[0:l.Size])
}
} else {
l.Data = make!u8(l.Size)
}
cube := t.Cubemap[level]
cube.Faces[as!GLenum(target)] = l
t.Cubemap[level] = cube
t.Kind = CUBEMAP // TODO: Warning/Error if kind has changed?
// TODO: Warning/Error if format has changed
t.Format = as!GLenum(format) // TODO: Implicit cast?
}
}
}
@Doc("https://www.khronos.org/opengles/sdk/docs/man3/html/glTexImage3D.xhtml","OpenGL ES 3.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man31/html/glTexImage3D.xhtml","OpenGL ES 3.1")
cmd void glTexImage3D(GLenum target,
GLint level,
GLint internalformat,
GLsizei width,
GLsizei height,
GLsizei depth,
GLint border,
GLenum format,
GLenum type,
const void* pixels) {
minRequiredVersion(3, 0)
switch (target) {
case GL_TEXTURE_2D_ARRAY, GL_TEXTURE_3D: {
// version 3.0
}
default: {
glErrorInvalidEnum(target)
}
}
switch (format) {
case GL_ALPHA, GL_DEPTH_COMPONENT, GL_DEPTH_STENCIL, GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_RED,
GL_RED_INTEGER, GL_RG, GL_RGB, GL_RGBA, GL_RGBA_INTEGER, GL_RGB_INTEGER, GL_RG_INTEGER: {
// version 3.0
}
default: {
glErrorInvalidEnum(format)
}
}
switch (type) {
case GL_HALF_FLOAT_OES: {
requiresExtension(GL_OES_texture_half_float)
}
case GL_BYTE, GL_FLOAT, GL_FLOAT_32_UNSIGNED_INT_24_8_REV, GL_HALF_FLOAT, GL_INT, GL_SHORT,
GL_UNSIGNED_BYTE, GL_UNSIGNED_INT, GL_UNSIGNED_INT_10F_11F_11F_REV, GL_UNSIGNED_INT_24_8,
GL_UNSIGNED_INT_2_10_10_10_REV, GL_UNSIGNED_INT_5_9_9_9_REV, GL_UNSIGNED_SHORT,
GL_UNSIGNED_SHORT_4_4_4_4, GL_UNSIGNED_SHORT_5_5_5_1, GL_UNSIGNED_SHORT_5_6_5: {
// version 3.0
}
default: {
glErrorInvalidEnum(type)
}
}
// TODO
}
@Doc("https://www.khronos.org/opengles/sdk/docs/man/xhtml/glTexParameter.xml","OpenGL ES 2.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man3/html/glTexParameter.xhtml","OpenGL ES 3.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man31/html/glTexParameter.xhtml","OpenGL ES 3.1")
cmd void glTexParameterf(GLenum target, GLenum parameter, GLfloat value) {
minRequiredVersion(2, 0)
switch (target) {
case GL_TEXTURE_2D, GL_TEXTURE_CUBE_MAP: {
// version 2.0
}
case GL_TEXTURE_2D_ARRAY, GL_TEXTURE_3D: {
minRequiredVersion(3, 0)
}
case GL_TEXTURE_2D_MULTISAMPLE: {
minRequiredVersion(3, 1)
}
default: {
glErrorInvalidEnum(target)
}
}
switch (parameter) {
case GL_TEXTURE_MAG_FILTER, GL_TEXTURE_MIN_FILTER, GL_TEXTURE_WRAP_S, GL_TEXTURE_WRAP_T: {
// version 2.0
}
case GL_TEXTURE_BASE_LEVEL, GL_TEXTURE_COMPARE_FUNC, GL_TEXTURE_COMPARE_MODE,
GL_TEXTURE_MAX_LEVEL, GL_TEXTURE_MAX_LOD, GL_TEXTURE_MIN_LOD, GL_TEXTURE_SWIZZLE_A,
GL_TEXTURE_SWIZZLE_B, GL_TEXTURE_SWIZZLE_G, GL_TEXTURE_SWIZZLE_R, GL_TEXTURE_WRAP_R: {
minRequiredVersion(3, 0)
}
case GL_DEPTH_STENCIL_TEXTURE_MODE: {
minRequiredVersion(3, 1)
}
default: {
glErrorInvalidEnum(parameter)
}
}
ctx := GetContext()
id := ctx.TextureUnits[ctx.ActiveTextureUnit][target]
t := ctx.Instances.Textures[id]
switch (parameter) {
case GL_TEXTURE_MAG_FILTER: t.MagFilter = as!GLenum(value)
case GL_TEXTURE_MIN_FILTER: t.MinFilter = as!GLenum(value)
case GL_TEXTURE_WRAP_S: t.WrapS = as!GLenum(value)
case GL_TEXTURE_WRAP_T: t.WrapT = as!GLenum(value)
case GL_TEXTURE_MAX_ANISOTROPY_EXT: t.MaxAnisotropy = as!f32(value)
case GL_TEXTURE_SWIZZLE_R: t.SwizzleR = as!GLenum(value)
case GL_TEXTURE_SWIZZLE_G: t.SwizzleG = as!GLenum(value)
case GL_TEXTURE_SWIZZLE_B: t.SwizzleB = as!GLenum(value)
case GL_TEXTURE_SWIZZLE_A: t.SwizzleA = as!GLenum(value)
}
}
@Doc("https://www.khronos.org/opengles/sdk/docs/man/xhtml/glTexParameter.xml","OpenGL ES 2.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man3/html/glTexParameter.xhtml","OpenGL ES 3.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man31/html/glTexParameter.xhtml","OpenGL ES 3.1")
cmd void glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params) {
minRequiredVersion(2, 0)
switch (target) {
case GL_TEXTURE_2D, GL_TEXTURE_CUBE_MAP: {
// version 2.0
}
case GL_TEXTURE_2D_ARRAY, GL_TEXTURE_3D: {
minRequiredVersion(3, 0)
}
case GL_TEXTURE_2D_MULTISAMPLE: {
minRequiredVersion(3, 1)
}
default: {
glErrorInvalidEnum(target)
}
}
switch (pname) {
case GL_TEXTURE_MAG_FILTER, GL_TEXTURE_MIN_FILTER, GL_TEXTURE_WRAP_S, GL_TEXTURE_WRAP_T: {
// version 2.0
}
case GL_TEXTURE_BASE_LEVEL, GL_TEXTURE_COMPARE_FUNC, GL_TEXTURE_COMPARE_MODE,
GL_TEXTURE_MAX_LEVEL, GL_TEXTURE_MAX_LOD, GL_TEXTURE_MIN_LOD, GL_TEXTURE_SWIZZLE_A,
GL_TEXTURE_SWIZZLE_B, GL_TEXTURE_SWIZZLE_G, GL_TEXTURE_SWIZZLE_R, GL_TEXTURE_WRAP_R: {
minRequiredVersion(3, 0)
}
case GL_DEPTH_STENCIL_TEXTURE_MODE: {
minRequiredVersion(3, 1)
}
default: {
glErrorInvalidEnum(pname)
}
}
// TODO
}
@Doc("https://www.khronos.org/opengles/sdk/docs/man/xhtml/glTexParameter.xml","OpenGL ES 2.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man3/html/glTexParameter.xhtml","OpenGL ES 3.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man31/html/glTexParameter.xhtml","OpenGL ES 3.1")
cmd void glTexParameteri(GLenum target, GLenum parameter, GLint value) {
minRequiredVersion(2, 0)
switch (target) {
case GL_TEXTURE_2D, GL_TEXTURE_CUBE_MAP: {
// version 2.0
}
case GL_TEXTURE_2D_ARRAY, GL_TEXTURE_3D: {
minRequiredVersion(3, 0)
}
case GL_TEXTURE_2D_MULTISAMPLE: {
minRequiredVersion(3, 1)
}
default: {
glErrorInvalidEnum(target)
}
}
switch (parameter) {
case GL_TEXTURE_MAG_FILTER, GL_TEXTURE_MIN_FILTER, GL_TEXTURE_WRAP_S, GL_TEXTURE_WRAP_T: {
// version 2.0
}
case GL_TEXTURE_BASE_LEVEL, GL_TEXTURE_COMPARE_FUNC, GL_TEXTURE_COMPARE_MODE,
GL_TEXTURE_MAX_LEVEL, GL_TEXTURE_MAX_LOD, GL_TEXTURE_MIN_LOD, GL_TEXTURE_SWIZZLE_A,
GL_TEXTURE_SWIZZLE_B, GL_TEXTURE_SWIZZLE_G, GL_TEXTURE_SWIZZLE_R, GL_TEXTURE_WRAP_R: {
minRequiredVersion(3, 0)
}
case GL_DEPTH_STENCIL_TEXTURE_MODE: {
minRequiredVersion(3, 1)
}
default: {
glErrorInvalidEnum(parameter)
}
}
ctx := GetContext()
id := ctx.TextureUnits[ctx.ActiveTextureUnit][target]
t := ctx.Instances.Textures[id]
switch (parameter) {
case GL_TEXTURE_MAG_FILTER: t.MagFilter = as!GLenum(value)
case GL_TEXTURE_MIN_FILTER: t.MinFilter = as!GLenum(value)
case GL_TEXTURE_WRAP_S: t.WrapS = as!GLenum(value)
case GL_TEXTURE_WRAP_T: t.WrapT = as!GLenum(value)
case GL_TEXTURE_MAX_ANISOTROPY_EXT: t.MaxAnisotropy = as!f32(value)
case GL_TEXTURE_SWIZZLE_R: t.SwizzleR = as!GLenum(value)
case GL_TEXTURE_SWIZZLE_G: t.SwizzleG = as!GLenum(value)
case GL_TEXTURE_SWIZZLE_B: t.SwizzleB = as!GLenum(value)
case GL_TEXTURE_SWIZZLE_A: t.SwizzleA = as!GLenum(value)
}
}
@Doc("https://www.khronos.org/opengles/sdk/docs/man/xhtml/glTexParameter.xml","OpenGL ES 2.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man3/html/glTexParameter.xhtml","OpenGL ES 3.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man31/html/glTexParameter.xhtml","OpenGL ES 3.1")
cmd void glTexParameteriv(GLenum target, GLenum pname, const GLint* params) {
minRequiredVersion(2, 0)
switch (target) {
case GL_TEXTURE_2D, GL_TEXTURE_CUBE_MAP: {
// version 2.0
}
case GL_TEXTURE_2D_ARRAY, GL_TEXTURE_3D: {
minRequiredVersion(3, 0)
}
case GL_TEXTURE_2D_MULTISAMPLE: {
minRequiredVersion(3, 1)
}
default: {
glErrorInvalidEnum(target)
}
}
switch (pname) {
case GL_TEXTURE_MAG_FILTER, GL_TEXTURE_MIN_FILTER, GL_TEXTURE_WRAP_S, GL_TEXTURE_WRAP_T: {
// version 2.0
}
case GL_TEXTURE_BASE_LEVEL, GL_TEXTURE_COMPARE_FUNC, GL_TEXTURE_COMPARE_MODE,
GL_TEXTURE_MAX_LEVEL, GL_TEXTURE_MAX_LOD, GL_TEXTURE_MIN_LOD, GL_TEXTURE_SWIZZLE_A,
GL_TEXTURE_SWIZZLE_B, GL_TEXTURE_SWIZZLE_G, GL_TEXTURE_SWIZZLE_R, GL_TEXTURE_WRAP_R: {
minRequiredVersion(3, 0)
}
case GL_DEPTH_STENCIL_TEXTURE_MODE: {
minRequiredVersion(3, 1)
}
default: {
glErrorInvalidEnum(pname)
}
}
// TODO
}
@Doc("https://www.khronos.org/opengles/sdk/docs/man3/html/glTexStorage2D.xhtml","OpenGL ES 3.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man31/html/glTexStorage2D.xhtml","OpenGL ES 3.1")
cmd void glTexStorage2D(GLenum target,
GLsizei levels,
GLenum internalformat,
GLsizei width,
GLsizei height) {
minRequiredVersion(3, 0)
switch (target) {
case GL_TEXTURE_2D, GL_TEXTURE_CUBE_MAP: {
// version 3.0
}
default: {
glErrorInvalidEnum(target)
}
}
switch (internalformat) {
case GL_COMPRESSED_R11_EAC, GL_COMPRESSED_RG11_EAC, GL_COMPRESSED_RGB8_ETC2,
GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, GL_COMPRESSED_RGBA8_ETC2_EAC,
GL_COMPRESSED_SIGNED_R11_EAC, GL_COMPRESSED_SIGNED_RG11_EAC,
GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, GL_COMPRESSED_SRGB8_ETC2,
GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, GL_DEPTH24_STENCIL8, GL_DEPTH32F_STENCIL8,
GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT24, GL_DEPTH_COMPONENT32F, GL_R11F_G11F_B10F,
GL_R16F, GL_R16I, GL_R16UI, GL_R32F, GL_R32I, GL_R32UI, GL_R8, GL_R8I, GL_R8UI,
GL_R8_SNORM, GL_RG16F, GL_RG16I, GL_RG16UI, GL_RG32F, GL_RG32I, GL_RG32UI, GL_RG8, GL_RG8I,
GL_RG8UI, GL_RG8_SNORM, GL_RGB10_A2, GL_RGB10_A2UI, GL_RGB16F, GL_RGB16I, GL_RGB16UI,
GL_RGB32F, GL_RGB32I, GL_RGB32UI, GL_RGB565, GL_RGB5_A1, GL_RGB8, GL_RGB8I, GL_RGB8UI,
GL_RGB8_SNORM, GL_RGB9_E5, GL_RGBA16F, GL_RGBA16I, GL_RGBA16UI, GL_RGBA32F, GL_RGBA32I,
GL_RGBA32UI, GL_RGBA4, GL_RGBA8, GL_RGBA8I, GL_RGBA8UI, GL_RGBA8_SNORM, GL_SRGB8,
GL_SRGB8_ALPHA8: {
// version 3.0
}
default: {
glErrorInvalidEnum(internalformat)
}
}
// TODO
}
@Doc("https://www.khronos.org/opengles/sdk/docs/man31/html/glTexStorage2DMultisample.xhtml","OpenGL ES 3.1")
cmd void glTexStorage2DMultisample(GLenum target,
GLsizei samples,
GLenum internalformat,
GLsizei width,
GLsizei height,
GLboolean fixedsamplelocations) {
minRequiredVersion(3, 1)
switch (target) {
case GL_TEXTURE_2D_MULTISAMPLE: {
// version 3.1
}
default: {
glErrorInvalidEnum(target)
}
}
switch (internalformat) {
case GL_DEPTH24_STENCIL8, GL_DEPTH32F_STENCIL8, GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT24,
GL_DEPTH_COMPONENT32F, GL_R11F_G11F_B10F, GL_R16F, GL_R16I, GL_R16UI, GL_R32F, GL_R32I,
GL_R32UI, GL_R8, GL_R8I, GL_R8UI, GL_R8_SNORM, GL_RG16F, GL_RG16I, GL_RG16UI, GL_RG32F,
GL_RG32I, GL_RG32UI, GL_RG8, GL_RG8I, GL_RG8UI, GL_RG8_SNORM, GL_RGB10_A2, GL_RGB10_A2UI,
GL_RGB16F, GL_RGB16I, GL_RGB16UI, GL_RGB32F, GL_RGB32I, GL_RGB32UI, GL_RGB565, GL_RGB5_A1,
GL_RGB8, GL_RGB8I, GL_RGB8UI, GL_RGB8_SNORM, GL_RGB9_E5, GL_RGBA16F, GL_RGBA16I,
GL_RGBA16UI, GL_RGBA32F, GL_RGBA32I, GL_RGBA32UI, GL_RGBA4, GL_RGBA8, GL_RGBA8I,
GL_RGBA8UI, GL_RGBA8_SNORM, GL_SRGB8, GL_SRGB8_ALPHA8: {
// version 3.1
}
default: {
glErrorInvalidEnum(internalformat)
}
}
// TODO
}
@Doc("https://www.khronos.org/opengles/sdk/docs/man3/html/glTexStorage3D.xhtml","OpenGL ES 3.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man31/html/glTexStorage3D.xhtml","OpenGL ES 3.1")
cmd void glTexStorage3D(GLenum target,
GLsizei levels,
GLenum internalformat,
GLsizei width,
GLsizei height,
GLsizei depth) {
minRequiredVersion(3, 0)
switch (target) {
case GL_TEXTURE_2D_ARRAY, GL_TEXTURE_3D: {
// version 3.0
}
default: {
glErrorInvalidEnum(target)
}
}
switch (internalformat) {
case GL_COMPRESSED_R11_EAC, GL_COMPRESSED_RG11_EAC, GL_COMPRESSED_RGB8_ETC2,
GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, GL_COMPRESSED_RGBA8_ETC2_EAC,
GL_COMPRESSED_SIGNED_R11_EAC, GL_COMPRESSED_SIGNED_RG11_EAC,
GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, GL_COMPRESSED_SRGB8_ETC2,
GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, GL_DEPTH24_STENCIL8, GL_DEPTH32F_STENCIL8,
GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT24, GL_DEPTH_COMPONENT32F, GL_R11F_G11F_B10F,
GL_R16F, GL_R16I, GL_R16UI, GL_R32F, GL_R32I, GL_R32UI, GL_R8, GL_R8I, GL_R8UI,
GL_R8_SNORM, GL_RG16F, GL_RG16I, GL_RG16UI, GL_RG32F, GL_RG32I, GL_RG32UI, GL_RG8, GL_RG8I,
GL_RG8UI, GL_RG8_SNORM, GL_RGB10_A2, GL_RGB10_A2UI, GL_RGB16F, GL_RGB16I, GL_RGB16UI,
GL_RGB32F, GL_RGB32I, GL_RGB32UI, GL_RGB565, GL_RGB5_A1, GL_RGB8, GL_RGB8I, GL_RGB8UI,
GL_RGB8_SNORM, GL_RGB9_E5, GL_RGBA16F, GL_RGBA16I, GL_RGBA16UI, GL_RGBA32F, GL_RGBA32I,
GL_RGBA32UI, GL_RGBA4, GL_RGBA8, GL_RGBA8I, GL_RGBA8UI, GL_RGBA8_SNORM, GL_SRGB8,
GL_SRGB8_ALPHA8: {
// version 3.0
}
default: {
glErrorInvalidEnum(internalformat)
}
}
// TODO
}
@Doc("https://www.khronos.org/opengles/sdk/docs/man/xhtml/glTexSubImage2D.xml","OpenGL ES 2.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man3/html/glTexSubImage2D.xhtml","OpenGL ES 3.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man31/html/glTexSubImage2D.xhtml","OpenGL ES 3.1")
cmd void glTexSubImage2D(GLenum target,
GLint level,
GLint xoffset,
GLint yoffset,
GLsizei width,
GLsizei height,
GLenum format,
GLenum type,
TexturePointer data) {
minRequiredVersion(2, 0)
switch (target) {
case GL_TEXTURE_2D, GL_TEXTURE_CUBE_MAP_NEGATIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, GL_TEXTURE_CUBE_MAP_POSITIVE_X,
GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GL_TEXTURE_CUBE_MAP_POSITIVE_Z: {
// version 2.0
}
default: {
glErrorInvalidEnum(target)
}
}
switch (format) {
case GL_ALPHA, GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_RGB, GL_RGBA: {
// version 2.0
}
case GL_DEPTH_COMPONENT, GL_DEPTH_STENCIL, GL_RED, GL_RED_INTEGER, GL_RG, GL_RGBA_INTEGER,
GL_RGB_INTEGER, GL_RG_INTEGER: {
minRequiredVersion(3, 0)
}
default: {
glErrorInvalidEnum(format)
}
}
switch (type) {
case GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT_4_4_4_4, GL_UNSIGNED_SHORT_5_5_5_1,
GL_UNSIGNED_SHORT_5_6_5: {
// version 2.0
}
case GL_HALF_FLOAT_OES: {
requiresExtension(GL_OES_texture_half_float)
}
case GL_BYTE, GL_FLOAT, GL_FLOAT_32_UNSIGNED_INT_24_8_REV, GL_HALF_FLOAT, GL_INT, GL_SHORT,
GL_UNSIGNED_INT, GL_UNSIGNED_INT_10F_11F_11F_REV, GL_UNSIGNED_INT_24_8,
GL_UNSIGNED_INT_2_10_10_10_REV, GL_UNSIGNED_INT_5_9_9_9_REV, GL_UNSIGNED_SHORT: {
minRequiredVersion(3, 0)
}
default: {
glErrorInvalidEnum(type)
}
}
ctx := GetContext()
// TODO: This does not consider xoffset or yoffset and completely replaces the level.
// FIX.
switch (target) {
case GL_TEXTURE_2D: {
id := ctx.TextureUnits[ctx.ActiveTextureUnit][GL_TEXTURE_2D]
t := ctx.Instances.Textures[id]
l := Image(
Width: width,
Height: height,
Size: imageSize(as!u32(width), as!u32(height), format, type),
Format: as!GLenum(format) /* TODO: Implicit cast? */,
)
if (ctx.BoundBuffers[GL_PIXEL_UNPACK_BUFFER] == 0) && (data != null) {
l.Data = clone(as!u8*(data)[0:l.Size])
}
t.Texture2D[level] = l
t.Kind = TEXTURE2D // TODO: Warning/Error if kind has changed?
// TODO: Warning/Error if format has changed
t.Format = as!GLenum(format) // TODO: Implicit cast?
}
case GL_TEXTURE_CUBE_MAP_POSITIVE_X, GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
GL_TEXTURE_CUBE_MAP_NEGATIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: {
id := ctx.TextureUnits[ctx.ActiveTextureUnit][GL_TEXTURE_CUBE_MAP]
t := ctx.Instances.Textures[id]
l := Image(
Width: width,
Height: height,
Size: imageSize(as!u32(width), as!u32(height), format, type),
Format: as!GLenum(format) /* TODO: Implicit cast? */,
)
if (ctx.BoundBuffers[GL_PIXEL_UNPACK_BUFFER] == 0) && (data != null) {
l.Data = clone(as!u8*(data)[0:l.Size])
}
cube := t.Cubemap[level]
cube.Faces[as!GLenum(target)] = l
t.Cubemap[level] = cube
t.Kind = CUBEMAP // TODO: Warning/Error if kind has changed?
// TODO: Warning/Error if format has changed
t.Format = as!GLenum(format) // TODO: Implicit cast?
}
}
}
@Doc("https://www.khronos.org/opengles/sdk/docs/man3/html/glTexSubImage3D.xhtml","OpenGL ES 3.0")
@Doc("https://www.khronos.org/opengles/sdk/docs/man31/html/glTexSubImage3D.xhtml","OpenGL ES 3.1")
cmd void glTexSubImage3D(GLenum target,
GLint level,
GLint xoffset,
GLint yoffset,
GLint zoffset,
GLsizei width,
GLsizei height,
GLsizei depth,
GLenum format,
GLenum type,
const void* pixels) {
minRequiredVersion(3, 0)
switch (target) {
case GL_TEXTURE_2D_ARRAY, GL_TEXTURE_3D: {
// version 3.0
}
default: {
glErrorInvalidEnum(target)
}
}
switch (format) {
case GL_ALPHA, GL_DEPTH_COMPONENT, GL_DEPTH_STENCIL, GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_RED,
GL_RED_INTEGER, GL_RG, GL_RGB, GL_RGBA, GL_RGBA_INTEGER, GL_RGB_INTEGER, GL_RG_INTEGER: {
// version 3.0
}
default: {
glErrorInvalidEnum(format)
}
}
switch (type) {
case GL_HALF_FLOAT_OES: {
requiresExtension(GL_OES_texture_half_float)
}
case GL_BYTE, GL_FLOAT, GL_FLOAT_32_UNSIGNED_INT_24_8_REV, GL_HALF_FLOAT, GL_INT, GL_SHORT,
GL_UNSIGNED_BYTE, GL_UNSIGNED_INT, GL_UNSIGNED_INT_10F_11F_11F_REV, GL_UNSIGNED_INT_24_8,
GL_UNSIGNED_INT_2_10_10_10_REV, GL_UNSIGNED_INT_5_9_9_9_REV, GL_UNSIGNED_SHORT,
GL_UNSIGNED_SHORT_4_4_4_4, GL_UNSIGNED_SHORT_5_5_5_1, GL_UNSIGNED_SHORT_5_6_5: {
// version 3.0
}
default: {
glErrorInvalidEnum(type)
}
}
// TODO
}