Commit 41d9f7e9 by Nicolas Capens

Move common SRV management into TextureStorage11.

BUG=angle:596 Change-Id: I0de2e3826e18ee769c27577b40677f0ca4da083b Reviewed-on: https://chromium-review.googlesource.com/193234Reviewed-by: 's avatarShannon Woods <shannonwoods@chromium.org> Tested-by: 's avatarNicolas Capens <nicolascapens@chromium.org>
parent e83fb002
...@@ -100,10 +100,19 @@ TextureStorage11::TextureStorage11(Renderer *renderer, UINT bindFlags) ...@@ -100,10 +100,19 @@ TextureStorage11::TextureStorage11(Renderer *renderer, UINT bindFlags)
mTextureDepth(0) mTextureDepth(0)
{ {
mRenderer = Renderer11::makeRenderer11(renderer); mRenderer = Renderer11::makeRenderer11(renderer);
for (unsigned int i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)
{
mLevelSRVs[i] = NULL;
}
} }
TextureStorage11::~TextureStorage11() TextureStorage11::~TextureStorage11()
{ {
for (unsigned int level = 0; level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++)
{
SafeRelease(mLevelSRVs[level]);
}
} }
TextureStorage11 *TextureStorage11::makeTextureStorage11(TextureStorage *storage) TextureStorage11 *TextureStorage11::makeTextureStorage11(TextureStorage *storage)
...@@ -182,6 +191,50 @@ UINT TextureStorage11::getSubresourceIndex(int mipLevel, int layerTarget) const ...@@ -182,6 +191,50 @@ UINT TextureStorage11::getSubresourceIndex(int mipLevel, int layerTarget) const
return index; return index;
} }
ID3D11ShaderResourceView *TextureStorage11::getSRV(const gl::SamplerState &samplerState)
{
bool swizzleRequired = samplerState.swizzleRequired();
bool mipmapping = gl::IsMipmapFiltered(samplerState);
int mipLevels = mipmapping ? (mMipLevels == 0 ? -1 : mMipLevels) : 1;
if (swizzleRequired)
{
verifySwizzleExists(samplerState.swizzleRed, samplerState.swizzleGreen, samplerState.swizzleBlue, samplerState.swizzleAlpha);
}
SRVKey key(0, mipLevels, swizzleRequired);
ID3D11ShaderResourceView *srv = srvCache.find(key);
if(srv)
{
return srv;
}
DXGI_FORMAT format = (swizzleRequired ? mSwizzleShaderResourceFormat : mShaderResourceFormat);
ID3D11Resource *texture = swizzleRequired ? getSwizzleTexture() : getResource();
srv = createSRV(0, mipLevels, format, texture);
return srvCache.add(key, srv);
}
ID3D11ShaderResourceView *TextureStorage11::getSRVLevel(int mipLevel)
{
if (mipLevel >= 0 && mipLevel < getLevelCount())
{
if (!mLevelSRVs[mipLevel])
{
mLevelSRVs[mipLevel] = createSRV(mipLevel, 1, mShaderResourceFormat, getResource());
}
return mLevelSRVs[mipLevel];
}
else
{
return NULL;
}
}
void TextureStorage11::generateSwizzles(GLenum swizzleRed, GLenum swizzleGreen, GLenum swizzleBlue, GLenum swizzleAlpha) void TextureStorage11::generateSwizzles(GLenum swizzleRed, GLenum swizzleGreen, GLenum swizzleBlue, GLenum swizzleAlpha)
{ {
SwizzleCacheValue swizzleTarget(swizzleRed, swizzleGreen, swizzleBlue, swizzleAlpha); SwizzleCacheValue swizzleTarget(swizzleRed, swizzleGreen, swizzleBlue, swizzleAlpha);
...@@ -323,7 +376,6 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer *renderer, SwapChain11 *swapch ...@@ -323,7 +376,6 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer *renderer, SwapChain11 *swapch
for (unsigned int i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++) for (unsigned int i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)
{ {
mLevelSRVs[i] = NULL;
mRenderTarget[i] = NULL; mRenderTarget[i] = NULL;
mSwizzleRenderTargets[i] = NULL; mSwizzleRenderTargets[i] = NULL;
} }
...@@ -362,7 +414,6 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer *renderer, GLenum internalform ...@@ -362,7 +414,6 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer *renderer, GLenum internalform
for (unsigned int i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++) for (unsigned int i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)
{ {
mLevelSRVs[i] = NULL;
mRenderTarget[i] = NULL; mRenderTarget[i] = NULL;
mSwizzleRenderTargets[i] = NULL; mSwizzleRenderTargets[i] = NULL;
} }
...@@ -431,7 +482,6 @@ TextureStorage11_2D::~TextureStorage11_2D() ...@@ -431,7 +482,6 @@ TextureStorage11_2D::~TextureStorage11_2D()
for (unsigned int i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++) for (unsigned int i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)
{ {
SafeRelease(mLevelSRVs[i]);
SafeDelete(mRenderTarget[i]); SafeDelete(mRenderTarget[i]);
SafeRelease(mSwizzleRenderTargets[i]); SafeRelease(mSwizzleRenderTargets[i]);
} }
...@@ -522,50 +572,6 @@ RenderTarget *TextureStorage11_2D::getRenderTarget(int level) ...@@ -522,50 +572,6 @@ RenderTarget *TextureStorage11_2D::getRenderTarget(int level)
} }
} }
ID3D11ShaderResourceView *TextureStorage11_2D::getSRV(const gl::SamplerState &samplerState)
{
bool swizzleRequired = samplerState.swizzleRequired();
bool mipmapping = gl::IsMipmapFiltered(samplerState);
int mipLevels = mipmapping ? (mMipLevels == 0 ? -1 : mMipLevels) : 1;
if (swizzleRequired)
{
verifySwizzleExists(samplerState.swizzleRed, samplerState.swizzleGreen, samplerState.swizzleBlue, samplerState.swizzleAlpha);
}
SRVKey key(0, mipLevels, swizzleRequired);
ID3D11ShaderResourceView *srv = srvCache.find(key);
if(srv)
{
return srv;
}
DXGI_FORMAT format = (swizzleRequired ? mSwizzleShaderResourceFormat : mShaderResourceFormat);
ID3D11Texture2D *texture = swizzleRequired ? getSwizzleTexture() : mTexture;
srv = createSRV(0, mipLevels, format, texture);
return srvCache.add(key, srv);
}
ID3D11ShaderResourceView *TextureStorage11_2D::getSRVLevel(int mipLevel)
{
if (mipLevel >= 0 && mipLevel < getLevelCount())
{
if (!mLevelSRVs[mipLevel])
{
mLevelSRVs[mipLevel] = createSRV(mipLevel, 1, mShaderResourceFormat, mTexture);
}
return mLevelSRVs[mipLevel];
}
else
{
return NULL;
}
}
ID3D11ShaderResourceView *TextureStorage11_2D::createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture) ID3D11ShaderResourceView *TextureStorage11_2D::createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture)
{ {
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc; D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
...@@ -598,7 +604,7 @@ void TextureStorage11_2D::generateMipmap(int level) ...@@ -598,7 +604,7 @@ void TextureStorage11_2D::generateMipmap(int level)
generateMipmapLayer(source, dest); generateMipmapLayer(source, dest);
} }
ID3D11Texture2D *TextureStorage11_2D::getSwizzleTexture() ID3D11Resource *TextureStorage11_2D::getSwizzleTexture()
{ {
if (!mSwizzleTexture) if (!mSwizzleTexture)
{ {
...@@ -635,7 +641,7 @@ ID3D11RenderTargetView *TextureStorage11_2D::getSwizzleRenderTarget(int mipLevel ...@@ -635,7 +641,7 @@ ID3D11RenderTargetView *TextureStorage11_2D::getSwizzleRenderTarget(int mipLevel
{ {
if (!mSwizzleRenderTargets[mipLevel]) if (!mSwizzleRenderTargets[mipLevel])
{ {
ID3D11Texture2D* swizzleTexture = getSwizzleTexture(); ID3D11Resource *swizzleTexture = getSwizzleTexture();
if (!swizzleTexture) if (!swizzleTexture)
{ {
return NULL; return NULL;
...@@ -677,7 +683,6 @@ TextureStorage11_Cube::TextureStorage11_Cube(Renderer *renderer, GLenum internal ...@@ -677,7 +683,6 @@ TextureStorage11_Cube::TextureStorage11_Cube(Renderer *renderer, GLenum internal
for (unsigned int level = 0; level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++) for (unsigned int level = 0; level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++)
{ {
mLevelSRVs[level] = NULL;
mSwizzleRenderTargets[level] = NULL; mSwizzleRenderTargets[level] = NULL;
for (unsigned int face = 0; face < 6; face++) for (unsigned int face = 0; face < 6; face++)
{ {
...@@ -744,7 +749,6 @@ TextureStorage11_Cube::~TextureStorage11_Cube() ...@@ -744,7 +749,6 @@ TextureStorage11_Cube::~TextureStorage11_Cube()
for (unsigned int level = 0; level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++) for (unsigned int level = 0; level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++)
{ {
SafeRelease(mLevelSRVs[level]);
SafeRelease(mSwizzleRenderTargets[level]); SafeRelease(mSwizzleRenderTargets[level]);
for (unsigned int face = 0; face < 6; face++) for (unsigned int face = 0; face < 6; face++)
{ {
...@@ -856,50 +860,6 @@ RenderTarget *TextureStorage11_Cube::getRenderTargetFace(GLenum faceTarget, int ...@@ -856,50 +860,6 @@ RenderTarget *TextureStorage11_Cube::getRenderTargetFace(GLenum faceTarget, int
} }
} }
ID3D11ShaderResourceView *TextureStorage11_Cube::getSRV(const gl::SamplerState &samplerState)
{
bool swizzleRequired = samplerState.swizzleRequired();
bool mipmapping = gl::IsMipmapFiltered(samplerState);
int mipLevels = mipmapping ? (mMipLevels == 0 ? -1 : mMipLevels) : 1;
if (swizzleRequired)
{
verifySwizzleExists(samplerState.swizzleRed, samplerState.swizzleGreen, samplerState.swizzleBlue, samplerState.swizzleAlpha);
}
SRVKey key(0, mipLevels, swizzleRequired);
ID3D11ShaderResourceView *srv = srvCache.find(key);
if(srv)
{
return srv;
}
DXGI_FORMAT format = (swizzleRequired ? mSwizzleShaderResourceFormat : mShaderResourceFormat);
ID3D11Texture2D *texture = swizzleRequired ? getSwizzleTexture() : mTexture;
srv = createSRV(0, mipLevels, format, texture);
return srvCache.add(key, srv);
}
ID3D11ShaderResourceView *TextureStorage11_Cube::getSRVLevel(int mipLevel)
{
if (mipLevel >= 0 && mipLevel < getLevelCount())
{
if (!mLevelSRVs[mipLevel])
{
mLevelSRVs[mipLevel] = createSRV(mipLevel, 1, mShaderResourceFormat, mTexture);
}
return mLevelSRVs[mipLevel];
}
else
{
return NULL;
}
}
ID3D11ShaderResourceView *TextureStorage11_Cube::createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture) ID3D11ShaderResourceView *TextureStorage11_Cube::createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture)
{ {
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc; D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
...@@ -948,7 +908,7 @@ void TextureStorage11_Cube::generateMipmap(int faceIndex, int level) ...@@ -948,7 +908,7 @@ void TextureStorage11_Cube::generateMipmap(int faceIndex, int level)
generateMipmapLayer(source, dest); generateMipmapLayer(source, dest);
} }
ID3D11Texture2D *TextureStorage11_Cube::getSwizzleTexture() ID3D11Resource *TextureStorage11_Cube::getSwizzleTexture()
{ {
if (!mSwizzleTexture) if (!mSwizzleTexture)
{ {
...@@ -985,7 +945,7 @@ ID3D11RenderTargetView *TextureStorage11_Cube::getSwizzleRenderTarget(int mipLev ...@@ -985,7 +945,7 @@ ID3D11RenderTargetView *TextureStorage11_Cube::getSwizzleRenderTarget(int mipLev
{ {
if (!mSwizzleRenderTargets[mipLevel]) if (!mSwizzleRenderTargets[mipLevel])
{ {
ID3D11Texture2D* swizzleTexture = getSwizzleTexture(); ID3D11Resource *swizzleTexture = getSwizzleTexture();
if (!swizzleTexture) if (!swizzleTexture)
{ {
return NULL; return NULL;
...@@ -1032,7 +992,6 @@ TextureStorage11_3D::TextureStorage11_3D(Renderer *renderer, GLenum internalform ...@@ -1032,7 +992,6 @@ TextureStorage11_3D::TextureStorage11_3D(Renderer *renderer, GLenum internalform
for (unsigned int i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++) for (unsigned int i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)
{ {
mLevelRenderTargets[i] = NULL; mLevelRenderTargets[i] = NULL;
mLevelSRVs[i] = NULL;
mSwizzleRenderTargets[i] = NULL; mSwizzleRenderTargets[i] = NULL;
} }
...@@ -1105,7 +1064,6 @@ TextureStorage11_3D::~TextureStorage11_3D() ...@@ -1105,7 +1064,6 @@ TextureStorage11_3D::~TextureStorage11_3D()
for (unsigned int i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++) for (unsigned int i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)
{ {
SafeDelete(mLevelRenderTargets[i]); SafeDelete(mLevelRenderTargets[i]);
SafeRelease(mLevelSRVs[i]);
SafeRelease(mSwizzleRenderTargets[i]); SafeRelease(mSwizzleRenderTargets[i]);
} }
} }
...@@ -1121,50 +1079,6 @@ ID3D11Resource *TextureStorage11_3D::getResource() const ...@@ -1121,50 +1079,6 @@ ID3D11Resource *TextureStorage11_3D::getResource() const
return mTexture; return mTexture;
} }
ID3D11ShaderResourceView *TextureStorage11_3D::getSRV(const gl::SamplerState &samplerState)
{
bool swizzleRequired = samplerState.swizzleRequired();
bool mipmapping = gl::IsMipmapFiltered(samplerState);
int mipLevels = mipmapping ? (mMipLevels == 0 ? -1 : mMipLevels) : 1;
if (swizzleRequired)
{
verifySwizzleExists(samplerState.swizzleRed, samplerState.swizzleGreen, samplerState.swizzleBlue, samplerState.swizzleAlpha);
}
SRVKey key(0, mipLevels, swizzleRequired);
ID3D11ShaderResourceView *srv = srvCache.find(key);
if(srv)
{
return srv;
}
DXGI_FORMAT format = (swizzleRequired ? mSwizzleShaderResourceFormat : mShaderResourceFormat);
ID3D11Texture3D *texture = swizzleRequired ? getSwizzleTexture() : mTexture;
srv = createSRV(0, mipLevels, format, texture);
return srvCache.add(key, srv);
}
ID3D11ShaderResourceView *TextureStorage11_3D::getSRVLevel(int mipLevel)
{
if (mipLevel >= 0 && mipLevel < getLevelCount())
{
if (!mLevelSRVs[mipLevel])
{
mLevelSRVs[mipLevel] = createSRV(mipLevel, 1, mShaderResourceFormat, mTexture);
}
return mLevelSRVs[mipLevel];
}
else
{
return NULL;
}
}
ID3D11ShaderResourceView *TextureStorage11_3D::createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture) ID3D11ShaderResourceView *TextureStorage11_3D::createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture)
{ {
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc; D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
...@@ -1301,7 +1215,7 @@ void TextureStorage11_3D::generateMipmap(int level) ...@@ -1301,7 +1215,7 @@ void TextureStorage11_3D::generateMipmap(int level)
generateMipmapLayer(source, dest); generateMipmapLayer(source, dest);
} }
ID3D11Texture3D *TextureStorage11_3D::getSwizzleTexture() ID3D11Resource *TextureStorage11_3D::getSwizzleTexture()
{ {
if (!mSwizzleTexture) if (!mSwizzleTexture)
{ {
...@@ -1336,7 +1250,7 @@ ID3D11RenderTargetView *TextureStorage11_3D::getSwizzleRenderTarget(int mipLevel ...@@ -1336,7 +1250,7 @@ ID3D11RenderTargetView *TextureStorage11_3D::getSwizzleRenderTarget(int mipLevel
{ {
if (!mSwizzleRenderTargets[mipLevel]) if (!mSwizzleRenderTargets[mipLevel])
{ {
ID3D11Texture3D* swizzleTexture = getSwizzleTexture(); ID3D11Resource *swizzleTexture = getSwizzleTexture();
if (!swizzleTexture) if (!swizzleTexture)
{ {
return NULL; return NULL;
...@@ -1383,7 +1297,6 @@ TextureStorage11_2DArray::TextureStorage11_2DArray(Renderer *renderer, GLenum in ...@@ -1383,7 +1297,6 @@ TextureStorage11_2DArray::TextureStorage11_2DArray(Renderer *renderer, GLenum in
for (unsigned int level = 0; level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++) for (unsigned int level = 0; level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++)
{ {
mLevelSRVs[level] = NULL;
mSwizzleRenderTargets[level] = NULL; mSwizzleRenderTargets[level] = NULL;
} }
...@@ -1451,7 +1364,6 @@ TextureStorage11_2DArray::~TextureStorage11_2DArray() ...@@ -1451,7 +1364,6 @@ TextureStorage11_2DArray::~TextureStorage11_2DArray()
for (unsigned int level = 0; level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++) for (unsigned int level = 0; level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++)
{ {
SafeRelease(mLevelSRVs[level]);
SafeRelease(mSwizzleRenderTargets[level]); SafeRelease(mSwizzleRenderTargets[level]);
} }
...@@ -1473,50 +1385,6 @@ ID3D11Resource *TextureStorage11_2DArray::getResource() const ...@@ -1473,50 +1385,6 @@ ID3D11Resource *TextureStorage11_2DArray::getResource() const
return mTexture; return mTexture;
} }
ID3D11ShaderResourceView *TextureStorage11_2DArray::getSRV(const gl::SamplerState &samplerState)
{
bool swizzleRequired = samplerState.swizzleRequired();
bool mipmapping = gl::IsMipmapFiltered(samplerState);
int mipLevels = mipmapping ? (mMipLevels == 0 ? -1 : mMipLevels) : 1;
if (swizzleRequired)
{
verifySwizzleExists(samplerState.swizzleRed, samplerState.swizzleGreen, samplerState.swizzleBlue, samplerState.swizzleAlpha);
}
SRVKey key(0, mipLevels, swizzleRequired);
ID3D11ShaderResourceView *srv = srvCache.find(key);
if(srv)
{
return srv;
}
DXGI_FORMAT format = (swizzleRequired ? mSwizzleShaderResourceFormat : mShaderResourceFormat);
ID3D11Texture2D *texture = swizzleRequired ? getSwizzleTexture() : mTexture;
srv = createSRV(0, mipLevels, format, texture);
return srvCache.add(key, srv);
}
ID3D11ShaderResourceView *TextureStorage11_2DArray::getSRVLevel(int mipLevel)
{
if (mipLevel >= 0 && mipLevel < getLevelCount())
{
if (!mLevelSRVs[mipLevel])
{
mLevelSRVs[mipLevel] = createSRV(mipLevel, 1, mShaderResourceFormat, mTexture);
}
return mLevelSRVs[mipLevel];
}
else
{
return NULL;
}
}
ID3D11ShaderResourceView *TextureStorage11_2DArray::createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture) ID3D11ShaderResourceView *TextureStorage11_2DArray::createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture)
{ {
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc; D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
...@@ -1619,8 +1487,7 @@ void TextureStorage11_2DArray::generateMipmap(int level) ...@@ -1619,8 +1487,7 @@ void TextureStorage11_2DArray::generateMipmap(int level)
} }
} }
ID3D11Resource *TextureStorage11_2DArray::getSwizzleTexture()
ID3D11Texture2D *TextureStorage11_2DArray::getSwizzleTexture()
{ {
if (!mSwizzleTexture) if (!mSwizzleTexture)
{ {
...@@ -1657,7 +1524,7 @@ ID3D11RenderTargetView *TextureStorage11_2DArray::getSwizzleRenderTarget(int mip ...@@ -1657,7 +1524,7 @@ ID3D11RenderTargetView *TextureStorage11_2DArray::getSwizzleRenderTarget(int mip
{ {
if (!mSwizzleRenderTargets[mipLevel]) if (!mSwizzleRenderTargets[mipLevel])
{ {
ID3D11Texture2D* swizzleTexture = getSwizzleTexture(); ID3D11Resource *swizzleTexture = getSwizzleTexture();
if (!swizzleTexture) if (!swizzleTexture)
{ {
return NULL; return NULL;
......
...@@ -33,7 +33,7 @@ class TextureStorage11 : public TextureStorage ...@@ -33,7 +33,7 @@ class TextureStorage11 : public TextureStorage
UINT getBindFlags() const; UINT getBindFlags() const;
virtual ID3D11Resource *getResource() const = 0; virtual ID3D11Resource *getResource() const = 0;
virtual ID3D11ShaderResourceView *getSRV(const gl::SamplerState &samplerState) = 0; virtual ID3D11ShaderResourceView *getSRV(const gl::SamplerState &samplerState);
virtual RenderTarget *getRenderTarget(int level) { return NULL; } virtual RenderTarget *getRenderTarget(int level) { return NULL; }
virtual RenderTarget *getRenderTargetFace(GLenum faceTarget, int level) { return NULL; } virtual RenderTarget *getRenderTargetFace(GLenum faceTarget, int level) { return NULL; }
virtual RenderTarget *getRenderTargetLayer(int mipLevel, int layer) { return NULL; } virtual RenderTarget *getRenderTargetLayer(int mipLevel, int layer) { return NULL; }
...@@ -62,8 +62,11 @@ class TextureStorage11 : public TextureStorage ...@@ -62,8 +62,11 @@ class TextureStorage11 : public TextureStorage
int getLevelHeight(int mipLevel) const; int getLevelHeight(int mipLevel) const;
int getLevelDepth(int mipLevel) const; int getLevelDepth(int mipLevel) const;
virtual ID3D11Resource *getSwizzleTexture() = 0;
virtual ID3D11RenderTargetView *getSwizzleRenderTarget(int mipLevel) = 0; virtual ID3D11RenderTargetView *getSwizzleRenderTarget(int mipLevel) = 0;
virtual ID3D11ShaderResourceView *getSRVLevel(int mipLevel) = 0; ID3D11ShaderResourceView *getSRVLevel(int mipLevel);
virtual ID3D11ShaderResourceView *createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture) = 0;
void verifySwizzleExists(GLenum swizzleRed, GLenum swizzleGreen, GLenum swizzleBlue, GLenum swizzleAlpha); void verifySwizzleExists(GLenum swizzleRed, GLenum swizzleGreen, GLenum swizzleBlue, GLenum swizzleAlpha);
...@@ -130,6 +133,9 @@ class TextureStorage11 : public TextureStorage ...@@ -130,6 +133,9 @@ class TextureStorage11 : public TextureStorage
DISALLOW_COPY_AND_ASSIGN(TextureStorage11); DISALLOW_COPY_AND_ASSIGN(TextureStorage11);
const UINT mBindFlags; const UINT mBindFlags;
SRVCache srvCache;
ID3D11ShaderResourceView *mLevelSRVs[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
}; };
class TextureStorage11_2D : public TextureStorage11 class TextureStorage11_2D : public TextureStorage11
...@@ -142,32 +148,26 @@ class TextureStorage11_2D : public TextureStorage11 ...@@ -142,32 +148,26 @@ class TextureStorage11_2D : public TextureStorage11
static TextureStorage11_2D *makeTextureStorage11_2D(TextureStorage *storage); static TextureStorage11_2D *makeTextureStorage11_2D(TextureStorage *storage);
virtual ID3D11Resource *getResource() const; virtual ID3D11Resource *getResource() const;
virtual ID3D11ShaderResourceView *getSRV(const gl::SamplerState &samplerState);
virtual RenderTarget *getRenderTarget(int level); virtual RenderTarget *getRenderTarget(int level);
virtual void generateMipmap(int level); virtual void generateMipmap(int level);
protected: protected:
ID3D11Texture2D *getSwizzleTexture(); virtual ID3D11Resource *getSwizzleTexture();
virtual ID3D11RenderTargetView *getSwizzleRenderTarget(int mipLevel); virtual ID3D11RenderTargetView *getSwizzleRenderTarget(int mipLevel);
virtual ID3D11ShaderResourceView *getSRVLevel(int mipLevel);
virtual unsigned int getTextureLevelDepth(int mipLevel) const; virtual unsigned int getTextureLevelDepth(int mipLevel) const;
private: private:
DISALLOW_COPY_AND_ASSIGN(TextureStorage11_2D); DISALLOW_COPY_AND_ASSIGN(TextureStorage11_2D);
ID3D11ShaderResourceView *createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture); virtual ID3D11ShaderResourceView *createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture);
ID3D11Texture2D *mTexture; ID3D11Texture2D *mTexture;
RenderTarget11 *mRenderTarget[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS]; RenderTarget11 *mRenderTarget[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
ID3D11Texture2D *mSwizzleTexture; ID3D11Texture2D *mSwizzleTexture;
ID3D11RenderTargetView *mSwizzleRenderTargets[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS]; ID3D11RenderTargetView *mSwizzleRenderTargets[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
SRVCache srvCache;
ID3D11ShaderResourceView *mLevelSRVs[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
}; };
class TextureStorage11_Cube : public TextureStorage11 class TextureStorage11_Cube : public TextureStorage11
...@@ -179,32 +179,26 @@ class TextureStorage11_Cube : public TextureStorage11 ...@@ -179,32 +179,26 @@ class TextureStorage11_Cube : public TextureStorage11
static TextureStorage11_Cube *makeTextureStorage11_Cube(TextureStorage *storage); static TextureStorage11_Cube *makeTextureStorage11_Cube(TextureStorage *storage);
virtual ID3D11Resource *getResource() const; virtual ID3D11Resource *getResource() const;
virtual ID3D11ShaderResourceView *getSRV(const gl::SamplerState &samplerState);
virtual RenderTarget *getRenderTargetFace(GLenum faceTarget, int level); virtual RenderTarget *getRenderTargetFace(GLenum faceTarget, int level);
virtual void generateMipmap(int faceIndex, int level); virtual void generateMipmap(int faceIndex, int level);
protected: protected:
ID3D11Texture2D *getSwizzleTexture(); virtual ID3D11Resource *getSwizzleTexture();
virtual ID3D11RenderTargetView *getSwizzleRenderTarget(int mipLevel); virtual ID3D11RenderTargetView *getSwizzleRenderTarget(int mipLevel);
virtual ID3D11ShaderResourceView *getSRVLevel(int mipLevel);
virtual unsigned int getTextureLevelDepth(int mipLevel) const; virtual unsigned int getTextureLevelDepth(int mipLevel) const;
private: private:
DISALLOW_COPY_AND_ASSIGN(TextureStorage11_Cube); DISALLOW_COPY_AND_ASSIGN(TextureStorage11_Cube);
ID3D11ShaderResourceView *createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture); virtual ID3D11ShaderResourceView *createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture);
ID3D11Texture2D *mTexture; ID3D11Texture2D *mTexture;
RenderTarget11 *mRenderTarget[6][gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS]; RenderTarget11 *mRenderTarget[6][gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
ID3D11Texture2D *mSwizzleTexture; ID3D11Texture2D *mSwizzleTexture;
ID3D11RenderTargetView *mSwizzleRenderTargets[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS]; ID3D11RenderTargetView *mSwizzleRenderTargets[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
SRVCache srvCache;
ID3D11ShaderResourceView *mLevelSRVs[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
}; };
class TextureStorage11_3D : public TextureStorage11 class TextureStorage11_3D : public TextureStorage11
...@@ -217,24 +211,21 @@ class TextureStorage11_3D : public TextureStorage11 ...@@ -217,24 +211,21 @@ class TextureStorage11_3D : public TextureStorage11
static TextureStorage11_3D *makeTextureStorage11_3D(TextureStorage *storage); static TextureStorage11_3D *makeTextureStorage11_3D(TextureStorage *storage);
virtual ID3D11Resource *getResource() const; virtual ID3D11Resource *getResource() const;
virtual ID3D11ShaderResourceView *getSRV(const gl::SamplerState &samplerState);
virtual RenderTarget *getRenderTarget(int mipLevel); virtual RenderTarget *getRenderTarget(int mipLevel);
virtual RenderTarget *getRenderTargetLayer(int mipLevel, int layer); virtual RenderTarget *getRenderTargetLayer(int mipLevel, int layer);
virtual void generateMipmap(int level); virtual void generateMipmap(int level);
protected: protected:
ID3D11Texture3D *getSwizzleTexture(); virtual ID3D11Resource *getSwizzleTexture();
virtual ID3D11RenderTargetView *getSwizzleRenderTarget(int mipLevel); virtual ID3D11RenderTargetView *getSwizzleRenderTarget(int mipLevel);
virtual ID3D11ShaderResourceView *getSRVLevel(int mipLevel);
virtual unsigned int getTextureLevelDepth(int mipLevel) const; virtual unsigned int getTextureLevelDepth(int mipLevel) const;
private: private:
DISALLOW_COPY_AND_ASSIGN(TextureStorage11_3D); DISALLOW_COPY_AND_ASSIGN(TextureStorage11_3D);
ID3D11ShaderResourceView *createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture); virtual ID3D11ShaderResourceView *createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture);
typedef std::pair<int, int> LevelLayerKey; typedef std::pair<int, int> LevelLayerKey;
typedef std::map<LevelLayerKey, RenderTarget11*> RenderTargetMap; typedef std::map<LevelLayerKey, RenderTarget11*> RenderTargetMap;
...@@ -245,9 +236,6 @@ class TextureStorage11_3D : public TextureStorage11 ...@@ -245,9 +236,6 @@ class TextureStorage11_3D : public TextureStorage11
ID3D11Texture3D *mTexture; ID3D11Texture3D *mTexture;
ID3D11Texture3D *mSwizzleTexture; ID3D11Texture3D *mSwizzleTexture;
ID3D11RenderTargetView *mSwizzleRenderTargets[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS]; ID3D11RenderTargetView *mSwizzleRenderTargets[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
SRVCache srvCache;
ID3D11ShaderResourceView *mLevelSRVs[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
}; };
class TextureStorage11_2DArray : public TextureStorage11 class TextureStorage11_2DArray : public TextureStorage11
...@@ -260,23 +248,20 @@ class TextureStorage11_2DArray : public TextureStorage11 ...@@ -260,23 +248,20 @@ class TextureStorage11_2DArray : public TextureStorage11
static TextureStorage11_2DArray *makeTextureStorage11_2DArray(TextureStorage *storage); static TextureStorage11_2DArray *makeTextureStorage11_2DArray(TextureStorage *storage);
virtual ID3D11Resource *getResource() const; virtual ID3D11Resource *getResource() const;
virtual ID3D11ShaderResourceView *getSRV(const gl::SamplerState &samplerState);
virtual RenderTarget *getRenderTargetLayer(int mipLevel, int layer); virtual RenderTarget *getRenderTargetLayer(int mipLevel, int layer);
virtual void generateMipmap(int level); virtual void generateMipmap(int level);
protected: protected:
ID3D11Texture2D *getSwizzleTexture(); virtual ID3D11Resource *getSwizzleTexture();
virtual ID3D11RenderTargetView *getSwizzleRenderTarget(int mipLevel); virtual ID3D11RenderTargetView *getSwizzleRenderTarget(int mipLevel);
virtual ID3D11ShaderResourceView *getSRVLevel(int mipLevel);
virtual unsigned int getTextureLevelDepth(int mipLevel) const; virtual unsigned int getTextureLevelDepth(int mipLevel) const;
private: private:
DISALLOW_COPY_AND_ASSIGN(TextureStorage11_2DArray); DISALLOW_COPY_AND_ASSIGN(TextureStorage11_2DArray);
ID3D11ShaderResourceView *createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture); virtual ID3D11ShaderResourceView *createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture);
typedef std::pair<int, int> LevelLayerKey; typedef std::pair<int, int> LevelLayerKey;
typedef std::map<LevelLayerKey, RenderTarget11*> RenderTargetMap; typedef std::map<LevelLayerKey, RenderTarget11*> RenderTargetMap;
...@@ -286,9 +271,6 @@ class TextureStorage11_2DArray : public TextureStorage11 ...@@ -286,9 +271,6 @@ class TextureStorage11_2DArray : public TextureStorage11
ID3D11Texture2D *mSwizzleTexture; ID3D11Texture2D *mSwizzleTexture;
ID3D11RenderTargetView *mSwizzleRenderTargets[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS]; ID3D11RenderTargetView *mSwizzleRenderTargets[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
SRVCache srvCache;
ID3D11ShaderResourceView *mLevelSRVs[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
}; };
} }
......
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