Commit ed30618f by Alexis Hetu Committed by Alexis Hétu

Added more OpenGL ES 3.0 cases in front end

- Added Texture2DArray where Texture3D was present - Added OpenGL ES 3.0 compressed texture formats - Used new buffer/texture parameters in setters/getters - Added new Texture2D formats (mostly sized formats) - Added missing matrix 2x3 code - Added some trivial vertex attrib functions Change-Id: I74913383a5623080a51193975d8b6bc811d06703 Reviewed-on: https://swiftshader-review.googlesource.com/2791Tested-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com>
parent 8c479bc3
......@@ -494,6 +494,8 @@ void GL_APIENTRY glBindTexture(GLenum target, GLuint texture)
return error(GL_INVALID_OPERATION);
}
egl::GLint clientVersion = context->getClientVersion();
switch(target)
{
case GL_TEXTURE_2D:
......@@ -505,6 +507,17 @@ void GL_APIENTRY glBindTexture(GLenum target, GLuint texture)
case GL_TEXTURE_EXTERNAL_OES:
context->bindTextureExternal(texture);
return;
case GL_TEXTURE_2D_ARRAY:
if(clientVersion < 3)
{
return error(GL_INVALID_ENUM);
}
else
{
UNIMPLEMENTED();
context->bindTexture3D(texture);
break;
}
case GL_TEXTURE_3D_OES:
context->bindTexture3D(texture);
return;
......@@ -684,12 +697,25 @@ void GL_APIENTRY glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data
return error(GL_INVALID_VALUE);
}
egl::GLint clientVersion = egl::getClientVersion();
switch(usage)
{
case GL_STREAM_DRAW:
case GL_STATIC_DRAW:
case GL_DYNAMIC_DRAW:
break;
case GL_STREAM_READ:
case GL_STREAM_COPY:
case GL_STATIC_READ:
case GL_STATIC_COPY:
case GL_DYNAMIC_READ:
case GL_DYNAMIC_COPY:
if(clientVersion < 3)
{
return error(GL_INVALID_ENUM);
}
break;
default:
return error(GL_INVALID_ENUM);
}
......@@ -714,6 +740,7 @@ void GL_APIENTRY glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data
if(!buffer)
{
// A null buffer means that "0" is bound to the requested buffer target
return error(GL_INVALID_OPERATION);
}
......@@ -759,6 +786,7 @@ void GL_APIENTRY glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size
if(!buffer)
{
// A null buffer means that "0" is bound to the requested buffer target
return error(GL_INVALID_OPERATION);
}
......@@ -905,10 +933,27 @@ void GL_APIENTRY glCompressedTexImage2D(GLenum target, GLint level, GLenum inter
return error(GL_INVALID_VALUE);
}
egl::GLint clientVersion = egl::getClientVersion();
switch(internalformat)
{
case GL_ETC1_RGB8_OES:
break;
case GL_COMPRESSED_R11_EAC:
case GL_COMPRESSED_SIGNED_R11_EAC:
case GL_COMPRESSED_RG11_EAC:
case GL_COMPRESSED_SIGNED_RG11_EAC:
case GL_COMPRESSED_RGB8_ETC2:
case GL_COMPRESSED_SRGB8_ETC2:
case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
case GL_COMPRESSED_RGBA8_ETC2_EAC:
case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
if(clientVersion >= 3)
{
break;
}
return error(GL_INVALID_ENUM);
case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
......@@ -1031,10 +1076,27 @@ void GL_APIENTRY glCompressedTexSubImage2D(GLenum target, GLint level, GLint xof
return error(GL_INVALID_VALUE);
}
egl::GLint clientVersion = egl::getClientVersion();
switch(format)
{
case GL_ETC1_RGB8_OES:
break;
case GL_COMPRESSED_R11_EAC:
case GL_COMPRESSED_SIGNED_R11_EAC:
case GL_COMPRESSED_RG11_EAC:
case GL_COMPRESSED_SIGNED_RG11_EAC:
case GL_COMPRESSED_RGB8_ETC2:
case GL_COMPRESSED_SRGB8_ETC2:
case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
case GL_COMPRESSED_RGBA8_ETC2_EAC:
case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
if(clientVersion >= 3)
{
break;
}
return error(GL_INVALID_ENUM);
case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
......@@ -1658,6 +1720,20 @@ void GL_APIENTRY glDrawArrays(GLenum mode, GLint first, GLsizei count)
{
TRACE("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
switch(mode)
{
case GL_POINTS:
case GL_LINES:
case GL_LINE_LOOP:
case GL_LINE_STRIP:
case GL_TRIANGLES:
case GL_TRIANGLE_FAN:
case GL_TRIANGLE_STRIP:
break;
default:
return error(GL_INVALID_ENUM);
}
if(count < 0 || first < 0)
{
return error(GL_INVALID_VALUE);
......@@ -1676,6 +1752,20 @@ void GL_APIENTRY glDrawElements(GLenum mode, GLsizei count, GLenum type, const G
TRACE("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p)",
mode, count, type, indices);
switch(mode)
{
case GL_POINTS:
case GL_LINES:
case GL_LINE_LOOP:
case GL_LINE_STRIP:
case GL_TRIANGLES:
case GL_TRIANGLE_FAN:
case GL_TRIANGLE_STRIP:
break;
default:
return error(GL_INVALID_ENUM);
}
if(count < 0)
{
return error(GL_INVALID_VALUE);
......@@ -2005,7 +2095,9 @@ void GL_APIENTRY glGenerateMipmap(GLenum target)
if(context)
{
es2::Texture *texture;
es2::Texture *texture = nullptr;
egl::GLint clientVersion = context->getClientVersion();
switch(target)
{
......@@ -2015,6 +2107,20 @@ void GL_APIENTRY glGenerateMipmap(GLenum target)
case GL_TEXTURE_CUBE_MAP:
texture = context->getTextureCubeMap();
break;
case GL_TEXTURE_2D_ARRAY:
if(clientVersion < 3)
{
return error(GL_INVALID_ENUM);
}
else
{
UNIMPLEMENTED();
texture = context->getTexture3D();
break;
}
case GL_TEXTURE_3D_OES:
texture = context->getTexture3D();
break;
default:
return error(GL_INVALID_ENUM);
}
......@@ -2354,6 +2460,8 @@ void GL_APIENTRY glGetBufferParameteriv(GLenum target, GLenum pname, GLint* para
return error(GL_INVALID_OPERATION);
}
egl::GLint clientVersion = context->getClientVersion();
switch(pname)
{
case GL_BUFFER_USAGE:
......@@ -2362,6 +2470,34 @@ void GL_APIENTRY glGetBufferParameteriv(GLenum target, GLenum pname, GLint* para
case GL_BUFFER_SIZE:
*params = buffer->size();
break;
case GL_BUFFER_ACCESS_FLAGS:
if(clientVersion >= 3)
{
*params = buffer->access();
break;
}
else return error(GL_INVALID_ENUM);
case GL_BUFFER_MAPPED:
if(clientVersion >= 3)
{
*params = buffer->isMapped();
break;
}
else return error(GL_INVALID_ENUM);
case GL_BUFFER_MAP_LENGTH:
if(clientVersion >= 3)
{
*params = buffer->length();
break;
}
else return error(GL_INVALID_ENUM);
case GL_BUFFER_MAP_OFFSET:
if(clientVersion >= 3)
{
*params = buffer->offset();
break;
}
else return error(GL_INVALID_ENUM);
default:
return error(GL_INVALID_ENUM);
}
......@@ -2621,10 +2757,7 @@ void GL_APIENTRY glGetIntegerv(GLenum pname, GLint* params)
for(unsigned int i = 0; i < numParams; ++i)
{
if(boolParams[i] == GL_FALSE)
params[i] = 0;
else
params[i] = 1;
params[i] = (boolParams[i] == GL_FALSE) ? 0 : 1;
}
delete [] boolParams;
......@@ -2640,7 +2773,7 @@ void GL_APIENTRY glGetIntegerv(GLenum pname, GLint* params)
{
if(pname == GL_DEPTH_RANGE || pname == GL_COLOR_CLEAR_VALUE || pname == GL_DEPTH_CLEAR_VALUE || pname == GL_BLEND_COLOR)
{
params[i] = (GLint)(((GLfloat)(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
params[i] = (GLint)(((GLfloat)(0xFFFFFFFF) * floatParams[i] - 1.0f) * 0.5f);
}
else
{
......@@ -3021,6 +3154,8 @@ void GL_APIENTRY glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* param
{
es2::Texture *texture;
egl::GLint clientVersion = context->getClientVersion();
switch(target)
{
case GL_TEXTURE_2D:
......@@ -3032,6 +3167,20 @@ void GL_APIENTRY glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* param
case GL_TEXTURE_EXTERNAL_OES:
texture = context->getTextureExternal();
break;
case GL_TEXTURE_2D_ARRAY:
if(clientVersion < 3)
{
return error(GL_INVALID_ENUM);
}
else
{
UNIMPLEMENTED();
texture = context->getTexture3D();
break;
}
case GL_TEXTURE_3D_OES:
texture = context->getTexture3D();
break;
default:
return error(GL_INVALID_ENUM);
}
......@@ -3059,6 +3208,83 @@ void GL_APIENTRY glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* param
case GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES:
*params = (GLfloat)1;
break;
case GL_TEXTURE_BASE_LEVEL:
if(clientVersion >= 3)
{
*params = (GLfloat)texture->getBaseLevel();
break;
}
else return error(GL_INVALID_ENUM);
case GL_TEXTURE_COMPARE_FUNC:
if(clientVersion >= 3)
{
*params = (GLfloat)texture->getCompareFunc();
break;
}
else return error(GL_INVALID_ENUM);
case GL_TEXTURE_COMPARE_MODE:
if(clientVersion >= 3)
{
*params = (GLfloat)texture->getCompareMode();
break;
}
else return error(GL_INVALID_ENUM);
case GL_TEXTURE_IMMUTABLE_FORMAT:
if(clientVersion >= 3)
{
*params = (GLfloat)texture->getImmutableFormat();
break;
}
else return error(GL_INVALID_ENUM);
case GL_TEXTURE_MAX_LEVEL:
if(clientVersion >= 3)
{
*params = (GLfloat)texture->getMaxLevel();
break;
}
else return error(GL_INVALID_ENUM);
case GL_TEXTURE_MAX_LOD:
if(clientVersion >= 3)
{
*params = texture->getMaxLOD();
break;
}
else return error(GL_INVALID_ENUM);
case GL_TEXTURE_MIN_LOD:
if(clientVersion >= 3)
{
*params = texture->getMinLOD();
break;
}
else return error(GL_INVALID_ENUM);
case GL_TEXTURE_SWIZZLE_R:
if(clientVersion >= 3)
{
*params = (GLfloat)texture->getSwizzleR();
break;
}
else return error(GL_INVALID_ENUM);
case GL_TEXTURE_SWIZZLE_G:
if(clientVersion >= 3)
{
*params = (GLfloat)texture->getSwizzleG();
break;
}
else return error(GL_INVALID_ENUM);
case GL_TEXTURE_SWIZZLE_B:
if(clientVersion >= 3)
{
*params = (GLfloat)texture->getSwizzleB();
break;
}
else return error(GL_INVALID_ENUM);
case GL_TEXTURE_SWIZZLE_A:
if(clientVersion >= 3)
{
*params = (GLfloat)texture->getSwizzleA();
break;
}
else return error(GL_INVALID_ENUM);
default:
return error(GL_INVALID_ENUM);
}
......@@ -3075,6 +3301,8 @@ void GL_APIENTRY glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
{
es2::Texture *texture;
egl::GLint clientVersion = context->getClientVersion();
switch(target)
{
case GL_TEXTURE_2D:
......@@ -3086,6 +3314,20 @@ void GL_APIENTRY glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
case GL_TEXTURE_EXTERNAL_OES:
texture = context->getTextureExternal();
break;
case GL_TEXTURE_2D_ARRAY:
if(clientVersion < 3)
{
return error(GL_INVALID_ENUM);
}
else
{
UNIMPLEMENTED();
texture = context->getTexture3D();
break;
}
case GL_TEXTURE_3D_OES:
texture = context->getTexture3D();
break;
default:
return error(GL_INVALID_ENUM);
}
......@@ -3113,6 +3355,83 @@ void GL_APIENTRY glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
case GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES:
*params = 1;
break;
case GL_TEXTURE_BASE_LEVEL:
if(clientVersion >= 3)
{
*params = texture->getBaseLevel();
break;
}
else return error(GL_INVALID_ENUM);
case GL_TEXTURE_COMPARE_FUNC:
if(clientVersion >= 3)
{
*params = (GLint)texture->getCompareFunc();
break;
}
else return error(GL_INVALID_ENUM);
case GL_TEXTURE_COMPARE_MODE:
if(clientVersion >= 3)
{
*params = (GLint)texture->getCompareMode();
break;
}
else return error(GL_INVALID_ENUM);
case GL_TEXTURE_IMMUTABLE_FORMAT:
if(clientVersion >= 3)
{
*params = (GLint)texture->getImmutableFormat();
break;
}
else return error(GL_INVALID_ENUM);
case GL_TEXTURE_MAX_LEVEL:
if(clientVersion >= 3)
{
*params = texture->getMaxLevel();
break;
}
else return error(GL_INVALID_ENUM);
case GL_TEXTURE_MAX_LOD:
if(clientVersion >= 3)
{
*params = (GLint)texture->getMaxLOD();
break;
}
else return error(GL_INVALID_ENUM);
case GL_TEXTURE_MIN_LOD:
if(clientVersion >= 3)
{
*params = (GLint)texture->getMinLOD();
break;
}
else return error(GL_INVALID_ENUM);
case GL_TEXTURE_SWIZZLE_R:
if(clientVersion >= 3)
{
*params = (GLint)texture->getSwizzleR();
break;
}
else return error(GL_INVALID_ENUM);
case GL_TEXTURE_SWIZZLE_G:
if(clientVersion >= 3)
{
*params = (GLint)texture->getSwizzleG();
break;
}
else return error(GL_INVALID_ENUM);
case GL_TEXTURE_SWIZZLE_B:
if(clientVersion >= 3)
{
*params = (GLint)texture->getSwizzleB();
break;
}
else return error(GL_INVALID_ENUM);
case GL_TEXTURE_SWIZZLE_A:
if(clientVersion >= 3)
{
*params = (GLint)texture->getSwizzleA();
break;
}
else return error(GL_INVALID_ENUM);
default:
return error(GL_INVALID_ENUM);
}
......@@ -3301,6 +3620,8 @@ void GL_APIENTRY glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params
}
const es2::VertexAttribute &attribState = context->getVertexAttribState(index);
egl::GLint clientVersion = context->getClientVersion();
switch(pname)
{
......@@ -3328,6 +3649,28 @@ void GL_APIENTRY glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params
params[i] = attribState.mCurrentValue[i];
}
break;
case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
if(clientVersion >= 3)
{
switch(attribState.mType)
{
case GL_BYTE:
case GL_UNSIGNED_BYTE:
case GL_SHORT:
case GL_UNSIGNED_SHORT:
case GL_INT:
case GL_INT_2_10_10_10_REV:
case GL_UNSIGNED_INT:
case GL_FIXED:
*params = (GLfloat)GL_TRUE;
break;
default:
*params = (GLfloat)GL_FALSE;
break;
}
break;
}
else return error(GL_INVALID_ENUM);
default: return error(GL_INVALID_ENUM);
}
}
......@@ -3348,6 +3691,8 @@ void GL_APIENTRY glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
const es2::VertexAttribute &attribState = context->getVertexAttribState(index);
egl::GLint clientVersion = context->getClientVersion();
switch(pname)
{
case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
......@@ -3375,6 +3720,28 @@ void GL_APIENTRY glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
params[i] = (GLint)(currentValue > 0.0f ? floor(currentValue + 0.5f) : ceil(currentValue - 0.5f));
}
break;
case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
if(clientVersion >= 3)
{
switch(attribState.mType)
{
case GL_BYTE:
case GL_UNSIGNED_BYTE:
case GL_SHORT:
case GL_UNSIGNED_SHORT:
case GL_INT:
case GL_INT_2_10_10_10_REV:
case GL_UNSIGNED_INT:
case GL_FIXED:
*params = GL_TRUE;
break;
default:
*params = GL_FALSE;
break;
}
break;
}
else return error(GL_INVALID_ENUM);
default: return error(GL_INVALID_ENUM);
}
}
......@@ -3667,6 +4034,8 @@ void GL_APIENTRY glPixelStorei(GLenum pname, GLint param)
if(context)
{
egl::GLint clientVersion = context->getClientVersion();
switch(pname)
{
case GL_UNPACK_ALIGNMENT:
......@@ -3683,6 +4052,20 @@ void GL_APIENTRY glPixelStorei(GLenum pname, GLint param)
}
context->setPackAlignment(param);
break;
case GL_PACK_ROW_LENGTH:
case GL_PACK_SKIP_PIXELS:
case GL_PACK_SKIP_ROWS:
case GL_UNPACK_ROW_LENGTH:
case GL_UNPACK_IMAGE_HEIGHT:
case GL_UNPACK_SKIP_PIXELS:
case GL_UNPACK_SKIP_ROWS:
case GL_UNPACK_SKIP_IMAGES:
if(clientVersion >= 3)
{
UNIMPLEMENTED();
break;
}
else return error(GL_INVALID_ENUM);
default:
return error(GL_INVALID_ENUM);
}
......@@ -4137,29 +4520,538 @@ void GL_APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalformat,
return error(GL_INVALID_ENUM);
}
break;
case GL_RED:
switch(internalformat)
{
case GL_R8:
switch(type)
{
case GL_UNSIGNED_BYTE:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
case GL_R8_SNORM:
switch(type)
{
case GL_BYTE:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
case GL_R16F:
switch(type)
{
case GL_FLOAT:
case GL_HALF_FLOAT:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
case GL_R32F:
switch(type)
{
case GL_FLOAT:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
default:
return error(GL_INVALID_VALUE);
}
break;
case GL_RED_INTEGER:
switch(internalformat)
{
case GL_R8UI:
switch(type)
{
case GL_UNSIGNED_BYTE:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
case GL_R8I:
switch(type)
{
case GL_BYTE:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
case GL_R16UI:
switch(type)
{
case GL_UNSIGNED_SHORT:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
case GL_R16I:
switch(type)
{
case GL_SHORT:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
case GL_R32UI:
switch(type)
{
case GL_UNSIGNED_INT:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
case GL_R32I:
switch(type)
{
case GL_INT:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
default:
return error(GL_INVALID_VALUE);
}
break;
case GL_RG_INTEGER:
switch(internalformat)
{
case GL_RG8UI:
switch(type)
{
case GL_UNSIGNED_BYTE:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
case GL_RG8I:
switch(type)
{
case GL_BYTE:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
case GL_RG16UI:
switch(type)
{
case GL_UNSIGNED_SHORT:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
case GL_RG16I:
switch(type)
{
case GL_SHORT:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
case GL_RG32UI:
switch(type)
{
case GL_UNSIGNED_INT:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
case GL_RG32I:
switch(type)
{
case GL_INT:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
default:
return error(GL_INVALID_VALUE);
}
break;
case GL_RGB_INTEGER:
switch(internalformat)
{
case GL_RGB8UI:
switch(type)
{
case GL_UNSIGNED_BYTE:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
case GL_RGB8I:
switch(type)
{
case GL_BYTE:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
case GL_RGB16UI:
switch(type)
{
case GL_UNSIGNED_SHORT:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
case GL_RGB16I:
switch(type)
{
case GL_SHORT:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
case GL_RGB32UI:
switch(type)
{
case GL_UNSIGNED_INT:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
case GL_RGB32I:
switch(type)
{
case GL_INT:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
default:
return error(GL_INVALID_VALUE);
}
break;
case GL_RGBA_INTEGER:
switch(internalformat)
{
case GL_RGBA8UI:
switch(type)
{
case GL_UNSIGNED_BYTE:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
case GL_RGBA8I:
switch(type)
{
case GL_BYTE:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
case GL_RGB10_A2UI:
switch(type)
{
case GL_UNSIGNED_INT_2_10_10_10_REV:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
case GL_RGBA16UI:
switch(type)
{
case GL_UNSIGNED_SHORT:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
case GL_RGBA16I:
switch(type)
{
case GL_SHORT:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
case GL_RGBA32UI:
switch(type)
{
case GL_INT:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
case GL_RGBA32I:
switch(type)
{
case GL_UNSIGNED_INT:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
default:
return error(GL_INVALID_VALUE);
}
break;
case GL_RG:
switch(internalformat)
{
case GL_RG8:
switch(type)
{
case GL_UNSIGNED_BYTE:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
case GL_RG8_SNORM:
switch(type)
{
case GL_BYTE:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
case GL_RG16F:
switch(type)
{
case GL_FLOAT:
case GL_HALF_FLOAT:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
case GL_RG32F:
switch(type)
{
case GL_FLOAT:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
default:
return error(GL_INVALID_VALUE);
}
break;
case GL_RGB:
switch(type)
switch(internalformat)
{
case GL_UNSIGNED_BYTE:
case GL_UNSIGNED_SHORT_5_6_5:
case GL_FLOAT:
case GL_HALF_FLOAT_OES:
case GL_RGB:
switch(type)
{
case GL_UNSIGNED_BYTE:
case GL_UNSIGNED_SHORT_5_6_5:
case GL_FLOAT:
case GL_HALF_FLOAT_OES:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
case GL_RGB8:
switch(type)
{
case GL_UNSIGNED_BYTE:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
case GL_SRGB8:
switch(type)
{
case GL_UNSIGNED_BYTE:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
case GL_RGB565:
switch(type)
{
case GL_UNSIGNED_BYTE:
case GL_UNSIGNED_SHORT_5_6_5:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
case GL_RGB8_SNORM:
switch(type)
{
case GL_BYTE:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
case GL_R11F_G11F_B10F:
switch(type)
{
case GL_UNSIGNED_INT_10F_11F_11F_REV:
case GL_FLOAT:
case GL_HALF_FLOAT:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
case GL_RGB9_E5:
switch(type)
{
case GL_UNSIGNED_INT_5_9_9_9_REV:
case GL_FLOAT:
case GL_HALF_FLOAT:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
case GL_RGB16F:
switch(type)
{
case GL_FLOAT:
case GL_HALF_FLOAT:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
case GL_RGB32F:
switch(type)
{
case GL_FLOAT:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
default:
return error(GL_INVALID_ENUM);
return error(GL_INVALID_VALUE);
}
break;
case GL_RGBA:
switch(type)
switch(internalformat)
{
case GL_UNSIGNED_BYTE:
case GL_UNSIGNED_SHORT_4_4_4_4:
case GL_UNSIGNED_SHORT_5_5_5_1:
case GL_FLOAT:
case GL_HALF_FLOAT_OES:
case GL_RGBA:
switch(type)
{
case GL_UNSIGNED_BYTE:
case GL_UNSIGNED_SHORT_4_4_4_4:
case GL_UNSIGNED_SHORT_5_5_5_1:
case GL_FLOAT:
case GL_HALF_FLOAT_OES:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
case GL_RGBA8:
switch(type)
{
case GL_UNSIGNED_BYTE:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
case GL_SRGB8_ALPHA8:
switch(type)
{
case GL_UNSIGNED_BYTE:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
case GL_RGB5_A1:
switch(type)
{
case GL_UNSIGNED_BYTE:
case GL_UNSIGNED_SHORT_5_5_5_1:
case GL_UNSIGNED_INT_2_10_10_10_REV:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
case GL_RGBA8_SNORM:
switch(type)
{
case GL_BYTE:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
case GL_RGBA4:
switch(type)
{
case GL_UNSIGNED_BYTE:
case GL_UNSIGNED_SHORT_4_4_4_4:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
case GL_RGB10_A2:
switch(type)
{
case GL_UNSIGNED_INT_2_10_10_10_REV:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
case GL_RGBA16F:
switch(type)
{
case GL_FLOAT:
case GL_HALF_FLOAT:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
case GL_RGBA32F:
switch(type)
{
case GL_FLOAT:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
default:
return error(GL_INVALID_ENUM);
return error(GL_INVALID_VALUE);
}
break;
case GL_BGRA_EXT:
......@@ -4186,22 +5078,65 @@ void GL_APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalformat,
return error(GL_INVALID_ENUM);
}
case GL_DEPTH_COMPONENT:
switch(type)
switch(internalformat)
{
case GL_UNSIGNED_SHORT:
case GL_UNSIGNED_INT:
case GL_DEPTH_COMPONENT:
case GL_DEPTH_COMPONENT16:
switch(type)
{
case GL_UNSIGNED_SHORT:
case GL_UNSIGNED_INT:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
case GL_DEPTH_COMPONENT24:
switch(type)
{
case GL_UNSIGNED_INT:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
case GL_DEPTH_COMPONENT32F:
switch(type)
{
case GL_UNSIGNED_INT:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
default:
return error(GL_INVALID_ENUM);
return error(GL_INVALID_VALUE);
}
break;
case GL_DEPTH_STENCIL_OES:
switch(type)
switch(internalformat)
{
case GL_UNSIGNED_INT_24_8_OES:
case GL_DEPTH_STENCIL_OES:
case GL_DEPTH24_STENCIL8:
switch(type)
{
case GL_UNSIGNED_INT_24_8_OES:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
case GL_DEPTH32F_STENCIL8:
switch(type)
{
case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
default:
return error(GL_INVALID_ENUM);
return error(GL_INVALID_VALUE);
}
break;
default:
......@@ -4278,11 +5213,24 @@ void GL_APIENTRY glTexParameterf(GLenum target, GLenum pname, GLfloat param)
{
es2::Texture *texture;
egl::GLint clientVersion = context->getClientVersion();
switch(target)
{
case GL_TEXTURE_2D:
texture = context->getTexture2D();
break;
case GL_TEXTURE_2D_ARRAY:
if(clientVersion < 3)
{
return error(GL_INVALID_ENUM);
}
else
{
UNIMPLEMENTED();
texture = context->getTexture3D();
break;
}
case GL_TEXTURE_3D_OES:
texture = context->getTexture3D();
break;
......@@ -4334,6 +5282,72 @@ void GL_APIENTRY glTexParameterf(GLenum target, GLenum pname, GLfloat param)
return error(GL_INVALID_VALUE);
}
break;
case GL_TEXTURE_BASE_LEVEL:
if(clientVersion < 3 || !texture->setBaseLevel((GLint)param))
{
return error(GL_INVALID_VALUE);
}
break;
case GL_TEXTURE_COMPARE_FUNC:
if(clientVersion < 3 || !texture->setCompareFunc((GLenum)param))
{
return error(GL_INVALID_VALUE);
}
break;
case GL_TEXTURE_COMPARE_MODE:
if(clientVersion < 3 || !texture->setCompareMode((GLenum)param))
{
return error(GL_INVALID_VALUE);
}
break;
case GL_TEXTURE_IMMUTABLE_FORMAT:
if(clientVersion < 3 || !texture->setCompareMode((GLboolean)param))
{
return error(GL_INVALID_VALUE);
}
break;
case GL_TEXTURE_MAX_LEVEL:
if(clientVersion < 3 || !texture->setMaxLevel((GLint)param))
{
return error(GL_INVALID_VALUE);
}
break;
case GL_TEXTURE_MAX_LOD:
if(clientVersion < 3 || !texture->setMaxLOD(param))
{
return error(GL_INVALID_VALUE);
}
break;
case GL_TEXTURE_MIN_LOD:
if(clientVersion < 3 || !texture->setMinLOD(param))
{
return error(GL_INVALID_VALUE);
}
break;
case GL_TEXTURE_SWIZZLE_R:
if(clientVersion < 3 || !texture->setSwizzleR((GLenum)param))
{
return error(GL_INVALID_VALUE);
}
break;
case GL_TEXTURE_SWIZZLE_G:
if(clientVersion < 3 || !texture->setSwizzleG((GLenum)param))
{
return error(GL_INVALID_VALUE);
}
break;
case GL_TEXTURE_SWIZZLE_B:
if(clientVersion < 3 || !texture->setSwizzleB((GLenum)param))
{
return error(GL_INVALID_VALUE);
}
break;
case GL_TEXTURE_SWIZZLE_A:
if(clientVersion < 3 || !texture->setSwizzleA((GLenum)param))
{
return error(GL_INVALID_VALUE);
}
break;
default:
return error(GL_INVALID_ENUM);
}
......@@ -4355,11 +5369,24 @@ void GL_APIENTRY glTexParameteri(GLenum target, GLenum pname, GLint param)
{
es2::Texture *texture;
egl::GLint clientVersion = context->getClientVersion();
switch(target)
{
case GL_TEXTURE_2D:
texture = context->getTexture2D();
break;
case GL_TEXTURE_2D_ARRAY:
if(clientVersion < 3)
{
return error(GL_INVALID_ENUM);
}
else
{
UNIMPLEMENTED();
texture = context->getTexture3D();
break;
}
case GL_TEXTURE_3D_OES:
texture = context->getTexture3D();
break;
......@@ -4411,6 +5438,71 @@ void GL_APIENTRY glTexParameteri(GLenum target, GLenum pname, GLint param)
return error(GL_INVALID_VALUE);
}
break;
case GL_TEXTURE_BASE_LEVEL:
if(clientVersion < 3 || !texture->setBaseLevel(param))
{
return error(GL_INVALID_VALUE);
}
break;
case GL_TEXTURE_COMPARE_FUNC:
if(clientVersion < 3 || !texture->setCompareFunc((GLenum)param))
{
return error(GL_INVALID_VALUE);
}
break;
case GL_TEXTURE_COMPARE_MODE:
if(clientVersion < 3 || !texture->setCompareMode((GLenum)param))
{
return error(GL_INVALID_VALUE);
}
case GL_TEXTURE_IMMUTABLE_FORMAT:
if(clientVersion < 3 || !texture->setCompareMode((GLboolean)param))
{
return error(GL_INVALID_VALUE);
}
break;
case GL_TEXTURE_MAX_LEVEL:
if(clientVersion < 3 || !texture->setMaxLevel(param))
{
return error(GL_INVALID_VALUE);
}
break;
case GL_TEXTURE_MAX_LOD:
if(clientVersion < 3 || !texture->setMaxLOD((GLfloat)param))
{
return error(GL_INVALID_VALUE);
}
break;
case GL_TEXTURE_MIN_LOD:
if(clientVersion < 3 || !texture->setMinLOD((GLfloat)param))
{
return error(GL_INVALID_VALUE);
}
break;
case GL_TEXTURE_SWIZZLE_R:
if(clientVersion < 3 || !texture->setSwizzleR((GLenum)param))
{
return error(GL_INVALID_VALUE);
}
break;
case GL_TEXTURE_SWIZZLE_G:
if(clientVersion < 3 || !texture->setSwizzleG((GLenum)param))
{
return error(GL_INVALID_VALUE);
}
break;
case GL_TEXTURE_SWIZZLE_B:
if(clientVersion < 3 || !texture->setSwizzleB((GLenum)param))
{
return error(GL_INVALID_VALUE);
}
break;
case GL_TEXTURE_SWIZZLE_A:
if(clientVersion < 3 || !texture->setSwizzleA((GLenum)param))
{
return error(GL_INVALID_VALUE);
}
break;
default:
return error(GL_INVALID_ENUM);
}
......@@ -5112,6 +6204,8 @@ void GL_APIENTRY glVertexAttribPointer(GLuint index, GLint size, GLenum type, GL
return error(GL_INVALID_VALUE);
}
egl::GLint clientVersion = egl::getClientVersion();
switch(type)
{
case GL_BYTE:
......@@ -5121,6 +6215,25 @@ void GL_APIENTRY glVertexAttribPointer(GLuint index, GLint size, GLenum type, GL
case GL_FIXED:
case GL_FLOAT:
break;
case GL_INT_2_10_10_10_REV:
case GL_UNSIGNED_INT_2_10_10_10_REV:
if(clientVersion >= 3)
{
if(size != 4)
{
return error(GL_INVALID_OPERATION);
}
break;
}
else return error(GL_INVALID_ENUM);
case GL_INT:
case GL_UNSIGNED_INT:
case GL_HALF_FLOAT:
if(clientVersion >= 3)
{
break;
}
else return error(GL_INVALID_ENUM);
default:
return error(GL_INVALID_ENUM);
}
......
......@@ -11,6 +11,7 @@
// libGLESv3.cpp: Implements the exported OpenGL ES 3.0 functions.
#include "main.h"
#include "Buffer.h"
#include "Framebuffer.h"
#include "Program.h"
#include "Query.h"
......@@ -938,7 +939,33 @@ void GL_APIENTRY glDrawBuffers(GLsizei n, const GLenum *bufs)
void GL_APIENTRY glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
{
TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat *value = 0x%0.8p)", location, count, transpose, value);
UNIMPLEMENTED();
if(count < 0 || transpose != GL_FALSE)
{
return error(GL_INVALID_VALUE);
}
if(location == -1)
{
return;
}
es2::Context *context = es2::getContext();
if(context)
{
es2::Program *program = context->getCurrentProgram();
if(!program)
{
return error(GL_INVALID_OPERATION);
}
if(!program->setUniformMatrix2x3fv(location, count, value))
{
return error(GL_INVALID_OPERATION);
}
}
}
void GL_APIENTRY glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
......@@ -1511,21 +1538,154 @@ void GL_APIENTRY glVertexAttribIPointer(GLuint index, GLint size, GLenum type, G
{
TRACE("(GLuint program = %d, GLuint index = %d, GLsizei bufSize = %d, GLsizei *length = 0x%0.8p, GLsizei *size = 0x%0.8p, GLenum *type = 0x%0.8p, GLchar *name = 0x%0.8p)",
index, size, type, stride, pointer);
UNIMPLEMENTED();
if(index >= es2::MAX_VERTEX_ATTRIBS)
{
return error(GL_INVALID_VALUE);
}
if(size < 1 || size > 4 || stride < 0)
{
return error(GL_INVALID_VALUE);
}
switch(type)
{
case GL_BYTE:
case GL_UNSIGNED_BYTE:
case GL_SHORT:
case GL_UNSIGNED_SHORT:
case GL_INT:
case GL_UNSIGNED_INT:
break;
default:
return error(GL_INVALID_ENUM);
}
es2::Context *context = es2::getContext();
if(context)
{
context->setVertexAttribState(index, context->getArrayBuffer(), size, type, false, stride, pointer);
}
}
void GL_APIENTRY glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
{
TRACE("(GLuint index = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)",
index, pname, params);
UNIMPLEMENTED();
es2::Context *context = es2::getContext();
if(context)
{
if(index >= es2::MAX_VERTEX_ATTRIBS)
{
return error(GL_INVALID_VALUE);
}
const es2::VertexAttribute &attribState = context->getVertexAttribState(index);
switch(pname)
{
case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
*params = (attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
break;
case GL_VERTEX_ATTRIB_ARRAY_SIZE:
*params = attribState.mSize;
break;
case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
*params = attribState.mStride;
break;
case GL_VERTEX_ATTRIB_ARRAY_TYPE:
*params = attribState.mType;
break;
case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
*params = (attribState.mNormalized ? GL_TRUE : GL_FALSE);
break;
case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
*params = attribState.mBoundBuffer.name();
break;
case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
switch(attribState.mType)
{
case GL_BYTE:
case GL_UNSIGNED_BYTE:
case GL_SHORT:
case GL_UNSIGNED_SHORT:
case GL_INT:
case GL_INT_2_10_10_10_REV:
case GL_UNSIGNED_INT:
case GL_FIXED:
*params = GL_TRUE;
break;
default:
*params = GL_FALSE;
break;
}
break;
default: return error(GL_INVALID_ENUM);
}
}
}
void GL_APIENTRY glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
{
TRACE("(GLuint index = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)",
index, pname, params);
UNIMPLEMENTED();
index, pname, params);
es2::Context *context = es2::getContext();
if(context)
{
if(index >= es2::MAX_VERTEX_ATTRIBS)
{
return error(GL_INVALID_VALUE);
}
const es2::VertexAttribute &attribState = context->getVertexAttribState(index);
switch(pname)
{
case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
*params = (attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
break;
case GL_VERTEX_ATTRIB_ARRAY_SIZE:
*params = attribState.mSize;
break;
case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
*params = attribState.mStride;
break;
case GL_VERTEX_ATTRIB_ARRAY_TYPE:
*params = attribState.mType;
break;
case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
*params = (attribState.mNormalized ? GL_TRUE : GL_FALSE);
break;
case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
*params = attribState.mBoundBuffer.name();
break;
case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
switch(attribState.mType)
{
case GL_BYTE:
case GL_UNSIGNED_BYTE:
case GL_SHORT:
case GL_UNSIGNED_SHORT:
case GL_INT:
case GL_INT_2_10_10_10_REV:
case GL_UNSIGNED_INT:
case GL_FIXED:
*params = GL_TRUE;
break;
default:
*params = GL_FALSE;
break;
}
break;
default: return error(GL_INVALID_ENUM);
}
}
}
void GL_APIENTRY glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
......@@ -1558,7 +1718,33 @@ void GL_APIENTRY glGetUniformuiv(GLuint program, GLint location, GLuint *params)
{
TRACE("(GLuint program = %d, GLint location = %d, GLuint *params = 0x%0.8p)",
program, location, params);
UNIMPLEMENTED();
es2::Context *context = es2::getContext();
if(context)
{
if(program == 0)
{
return error(GL_INVALID_VALUE);
}
es2::Program *programObject = context->getProgram(program);
if(!programObject || !programObject->isLinked())
{
return error(GL_INVALID_OPERATION);
}
if(!programObject)
{
return error(GL_INVALID_OPERATION);
}
if(!programObject->getUniformuiv(location, NULL, params))
{
return error(GL_INVALID_OPERATION);
}
}
}
GLint GL_APIENTRY glGetFragDataLocation(GLuint program, const GLchar *name)
......@@ -1908,9 +2094,9 @@ void GL_APIENTRY glGetUniformIndices(GLuint program, GLsizei uniformCount, const
if(context)
{
es2::Program *program = context->getCurrentProgram();
es2::Program *programObject = context->getProgram(program);
if(!program)
if(!programObject)
{
return error(GL_INVALID_OPERATION);
}
......@@ -1943,9 +2129,9 @@ void GL_APIENTRY glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, con
if(context)
{
es2::Program *program = context->getCurrentProgram();
es2::Program *programObject = context->getProgram(program);
if(!program)
if(!programObject)
{
return error(GL_INVALID_OPERATION);
}
......@@ -1963,9 +2149,9 @@ GLuint GL_APIENTRY glGetUniformBlockIndex(GLuint program, const GLchar *uniformB
if(context)
{
es2::Program *program = context->getCurrentProgram();
es2::Program *programObject = context->getProgram(program);
if(!program)
if(!programObject)
{
return error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
}
......@@ -2018,9 +2204,9 @@ void GL_APIENTRY glGetActiveUniformBlockName(GLuint program, GLuint uniformBlock
if(context)
{
es2::Program *program = context->getCurrentProgram();
es2::Program *programObject = context->getProgram(program);
if(!program)
if(!programObject)
{
return error(GL_INVALID_OPERATION);
}
......@@ -2038,11 +2224,11 @@ void GL_APIENTRY glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex,
if(context)
{
es2::Program *program = context->getCurrentProgram();
es2::Program *programObject = context->getProgram(program);
if(!program)
if(!programObject)
{
return error(GL_INVALID_OPERATION);
return error(GL_INVALID_VALUE);
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment