Commit 83463115 by Nicolas Capens Committed by Nicolas Capens

Always create an OpenGL ES 3.0 context.

The EGL spec allows that on context creation, a newer, compatible version is returned. OpenGL ES 3.0 is stated to be backward compatible with OpenGL ES 2.0, so we can stop creating a context that is limited to OpenGL ES 2.0 features, and always return an OpenGL ES 3.0 context. This simplifies our code and maintenance a bit and reduces the risk of incorrect validation. Note that Appendix F of the OpenGL ES 3.0 specification lists changes in behavior that aren't entirely backward compatible with OpenGL ES 2.0: * OpenGL ES 3.0 requires that all cube map filtering be seamless. OpenGL ES 2.0 specified that a single cube map face be selected and used for filtering. See section 3.8.9.1. * OpenGL ES 3.0 specifies a zero-preserving mapping when converting back and forth between signed normalized fixed-point values and floating- point values. OpenGL ES 2.0 specified a mapping by which zeros are not preserved. See section 2.1.6. * OpenGL ES 3.0 requires that framebuffer objects not be shared between contexts. OpenGL ES 2.0 left it undefined whether framebuffer objects could be shared. See appendix D. Additional differences can stem from new extensions being exposed (e.g. GL_EXT_color_buffer_float), and framebuffer configurations that are newly supported or no longer supported (in particular we allowed separate depth and stencil attachments, which OpenGL ES 3.0 expressly disallows). See also https://gitlab.khronos.org/opengl/API/issues/82 Bug swiftshader:45 Change-Id: I90d72698d509b4f03263edcf7c67e44fcef0beb6 Reviewed-on: https://swiftshader-review.googlesource.com/19388Tested-by: 's avatarNicolas Capens <nicolascapens@google.com> Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com>
parent 41b77484
......@@ -13,9 +13,9 @@
// limitations under the License.
#define MAJOR_VERSION 4
#define MINOR_VERSION 0
#define MINOR_VERSION 1
#define BUILD_VERSION 0
#define BUILD_REVISION 7
#define BUILD_REVISION 0
#define STRINGIFY(x) #x
#define MACRO_STRINGIFY(x) STRINGIFY(x)
......
......@@ -576,7 +576,7 @@ EGLContext Display::createContext(EGLConfig configHandle, const egl::Context *sh
{
if(libGLESv2)
{
context = libGLESv2->es2CreateContext(this, shareContext, clientVersion, config);
context = libGLESv2->es2CreateContext(this, shareContext, config);
}
}
else
......
......@@ -45,8 +45,8 @@
namespace es2
{
Context::Context(egl::Display *display, const Context *shareContext, EGLint clientVersion, const egl::Config *config)
: egl::Context(display), clientVersion(clientVersion), config(config)
Context::Context(egl::Display *display, const Context *shareContext, const egl::Config *config)
: egl::Context(display), config(config)
{
sw::Context *context = new sw::Context();
device = new es2::Device(context);
......@@ -316,7 +316,7 @@ void Context::makeCurrent(gl::Surface *surface)
EGLint Context::getClientVersion() const
{
return clientVersion;
return 3;
}
EGLint Context::getConfigID() const
......@@ -1603,48 +1603,26 @@ bool Context::getBuffer(GLenum target, es2::Buffer **buffer) const
*buffer = getElementArrayBuffer();
break;
case GL_COPY_READ_BUFFER:
if(clientVersion >= 3)
{
*buffer = getCopyReadBuffer();
break;
}
else return false;
case GL_COPY_WRITE_BUFFER:
if(clientVersion >= 3)
{
*buffer = getCopyWriteBuffer();
break;
}
else return false;
case GL_PIXEL_PACK_BUFFER:
if(clientVersion >= 3)
{
*buffer = getPixelPackBuffer();
break;
}
else return false;
case GL_PIXEL_UNPACK_BUFFER:
if(clientVersion >= 3)
{
*buffer = getPixelUnpackBuffer();
break;
}
else return false;
case GL_TRANSFORM_FEEDBACK_BUFFER:
if(clientVersion >= 3)
{
TransformFeedback* transformFeedback = getTransformFeedback();
*buffer = transformFeedback ? static_cast<es2::Buffer*>(transformFeedback->getGenericBuffer()) : nullptr;
break;
}
else return false;
break;
case GL_UNIFORM_BUFFER:
if(clientVersion >= 3)
{
*buffer = getGenericUniformBuffer();
break;
}
else return false;
default:
return false;
}
......@@ -2195,14 +2173,6 @@ template<typename T> bool Context::getIntegerv(GLenum pname, T *params) const
case GL_MAX_COLOR_ATTACHMENTS: // Note: MAX_COLOR_ATTACHMENTS_EXT added by GL_EXT_draw_buffers
*params = MAX_COLOR_ATTACHMENTS;
return true;
default:
break;
}
if(clientVersion >= 3)
{
switch(pname)
{
case GL_TEXTURE_BINDING_2D_ARRAY:
if(mState.activeSampler > MAX_COMBINED_TEXTURE_IMAGE_UNITS - 1)
{
......@@ -2219,7 +2189,10 @@ template<typename T> bool Context::getIntegerv(GLenum pname, T *params) const
*params = mState.copyWriteBuffer.name();
return true;
case GL_MAJOR_VERSION:
*params = clientVersion;
*params = 3;
return true;
case GL_MINOR_VERSION:
*params = 0;
return true;
case GL_MAX_3D_TEXTURE_SIZE:
*params = IMPLEMENTATION_MAX_3D_TEXTURE_SIZE;
......@@ -2305,9 +2278,6 @@ template<typename T> bool Context::getIntegerv(GLenum pname, T *params) const
// undefined."
*params = MIN_PROGRAM_TEXEL_OFFSET;
return true;
case GL_MINOR_VERSION:
*params = 0;
return true;
case GL_NUM_EXTENSIONS:
GLuint numExtensions;
getExtensions(0, &numExtensions);
......@@ -2403,7 +2373,6 @@ template<typename T> bool Context::getIntegerv(GLenum pname, T *params) const
default:
break;
}
}
return false;
}
......@@ -3335,7 +3304,7 @@ void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum
return error(GL_INVALID_OPERATION);
}
if(!IsValidReadPixelsFormatType(framebuffer, format, type, clientVersion))
if(!IsValidReadPixelsFormatType(framebuffer, format, type))
{
return error(GL_INVALID_OPERATION);
}
......@@ -4429,7 +4398,7 @@ const GLubyte *Context::getExtensions(GLuint index, GLuint *numExt) const
// OES extensions
// EXT extensions
// Vendor extensions
static const char *es2extensions[] =
static const char *extensions[] =
{
"GL_OES_compressed_ETC1_RGB8_texture",
"GL_OES_depth24",
......@@ -4454,6 +4423,7 @@ const GLubyte *Context::getExtensions(GLuint index, GLuint *numExt) const
"GL_OES_vertex_array_object",
"GL_OES_vertex_half_float",
"GL_EXT_blend_minmax",
"GL_EXT_color_buffer_float", // OpenGL ES 3.0 specific.
"GL_EXT_color_buffer_half_float",
"GL_EXT_draw_buffers",
"GL_EXT_instanced_arrays",
......@@ -4481,19 +4451,7 @@ const GLubyte *Context::getExtensions(GLuint index, GLuint *numExt) const
"GL_NV_read_depth",
};
// Extensions exclusive to OpenGL ES 3.0 and above.
static const char *es3extensions[] =
{
"GL_EXT_color_buffer_float",
};
GLuint numES2extensions = sizeof(es2extensions) / sizeof(es2extensions[0]);
GLuint numExtensions = numES2extensions;
if(clientVersion >= 3)
{
numExtensions += sizeof(es3extensions) / sizeof(es3extensions[0]);
}
GLuint numExtensions = sizeof(extensions) / sizeof(extensions[0]);
if(numExt)
{
......@@ -4508,19 +4466,11 @@ const GLubyte *Context::getExtensions(GLuint index, GLuint *numExt) const
if(extensionsCat.empty() && (numExtensions > 0))
{
for(const char *extension : es2extensions)
{
extensionsCat += std::string(extension) + " ";
}
if(clientVersion >= 3)
{
for(const char *extension : es3extensions)
for(const char *extension : extensions)
{
extensionsCat += std::string(extension) + " ";
}
}
}
return (const GLubyte*)extensionsCat.c_str();
}
......@@ -4530,20 +4480,12 @@ const GLubyte *Context::getExtensions(GLuint index, GLuint *numExt) const
return nullptr;
}
if(index < numES2extensions)
{
return (const GLubyte*)es2extensions[index];
}
else
{
return (const GLubyte*)es3extensions[index - numES2extensions];
}
return (const GLubyte*)extensions[index];
}
}
NO_SANITIZE_FUNCTION egl::Context *es2CreateContext(egl::Display *display, const egl::Context *shareContext, int clientVersion, const egl::Config *config)
NO_SANITIZE_FUNCTION egl::Context *es2CreateContext(egl::Display *display, const egl::Context *shareContext, const egl::Config *config)
{
ASSERT(!shareContext || shareContext->getClientVersion() == clientVersion); // Should be checked by eglCreateContext
return new es2::Context(display, static_cast<const es2::Context*>(shareContext), clientVersion, config);
return new es2::Context(display, static_cast<const es2::Context*>(shareContext), config);
}
......@@ -430,7 +430,7 @@ struct State
class [[clang::lto_visibility_public]] Context : public egl::Context
{
public:
Context(egl::Display *display, const Context *shareContext, EGLint clientVersion, const egl::Config *config);
Context(egl::Display *display, const Context *shareContext, const egl::Config *config);
void makeCurrent(gl::Surface *surface) override;
EGLint getClientVersion() const override;
......@@ -725,7 +725,6 @@ private:
Query *createQuery(GLuint handle, GLenum type);
const EGLint clientVersion;
const egl::Config *const config;
State mState;
......
......@@ -329,8 +329,6 @@ GLenum Framebuffer::completeness(int &width, int &height, int &samples)
height = -1;
samples = -1;
GLint version = egl::getClientVersion();
for(int i = 0; i < MAX_COLOR_ATTACHMENTS; i++)
{
if(mColorbufferType[i] != GL_NONE)
......@@ -349,7 +347,7 @@ GLenum Framebuffer::completeness(int &width, int &height, int &samples)
if(IsRenderbuffer(mColorbufferType[i]))
{
if(!IsColorRenderable(colorbuffer->getFormat(), version))
if(!IsColorRenderable(colorbuffer->getFormat()))
{
return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
}
......@@ -358,7 +356,7 @@ GLenum Framebuffer::completeness(int &width, int &height, int &samples)
{
GLenum format = colorbuffer->getFormat();
if(!IsColorRenderable(format, version))
if(!IsColorRenderable(format))
{
return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
}
......@@ -382,11 +380,6 @@ GLenum Framebuffer::completeness(int &width, int &height, int &samples)
}
else
{
if(version < 3 && (width != colorbuffer->getWidth() || height != colorbuffer->getHeight()))
{
return GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS;
}
if(samples != colorbuffer->getSamples())
{
return GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE;
......@@ -417,7 +410,7 @@ GLenum Framebuffer::completeness(int &width, int &height, int &samples)
if(IsRenderbuffer(mDepthbufferType))
{
if(!es2::IsDepthRenderable(depthbuffer->getFormat(), version))
if(!es2::IsDepthRenderable(depthbuffer->getFormat()))
{
return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
}
......@@ -443,11 +436,6 @@ GLenum Framebuffer::completeness(int &width, int &height, int &samples)
}
else
{
if(version < 3 && (width != depthbuffer->getWidth() || height != depthbuffer->getHeight()))
{
return GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS;
}
if(samples != depthbuffer->getSamples())
{
return GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE;
......@@ -474,7 +462,7 @@ GLenum Framebuffer::completeness(int &width, int &height, int &samples)
if(IsRenderbuffer(mStencilbufferType))
{
if(!es2::IsStencilRenderable(stencilbuffer->getFormat(), version))
if(!es2::IsStencilRenderable(stencilbuffer->getFormat()))
{
return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
}
......@@ -502,11 +490,6 @@ GLenum Framebuffer::completeness(int &width, int &height, int &samples)
}
else
{
if(version < 3 && (width != stencilbuffer->getWidth() || height != stencilbuffer->getHeight()))
{
return GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS;
}
if(samples != stencilbuffer->getSamples())
{
return GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE;
......@@ -517,7 +500,7 @@ GLenum Framebuffer::completeness(int &width, int &height, int &samples)
}
}
if((version >= 3) && depthbuffer && stencilbuffer && (depthbuffer != stencilbuffer))
if(depthbuffer && stencilbuffer && (depthbuffer != stencilbuffer))
{
// In the GLES 3.0 spec, section 4.4.4, Framebuffer Completeness:
// "The framebuffer object target is said to be framebuffer complete if all the following conditions are true:
......@@ -716,7 +699,7 @@ DefaultFramebuffer::DefaultFramebuffer()
DefaultFramebuffer::DefaultFramebuffer(Colorbuffer *colorbuffer, DepthStencilbuffer *depthStencil)
{
GLenum defaultRenderbufferType = egl::getClientVersion() < 3 ? GL_RENDERBUFFER : GL_FRAMEBUFFER_DEFAULT;
GLenum defaultRenderbufferType = GL_FRAMEBUFFER_DEFAULT;
mColorbufferPointer[0] = new Renderbuffer(0, colorbuffer);
mColorbufferType[0] = defaultRenderbufferType;
......@@ -732,8 +715,8 @@ DefaultFramebuffer::DefaultFramebuffer(Colorbuffer *colorbuffer, DepthStencilbuf
mDepthbufferPointer = depthStencilRenderbuffer;
mStencilbufferPointer = depthStencilRenderbuffer;
mDepthbufferType = (depthStencilRenderbuffer->getDepthSize() != 0) ? defaultRenderbufferType : GL_NONE;
mStencilbufferType = (depthStencilRenderbuffer->getStencilSize() != 0) ? defaultRenderbufferType : GL_NONE;
mDepthbufferType = (depthStencilRenderbuffer->getDepthSize() != 0) ? GL_FRAMEBUFFER_DEFAULT : GL_NONE;
mStencilbufferType = (depthStencilRenderbuffer->getStencilSize() != 0) ? GL_FRAMEBUFFER_DEFAULT : GL_NONE;
}
}
......@@ -232,14 +232,6 @@ void Shader::compile()
}
shaderVersion = compiler->getShaderVersion();
int clientVersion = es2::getContext()->getClientVersion();
if(shaderVersion >= 300 && clientVersion < 3)
{
infoLog = "GLSL ES 3.00 is not supported by OpenGL ES 2.0 contexts";
success = false;
}
infoLog += compiler->getInfoSink().info.c_str();
if(!success)
......
......@@ -772,7 +772,7 @@ bool Texture2D::isMipmapComplete() const
bool Texture2D::isCompressed(GLenum target, GLint level) const
{
return IsCompressed(getFormat(target, level), egl::getClientVersion());
return IsCompressed(getFormat(target, level));
}
bool Texture2D::isDepth(GLenum target, GLint level) const
......@@ -1057,8 +1057,7 @@ void TextureCubeMap::setCompressedImage(GLenum target, GLint level, GLenum forma
image[face][level]->release();
}
int border = (egl::getClientVersion() >= 3) ? 1 : 0;
image[face][level] = egl::Image::create(this, width, height, 1, border, format);
image[face][level] = egl::Image::create(this, width, height, 1, 1, format);
if(!image[face][level])
{
......@@ -1242,7 +1241,7 @@ void TextureCubeMap::updateBorders(int level)
bool TextureCubeMap::isCompressed(GLenum target, GLint level) const
{
return IsCompressed(getFormat(target, level), egl::getClientVersion());
return IsCompressed(getFormat(target, level));
}
bool TextureCubeMap::isDepth(GLenum target, GLint level) const
......@@ -1264,8 +1263,7 @@ void TextureCubeMap::setImage(GLenum target, GLint level, GLsizei width, GLsizei
image[face][level]->release();
}
int border = (egl::getClientVersion() >= 3) ? 1 : 0;
image[face][level] = egl::Image::create(this, width, height, 1, border, internalformat);
image[face][level] = egl::Image::create(this, width, height, 1, 1, internalformat);
if(!image[face][level])
{
......@@ -1284,8 +1282,7 @@ void TextureCubeMap::copyImage(GLenum target, GLint level, GLenum internalformat
image[face][level]->release();
}
int border = (egl::getClientVersion() >= 3) ? 1 : 0;
image[face][level] = egl::Image::create(this, width, height, 1, border, internalformat);
image[face][level] = egl::Image::create(this, width, height, 1, 1, internalformat);
if(!image[face][level])
{
......@@ -1377,8 +1374,7 @@ void TextureCubeMap::generateMipmaps()
image[f][i]->release();
}
int border = (egl::getClientVersion() >= 3) ? 1 : 0;
image[f][i] = egl::Image::create(this, std::max(image[f][mBaseLevel]->getWidth() >> i, 1), std::max(image[f][mBaseLevel]->getHeight() >> i, 1), 1, border, image[f][mBaseLevel]->getFormat());
image[f][i] = egl::Image::create(this, std::max(image[f][mBaseLevel]->getWidth() >> i, 1), std::max(image[f][mBaseLevel]->getHeight() >> i, 1), 1, 1, image[f][mBaseLevel]->getFormat());
if(!image[f][i])
{
......@@ -1782,7 +1778,7 @@ bool Texture3D::isMipmapComplete() const
bool Texture3D::isCompressed(GLenum target, GLint level) const
{
return IsCompressed(getFormat(target, level), egl::getClientVersion());
return IsCompressed(getFormat(target, level));
}
bool Texture3D::isDepth(GLenum target, GLint level) const
......
......@@ -1208,7 +1208,7 @@ void GL_APIENTRY Register(const char *licenseKey)
}
}
egl::Context *es2CreateContext(egl::Display *display, const egl::Context *shareContext, int clientVersion, const egl::Config *config);
egl::Context *es2CreateContext(egl::Display *display, const egl::Context *shareContext, const egl::Config *config);
extern "C" __eglMustCastToProperFunctionPointerType es2GetProcAddress(const char *procname);
egl::Image *createBackBuffer(int width, int height, sw::Format format, int multiSampleDepth);
egl::Image *createBackBufferFromClientBuffer(const egl::ClientBuffer& clientBuffer);
......
......@@ -183,8 +183,6 @@ void BindBuffer(GLenum target, GLuint buffer)
if(context)
{
GLint clientVersion = egl::getClientVersion();
switch(target)
{
case GL_ARRAY_BUFFER:
......@@ -194,47 +192,23 @@ void BindBuffer(GLenum target, GLuint buffer)
context->bindElementArrayBuffer(buffer);
return;
case GL_COPY_READ_BUFFER:
if(clientVersion >= 3)
{
context->bindCopyReadBuffer(buffer);
return;
}
else return error(GL_INVALID_ENUM);
case GL_COPY_WRITE_BUFFER:
if(clientVersion >= 3)
{
context->bindCopyWriteBuffer(buffer);
return;
}
else return error(GL_INVALID_ENUM);
case GL_PIXEL_PACK_BUFFER:
if(clientVersion >= 3)
{
context->bindPixelPackBuffer(buffer);
return;
}
else return error(GL_INVALID_ENUM);
case GL_PIXEL_UNPACK_BUFFER:
if(clientVersion >= 3)
{
context->bindPixelUnpackBuffer(buffer);
return;
}
else return error(GL_INVALID_ENUM);
case GL_TRANSFORM_FEEDBACK_BUFFER:
if(clientVersion >= 3)
{
context->bindTransformFeedbackBuffer(buffer);
return;
}
else return error(GL_INVALID_ENUM);
case GL_UNIFORM_BUFFER:
if(clientVersion >= 3)
{
context->bindGenericUniformBuffer(buffer);
return;
}
else return error(GL_INVALID_ENUM);
default:
return error(GL_INVALID_ENUM);
}
......@@ -302,8 +276,6 @@ void BindTexture(GLenum target, GLuint texture)
return error(GL_INVALID_OPERATION);
}
GLint clientVersion = context->getClientVersion();
switch(target)
{
case GL_TEXTURE_2D:
......@@ -316,10 +288,6 @@ void BindTexture(GLenum target, GLuint texture)
context->bindTexture(TEXTURE_EXTERNAL, texture);
break;
case GL_TEXTURE_2D_ARRAY:
if(clientVersion < 3)
{
return error(GL_INVALID_ENUM);
}
context->bindTexture(TEXTURE_2D_ARRAY, texture);
break;
case GL_TEXTURE_3D:
......@@ -398,8 +366,6 @@ void BlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dst
TRACE("(GLenum srcRGB = 0x%X, GLenum dstRGB = 0x%X, GLenum srcAlpha = 0x%X, GLenum dstAlpha = 0x%X)",
srcRGB, dstRGB, srcAlpha, dstAlpha);
GLint clientVersion = egl::getClientVersion();
switch(srcRGB)
{
case GL_ZERO:
......@@ -440,10 +406,6 @@ void BlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dst
case GL_ONE_MINUS_CONSTANT_ALPHA:
break;
case GL_SRC_ALPHA_SATURATE:
if(clientVersion < 3)
{
return error(GL_INVALID_ENUM);
}
break;
default:
return error(GL_INVALID_ENUM);
......@@ -489,10 +451,6 @@ void BlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dst
case GL_ONE_MINUS_CONSTANT_ALPHA:
break;
case GL_SRC_ALPHA_SATURATE:
if(clientVersion < 3)
{
return error(GL_INVALID_ENUM);
}
break;
default:
return error(GL_INVALID_ENUM);
......@@ -518,8 +476,6 @@ void BufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage
return error(GL_INVALID_VALUE);
}
GLint clientVersion = egl::getClientVersion();
switch(usage)
{
case GL_STREAM_DRAW:
......@@ -532,10 +488,6 @@ void BufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage
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);
......@@ -744,7 +696,7 @@ void CompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLs
return error(GL_INVALID_VALUE);
}
if(!IsCompressed(internalformat, egl::getClientVersion()))
if(!IsCompressed(internalformat))
{
return error(GL_INVALID_ENUM);
}
......@@ -879,7 +831,7 @@ void CompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yo
{
es2::Texture2D *texture = context->getTexture2D(target);
GLenum validationError = ValidateSubImageParams(true, false, target, level, xoffset, yoffset, width, height, format, GL_NONE, texture, context->getClientVersion());
GLenum validationError = ValidateSubImageParams(true, false, target, level, xoffset, yoffset, width, height, format, GL_NONE, texture);
if(validationError != GL_NO_ERROR)
{
return error(validationError);
......@@ -891,7 +843,7 @@ void CompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yo
{
es2::TextureCubeMap *texture = context->getTextureCubeMap();
GLenum validationError = ValidateSubImageParams(true, false, target, level, xoffset, yoffset, width, height, format, GL_NONE, texture, context->getClientVersion());
GLenum validationError = ValidateSubImageParams(true, false, target, level, xoffset, yoffset, width, height, format, GL_NONE, texture);
if(validationError != GL_NO_ERROR)
{
return error(validationError);
......@@ -1096,7 +1048,7 @@ void CopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
}
else UNREACHABLE(target);
GLenum validationError = ValidateSubImageParams(false, true, target, level, xoffset, yoffset, width, height, GL_NONE, GL_NONE, texture, context->getClientVersion());
GLenum validationError = ValidateSubImageParams(false, true, target, level, xoffset, yoffset, width, height, GL_NONE, GL_NONE, texture);
if(validationError != GL_NO_ERROR)
{
return error(validationError);
......@@ -1943,48 +1895,8 @@ void FramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuff
}
}
GLint clientVersion = context->getClientVersion();
switch(attachment)
{
case GL_COLOR_ATTACHMENT0:
case GL_COLOR_ATTACHMENT1:
case GL_COLOR_ATTACHMENT2:
case GL_COLOR_ATTACHMENT3:
case GL_COLOR_ATTACHMENT4:
case GL_COLOR_ATTACHMENT5:
case GL_COLOR_ATTACHMENT6:
case GL_COLOR_ATTACHMENT7:
case GL_COLOR_ATTACHMENT8:
case GL_COLOR_ATTACHMENT9:
case GL_COLOR_ATTACHMENT10:
case GL_COLOR_ATTACHMENT11:
case GL_COLOR_ATTACHMENT12:
case GL_COLOR_ATTACHMENT13:
case GL_COLOR_ATTACHMENT14:
case GL_COLOR_ATTACHMENT15:
case GL_COLOR_ATTACHMENT16:
case GL_COLOR_ATTACHMENT17:
case GL_COLOR_ATTACHMENT18:
case GL_COLOR_ATTACHMENT19:
case GL_COLOR_ATTACHMENT20:
case GL_COLOR_ATTACHMENT21:
case GL_COLOR_ATTACHMENT22:
case GL_COLOR_ATTACHMENT23:
case GL_COLOR_ATTACHMENT24:
case GL_COLOR_ATTACHMENT25:
case GL_COLOR_ATTACHMENT26:
case GL_COLOR_ATTACHMENT27:
case GL_COLOR_ATTACHMENT28:
case GL_COLOR_ATTACHMENT29:
case GL_COLOR_ATTACHMENT30:
case GL_COLOR_ATTACHMENT31:
if((attachment - GL_COLOR_ATTACHMENT0) >= MAX_COLOR_ATTACHMENTS)
{
return error(GL_INVALID_ENUM);
}
framebuffer->setColorbuffer(GL_RENDERBUFFER, renderbuffer, attachment - GL_COLOR_ATTACHMENT0);
break;
case GL_DEPTH_ATTACHMENT:
framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer);
break;
......@@ -1992,16 +1904,17 @@ void FramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuff
framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer);
break;
case GL_DEPTH_STENCIL_ATTACHMENT:
if(clientVersion >= 3)
{
framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer);
framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer);
break;
}
else return error(GL_INVALID_ENUM);
default:
if((attachment - GL_COLOR_ATTACHMENT0) >= MAX_COLOR_ATTACHMENTS)
{
return error(GL_INVALID_ENUM);
}
framebuffer->setColorbuffer(GL_RENDERBUFFER, renderbuffer, attachment - GL_COLOR_ATTACHMENT0);
break;
}
}
}
......@@ -2019,8 +1932,6 @@ void FramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GL
if(context)
{
GLint clientVersion = context->getClientVersion();
if(texture == 0)
{
textarget = GL_NONE;
......@@ -2063,7 +1974,7 @@ void FramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GL
return error(GL_INVALID_ENUM);
}
if((level != 0) && ((clientVersion < 3) || (textarget == GL_TEXTURE_RECTANGLE_ARB)))
if((textarget == GL_TEXTURE_RECTANGLE_ARB) && (level != 0))
{
return error(GL_INVALID_VALUE);
}
......@@ -2099,57 +2010,20 @@ void FramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GL
switch(attachment)
{
case GL_COLOR_ATTACHMENT0:
case GL_COLOR_ATTACHMENT1:
case GL_COLOR_ATTACHMENT2:
case GL_COLOR_ATTACHMENT3:
case GL_COLOR_ATTACHMENT4:
case GL_COLOR_ATTACHMENT5:
case GL_COLOR_ATTACHMENT6:
case GL_COLOR_ATTACHMENT7:
case GL_COLOR_ATTACHMENT8:
case GL_COLOR_ATTACHMENT9:
case GL_COLOR_ATTACHMENT10:
case GL_COLOR_ATTACHMENT11:
case GL_COLOR_ATTACHMENT12:
case GL_COLOR_ATTACHMENT13:
case GL_COLOR_ATTACHMENT14:
case GL_COLOR_ATTACHMENT15:
case GL_COLOR_ATTACHMENT16:
case GL_COLOR_ATTACHMENT17:
case GL_COLOR_ATTACHMENT18:
case GL_COLOR_ATTACHMENT19:
case GL_COLOR_ATTACHMENT20:
case GL_COLOR_ATTACHMENT21:
case GL_COLOR_ATTACHMENT22:
case GL_COLOR_ATTACHMENT23:
case GL_COLOR_ATTACHMENT24:
case GL_COLOR_ATTACHMENT25:
case GL_COLOR_ATTACHMENT26:
case GL_COLOR_ATTACHMENT27:
case GL_COLOR_ATTACHMENT28:
case GL_COLOR_ATTACHMENT29:
case GL_COLOR_ATTACHMENT30:
case GL_COLOR_ATTACHMENT31:
if((attachment - GL_COLOR_ATTACHMENT0) >= MAX_COLOR_ATTACHMENTS)
{
return error(GL_INVALID_ENUM);
}
framebuffer->setColorbuffer(textarget, texture, attachment - GL_COLOR_ATTACHMENT0, level);
break;
case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level); break;
case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level); break;
case GL_DEPTH_STENCIL_ATTACHMENT:
if(clientVersion >= 3)
{
framebuffer->setDepthbuffer(textarget, texture, level);
framebuffer->setStencilbuffer(textarget, texture, level);
break;
}
else return error(GL_INVALID_ENUM);
default:
if((attachment - GL_COLOR_ATTACHMENT0) >= MAX_COLOR_ATTACHMENTS)
{
return error(GL_INVALID_ENUM);
}
framebuffer->setColorbuffer(textarget, texture, attachment - GL_COLOR_ATTACHMENT0, level);
break;
}
}
}
......@@ -2205,8 +2079,6 @@ void GenerateMipmap(GLenum target)
{
es2::Texture *texture = nullptr;
GLint clientVersion = context->getClientVersion();
switch(target)
{
case GL_TEXTURE_2D:
......@@ -2224,14 +2096,7 @@ void GenerateMipmap(GLenum target)
}
break;
case GL_TEXTURE_2D_ARRAY:
if(clientVersion < 3)
{
return error(GL_INVALID_ENUM);
}
else
{
texture = context->getTexture2DArray();
}
break;
case GL_TEXTURE_3D:
texture = context->getTexture3D();
......@@ -2243,7 +2108,7 @@ void GenerateMipmap(GLenum target)
return error(GL_INVALID_ENUM);
}
if(!IsMipmappable(texture->getFormat(target, texture->getBaseLevel()), clientVersion))
if(!IsMipmappable(texture->getFormat(target, texture->getBaseLevel())))
{
return error(GL_INVALID_OPERATION);
}
......@@ -2570,8 +2435,6 @@ void GetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
return error(GL_INVALID_OPERATION);
}
GLint clientVersion = context->getClientVersion();
switch(pname)
{
case GL_BUFFER_USAGE:
......@@ -2581,33 +2444,17 @@ void GetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
*params = (GLint)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 = (GLint)buffer->length();
break;
}
else return error(GL_INVALID_ENUM);
case GL_BUFFER_MAP_OFFSET:
if(clientVersion >= 3)
{
*params = (GLint)buffer->offset();
break;
}
else return error(GL_INVALID_ENUM);
default:
return error(GL_INVALID_ENUM);
}
......@@ -2725,26 +2572,11 @@ void GetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenu
framebufferName = context->getDrawFramebufferName();
}
GLint clientVersion = context->getClientVersion();
if(framebufferName == 0) // Default framebuffer.
{
if(clientVersion < 3)
{
return error(GL_INVALID_OPERATION);
}
}
switch(attachment)
{
case GL_BACK:
case GL_DEPTH:
case GL_STENCIL:
if(clientVersion < 3)
{
return error(GL_INVALID_ENUM);
}
if(framebufferName != 0)
{
return error(GL_INVALID_OPERATION);
......@@ -2758,11 +2590,6 @@ void GetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenu
}
break;
case GL_DEPTH_STENCIL_ATTACHMENT:
if(clientVersion < 3)
{
return error(GL_INVALID_ENUM);
}
if(framebufferName == 0)
{
return error(GL_INVALID_OPERATION);
......@@ -2868,7 +2695,7 @@ void GetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenu
case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
if(attachmentObjectType == GL_TEXTURE)
{
*params = clientVersion < 3 ? 0 : renderbuffer->getLevel(); // glFramebufferTexture2D does not allow level to be set to anything else in GL ES 2.0
*params = renderbuffer->getLevel();
}
else
{
......@@ -2893,53 +2720,25 @@ void GetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenu
}
break;
case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
if(clientVersion >= 3)
{
*params = attachmentLayer;
}
else return error(GL_INVALID_ENUM);
break;
case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
if(clientVersion >= 3)
{
*params = renderbuffer->getRedSize();
}
else return error(GL_INVALID_ENUM);
break;
case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
if(clientVersion >= 3)
{
*params = renderbuffer->getGreenSize();
}
else return error(GL_INVALID_ENUM);
break;
case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
if(clientVersion >= 3)
{
*params = renderbuffer->getBlueSize();
}
else return error(GL_INVALID_ENUM);
break;
case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
if(clientVersion >= 3)
{
*params = renderbuffer->getAlphaSize();
}
else return error(GL_INVALID_ENUM);
break;
case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
if(clientVersion >= 3)
{
*params = renderbuffer->getDepthSize();
}
else return error(GL_INVALID_ENUM);
break;
case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
if(clientVersion >= 3)
{
*params = renderbuffer->getStencilSize();
}
else return error(GL_INVALID_ENUM);
break;
case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
// case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT: // GL_EXT_color_buffer_half_float
......@@ -2951,11 +2750,7 @@ void GetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenu
*params = GetComponentType(renderbuffer->getFormat(), attachment);
break;
case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
if(clientVersion >= 3)
{
*params = GetColorEncoding(renderbuffer->getFormat());
}
else return error(GL_INVALID_ENUM);
break;
default:
return error(GL_INVALID_ENUM);
......@@ -2976,24 +2771,13 @@ void GetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenu
*params = GL_NONE;
break;
case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
if(clientVersion < 3)
{
return error(GL_INVALID_ENUM);
}
*params = 0;
break;
default:
if(clientVersion < 3)
{
return error(GL_INVALID_ENUM);
}
else
{
return error(GL_INVALID_OPERATION);
}
}
}
}
}
GLenum GetGraphicsResetStatusEXT(void)
......@@ -3107,8 +2891,6 @@ void GetProgramiv(GLuint program, GLenum pname, GLint* params)
}
}
GLint clientVersion = egl::getClientVersion();
switch(pname)
{
case GL_DELETE_STATUS:
......@@ -3139,54 +2921,26 @@ void GetProgramiv(GLuint program, GLenum pname, GLint* params)
*params = programObject->getActiveUniformMaxLength();
return;
case GL_ACTIVE_UNIFORM_BLOCKS:
if(clientVersion >= 3)
{
*params = (GLint)programObject->getActiveUniformBlockCount();
return;
}
else return error(GL_INVALID_ENUM);
case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
if(clientVersion >= 3)
{
*params = programObject->getActiveUniformBlockMaxLength();
return;
}
else return error(GL_INVALID_ENUM);
case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
if(clientVersion >= 3)
{
*params = programObject->getTransformFeedbackBufferMode();
return;
}
else return error(GL_INVALID_ENUM);
case GL_TRANSFORM_FEEDBACK_VARYINGS:
if(clientVersion >= 3)
{
*params = programObject->getTransformFeedbackVaryingCount();
return;
}
else return error(GL_INVALID_ENUM);
case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
if(clientVersion >= 3)
{
*params = programObject->getTransformFeedbackVaryingMaxLength();
return;
}
else return error(GL_INVALID_ENUM);
case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
if(clientVersion >= 3)
{
*params = programObject->getBinaryRetrievableHint();
return;
}
else return error(GL_INVALID_ENUM);
case GL_PROGRAM_BINARY_LENGTH:
if(clientVersion >= 3)
{
*params = programObject->getBinaryLength();
return;
}
else return error(GL_INVALID_ENUM);
default:
return error(GL_INVALID_ENUM);
}
......@@ -3488,19 +3242,9 @@ const GLubyte* GetString(GLenum name)
case GL_RENDERER:
return (GLubyte*)"Google SwiftShader";
case GL_VERSION:
{
es2::Context *context = es2::getContext();
return (context && (context->getClientVersion() >= 3)) ?
(GLubyte*)"OpenGL ES 3.0 SwiftShader " VERSION_STRING :
(GLubyte*)"OpenGL ES 2.0 SwiftShader " VERSION_STRING;
}
return (GLubyte*)"OpenGL ES 3.0 SwiftShader " VERSION_STRING;
case GL_SHADING_LANGUAGE_VERSION:
{
es2::Context *context = es2::getContext();
return (context && (context->getClientVersion() >= 3)) ?
(GLubyte*)"OpenGL ES GLSL ES 3.00 SwiftShader " VERSION_STRING :
(GLubyte*)"OpenGL ES GLSL ES 1.00 SwiftShader " VERSION_STRING;
}
return (GLubyte*)"OpenGL ES GLSL ES 3.00 SwiftShader " VERSION_STRING;
case GL_EXTENSIONS:
{
es2::Context *context = es2::getContext();
......@@ -3521,35 +3265,14 @@ void GetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
{
es2::Texture *texture;
GLint clientVersion = context->getClientVersion();
switch(target)
{
case GL_TEXTURE_2D:
texture = context->getTexture2D();
break;
case GL_TEXTURE_CUBE_MAP:
texture = context->getTextureCubeMap();
break;
case GL_TEXTURE_EXTERNAL_OES:
texture = context->getTextureExternal();
break;
case GL_TEXTURE_2D_ARRAY:
if(clientVersion < 3)
{
return error(GL_INVALID_ENUM);
}
else
{
texture = context->getTexture2DArray();
}
break;
case GL_TEXTURE_3D:
texture = context->getTexture3D();
break;
case GL_TEXTURE_RECTANGLE_ARB:
texture = context->getTexture2DRect();
break;
case GL_TEXTURE_2D: texture = context->getTexture2D(); break;
case GL_TEXTURE_2D_ARRAY: texture = context->getTexture2DArray(); break;
case GL_TEXTURE_3D: texture = context->getTexture3D(); break;
case GL_TEXTURE_CUBE_MAP: texture = context->getTextureCubeMap(); break;
case GL_TEXTURE_EXTERNAL_OES: texture = context->getTextureExternal(); break;
case GL_TEXTURE_RECTANGLE_ARB: texture = context->getTexture2DRect(); break;
default:
return error(GL_INVALID_ENUM);
}
......@@ -3578,89 +3301,41 @@ void GetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
*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_IMMUTABLE_LEVELS:
if(clientVersion >= 3)
{
*params = (GLfloat)texture->getImmutableLevels();
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);
}
......@@ -3677,35 +3352,14 @@ void GetTexParameteriv(GLenum target, GLenum pname, GLint* params)
{
es2::Texture *texture;
GLint clientVersion = context->getClientVersion();
switch(target)
{
case GL_TEXTURE_2D:
texture = context->getTexture2D();
break;
case GL_TEXTURE_CUBE_MAP:
texture = context->getTextureCubeMap();
break;
case GL_TEXTURE_EXTERNAL_OES:
texture = context->getTextureExternal();
break;
case GL_TEXTURE_2D_ARRAY:
if(clientVersion < 3)
{
return error(GL_INVALID_ENUM);
}
else
{
texture = context->getTexture2DArray();
}
break;
case GL_TEXTURE_3D:
texture = context->getTexture3D();
break;
case GL_TEXTURE_RECTANGLE_ARB:
texture = context->getTexture2DRect();
break;
case GL_TEXTURE_2D: texture = context->getTexture2D(); break;
case GL_TEXTURE_2D_ARRAY: texture = context->getTexture2DArray(); break;
case GL_TEXTURE_3D: texture = context->getTexture3D(); break;
case GL_TEXTURE_CUBE_MAP: texture = context->getTextureCubeMap(); break;
case GL_TEXTURE_EXTERNAL_OES: texture = context->getTextureExternal(); break;
case GL_TEXTURE_RECTANGLE_ARB: texture = context->getTexture2DRect(); break;
default:
return error(GL_INVALID_ENUM);
}
......@@ -3734,89 +3388,41 @@ void GetTexParameteriv(GLenum target, GLenum pname, GLint* params)
*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_IMMUTABLE_LEVELS:
if(clientVersion >= 3)
{
*params = (GLint)texture->getImmutableLevels();
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)roundf(texture->getMaxLOD());
break;
}
else return error(GL_INVALID_ENUM);
case GL_TEXTURE_MIN_LOD:
if(clientVersion >= 3)
{
*params = (GLint)roundf(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);
}
......@@ -4024,8 +3630,6 @@ void GetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
const es2::VertexAttribute &attribState = context->getVertexAttribState(index);
GLint clientVersion = context->getClientVersion();
switch(pname)
{
case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
......@@ -4056,13 +3660,10 @@ void GetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
}
break;
case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
if(clientVersion >= 3)
{
*params = (GLfloat)(attribState.mPureInteger ? GL_TRUE : GL_FALSE);
break;
}
else return error(GL_INVALID_ENUM);
default: return error(GL_INVALID_ENUM);
default:
return error(GL_INVALID_ENUM);
}
}
}
......@@ -4082,8 +3683,6 @@ void GetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
const es2::VertexAttribute &attribState = context->getVertexAttribState(index);
GLint clientVersion = context->getClientVersion();
switch(pname)
{
case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
......@@ -4115,13 +3714,10 @@ void GetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
}
break;
case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
if(clientVersion >= 3)
{
*params = (attribState.mPureInteger ? GL_TRUE : GL_FALSE);
break;
}
else return error(GL_INVALID_ENUM);
default: return error(GL_INVALID_ENUM);
default:
return error(GL_INVALID_ENUM);
}
}
}
......@@ -4210,8 +3806,6 @@ GLboolean IsEnabled(GLenum cap)
if(context)
{
GLint clientVersion = context->getClientVersion();
switch(cap)
{
case GL_CULL_FACE: return context->isCullFaceEnabled();
......@@ -4223,18 +3817,8 @@ GLboolean IsEnabled(GLenum cap)
case GL_DEPTH_TEST: return context->isDepthTestEnabled();
case GL_BLEND: return context->isBlendEnabled();
case GL_DITHER: return context->isDitherEnabled();
case GL_PRIMITIVE_RESTART_FIXED_INDEX:
if(clientVersion >= 3)
{
return context->isPrimitiveRestartFixedIndexEnabled();
}
else return error(GL_INVALID_ENUM, false);
case GL_RASTERIZER_DISCARD:
if(clientVersion >= 3)
{
return context->isRasterizerDiscardEnabled();
}
else return error(GL_INVALID_ENUM, false);
case GL_PRIMITIVE_RESTART_FIXED_INDEX: return context->isPrimitiveRestartFixedIndexEnabled();
case GL_RASTERIZER_DISCARD: return context->isRasterizerDiscardEnabled();
default:
return error(GL_INVALID_ENUM, false);
}
......@@ -4443,8 +4027,6 @@ void PixelStorei(GLenum pname, GLint param)
if(context)
{
GLint clientVersion = context->getClientVersion();
switch(pname)
{
case GL_UNPACK_ALIGNMENT:
......@@ -4462,92 +4044,61 @@ void PixelStorei(GLenum pname, GLint param)
context->setPackAlignment(param);
break;
case GL_PACK_ROW_LENGTH:
if(clientVersion >= 3)
{
if(param < 0)
{
return error(GL_INVALID_VALUE);
}
context->setPackRowLength(param);
break;
}
else return error(GL_INVALID_ENUM);
case GL_PACK_SKIP_PIXELS:
if(clientVersion >= 3)
{
if(param < 0)
{
return error(GL_INVALID_VALUE);
}
context->setPackSkipPixels(param);
break;
}
else return error(GL_INVALID_ENUM);
case GL_PACK_SKIP_ROWS:
if(clientVersion >= 3)
{
if(param < 0)
{
return error(GL_INVALID_VALUE);
}
context->setPackSkipRows(param);
break;
}
else return error(GL_INVALID_ENUM);
case GL_UNPACK_ROW_LENGTH:
if(clientVersion >= 3)
{
if(param < 0)
{
return error(GL_INVALID_VALUE);
}
context->setUnpackRowLength(param);
break;
}
else return error(GL_INVALID_ENUM);
case GL_UNPACK_IMAGE_HEIGHT:
if(clientVersion >= 3)
{
if(param < 0)
{
return error(GL_INVALID_VALUE);
}
context->setUnpackImageHeight(param);
break;
}
else return error(GL_INVALID_ENUM);
case GL_UNPACK_SKIP_PIXELS:
if(clientVersion >= 3)
{
if(param < 0)
{
return error(GL_INVALID_VALUE);
}
context->setUnpackSkipPixels(param);
break;
}
else return error(GL_INVALID_ENUM);
case GL_UNPACK_SKIP_ROWS:
if(clientVersion >= 3)
{
if(param < 0)
{
return error(GL_INVALID_VALUE);
}
context->setUnpackSkipRows(param);
break;
}
else return error(GL_INVALID_ENUM);
case GL_UNPACK_SKIP_IMAGES:
if(clientVersion >= 3) {
if(param < 0)
{
return error(GL_INVALID_VALUE);
}
context->setUnpackSkipImages(param);
break;
}
else return error(GL_INVALID_ENUM);
default:
return error(GL_INVALID_ENUM);
}
......@@ -4648,21 +4199,19 @@ void RenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum inter
return error(GL_INVALID_OPERATION);
}
GLint clientVersion = context->getClientVersion();
if(IsColorRenderable(internalformat, clientVersion))
if(IsColorRenderable(internalformat))
{
context->setRenderbufferStorage(new es2::Colorbuffer(width, height, internalformat, samples));
}
else if(IsDepthRenderable(internalformat, clientVersion) && IsStencilRenderable(internalformat, clientVersion))
else if(IsDepthRenderable(internalformat) && IsStencilRenderable(internalformat))
{
context->setRenderbufferStorage(new es2::DepthStencilbuffer(width, height, internalformat, samples));
}
else if(IsDepthRenderable(internalformat, clientVersion))
else if(IsDepthRenderable(internalformat))
{
context->setRenderbufferStorage(new es2::Depthbuffer(width, height, internalformat, samples));
}
else if(IsStencilRenderable(internalformat, clientVersion))
else if(IsStencilRenderable(internalformat))
{
context->setRenderbufferStorage(new es2::Stencilbuffer(width, height, samples));
}
......@@ -4978,25 +4527,14 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
if(context)
{
// Core OpenGL ES 2.0 requires format and internalformat to be equal (checked below),
// but GL_APPLE_texture_format_BGRA8888 allows (only) GL_BGRA_EXT / GL_RGBA, while
// GL_APPLE_texture_format_BGRA8888 allows (only) GL_BGRA_EXT / GL_RGBA, while
// GL_EXT_texture_format_BGRA8888 also allows GL_BGRA_EXT / GL_BGRA_EXT.
if(format == GL_BGRA_EXT && internalformat == GL_RGBA)
{
internalformat = GL_BGRA_EXT;
}
GLint clientVersion = context->getClientVersion();
if(clientVersion < 3)
{
if((internalformat != (GLint)format) &&
!((type == GL_FLOAT) && (format == GL_RGBA) && (internalformat == GL_RGBA32F))) // CHROMIUM_color_buffer_float_rgba
{
return error(GL_INVALID_OPERATION);
}
}
GLenum validationError = ValidateTextureFormatType(format, type, internalformat, target, clientVersion);
GLenum validationError = ValidateTextureFormatType(format, type, internalformat, target);
if(validationError != GL_NO_ERROR)
{
return error(validationError);
......@@ -5086,35 +4624,14 @@ void TexParameterf(GLenum target, GLenum pname, GLfloat param)
{
es2::Texture *texture;
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
{
texture = context->getTexture2DArray();
}
break;
case GL_TEXTURE_3D:
texture = context->getTexture3D();
break;
case GL_TEXTURE_CUBE_MAP:
texture = context->getTextureCubeMap();
break;
case GL_TEXTURE_EXTERNAL_OES:
texture = context->getTextureExternal();
break;
case GL_TEXTURE_RECTANGLE_ARB:
texture = context->getTexture2DRect();
break;
case GL_TEXTURE_2D: texture = context->getTexture2D(); break;
case GL_TEXTURE_2D_ARRAY: texture = context->getTexture2DArray(); break;
case GL_TEXTURE_3D: texture = context->getTexture3D(); break;
case GL_TEXTURE_CUBE_MAP: texture = context->getTextureCubeMap(); break;
case GL_TEXTURE_EXTERNAL_OES: texture = context->getTextureExternal(); break;
case GL_TEXTURE_RECTANGLE_ARB: texture = context->getTexture2DRect(); break;
default:
return error(GL_INVALID_ENUM);
}
......@@ -5158,61 +4675,61 @@ void TexParameterf(GLenum target, GLenum pname, GLfloat param)
}
break;
case GL_TEXTURE_BASE_LEVEL:
if(clientVersion < 3 || !texture->setBaseLevel((GLint)(roundf(param))))
if(!texture->setBaseLevel((GLint)(roundf(param))))
{
return error(GL_INVALID_VALUE);
}
break;
case GL_TEXTURE_COMPARE_FUNC:
if(clientVersion < 3 || !texture->setCompareFunc((GLenum)param))
if(!texture->setCompareFunc((GLenum)param))
{
return error(GL_INVALID_VALUE);
}
break;
case GL_TEXTURE_COMPARE_MODE:
if(clientVersion < 3 || !texture->setCompareMode((GLenum)param))
if(!texture->setCompareMode((GLenum)param))
{
return error(GL_INVALID_VALUE);
}
break;
case GL_TEXTURE_MAX_LEVEL:
if(clientVersion < 3 || !texture->setMaxLevel((GLint)(roundf(param))))
if(!texture->setMaxLevel((GLint)(roundf(param))))
{
return error(GL_INVALID_VALUE);
}
break;
case GL_TEXTURE_MAX_LOD:
if(clientVersion < 3 || !texture->setMaxLOD(param))
if(!texture->setMaxLOD(param))
{
return error(GL_INVALID_VALUE);
}
break;
case GL_TEXTURE_MIN_LOD:
if(clientVersion < 3 || !texture->setMinLOD(param))
if(!texture->setMinLOD(param))
{
return error(GL_INVALID_VALUE);
}
break;
case GL_TEXTURE_SWIZZLE_R:
if(clientVersion < 3 || !texture->setSwizzleR((GLenum)param))
if(!texture->setSwizzleR((GLenum)param))
{
return error(GL_INVALID_VALUE);
}
break;
case GL_TEXTURE_SWIZZLE_G:
if(clientVersion < 3 || !texture->setSwizzleG((GLenum)param))
if(!texture->setSwizzleG((GLenum)param))
{
return error(GL_INVALID_VALUE);
}
break;
case GL_TEXTURE_SWIZZLE_B:
if(clientVersion < 3 || !texture->setSwizzleB((GLenum)param))
if(!texture->setSwizzleB((GLenum)param))
{
return error(GL_INVALID_VALUE);
}
break;
case GL_TEXTURE_SWIZZLE_A:
if(clientVersion < 3 || !texture->setSwizzleA((GLenum)param))
if(!texture->setSwizzleA((GLenum)param))
{
return error(GL_INVALID_VALUE);
}
......@@ -5238,35 +4755,14 @@ void TexParameteri(GLenum target, GLenum pname, GLint param)
{
es2::Texture *texture;
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
{
texture = context->getTexture2DArray();
}
break;
case GL_TEXTURE_3D:
texture = context->getTexture3D();
break;
case GL_TEXTURE_CUBE_MAP:
texture = context->getTextureCubeMap();
break;
case GL_TEXTURE_EXTERNAL_OES:
texture = context->getTextureExternal();
break;
case GL_TEXTURE_RECTANGLE_ARB:
texture = context->getTexture2DRect();
break;
case GL_TEXTURE_2D: texture = context->getTexture2D(); break;
case GL_TEXTURE_2D_ARRAY: texture = context->getTexture2DArray(); break;
case GL_TEXTURE_3D: texture = context->getTexture3D(); break;
case GL_TEXTURE_CUBE_MAP: texture = context->getTextureCubeMap(); break;
case GL_TEXTURE_EXTERNAL_OES: texture = context->getTextureExternal(); break;
case GL_TEXTURE_RECTANGLE_ARB: texture = context->getTexture2DRect(); break;
default:
return error(GL_INVALID_ENUM);
}
......@@ -5314,61 +4810,61 @@ void TexParameteri(GLenum target, GLenum pname, GLint param)
{
return error(GL_INVALID_OPERATION); // Base level has to be 0
}
if(clientVersion < 3 || !texture->setBaseLevel(param))
if(!texture->setBaseLevel(param))
{
return error(GL_INVALID_VALUE);
}
break;
case GL_TEXTURE_COMPARE_FUNC:
if(clientVersion < 3 || !texture->setCompareFunc((GLenum)param))
if(!texture->setCompareFunc((GLenum)param))
{
return error(GL_INVALID_VALUE);
}
break;
case GL_TEXTURE_COMPARE_MODE:
if(clientVersion < 3 || !texture->setCompareMode((GLenum)param))
if(!texture->setCompareMode((GLenum)param))
{
return error(GL_INVALID_VALUE);
}
break;
case GL_TEXTURE_MAX_LEVEL:
if(clientVersion < 3 || !texture->setMaxLevel(param))
if(!texture->setMaxLevel(param))
{
return error(GL_INVALID_VALUE);
}
break;
case GL_TEXTURE_MAX_LOD:
if(clientVersion < 3 || !texture->setMaxLOD((GLfloat)param))
if(!texture->setMaxLOD((GLfloat)param))
{
return error(GL_INVALID_VALUE);
}
break;
case GL_TEXTURE_MIN_LOD:
if(clientVersion < 3 || !texture->setMinLOD((GLfloat)param))
if(!texture->setMinLOD((GLfloat)param))
{
return error(GL_INVALID_VALUE);
}
break;
case GL_TEXTURE_SWIZZLE_R:
if(clientVersion < 3 || !texture->setSwizzleR((GLenum)param))
if(!texture->setSwizzleR((GLenum)param))
{
return error(GL_INVALID_VALUE);
}
break;
case GL_TEXTURE_SWIZZLE_G:
if(clientVersion < 3 || !texture->setSwizzleG((GLenum)param))
if(!texture->setSwizzleG((GLenum)param))
{
return error(GL_INVALID_VALUE);
}
break;
case GL_TEXTURE_SWIZZLE_B:
if(clientVersion < 3 || !texture->setSwizzleB((GLenum)param))
if(!texture->setSwizzleB((GLenum)param))
{
return error(GL_INVALID_VALUE);
}
break;
case GL_TEXTURE_SWIZZLE_A:
if(clientVersion < 3 || !texture->setSwizzleA((GLenum)param))
if(!texture->setSwizzleA((GLenum)param))
{
return error(GL_INVALID_VALUE);
}
......@@ -5420,7 +4916,7 @@ void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLs
{
es2::Texture2D *texture = context->getTexture2D(target);
GLenum validationError = ValidateSubImageParams(false, false, target, level, xoffset, yoffset, width, height, format, type, texture, context->getClientVersion());
GLenum validationError = ValidateSubImageParams(false, false, target, level, xoffset, yoffset, width, height, format, type, texture);
if(validationError != GL_NO_ERROR)
{
return error(validationError);
......@@ -5438,7 +4934,7 @@ void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLs
{
es2::TextureCubeMap *texture = context->getTextureCubeMap();
GLenum validationError = ValidateSubImageParams(false, false, target, level, xoffset, yoffset, width, height, format, type, texture, context->getClientVersion());
GLenum validationError = ValidateSubImageParams(false, false, target, level, xoffset, yoffset, width, height, format, type, texture);
if(validationError != GL_NO_ERROR)
{
return error(validationError);
......@@ -5778,11 +5274,6 @@ void UniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const
if(context)
{
if(context->getClientVersion() < 3 && transpose != GL_FALSE)
{
return error(GL_INVALID_VALUE);
}
es2::Program *program = context->getCurrentProgram();
if(!program)
......@@ -5816,11 +5307,6 @@ void UniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const
if(context)
{
if(context->getClientVersion() < 3 && transpose != GL_FALSE)
{
return error(GL_INVALID_VALUE);
}
es2::Program *program = context->getCurrentProgram();
if(!program)
......@@ -5854,11 +5340,6 @@ void UniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const
if(context)
{
if(context->getClientVersion() < 3 && transpose != GL_FALSE)
{
return error(GL_INVALID_VALUE);
}
es2::Program *program = context->getCurrentProgram();
if(!program)
......@@ -6100,8 +5581,6 @@ void VertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normal
return error(GL_INVALID_VALUE);
}
GLint clientVersion = egl::getClientVersion();
switch(type)
{
case GL_BYTE:
......@@ -6115,22 +5594,13 @@ void VertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normal
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:
if(clientVersion >= 3)
{
break;
}
else return error(GL_INVALID_ENUM);
default:
return error(GL_INVALID_ENUM);
}
......@@ -6253,7 +5723,7 @@ void TexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei wi
return error(GL_INVALID_OPERATION);
}
GLenum validationError = ValidateTextureFormatType(format, type, internalformat, target, egl::getClientVersion());
GLenum validationError = ValidateTextureFormatType(format, type, internalformat, target);
if(validationError != GL_NO_ERROR)
{
return error(validationError);
......@@ -6328,7 +5798,7 @@ void TexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint yoffset,
{
es2::Texture3D *texture = context->getTexture3D();
GLenum validationError = ValidateSubImageParams(false, false, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, texture, context->getClientVersion());
GLenum validationError = ValidateSubImageParams(false, false, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, texture);
if(validationError != GL_NO_ERROR)
{
return error(validationError);
......@@ -6383,7 +5853,7 @@ void CopyTexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint yoffs
es2::Texture3D *texture = context->getTexture3D();
GLenum validationError = ValidateSubImageParams(false, true, target, level, xoffset, yoffset, zoffset, width, height, 1, GL_NONE, GL_NONE, texture, context->getClientVersion());
GLenum validationError = ValidateSubImageParams(false, true, target, level, xoffset, yoffset, zoffset, width, height, 1, GL_NONE, GL_NONE, texture);
if(validationError != GL_NO_ERROR)
{
return error(validationError);
......@@ -6418,7 +5888,7 @@ void CompressedTexImage3DOES(GLenum target, GLint level, GLenum internalformat,
return error(GL_INVALID_VALUE);
}
if(!IsCompressed(internalformat, egl::getClientVersion()))
if(!IsCompressed(internalformat))
{
return error(GL_INVALID_ENUM);
}
......@@ -6475,7 +5945,7 @@ void CompressedTexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint
return error(GL_INVALID_VALUE);
}
if(!IsCompressed(format, egl::getClientVersion()))
if(!IsCompressed(format))
{
return error(GL_INVALID_ENUM);
}
......@@ -6574,57 +6044,17 @@ void FramebufferTexture3DOES(GLenum target, GLenum attachment, GLenum textarget,
return error(GL_INVALID_OPERATION);
}
GLint clientVersion = context->getClientVersion();
switch(attachment)
{
case GL_COLOR_ATTACHMENT1:
case GL_COLOR_ATTACHMENT2:
case GL_COLOR_ATTACHMENT3:
case GL_COLOR_ATTACHMENT4:
case GL_COLOR_ATTACHMENT5:
case GL_COLOR_ATTACHMENT6:
case GL_COLOR_ATTACHMENT7:
case GL_COLOR_ATTACHMENT8:
case GL_COLOR_ATTACHMENT9:
case GL_COLOR_ATTACHMENT10:
case GL_COLOR_ATTACHMENT11:
case GL_COLOR_ATTACHMENT12:
case GL_COLOR_ATTACHMENT13:
case GL_COLOR_ATTACHMENT14:
case GL_COLOR_ATTACHMENT15:
case GL_COLOR_ATTACHMENT16:
case GL_COLOR_ATTACHMENT17:
case GL_COLOR_ATTACHMENT18:
case GL_COLOR_ATTACHMENT19:
case GL_COLOR_ATTACHMENT20:
case GL_COLOR_ATTACHMENT21:
case GL_COLOR_ATTACHMENT22:
case GL_COLOR_ATTACHMENT23:
case GL_COLOR_ATTACHMENT24:
case GL_COLOR_ATTACHMENT25:
case GL_COLOR_ATTACHMENT26:
case GL_COLOR_ATTACHMENT27:
case GL_COLOR_ATTACHMENT28:
case GL_COLOR_ATTACHMENT29:
case GL_COLOR_ATTACHMENT30:
case GL_COLOR_ATTACHMENT31:
if(clientVersion < 3)
{
return error(GL_INVALID_ENUM);
}
// fall through
case GL_COLOR_ATTACHMENT0:
case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture); break;
case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture); break;
default:
if((attachment - GL_COLOR_ATTACHMENT0) >= MAX_COLOR_ATTACHMENTS)
{
return error(GL_INVALID_ENUM);
}
framebuffer->setColorbuffer(textarget, texture, attachment - GL_COLOR_ATTACHMENT0);
break;
case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture); break;
case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture); break;
default:
return error(GL_INVALID_ENUM);
}
}
}
......
......@@ -243,7 +243,7 @@ public:
void (*glGenerateMipmapOES)(GLenum target);
void (*glDrawBuffersEXT)(GLsizei n, const GLenum *bufs);
egl::Context *(*es2CreateContext)(egl::Display *display, const egl::Context *shareContext, int clientVersion, const egl::Config *config);
egl::Context *(*es2CreateContext)(egl::Display *display, const egl::Context *shareContext, const egl::Config *config);
__eglMustCastToProperFunctionPointerType (*es2GetProcAddress)(const char *procname);
egl::Image *(*createBackBuffer)(int width, int height, sw::Format format, int multiSampleDepth);
egl::Image *(*createBackBufferFromClientBuffer)(const egl::ClientBuffer& clientBuffer);
......
......@@ -368,7 +368,7 @@ GL_APICALL void GL_APIENTRY glTexImage3D(GLenum target, GLint level, GLint inter
if(context)
{
GLenum validationError = ValidateTextureFormatType(format, type, internalformat, target, context->getClientVersion());
GLenum validationError = ValidateTextureFormatType(format, type, internalformat, target);
if(validationError != GL_NO_ERROR)
{
return error(validationError);
......@@ -424,7 +424,7 @@ GL_APICALL void GL_APIENTRY glTexSubImage3D(GLenum target, GLint level, GLint xo
{
es2::Texture3D *texture = (target == GL_TEXTURE_3D) ? context->getTexture3D() : context->getTexture2DArray();
GLenum validationError = ValidateSubImageParams(false, false, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, texture, context->getClientVersion());
GLenum validationError = ValidateSubImageParams(false, false, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, texture);
if(validationError != GL_NO_ERROR)
{
return error(validationError);
......@@ -486,7 +486,7 @@ GL_APICALL void GL_APIENTRY glCopyTexSubImage3D(GLenum target, GLint level, GLin
GLenum colorbufferFormat = source->getFormat();
es2::Texture3D *texture = (target == GL_TEXTURE_3D) ? context->getTexture3D() : context->getTexture2DArray();
GLenum validationError = ValidateSubImageParams(false, true, target, level, xoffset, yoffset, zoffset, width, height, 1, GL_NONE, GL_NONE, texture, context->getClientVersion());
GLenum validationError = ValidateSubImageParams(false, true, target, level, xoffset, yoffset, zoffset, width, height, 1, GL_NONE, GL_NONE, texture);
if(validationError != GL_NO_ERROR)
{
return error(validationError);
......@@ -529,7 +529,7 @@ GL_APICALL void GL_APIENTRY glCompressedTexImage3D(GLenum target, GLint level, G
return error(GL_INVALID_VALUE);
}
if(!IsCompressed(internalformat, egl::getClientVersion()))
if(!IsCompressed(internalformat))
{
return error(GL_INVALID_ENUM);
}
......@@ -586,7 +586,7 @@ GL_APICALL void GL_APIENTRY glCompressedTexSubImage3D(GLenum target, GLint level
return error(GL_INVALID_VALUE);
}
if(!IsCompressed(format, egl::getClientVersion()))
if(!IsCompressed(format))
{
return error(GL_INVALID_ENUM);
}
......@@ -3634,7 +3634,7 @@ GL_APICALL void GL_APIENTRY glTexStorage2D(GLenum target, GLsizei levels, GLenum
return error(GL_INVALID_OPERATION);
}
bool isCompressed = IsCompressed(internalformat, egl::getClientVersion());
bool isCompressed = IsCompressed(internalformat);
if(!IsSizedInternalFormat(internalformat) && !isCompressed)
{
return error(GL_INVALID_ENUM);
......@@ -3717,7 +3717,7 @@ GL_APICALL void GL_APIENTRY glTexStorage3D(GLenum target, GLsizei levels, GLenum
return error(GL_INVALID_VALUE);
}
if(!IsSizedInternalFormat(internalformat) && !IsCompressed(internalformat, egl::getClientVersion()))
if(!IsSizedInternalFormat(internalformat) && !IsCompressed(internalformat))
{
return error(GL_INVALID_ENUM);
}
......@@ -3801,9 +3801,9 @@ GL_APICALL void GL_APIENTRY glGetInternalformativ(GLenum target, GLenum internal
if(internalformat == GL_RGB) internalformat = GL_RGB8;
if(internalformat == GL_RGBA) internalformat = GL_RGBA8;
if(!IsColorRenderable(internalformat, egl::getClientVersion()) &&
!IsDepthRenderable(internalformat, egl::getClientVersion()) &&
!IsStencilRenderable(internalformat, egl::getClientVersion()))
if(!IsColorRenderable(internalformat) &&
!IsDepthRenderable(internalformat) &&
!IsStencilRenderable(internalformat))
{
return error(GL_INVALID_ENUM);
}
......
......@@ -323,7 +323,7 @@ namespace es2
return -1;
}
bool IsCompressed(GLint internalformat, GLint clientVersion)
bool IsCompressed(GLint internalformat)
{
switch(internalformat)
{
......@@ -332,7 +332,6 @@ namespace es2
case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
case GL_ETC1_RGB8_OES:
return true;
case GL_COMPRESSED_R11_EAC:
case GL_COMPRESSED_SIGNED_R11_EAC:
case GL_COMPRESSED_RG11_EAC:
......@@ -343,7 +342,7 @@ namespace es2
case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
case GL_COMPRESSED_RGBA8_ETC2_EAC:
case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
return (clientVersion >= 3);
return true;
case GL_COMPRESSED_RGBA_ASTC_4x4_KHR:
case GL_COMPRESSED_RGBA_ASTC_5x4_KHR:
case GL_COMPRESSED_RGBA_ASTC_5x5_KHR:
......@@ -372,7 +371,7 @@ namespace es2
case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:
case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:
case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:
return ASTC_SUPPORT && (clientVersion >= 3);
return ASTC_SUPPORT;
default:
return false;
}
......@@ -455,7 +454,7 @@ namespace es2
}
GLenum ValidateSubImageParams(bool compressed, bool copy, GLenum target, GLint level, GLint xoffset, GLint yoffset,
GLsizei width, GLsizei height, GLenum format, GLenum type, Texture *texture, GLint clientVersion)
GLsizei width, GLsizei height, GLenum format, GLenum type, Texture *texture)
{
if(!texture)
{
......@@ -473,7 +472,7 @@ namespace es2
}
else if(!copy) // CopyTexSubImage doesn't have format/type parameters.
{
GLenum validationError = ValidateTextureFormatType(format, type, sizedInternalFormat, target, clientVersion);
GLenum validationError = ValidateTextureFormatType(format, type, sizedInternalFormat, target);
if(validationError != GL_NO_ERROR)
{
return validationError;
......@@ -499,7 +498,7 @@ namespace es2
}
GLenum ValidateSubImageParams(bool compressed, bool copy, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,
GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, Texture *texture, GLint clientVersion)
GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, Texture *texture)
{
if(!texture)
{
......@@ -515,7 +514,7 @@ namespace es2
{
GLenum sizedInternalFormat = texture->getFormat(target, level);
GLenum validationError = ValidateTextureFormatType(format, type, sizedInternalFormat, target, clientVersion);
GLenum validationError = ValidateTextureFormatType(format, type, sizedInternalFormat, target);
if(validationError != GL_NO_ERROR)
{
return validationError;
......@@ -624,7 +623,7 @@ namespace es2
return true;
}
bool IsValidReadPixelsFormatType(const Framebuffer *framebuffer, GLenum format, GLenum type, GLint clientVersion)
bool IsValidReadPixelsFormatType(const Framebuffer *framebuffer, GLenum format, GLenum type)
{
// GL_NV_read_depth
if(format == GL_DEPTH_COMPONENT)
......@@ -686,8 +685,6 @@ namespace es2
}
else if(IsSignedNonNormalizedInteger(internalformat))
{
ASSERT(clientVersion >= 3);
if(format == GL_RGBA_INTEGER && type == GL_INT)
{
return true;
......@@ -695,8 +692,6 @@ namespace es2
}
else if(IsUnsignedNonNormalizedInteger(internalformat))
{
ASSERT(clientVersion >= 3);
if(format == GL_RGBA_INTEGER && type == GL_UNSIGNED_INT)
{
return true;
......@@ -727,8 +722,6 @@ namespace es2
// Additional third combination accepted by OpenGL ES 3.0.
if(internalformat == GL_RGB10_A2)
{
ASSERT(clientVersion >= 3);
if(format == GL_RGBA && type == GL_UNSIGNED_INT_2_10_10_10_REV)
{
return true;
......@@ -783,7 +776,7 @@ namespace es2
return target == GL_TEXTURE_2D || IsCubemapTextureTarget(target) || target == GL_TEXTURE_3D || target == GL_TEXTURE_2D_ARRAY || target == GL_TEXTURE_RECTANGLE_ARB;
}
GLenum ValidateTextureFormatType(GLenum format, GLenum type, GLint internalformat, GLenum target, GLint clientVersion)
GLenum ValidateTextureFormatType(GLenum format, GLenum type, GLint internalformat, GLenum target)
{
switch(type)
{
......@@ -805,10 +798,6 @@ namespace es2
case GL_UNSIGNED_INT_10F_11F_11F_REV:
case GL_UNSIGNED_INT_5_9_9_9_REV:
case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
if(clientVersion < 3)
{
return GL_INVALID_ENUM;
}
break;
default:
return GL_INVALID_ENUM;
......@@ -846,10 +835,6 @@ namespace es2
case GL_RG_INTEGER:
case GL_RGB_INTEGER:
case GL_RGBA_INTEGER:
if(clientVersion < 3)
{
return GL_INVALID_ENUM;
}
break;
default:
return GL_INVALID_ENUM;
......@@ -1165,9 +1150,9 @@ namespace es2
return 1;
}
bool IsColorRenderable(GLint internalformat, GLint clientVersion)
bool IsColorRenderable(GLint internalformat)
{
if(IsCompressed(internalformat, clientVersion))
if(IsCompressed(internalformat))
{
return false;
}
......@@ -1188,9 +1173,8 @@ namespace es2
case GL_R32F:
case GL_RG32F:
case GL_RGB32F:
case GL_RGBA32F:
case GL_RGBA32F: // GL_EXT_color_buffer_float, OpenGL ES 3.0+ only.
case GL_BGRA8_EXT: // GL_EXT_texture_format_BGRA8888
return true;
case GL_R8UI:
case GL_R8I:
case GL_R16UI:
......@@ -1213,7 +1197,7 @@ namespace es2
case GL_RGBA32I:
case GL_RGBA32UI:
case GL_R11F_G11F_B10F:
return clientVersion >= 3;
return true;
case GL_R8_SNORM:
case GL_RG8_SNORM:
case GL_RGB8_SNORM:
......@@ -1242,9 +1226,9 @@ namespace es2
return false;
}
bool IsDepthRenderable(GLint internalformat, GLint clientVersion)
bool IsDepthRenderable(GLint internalformat)
{
if(IsCompressed(internalformat, clientVersion))
if(IsCompressed(internalformat))
{
return false;
}
......@@ -1255,10 +1239,9 @@ namespace es2
case GL_DEPTH_COMPONENT16:
case GL_DEPTH24_STENCIL8_OES: // GL_OES_packed_depth_stencil
case GL_DEPTH_COMPONENT32_OES: // GL_OES_depth32
return true;
case GL_DEPTH32F_STENCIL8:
case GL_DEPTH_COMPONENT32F:
return clientVersion >= 3;
return true;
case GL_STENCIL_INDEX8:
case GL_R8:
case GL_R8UI:
......@@ -1313,9 +1296,9 @@ namespace es2
return false;
}
bool IsStencilRenderable(GLint internalformat, GLint clientVersion)
bool IsStencilRenderable(GLint internalformat)
{
if(IsCompressed(internalformat, clientVersion))
if(IsCompressed(internalformat))
{
return false;
}
......@@ -1324,9 +1307,8 @@ namespace es2
{
case GL_STENCIL_INDEX8:
case GL_DEPTH24_STENCIL8_OES:
return true;
case GL_DEPTH32F_STENCIL8:
return clientVersion >= 3;
return true;
case GL_R8:
case GL_R8UI:
case GL_R8I:
......@@ -1384,7 +1366,7 @@ namespace es2
return false;
}
bool IsMipmappable(GLint internalformat, GLint clientVersion)
bool IsMipmappable(GLint internalformat)
{
if(internalformat == GL_NONE)
{
......@@ -1409,7 +1391,7 @@ namespace es2
case GL_LUMINANCE_ALPHA16F_EXT:
return true;
default:
return IsColorRenderable(internalformat, clientVersion);
return IsColorRenderable(internalformat);
}
}
......
......@@ -44,26 +44,26 @@ namespace es2
int AllocateFirstFreeBits(unsigned int *bits, unsigned int allocationSize, unsigned int bitsSize);
bool IsCompressed(GLint intenalformat, GLint clientVersion);
bool IsCompressed(GLint intenalformat);
bool IsSizedInternalFormat(GLint internalformat); // Not compressed.
GLenum ValidateSubImageParams(bool compressed, bool copy, GLenum target, GLint level, GLint xoffset, GLint yoffset,
GLsizei width, GLsizei height, GLenum format, GLenum type, Texture *texture, GLint clientVersion);
GLsizei width, GLsizei height, GLenum format, GLenum type, Texture *texture);
GLenum ValidateSubImageParams(bool compressed, bool copy, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,
GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, Texture *texture, GLint clientVersion);
GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, Texture *texture);
bool ValidateCopyFormats(GLenum textureFormat, GLenum colorbufferFormat);
bool IsValidReadPixelsFormatType(const Framebuffer *framebuffer, GLenum format, GLenum type, GLint clientVersion);
bool IsValidReadPixelsFormatType(const Framebuffer *framebuffer, GLenum format, GLenum type);
bool IsDepthTexture(GLenum format);
bool IsStencilTexture(GLenum format);
bool IsCubemapTextureTarget(GLenum target);
int CubeFaceIndex(GLenum cubeTarget);
bool IsTextureTarget(GLenum target);
GLenum ValidateTextureFormatType(GLenum format, GLenum type, GLint internalformat, GLenum target, GLint clientVersion);
GLenum ValidateTextureFormatType(GLenum format, GLenum type, GLint internalformat, GLenum target);
size_t GetTypeSize(GLenum type);
bool IsColorRenderable(GLint internalformat, GLint clientVersion);
bool IsDepthRenderable(GLint internalformat, GLint clientVersion);
bool IsStencilRenderable(GLint internalformat, GLint clientVersion);
bool IsMipmappable(GLint internalformat, GLint clientVersion);
bool IsColorRenderable(GLint internalformat);
bool IsDepthRenderable(GLint internalformat);
bool IsStencilRenderable(GLint internalformat);
bool IsMipmappable(GLint internalformat);
GLuint GetAlphaSize(GLint internalformat);
GLuint GetRedSize(GLint internalformat);
......
......@@ -136,7 +136,7 @@ protected:
EXPECT_TRUE(renderableType & EGL_OPENGL_ES2_BIT);
EGLint surfaceType = 0;
eglGetConfigAttrib(display, config, EGL_RENDERABLE_TYPE, &surfaceType);
eglGetConfigAttrib(display, config, EGL_SURFACE_TYPE, &surfaceType);
EXPECT_EQ(EGL_SUCCESS, eglGetError());
EXPECT_TRUE(surfaceType & EGL_WINDOW_BIT);
}
......@@ -333,9 +333,10 @@ TEST_F(SwiftShaderTest, Initalization)
EXPECT_GLENUM_EQ(GL_NO_ERROR, glGetError());
EXPECT_STREQ("Google SwiftShader", (const char*)glRenderer);
// SwiftShader return an OpenGL ES 3.0 context when a 2.0 context is requested, as allowed by the spec.
const GLubyte *glVersion = glGetString(GL_VERSION);
EXPECT_GLENUM_EQ(GL_NO_ERROR, glGetError());
EXPECT_THAT((const char*)glVersion, testing::HasSubstr("OpenGL ES 2.0 SwiftShader "));
EXPECT_THAT((const char*)glVersion, testing::HasSubstr("OpenGL ES 3.0 SwiftShader "));
Uninitialize();
}
......
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