Commit b16b8ed7 by Jamie Madill

Add helper functions for returning the dimensions of a level in a texture storage.

TRAC #23978 Signed-off-by: Geoff Lang Signed-off-by: Shannon Woods
parent 07bb8cf4
...@@ -98,6 +98,21 @@ int TextureStorage11::levelCount() ...@@ -98,6 +98,21 @@ int TextureStorage11::levelCount()
return levels; return levels;
} }
int TextureStorage11::getLevelWidth(int mipLevel) const
{
return std::max((static_cast<int>(mTextureWidth) >> mipLevel), 1);
}
int TextureStorage11::getLevelHeight(int mipLevel) const
{
return std::max((static_cast<int>(mTextureHeight) >> mipLevel), 1);
}
int TextureStorage11::getLevelDepth(int mipLevel) const
{
return std::max((static_cast<int>(mTextureDepth) >> mipLevel), 1);
}
UINT TextureStorage11::getSubresourceIndex(int mipLevel, int layerTarget) UINT TextureStorage11::getSubresourceIndex(int mipLevel, int layerTarget)
{ {
UINT index = 0; UINT index = 0;
...@@ -116,9 +131,7 @@ bool TextureStorage11::updateSubresourceLevel(ID3D11Resource *srcTexture, unsign ...@@ -116,9 +131,7 @@ bool TextureStorage11::updateSubresourceLevel(ID3D11Resource *srcTexture, unsign
{ {
GLuint clientVersion = mRenderer->getCurrentClientVersion(); GLuint clientVersion = mRenderer->getCurrentClientVersion();
gl::Extents texSize(std::max(mTextureWidth >> level, 1U), gl::Extents texSize(getLevelWidth(level), getLevelHeight(level), getLevelDepth(level));
std::max(mTextureHeight >> level, 1U),
std::max(mTextureDepth >> level, 1U));
gl::Box copyArea(xoffset, yoffset, zoffset, width, height, depth); gl::Box copyArea(xoffset, yoffset, zoffset, width, height, depth);
bool fullCopy = copyArea.x == 0 && bool fullCopy = copyArea.x == 0 &&
...@@ -349,10 +362,7 @@ RenderTarget *TextureStorage11_2D::getRenderTarget(int level) ...@@ -349,10 +362,7 @@ RenderTarget *TextureStorage11_2D::getRenderTarget(int level)
// also needs to keep a reference to the texture. // also needs to keep a reference to the texture.
mTexture->AddRef(); mTexture->AddRef();
mRenderTarget[level] = new RenderTarget11(mRenderer, rtv, mTexture, srv, mRenderTarget[level] = new RenderTarget11(mRenderer, rtv, mTexture, srv, getLevelWidth(level), getLevelHeight(level), 1);
std::max(mTextureWidth >> level, 1U),
std::max(mTextureHeight >> level, 1U),
1);
} }
else if (mDepthStencilFormat != DXGI_FORMAT_UNKNOWN) else if (mDepthStencilFormat != DXGI_FORMAT_UNKNOWN)
{ {
...@@ -376,10 +386,7 @@ RenderTarget *TextureStorage11_2D::getRenderTarget(int level) ...@@ -376,10 +386,7 @@ RenderTarget *TextureStorage11_2D::getRenderTarget(int level)
// also needs to keep a reference to the texture. // also needs to keep a reference to the texture.
mTexture->AddRef(); mTexture->AddRef();
mRenderTarget[level] = new RenderTarget11(mRenderer, dsv, mTexture, srv, mRenderTarget[level] = new RenderTarget11(mRenderer, dsv, mTexture, srv, getLevelWidth(level), getLevelHeight(level), 1);
std::max(mTextureWidth >> level, 1U),
std::max(mTextureHeight >> level, 1U),
1);
} }
else else
{ {
...@@ -563,10 +570,7 @@ RenderTarget *TextureStorage11_Cube::getRenderTargetFace(GLenum faceTarget, int ...@@ -563,10 +570,7 @@ RenderTarget *TextureStorage11_Cube::getRenderTargetFace(GLenum faceTarget, int
// also needs to keep a reference to the texture. // also needs to keep a reference to the texture.
mTexture->AddRef(); mTexture->AddRef();
mRenderTarget[faceIndex][level] = new RenderTarget11(mRenderer, rtv, mTexture, srv, mRenderTarget[faceIndex][level] = new RenderTarget11(mRenderer, rtv, mTexture, srv, getLevelWidth(level), getLevelHeight(level), 1);
std::max(mTextureWidth >> level, 1U),
std::max(mTextureHeight >> level, 1U),
1);
} }
else if (mDepthStencilFormat != DXGI_FORMAT_UNKNOWN) else if (mDepthStencilFormat != DXGI_FORMAT_UNKNOWN)
{ {
...@@ -592,10 +596,7 @@ RenderTarget *TextureStorage11_Cube::getRenderTargetFace(GLenum faceTarget, int ...@@ -592,10 +596,7 @@ RenderTarget *TextureStorage11_Cube::getRenderTargetFace(GLenum faceTarget, int
// also needs to keep a reference to the texture. // also needs to keep a reference to the texture.
mTexture->AddRef(); mTexture->AddRef();
mRenderTarget[faceIndex][level] = new RenderTarget11(mRenderer, dsv, mTexture, srv, mRenderTarget[faceIndex][level] = new RenderTarget11(mRenderer, dsv, mTexture, srv, getLevelWidth(level), getLevelHeight(level), 1);
std::max(mTextureWidth >> level, 1U),
std::max(mTextureHeight >> level, 1U),
1);
} }
else else
{ {
...@@ -805,10 +806,7 @@ RenderTarget *TextureStorage11_3D::getRenderTarget(int mipLevel) ...@@ -805,10 +806,7 @@ RenderTarget *TextureStorage11_3D::getRenderTarget(int mipLevel)
// also needs to keep a reference to the texture. // also needs to keep a reference to the texture.
mTexture->AddRef(); mTexture->AddRef();
mLevelRenderTargets[mipLevel] = new RenderTarget11(mRenderer, rtv, mTexture, srv, mLevelRenderTargets[mipLevel] = new RenderTarget11(mRenderer, rtv, mTexture, srv, getLevelWidth(mipLevel), getLevelHeight(mipLevel), getLevelDepth(mipLevel));
std::max(mTextureWidth >> mipLevel, 1U),
std::max(mTextureHeight >> mipLevel, 1U),
std::max(mTextureDepth >> mipLevel, 1U));
} }
else else
{ {
...@@ -860,10 +858,7 @@ RenderTarget *TextureStorage11_3D::getRenderTargetLayer(int mipLevel, int layer) ...@@ -860,10 +858,7 @@ RenderTarget *TextureStorage11_3D::getRenderTargetLayer(int mipLevel, int layer)
// also needs to keep a reference to the texture. // also needs to keep a reference to the texture.
mTexture->AddRef(); mTexture->AddRef();
mLevelLayerRenderTargets[key] = new RenderTarget11(mRenderer, rtv, mTexture, srv, mLevelLayerRenderTargets[key] = new RenderTarget11(mRenderer, rtv, mTexture, srv, getLevelWidth(mipLevel), getLevelHeight(mipLevel), 1);
std::max(mTextureWidth >> mipLevel, 1U),
std::max(mTextureHeight >> mipLevel, 1U),
1);
} }
else else
{ {
...@@ -1046,10 +1041,7 @@ RenderTarget *TextureStorage11_2DArray::getRenderTargetLayer(int mipLevel, int l ...@@ -1046,10 +1041,7 @@ RenderTarget *TextureStorage11_2DArray::getRenderTargetLayer(int mipLevel, int l
// also needs to keep a reference to the texture. // also needs to keep a reference to the texture.
mTexture->AddRef(); mTexture->AddRef();
mRenderTargets[key] = new RenderTarget11(mRenderer, rtv, mTexture, srv, mRenderTargets[key] = new RenderTarget11(mRenderer, rtv, mTexture, srv, getLevelWidth(mipLevel), getLevelHeight(mipLevel), 1);
std::max(mTextureWidth >> mipLevel, 1U),
std::max(mTextureHeight >> mipLevel, 1U),
1);
} }
else else
{ {
......
...@@ -54,6 +54,9 @@ class TextureStorage11 : public TextureStorage ...@@ -54,6 +54,9 @@ class TextureStorage11 : public TextureStorage
protected: protected:
void generateMipmapLayer(RenderTarget11 *source, RenderTarget11 *dest); void generateMipmapLayer(RenderTarget11 *source, RenderTarget11 *dest);
int getLevelWidth(int mipLevel) const;
int getLevelHeight(int mipLevel) const;
int getLevelDepth(int mipLevel) const;
Renderer11 *mRenderer; Renderer11 *mRenderer;
int mLodOffset; int mLodOffset;
......
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