Commit 0988fb8e by Alexis Hetu Committed by Alexis Hétu

Texture rectangle related fixes and associated tests

Imported texture rectangle tests from angle and fixed all texture rectangle related failures: - Rectangle textures can be rendered to - Rectangle textures only support level 0 - Rectangle textures can't be compressed - glTexStorage2D can no longer create a texture larger than the maximum size allowed Change-Id: I089291c94aad79e244782a8d56dd224c7510d237 Reviewed-on: https://swiftshader-review.googlesource.com/16908Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com> Tested-by: 's avatarAlexis Hétu <sugoi@google.com>
parent a70156b5
......@@ -22,6 +22,8 @@
#include "Texture.h"
#include "utilities.h"
#include "compiler/Compiler.h"
namespace es2
{
RenderbufferInterface::RenderbufferInterface()
......@@ -132,6 +134,69 @@ GLsizei RenderbufferTexture2D::getSamples() const
return 0; // Core OpenGL ES 3.0 does not support multisample textures.
}
///// RenderbufferTexture2DRect Implementation ////////
RenderbufferTexture2DRect::RenderbufferTexture2DRect(Texture2DRect *texture)
{
mTexture2DRect = texture;
}
RenderbufferTexture2DRect::~RenderbufferTexture2DRect()
{
mTexture2DRect = NULL;
}
// Textures need to maintain their own reference count for references via
// Renderbuffers acting as proxies. Here, we notify the texture of a reference.
void RenderbufferTexture2DRect::addProxyRef(const Renderbuffer *proxy)
{
mTexture2DRect->addProxyRef(proxy);
}
void RenderbufferTexture2DRect::releaseProxy(const Renderbuffer *proxy)
{
mTexture2DRect->releaseProxy(proxy);
}
// Increments refcount on image.
// caller must release() the returned image
egl::Image *RenderbufferTexture2DRect::getRenderTarget()
{
return mTexture2DRect->getRenderTarget(GL_TEXTURE_RECTANGLE_ARB, 0);
}
// Increments refcount on image.
// caller must release() the returned image
egl::Image *RenderbufferTexture2DRect::createSharedImage()
{
return mTexture2DRect->createSharedImage(GL_TEXTURE_RECTANGLE_ARB, 0);
}
bool RenderbufferTexture2DRect::isShared() const
{
return mTexture2DRect->isShared(GL_TEXTURE_RECTANGLE_ARB, 0);
}
GLsizei RenderbufferTexture2DRect::getWidth() const
{
return mTexture2DRect->getWidth(GL_TEXTURE_RECTANGLE_ARB, 0);
}
GLsizei RenderbufferTexture2DRect::getHeight() const
{
return mTexture2DRect->getHeight(GL_TEXTURE_RECTANGLE_ARB, 0);
}
GLint RenderbufferTexture2DRect::getFormat() const
{
return mTexture2DRect->getFormat(GL_TEXTURE_RECTANGLE_ARB, 0);
}
GLsizei RenderbufferTexture2DRect::getSamples() const
{
return 0; // Core OpenGL ES 3.0 does not support multisample textures.
}
///// RenderbufferTexture3D Implementation ////////
RenderbufferTexture3D::RenderbufferTexture3D(Texture3D *texture, GLint level) : mLevel(level)
......
......@@ -31,6 +31,7 @@ namespace es2
class Texture2D;
class Texture3D;
class TextureCubeMap;
class Texture2DRect;
class Renderbuffer;
class Colorbuffer;
class DepthStencilbuffer;
......@@ -93,6 +94,29 @@ private:
GLint mLevel;
};
class RenderbufferTexture2DRect : public RenderbufferInterface
{
public:
RenderbufferTexture2DRect(Texture2DRect *texture);
~RenderbufferTexture2DRect() override;
void addProxyRef(const Renderbuffer *proxy) override;
void releaseProxy(const Renderbuffer *proxy) override;
egl::Image *getRenderTarget() override;
egl::Image *createSharedImage() override;
bool isShared() const override;
GLsizei getWidth() const override;
GLsizei getHeight() const override;
GLint getFormat() const override;
GLsizei getSamples() const override;
private:
gl::BindingPointer<Texture2DRect> mTexture2DRect;
};
class RenderbufferTexture3D : public RenderbufferInterface
{
public:
......
......@@ -75,7 +75,7 @@ bool Texture::setMinFilter(GLenum filter)
case GL_LINEAR_MIPMAP_NEAREST:
case GL_NEAREST_MIPMAP_LINEAR:
case GL_LINEAR_MIPMAP_LINEAR:
if(getTarget() == GL_TEXTURE_EXTERNAL_OES)
if((getTarget() == GL_TEXTURE_EXTERNAL_OES) || (getTarget() == GL_TEXTURE_RECTANGLE_ARB))
{
return false;
}
......@@ -110,7 +110,7 @@ bool Texture::setWrapS(GLenum wrap)
{
case GL_REPEAT:
case GL_MIRRORED_REPEAT:
if(getTarget() == GL_TEXTURE_EXTERNAL_OES)
if((getTarget() == GL_TEXTURE_EXTERNAL_OES) || (getTarget() == GL_TEXTURE_RECTANGLE_ARB))
{
return false;
}
......@@ -130,7 +130,7 @@ bool Texture::setWrapT(GLenum wrap)
{
case GL_REPEAT:
case GL_MIRRORED_REPEAT:
if(getTarget() == GL_TEXTURE_EXTERNAL_OES)
if((getTarget() == GL_TEXTURE_EXTERNAL_OES) || (getTarget() == GL_TEXTURE_RECTANGLE_ARB))
{
return false;
}
......@@ -150,7 +150,7 @@ bool Texture::setWrapR(GLenum wrap)
{
case GL_REPEAT:
case GL_MIRRORED_REPEAT:
if(getTarget() == GL_TEXTURE_EXTERNAL_OES)
if((getTarget() == GL_TEXTURE_EXTERNAL_OES) || (getTarget() == GL_TEXTURE_RECTANGLE_ARB))
{
return false;
}
......@@ -844,6 +844,11 @@ bool Texture2D::isShared(GLenum target, unsigned int level) const
Texture2DRect::Texture2DRect(GLuint name) : Texture2D(name)
{
mMinFilter = GL_LINEAR;
mMagFilter = GL_LINEAR;
mWrapS = GL_CLAMP_TO_EDGE;
mWrapT = GL_CLAMP_TO_EDGE;
mWrapR = GL_CLAMP_TO_EDGE;
}
GLenum Texture2DRect::getTarget() const
......@@ -851,6 +856,21 @@ GLenum Texture2DRect::getTarget() const
return GL_TEXTURE_RECTANGLE_ARB;
}
Renderbuffer *Texture2DRect::getRenderbuffer(GLenum target, GLint level)
{
if((target != getTarget()) || (level != 0))
{
return error(GL_INVALID_OPERATION, (Renderbuffer*)nullptr);
}
if(!mColorbufferProxy)
{
mColorbufferProxy = new Renderbuffer(name, new RenderbufferTexture2DRect(this));
}
return mColorbufferProxy;
}
TextureCubeMap::TextureCubeMap(GLuint name) : Texture(name)
{
for(int f = 0; f < 6; f++)
......
......@@ -205,6 +205,8 @@ public:
explicit Texture2DRect(GLuint name);
GLenum getTarget() const override;
Renderbuffer *getRenderbuffer(GLenum target, GLint level) override;
};
class TextureCubeMap : public Texture
......
......@@ -761,7 +761,6 @@ void CompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLs
switch(target)
{
case GL_TEXTURE_2D:
case GL_TEXTURE_RECTANGLE_ARB:
if(width > (es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level) ||
height > (es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level))
{
......@@ -785,6 +784,7 @@ void CompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLs
return error(GL_INVALID_VALUE);
}
break;
case GL_TEXTURE_RECTANGLE_ARB: // Rectangle textures cannot be compressed
default:
return error(GL_INVALID_ENUM);
}
......@@ -920,8 +920,13 @@ void CopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x,
{
switch(target)
{
case GL_TEXTURE_2D:
case GL_TEXTURE_RECTANGLE_ARB:
if(level != 0)
{
return error(GL_INVALID_VALUE);
}
// Fall through
case GL_TEXTURE_2D:
if(width > (es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level) ||
height > (es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level))
{
......@@ -2038,7 +2043,7 @@ void FramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GL
return error(GL_INVALID_ENUM);
}
if((level != 0) && (clientVersion < 3))
if((level != 0) && ((clientVersion < 3) || (textarget == GL_TEXTURE_RECTANGLE_ARB)))
{
return error(GL_INVALID_VALUE);
}
......@@ -4970,8 +4975,13 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
switch(target)
{
case GL_TEXTURE_2D:
case GL_TEXTURE_RECTANGLE_ARB:
if(level != 0)
{
return error(GL_INVALID_VALUE); // Defining level other than 0 is not allowed
}
// Fall through
case GL_TEXTURE_2D:
if(width > (es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level) ||
height > (es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level))
{
......@@ -5266,6 +5276,10 @@ void TexParameteri(GLenum target, GLenum pname, GLint param)
}
break;
case GL_TEXTURE_BASE_LEVEL:
if((texture->getTarget() == GL_TEXTURE_RECTANGLE_ARB) && (param != 0))
{
return error(GL_INVALID_OPERATION); // Base level has to be 0
}
if(clientVersion < 3 || !texture->setBaseLevel(param))
{
return error(GL_INVALID_VALUE);
......
......@@ -3594,7 +3594,7 @@ GL_APICALL void GL_APIENTRY glTexStorage2D(GLenum target, GLsizei levels, GLenum
TRACE("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
target, levels, internalformat, width, height);
if(width < 1 || height < 1 || levels < 1)
if(width < 1 || height < 1 || levels < 1 || ((target == GL_TEXTURE_RECTANGLE_ARB) && (levels != 1)))
{
return error(GL_INVALID_VALUE);
}
......@@ -3604,7 +3604,8 @@ GL_APICALL void GL_APIENTRY glTexStorage2D(GLenum target, GLsizei levels, GLenum
return error(GL_INVALID_OPERATION);
}
if(!IsSizedInternalFormat(internalformat) && !IsCompressed(internalformat, egl::getClientVersion()))
bool isCompressed = IsCompressed(internalformat, egl::getClientVersion());
if(!IsSizedInternalFormat(internalformat) && !isCompressed)
{
return error(GL_INVALID_ENUM);
}
......@@ -3615,9 +3616,19 @@ GL_APICALL void GL_APIENTRY glTexStorage2D(GLenum target, GLsizei levels, GLenum
{
switch(target)
{
case GL_TEXTURE_2D:
case GL_TEXTURE_RECTANGLE_ARB:
if(isCompressed) // Rectangle textures cannot be compressed
{
return error(GL_INVALID_ENUM);
}
case GL_TEXTURE_2D:
{
if((width > es2::IMPLEMENTATION_MAX_TEXTURE_SIZE) ||
(height > es2::IMPLEMENTATION_MAX_TEXTURE_SIZE))
{
return error(GL_INVALID_VALUE);
}
es2::Texture2D *texture = context->getTexture2D(target);
if(!texture || texture->name == 0 || texture->getImmutableFormat() == GL_TRUE)
{
......@@ -3635,6 +3646,12 @@ GL_APICALL void GL_APIENTRY glTexStorage2D(GLenum target, GLsizei levels, GLenum
break;
case GL_TEXTURE_CUBE_MAP:
{
if((width > es2::IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE) ||
(height > es2::IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE))
{
return error(GL_INVALID_VALUE);
}
es2::TextureCubeMap *texture = context->getTextureCubeMap();
if(!texture || texture->name == 0 || texture->getImmutableFormat())
{
......
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