Commit 7c973eaa by Geoff Lang

Move egl texture binding to the base texture class.

It's still only valid to bind a 2D texture but the validation layer verifies that. BUG=angle:681 Change-Id: I744dc32f9bd0f69b1e1235b8feef7e796167d033 Reviewed-on: https://chromium-review.googlesource.com/236931Reviewed-by: 's avatarBrandon Jones <bajones@chromium.org> Tested-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent d03e10e2
...@@ -134,7 +134,7 @@ EGLint Surface::getHeight() const ...@@ -134,7 +134,7 @@ EGLint Surface::getHeight() const
return mImplementation->getHeight(); return mImplementation->getHeight();
} }
Error Surface::bindTexImage(gl::Texture2D *texture, EGLint buffer) Error Surface::bindTexImage(gl::Texture *texture, EGLint buffer)
{ {
ASSERT(!mTexture); ASSERT(!mTexture);
...@@ -146,7 +146,7 @@ Error Surface::bindTexImage(gl::Texture2D *texture, EGLint buffer) ...@@ -146,7 +146,7 @@ Error Surface::bindTexImage(gl::Texture2D *texture, EGLint buffer)
Error Surface::releaseTexImage(EGLint buffer) Error Surface::releaseTexImage(EGLint buffer)
{ {
ASSERT(mTexture); ASSERT(mTexture);
gl::Texture2D *boundTexture = mTexture; gl::Texture *boundTexture = mTexture;
mTexture = NULL; mTexture = NULL;
boundTexture->releaseTexImage(); boundTexture->releaseTexImage();
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
namespace gl namespace gl
{ {
class Texture2D; class Texture;
} }
namespace rx namespace rx
...@@ -43,7 +43,7 @@ class Surface final ...@@ -43,7 +43,7 @@ class Surface final
Error swap(); Error swap();
Error postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height); Error postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height);
Error querySurfacePointerANGLE(EGLint attribute, void **value); Error querySurfacePointerANGLE(EGLint attribute, void **value);
Error bindTexImage(gl::Texture2D *texture, EGLint buffer); Error bindTexImage(gl::Texture *texture, EGLint buffer);
Error releaseTexImage(EGLint buffer); Error releaseTexImage(EGLint buffer);
EGLNativeWindowType getWindowHandle() const; EGLNativeWindowType getWindowHandle() const;
...@@ -64,7 +64,7 @@ class Surface final ...@@ -64,7 +64,7 @@ class Surface final
EGLenum getTextureTarget() const; EGLenum getTextureTarget() const;
EGLenum getFormat() const; EGLenum getFormat() const;
gl::Texture2D *getBoundTexture() const { return mTexture; } gl::Texture *getBoundTexture() const { return mTexture; }
EGLint isFixedSize() const; EGLint isFixedSize() const;
...@@ -77,7 +77,7 @@ class Surface final ...@@ -77,7 +77,7 @@ class Surface final
EGLenum mRenderBuffer; // Render buffer EGLenum mRenderBuffer; // Render buffer
EGLenum mSwapBehavior; // Buffer swap behavior EGLenum mSwapBehavior; // Buffer swap behavior
gl::Texture2D *mTexture; gl::Texture *mTexture;
}; };
} }
......
...@@ -54,12 +54,18 @@ Texture::Texture(rx::TextureImpl *impl, GLuint id, GLenum target) ...@@ -54,12 +54,18 @@ Texture::Texture(rx::TextureImpl *impl, GLuint id, GLenum target)
mTextureSerial(issueTextureSerial()), mTextureSerial(issueTextureSerial()),
mUsage(GL_NONE), mUsage(GL_NONE),
mImmutableLevelCount(0), mImmutableLevelCount(0),
mTarget(target) mTarget(target),
mBoundSurface(NULL)
{ {
} }
Texture::~Texture() Texture::~Texture()
{ {
if (mBoundSurface)
{
mBoundSurface->releaseTexImage(EGL_BACK_BUFFER);
mBoundSurface = NULL;
}
SafeDelete(mTexture); SafeDelete(mTexture);
} }
...@@ -134,6 +140,8 @@ Error Texture::setImage(GLenum target, size_t level, GLenum internalFormat, cons ...@@ -134,6 +140,8 @@ Error Texture::setImage(GLenum target, size_t level, GLenum internalFormat, cons
return error; return error;
} }
releaseTexImage();
setImageDesc(ImageIdentifier(target, level), ImageDesc(size, GetSizedInternalFormat(internalFormat, type))); setImageDesc(ImageIdentifier(target, level), ImageDesc(size, GetSizedInternalFormat(internalFormat, type)));
return Error(GL_NO_ERROR); return Error(GL_NO_ERROR);
...@@ -158,6 +166,8 @@ Error Texture::setCompressedImage(GLenum target, size_t level, GLenum internalFo ...@@ -158,6 +166,8 @@ Error Texture::setCompressedImage(GLenum target, size_t level, GLenum internalFo
return error; return error;
} }
releaseTexImage();
setImageDesc(ImageIdentifier(target, level), ImageDesc(size, GetSizedInternalFormat(internalFormat, GL_UNSIGNED_BYTE))); setImageDesc(ImageIdentifier(target, level), ImageDesc(size, GetSizedInternalFormat(internalFormat, GL_UNSIGNED_BYTE)));
return Error(GL_NO_ERROR); return Error(GL_NO_ERROR);
...@@ -182,6 +192,8 @@ Error Texture::copyImage(GLenum target, size_t level, const Rectangle &sourceAre ...@@ -182,6 +192,8 @@ Error Texture::copyImage(GLenum target, size_t level, const Rectangle &sourceAre
return error; return error;
} }
releaseTexImage();
setImageDesc(ImageIdentifier(target, level), ImageDesc(Extents(sourceArea.width, sourceArea.height, 1), setImageDesc(ImageIdentifier(target, level), ImageDesc(Extents(sourceArea.width, sourceArea.height, 1),
GetSizedInternalFormat(internalFormat, GL_UNSIGNED_BYTE))); GetSizedInternalFormat(internalFormat, GL_UNSIGNED_BYTE)));
...@@ -206,6 +218,8 @@ Error Texture::setStorage(GLenum target, size_t levels, GLenum internalFormat, c ...@@ -206,6 +218,8 @@ Error Texture::setStorage(GLenum target, size_t levels, GLenum internalFormat, c
return error; return error;
} }
releaseTexImage();
mImmutableLevelCount = levels; mImmutableLevelCount = levels;
clearImageDescs(); clearImageDescs();
setImageDescChain(levels, size, internalFormat); setImageDescChain(levels, size, internalFormat);
...@@ -222,6 +236,8 @@ Error Texture::generateMipmaps() ...@@ -222,6 +236,8 @@ Error Texture::generateMipmaps()
return error; return error;
} }
releaseTexImage();
ImageIdentifier baseLevel(mTarget == GL_TEXTURE_CUBE_MAP ? GL_TEXTURE_CUBE_MAP_POSITIVE_X : mTarget, 0); ImageIdentifier baseLevel(mTarget == GL_TEXTURE_CUBE_MAP ? GL_TEXTURE_CUBE_MAP_POSITIVE_X : mTarget, 0);
const ImageDesc &baseImageInfo = getImageDesc(baseLevel); const ImageDesc &baseImageInfo = getImageDesc(baseLevel);
size_t mipLevels = log2(std::max(std::max(baseImageInfo.size.width, baseImageInfo.size.height), baseImageInfo.size.depth)) + 1; size_t mipLevels = log2(std::max(std::max(baseImageInfo.size.width, baseImageInfo.size.height), baseImageInfo.size.depth)) + 1;
...@@ -297,103 +313,29 @@ void Texture::clearImageDescs() ...@@ -297,103 +313,29 @@ void Texture::clearImageDescs()
mImageDescs.clear(); mImageDescs.clear();
} }
Texture2D::Texture2D(rx::TextureImpl *impl, GLuint id) void Texture::bindTexImage(egl::Surface *surface)
: Texture(impl, id, GL_TEXTURE_2D)
{
mSurface = NULL;
}
Texture2D::~Texture2D()
{
if (mSurface)
{
mSurface->releaseTexImage(EGL_BACK_BUFFER);
mSurface = NULL;
}
}
Error Texture2D::setImage(GLenum target, size_t level, GLenum internalFormat, const Extents &size, GLenum format, GLenum type,
const PixelUnpackState &unpack, const uint8_t *pixels)
{
Error error = Texture::setImage(target, level, internalFormat, size, format, type, unpack, pixels);
if (error.isError())
{
return error;
}
releaseTexImage();
return Error(GL_NO_ERROR);
}
Error Texture2D::setCompressedImage(GLenum target, size_t level, GLenum internalFormat, const Extents &size,
const PixelUnpackState &unpack, const uint8_t *pixels)
{ {
Error error = Texture::setCompressedImage(target, level, internalFormat, size, unpack, pixels);
if (error.isError())
{
return error;
}
releaseTexImage(); releaseTexImage();
mTexture->bindTexImage(surface);
return Error(GL_NO_ERROR); mBoundSurface = surface;
}
Error Texture2D::copyImage(GLenum target, size_t level, const Rectangle &sourceArea, GLenum internalFormat,
const Framebuffer *source)
{
Error error = Texture::copyImage(target, level, sourceArea, internalFormat, source);
if (error.isError())
{
return error;
}
releaseTexImage();
return Error(GL_NO_ERROR);
}
Error Texture2D::setStorage(GLenum target, size_t levels, GLenum internalFormat, const Extents &size)
{
Error error = Texture::setStorage(target, levels, internalFormat, size);
if (error.isError())
{
return error;
}
releaseTexImage();
return Error(GL_NO_ERROR);
} }
Error Texture2D::generateMipmaps() void Texture::releaseTexImage()
{ {
Error error = Texture::generateMipmaps(); if (mBoundSurface)
if (error.isError())
{ {
return error; mBoundSurface = NULL;
mTexture->releaseTexImage();
} }
releaseTexImage();
return Error(GL_NO_ERROR);
} }
void Texture2D::bindTexImage(egl::Surface *surface) Texture2D::Texture2D(rx::TextureImpl *impl, GLuint id)
: Texture(impl, id, GL_TEXTURE_2D)
{ {
releaseTexImage();
mTexture->bindTexImage(surface);
mSurface = surface;
} }
void Texture2D::releaseTexImage() Texture2D::~Texture2D()
{ {
if (mSurface)
{
mSurface = NULL;
mTexture->releaseTexImage();
}
} }
// Tests for 2D texture sampling completeness. [OpenGL ES 2.0.24] section 3.8.2 page 85. // Tests for 2D texture sampling completeness. [OpenGL ES 2.0.24] section 3.8.2 page 85.
......
...@@ -83,6 +83,9 @@ class Texture : public RefCountObject ...@@ -83,6 +83,9 @@ class Texture : public RefCountObject
bool isImmutable() const; bool isImmutable() const;
GLsizei immutableLevelCount(); GLsizei immutableLevelCount();
void bindTexImage(egl::Surface *surface);
void releaseTexImage();
rx::TextureImpl *getImplementation() { return mTexture; } rx::TextureImpl *getImplementation() { return mTexture; }
const rx::TextureImpl *getImplementation() const { return mTexture; } const rx::TextureImpl *getImplementation() const { return mTexture; }
...@@ -133,6 +136,8 @@ class Texture : public RefCountObject ...@@ -133,6 +136,8 @@ class Texture : public RefCountObject
typedef std::map<ImageIdentifier, ImageDesc> ImageDescMap; typedef std::map<ImageIdentifier, ImageDesc> ImageDescMap;
ImageDescMap mImageDescs; ImageDescMap mImageDescs;
egl::Surface *mBoundSurface;
}; };
class Texture2D : public Texture class Texture2D : public Texture
...@@ -142,30 +147,13 @@ class Texture2D : public Texture ...@@ -142,30 +147,13 @@ class Texture2D : public Texture
virtual ~Texture2D(); virtual ~Texture2D();
Error setImage(GLenum target, size_t level, GLenum internalFormat, const Extents &size, GLenum format, GLenum type,
const PixelUnpackState &unpack, const uint8_t *pixels) override;
Error setCompressedImage(GLenum target, size_t level, GLenum internalFormat, const Extents &size,
const PixelUnpackState &unpack, const uint8_t *pixels) override;
Error copyImage(GLenum target, size_t level, const Rectangle &sourceArea, GLenum internalFormat,
const Framebuffer *source) override;
Error setStorage(GLenum target, size_t levels, GLenum internalFormat, const Extents &size) override;
Error generateMipmaps() override;
virtual bool isSamplerComplete(const SamplerState &samplerState, const Data &data) const; virtual bool isSamplerComplete(const SamplerState &samplerState, const Data &data) const;
virtual void bindTexImage(egl::Surface *surface);
virtual void releaseTexImage();
private: private:
DISALLOW_COPY_AND_ASSIGN(Texture2D); DISALLOW_COPY_AND_ASSIGN(Texture2D);
bool isMipmapComplete() const; bool isMipmapComplete() const;
bool isLevelComplete(size_t level) const; bool isLevelComplete(size_t level) const;
egl::Surface *mSurface;
}; };
class TextureCubeMap : public Texture class TextureCubeMap : public Texture
......
...@@ -864,7 +864,7 @@ EGLBoolean EGLAPIENTRY BindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint b ...@@ -864,7 +864,7 @@ EGLBoolean EGLAPIENTRY BindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint b
gl::Context *context = GetGlobalContext(); gl::Context *context = GetGlobalContext();
if (context) if (context)
{ {
gl::Texture2D *textureObject = context->getTexture2D(); gl::Texture *textureObject = context->getTargetTexture(GL_TEXTURE_2D);
ASSERT(textureObject != NULL); ASSERT(textureObject != NULL);
if (textureObject->isImmutable()) if (textureObject->isImmutable())
...@@ -929,7 +929,7 @@ EGLBoolean EGLAPIENTRY ReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLin ...@@ -929,7 +929,7 @@ EGLBoolean EGLAPIENTRY ReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLin
return EGL_FALSE; return EGL_FALSE;
} }
gl::Texture2D *texture = eglSurface->getBoundTexture(); gl::Texture *texture = eglSurface->getBoundTexture();
if (texture) if (texture)
{ {
......
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