Commit 6053a52e by Brandon Jones

Moved some validation back to Texture, unified all TextureImpl variants

BUG=angle:688 Change-Id: Ie2df18277c84345fceaa31d4f63f5cbbb47540c6 Reviewed-on: https://chromium-review.googlesource.com/211387Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Tested-by: 's avatarBrandon Jones <bajones@chromium.org>
parent b9b5c105
......@@ -66,10 +66,10 @@ Context::Context(int clientVersion, const gl::Context *shareContext, rx::Rendere
// In order that access to these initial textures not be lost, they are treated as texture
// objects all of whose names are 0.
mTexture2DZero.set(new Texture2D(mRenderer->createTexture2D(), 0));
mTextureCubeMapZero.set(new TextureCubeMap(mRenderer->createTextureCube(), 0));
mTexture3DZero.set(new Texture3D(mRenderer->createTexture3D(), 0));
mTexture2DArrayZero.set(new Texture2DArray(mRenderer->createTexture2DArray(), 0));
mTexture2DZero.set(new Texture2D(mRenderer->createTexture(GL_TEXTURE_2D), 0));
mTextureCubeMapZero.set(new TextureCubeMap(mRenderer->createTexture(GL_TEXTURE_CUBE_MAP), 0));
mTexture3DZero.set(new Texture3D(mRenderer->createTexture(GL_TEXTURE_3D), 0));
mTexture2DArrayZero.set(new Texture2DArray(mRenderer->createTexture(GL_TEXTURE_2D_ARRAY), 0));
bindVertexArray(0);
bindArrayBuffer(0);
......@@ -1501,7 +1501,7 @@ void Context::applyTextures(SamplerType shaderType, Texture *textures[], Texture
if (texture)
{
// TODO: std::binary_search may become unavailable using older versions of GCC
if (texture->isSamplerComplete(sampler) &&
if (texture->isSamplerComplete(sampler, mTextureCaps, mExtensions, mClientVersion) &&
!std::binary_search(framebufferSerials.begin(), framebufferSerials.begin() + framebufferSerialCount, texture->getTextureSerial()))
{
mRenderer->setSamplerState(shaderType, samplerIndex, sampler);
......@@ -2118,7 +2118,7 @@ Texture *Context::getIncompleteTexture(TextureType type)
case TEXTURE_2D:
{
Texture2D *incomplete2d = new Texture2D(mRenderer->createTexture2D(), Texture::INCOMPLETE_TEXTURE_ID);
Texture2D *incomplete2d = new Texture2D(mRenderer->createTexture(GL_TEXTURE_2D), Texture::INCOMPLETE_TEXTURE_ID);
incomplete2d->setImage(0, 1, 1, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, incompleteUnpackState, color);
t = incomplete2d;
}
......@@ -2126,7 +2126,7 @@ Texture *Context::getIncompleteTexture(TextureType type)
case TEXTURE_CUBE:
{
TextureCubeMap *incompleteCube = new TextureCubeMap(mRenderer->createTextureCube(), Texture::INCOMPLETE_TEXTURE_ID);
TextureCubeMap *incompleteCube = new TextureCubeMap(mRenderer->createTexture(GL_TEXTURE_CUBE_MAP), Texture::INCOMPLETE_TEXTURE_ID);
incompleteCube->setImagePosX(0, 1, 1, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, incompleteUnpackState, color);
incompleteCube->setImageNegX(0, 1, 1, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, incompleteUnpackState, color);
......@@ -2141,7 +2141,7 @@ Texture *Context::getIncompleteTexture(TextureType type)
case TEXTURE_3D:
{
Texture3D *incomplete3d = new Texture3D(mRenderer->createTexture3D(), Texture::INCOMPLETE_TEXTURE_ID);
Texture3D *incomplete3d = new Texture3D(mRenderer->createTexture(GL_TEXTURE_3D), Texture::INCOMPLETE_TEXTURE_ID);
incomplete3d->setImage(0, 1, 1, 1, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, incompleteUnpackState, color);
t = incomplete3d;
......@@ -2150,7 +2150,7 @@ Texture *Context::getIncompleteTexture(TextureType type)
case TEXTURE_2D_ARRAY:
{
Texture2DArray *incomplete2darray = new Texture2DArray(mRenderer->createTexture2DArray(), Texture::INCOMPLETE_TEXTURE_ID);
Texture2DArray *incomplete2darray = new Texture2DArray(mRenderer->createTexture(GL_TEXTURE_2D_ARRAY), Texture::INCOMPLETE_TEXTURE_ID);
incomplete2darray->setImage(0, 1, 1, 1, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, incompleteUnpackState, color);
t = incomplete2darray;
......
......@@ -379,19 +379,19 @@ void ResourceManager::checkTextureAllocation(GLuint texture, TextureType type)
if (type == TEXTURE_2D)
{
textureObject = new Texture2D(mRenderer->createTexture2D(), texture);
textureObject = new Texture2D(mRenderer->createTexture(GL_TEXTURE_2D), texture);
}
else if (type == TEXTURE_CUBE)
{
textureObject = new TextureCubeMap(mRenderer->createTextureCube(), texture);
textureObject = new TextureCubeMap(mRenderer->createTexture(GL_TEXTURE_CUBE_MAP), texture);
}
else if (type == TEXTURE_3D)
{
textureObject = new Texture3D(mRenderer->createTexture3D(), texture);
textureObject = new Texture3D(mRenderer->createTexture(GL_TEXTURE_3D), texture);
}
else if (type == TEXTURE_2D_ARRAY)
{
textureObject = new Texture2DArray(mRenderer->createTexture2DArray(), texture);
textureObject = new Texture2DArray(mRenderer->createTexture(GL_TEXTURE_2D_ARRAY), texture);
}
else
{
......
......@@ -20,6 +20,7 @@
#include "libGLESv2/angletypes.h"
#include "libGLESv2/constants.h"
#include "libGLESv2/renderer/TextureImpl.h"
#include "libGLESv2/Caps.h"
namespace egl
{
......@@ -38,10 +39,12 @@ namespace gl
class Framebuffer;
class FramebufferAttachment;
bool IsMipmapFiltered(const gl::SamplerState &samplerState);
class Texture : public RefCountObject
{
public:
Texture(GLuint id, GLenum target);
Texture(rx::TextureImpl *impl, GLuint id, GLenum target);
virtual ~Texture();
......@@ -59,7 +62,7 @@ class Texture : public RefCountObject
GLint getBaseLevelDepth() const;
GLenum getBaseLevelInternalFormat() const;
bool isSamplerComplete(const SamplerState &samplerState) const;
virtual bool isSamplerComplete(const SamplerState &samplerState, const TextureCapsMap &textureCaps, const Extensions &extensions, int clientVersion) const = 0;
rx::TextureStorageInterface *getNativeTexture();
......@@ -71,14 +74,16 @@ class Texture : public RefCountObject
bool isImmutable() const;
int immutableLevelCount();
virtual rx::TextureImpl *getImplementation() = 0;
virtual const rx::TextureImpl *getImplementation() const = 0;
rx::TextureImpl *getImplementation() { return mTexture; }
const rx::TextureImpl *getImplementation() const { return mTexture; }
static const GLuint INCOMPLETE_TEXTURE_ID = static_cast<GLuint>(-1); // Every texture takes an id at creation time. The value is arbitrary because it is never registered with the resource manager.
protected:
int mipLevels() const;
rx::TextureImpl *mTexture;
SamplerState mSamplerState;
GLenum mUsage;
......@@ -86,18 +91,18 @@ class Texture : public RefCountObject
GLenum mTarget;
const rx::Image *getBaseLevelImage() const;
private:
DISALLOW_COPY_AND_ASSIGN(Texture);
const rx::Image *getBaseLevelImage() const;
};
class Texture2D : public Texture
{
public:
Texture2D(rx::Texture2DImpl *impl, GLuint id);
Texture2D(rx::TextureImpl *impl, GLuint id);
~Texture2D();
virtual ~Texture2D();
GLsizei getWidth(GLint level) const;
GLsizei getHeight(GLint level) const;
......@@ -113,6 +118,7 @@ class Texture2D : public Texture
void copyImage(GLint level, GLenum format, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source);
void storage(GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
virtual bool isSamplerComplete(const SamplerState &samplerState, const TextureCapsMap &textureCaps, const Extensions &extensions, int clientVersion) const;
virtual void bindTexImage(egl::Surface *surface);
virtual void releaseTexImage();
......@@ -120,9 +126,6 @@ class Texture2D : public Texture
unsigned int getRenderTargetSerial(GLint level);
virtual rx::TextureImpl *getImplementation() { return mTexture; }
virtual const rx::TextureImpl *getImplementation() const { return mTexture; }
protected:
friend class Texture2DAttachment;
rx::RenderTarget *getRenderTarget(GLint level);
......@@ -131,16 +134,18 @@ class Texture2D : public Texture
private:
DISALLOW_COPY_AND_ASSIGN(Texture2D);
rx::Texture2DImpl *mTexture;
bool isMipmapComplete() const;
bool isLevelComplete(int level) const;
egl::Surface *mSurface;
};
class TextureCubeMap : public Texture
{
public:
TextureCubeMap(rx::TextureCubeImpl *impl, GLuint id);
TextureCubeMap(rx::TextureImpl *impl, GLuint id);
~TextureCubeMap();
virtual ~TextureCubeMap();
GLsizei getWidth(GLenum target, GLint level) const;
GLsizei getHeight(GLenum target, GLint level) const;
......@@ -163,6 +168,8 @@ class TextureCubeMap : public Texture
void copyImage(GLenum target, GLint level, GLenum format, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source);
void storage(GLsizei levels, GLenum internalformat, GLsizei size);
virtual bool isSamplerComplete(const SamplerState &samplerState, const TextureCapsMap &textureCaps, const Extensions &extensions, int clientVersion) const;
bool isCubeComplete() const;
unsigned int getRenderTargetSerial(GLenum target, GLint level);
......@@ -170,9 +177,6 @@ class TextureCubeMap : public Texture
static int targetToLayerIndex(GLenum target);
static GLenum layerIndexToTarget(GLint layer);
virtual rx::TextureImpl *getImplementation() { return mTexture; }
virtual const rx::TextureImpl *getImplementation() const { return mTexture; }
protected:
friend class TextureCubeMapAttachment;
rx::RenderTarget *getRenderTarget(GLenum target, GLint level);
......@@ -181,15 +185,16 @@ class TextureCubeMap : public Texture
private:
DISALLOW_COPY_AND_ASSIGN(TextureCubeMap);
rx::TextureCubeImpl *mTexture;
bool isMipmapComplete() const;
bool isFaceLevelComplete(int faceIndex, int level) const;
};
class Texture3D : public Texture
{
public:
Texture3D(rx::Texture3DImpl *impl, GLuint id);
Texture3D(rx::TextureImpl *impl, GLuint id);
~Texture3D();
virtual ~Texture3D();
GLsizei getWidth(GLint level) const;
GLsizei getHeight(GLint level) const;
......@@ -205,10 +210,9 @@ class Texture3D : public Texture
void subImageCompressed(GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *pixels);
void storage(GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
unsigned int getRenderTargetSerial(GLint level, GLint layer);
virtual bool isSamplerComplete(const SamplerState &samplerState, const TextureCapsMap &textureCaps, const Extensions &extensions, int clientVersion) const;
virtual rx::TextureImpl *getImplementation() { return mTexture; }
virtual const rx::TextureImpl *getImplementation() const { return mTexture; }
unsigned int getRenderTargetSerial(GLint level, GLint layer);
protected:
friend class Texture3DAttachment;
......@@ -218,15 +222,16 @@ class Texture3D : public Texture
private:
DISALLOW_COPY_AND_ASSIGN(Texture3D);
rx::Texture3DImpl *mTexture;
bool isMipmapComplete() const;
bool isLevelComplete(int level) const;
};
class Texture2DArray : public Texture
{
public:
Texture2DArray(rx::Texture2DArrayImpl *impl, GLuint id);
Texture2DArray(rx::TextureImpl *impl, GLuint id);
~Texture2DArray();
virtual ~Texture2DArray();
GLsizei getWidth(GLint level) const;
GLsizei getHeight(GLint level) const;
......@@ -242,10 +247,9 @@ class Texture2DArray : public Texture
void subImageCompressed(GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *pixels);
void storage(GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
unsigned int getRenderTargetSerial(GLint level, GLint layer);
virtual bool isSamplerComplete(const SamplerState &samplerState, const TextureCapsMap &textureCaps, const Extensions &extensions, int clientVersion) const;
virtual rx::TextureImpl *getImplementation() { return mTexture; }
virtual const rx::TextureImpl *getImplementation() const { return mTexture; }
unsigned int getRenderTargetSerial(GLint level, GLint layer);
protected:
friend class Texture2DArrayAttachment;
......@@ -255,7 +259,8 @@ class Texture2DArray : public Texture
private:
DISALLOW_COPY_AND_ASSIGN(Texture2DArray);
rx::Texture2DArrayImpl *mTexture;
bool isMipmapComplete() const;
bool isLevelComplete(int level) const;
};
}
......
......@@ -57,10 +57,7 @@ class RenderTarget;
class Image;
class TextureStorage;
class UniformStorage;
class Texture2DImpl;
class TextureCubeImpl;
class Texture3DImpl;
class Texture2DArrayImpl;
class TextureImpl;
struct ConfigDesc
{
......@@ -224,10 +221,7 @@ class Renderer
virtual TextureStorage *createTextureStorage2DArray(GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, GLsizei depth, int levels) = 0;
// Texture creation
virtual Texture2DImpl *createTexture2D() = 0;
virtual TextureCubeImpl *createTextureCube() = 0;
virtual Texture3DImpl *createTexture3D() = 0;
virtual Texture2DArrayImpl *createTexture2DArray() = 0;
virtual TextureImpl *createTexture(GLenum target) = 0;
// Buffer creation
virtual BufferImpl *createBuffer() = 0;
......
......@@ -34,6 +34,8 @@ class TextureStorageInterface;
class TextureImpl
{
public:
virtual ~TextureImpl() {};
// TODO: If this methods could go away that would be ideal;
// TextureStorage should only be necessary for the D3D backend, and as such
// higher level code should not rely on it.
......@@ -42,12 +44,8 @@ class TextureImpl
virtual Image *getImage(int level, int layer) const = 0;
virtual GLsizei getLayerCount(int level) const = 0;
virtual bool hasDirtyImages() const = 0;
virtual void resetDirty() = 0;
virtual void setUsage(GLenum usage) = 0;
virtual bool isSamplerComplete(const gl::SamplerState &samplerState) const = 0;
virtual void setImage(GLenum target, GLint level, GLsizei width, GLsizei height, GLsizei depth, GLenum internalFormat, GLenum format, GLenum type, const gl::PixelUnpackState &unpack, const void *pixels) = 0;
virtual void setCompressedImage(GLenum target, GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei depth, GLsizei imageSize, const void *pixels) = 0;
virtual void subImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const gl::PixelUnpackState &unpack, const void *pixels) = 0;
......@@ -61,37 +59,11 @@ class TextureImpl
virtual unsigned int getRenderTargetSerial(GLint level, GLint layer) = 0;
virtual RenderTarget *getRenderTarget(GLint level, GLint layer) = 0;
virtual RenderTarget *getDepthStencil(GLint level, GLint layer) = 0;
};
class Texture2DImpl : public TextureImpl
{
public:
virtual ~Texture2DImpl() {}
virtual void bindTexImage(egl::Surface *surface) = 0;
virtual void releaseTexImage() = 0;
};
class TextureCubeImpl : public TextureImpl
{
public:
virtual ~TextureCubeImpl() {}
virtual bool isCubeComplete() const = 0;
};
class Texture3DImpl : public TextureImpl
{
public:
virtual ~Texture3DImpl() {}
};
class Texture2DArrayImpl : public TextureImpl
{
public:
virtual ~Texture2DArrayImpl() {}
};
}
#endif // LIBGLESV2_RENDERER_TEXTUREIMPL_H_
......@@ -30,14 +30,20 @@ class TextureStorageInterfaceCube;
class TextureStorageInterface3D;
class TextureStorageInterface2DArray;
bool IsMipmapFiltered(const gl::SamplerState &samplerState);
class TextureD3D
class TextureD3D : public TextureImpl
{
public:
TextureD3D(Renderer *renderer);
virtual ~TextureD3D();
static TextureD3D *makeTextureD3D(TextureImpl *texture);
virtual TextureStorageInterface *getNativeTexture();
virtual void setUsage(GLenum usage) { mUsage = usage; }
bool hasDirtyImages() const { return mDirtyImages; }
void resetDirty() { mDirtyImages = false; }
GLint getBaseLevelWidth() const;
GLint getBaseLevelHeight() const;
GLint getBaseLevelDepth() const;
......@@ -70,27 +76,22 @@ class TextureD3D
private:
DISALLOW_COPY_AND_ASSIGN(TextureD3D);
virtual void initializeStorage(bool renderTarget) = 0;
virtual void updateStorage() = 0;
virtual TextureStorageInterface *getBaseLevelStorage() = 0;
virtual const ImageD3D *getBaseLevelImage() const = 0;
};
class TextureD3D_2D : public Texture2DImpl, public TextureD3D
class TextureD3D_2D : public TextureD3D
{
public:
TextureD3D_2D(Renderer *renderer);
virtual ~TextureD3D_2D();
static TextureD3D_2D *makeTextureD3D_2D(Texture2DImpl *texture);
virtual TextureStorageInterface *getNativeTexture();
virtual Image *getImage(int level, int layer) const;
virtual GLsizei getLayerCount(int level) const;
virtual bool hasDirtyImages() const { return mDirtyImages; }
virtual void resetDirty() { mDirtyImages = false; }
virtual void setUsage(GLenum usage) { mUsage = usage; }
GLsizei getWidth(GLint level) const;
GLsizei getHeight(GLint level) const;
GLenum getInternalFormat(GLint level) const;
......@@ -105,7 +106,6 @@ class TextureD3D_2D : public Texture2DImpl, public TextureD3D
virtual void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, gl::Framebuffer *source);
virtual void storage(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
virtual bool isSamplerComplete(const gl::SamplerState &samplerState) const;
virtual void bindTexImage(egl::Surface *surface);
virtual void releaseTexImage();
......@@ -119,16 +119,15 @@ class TextureD3D_2D : public Texture2DImpl, public TextureD3D
private:
DISALLOW_COPY_AND_ASSIGN(TextureD3D_2D);
void initializeStorage(bool renderTarget);
virtual void initializeStorage(bool renderTarget);
TextureStorageInterface2D *createCompleteStorage(bool renderTarget) const;
void setCompleteTexStorage(TextureStorageInterface2D *newCompleteTexStorage);
void updateStorage();
virtual void updateStorage();
bool ensureRenderTarget();
virtual TextureStorageInterface *getBaseLevelStorage();
virtual const ImageD3D *getBaseLevelImage() const;
bool isMipmapComplete() const;
bool isValidLevel(int level) const;
bool isLevelComplete(int level) const;
......@@ -141,16 +140,12 @@ class TextureD3D_2D : public Texture2DImpl, public TextureD3D
ImageD3D *mImageArray[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
};
class TextureD3D_Cube : public TextureCubeImpl, public TextureD3D
class TextureD3D_Cube : public TextureD3D
{
public:
TextureD3D_Cube(Renderer *renderer);
virtual ~TextureD3D_Cube();
static TextureD3D_Cube *makeTextureD3D_Cube(TextureCubeImpl *texture);
virtual TextureStorageInterface *getNativeTexture();
virtual Image *getImage(int level, int layer) const;
virtual GLsizei getLayerCount(int level) const;
......@@ -169,8 +164,8 @@ class TextureD3D_Cube : public TextureCubeImpl, public TextureD3D
virtual void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, gl::Framebuffer *source);
virtual void storage(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
virtual bool isSamplerComplete(const gl::SamplerState &samplerState) const;
virtual bool isCubeComplete() const;
virtual void bindTexImage(egl::Surface *surface);
virtual void releaseTexImage();
virtual void generateMipmaps();
......@@ -182,18 +177,18 @@ class TextureD3D_Cube : public TextureCubeImpl, public TextureD3D
private:
DISALLOW_COPY_AND_ASSIGN(TextureD3D_Cube);
void initializeStorage(bool renderTarget);
virtual void initializeStorage(bool renderTarget);
TextureStorageInterfaceCube *createCompleteStorage(bool renderTarget) const;
void setCompleteTexStorage(TextureStorageInterfaceCube *newCompleteTexStorage);
void updateStorage();
virtual void updateStorage();
bool ensureRenderTarget();
virtual TextureStorageInterface *getBaseLevelStorage();
virtual const ImageD3D *getBaseLevelImage() const;
bool isMipmapCubeComplete() const;
bool isValidFaceLevel(int faceIndex, int level) const;
bool isFaceLevelComplete(int faceIndex, int level) const;
bool isCubeComplete() const;
void updateStorageFaceLevel(int faceIndex, int level);
void redefineImage(int faceIndex, GLint level, GLenum internalformat, GLsizei width, GLsizei height);
......@@ -204,23 +199,15 @@ class TextureD3D_Cube : public TextureCubeImpl, public TextureD3D
TextureStorageInterfaceCube *mTexStorage;
};
class TextureD3D_3D : public Texture3DImpl, public TextureD3D
class TextureD3D_3D : public TextureD3D
{
public:
TextureD3D_3D(Renderer *renderer);
virtual ~TextureD3D_3D();
static TextureD3D_3D *makeTextureD3D_3D(Texture3DImpl *texture);
virtual TextureStorageInterface *getNativeTexture();
virtual Image *getImage(int level, int layer) const;
virtual GLsizei getLayerCount(int level) const;
virtual bool hasDirtyImages() const { return mDirtyImages; }
virtual void resetDirty() { mDirtyImages = false; }
virtual void setUsage(GLenum usage) { mUsage = usage; }
GLsizei getWidth(GLint level) const;
GLsizei getHeight(GLint level) const;
GLsizei getDepth(GLint level) const;
......@@ -235,7 +222,8 @@ class TextureD3D_3D : public Texture3DImpl, public TextureD3D
virtual void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, gl::Framebuffer *source);
virtual void storage(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
virtual bool isSamplerComplete(const gl::SamplerState &samplerState) const;
virtual void bindTexImage(egl::Surface *surface);
virtual void releaseTexImage();
virtual void generateMipmaps();
......@@ -252,12 +240,11 @@ class TextureD3D_3D : public Texture3DImpl, public TextureD3D
TextureStorageInterface3D *createCompleteStorage(bool renderTarget) const;
void setCompleteTexStorage(TextureStorageInterface3D *newCompleteTexStorage);
void updateStorage();
virtual void updateStorage();
bool ensureRenderTarget();
virtual TextureStorageInterface *getBaseLevelStorage();
virtual const ImageD3D *getBaseLevelImage() const;
bool isMipmapComplete() const;
bool isValidLevel(int level) const;
bool isLevelComplete(int level) const;
void updateStorageLevel(int level);
......@@ -270,23 +257,15 @@ class TextureD3D_3D : public Texture3DImpl, public TextureD3D
TextureStorageInterface3D *mTexStorage;
};
class TextureD3D_2DArray : public Texture2DArrayImpl, public TextureD3D
class TextureD3D_2DArray : public TextureD3D
{
public:
TextureD3D_2DArray(Renderer *renderer);
virtual ~TextureD3D_2DArray();
static TextureD3D_2DArray *makeTextureD3D_2DArray(Texture2DArrayImpl *texture);
virtual TextureStorageInterface *getNativeTexture();
virtual Image *getImage(int level, int layer) const;
virtual GLsizei getLayerCount(int level) const;
virtual bool hasDirtyImages() const { return mDirtyImages; }
virtual void resetDirty() { mDirtyImages = false; }
virtual void setUsage(GLenum usage) { mUsage = usage; }
GLsizei getWidth(GLint level) const;
GLsizei getHeight(GLint level) const;
GLsizei getLayers(GLint level) const;
......@@ -301,7 +280,8 @@ class TextureD3D_2DArray : public Texture2DArrayImpl, public TextureD3D
virtual void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, gl::Framebuffer *source);
virtual void storage(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
virtual bool isSamplerComplete(const gl::SamplerState &samplerState) const;
virtual void bindTexImage(egl::Surface *surface);
virtual void releaseTexImage();
virtual void generateMipmaps();
......@@ -317,12 +297,11 @@ class TextureD3D_2DArray : public Texture2DArrayImpl, public TextureD3D
TextureStorageInterface2DArray *createCompleteStorage(bool renderTarget) const;
void setCompleteTexStorage(TextureStorageInterface2DArray *newCompleteTexStorage);
void updateStorage();
virtual void updateStorage();
bool ensureRenderTarget();
virtual TextureStorageInterface *getBaseLevelStorage();
virtual const ImageD3D *getBaseLevelImage() const;
bool isMipmapComplete() const;
bool isValidLevel(int level) const;
bool isLevelComplete(int level) const;
void updateStorageLevel(int level);
......
......@@ -473,7 +473,7 @@ void Renderer11::setTexture(gl::SamplerType type, int index, gl::Texture *textur
if (texture)
{
TextureImpl* textureImpl = texture->getImplementation();
TextureD3D* textureImpl = TextureD3D::makeTextureD3D(texture->getImplementation());
TextureStorageInterface *texStorage = textureImpl->getNativeTexture();
if (texStorage)
......@@ -2799,24 +2799,19 @@ TextureStorage *Renderer11::createTextureStorage2DArray(GLenum internalformat, b
return new TextureStorage11_2DArray(this, internalformat, renderTarget, width, height, depth, levels);
}
Texture2DImpl *Renderer11::createTexture2D()
TextureImpl *Renderer11::createTexture(GLenum target)
{
return new TextureD3D_2D(this);
}
TextureCubeImpl *Renderer11::createTextureCube()
{
return new TextureD3D_Cube(this);
}
Texture3DImpl *Renderer11::createTexture3D()
{
return new TextureD3D_3D(this);
}
switch(target)
{
case GL_TEXTURE_2D: return new TextureD3D_2D(this);
case GL_TEXTURE_CUBE_MAP: return new TextureD3D_Cube(this);
case GL_TEXTURE_3D: return new TextureD3D_3D(this);
case GL_TEXTURE_2D_ARRAY: return new TextureD3D_2DArray(this);
default:
UNREACHABLE();
}
Texture2DArrayImpl *Renderer11::createTexture2DArray()
{
return new TextureD3D_2DArray(this);
return NULL;
}
void Renderer11::readTextureData(ID3D11Texture2D *texture, unsigned int subResource, const gl::Rectangle &area, GLenum format,
......
......@@ -171,10 +171,7 @@ class Renderer11 : public Renderer
virtual TextureStorage *createTextureStorage2DArray(GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, GLsizei depth, int levels);
// Texture creation
virtual Texture2DImpl *createTexture2D();
virtual TextureCubeImpl *createTextureCube();
virtual Texture3DImpl *createTexture3D();
virtual Texture2DArrayImpl *createTexture2DArray();
virtual TextureImpl *createTexture(GLenum target);
// Buffer creation
virtual BufferImpl *createBuffer();
......
......@@ -196,7 +196,7 @@ UINT TextureStorage11::getSubresourceIndex(int mipLevel, int layerTarget) const
ID3D11ShaderResourceView *TextureStorage11::getSRV(const gl::SamplerState &samplerState)
{
bool swizzleRequired = samplerState.swizzleRequired();
bool mipmapping = IsMipmapFiltered(samplerState);
bool mipmapping = gl::IsMipmapFiltered(samplerState);
unsigned int mipLevels = mipmapping ? (samplerState.maxLevel - samplerState.baseLevel) : 1;
// Make sure there's 'mipLevels' mipmap levels below the base level (offset by the top level, which corresponds to GL level 0)
......
......@@ -661,7 +661,7 @@ void Renderer9::setTexture(gl::SamplerType type, int index, gl::Texture *texture
if (texture)
{
TextureImpl* textureImpl = texture->getImplementation();
TextureD3D* textureImpl = TextureD3D::makeTextureD3D(texture->getImplementation());
TextureStorageInterface *texStorage = textureImpl->getNativeTexture();
if (texStorage)
......@@ -3043,24 +3043,19 @@ TextureStorage *Renderer9::createTextureStorage2DArray(GLenum internalformat, bo
return NULL;
}
Texture2DImpl *Renderer9::createTexture2D()
TextureImpl *Renderer9::createTexture(GLenum target)
{
return new TextureD3D_2D(this);
}
TextureCubeImpl *Renderer9::createTextureCube()
{
return new TextureD3D_Cube(this);
}
Texture3DImpl *Renderer9::createTexture3D()
{
return new TextureD3D_3D(this);
}
switch(target)
{
case GL_TEXTURE_2D: return new TextureD3D_2D(this);
case GL_TEXTURE_CUBE_MAP: return new TextureD3D_Cube(this);
case GL_TEXTURE_3D: return new TextureD3D_3D(this);
case GL_TEXTURE_2D_ARRAY: return new TextureD3D_2DArray(this);
default:
UNREACHABLE();
}
Texture2DArrayImpl *Renderer9::createTexture2DArray()
{
return new TextureD3D_2DArray(this);
return NULL;
}
bool Renderer9::getLUID(LUID *adapterLuid) const
......
......@@ -173,10 +173,7 @@ class Renderer9 : public Renderer
virtual TextureStorage *createTextureStorage2DArray(GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, GLsizei depth, int levels);
// Texture creation
virtual Texture2DImpl *createTexture2D();
virtual TextureCubeImpl *createTextureCube();
virtual Texture3DImpl *createTexture3D();
virtual Texture2DArrayImpl *createTexture2DArray();
virtual TextureImpl *createTexture(GLenum target);
// Buffer creation
virtual BufferImpl *createBuffer();
......
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