Fix eglCreateImageKHR error logic for level=0
Two issues here:
- Logic was inverted
- getTopLevel() isn't quite right. The condition in the spec is
whether there are any nonzero levels defined; it does not require them to
be contiguous with the base level.
Test: dEQP-EGL.functional.image.api.create_image_gles2_tex2d_rgba_level0_only
Bug: b/141916742
Change-Id: I336d628c9508bfe61d1471431cc6170454a24d1b
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/36888
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Tested-by: Chris Forbes <chrisforbes@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
diff --git a/src/OpenGL/libGLESv2/Context.cpp b/src/OpenGL/libGLESv2/Context.cpp
index 1954a34..7eda289 100644
--- a/src/OpenGL/libGLESv2/Context.cpp
+++ b/src/OpenGL/libGLESv2/Context.cpp
@@ -4450,7 +4450,7 @@
return EGL_BAD_PARAMETER;
}
- if(textureLevel == 0 && !(texture->isSamplerComplete(nullptr) && texture->getTopLevel() == 0))
+ if(textureLevel == 0 && !texture->isSamplerComplete(nullptr) && texture->hasNonBaseLevels())
{
return EGL_BAD_PARAMETER;
}
diff --git a/src/OpenGL/libGLESv2/Texture.cpp b/src/OpenGL/libGLESv2/Texture.cpp
index a02a7a0..f193ef3 100644
--- a/src/OpenGL/libGLESv2/Texture.cpp
+++ b/src/OpenGL/libGLESv2/Texture.cpp
@@ -525,6 +525,19 @@
return level - 1;
}
+bool Texture2D::hasNonBaseLevels() const
+{
+ for(int level = 1; level < IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++)
+ {
+ if (image[level])
+ {
+ return true;
+ }
+ }
+
+ return false;
+}
+
bool Texture2D::requiresSync() const
{
for(int level = 0; level < IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++)
@@ -1007,6 +1020,19 @@
return level - 1;
}
+bool TextureCubeMap::hasNonBaseLevels() const
+{
+ for(int level = 1; level < IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++)
+ {
+ if (image[0][level])
+ {
+ return true;
+ }
+ }
+
+ return false;
+}
+
bool TextureCubeMap::requiresSync() const
{
for(int level = 0; level < IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++)
@@ -1533,6 +1559,19 @@
return level - 1;
}
+bool Texture3D::hasNonBaseLevels() const
+{
+ for(int level = 1; level < IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++)
+ {
+ if (image[level])
+ {
+ return true;
+ }
+ }
+
+ return false;
+}
+
bool Texture3D::requiresSync() const
{
for(int level = 0; level < IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++)
diff --git a/src/OpenGL/libGLESv2/Texture.h b/src/OpenGL/libGLESv2/Texture.h
index 495403a..1d37da4 100644
--- a/src/OpenGL/libGLESv2/Texture.h
+++ b/src/OpenGL/libGLESv2/Texture.h
@@ -146,6 +146,7 @@
virtual GLsizei getDepth(GLenum target, GLint level) const;
virtual GLint getFormat(GLenum target, GLint level) const = 0;
virtual int getTopLevel() const = 0;
+ virtual bool hasNonBaseLevels() const = 0;
virtual bool requiresSync() const = 0;
virtual bool isBaseLevelDefined() const = 0;
@@ -210,6 +211,7 @@
GLsizei getHeight(GLenum target, GLint level) const override;
GLint getFormat(GLenum target, GLint level) const override;
int getTopLevel() const override;
+ bool hasNonBaseLevels() const override;
bool requiresSync() const override;
void setImage(GLint level, GLsizei width, GLsizei height, GLint internalformat, GLenum format, GLenum type, const gl::PixelStorageModes &unpackParameters, const void *pixels);
@@ -225,6 +227,7 @@
bool isSamplerComplete(Sampler *sampler) const override;
bool isCompressed(GLenum target, GLint level) const override;
bool isDepth(GLenum target, GLint level) const override;
+
void bindTexImage(gl::Surface *surface);
void releaseTexImage() override;
@@ -279,6 +282,7 @@
GLsizei getHeight(GLenum target, GLint level) const override;
GLint getFormat(GLenum target, GLint level) const override;
int getTopLevel() const override;
+ bool hasNonBaseLevels() const override;
bool requiresSync() const override;
void setImage(GLenum target, GLint level, GLsizei width, GLsizei height, GLint internalformat, GLenum format, GLenum type, const gl::PixelStorageModes &unpackParameters, const void *pixels);
@@ -342,6 +346,7 @@
GLsizei getDepth(GLenum target, GLint level) const override;
GLint getFormat(GLenum target, GLint level) const override;
int getTopLevel() const override;
+ bool hasNonBaseLevels() const override;
bool requiresSync() const override;
void setImage(GLint level, GLsizei width, GLsizei height, GLsizei depth, GLint internalformat, GLenum format, GLenum type, const gl::PixelStorageModes &unpackParameters, const void *pixels);