Commit ac7579c2 by Jamie Madill

Use ImageIndex in getRenderTarget.

Also change ImageIndex to allow invalid indexes for layer. In 3D indexes, sometimes the layer parameter is invalid, indicating we index an entire mip level instead of a layer of a mip level. BUG=angle:741 Change-Id: I7b410f9aaf568f215bb93ae063934669a8fa09bd Reviewed-on: https://chromium-review.googlesource.com/218312Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Tested-by: 's avatarJamie Madill <jmadill@chromium.org>
parent 02f18b88
......@@ -29,8 +29,9 @@ RenderTarget *GetAttachmentRenderTarget(gl::FramebufferAttachment *attachment)
gl::Texture *texture = attachment->getTexture();
ASSERT(texture);
TextureD3D *textureD3D = TextureD3D::makeTextureD3D(texture->getImplementation());
return textureD3D->getRenderTarget(attachment->mipLevel(), attachment->layer());
const gl::ImageIndex *index = attachment->getTextureImageIndex();
ASSERT(index);
return textureD3D->getRenderTarget(*index);
}
gl::Renderbuffer *renderbuffer = attachment->getRenderbuffer();
......@@ -48,7 +49,9 @@ unsigned int GetAttachmentSerial(gl::FramebufferAttachment *attachment)
gl::Texture *texture = attachment->getTexture();
ASSERT(texture);
TextureD3D *textureD3D = TextureD3D::makeTextureD3D(texture->getImplementation());
return textureD3D->getRenderTargetSerial(attachment->mipLevel(), attachment->layer());
const gl::ImageIndex *index = attachment->getTextureImageIndex();
ASSERT(index);
return textureD3D->getRenderTargetSerial(*index);
}
gl::Renderbuffer *renderbuffer = attachment->getRenderbuffer();
......
......@@ -140,6 +140,11 @@ Texture *TextureAttachment::getTexture()
return mTexture.get();
}
const ImageIndex *TextureAttachment::getTextureImageIndex() const
{
return &mIndex;
}
Renderbuffer *TextureAttachment::getRenderbuffer()
{
UNREACHABLE();
......@@ -211,6 +216,12 @@ Texture *RenderbufferAttachment::getTexture()
return NULL;
}
const ImageIndex *RenderbufferAttachment::getTextureImageIndex() const
{
UNREACHABLE();
return NULL;
}
Renderbuffer *RenderbufferAttachment::getRenderbuffer()
{
return mRenderbuffer.get();
......
......@@ -68,6 +68,7 @@ class FramebufferAttachment
virtual GLint layer() const = 0;
virtual Texture *getTexture() = 0;
virtual const ImageIndex *getTextureImageIndex() const = 0;
virtual Renderbuffer *getRenderbuffer() = 0;
private:
......@@ -95,6 +96,7 @@ class TextureAttachment : public FramebufferAttachment
virtual GLint layer() const;
virtual Texture *getTexture();
virtual const ImageIndex *getTextureImageIndex() const;
virtual Renderbuffer *getRenderbuffer();
private:
......@@ -123,6 +125,7 @@ class RenderbufferAttachment : public FramebufferAttachment
virtual GLint layer() const;
virtual Texture *getTexture();
virtual const ImageIndex *getTextureImageIndex() const;
virtual Renderbuffer *getRenderbuffer();
private:
......
......@@ -29,7 +29,7 @@ ImageIndex &ImageIndex::operator=(const ImageIndex &other)
ImageIndex ImageIndex::Make2D(GLint mipIndex)
{
return ImageIndex(GL_TEXTURE_2D, mipIndex, 0);
return ImageIndex(GL_TEXTURE_2D, mipIndex, ENTIRE_LEVEL);
}
ImageIndex ImageIndex::MakeCube(GLenum target, GLint mipIndex)
......
......@@ -23,10 +23,14 @@ struct ImageIndex
ImageIndex(const ImageIndex &other);
ImageIndex &operator=(const ImageIndex &other);
bool hasLayer() const { return layerIndex != ENTIRE_LEVEL; }
static ImageIndex Make2D(GLint mipIndex);
static ImageIndex MakeCube(GLenum target, GLint mipIndex);
static ImageIndex Make2DArray(GLint mipIndex, GLint layerIndex);
static ImageIndex Make3D(GLint mipIndex, GLint layerIndex = 0);
static ImageIndex Make3D(GLint mipIndex, GLint layerIndex = ENTIRE_LEVEL);
static const GLint ENTIRE_LEVEL = static_cast<GLint>(-1);
private:
ImageIndex(GLenum typeIn, GLint mipIndexIn, GLint layerIndexIn);
......
......@@ -244,7 +244,7 @@ Image *TextureD3D_2D::getImage(int level, int layer) const
Image *TextureD3D_2D::getImage(const gl::ImageIndex &index) const
{
ASSERT(index.mipIndex < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS);
ASSERT(index.layerIndex == 0);
ASSERT(!index.hasLayer());
ASSERT(index.type == GL_TEXTURE_2D);
return mImageArray[index.mipIndex];
}
......@@ -305,8 +305,10 @@ void TextureD3D_2D::setImage(GLenum target, GLint level, GLsizei width, GLsizei
// Attempt a fast gpu copy of the pixel data to the surface
if (isFastUnpackable(unpack, sizedInternalFormat) && isLevelComplete(level))
{
gl::ImageIndex index = gl::ImageIndex::Make2D(level);
// Will try to create RT storage if it does not exist
RenderTarget *destRenderTarget = getRenderTarget(level, 0);
RenderTarget *destRenderTarget = getRenderTarget(index);
gl::Box destArea(0, 0, 0, getWidth(level), getHeight(level), 1);
if (destRenderTarget && fastUnpackPixels(unpack, pixels, destArea, sizedInternalFormat, type, destRenderTarget))
......@@ -340,9 +342,10 @@ void TextureD3D_2D::subImage(GLenum target, GLint level, GLint xoffset, GLint yo
bool fastUnpacked = false;
gl::ImageIndex index = gl::ImageIndex::Make2D(level);
if (isFastUnpackable(unpack, getInternalFormat(level)) && isLevelComplete(level))
{
RenderTarget *renderTarget = getRenderTarget(level, 0);
RenderTarget *renderTarget = getRenderTarget(index);
gl::Box destArea(xoffset, yoffset, 0, width, height, 1);
if (renderTarget && fastUnpackPixels(unpack, pixels, destArea, getInternalFormat(level), type, renderTarget))
......@@ -354,7 +357,6 @@ void TextureD3D_2D::subImage(GLenum target, GLint level, GLint xoffset, GLint yo
}
}
gl::ImageIndex index = gl::ImageIndex::Make2D(level);
if (!fastUnpacked && TextureD3D::subImage(xoffset, yoffset, 0, width, height, 1, format, type, unpack, pixels, index))
{
commitRect(level, xoffset, yoffset, width, height);
......@@ -513,15 +515,15 @@ void TextureD3D_2D::generateMipmaps()
}
}
unsigned int TextureD3D_2D::getRenderTargetSerial(GLint level, GLint layer)
unsigned int TextureD3D_2D::getRenderTargetSerial(const gl::ImageIndex &index)
{
ASSERT(layer == 0);
return (ensureRenderTarget() ? mTexStorage->getRenderTargetSerial(level) : 0);
ASSERT(!index.hasLayer());
return (ensureRenderTarget() ? mTexStorage->getRenderTargetSerial(index.mipIndex) : 0);
}
RenderTarget *TextureD3D_2D::getRenderTarget(GLint level, GLint layer)
RenderTarget *TextureD3D_2D::getRenderTarget(const gl::ImageIndex &index)
{
ASSERT(layer == 0);
ASSERT(!index.hasLayer());
// ensure the underlying texture is created
if (!ensureRenderTarget())
......@@ -529,8 +531,8 @@ RenderTarget *TextureD3D_2D::getRenderTarget(GLint level, GLint layer)
return NULL;
}
updateStorageLevel(level);
return mTexStorage->getRenderTarget(level);
updateStorageLevel(index.mipIndex);
return mTexStorage->getStorageInstance()->getRenderTarget(index);
}
bool TextureD3D_2D::isValidLevel(int level) const
......@@ -1014,16 +1016,14 @@ void TextureD3D_Cube::generateMipmaps()
}
}
unsigned int TextureD3D_Cube::getRenderTargetSerial(GLint level, GLint layer)
unsigned int TextureD3D_Cube::getRenderTargetSerial(const gl::ImageIndex &index)
{
GLenum target = gl::TextureCubeMap::layerIndexToTarget(layer);
return (ensureRenderTarget() ? mTexStorage->getRenderTargetSerial(target, level) : 0);
return (ensureRenderTarget() ? mTexStorage->getRenderTargetSerial(index.type, index.mipIndex) : 0);
}
RenderTarget *TextureD3D_Cube::getRenderTarget(GLint level, GLint layer)
RenderTarget *TextureD3D_Cube::getRenderTarget(const gl::ImageIndex &index)
{
GLenum target = gl::TextureCubeMap::layerIndexToTarget(layer);
ASSERT(gl::IsCubemapTextureTarget(target));
ASSERT(gl::IsCubemapTextureTarget(index.type));
// ensure the underlying texture is created
if (!ensureRenderTarget())
......@@ -1031,8 +1031,8 @@ RenderTarget *TextureD3D_Cube::getRenderTarget(GLint level, GLint layer)
return NULL;
}
updateStorageFaceLevel(layer, level);
return mTexStorage->getRenderTarget(target, level);
updateStorageFaceLevel(index.layerIndex, index.mipIndex);
return mTexStorage->getStorageInstance()->getRenderTarget(index);
}
void TextureD3D_Cube::initializeStorage(bool renderTarget)
......@@ -1274,7 +1274,7 @@ Image *TextureD3D_3D::getImage(int level, int layer) const
Image *TextureD3D_3D::getImage(const gl::ImageIndex &index) const
{
ASSERT(index.mipIndex < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS);
ASSERT(index.layerIndex == 0);
ASSERT(!index.hasLayer());
ASSERT(index.type == GL_TEXTURE_3D);
return mImageArray[index.mipIndex];
}
......@@ -1335,7 +1335,8 @@ void TextureD3D_3D::setImage(GLenum target, GLint level, GLsizei width, GLsizei
if (isFastUnpackable(unpack, sizedInternalFormat))
{
// Will try to create RT storage if it does not exist
RenderTarget *destRenderTarget = getRenderTarget(level);
gl::ImageIndex index = gl::ImageIndex::Make3D(level);
RenderTarget *destRenderTarget = getRenderTarget(index);
gl::Box destArea(0, 0, 0, getWidth(level), getHeight(level), getDepth(level));
if (destRenderTarget && fastUnpackPixels(unpack, pixels, destArea, sizedInternalFormat, type, destRenderTarget))
......@@ -1369,10 +1370,12 @@ void TextureD3D_3D::subImage(GLenum target, GLint level, GLint xoffset, GLint yo
bool fastUnpacked = false;
gl::ImageIndex index = gl::ImageIndex::Make3D(level);
// Attempt a fast gpu copy of the pixel data to the surface if the app bound an unpack buffer
if (isFastUnpackable(unpack, getInternalFormat(level)))
{
RenderTarget *destRenderTarget = getRenderTarget(level);
RenderTarget *destRenderTarget = getRenderTarget(index);
gl::Box destArea(xoffset, yoffset, zoffset, width, height, depth);
if (destRenderTarget && fastUnpackPixels(unpack, pixels, destArea, getInternalFormat(level), type, destRenderTarget))
......@@ -1384,7 +1387,6 @@ void TextureD3D_3D::subImage(GLenum target, GLint level, GLint xoffset, GLint yo
}
}
gl::ImageIndex index = gl::ImageIndex::Make3D(level);
if (!fastUnpacked && TextureD3D::subImage(xoffset, yoffset, zoffset, width, height, depth, format, type, unpack, pixels, index))
{
commitRect(level, xoffset, yoffset, zoffset, width, height, depth);
......@@ -1503,12 +1505,12 @@ void TextureD3D_3D::generateMipmaps()
}
}
unsigned int TextureD3D_3D::getRenderTargetSerial(GLint level, GLint layer)
unsigned int TextureD3D_3D::getRenderTargetSerial(const gl::ImageIndex &index)
{
return (ensureRenderTarget() ? mTexStorage->getRenderTargetSerial(level, layer) : 0);
return (ensureRenderTarget() ? mTexStorage->getRenderTargetSerial(index.mipIndex, index.layerIndex) : 0);
}
RenderTarget *TextureD3D_3D::getRenderTarget(GLint level)
RenderTarget *TextureD3D_3D::getRenderTarget(const gl::ImageIndex &index)
{
// ensure the underlying texture is created
if (!ensureRenderTarget())
......@@ -1516,28 +1518,16 @@ RenderTarget *TextureD3D_3D::getRenderTarget(GLint level)
return NULL;
}
updateStorageLevel(level);
// ensure this is NOT a depth texture
if (isDepth(level))
if (index.hasLayer())
{
return NULL;
updateStorage();
}
return mTexStorage->getRenderTarget(level);
}
RenderTarget *TextureD3D_3D::getRenderTarget(GLint level, GLint layer)
{
// ensure the underlying texture is created
if (!ensureRenderTarget())
else
{
return NULL;
updateStorageLevel(index.mipIndex);
}
updateStorage();
return mTexStorage->getRenderTarget(level, layer);
return mTexStorage->getStorageInstance()->getRenderTarget(index);
}
void TextureD3D_3D::initializeStorage(bool renderTarget)
......@@ -2000,12 +1990,12 @@ void TextureD3D_2DArray::generateMipmaps()
}
}
unsigned int TextureD3D_2DArray::getRenderTargetSerial(GLint level, GLint layer)
unsigned int TextureD3D_2DArray::getRenderTargetSerial(const gl::ImageIndex &index)
{
return (ensureRenderTarget() ? mTexStorage->getRenderTargetSerial(level, layer) : 0);
return (ensureRenderTarget() ? mTexStorage->getRenderTargetSerial(index.mipIndex, index.layerIndex) : 0);
}
RenderTarget *TextureD3D_2DArray::getRenderTarget(GLint level, GLint layer)
RenderTarget *TextureD3D_2DArray::getRenderTarget(const gl::ImageIndex &index)
{
// ensure the underlying texture is created
if (!ensureRenderTarget())
......@@ -2013,8 +2003,8 @@ RenderTarget *TextureD3D_2DArray::getRenderTarget(GLint level, GLint layer)
return NULL;
}
updateStorageLevel(level);
return mTexStorage->getRenderTarget(level, layer);
updateStorageLevel(index.mipIndex);
return mTexStorage->getStorageInstance()->getRenderTarget(index);
}
void TextureD3D_2DArray::initializeStorage(bool renderTarget)
......
......@@ -52,8 +52,8 @@ class TextureD3D : public TextureImpl
bool isImmutable() const { return mImmutable; }
virtual RenderTarget *getRenderTarget(GLint level, GLint layer) = 0;
virtual unsigned int getRenderTargetSerial(GLint level, GLint layer) = 0;
virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index) = 0;
virtual unsigned int getRenderTargetSerial(const gl::ImageIndex &index) = 0;
protected:
void setImage(const gl::PixelUnpackState &unpack, GLenum type, const void *pixels, Image *image);
......@@ -116,8 +116,8 @@ class TextureD3D_2D : public TextureD3D
virtual void generateMipmaps();
virtual RenderTarget *getRenderTarget(GLint level, GLint layer);
virtual unsigned int getRenderTargetSerial(GLint level, GLint layer);
virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index);
virtual unsigned int getRenderTargetSerial(const gl::ImageIndex &index);
private:
DISALLOW_COPY_AND_ASSIGN(TextureD3D_2D);
......@@ -173,8 +173,8 @@ class TextureD3D_Cube : public TextureD3D
virtual void generateMipmaps();
virtual RenderTarget *getRenderTarget(GLint level, GLint layer);
virtual unsigned int getRenderTargetSerial(GLint level, GLint layer);
virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index);
virtual unsigned int getRenderTargetSerial(const gl::ImageIndex &index);
private:
DISALLOW_COPY_AND_ASSIGN(TextureD3D_Cube);
......@@ -230,9 +230,8 @@ class TextureD3D_3D : public TextureD3D
virtual void generateMipmaps();
RenderTarget *getRenderTarget(GLint level);
virtual RenderTarget *getRenderTarget(GLint level, GLint layer);
virtual unsigned int getRenderTargetSerial(GLint level, GLint layer);
virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index);
virtual unsigned int getRenderTargetSerial(const gl::ImageIndex &index);
private:
DISALLOW_COPY_AND_ASSIGN(TextureD3D_3D);
......@@ -287,8 +286,8 @@ class TextureD3D_2DArray : public TextureD3D
virtual void generateMipmaps();
virtual RenderTarget *getRenderTarget(GLint level, GLint layer);
virtual unsigned int getRenderTargetSerial(GLint level, GLint layer);
virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index);
virtual unsigned int getRenderTargetSerial(const gl::ImageIndex &index);
private:
DISALLOW_COPY_AND_ASSIGN(TextureD3D_2DArray);
......
......@@ -79,11 +79,6 @@ TextureStorageInterface2D::~TextureStorageInterface2D()
{
}
RenderTarget *TextureStorageInterface2D::getRenderTarget(GLint level) const
{
return mInstance->getRenderTarget(level);
}
void TextureStorageInterface2D::generateMipmap(int level)
{
mInstance->generateMipmap(level);
......@@ -104,11 +99,6 @@ TextureStorageInterfaceCube::~TextureStorageInterfaceCube()
{
}
RenderTarget *TextureStorageInterfaceCube::getRenderTarget(GLenum faceTarget, GLint level) const
{
return mInstance->getRenderTargetFace(faceTarget, level);
}
void TextureStorageInterfaceCube::generateMipmap(int faceIndex, int level)
{
mInstance->generateMipmap(faceIndex, level);
......@@ -136,16 +126,6 @@ void TextureStorageInterface3D::generateMipmap(int level)
mInstance->generateMipmap(level);
}
RenderTarget *TextureStorageInterface3D::getRenderTarget(GLint level) const
{
return mInstance->getRenderTarget(level);
}
RenderTarget *TextureStorageInterface3D::getRenderTarget(GLint level, GLint layer) const
{
return mInstance->getRenderTargetLayer(level, layer);
}
unsigned int TextureStorageInterface3D::getRenderTargetSerial(GLint level, GLint layer) const
{
return mFirstRenderTargetSerial + static_cast<unsigned int>((layer * mInstance->getLevelCount()) + level);
......@@ -167,11 +147,6 @@ void TextureStorageInterface2DArray::generateMipmap(int level)
mInstance->generateMipmap(level);
}
RenderTarget *TextureStorageInterface2DArray::getRenderTarget(GLint level, GLint layer) const
{
return mInstance->getRenderTargetLayer(level, layer);
}
unsigned int TextureStorageInterface2DArray::getRenderTargetSerial(GLint level, GLint layer) const
{
return mFirstRenderTargetSerial + static_cast<unsigned int>((layer * mInstance->getLevelCount()) + level);
......
......@@ -15,6 +15,11 @@
#include <GLES2/gl2.h>
namespace gl
{
struct ImageIndex;
}
namespace rx
{
class Renderer;
......@@ -32,9 +37,7 @@ class TextureStorage
virtual bool isManaged() const = 0;
virtual int getLevelCount() const = 0;
virtual RenderTarget *getRenderTarget(int level) = 0;
virtual RenderTarget *getRenderTargetFace(GLenum faceTarget, int level) = 0;
virtual RenderTarget *getRenderTargetLayer(int mipLevel, int layer) = 0;
virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index) = 0;
virtual void generateMipmap(int level) = 0;
virtual void generateMipmap(int face, int level) = 0;
......@@ -78,7 +81,6 @@ class TextureStorageInterface2D : public TextureStorageInterface
virtual ~TextureStorageInterface2D();
void generateMipmap(int level);
RenderTarget *getRenderTarget(GLint level) const;
unsigned int getRenderTargetSerial(GLint level) const;
......@@ -95,7 +97,6 @@ class TextureStorageInterfaceCube : public TextureStorageInterface
virtual ~TextureStorageInterfaceCube();
void generateMipmap(int faceIndex, int level);
RenderTarget *getRenderTarget(GLenum faceTarget, GLint level) const;
virtual unsigned int getRenderTargetSerial(GLenum target, GLint level) const;
......@@ -113,8 +114,6 @@ class TextureStorageInterface3D : public TextureStorageInterface
virtual ~TextureStorageInterface3D();
void generateMipmap(int level);
RenderTarget *getRenderTarget(GLint level) const;
RenderTarget *getRenderTarget(GLint level, GLint layer) const;
virtual unsigned int getRenderTargetSerial(GLint level, GLint layer) const;
......@@ -132,7 +131,6 @@ class TextureStorageInterface2DArray : public TextureStorageInterface
virtual ~TextureStorageInterface2DArray();
void generateMipmap(int level);
RenderTarget *getRenderTarget(GLint level, GLint layer) const;
virtual unsigned int getRenderTargetSerial(GLint level, GLint layer) const;
......
......@@ -1958,7 +1958,8 @@ bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &so
return gl::error(GL_OUT_OF_MEMORY, false);
}
RenderTarget11 *destRenderTarget = RenderTarget11::makeRenderTarget11(storage11->getRenderTarget(level));
gl::ImageIndex index = gl::ImageIndex::Make2D(level);
RenderTarget11 *destRenderTarget = RenderTarget11::makeRenderTarget11(storage11->getRenderTarget(index));
if (!destRenderTarget)
{
ERR("Failed to retrieve the render target from the destination storage.");
......@@ -2019,7 +2020,8 @@ bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &so
return gl::error(GL_OUT_OF_MEMORY, false);
}
RenderTarget11 *destRenderTarget = RenderTarget11::makeRenderTarget11(storage11->getRenderTargetFace(target, level));
gl::ImageIndex index = gl::ImageIndex::MakeCube(target, level);
RenderTarget11 *destRenderTarget = RenderTarget11::makeRenderTarget11(storage11->getRenderTarget(index));
if (!destRenderTarget)
{
ERR("Failed to retrieve the render target from the destination storage.");
......@@ -2080,7 +2082,8 @@ bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &so
return gl::error(GL_OUT_OF_MEMORY, false);
}
RenderTarget11 *destRenderTarget = RenderTarget11::makeRenderTarget11(storage11->getRenderTargetLayer(level, zOffset));
gl::ImageIndex index = gl::ImageIndex::Make3D(level, zOffset);
RenderTarget11 *destRenderTarget = RenderTarget11::makeRenderTarget11(storage11->getRenderTarget(index));
if (!destRenderTarget)
{
ERR("Failed to retrieve the render target from the destination storage.");
......@@ -2142,7 +2145,8 @@ bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &so
return gl::error(GL_OUT_OF_MEMORY, false);
}
RenderTarget11 *destRenderTarget = RenderTarget11::makeRenderTarget11(storage11->getRenderTargetLayer(level, zOffset));
gl::ImageIndex index = gl::ImageIndex::Make2DArray(level, zOffset);
RenderTarget11 *destRenderTarget = RenderTarget11::makeRenderTarget11(storage11->getRenderTarget(index));
if (!destRenderTarget)
{
SafeRelease(source);
......
......@@ -17,6 +17,7 @@
#include "libGLESv2/renderer/d3d/d3d11/Image11.h"
#include "libGLESv2/renderer/d3d/TextureD3D.h"
#include "libGLESv2/main.h"
#include "libGLESv2/ImageIndex.h"
#include "common/utilities.h"
......@@ -605,8 +606,12 @@ ID3D11Resource *TextureStorage11_2D::getResource() const
return mTexture;
}
RenderTarget *TextureStorage11_2D::getRenderTarget(int level)
RenderTarget *TextureStorage11_2D::getRenderTarget(const gl::ImageIndex &index)
{
ASSERT(!index.hasLayer());
int level = index.mipIndex;
if (level >= 0 && level < getLevelCount())
{
if (!mRenderTarget[level])
......@@ -705,8 +710,11 @@ void TextureStorage11_2D::generateMipmap(int level)
{
invalidateSwizzleCacheLevel(level);
RenderTarget11 *source = RenderTarget11::makeRenderTarget11(getRenderTarget(level - 1));
RenderTarget11 *dest = RenderTarget11::makeRenderTarget11(getRenderTarget(level));
gl::ImageIndex srcIndex = gl::ImageIndex::Make2D(level - 1);
gl::ImageIndex destIndex = gl::ImageIndex::Make2D(level);
RenderTarget11 *source = RenderTarget11::makeRenderTarget11(getRenderTarget(srcIndex));
RenderTarget11 *dest = RenderTarget11::makeRenderTarget11(getRenderTarget(destIndex));
generateMipmapLayer(source, dest);
}
......@@ -971,11 +979,13 @@ ID3D11Resource *TextureStorage11_Cube::getResource() const
return mTexture;
}
RenderTarget *TextureStorage11_Cube::getRenderTargetFace(GLenum faceTarget, int level)
RenderTarget *TextureStorage11_Cube::getRenderTarget(const gl::ImageIndex &index)
{
int faceIndex = index.layerIndex;
int level = index.mipIndex;
if (level >= 0 && level < getLevelCount())
{
int faceIndex = gl::TextureCubeMap::targetToLayerIndex(faceTarget);
if (!mRenderTarget[faceIndex][level])
{
ID3D11Device *device = mRenderer->getDevice();
......@@ -1103,8 +1113,11 @@ void TextureStorage11_Cube::generateMipmap(int faceIndex, int level)
{
invalidateSwizzleCacheLevel(level);
RenderTarget11 *source = RenderTarget11::makeRenderTarget11(getRenderTargetFace(GL_TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex, level - 1));
RenderTarget11 *dest = RenderTarget11::makeRenderTarget11(getRenderTargetFace(GL_TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex, level));
gl::ImageIndex srcIndex = gl::ImageIndex::MakeCube(GL_TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex, level - 1);
gl::ImageIndex destIndex = gl::ImageIndex::MakeCube(GL_TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex, level);
RenderTarget11 *source = RenderTarget11::makeRenderTarget11(getRenderTarget(srcIndex));
RenderTarget11 *dest = RenderTarget11::makeRenderTarget11(getRenderTarget(destIndex));
generateMipmapLayer(source, dest);
}
......@@ -1380,20 +1393,24 @@ ID3D11ShaderResourceView *TextureStorage11_3D::createSRV(int baseLevel, int mipL
return SRV;
}
RenderTarget *TextureStorage11_3D::getRenderTarget(int mipLevel)
RenderTarget *TextureStorage11_3D::getRenderTarget(const gl::ImageIndex &index)
{
int mipLevel = index.mipIndex;
if (mipLevel >= 0 && mipLevel < getLevelCount())
{
if (!mLevelRenderTargets[mipLevel])
ASSERT(mRenderTargetFormat != DXGI_FORMAT_UNKNOWN);
if (!index.hasLayer())
{
ID3D11ShaderResourceView *srv = getSRVLevel(mipLevel);
if (!srv)
if (!mLevelRenderTargets[mipLevel])
{
return NULL;
}
ID3D11ShaderResourceView *srv = getSRVLevel(mipLevel);
if (!srv)
{
return NULL;
}
if (mRenderTargetFormat != DXGI_FORMAT_UNKNOWN)
{
ID3D11Device *device = mRenderer->getDevice();
D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
......@@ -1418,35 +1435,22 @@ RenderTarget *TextureStorage11_3D::getRenderTarget(int mipLevel)
// RenderTarget will take ownership of these resources
SafeRelease(rtv);
}
else
{
UNREACHABLE();
}
}
return mLevelRenderTargets[mipLevel];
}
else
{
return NULL;
}
}
RenderTarget *TextureStorage11_3D::getRenderTargetLayer(int mipLevel, int layer)
{
if (mipLevel >= 0 && mipLevel < getLevelCount())
{
LevelLayerKey key(mipLevel, layer);
if (mLevelLayerRenderTargets.find(key) == mLevelLayerRenderTargets.end())
return mLevelRenderTargets[mipLevel];
}
else
{
ID3D11Device *device = mRenderer->getDevice();
HRESULT result;
// TODO, what kind of SRV is expected here?
ID3D11ShaderResourceView *srv = NULL;
int layer = index.layerIndex;
if (mRenderTargetFormat != DXGI_FORMAT_UNKNOWN)
LevelLayerKey key(mipLevel, layer);
if (mLevelLayerRenderTargets.find(key) == mLevelLayerRenderTargets.end())
{
ID3D11Device *device = mRenderer->getDevice();
HRESULT result;
// TODO, what kind of SRV is expected here?
ID3D11ShaderResourceView *srv = NULL;
D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
rtvDesc.Format = mRenderTargetFormat;
rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE3D;
......@@ -1470,26 +1474,23 @@ RenderTarget *TextureStorage11_3D::getRenderTargetLayer(int mipLevel, int layer)
SafeRelease(rtv);
SafeRelease(srv);
}
else
{
UNREACHABLE();
}
}
return mLevelLayerRenderTargets[key];
}
else
{
return NULL;
return mLevelLayerRenderTargets[key];
}
}
return NULL;
}
void TextureStorage11_3D::generateMipmap(int level)
{
invalidateSwizzleCacheLevel(level);
RenderTarget11 *source = RenderTarget11::makeRenderTarget11(getRenderTarget(level - 1));
RenderTarget11 *dest = RenderTarget11::makeRenderTarget11(getRenderTarget(level));
gl::ImageIndex srcIndex = gl::ImageIndex::Make3D(level - 1);
gl::ImageIndex destIndex = gl::ImageIndex::Make3D(level);
RenderTarget11 *source = RenderTarget11::makeRenderTarget11(getRenderTarget(srcIndex));
RenderTarget11 *dest = RenderTarget11::makeRenderTarget11(getRenderTarget(destIndex));
generateMipmapLayer(source, dest);
}
......@@ -1760,8 +1761,13 @@ ID3D11ShaderResourceView *TextureStorage11_2DArray::createSRV(int baseLevel, int
return SRV;
}
RenderTarget *TextureStorage11_2DArray::getRenderTargetLayer(int mipLevel, int layer)
RenderTarget *TextureStorage11_2DArray::getRenderTarget(const gl::ImageIndex &index)
{
ASSERT(index.hasLayer());
int mipLevel = index.mipIndex;
int layer = index.layerIndex;
if (mipLevel >= 0 && mipLevel < getLevelCount())
{
LevelLayerKey key(mipLevel, layer);
......@@ -1831,8 +1837,11 @@ void TextureStorage11_2DArray::generateMipmap(int level)
invalidateSwizzleCacheLevel(level);
for (unsigned int layer = 0; layer < mTextureDepth; layer++)
{
RenderTarget11 *source = RenderTarget11::makeRenderTarget11(getRenderTargetLayer(level - 1, layer));
RenderTarget11 *dest = RenderTarget11::makeRenderTarget11(getRenderTargetLayer(level, layer));
gl::ImageIndex sourceIndex = gl::ImageIndex::Make2DArray(level - 1, layer);
gl::ImageIndex destIndex = gl::ImageIndex::Make2DArray(level, layer);
RenderTarget11 *source = RenderTarget11::makeRenderTarget11(getRenderTarget(sourceIndex));
RenderTarget11 *dest = RenderTarget11::makeRenderTarget11(getRenderTarget(destIndex));
generateMipmapLayer(source, dest);
}
......
......@@ -15,6 +15,11 @@
#include <map>
namespace gl
{
struct ImageIndex;
}
namespace rx
{
class RenderTarget;
......@@ -37,9 +42,7 @@ class TextureStorage11 : public TextureStorage
virtual ID3D11Resource *getResource() const = 0;
virtual ID3D11ShaderResourceView *getSRV(const gl::SamplerState &samplerState);
virtual RenderTarget *getRenderTarget(int level) { return NULL; }
virtual RenderTarget *getRenderTargetFace(GLenum faceTarget, int level) { return NULL; }
virtual RenderTarget *getRenderTargetLayer(int mipLevel, int layer) { return NULL; }
virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index) = 0;
virtual void generateMipmap(int level) {};
virtual void generateMipmap(int face, int level) {};
......@@ -160,7 +163,7 @@ class TextureStorage11_2D : public TextureStorage11
static TextureStorage11_2D *makeTextureStorage11_2D(TextureStorage *storage);
virtual ID3D11Resource *getResource() const;
virtual RenderTarget *getRenderTarget(int level);
virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index);
virtual void generateMipmap(int level);
......@@ -198,7 +201,7 @@ class TextureStorage11_Cube : public TextureStorage11
static TextureStorage11_Cube *makeTextureStorage11_Cube(TextureStorage *storage);
virtual ID3D11Resource *getResource() const;
virtual RenderTarget *getRenderTargetFace(GLenum faceTarget, int level);
virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index);
virtual void generateMipmap(int faceIndex, int level);
......@@ -237,8 +240,9 @@ class TextureStorage11_3D : public TextureStorage11
static TextureStorage11_3D *makeTextureStorage11_3D(TextureStorage *storage);
virtual ID3D11Resource *getResource() const;
virtual RenderTarget *getRenderTarget(int mipLevel);
virtual RenderTarget *getRenderTargetLayer(int mipLevel, int layer);
// Handles both layer and non-layer RTs
virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index);
virtual void generateMipmap(int level);
......@@ -281,7 +285,7 @@ class TextureStorage11_2DArray : public TextureStorage11
static TextureStorage11_2DArray *makeTextureStorage11_2DArray(TextureStorage *storage);
virtual ID3D11Resource *getResource() const;
virtual RenderTarget *getRenderTargetLayer(int mipLevel, int layer);
virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index);
virtual void generateMipmap(int level);
......
......@@ -157,7 +157,7 @@ IDirect3DSurface9 *TextureStorage9_2D::getSurfaceLevel(int level, bool dirty)
return surface;
}
RenderTarget *TextureStorage9_2D::getRenderTarget(int level)
RenderTarget *TextureStorage9_2D::getRenderTarget(const gl::ImageIndex &/*index*/)
{
return mRenderTarget;
}
......@@ -263,9 +263,9 @@ IDirect3DSurface9 *TextureStorage9_Cube::getCubeMapSurface(GLenum faceTarget, in
return surface;
}
RenderTarget *TextureStorage9_Cube::getRenderTargetFace(GLenum faceTarget, int level)
RenderTarget *TextureStorage9_Cube::getRenderTarget(const gl::ImageIndex &index)
{
return mRenderTarget[gl::TextureCubeMap::targetToLayerIndex(faceTarget)];
return mRenderTarget[index.layerIndex];
}
void TextureStorage9_Cube::generateMipmap(int faceIndex, int level)
......
......@@ -34,9 +34,7 @@ class TextureStorage9 : public TextureStorage
DWORD getUsage() const;
virtual IDirect3DBaseTexture9 *getBaseTexture() const = 0;
virtual RenderTarget *getRenderTarget(int level) { return NULL; }
virtual RenderTarget *getRenderTargetFace(GLenum faceTarget, int level) { return NULL; }
virtual RenderTarget *getRenderTargetLayer(int mipLevel, int layer) { return NULL; }
virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index) = 0;
virtual void generateMipmap(int level) {};
virtual void generateMipmap(int face, int level) {};
......@@ -68,7 +66,7 @@ class TextureStorage9_2D : public TextureStorage9
static TextureStorage9_2D *makeTextureStorage9_2D(TextureStorage *storage);
IDirect3DSurface9 *getSurfaceLevel(int level, bool dirty);
virtual RenderTarget *getRenderTarget(int level);
virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index);
virtual IDirect3DBaseTexture9 *getBaseTexture() const;
virtual void generateMipmap(int level);
......@@ -90,7 +88,7 @@ class TextureStorage9_Cube : public TextureStorage9
static TextureStorage9_Cube *makeTextureStorage9_Cube(TextureStorage *storage);
IDirect3DSurface9 *getCubeMapSurface(GLenum faceTarget, int level, bool dirty);
virtual RenderTarget *getRenderTargetFace(GLenum faceTarget, int level);
virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index);
virtual IDirect3DBaseTexture9 *getBaseTexture() const;
virtual void generateMipmap(int faceIndex, int level);
......
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