return mResourceManager->getProgram(mState.currentProgram);
}
+Texture *Context::getTargetTexture(GLenum target) const
+{
+ Texture *texture = nullptr;
+
+ switch(target)
+ {
+ case GL_TEXTURE_2D: texture = getTexture2D(); break;
+ case GL_TEXTURE_2D_ARRAY: texture = getTexture2DArray(); break;
+ case GL_TEXTURE_3D: texture = getTexture3D(); break;
+ case GL_TEXTURE_CUBE_MAP: texture = getTextureCubeMap(); break;
+ case GL_TEXTURE_EXTERNAL_OES: texture = getTextureExternal(); break;
+ case GL_TEXTURE_RECTANGLE_ARB: texture = getTexture2DRect(); break;
+ default:
+ return error(GL_INVALID_ENUM, nullptr);
+ }
+
+ ASSERT(texture); // Must always have a default texture to fall back to.
+
+ return texture;
+}
+
Texture2D *Context::getTexture2D() const
{
return static_cast<Texture2D*>(getSamplerTexture(mState.activeSampler, TEXTURE_2D));
GLenum getPixels(const GLvoid **data, GLenum type, GLsizei imageSize) const;
bool getBuffer(GLenum target, es2::Buffer **buffer) const;
Program *getCurrentProgram() const;
+ Texture *getTargetTexture(GLenum target) const;
Texture2D *getTexture2D() const;
Texture2D *getTexture2D(GLenum target) const;
Texture3D *getTexture3D() const;
image[0] = sharedImage;
}
-// Tests for 2D texture sampling completeness. [OpenGL ES 3.0.5] section 3.8.13 page 160.
-bool Texture2D::isSamplerComplete(Sampler *sampler) const
+bool Texture2D::isBaseLevelDefined() const
{
if(!image[mBaseLevel])
{
return false;
}
+ return true;
+}
+
+// Tests for 2D texture sampling completeness. [OpenGL ES 3.0.5] section 3.8.13 page 160.
+bool Texture2D::isSamplerComplete(Sampler *sampler) const
+{
+ if(!isBaseLevelDefined())
+ {
+ return false;
+ }
+
if(isMipmapFiltered(sampler))
{
if(!isMipmapComplete())
Texture::subImageCompressed(xoffset, yoffset, 0, width, height, 1, format, imageSize, pixels, image[CubeFaceIndex(target)][level]);
}
-// Tests for cube map sampling completeness. [OpenGL ES 3.0.5] section 3.8.13 page 161.
-bool TextureCubeMap::isSamplerComplete(Sampler *sampler) const
+bool TextureCubeMap::isBaseLevelDefined() const
{
for(int face = 0; face < 6; face++)
{
return false;
}
+ return true;
+}
+
+// Tests for cube map sampling completeness. [OpenGL ES 3.0.5] section 3.8.13 page 161.
+bool TextureCubeMap::isSamplerComplete(Sampler *sampler) const
+{
+ if(!isBaseLevelDefined())
+ {
+ return false;
+ }
+
if(!isMipmapFiltered(sampler))
{
if(!isCubeComplete())
// Tests for cube texture completeness. [OpenGL ES 3.0.5] section 3.8.13 page 160.
bool TextureCubeMap::isCubeComplete() const
{
+ if(!isBaseLevelDefined())
+ {
+ return false;
+ }
+
if(image[0][mBaseLevel]->getWidth() <= 0 || image[0][mBaseLevel]->getHeight() != image[0][mBaseLevel]->getWidth())
{
return false;
image[0] = sharedImage;
}
-// Tests for 3D texture sampling completeness. [OpenGL ES 3.0.5] section 3.8.13 page 160.
-bool Texture3D::isSamplerComplete(Sampler *sampler) const
+bool Texture3D::isBaseLevelDefined() const
{
if(!image[mBaseLevel])
{
return false;
}
+ return true;
+}
+
+// Tests for 3D texture sampling completeness. [OpenGL ES 3.0.5] section 3.8.13 page 160.
+bool Texture3D::isSamplerComplete(Sampler *sampler) const
+{
+ if(!isBaseLevelDefined())
+ {
+ return false;
+ }
+
if(isMipmapFiltered(sampler))
{
if(!isMipmapComplete())
virtual int getTopLevel() const = 0;
virtual bool requiresSync() const = 0;
+ virtual bool isBaseLevelDefined() const = 0;
virtual bool isSamplerComplete(Sampler *sampler) const = 0;
virtual bool isCompressed(GLenum target, GLint level) const = 0;
virtual bool isDepth(GLenum target, GLint level) const = 0;
void setSharedImage(egl::Image *image);
+ bool isBaseLevelDefined() const override;
bool isSamplerComplete(Sampler *sampler) const override;
bool isCompressed(GLenum target, GLint level) const override;
bool isDepth(GLenum target, GLint level) const override;
void copyImage(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, Renderbuffer *source);
void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, Renderbuffer *source) override;
+ bool isBaseLevelDefined() const override;
bool isSamplerComplete(Sampler *sampler) const override;
bool isCompressed(GLenum target, GLint level) const override;
bool isDepth(GLenum target, GLint level) const override;
void setSharedImage(egl::Image *image);
+ bool isBaseLevelDefined() const override;
bool isSamplerComplete(Sampler *sampler) const override;
bool isCompressed(GLenum target, GLint level) const override;
bool isDepth(GLenum target, GLint level) const override;
if(context)
{
- es2::Texture *texture = nullptr;
+ es2::Texture *texture = context->getTargetTexture(target);
- switch(target)
+ if(!texture)
{
- case GL_TEXTURE_2D:
- texture = context->getTexture2D();
- break;
- case GL_TEXTURE_CUBE_MAP:
- {
- TextureCubeMap *cube = context->getTextureCubeMap();
- texture = cube;
-
- if(!cube->isCubeComplete())
- {
- return error(GL_INVALID_OPERATION);
- }
- }
- break;
- case GL_TEXTURE_2D_ARRAY:
- texture = context->getTexture2DArray();
- break;
- case GL_TEXTURE_3D:
- texture = context->getTexture3D();
- break;
- case GL_TEXTURE_RECTANGLE_ARB:
- texture = context->getTexture2DRect();
- break;
- default:
- return error(GL_INVALID_ENUM);
+ return;
}
if(!IsMipmappable(texture->getFormat(target, texture->getBaseLevel())))
return error(GL_INVALID_OPERATION);
}
+ if(target == GL_TEXTURE_CUBE_MAP)
+ {
+ TextureCubeMap *cube = context->getTextureCubeMap();
+
+ if(!cube->isCubeComplete())
+ {
+ return error(GL_INVALID_OPERATION);
+ }
+ }
+
+ // [OpenGL ES 3.2]: "Otherwise, if levelbase is not defined, or if any dimension
+ // is zero, all mipmap levels are left unchanged. This is not an error."
+ if(!texture->isBaseLevelDefined())
+ {
+ return;
+ }
+
texture->generateMipmaps();
}
}
if(context)
{
- es2::Texture *texture;
+ es2::Texture *texture = context->getTargetTexture(target);
- switch(target)
+ if(!texture)
{
- 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);
+ return;
}
switch(pname)
if(context)
{
- es2::Texture *texture;
+ es2::Texture *texture = context->getTargetTexture(target);
- switch(target)
+ if(!texture)
{
- 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);
+ return;
}
switch(pname)
if(context)
{
- es2::Texture *texture;
+ es2::Texture *texture = context->getTargetTexture(target);
- switch(target)
+ if(!texture)
{
- 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);
+ return;
}
switch(pname)
if(context)
{
- es2::Texture *texture;
+ es2::Texture *texture = context->getTargetTexture(target);
- switch(target)
+ if(!texture)
{
- 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);
+ return;
}
switch(pname)