Commit 4cfff5f3 by Jamie Madill

Modify texture storage classes to store a base and max level, instead of a range of levels.

TRAC #23978 Signed-off-by: Geoff Lang Signed-off-by: Shannon Woods
parent b16b8ed7
...@@ -242,10 +242,10 @@ class Renderer ...@@ -242,10 +242,10 @@ class Renderer
virtual Image *createImage() = 0; virtual Image *createImage() = 0;
virtual void generateMipmap(Image *dest, Image *source) = 0; virtual void generateMipmap(Image *dest, Image *source) = 0;
virtual TextureStorage *createTextureStorage2D(SwapChain *swapChain) = 0; virtual TextureStorage *createTextureStorage2D(SwapChain *swapChain) = 0;
virtual TextureStorage *createTextureStorage2D(int levels, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height) = 0; virtual TextureStorage *createTextureStorage2D(int baseLevel, int maxLevel, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height) = 0;
virtual TextureStorage *createTextureStorageCube(int levels, GLenum internalformat, bool renderTarget, int size) = 0; virtual TextureStorage *createTextureStorageCube(int baseLevel, int maxLevel, GLenum internalformat, bool renderTarget, int size) = 0;
virtual TextureStorage *createTextureStorage3D(int levels, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, GLsizei depth) = 0; virtual TextureStorage *createTextureStorage3D(int baseLevel, int maxLevel, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, GLsizei depth) = 0;
virtual TextureStorage *createTextureStorage2DArray(int levels, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, GLsizei depth) = 0; virtual TextureStorage *createTextureStorage2DArray(int baseLevel, int maxLevel, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, GLsizei depth) = 0;
// Buffer creation // Buffer creation
virtual VertexBuffer *createVertexBuffer() = 0; virtual VertexBuffer *createVertexBuffer() = 0;
......
...@@ -57,13 +57,19 @@ int TextureStorageInterface::getLodOffset() const ...@@ -57,13 +57,19 @@ int TextureStorageInterface::getLodOffset() const
return mInstance->getLodOffset(); return mInstance->getLodOffset();
} }
int TextureStorageInterface::levelCount() int TextureStorageInterface::getBaseLevel() const
{ {
return mInstance->levelCount(); return mInstance->getBaseLevel();
} }
static unsigned int GetActualLevelCount(GLsizei width, GLsizei height, GLsizei depth, GLint levelCount) int TextureStorageInterface::getMaxLevel() const
{ {
return mInstance->getMaxLevel();
}
static unsigned int GetActualLevelCount(GLsizei width, GLsizei height, GLsizei depth, int baseLevel, int maxLevel)
{
int levelCount = maxLevel - baseLevel;
return (levelCount <= 0) ? std::max(std::max(gl::log2(width), gl::log2(height)), gl::log2(depth)) : levelCount; return (levelCount <= 0) ? std::max(std::max(gl::log2(width), gl::log2(height)), gl::log2(depth)) : levelCount;
} }
...@@ -74,12 +80,12 @@ TextureStorageInterface2D::TextureStorageInterface2D(Renderer *renderer, SwapCha ...@@ -74,12 +80,12 @@ TextureStorageInterface2D::TextureStorageInterface2D(Renderer *renderer, SwapCha
mInstance = renderer->createTextureStorage2D(swapchain); mInstance = renderer->createTextureStorage2D(swapchain);
} }
TextureStorageInterface2D::TextureStorageInterface2D(Renderer *renderer, int levels, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height) TextureStorageInterface2D::TextureStorageInterface2D(Renderer *renderer, int baseLevel, int maxLevel, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height)
{ {
unsigned int actualLevels = GetActualLevelCount(width, height, 0, levels); unsigned int actualLevels = GetActualLevelCount(width, height, 0, baseLevel, maxLevel);
mFirstRenderTargetSerial = gl::RenderbufferStorage::issueSerials(actualLevels); mFirstRenderTargetSerial = gl::RenderbufferStorage::issueSerials(actualLevels);
mInstance = renderer->createTextureStorage2D(levels, internalformat, renderTarget, width, height); mInstance = renderer->createTextureStorage2D(baseLevel, maxLevel, internalformat, renderTarget, width, height);
} }
TextureStorageInterface2D::~TextureStorageInterface2D() TextureStorageInterface2D::~TextureStorageInterface2D()
...@@ -101,12 +107,12 @@ unsigned int TextureStorageInterface2D::getRenderTargetSerial(GLint level) const ...@@ -101,12 +107,12 @@ unsigned int TextureStorageInterface2D::getRenderTargetSerial(GLint level) const
return mFirstRenderTargetSerial + level; return mFirstRenderTargetSerial + level;
} }
TextureStorageInterfaceCube::TextureStorageInterfaceCube(Renderer *renderer, int levels, GLenum internalformat, bool renderTarget, int size) TextureStorageInterfaceCube::TextureStorageInterfaceCube(Renderer *renderer, int baseLevel, int maxLevel, GLenum internalformat, bool renderTarget, int size)
{ {
unsigned int actualLevels = GetActualLevelCount(size, size, 0, levels); unsigned int actualLevels = GetActualLevelCount(size, size, 0, baseLevel, maxLevel);
mFirstRenderTargetSerial = gl::RenderbufferStorage::issueSerials(actualLevels * 6); mFirstRenderTargetSerial = gl::RenderbufferStorage::issueSerials(actualLevels * 6);
mInstance = renderer->createTextureStorageCube(levels, internalformat, renderTarget, size); mInstance = renderer->createTextureStorageCube(baseLevel, maxLevel, internalformat, renderTarget, size);
} }
TextureStorageInterfaceCube::~TextureStorageInterfaceCube() TextureStorageInterfaceCube::~TextureStorageInterfaceCube()
...@@ -128,13 +134,13 @@ unsigned int TextureStorageInterfaceCube::getRenderTargetSerial(GLenum target, G ...@@ -128,13 +134,13 @@ unsigned int TextureStorageInterfaceCube::getRenderTargetSerial(GLenum target, G
return mFirstRenderTargetSerial + (level * 6) + gl::TextureCubeMap::targetToIndex(target); return mFirstRenderTargetSerial + (level * 6) + gl::TextureCubeMap::targetToIndex(target);
} }
TextureStorageInterface3D::TextureStorageInterface3D(Renderer *renderer, int levels, GLenum internalformat, bool renderTarget, TextureStorageInterface3D::TextureStorageInterface3D(Renderer *renderer, int baseLevel, int maxLevel, GLenum internalformat, bool renderTarget,
GLsizei width, GLsizei height, GLsizei depth) GLsizei width, GLsizei height, GLsizei depth)
{ {
mLevels = GetActualLevelCount(width, height, depth, levels); mLevels = GetActualLevelCount(width, height, depth, baseLevel, maxLevel);
mFirstRenderTargetSerial = gl::RenderbufferStorage::issueSerials(mLevels * depth); mFirstRenderTargetSerial = gl::RenderbufferStorage::issueSerials(mLevels * depth);
mInstance = renderer->createTextureStorage3D(levels, internalformat, renderTarget, width, height, depth); mInstance = renderer->createTextureStorage3D(baseLevel, maxLevel, internalformat, renderTarget, width, height, depth);
} }
TextureStorageInterface3D::~TextureStorageInterface3D() TextureStorageInterface3D::~TextureStorageInterface3D()
...@@ -161,13 +167,13 @@ unsigned int TextureStorageInterface3D::getRenderTargetSerial(GLint level, GLint ...@@ -161,13 +167,13 @@ unsigned int TextureStorageInterface3D::getRenderTargetSerial(GLint level, GLint
return mFirstRenderTargetSerial + (layer * mLevels) + level; return mFirstRenderTargetSerial + (layer * mLevels) + level;
} }
TextureStorageInterface2DArray::TextureStorageInterface2DArray(Renderer *renderer, int levels, GLenum internalformat, bool renderTarget, TextureStorageInterface2DArray::TextureStorageInterface2DArray(Renderer *renderer, int baseLevel, int maxLevel, GLenum internalformat, bool renderTarget,
GLsizei width, GLsizei height, GLsizei depth) GLsizei width, GLsizei height, GLsizei depth)
{ {
mLevels = GetActualLevelCount(width, height, 0, levels); mLevels = GetActualLevelCount(width, height, 0, baseLevel, maxLevel);
mFirstRenderTargetSerial = gl::RenderbufferStorage::issueSerials(mLevels * depth); mFirstRenderTargetSerial = gl::RenderbufferStorage::issueSerials(mLevels * depth);
mInstance = renderer->createTextureStorage2DArray(levels, internalformat, renderTarget, width, height, depth); mInstance = renderer->createTextureStorage2DArray(baseLevel, maxLevel, internalformat, renderTarget, width, height, depth);
} }
TextureStorageInterface2DArray::~TextureStorageInterface2DArray() TextureStorageInterface2DArray::~TextureStorageInterface2DArray()
......
...@@ -28,7 +28,8 @@ class TextureStorage ...@@ -28,7 +28,8 @@ class TextureStorage
virtual int getLodOffset() const = 0; virtual int getLodOffset() const = 0;
virtual bool isRenderTarget() const = 0; virtual bool isRenderTarget() const = 0;
virtual bool isManaged() const = 0; virtual bool isManaged() const = 0;
virtual int levelCount() = 0; virtual int getBaseLevel() const = 0;
virtual int getMaxLevel() const = 0;
virtual RenderTarget *getRenderTarget(int level) = 0; virtual RenderTarget *getRenderTarget(int level) = 0;
virtual RenderTarget *getRenderTargetFace(GLenum faceTarget, int level) = 0; virtual RenderTarget *getRenderTargetFace(GLenum faceTarget, int level) = 0;
...@@ -54,7 +55,8 @@ class TextureStorageInterface ...@@ -54,7 +55,8 @@ class TextureStorageInterface
virtual int getLodOffset() const; virtual int getLodOffset() const;
virtual bool isRenderTarget() const; virtual bool isRenderTarget() const;
virtual bool isManaged() const; virtual bool isManaged() const;
virtual int levelCount(); virtual int getBaseLevel() const;
virtual int getMaxLevel() const;
protected: protected:
TextureStorage *mInstance; TextureStorage *mInstance;
...@@ -72,7 +74,7 @@ class TextureStorageInterface2D : public TextureStorageInterface ...@@ -72,7 +74,7 @@ class TextureStorageInterface2D : public TextureStorageInterface
{ {
public: public:
TextureStorageInterface2D(Renderer *renderer, SwapChain *swapchain); TextureStorageInterface2D(Renderer *renderer, SwapChain *swapchain);
TextureStorageInterface2D(Renderer *renderer, int levels, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height); TextureStorageInterface2D(Renderer *renderer, int baseLevel, int maxLevel, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height);
virtual ~TextureStorageInterface2D(); virtual ~TextureStorageInterface2D();
void generateMipmap(int level); void generateMipmap(int level);
...@@ -89,7 +91,7 @@ class TextureStorageInterface2D : public TextureStorageInterface ...@@ -89,7 +91,7 @@ class TextureStorageInterface2D : public TextureStorageInterface
class TextureStorageInterfaceCube : public TextureStorageInterface class TextureStorageInterfaceCube : public TextureStorageInterface
{ {
public: public:
TextureStorageInterfaceCube(Renderer *renderer, int levels, GLenum internalformat, bool renderTarget, int size); TextureStorageInterfaceCube(Renderer *renderer, int baseLevel, int maxLevel, GLenum internalformat, bool renderTarget, int size);
virtual ~TextureStorageInterfaceCube(); virtual ~TextureStorageInterfaceCube();
void generateMipmap(int faceIndex, int level); void generateMipmap(int faceIndex, int level);
...@@ -106,7 +108,7 @@ class TextureStorageInterfaceCube : public TextureStorageInterface ...@@ -106,7 +108,7 @@ class TextureStorageInterfaceCube : public TextureStorageInterface
class TextureStorageInterface3D : public TextureStorageInterface class TextureStorageInterface3D : public TextureStorageInterface
{ {
public: public:
TextureStorageInterface3D(Renderer *renderer, int levels, GLenum internalformat, bool renderTarget, TextureStorageInterface3D(Renderer *renderer, int baseLevel, int maxLevel, GLenum internalformat, bool renderTarget,
GLsizei width, GLsizei height, GLsizei depth); GLsizei width, GLsizei height, GLsizei depth);
virtual ~TextureStorageInterface3D(); virtual ~TextureStorageInterface3D();
...@@ -126,7 +128,7 @@ class TextureStorageInterface3D : public TextureStorageInterface ...@@ -126,7 +128,7 @@ class TextureStorageInterface3D : public TextureStorageInterface
class TextureStorageInterface2DArray : public TextureStorageInterface class TextureStorageInterface2DArray : public TextureStorageInterface
{ {
public: public:
TextureStorageInterface2DArray(Renderer *renderer, int levels, GLenum internalformat, bool renderTarget, TextureStorageInterface2DArray(Renderer *renderer, int baseLevel, int maxLevel, GLenum internalformat, bool renderTarget,
GLsizei width, GLsizei height, GLsizei depth); GLsizei width, GLsizei height, GLsizei depth);
virtual ~TextureStorageInterface2DArray(); virtual ~TextureStorageInterface2DArray();
......
...@@ -3004,24 +3004,24 @@ TextureStorage *Renderer11::createTextureStorage2D(SwapChain *swapChain) ...@@ -3004,24 +3004,24 @@ TextureStorage *Renderer11::createTextureStorage2D(SwapChain *swapChain)
return new TextureStorage11_2D(this, swapChain11); return new TextureStorage11_2D(this, swapChain11);
} }
TextureStorage *Renderer11::createTextureStorage2D(int levels, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height) TextureStorage *Renderer11::createTextureStorage2D(int baseLevel, int maxLevel, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height)
{ {
return new TextureStorage11_2D(this, levels, internalformat, renderTarget, width, height); return new TextureStorage11_2D(this, baseLevel, maxLevel, internalformat, renderTarget, width, height);
} }
TextureStorage *Renderer11::createTextureStorageCube(int levels, GLenum internalformat, bool renderTarget, int size) TextureStorage *Renderer11::createTextureStorageCube(int baseLevel, int maxLevel, GLenum internalformat, bool renderTarget, int size)
{ {
return new TextureStorage11_Cube(this, levels, internalformat, renderTarget, size); return new TextureStorage11_Cube(this, baseLevel, maxLevel, internalformat, renderTarget, size);
} }
TextureStorage *Renderer11::createTextureStorage3D(int levels, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, GLsizei depth) TextureStorage *Renderer11::createTextureStorage3D(int baseLevel, int maxLevel, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, GLsizei depth)
{ {
return new TextureStorage11_3D(this, levels, internalformat, renderTarget, width, height, depth); return new TextureStorage11_3D(this, baseLevel, maxLevel, internalformat, renderTarget, width, height, depth);
} }
TextureStorage *Renderer11::createTextureStorage2DArray(int levels, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, GLsizei depth) TextureStorage *Renderer11::createTextureStorage2DArray(int baseLevel, int maxLevel, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, GLsizei depth)
{ {
return new TextureStorage11_2DArray(this, levels, internalformat, renderTarget, width, height, depth); return new TextureStorage11_2DArray(this, baseLevel, maxLevel, internalformat, renderTarget, width, height, depth);
} }
void Renderer11::readTextureData(ID3D11Texture2D *texture, unsigned int subResource, const gl::Rectangle &area, void Renderer11::readTextureData(ID3D11Texture2D *texture, unsigned int subResource, const gl::Rectangle &area,
......
...@@ -187,10 +187,10 @@ class Renderer11 : public Renderer ...@@ -187,10 +187,10 @@ class Renderer11 : public Renderer
virtual Image *createImage(); virtual Image *createImage();
virtual void generateMipmap(Image *dest, Image *source); virtual void generateMipmap(Image *dest, Image *source);
virtual TextureStorage *createTextureStorage2D(SwapChain *swapChain); virtual TextureStorage *createTextureStorage2D(SwapChain *swapChain);
virtual TextureStorage *createTextureStorage2D(int levels, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height); virtual TextureStorage *createTextureStorage2D(int baseLevel, int maxLevel, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height);
virtual TextureStorage *createTextureStorageCube(int levels, GLenum internalformat, bool renderTarget, int size); virtual TextureStorage *createTextureStorageCube(int baseLevel, int maxLevel, GLenum internalformat, bool renderTarget, int size);
virtual TextureStorage *createTextureStorage3D(int levels, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, GLsizei depth); virtual TextureStorage *createTextureStorage3D(int baseLevel, int maxLevel, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, GLsizei depth);
virtual TextureStorage *createTextureStorage2DArray(int levels, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, GLsizei depth); virtual TextureStorage *createTextureStorage2DArray(int baseLevel, int maxLevel, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, GLsizei depth);
// Buffer creation // Buffer creation
virtual VertexBuffer *createVertexBuffer(); virtual VertexBuffer *createVertexBuffer();
......
...@@ -24,7 +24,6 @@ class SwapChain11; ...@@ -24,7 +24,6 @@ class SwapChain11;
class TextureStorage11 : public TextureStorage class TextureStorage11 : public TextureStorage
{ {
public: public:
TextureStorage11(Renderer *renderer, UINT bindFlags);
virtual ~TextureStorage11(); virtual ~TextureStorage11();
static TextureStorage11 *makeTextureStorage11(TextureStorage *storage); static TextureStorage11 *makeTextureStorage11(TextureStorage *storage);
...@@ -45,14 +44,16 @@ class TextureStorage11 : public TextureStorage ...@@ -45,14 +44,16 @@ class TextureStorage11 : public TextureStorage
virtual int getLodOffset() const; virtual int getLodOffset() const;
virtual bool isRenderTarget() const; virtual bool isRenderTarget() const;
virtual bool isManaged() const; virtual bool isManaged() const;
virtual int levelCount(); virtual int getBaseLevel() const;
UINT getSubresourceIndex(int mipLevel, int layerTarget); virtual int getMaxLevel() const;
UINT getSubresourceIndex(int mipLevel, int layerTarget) const;
bool updateSubresourceLevel(ID3D11Resource *texture, unsigned int sourceSubresource, int level, bool updateSubresourceLevel(ID3D11Resource *texture, unsigned int sourceSubresource, int level,
int layerTarget, GLint xoffset, GLint yoffset, GLint zoffset, int layerTarget, GLint xoffset, GLint yoffset, GLint zoffset,
GLsizei width, GLsizei height, GLsizei depth); GLsizei width, GLsizei height, GLsizei depth);
protected: protected:
TextureStorage11(Renderer *renderer, int baseLevel, UINT bindFlags);
void generateMipmapLayer(RenderTarget11 *source, RenderTarget11 *dest); void generateMipmapLayer(RenderTarget11 *source, RenderTarget11 *dest);
int getLevelWidth(int mipLevel) const; int getLevelWidth(int mipLevel) const;
int getLevelHeight(int mipLevel) const; int getLevelHeight(int mipLevel) const;
...@@ -61,6 +62,7 @@ class TextureStorage11 : public TextureStorage ...@@ -61,6 +62,7 @@ class TextureStorage11 : public TextureStorage
Renderer11 *mRenderer; Renderer11 *mRenderer;
int mLodOffset; int mLodOffset;
unsigned int mMipLevels; unsigned int mMipLevels;
int mBaseLevel;
DXGI_FORMAT mTextureFormat; DXGI_FORMAT mTextureFormat;
DXGI_FORMAT mShaderResourceFormat; DXGI_FORMAT mShaderResourceFormat;
...@@ -82,7 +84,7 @@ class TextureStorage11_2D : public TextureStorage11 ...@@ -82,7 +84,7 @@ class TextureStorage11_2D : public TextureStorage11
{ {
public: public:
TextureStorage11_2D(Renderer *renderer, SwapChain11 *swapchain); TextureStorage11_2D(Renderer *renderer, SwapChain11 *swapchain);
TextureStorage11_2D(Renderer *renderer, int levels, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height); TextureStorage11_2D(Renderer *renderer, int baseLevel, int maxLevel, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height);
virtual ~TextureStorage11_2D(); virtual ~TextureStorage11_2D();
static TextureStorage11_2D *makeTextureStorage11_2D(TextureStorage *storage); static TextureStorage11_2D *makeTextureStorage11_2D(TextureStorage *storage);
...@@ -103,7 +105,7 @@ class TextureStorage11_2D : public TextureStorage11 ...@@ -103,7 +105,7 @@ class TextureStorage11_2D : public TextureStorage11
class TextureStorage11_Cube : public TextureStorage11 class TextureStorage11_Cube : public TextureStorage11
{ {
public: public:
TextureStorage11_Cube(Renderer *renderer, int levels, GLenum internalformat, bool renderTarget, int size); TextureStorage11_Cube(Renderer *renderer, int baseLevel, int maxLevel, GLenum internalformat, bool renderTarget, int size);
virtual ~TextureStorage11_Cube(); virtual ~TextureStorage11_Cube();
static TextureStorage11_Cube *makeTextureStorage11_Cube(TextureStorage *storage); static TextureStorage11_Cube *makeTextureStorage11_Cube(TextureStorage *storage);
...@@ -124,7 +126,7 @@ class TextureStorage11_Cube : public TextureStorage11 ...@@ -124,7 +126,7 @@ class TextureStorage11_Cube : public TextureStorage11
class TextureStorage11_3D : public TextureStorage11 class TextureStorage11_3D : public TextureStorage11
{ {
public: public:
TextureStorage11_3D(Renderer *renderer, int levels, GLenum internalformat, bool renderTarget, TextureStorage11_3D(Renderer *renderer, int baseLevel, int maxLevel, GLenum internalformat, bool renderTarget,
GLsizei width, GLsizei height, GLsizei depth); GLsizei width, GLsizei height, GLsizei depth);
virtual ~TextureStorage11_3D(); virtual ~TextureStorage11_3D();
...@@ -152,7 +154,7 @@ class TextureStorage11_3D : public TextureStorage11 ...@@ -152,7 +154,7 @@ class TextureStorage11_3D : public TextureStorage11
class TextureStorage11_2DArray : public TextureStorage11 class TextureStorage11_2DArray : public TextureStorage11
{ {
public: public:
TextureStorage11_2DArray(Renderer *renderer, int levels, GLenum internalformat, bool renderTarget, TextureStorage11_2DArray(Renderer *renderer, int baseLevel, int maxLevel, GLenum internalformat, bool renderTarget,
GLsizei width, GLsizei height, GLsizei depth); GLsizei width, GLsizei height, GLsizei depth);
virtual ~TextureStorage11_2DArray(); virtual ~TextureStorage11_2DArray();
......
...@@ -2658,7 +2658,7 @@ bool Renderer9::copyToRenderTarget(TextureStorageInterface2D *dest, TextureStora ...@@ -2658,7 +2658,7 @@ bool Renderer9::copyToRenderTarget(TextureStorageInterface2D *dest, TextureStora
TextureStorage9_2D *source9 = TextureStorage9_2D::makeTextureStorage9_2D(source->getStorageInstance()); TextureStorage9_2D *source9 = TextureStorage9_2D::makeTextureStorage9_2D(source->getStorageInstance());
TextureStorage9_2D *dest9 = TextureStorage9_2D::makeTextureStorage9_2D(dest->getStorageInstance()); TextureStorage9_2D *dest9 = TextureStorage9_2D::makeTextureStorage9_2D(dest->getStorageInstance());
int levels = source9->levelCount(); int levels = source9->getMaxLevel() - source9->getBaseLevel();
for (int i = 0; i < levels; ++i) for (int i = 0; i < levels; ++i)
{ {
IDirect3DSurface9 *srcSurf = source9->getSurfaceLevel(i, false); IDirect3DSurface9 *srcSurf = source9->getSurfaceLevel(i, false);
...@@ -2687,7 +2687,7 @@ bool Renderer9::copyToRenderTarget(TextureStorageInterfaceCube *dest, TextureSto ...@@ -2687,7 +2687,7 @@ bool Renderer9::copyToRenderTarget(TextureStorageInterfaceCube *dest, TextureSto
{ {
TextureStorage9_Cube *source9 = TextureStorage9_Cube::makeTextureStorage9_Cube(source->getStorageInstance()); TextureStorage9_Cube *source9 = TextureStorage9_Cube::makeTextureStorage9_Cube(source->getStorageInstance());
TextureStorage9_Cube *dest9 = TextureStorage9_Cube::makeTextureStorage9_Cube(dest->getStorageInstance()); TextureStorage9_Cube *dest9 = TextureStorage9_Cube::makeTextureStorage9_Cube(dest->getStorageInstance());
int levels = source9->levelCount(); int levels = source9->getMaxLevel() - source9->getBaseLevel();
for (int f = 0; f < 6; f++) for (int f = 0; f < 6; f++)
{ {
for (int i = 0; i < levels; i++) for (int i = 0; i < levels; i++)
...@@ -3313,17 +3313,17 @@ TextureStorage *Renderer9::createTextureStorage2D(SwapChain *swapChain) ...@@ -3313,17 +3313,17 @@ TextureStorage *Renderer9::createTextureStorage2D(SwapChain *swapChain)
return new TextureStorage9_2D(this, swapChain9); return new TextureStorage9_2D(this, swapChain9);
} }
TextureStorage *Renderer9::createTextureStorage2D(int levels, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height) TextureStorage *Renderer9::createTextureStorage2D(int baseLevel, int maxLevel, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height)
{ {
return new TextureStorage9_2D(this, levels, internalformat, renderTarget, width, height); return new TextureStorage9_2D(this, baseLevel, maxLevel, internalformat, renderTarget, width, height);
} }
TextureStorage *Renderer9::createTextureStorageCube(int levels, GLenum internalformat, bool renderTarget, int size) TextureStorage *Renderer9::createTextureStorageCube(int baseLevel, int maxLevel, GLenum internalformat, bool renderTarget, int size)
{ {
return new TextureStorage9_Cube(this, levels, internalformat, renderTarget, size); return new TextureStorage9_Cube(this, baseLevel, maxLevel, internalformat, renderTarget, size);
} }
TextureStorage *Renderer9::createTextureStorage3D(int levels, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, GLsizei depth) TextureStorage *Renderer9::createTextureStorage3D(int baseLevel, int maxLevel, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, GLsizei depth)
{ {
// 3D textures are not supported by the D3D9 backend. // 3D textures are not supported by the D3D9 backend.
UNREACHABLE(); UNREACHABLE();
...@@ -3331,7 +3331,7 @@ TextureStorage *Renderer9::createTextureStorage3D(int levels, GLenum internalfor ...@@ -3331,7 +3331,7 @@ TextureStorage *Renderer9::createTextureStorage3D(int levels, GLenum internalfor
return NULL; return NULL;
} }
TextureStorage *Renderer9::createTextureStorage2DArray(int levels, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, GLsizei depth) TextureStorage *Renderer9::createTextureStorage2DArray(int baseLevel, int maxLevel, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, GLsizei depth)
{ {
// 2D array textures are not supported by the D3D9 backend. // 2D array textures are not supported by the D3D9 backend.
UNREACHABLE(); UNREACHABLE();
......
...@@ -203,10 +203,10 @@ class Renderer9 : public Renderer ...@@ -203,10 +203,10 @@ class Renderer9 : public Renderer
virtual Image *createImage(); virtual Image *createImage();
virtual void generateMipmap(Image *dest, Image *source); virtual void generateMipmap(Image *dest, Image *source);
virtual TextureStorage *createTextureStorage2D(SwapChain *swapChain); virtual TextureStorage *createTextureStorage2D(SwapChain *swapChain);
virtual TextureStorage *createTextureStorage2D(int levels, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height); virtual TextureStorage *createTextureStorage2D(int baseLevel, int maxLevel, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height);
virtual TextureStorage *createTextureStorageCube(int levels, GLenum internalformat, bool renderTarget, int size); virtual TextureStorage *createTextureStorageCube(int baseLevel, int maxLevel, GLenum internalformat, bool renderTarget, int size);
virtual TextureStorage *createTextureStorage3D(int levels, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, GLsizei depth); virtual TextureStorage *createTextureStorage3D(int baseLevel, int maxLevel, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, GLsizei depth);
virtual TextureStorage *createTextureStorage2DArray(int levels, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, GLsizei depth); virtual TextureStorage *createTextureStorage2DArray(int baseLevel, int maxLevel, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, GLsizei depth);
// Buffer creation // Buffer creation
virtual VertexBuffer *createVertexBuffer(); virtual VertexBuffer *createVertexBuffer();
......
...@@ -20,8 +20,9 @@ ...@@ -20,8 +20,9 @@
namespace rx namespace rx
{ {
TextureStorage9::TextureStorage9(Renderer *renderer, DWORD usage) TextureStorage9::TextureStorage9(Renderer *renderer, int baseLevel, DWORD usage)
: mLodOffset(0), : mLodOffset(0),
mBaseLevel(baseLevel),
mRenderer(Renderer9::makeRenderer9(renderer)), mRenderer(Renderer9::makeRenderer9(renderer)),
mD3DUsage(usage), mD3DUsage(usage),
mD3DPool(mRenderer->getTexturePool(usage)) mD3DPool(mRenderer->getTexturePool(usage))
...@@ -83,12 +84,18 @@ int TextureStorage9::getLodOffset() const ...@@ -83,12 +84,18 @@ int TextureStorage9::getLodOffset() const
return mLodOffset; return mLodOffset;
} }
int TextureStorage9::levelCount() int TextureStorage9::getBaseLevel() const
{ {
return getBaseTexture() ? getBaseTexture()->GetLevelCount() - getLodOffset() : 0; return mBaseLevel;
} }
TextureStorage9_2D::TextureStorage9_2D(Renderer *renderer, SwapChain9 *swapchain) : TextureStorage9(renderer, D3DUSAGE_RENDERTARGET) int TextureStorage9::getMaxLevel() const
{
return getBaseLevel() + (getBaseTexture() ? getBaseTexture()->GetLevelCount() - getLodOffset() : 0);
}
TextureStorage9_2D::TextureStorage9_2D(Renderer *renderer, SwapChain9 *swapchain)
: TextureStorage9(renderer, 0, D3DUSAGE_RENDERTARGET)
{ {
IDirect3DTexture9 *surfaceTexture = swapchain->getOffscreenTexture(); IDirect3DTexture9 *surfaceTexture = swapchain->getOffscreenTexture();
mTexture = surfaceTexture; mTexture = surfaceTexture;
...@@ -97,8 +104,8 @@ TextureStorage9_2D::TextureStorage9_2D(Renderer *renderer, SwapChain9 *swapchain ...@@ -97,8 +104,8 @@ TextureStorage9_2D::TextureStorage9_2D(Renderer *renderer, SwapChain9 *swapchain
initializeRenderTarget(); initializeRenderTarget();
} }
TextureStorage9_2D::TextureStorage9_2D(Renderer *renderer, int levels, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height) TextureStorage9_2D::TextureStorage9_2D(Renderer *renderer, int baseLevel, int maxLevel, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height)
: TextureStorage9(renderer, GetTextureUsage(internalformat, Renderer9::makeRenderer9(renderer), renderTarget)) : TextureStorage9(renderer, baseLevel, GetTextureUsage(internalformat, Renderer9::makeRenderer9(renderer), renderTarget))
{ {
mTexture = NULL; mTexture = NULL;
mRenderTarget = NULL; mRenderTarget = NULL;
...@@ -109,8 +116,9 @@ TextureStorage9_2D::TextureStorage9_2D(Renderer *renderer, int levels, GLenum in ...@@ -109,8 +116,9 @@ TextureStorage9_2D::TextureStorage9_2D(Renderer *renderer, int levels, GLenum in
IDirect3DDevice9 *device = mRenderer->getDevice(); IDirect3DDevice9 *device = mRenderer->getDevice();
D3DFORMAT format = gl_d3d9::GetTextureFormat(internalformat, mRenderer); D3DFORMAT format = gl_d3d9::GetTextureFormat(internalformat, mRenderer);
d3d9::MakeValidSize(false, format, &width, &height, &mLodOffset); d3d9::MakeValidSize(false, format, &width, &height, &mLodOffset);
HRESULT result = device->CreateTexture(width, height, levels ? levels + mLodOffset : 0, getUsage(), UINT creationLevels = (maxLevel ? maxLevel + mLodOffset : 0);
format, getPool(), &mTexture, NULL);
HRESULT result = device->CreateTexture(width, height, creationLevels, getUsage(), format, getPool(), &mTexture, NULL);
if (FAILED(result)) if (FAILED(result))
{ {
...@@ -191,8 +199,8 @@ void TextureStorage9_2D::initializeRenderTarget() ...@@ -191,8 +199,8 @@ void TextureStorage9_2D::initializeRenderTarget()
} }
} }
TextureStorage9_Cube::TextureStorage9_Cube(Renderer *renderer, int levels, GLenum internalformat, bool renderTarget, int size) TextureStorage9_Cube::TextureStorage9_Cube(Renderer *renderer, int baseLevel, int maxLevel, GLenum internalformat, bool renderTarget, int size)
: TextureStorage9(renderer, GetTextureUsage(internalformat, Renderer9::makeRenderer9(renderer), renderTarget)) : TextureStorage9(renderer, baseLevel, GetTextureUsage(internalformat, Renderer9::makeRenderer9(renderer), renderTarget))
{ {
mTexture = NULL; mTexture = NULL;
for (int i = 0; i < 6; ++i) for (int i = 0; i < 6; ++i)
...@@ -208,8 +216,9 @@ TextureStorage9_Cube::TextureStorage9_Cube(Renderer *renderer, int levels, GLenu ...@@ -208,8 +216,9 @@ TextureStorage9_Cube::TextureStorage9_Cube(Renderer *renderer, int levels, GLenu
int height = size; int height = size;
D3DFORMAT format = gl_d3d9::GetTextureFormat(internalformat, mRenderer); D3DFORMAT format = gl_d3d9::GetTextureFormat(internalformat, mRenderer);
d3d9::MakeValidSize(false, format, &size, &height, &mLodOffset); d3d9::MakeValidSize(false, format, &size, &height, &mLodOffset);
HRESULT result = device->CreateCubeTexture(size, levels ? levels + mLodOffset : 0, getUsage(), UINT creationLevels = (maxLevel ? maxLevel + mLodOffset : 0);
format, getPool(), &mTexture, NULL);
HRESULT result = device->CreateCubeTexture(size, creationLevels, getUsage(), format, getPool(), &mTexture, NULL);
if (FAILED(result)) if (FAILED(result))
{ {
......
...@@ -24,7 +24,6 @@ class RenderTarget9; ...@@ -24,7 +24,6 @@ class RenderTarget9;
class TextureStorage9 : public TextureStorage class TextureStorage9 : public TextureStorage
{ {
public: public:
TextureStorage9(Renderer *renderer, DWORD usage);
virtual ~TextureStorage9(); virtual ~TextureStorage9();
static TextureStorage9 *makeTextureStorage9(TextureStorage *storage); static TextureStorage9 *makeTextureStorage9(TextureStorage *storage);
...@@ -44,12 +43,16 @@ class TextureStorage9 : public TextureStorage ...@@ -44,12 +43,16 @@ class TextureStorage9 : public TextureStorage
virtual int getLodOffset() const; virtual int getLodOffset() const;
virtual bool isRenderTarget() const; virtual bool isRenderTarget() const;
virtual bool isManaged() const; virtual bool isManaged() const;
virtual int levelCount(); virtual int getBaseLevel() const;
virtual int getMaxLevel() const;
protected: protected:
int mLodOffset; int mLodOffset;
int mBaseLevel;
Renderer9 *mRenderer; Renderer9 *mRenderer;
TextureStorage9(Renderer *renderer, int baseLevel, DWORD usage);
private: private:
DISALLOW_COPY_AND_ASSIGN(TextureStorage9); DISALLOW_COPY_AND_ASSIGN(TextureStorage9);
...@@ -61,7 +64,7 @@ class TextureStorage9_2D : public TextureStorage9 ...@@ -61,7 +64,7 @@ class TextureStorage9_2D : public TextureStorage9
{ {
public: public:
TextureStorage9_2D(Renderer *renderer, SwapChain9 *swapchain); TextureStorage9_2D(Renderer *renderer, SwapChain9 *swapchain);
TextureStorage9_2D(Renderer *renderer, int levels, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height); TextureStorage9_2D(Renderer *renderer, int baseLevel, int maxLevel, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height);
virtual ~TextureStorage9_2D(); virtual ~TextureStorage9_2D();
static TextureStorage9_2D *makeTextureStorage9_2D(TextureStorage *storage); static TextureStorage9_2D *makeTextureStorage9_2D(TextureStorage *storage);
...@@ -83,7 +86,7 @@ class TextureStorage9_2D : public TextureStorage9 ...@@ -83,7 +86,7 @@ class TextureStorage9_2D : public TextureStorage9
class TextureStorage9_Cube : public TextureStorage9 class TextureStorage9_Cube : public TextureStorage9
{ {
public: public:
TextureStorage9_Cube(Renderer *renderer, int levels, GLenum internalformat, bool renderTarget, int size); TextureStorage9_Cube(Renderer *renderer, int baseLevel, int maxLevel, GLenum internalformat, bool renderTarget, int size);
virtual ~TextureStorage9_Cube(); virtual ~TextureStorage9_Cube();
static TextureStorage9_Cube *makeTextureStorage9_Cube(TextureStorage *storage); static TextureStorage9_Cube *makeTextureStorage9_Cube(TextureStorage *storage);
......
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