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