Removed some extra overloads of TextureStorage::getRenderTarget and added a…

Removed some extra overloads of TextureStorage::getRenderTarget and added a method to get the render target of a Texture3D layer. TRAC #22705 Signed-off-by: Jamie Madill Signed-off-by: Shannon Woods Author: Geoff Lang git-svn-id: https://angleproject.googlecode.com/svn/branches/es3proto@2164 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent 27ac40e8
......@@ -79,7 +79,7 @@ TextureStorageInterface2D::~TextureStorageInterface2D()
RenderTarget *TextureStorageInterface2D::getRenderTarget() const
{
return mInstance->getRenderTarget();
return mInstance->getRenderTarget(0);
}
void TextureStorageInterface2D::generateMipmap(int level)
......
......@@ -31,8 +31,9 @@ class TextureStorage
virtual bool isManaged() const = 0;
virtual int levelCount() = 0;
virtual RenderTarget *getRenderTarget() = 0;
virtual RenderTarget *getRenderTarget(GLenum faceTarget) = 0;
virtual RenderTarget *getRenderTarget(int level) = 0;
virtual RenderTarget *getRenderTarget(GLenum faceTarget, int level) = 0;
virtual RenderTarget *getRenderTargetLayer(int mipLevel, int layer) = 0;
virtual void generateMipmap(int level) = 0;
virtual void generateMipmap(int face, int level) = 0;
......
......@@ -754,6 +754,13 @@ TextureStorage11_3D::~TextureStorage11_3D()
mSRV->Release();
mSRV = NULL;
}
for (RenderTargetMap::const_iterator i = mRenderTargets.begin(); i != mRenderTargets.end(); i++)
{
RenderTarget11* renderTarget = i->second;
delete renderTarget;
}
mRenderTargets.clear();
}
TextureStorage11_3D *TextureStorage11_3D::makeTextureStorage11_3D(TextureStorage *storage)
......@@ -791,6 +798,60 @@ ID3D11ShaderResourceView *TextureStorage11_3D::getSRV()
return mSRV;
}
RenderTarget *TextureStorage11_3D::getRenderTargetLayer(int mipLevel, int layer)
{
if (mipLevel >= 0 && mipLevel < static_cast<int>(mMipLevels))
{
LevelLayerKey key(mipLevel, layer);
if (mRenderTargets.find(key) == mRenderTargets.end())
{
ID3D11Device *device = mRenderer->getDevice();
HRESULT result;
// TODO, what kind of SRV is expected here?
ID3D11ShaderResourceView *srv = NULL;
if (mRenderTargetFormat != DXGI_FORMAT_UNKNOWN)
{
D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
rtvDesc.Format = mRenderTargetFormat;
rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE3D;
rtvDesc.Texture3D.MipSlice = mipLevel;
rtvDesc.Texture3D.FirstWSlice = layer;
rtvDesc.Texture3D.WSize = 1;
ID3D11RenderTargetView *rtv;
result = device->CreateRenderTargetView(mTexture, &rtvDesc, &rtv);
if (result == E_OUTOFMEMORY)
{
srv->Release();
return gl::error(GL_OUT_OF_MEMORY, static_cast<RenderTarget*>(NULL));
}
ASSERT(SUCCEEDED(result));
// RenderTarget11 expects to be the owner of the resources it is given but TextureStorage11
// also needs to keep a reference to the texture.
mTexture->AddRef();
mRenderTargets[key] = new RenderTarget11(mRenderer, rtv, mTexture, srv,
std::max(mTextureWidth >> mipLevel, 1U),
std::max(mTextureHeight >> mipLevel, 1U));
}
else
{
UNREACHABLE();
}
}
return mRenderTargets[key];
}
else
{
return NULL;
}
}
void TextureStorage11_3D::generateMipmap(int level)
{
UNIMPLEMENTED();
......
......@@ -36,10 +36,9 @@ class TextureStorage11 : public TextureStorage
virtual ID3D11Resource *getBaseTexture() const = 0;
virtual ID3D11ShaderResourceView *getSRV() = 0;
virtual RenderTarget *getRenderTarget() { return getRenderTarget(0); }
virtual RenderTarget *getRenderTarget(int level) { return NULL; }
virtual RenderTarget *getRenderTarget(GLenum faceTarget) { return getRenderTarget(faceTarget, 0); }
virtual RenderTarget *getRenderTarget(GLenum faceTarget, int level) { return NULL; }
virtual RenderTarget *getRenderTargetLayer(int mipLevel, int layer) { return NULL; }
virtual void generateMipmap(int level) {};
virtual void generateMipmap(int face, int level) {};
......@@ -131,12 +130,17 @@ class TextureStorage11_3D : public TextureStorage11
virtual ID3D11Resource *getBaseTexture() const;
virtual ID3D11ShaderResourceView *getSRV();
virtual RenderTarget *getRenderTargetLayer(int mipLevel, int layer);
virtual void generateMipmap(int level);
private:
DISALLOW_COPY_AND_ASSIGN(TextureStorage11_3D);
typedef std::pair<int, int> LevelLayerKey;
typedef std::map<LevelLayerKey, RenderTarget11*> RenderTargetMap;
RenderTargetMap mRenderTargets;
ID3D11Texture3D *mTexture;
};
......
......@@ -178,7 +178,7 @@ IDirect3DSurface9 *TextureStorage9_2D::getSurfaceLevel(int level, bool dirty)
return surface;
}
RenderTarget *TextureStorage9_2D::getRenderTarget()
RenderTarget *TextureStorage9_2D::getRenderTarget(int level)
{
return mRenderTarget;
}
......@@ -284,7 +284,7 @@ IDirect3DSurface9 *TextureStorage9_Cube::getCubeMapSurface(GLenum faceTarget, in
return surface;
}
RenderTarget *TextureStorage9_Cube::getRenderTarget(GLenum faceTarget)
RenderTarget *TextureStorage9_Cube::getRenderTarget(GLenum faceTarget, int level)
{
return mRenderTarget[gl::TextureCubeMap::faceIndex(faceTarget)];
}
......
......@@ -37,8 +37,9 @@ class TextureStorage9 : public TextureStorage
DWORD getUsage() const;
virtual IDirect3DBaseTexture9 *getBaseTexture() const = 0;
virtual RenderTarget *getRenderTarget() { return NULL; }
virtual RenderTarget *getRenderTarget(GLenum faceTarget) { return NULL; }
virtual RenderTarget *getRenderTarget(int level) { return NULL; }
virtual RenderTarget *getRenderTarget(GLenum faceTarget, int level) { return NULL; }
virtual RenderTarget *getRenderTargetLayer(int mipLevel, int layer) { return NULL; }
virtual void generateMipmap(int level) {};
virtual void generateMipmap(int face, int level) {};
......@@ -68,7 +69,7 @@ class TextureStorage9_2D : public TextureStorage9
static TextureStorage9_2D *makeTextureStorage9_2D(TextureStorage *storage);
IDirect3DSurface9 *getSurfaceLevel(int level, bool dirty);
virtual RenderTarget *getRenderTarget();
virtual RenderTarget *getRenderTarget(int level);
virtual IDirect3DBaseTexture9 *getBaseTexture() const;
virtual void generateMipmap(int level);
......@@ -90,7 +91,7 @@ class TextureStorage9_Cube : public TextureStorage9
static TextureStorage9_Cube *makeTextureStorage9_Cube(TextureStorage *storage);
IDirect3DSurface9 *getCubeMapSurface(GLenum faceTarget, int level, bool dirty);
virtual RenderTarget *getRenderTarget(GLenum faceTarget);
virtual RenderTarget *getRenderTarget(GLenum faceTarget, int level);
virtual IDirect3DBaseTexture9 *getBaseTexture() const;
virtual void generateMipmap(int face, 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