Caches MipLevel in TextureStorage11, to avoid repeated GetDesc calls.

TRAC #22341 Author: Shannon Woods Signed-off-by: Nicolas Capens Signed-off-by: Daniel Koch git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@1693 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent 8dc8e277
...@@ -21,7 +21,8 @@ namespace rx ...@@ -21,7 +21,8 @@ namespace rx
TextureStorage11::TextureStorage11(Renderer *renderer, UINT bindFlags) TextureStorage11::TextureStorage11(Renderer *renderer, UINT bindFlags)
: mBindFlags(bindFlags), : mBindFlags(bindFlags),
mLodOffset(0) mLodOffset(0),
mMipLevels(0)
{ {
mRenderer = Renderer11::makeRenderer11(renderer); mRenderer = Renderer11::makeRenderer11(renderer);
} }
...@@ -96,30 +97,22 @@ bool TextureStorage11::isManaged() const ...@@ -96,30 +97,22 @@ bool TextureStorage11::isManaged() const
return false; return false;
} }
// TODO - We should store level count internally at creation time instead
// of making driver calls to determine it each time levelCount() is called.
int TextureStorage11::levelCount() int TextureStorage11::levelCount()
{ {
int levels = 0; int levels = 0;
if (getBaseTexture()) if (getBaseTexture())
{ {
D3D11_TEXTURE2D_DESC desc; levels = mMipLevels - getLodOffset();
getBaseTexture()->GetDesc(&desc);
levels = desc.MipLevels - getLodOffset();
} }
return levels; return levels;
} }
// TODO - Once we're storing level count internally, we should no longer
// need to look up the texture description to determine the number of mip levels.
UINT TextureStorage11::getSubresourceIndex(int level, int faceIndex) UINT TextureStorage11::getSubresourceIndex(int level, int faceIndex)
{ {
UINT index = 0; UINT index = 0;
if (getBaseTexture()) if (getBaseTexture())
{ {
D3D11_TEXTURE2D_DESC desc; index = D3D11CalcSubresource(level, faceIndex, mMipLevels);
getBaseTexture()->GetDesc(&desc);
index = D3D11CalcSubresource(level, faceIndex, desc.MipLevels);
} }
return index; return index;
} }
...@@ -157,6 +150,8 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer *renderer, SwapChain11 *swapch ...@@ -157,6 +150,8 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer *renderer, SwapChain11 *swapch
D3D11_TEXTURE2D_DESC desc; D3D11_TEXTURE2D_DESC desc;
surfaceTexture->GetDesc(&desc); surfaceTexture->GetDesc(&desc);
mMipLevels = desc.MipLevels;
initializeSRV(desc.Format, desc.MipLevels); initializeSRV(desc.Format, desc.MipLevels);
initializeRenderTarget(desc.Format, desc.Width, desc.Height); initializeRenderTarget(desc.Format, desc.Width, desc.Height);
} }
...@@ -168,6 +163,7 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer *renderer, int levels, GLenum ...@@ -168,6 +163,7 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer *renderer, int levels, GLenum
mSRV = NULL; mSRV = NULL;
mRenderTarget = NULL; mRenderTarget = NULL;
DXGI_FORMAT format = gl_d3d11::ConvertTextureFormat(internalformat); DXGI_FORMAT format = gl_d3d11::ConvertTextureFormat(internalformat);
// if the width or height is not positive this should be treated as an incomplete texture // if the width or height is not positive this should be treated as an incomplete texture
// we handle that here by skipping the d3d texture creation // we handle that here by skipping the d3d texture creation
if (width > 0 && height > 0) if (width > 0 && height > 0)
...@@ -198,6 +194,11 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer *renderer, int levels, GLenum ...@@ -198,6 +194,11 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer *renderer, int levels, GLenum
ERR("Creating image failed."); ERR("Creating image failed.");
error(GL_OUT_OF_MEMORY); error(GL_OUT_OF_MEMORY);
} }
else
{
mTexture->GetDesc(&desc);
mMipLevels = desc.MipLevels;
}
} }
initializeSRV(format, levels + mLodOffset); initializeSRV(format, levels + mLodOffset);
...@@ -340,6 +341,11 @@ TextureStorage11_Cube::TextureStorage11_Cube(Renderer *renderer, int levels, GLe ...@@ -340,6 +341,11 @@ TextureStorage11_Cube::TextureStorage11_Cube(Renderer *renderer, int levels, GLe
ERR("Creating image failed."); ERR("Creating image failed.");
error(GL_OUT_OF_MEMORY); error(GL_OUT_OF_MEMORY);
} }
else
{
mTexture->GetDesc(&desc);
mMipLevels = desc.MipLevels;
}
} }
initializeSRV(format, levels + mLodOffset); initializeSRV(format, levels + mLodOffset);
......
...@@ -53,6 +53,7 @@ class TextureStorage11 : public TextureStorage ...@@ -53,6 +53,7 @@ class TextureStorage11 : public TextureStorage
protected: protected:
Renderer11 *mRenderer; Renderer11 *mRenderer;
int mLodOffset; int mLodOffset;
unsigned int mMipLevels;
private: private:
DISALLOW_COPY_AND_ASSIGN(TextureStorage11); DISALLOW_COPY_AND_ASSIGN(TextureStorage11);
......
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