Commit a9f85c63 by Nicolas Capens

Cache previously created SRVs.

BUG=angle:596 Change-Id: I15ac729388177a2ac89df4caffad5e12c7317bd7 Reviewed-on: https://chromium-review.googlesource.com/193232Tested-by: 's avatarNicolas Capens <nicolascapens@chromium.org> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarShannon Woods <shannonwoods@chromium.org>
parent 1d31aca9
...@@ -46,6 +46,47 @@ bool TextureStorage11::SwizzleCacheValue::operator!=(const SwizzleCacheValue &ot ...@@ -46,6 +46,47 @@ bool TextureStorage11::SwizzleCacheValue::operator!=(const SwizzleCacheValue &ot
return !(*this == other); return !(*this == other);
} }
TextureStorage11::SRVKey::SRVKey(int baseLevel, int mipLevels, bool swizzle)
: baseLevel(baseLevel), mipLevels(mipLevels), swizzle(swizzle)
{
}
bool TextureStorage11::SRVKey::operator==(const SRVKey &rhs) const
{
return baseLevel == rhs.baseLevel &&
mipLevels == rhs.mipLevels &&
swizzle == rhs.swizzle;
}
TextureStorage11::SRVCache::~SRVCache()
{
for (size_t i = 0; i < cache.size(); i++)
{
SafeRelease(cache[i].srv);
}
}
ID3D11ShaderResourceView *TextureStorage11::SRVCache::find(const SRVKey &key) const
{
for (size_t i = 0; i < cache.size(); i++)
{
if (cache[i].key == key)
{
return cache[i].srv;
}
}
return NULL;
}
ID3D11ShaderResourceView *TextureStorage11::SRVCache::add(const SRVKey &key, ID3D11ShaderResourceView *srv)
{
SRVPair pair = {key, srv};
cache.push_back(pair);
return srv;
}
TextureStorage11::TextureStorage11(Renderer *renderer, UINT bindFlags) TextureStorage11::TextureStorage11(Renderer *renderer, UINT bindFlags)
: mBindFlags(bindFlags), : mBindFlags(bindFlags),
mTopLevel(0), mTopLevel(0),
...@@ -280,8 +321,6 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer *renderer, SwapChain11 *swapch ...@@ -280,8 +321,6 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer *renderer, SwapChain11 *swapch
mTexture->AddRef(); mTexture->AddRef();
mSwizzleTexture = NULL; mSwizzleTexture = NULL;
memset(mSRV, NULL, sizeof(mSRV));
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; mLevelSRVs[i] = NULL;
...@@ -321,8 +360,6 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer *renderer, GLenum internalform ...@@ -321,8 +360,6 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer *renderer, GLenum internalform
mTexture = NULL; mTexture = NULL;
mSwizzleTexture = NULL; mSwizzleTexture = NULL;
memset(mSRV, NULL, sizeof(mSRV));
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; mLevelSRVs[i] = NULL;
...@@ -392,10 +429,6 @@ TextureStorage11_2D::~TextureStorage11_2D() ...@@ -392,10 +429,6 @@ TextureStorage11_2D::~TextureStorage11_2D()
SafeRelease(mTexture); SafeRelease(mTexture);
SafeRelease(mSwizzleTexture); SafeRelease(mSwizzleTexture);
for (int i = 0; i < 2; i++)
for (int j = 0; j < 2; j++)
SafeRelease(mSRV[i][j]);
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]); SafeRelease(mLevelSRVs[i]);
...@@ -493,21 +526,27 @@ ID3D11ShaderResourceView *TextureStorage11_2D::getSRV(const gl::SamplerState &sa ...@@ -493,21 +526,27 @@ ID3D11ShaderResourceView *TextureStorage11_2D::getSRV(const gl::SamplerState &sa
{ {
bool swizzleRequired = samplerState.swizzleRequired(); bool swizzleRequired = samplerState.swizzleRequired();
bool mipmapping = gl::IsMipmapFiltered(samplerState); bool mipmapping = gl::IsMipmapFiltered(samplerState);
int mipLevels = mipmapping ? (mMipLevels == 0 ? -1 : mMipLevels) : 1;
if (swizzleRequired) if (swizzleRequired)
{ {
verifySwizzleExists(samplerState.swizzleRed, samplerState.swizzleGreen, samplerState.swizzleBlue, samplerState.swizzleAlpha); verifySwizzleExists(samplerState.swizzleRed, samplerState.swizzleGreen, samplerState.swizzleBlue, samplerState.swizzleAlpha);
} }
if (!mSRV[swizzleRequired][mipmapping]) SRVKey key(0, mipLevels, swizzleRequired);
ID3D11ShaderResourceView *srv = srvCache.find(key);
if(srv)
{ {
int mipLevels = mipmapping ? (mMipLevels == 0 ? -1 : mMipLevels) : 1; // -1 creates all levels return srv;
}
DXGI_FORMAT format = (swizzleRequired ? mSwizzleShaderResourceFormat : mShaderResourceFormat); DXGI_FORMAT format = (swizzleRequired ? mSwizzleShaderResourceFormat : mShaderResourceFormat);
ID3D11Texture2D *texture = swizzleRequired ? getSwizzleTexture() : mTexture; ID3D11Texture2D *texture = swizzleRequired ? getSwizzleTexture() : mTexture;
mSRV[swizzleRequired][mipmapping] = createSRV(0, mipLevels, format, texture);
}
return mSRV[swizzleRequired][mipmapping]; srv = createSRV(0, mipLevels, format, texture);
return srvCache.add(key, srv);
} }
ID3D11ShaderResourceView *TextureStorage11_2D::getSRVLevel(int mipLevel) ID3D11ShaderResourceView *TextureStorage11_2D::getSRVLevel(int mipLevel)
...@@ -636,8 +675,6 @@ TextureStorage11_Cube::TextureStorage11_Cube(Renderer *renderer, GLenum internal ...@@ -636,8 +675,6 @@ TextureStorage11_Cube::TextureStorage11_Cube(Renderer *renderer, GLenum internal
mTexture = NULL; mTexture = NULL;
mSwizzleTexture = NULL; mSwizzleTexture = NULL;
memset(mSRV, NULL, sizeof(mSRV));
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; mLevelSRVs[level] = NULL;
...@@ -705,10 +742,6 @@ TextureStorage11_Cube::~TextureStorage11_Cube() ...@@ -705,10 +742,6 @@ TextureStorage11_Cube::~TextureStorage11_Cube()
SafeRelease(mTexture); SafeRelease(mTexture);
SafeRelease(mSwizzleTexture); SafeRelease(mSwizzleTexture);
for (int i = 0; i < 2; i++)
for (int j = 0; j < 2; j++)
SafeRelease(mSRV[i][j]);
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(mLevelSRVs[level]);
...@@ -827,25 +860,31 @@ ID3D11ShaderResourceView *TextureStorage11_Cube::getSRV(const gl::SamplerState & ...@@ -827,25 +860,31 @@ ID3D11ShaderResourceView *TextureStorage11_Cube::getSRV(const gl::SamplerState &
{ {
bool swizzleRequired = samplerState.swizzleRequired(); bool swizzleRequired = samplerState.swizzleRequired();
bool mipmapping = gl::IsMipmapFiltered(samplerState); bool mipmapping = gl::IsMipmapFiltered(samplerState);
int mipLevels = mipmapping ? (mMipLevels == 0 ? -1 : mMipLevels) : 1;
if (swizzleRequired) if (swizzleRequired)
{ {
verifySwizzleExists(samplerState.swizzleRed, samplerState.swizzleGreen, samplerState.swizzleBlue, samplerState.swizzleAlpha); verifySwizzleExists(samplerState.swizzleRed, samplerState.swizzleGreen, samplerState.swizzleBlue, samplerState.swizzleAlpha);
} }
if (!mSRV[swizzleRequired][mipmapping]) SRVKey key(0, mipLevels, swizzleRequired);
ID3D11ShaderResourceView *srv = srvCache.find(key);
if(srv)
{ {
return srv;
}
// Unnormalized integer cube maps are not supported by DX11; we emulate them as an array of six 2D textures // Unnormalized integer cube maps are not supported by DX11; we emulate them as an array of six 2D textures
bool unnormalizedInteger = (d3d11::GetComponentType(mTextureFormat) == GL_INT || bool unnormalizedInteger = (d3d11::GetComponentType(mTextureFormat) == GL_INT ||
d3d11::GetComponentType(mTextureFormat) == GL_UNSIGNED_INT); d3d11::GetComponentType(mTextureFormat) == GL_UNSIGNED_INT);
int mipLevels = mipmapping ? (mMipLevels == 0 ? -1 : mMipLevels) : 1; // -1 creates all levels
DXGI_FORMAT format = (swizzleRequired ? mSwizzleShaderResourceFormat : mShaderResourceFormat); DXGI_FORMAT format = (swizzleRequired ? mSwizzleShaderResourceFormat : mShaderResourceFormat);
ID3D11Texture2D *texture = swizzleRequired ? getSwizzleTexture() : mTexture; ID3D11Texture2D *texture = swizzleRequired ? getSwizzleTexture() : mTexture;
mSRV[swizzleRequired][mipmapping] = createSRV(unnormalizedInteger, 0, mipLevels, format, texture);
}
return mSRV[swizzleRequired][mipmapping]; srv = createSRV(unnormalizedInteger, 0, mipLevels, format, texture);
return srvCache.add(key, srv);
} }
ID3D11ShaderResourceView *TextureStorage11_Cube::getSRVLevel(int mipLevel) ID3D11ShaderResourceView *TextureStorage11_Cube::getSRVLevel(int mipLevel)
...@@ -990,8 +1029,6 @@ TextureStorage11_3D::TextureStorage11_3D(Renderer *renderer, GLenum internalform ...@@ -990,8 +1029,6 @@ TextureStorage11_3D::TextureStorage11_3D(Renderer *renderer, GLenum internalform
mTexture = NULL; mTexture = NULL;
mSwizzleTexture = NULL; mSwizzleTexture = NULL;
memset(mSRV, NULL, sizeof(mSRV));
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;
...@@ -1059,10 +1096,6 @@ TextureStorage11_3D::~TextureStorage11_3D() ...@@ -1059,10 +1096,6 @@ TextureStorage11_3D::~TextureStorage11_3D()
SafeRelease(mTexture); SafeRelease(mTexture);
SafeRelease(mSwizzleTexture); SafeRelease(mSwizzleTexture);
for (int i = 0; i < 2; i++)
for (int j = 0; j < 2; j++)
SafeRelease(mSRV[i][j]);
for (RenderTargetMap::iterator i = mLevelLayerRenderTargets.begin(); i != mLevelLayerRenderTargets.end(); i++) for (RenderTargetMap::iterator i = mLevelLayerRenderTargets.begin(); i != mLevelLayerRenderTargets.end(); i++)
{ {
SafeDelete(i->second); SafeDelete(i->second);
...@@ -1092,21 +1125,27 @@ ID3D11ShaderResourceView *TextureStorage11_3D::getSRV(const gl::SamplerState &sa ...@@ -1092,21 +1125,27 @@ ID3D11ShaderResourceView *TextureStorage11_3D::getSRV(const gl::SamplerState &sa
{ {
bool swizzleRequired = samplerState.swizzleRequired(); bool swizzleRequired = samplerState.swizzleRequired();
bool mipmapping = gl::IsMipmapFiltered(samplerState); bool mipmapping = gl::IsMipmapFiltered(samplerState);
int mipLevels = mipmapping ? (mMipLevels == 0 ? -1 : mMipLevels) : 1;
if (swizzleRequired) if (swizzleRequired)
{ {
verifySwizzleExists(samplerState.swizzleRed, samplerState.swizzleGreen, samplerState.swizzleBlue, samplerState.swizzleAlpha); verifySwizzleExists(samplerState.swizzleRed, samplerState.swizzleGreen, samplerState.swizzleBlue, samplerState.swizzleAlpha);
} }
if (!mSRV[swizzleRequired][mipmapping]) SRVKey key(0, mipLevels, swizzleRequired);
ID3D11ShaderResourceView *srv = srvCache.find(key);
if(srv)
{ {
int mipLevels = mipmapping ? (mMipLevels == 0 ? -1 : mMipLevels) : 1; // -1 creates all levels return srv;
}
DXGI_FORMAT format = (swizzleRequired ? mSwizzleShaderResourceFormat : mShaderResourceFormat); DXGI_FORMAT format = (swizzleRequired ? mSwizzleShaderResourceFormat : mShaderResourceFormat);
ID3D11Texture3D *texture = swizzleRequired ? getSwizzleTexture() : mTexture; ID3D11Texture3D *texture = swizzleRequired ? getSwizzleTexture() : mTexture;
mSRV[swizzleRequired][mipmapping] = createSRV(0, mipLevels, format, texture);
}
return mSRV[swizzleRequired][mipmapping]; srv = createSRV(0, mipLevels, format, texture);
return srvCache.add(key, srv);
} }
ID3D11ShaderResourceView *TextureStorage11_3D::getSRVLevel(int mipLevel) ID3D11ShaderResourceView *TextureStorage11_3D::getSRVLevel(int mipLevel)
...@@ -1342,8 +1381,6 @@ TextureStorage11_2DArray::TextureStorage11_2DArray(Renderer *renderer, GLenum in ...@@ -1342,8 +1381,6 @@ TextureStorage11_2DArray::TextureStorage11_2DArray(Renderer *renderer, GLenum in
mTexture = NULL; mTexture = NULL;
mSwizzleTexture = NULL; mSwizzleTexture = NULL;
memset(mSRV, NULL, sizeof(mSRV));
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; mLevelSRVs[level] = NULL;
...@@ -1412,10 +1449,6 @@ TextureStorage11_2DArray::~TextureStorage11_2DArray() ...@@ -1412,10 +1449,6 @@ TextureStorage11_2DArray::~TextureStorage11_2DArray()
SafeRelease(mTexture); SafeRelease(mTexture);
SafeRelease(mSwizzleTexture); SafeRelease(mSwizzleTexture);
for (int i = 0; i < 2; i++)
for (int j = 0; j < 2; j++)
SafeRelease(mSRV[i][j]);
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(mLevelSRVs[level]);
...@@ -1444,21 +1477,27 @@ ID3D11ShaderResourceView *TextureStorage11_2DArray::getSRV(const gl::SamplerStat ...@@ -1444,21 +1477,27 @@ ID3D11ShaderResourceView *TextureStorage11_2DArray::getSRV(const gl::SamplerStat
{ {
bool swizzleRequired = samplerState.swizzleRequired(); bool swizzleRequired = samplerState.swizzleRequired();
bool mipmapping = gl::IsMipmapFiltered(samplerState); bool mipmapping = gl::IsMipmapFiltered(samplerState);
int mipLevels = mipmapping ? (mMipLevels == 0 ? -1 : mMipLevels) : 1;
if (swizzleRequired) if (swizzleRequired)
{ {
verifySwizzleExists(samplerState.swizzleRed, samplerState.swizzleGreen, samplerState.swizzleBlue, samplerState.swizzleAlpha); verifySwizzleExists(samplerState.swizzleRed, samplerState.swizzleGreen, samplerState.swizzleBlue, samplerState.swizzleAlpha);
} }
if (!mSRV[swizzleRequired][mipmapping]) SRVKey key(0, mipLevels, swizzleRequired);
ID3D11ShaderResourceView *srv = srvCache.find(key);
if(srv)
{ {
int mipLevels = mipmapping ? (mMipLevels == 0 ? -1 : mMipLevels) : 1; // -1 creates all levels return srv;
}
DXGI_FORMAT format = (swizzleRequired ? mSwizzleShaderResourceFormat : mShaderResourceFormat); DXGI_FORMAT format = (swizzleRequired ? mSwizzleShaderResourceFormat : mShaderResourceFormat);
ID3D11Texture2D *texture = swizzleRequired ? getSwizzleTexture() : mTexture; ID3D11Texture2D *texture = swizzleRequired ? getSwizzleTexture() : mTexture;
mSRV[swizzleRequired][mipmapping] = createSRV(0, mipLevels, format, texture);
}
return mSRV[swizzleRequired][mipmapping]; srv = createSRV(0, mipLevels, format, texture);
return srvCache.add(key, srv);
} }
ID3D11ShaderResourceView *TextureStorage11_2DArray::getSRVLevel(int mipLevel) ID3D11ShaderResourceView *TextureStorage11_2DArray::getSRVLevel(int mipLevel)
......
...@@ -99,6 +99,33 @@ class TextureStorage11 : public TextureStorage ...@@ -99,6 +99,33 @@ class TextureStorage11 : public TextureStorage
}; };
SwizzleCacheValue mSwizzleCache[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS]; SwizzleCacheValue mSwizzleCache[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
struct SRVKey
{
SRVKey(int baseLevel = 0, int mipLevels = 0, bool swizzle = false);
bool operator==(const SRVKey &rhs) const;
int baseLevel;
int mipLevels;
bool swizzle;
};
struct SRVPair
{
SRVKey key;
ID3D11ShaderResourceView *srv;
};
struct SRVCache
{
~SRVCache();
ID3D11ShaderResourceView *find(const SRVKey &key) const;
ID3D11ShaderResourceView *add(const SRVKey &key, ID3D11ShaderResourceView *srv);
std::vector<SRVPair> cache;
};
private: private:
DISALLOW_COPY_AND_ASSIGN(TextureStorage11); DISALLOW_COPY_AND_ASSIGN(TextureStorage11);
...@@ -139,7 +166,7 @@ class TextureStorage11_2D : public TextureStorage11 ...@@ -139,7 +166,7 @@ class TextureStorage11_2D : public TextureStorage11
ID3D11Texture2D *mSwizzleTexture; ID3D11Texture2D *mSwizzleTexture;
ID3D11RenderTargetView *mSwizzleRenderTargets[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS]; ID3D11RenderTargetView *mSwizzleRenderTargets[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
ID3D11ShaderResourceView *mSRV[2][2]; // [swizzle][mipmapping] SRVCache srvCache;
ID3D11ShaderResourceView *mLevelSRVs[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS]; ID3D11ShaderResourceView *mLevelSRVs[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
}; };
...@@ -176,7 +203,7 @@ class TextureStorage11_Cube : public TextureStorage11 ...@@ -176,7 +203,7 @@ class TextureStorage11_Cube : public TextureStorage11
ID3D11Texture2D *mSwizzleTexture; ID3D11Texture2D *mSwizzleTexture;
ID3D11RenderTargetView *mSwizzleRenderTargets[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS]; ID3D11RenderTargetView *mSwizzleRenderTargets[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
ID3D11ShaderResourceView *mSRV[2][2]; // [swizzle][mipmapping] SRVCache srvCache;
ID3D11ShaderResourceView *mLevelSRVs[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS]; ID3D11ShaderResourceView *mLevelSRVs[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
}; };
...@@ -219,7 +246,7 @@ class TextureStorage11_3D : public TextureStorage11 ...@@ -219,7 +246,7 @@ class TextureStorage11_3D : public TextureStorage11
ID3D11Texture3D *mSwizzleTexture; ID3D11Texture3D *mSwizzleTexture;
ID3D11RenderTargetView *mSwizzleRenderTargets[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS]; ID3D11RenderTargetView *mSwizzleRenderTargets[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
ID3D11ShaderResourceView *mSRV[2][2]; // [swizzle][mipmapping] SRVCache srvCache;
ID3D11ShaderResourceView *mLevelSRVs[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS]; ID3D11ShaderResourceView *mLevelSRVs[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
}; };
...@@ -260,7 +287,7 @@ class TextureStorage11_2DArray : public TextureStorage11 ...@@ -260,7 +287,7 @@ class TextureStorage11_2DArray : public TextureStorage11
ID3D11Texture2D *mSwizzleTexture; ID3D11Texture2D *mSwizzleTexture;
ID3D11RenderTargetView *mSwizzleRenderTargets[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS]; ID3D11RenderTargetView *mSwizzleRenderTargets[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
ID3D11ShaderResourceView *mSRV[2][2]; // [swizzle][mipmapping] SRVCache srvCache;
ID3D11ShaderResourceView *mLevelSRVs[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS]; 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