Commit 4001e1da by Geoff Lang

Support creating render targets of non-zero mip levels in TextureStorage9.

BUG=angleproject:970 Change-Id: I02caf1a5d15a8e32e68b63362e86e3a689dbdb5a Reviewed-on: https://chromium-review.googlesource.com/293221Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org> Tested-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent 025e76a0
......@@ -113,14 +113,13 @@ TextureStorage9_2D::TextureStorage9_2D(Renderer9 *renderer, SwapChain9 *swapchai
mTextureHeight = surfaceDesc.Height;
mTextureFormat = surfaceDesc.Format;
mRenderTarget = NULL;
mRenderTargets.resize(mMipLevels, nullptr);
}
TextureStorage9_2D::TextureStorage9_2D(Renderer9 *renderer, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, int levels)
: TextureStorage9(renderer, GetTextureUsage(internalformat, renderTarget))
{
mTexture = NULL;
mRenderTarget = NULL;
mInternalFormat = internalformat;
......@@ -131,12 +130,17 @@ TextureStorage9_2D::TextureStorage9_2D(Renderer9 *renderer, GLenum internalforma
mTextureWidth = width;
mTextureHeight = height;
mMipLevels = mTopLevel + levels;
mRenderTargets.resize(levels, nullptr);
}
TextureStorage9_2D::~TextureStorage9_2D()
{
SafeRelease(mTexture);
SafeDelete(mRenderTarget);
for (auto &renderTarget : mRenderTargets)
{
SafeDelete(renderTarget);
}
}
// Increments refcount on surface.
......@@ -177,9 +181,9 @@ gl::Error TextureStorage9_2D::getSurfaceLevel(GLenum target,
gl::Error TextureStorage9_2D::getRenderTarget(const gl::ImageIndex &index, RenderTargetD3D **outRT)
{
ASSERT(index.mipIndex == 0);
ASSERT(index.mipIndex < getLevelCount());
if (!mRenderTarget && isRenderTarget())
if (!mRenderTargets[index.mipIndex] && isRenderTarget())
{
IDirect3DBaseTexture9 *baseTexture = NULL;
gl::Error error = getBaseTexture(&baseTexture);
......@@ -195,14 +199,18 @@ gl::Error TextureStorage9_2D::getRenderTarget(const gl::ImageIndex &index, Rende
return error;
}
size_t textureMipLevel = mTopLevel + index.mipIndex;
size_t mipWidth = std::max<size_t>(mTextureWidth >> textureMipLevel, 1u);
size_t mipHeight = std::max<size_t>(mTextureHeight >> textureMipLevel, 1u);
baseTexture->AddRef();
mRenderTarget = new TextureRenderTarget9(baseTexture, mTopLevel, surface, mInternalFormat,
static_cast<GLsizei>(mTextureWidth),
static_cast<GLsizei>(mTextureHeight), 1, 0);
mRenderTargets[index.mipIndex] = new TextureRenderTarget9(
baseTexture, textureMipLevel, surface, mInternalFormat, static_cast<GLsizei>(mipWidth),
static_cast<GLsizei>(mipHeight), 1, 0);
}
ASSERT(outRT);
*outRT = mRenderTarget;
*outRT = mRenderTargets[index.mipIndex];
return gl::Error(GL_NO_ERROR);
}
......
......@@ -82,7 +82,7 @@ class TextureStorage9_2D : public TextureStorage9
private:
IDirect3DTexture9 *mTexture;
RenderTarget9 *mRenderTarget;
std::vector<RenderTarget9 *> mRenderTargets;
};
class TextureStorage9_Cube : public TextureStorage9
......
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