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() ...@@ -79,7 +79,7 @@ TextureStorageInterface2D::~TextureStorageInterface2D()
RenderTarget *TextureStorageInterface2D::getRenderTarget() const RenderTarget *TextureStorageInterface2D::getRenderTarget() const
{ {
return mInstance->getRenderTarget(); return mInstance->getRenderTarget(0);
} }
void TextureStorageInterface2D::generateMipmap(int level) void TextureStorageInterface2D::generateMipmap(int level)
......
...@@ -31,8 +31,9 @@ class TextureStorage ...@@ -31,8 +31,9 @@ class TextureStorage
virtual bool isManaged() const = 0; virtual bool isManaged() const = 0;
virtual int levelCount() = 0; virtual int levelCount() = 0;
virtual RenderTarget *getRenderTarget() = 0; virtual RenderTarget *getRenderTarget(int level) = 0;
virtual RenderTarget *getRenderTarget(GLenum faceTarget) = 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 level) = 0;
virtual void generateMipmap(int face, int level) = 0; virtual void generateMipmap(int face, int level) = 0;
......
...@@ -754,6 +754,13 @@ TextureStorage11_3D::~TextureStorage11_3D() ...@@ -754,6 +754,13 @@ TextureStorage11_3D::~TextureStorage11_3D()
mSRV->Release(); mSRV->Release();
mSRV = NULL; 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) TextureStorage11_3D *TextureStorage11_3D::makeTextureStorage11_3D(TextureStorage *storage)
...@@ -791,6 +798,60 @@ ID3D11ShaderResourceView *TextureStorage11_3D::getSRV() ...@@ -791,6 +798,60 @@ ID3D11ShaderResourceView *TextureStorage11_3D::getSRV()
return mSRV; 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) void TextureStorage11_3D::generateMipmap(int level)
{ {
UNIMPLEMENTED(); UNIMPLEMENTED();
......
...@@ -36,10 +36,9 @@ class TextureStorage11 : public TextureStorage ...@@ -36,10 +36,9 @@ class TextureStorage11 : public TextureStorage
virtual ID3D11Resource *getBaseTexture() const = 0; virtual ID3D11Resource *getBaseTexture() const = 0;
virtual ID3D11ShaderResourceView *getSRV() = 0; virtual ID3D11ShaderResourceView *getSRV() = 0;
virtual RenderTarget *getRenderTarget() { return getRenderTarget(0); }
virtual RenderTarget *getRenderTarget(int level) { return NULL; } 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 *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 level) {};
virtual void generateMipmap(int face, int level) {}; virtual void generateMipmap(int face, int level) {};
...@@ -131,12 +130,17 @@ class TextureStorage11_3D : public TextureStorage11 ...@@ -131,12 +130,17 @@ class TextureStorage11_3D : public TextureStorage11
virtual ID3D11Resource *getBaseTexture() const; virtual ID3D11Resource *getBaseTexture() const;
virtual ID3D11ShaderResourceView *getSRV(); virtual ID3D11ShaderResourceView *getSRV();
virtual RenderTarget *getRenderTargetLayer(int mipLevel, int layer);
virtual void generateMipmap(int level); virtual void generateMipmap(int level);
private: private:
DISALLOW_COPY_AND_ASSIGN(TextureStorage11_3D); DISALLOW_COPY_AND_ASSIGN(TextureStorage11_3D);
typedef std::pair<int, int> LevelLayerKey;
typedef std::map<LevelLayerKey, RenderTarget11*> RenderTargetMap;
RenderTargetMap mRenderTargets;
ID3D11Texture3D *mTexture; ID3D11Texture3D *mTexture;
}; };
......
...@@ -178,7 +178,7 @@ IDirect3DSurface9 *TextureStorage9_2D::getSurfaceLevel(int level, bool dirty) ...@@ -178,7 +178,7 @@ IDirect3DSurface9 *TextureStorage9_2D::getSurfaceLevel(int level, bool dirty)
return surface; return surface;
} }
RenderTarget *TextureStorage9_2D::getRenderTarget() RenderTarget *TextureStorage9_2D::getRenderTarget(int level)
{ {
return mRenderTarget; return mRenderTarget;
} }
...@@ -284,7 +284,7 @@ IDirect3DSurface9 *TextureStorage9_Cube::getCubeMapSurface(GLenum faceTarget, in ...@@ -284,7 +284,7 @@ IDirect3DSurface9 *TextureStorage9_Cube::getCubeMapSurface(GLenum faceTarget, in
return surface; return surface;
} }
RenderTarget *TextureStorage9_Cube::getRenderTarget(GLenum faceTarget) RenderTarget *TextureStorage9_Cube::getRenderTarget(GLenum faceTarget, int level)
{ {
return mRenderTarget[gl::TextureCubeMap::faceIndex(faceTarget)]; return mRenderTarget[gl::TextureCubeMap::faceIndex(faceTarget)];
} }
......
...@@ -37,8 +37,9 @@ class TextureStorage9 : public TextureStorage ...@@ -37,8 +37,9 @@ class TextureStorage9 : public TextureStorage
DWORD getUsage() const; DWORD getUsage() const;
virtual IDirect3DBaseTexture9 *getBaseTexture() const = 0; virtual IDirect3DBaseTexture9 *getBaseTexture() const = 0;
virtual RenderTarget *getRenderTarget() { return NULL; } virtual RenderTarget *getRenderTarget(int level) { return NULL; }
virtual RenderTarget *getRenderTarget(GLenum faceTarget) { 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 level) {};
virtual void generateMipmap(int face, int level) {}; virtual void generateMipmap(int face, int level) {};
...@@ -68,7 +69,7 @@ class TextureStorage9_2D : public TextureStorage9 ...@@ -68,7 +69,7 @@ class TextureStorage9_2D : public TextureStorage9
static TextureStorage9_2D *makeTextureStorage9_2D(TextureStorage *storage); static TextureStorage9_2D *makeTextureStorage9_2D(TextureStorage *storage);
IDirect3DSurface9 *getSurfaceLevel(int level, bool dirty); IDirect3DSurface9 *getSurfaceLevel(int level, bool dirty);
virtual RenderTarget *getRenderTarget(); virtual RenderTarget *getRenderTarget(int level);
virtual IDirect3DBaseTexture9 *getBaseTexture() const; virtual IDirect3DBaseTexture9 *getBaseTexture() const;
virtual void generateMipmap(int level); virtual void generateMipmap(int level);
...@@ -90,7 +91,7 @@ class TextureStorage9_Cube : public TextureStorage9 ...@@ -90,7 +91,7 @@ class TextureStorage9_Cube : public TextureStorage9
static TextureStorage9_Cube *makeTextureStorage9_Cube(TextureStorage *storage); static TextureStorage9_Cube *makeTextureStorage9_Cube(TextureStorage *storage);
IDirect3DSurface9 *getCubeMapSurface(GLenum faceTarget, int level, bool dirty); 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 IDirect3DBaseTexture9 *getBaseTexture() const;
virtual void generateMipmap(int face, int level); 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