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
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)
: mBindFlags(bindFlags),
mTopLevel(0),
......@@ -280,8 +321,6 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer *renderer, SwapChain11 *swapch
mTexture->AddRef();
mSwizzleTexture = NULL;
memset(mSRV, NULL, sizeof(mSRV));
for (unsigned int i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)
{
mLevelSRVs[i] = NULL;
......@@ -321,8 +360,6 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer *renderer, GLenum internalform
mTexture = NULL;
mSwizzleTexture = NULL;
memset(mSRV, NULL, sizeof(mSRV));
for (unsigned int i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)
{
mLevelSRVs[i] = NULL;
......@@ -392,10 +429,6 @@ TextureStorage11_2D::~TextureStorage11_2D()
SafeRelease(mTexture);
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++)
{
SafeRelease(mLevelSRVs[i]);
......@@ -493,21 +526,27 @@ ID3D11ShaderResourceView *TextureStorage11_2D::getSRV(const gl::SamplerState &sa
{
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);
}
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
DXGI_FORMAT format = (swizzleRequired ? mSwizzleShaderResourceFormat : mShaderResourceFormat);
ID3D11Texture2D *texture = swizzleRequired ? getSwizzleTexture() : mTexture;
mSRV[swizzleRequired][mipmapping] = createSRV(0, mipLevels, format, texture);
return srv;
}
return mSRV[swizzleRequired][mipmapping];
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)
......@@ -636,8 +675,6 @@ TextureStorage11_Cube::TextureStorage11_Cube(Renderer *renderer, GLenum internal
mTexture = NULL;
mSwizzleTexture = NULL;
memset(mSRV, NULL, sizeof(mSRV));
for (unsigned int level = 0; level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++)
{
mLevelSRVs[level] = NULL;
......@@ -705,10 +742,6 @@ TextureStorage11_Cube::~TextureStorage11_Cube()
SafeRelease(mTexture);
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++)
{
SafeRelease(mLevelSRVs[level]);
......@@ -827,25 +860,31 @@ ID3D11ShaderResourceView *TextureStorage11_Cube::getSRV(const gl::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);
}
if (!mSRV[swizzleRequired][mipmapping])
{
// 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 ||
d3d11::GetComponentType(mTextureFormat) == GL_UNSIGNED_INT);
SRVKey key(0, mipLevels, swizzleRequired);
ID3D11ShaderResourceView *srv = srvCache.find(key);
int mipLevels = mipmapping ? (mMipLevels == 0 ? -1 : mMipLevels) : 1; // -1 creates all levels
DXGI_FORMAT format = (swizzleRequired ? mSwizzleShaderResourceFormat : mShaderResourceFormat);
ID3D11Texture2D *texture = swizzleRequired ? getSwizzleTexture() : mTexture;
mSRV[swizzleRequired][mipmapping] = createSRV(unnormalizedInteger, 0, mipLevels, format, texture);
if(srv)
{
return srv;
}
return mSRV[swizzleRequired][mipmapping];
// 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 ||
d3d11::GetComponentType(mTextureFormat) == GL_UNSIGNED_INT);
DXGI_FORMAT format = (swizzleRequired ? mSwizzleShaderResourceFormat : mShaderResourceFormat);
ID3D11Texture2D *texture = swizzleRequired ? getSwizzleTexture() : mTexture;
srv = createSRV(unnormalizedInteger, 0, mipLevels, format, texture);
return srvCache.add(key, srv);
}
ID3D11ShaderResourceView *TextureStorage11_Cube::getSRVLevel(int mipLevel)
......@@ -990,8 +1029,6 @@ TextureStorage11_3D::TextureStorage11_3D(Renderer *renderer, GLenum internalform
mTexture = NULL;
mSwizzleTexture = NULL;
memset(mSRV, NULL, sizeof(mSRV));
for (unsigned int i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)
{
mLevelRenderTargets[i] = NULL;
......@@ -1059,10 +1096,6 @@ TextureStorage11_3D::~TextureStorage11_3D()
SafeRelease(mTexture);
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++)
{
SafeDelete(i->second);
......@@ -1092,21 +1125,27 @@ ID3D11ShaderResourceView *TextureStorage11_3D::getSRV(const gl::SamplerState &sa
{
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);
}
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
DXGI_FORMAT format = (swizzleRequired ? mSwizzleShaderResourceFormat : mShaderResourceFormat);
ID3D11Texture3D *texture = swizzleRequired ? getSwizzleTexture() : mTexture;
mSRV[swizzleRequired][mipmapping] = createSRV(0, mipLevels, format, texture);
return srv;
}
return mSRV[swizzleRequired][mipmapping];
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)
......@@ -1342,8 +1381,6 @@ TextureStorage11_2DArray::TextureStorage11_2DArray(Renderer *renderer, GLenum in
mTexture = NULL;
mSwizzleTexture = NULL;
memset(mSRV, NULL, sizeof(mSRV));
for (unsigned int level = 0; level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++)
{
mLevelSRVs[level] = NULL;
......@@ -1412,10 +1449,6 @@ TextureStorage11_2DArray::~TextureStorage11_2DArray()
SafeRelease(mTexture);
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++)
{
SafeRelease(mLevelSRVs[level]);
......@@ -1444,21 +1477,27 @@ ID3D11ShaderResourceView *TextureStorage11_2DArray::getSRV(const gl::SamplerStat
{
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);
}
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
DXGI_FORMAT format = (swizzleRequired ? mSwizzleShaderResourceFormat : mShaderResourceFormat);
ID3D11Texture2D *texture = swizzleRequired ? getSwizzleTexture() : mTexture;
mSRV[swizzleRequired][mipmapping] = createSRV(0, mipLevels, format, texture);
return srv;
}
return mSRV[swizzleRequired][mipmapping];
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)
......
......@@ -99,6 +99,33 @@ class TextureStorage11 : public TextureStorage
};
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:
DISALLOW_COPY_AND_ASSIGN(TextureStorage11);
......@@ -139,7 +166,7 @@ class TextureStorage11_2D : public TextureStorage11
ID3D11Texture2D *mSwizzleTexture;
ID3D11RenderTargetView *mSwizzleRenderTargets[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
ID3D11ShaderResourceView *mSRV[2][2]; // [swizzle][mipmapping]
SRVCache srvCache;
ID3D11ShaderResourceView *mLevelSRVs[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
};
......@@ -176,7 +203,7 @@ class TextureStorage11_Cube : public TextureStorage11
ID3D11Texture2D *mSwizzleTexture;
ID3D11RenderTargetView *mSwizzleRenderTargets[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
ID3D11ShaderResourceView *mSRV[2][2]; // [swizzle][mipmapping]
SRVCache srvCache;
ID3D11ShaderResourceView *mLevelSRVs[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
};
......@@ -219,7 +246,7 @@ class TextureStorage11_3D : public TextureStorage11
ID3D11Texture3D *mSwizzleTexture;
ID3D11RenderTargetView *mSwizzleRenderTargets[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
ID3D11ShaderResourceView *mSRV[2][2]; // [swizzle][mipmapping]
SRVCache srvCache;
ID3D11ShaderResourceView *mLevelSRVs[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
};
......@@ -260,7 +287,7 @@ class TextureStorage11_2DArray : public TextureStorage11
ID3D11Texture2D *mSwizzleTexture;
ID3D11RenderTargetView *mSwizzleRenderTargets[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
ID3D11ShaderResourceView *mSRV[2][2]; // [swizzle][mipmapping]
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