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 ...@@ -113,14 +113,13 @@ TextureStorage9_2D::TextureStorage9_2D(Renderer9 *renderer, SwapChain9 *swapchai
mTextureHeight = surfaceDesc.Height; mTextureHeight = surfaceDesc.Height;
mTextureFormat = surfaceDesc.Format; 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_2D::TextureStorage9_2D(Renderer9 *renderer, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, int levels)
: TextureStorage9(renderer, GetTextureUsage(internalformat, renderTarget)) : TextureStorage9(renderer, GetTextureUsage(internalformat, renderTarget))
{ {
mTexture = NULL; mTexture = NULL;
mRenderTarget = NULL;
mInternalFormat = internalformat; mInternalFormat = internalformat;
...@@ -131,12 +130,17 @@ TextureStorage9_2D::TextureStorage9_2D(Renderer9 *renderer, GLenum internalforma ...@@ -131,12 +130,17 @@ TextureStorage9_2D::TextureStorage9_2D(Renderer9 *renderer, GLenum internalforma
mTextureWidth = width; mTextureWidth = width;
mTextureHeight = height; mTextureHeight = height;
mMipLevels = mTopLevel + levels; mMipLevels = mTopLevel + levels;
mRenderTargets.resize(levels, nullptr);
} }
TextureStorage9_2D::~TextureStorage9_2D() TextureStorage9_2D::~TextureStorage9_2D()
{ {
SafeRelease(mTexture); SafeRelease(mTexture);
SafeDelete(mRenderTarget); for (auto &renderTarget : mRenderTargets)
{
SafeDelete(renderTarget);
}
} }
// Increments refcount on surface. // Increments refcount on surface.
...@@ -177,9 +181,9 @@ gl::Error TextureStorage9_2D::getSurfaceLevel(GLenum target, ...@@ -177,9 +181,9 @@ gl::Error TextureStorage9_2D::getSurfaceLevel(GLenum target,
gl::Error TextureStorage9_2D::getRenderTarget(const gl::ImageIndex &index, RenderTargetD3D **outRT) 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; IDirect3DBaseTexture9 *baseTexture = NULL;
gl::Error error = getBaseTexture(&baseTexture); gl::Error error = getBaseTexture(&baseTexture);
...@@ -195,14 +199,18 @@ gl::Error TextureStorage9_2D::getRenderTarget(const gl::ImageIndex &index, Rende ...@@ -195,14 +199,18 @@ gl::Error TextureStorage9_2D::getRenderTarget(const gl::ImageIndex &index, Rende
return error; 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(); baseTexture->AddRef();
mRenderTarget = new TextureRenderTarget9(baseTexture, mTopLevel, surface, mInternalFormat, mRenderTargets[index.mipIndex] = new TextureRenderTarget9(
static_cast<GLsizei>(mTextureWidth), baseTexture, textureMipLevel, surface, mInternalFormat, static_cast<GLsizei>(mipWidth),
static_cast<GLsizei>(mTextureHeight), 1, 0); static_cast<GLsizei>(mipHeight), 1, 0);
} }
ASSERT(outRT); ASSERT(outRT);
*outRT = mRenderTarget; *outRT = mRenderTargets[index.mipIndex];
return gl::Error(GL_NO_ERROR); return gl::Error(GL_NO_ERROR);
} }
......
...@@ -82,7 +82,7 @@ class TextureStorage9_2D : public TextureStorage9 ...@@ -82,7 +82,7 @@ class TextureStorage9_2D : public TextureStorage9
private: private:
IDirect3DTexture9 *mTexture; IDirect3DTexture9 *mTexture;
RenderTarget9 *mRenderTarget; std::vector<RenderTarget9 *> mRenderTargets;
}; };
class TextureStorage9_Cube : public TextureStorage9 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