Commit 1d31aca9 by Nicolas Capens

Deduplicate SRV creation.

BUG=angle:596 Change-Id: I2f4e0c4dd5c1182db1f67589f72dafef3717b363 Reviewed-on: https://chromium-review.googlesource.com/193231Tested-by: 's avatarNicolas Capens <nicolascapens@chromium.org> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarShannon Woods <shannonwoods@chromium.org>
parent 76b258f8
......@@ -493,34 +493,60 @@ ID3D11ShaderResourceView *TextureStorage11_2D::getSRV(const gl::SamplerState &sa
{
bool swizzleRequired = samplerState.swizzleRequired();
bool mipmapping = gl::IsMipmapFiltered(samplerState);
ID3D11ShaderResourceView **resultSRV = &mSRV[swizzleRequired][mipmapping];
if (swizzleRequired)
{
verifySwizzleExists(samplerState.swizzleRed, samplerState.swizzleGreen, samplerState.swizzleBlue, samplerState.swizzleAlpha);
}
if (!(*resultSRV))
if (!mSRV[swizzleRequired][mipmapping])
{
ID3D11Device *device = mRenderer->getDevice();
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
srvDesc.Format = (swizzleRequired ? mSwizzleShaderResourceFormat : mShaderResourceFormat);
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
srvDesc.Texture2D.MipLevels = mipmapping ? (mMipLevels == 0 ? -1 : mMipLevels) : 1;
srvDesc.Texture2D.MostDetailedMip = mTopLevel;
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);
}
ID3D11Texture2D *sourceTexture = swizzleRequired ? getSwizzleTexture() : mTexture;
HRESULT result = device->CreateShaderResourceView(sourceTexture, &srvDesc, resultSRV);
return mSRV[swizzleRequired][mipmapping];
}
if (result == E_OUTOFMEMORY)
ID3D11ShaderResourceView *TextureStorage11_2D::getSRVLevel(int mipLevel)
{
if (mipLevel >= 0 && mipLevel < getLevelCount())
{
if (!mLevelSRVs[mipLevel])
{
return gl::error(GL_OUT_OF_MEMORY, static_cast<ID3D11ShaderResourceView*>(NULL));
mLevelSRVs[mipLevel] = createSRV(mipLevel, 1, mShaderResourceFormat, mTexture);
}
ASSERT(SUCCEEDED(result));
return mLevelSRVs[mipLevel];
}
else
{
return NULL;
}
}
ID3D11ShaderResourceView *TextureStorage11_2D::createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture)
{
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
srvDesc.Format = format;
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
srvDesc.Texture2D.MostDetailedMip = mTopLevel + baseLevel;
srvDesc.Texture2D.MipLevels = mipLevels;
ID3D11ShaderResourceView *SRV = NULL;
ID3D11Device *device = mRenderer->getDevice();
HRESULT result = device->CreateShaderResourceView(texture, &srvDesc, &SRV);
return *resultSRV;
if (result == E_OUTOFMEMORY)
{
gl::error(GL_OUT_OF_MEMORY);
}
ASSERT(SUCCEEDED(result));
return SRV;
}
void TextureStorage11_2D::generateMipmap(int level)
......@@ -599,38 +625,6 @@ ID3D11RenderTargetView *TextureStorage11_2D::getSwizzleRenderTarget(int mipLevel
}
}
ID3D11ShaderResourceView *TextureStorage11_2D::getSRVLevel(int mipLevel)
{
if (mipLevel >= 0 && mipLevel < getLevelCount())
{
if (!mLevelSRVs[mipLevel])
{
ID3D11Device *device = mRenderer->getDevice();
HRESULT result;
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
srvDesc.Format = mShaderResourceFormat;
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
srvDesc.Texture2D.MostDetailedMip = mTopLevel + mipLevel;
srvDesc.Texture2D.MipLevels = 1;
result = device->CreateShaderResourceView(mTexture, &srvDesc, &mLevelSRVs[mipLevel]);
if (result == E_OUTOFMEMORY)
{
return gl::error(GL_OUT_OF_MEMORY, static_cast<ID3D11ShaderResourceView*>(NULL));
}
ASSERT(SUCCEEDED(result));
}
return mLevelSRVs[mipLevel];
}
else
{
return NULL;
}
}
unsigned int TextureStorage11_2D::getTextureLevelDepth(int mipLevel) const
{
return 1;
......@@ -833,48 +827,76 @@ ID3D11ShaderResourceView *TextureStorage11_Cube::getSRV(const gl::SamplerState &
{
bool swizzleRequired = samplerState.swizzleRequired();
bool mipmapping = gl::IsMipmapFiltered(samplerState);
ID3D11ShaderResourceView **resultSRV = &mSRV[swizzleRequired][mipmapping];
if (swizzleRequired)
{
verifySwizzleExists(samplerState.swizzleRed, samplerState.swizzleGreen, samplerState.swizzleBlue, samplerState.swizzleAlpha);
}
if (!(*resultSRV))
if (!mSRV[swizzleRequired][mipmapping])
{
ID3D11Device *device = mRenderer->getDevice();
// 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);
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
srvDesc.Format = (swizzleRequired ? mSwizzleShaderResourceFormat : mShaderResourceFormat);
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);
}
// Unnormalized integer cube maps are not supported by DX11; we emulate them as an array of six 2D textures
if (d3d11::GetComponentType(mTextureFormat) == GL_INT ||
d3d11::GetComponentType(mTextureFormat) == GL_UNSIGNED_INT)
{
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DARRAY;
srvDesc.Texture2DArray.MostDetailedMip = mTopLevel;
srvDesc.Texture2DArray.MipLevels = 1;
srvDesc.Texture2DArray.FirstArraySlice = 0;
srvDesc.Texture2DArray.ArraySize = 6;
}
else
return mSRV[swizzleRequired][mipmapping];
}
ID3D11ShaderResourceView *TextureStorage11_Cube::getSRVLevel(int mipLevel)
{
if (mipLevel >= 0 && mipLevel < getLevelCount())
{
if (!mLevelSRVs[mipLevel])
{
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBE;
srvDesc.TextureCube.MipLevels = mipmapping ? (mMipLevels == 0 ? -1 : mMipLevels) : 1;
srvDesc.TextureCube.MostDetailedMip = mTopLevel;
mLevelSRVs[mipLevel] = createSRV(true, mipLevel, 1, mShaderResourceFormat, mTexture);
}
ID3D11Texture2D *sourceTexture = swizzleRequired ? getSwizzleTexture() : mTexture;
HRESULT result = device->CreateShaderResourceView(sourceTexture, &srvDesc, resultSRV);
return mLevelSRVs[mipLevel];
}
else
{
return NULL;
}
}
ID3D11ShaderResourceView *TextureStorage11_Cube::createSRV(bool arraySRV, int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture)
{
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
srvDesc.Format = format;
if (result == E_OUTOFMEMORY)
{
return gl::error(GL_OUT_OF_MEMORY, static_cast<ID3D11ShaderResourceView*>(NULL));
}
ASSERT(SUCCEEDED(result));
if (arraySRV)
{
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DARRAY;
srvDesc.Texture2DArray.MostDetailedMip = mTopLevel + baseLevel;
srvDesc.Texture2DArray.MipLevels = 1;
srvDesc.Texture2DArray.FirstArraySlice = 0;
srvDesc.Texture2DArray.ArraySize = 6;
}
else
{
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBE;
srvDesc.TextureCube.MipLevels = mipLevels;
srvDesc.TextureCube.MostDetailedMip = mTopLevel + baseLevel;
}
return *resultSRV;
ID3D11ShaderResourceView *SRV = NULL;
ID3D11Device *device = mRenderer->getDevice();
HRESULT result = device->CreateShaderResourceView(texture, &srvDesc, &SRV);
if (result == E_OUTOFMEMORY)
{
gl::error(GL_OUT_OF_MEMORY);
}
ASSERT(SUCCEEDED(result));
return SRV;
}
void TextureStorage11_Cube::generateMipmap(int faceIndex, int level)
......@@ -956,40 +978,6 @@ ID3D11RenderTargetView *TextureStorage11_Cube::getSwizzleRenderTarget(int mipLev
}
}
ID3D11ShaderResourceView *TextureStorage11_Cube::getSRVLevel(int mipLevel)
{
if (mipLevel >= 0 && mipLevel < getLevelCount())
{
if (!mLevelSRVs[mipLevel])
{
ID3D11Device *device = mRenderer->getDevice();
HRESULT result;
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
srvDesc.Format = mShaderResourceFormat;
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DARRAY;
srvDesc.Texture2DArray.MostDetailedMip = mTopLevel + mipLevel;
srvDesc.Texture2DArray.MipLevels = 1;
srvDesc.Texture2DArray.FirstArraySlice = 0;
srvDesc.Texture2DArray.ArraySize = 6;
result = device->CreateShaderResourceView(mTexture, &srvDesc, &mLevelSRVs[mipLevel]);
if (result == E_OUTOFMEMORY)
{
return gl::error(GL_OUT_OF_MEMORY, static_cast<ID3D11ShaderResourceView*>(NULL));
}
ASSERT(SUCCEEDED(result));
}
return mLevelSRVs[mipLevel];
}
else
{
return NULL;
}
}
unsigned int TextureStorage11_Cube::getTextureLevelDepth(int mipLevel) const
{
return 6;
......@@ -1104,34 +1092,60 @@ ID3D11ShaderResourceView *TextureStorage11_3D::getSRV(const gl::SamplerState &sa
{
bool swizzleRequired = samplerState.swizzleRequired();
bool mipmapping = gl::IsMipmapFiltered(samplerState);
ID3D11ShaderResourceView **resultSRV = &mSRV[swizzleRequired][mipmapping];
if (swizzleRequired)
{
verifySwizzleExists(samplerState.swizzleRed, samplerState.swizzleGreen, samplerState.swizzleBlue, samplerState.swizzleAlpha);
}
if (!(*resultSRV))
if (!mSRV[swizzleRequired][mipmapping])
{
ID3D11Device *device = mRenderer->getDevice();
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
srvDesc.Format = (swizzleRequired ? mSwizzleShaderResourceFormat : mShaderResourceFormat);
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE3D;
srvDesc.Texture3D.MipLevels = mipmapping ? (mMipLevels == 0 ? -1 : mMipLevels) : 1;
srvDesc.Texture3D.MostDetailedMip = mTopLevel;
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);
}
ID3D11Texture3D *sourceTexture = swizzleRequired ? getSwizzleTexture() : mTexture;
HRESULT result = device->CreateShaderResourceView(sourceTexture, &srvDesc, resultSRV);
return mSRV[swizzleRequired][mipmapping];
}
if (result == E_OUTOFMEMORY)
ID3D11ShaderResourceView *TextureStorage11_3D::getSRVLevel(int mipLevel)
{
if (mipLevel >= 0 && mipLevel < getLevelCount())
{
if (!mLevelSRVs[mipLevel])
{
return gl::error(GL_OUT_OF_MEMORY, static_cast<ID3D11ShaderResourceView*>(NULL));
mLevelSRVs[mipLevel] = createSRV(mipLevel, 1, mShaderResourceFormat, mTexture);
}
ASSERT(SUCCEEDED(result));
return mLevelSRVs[mipLevel];
}
else
{
return NULL;
}
}
ID3D11ShaderResourceView *TextureStorage11_3D::createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture)
{
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
srvDesc.Format = format;
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE3D;
srvDesc.Texture3D.MostDetailedMip = baseLevel;
srvDesc.Texture3D.MipLevels = mipLevels;
return *resultSRV;
ID3D11ShaderResourceView *SRV = NULL;
ID3D11Device *device = mRenderer->getDevice();
HRESULT result = device->CreateShaderResourceView(texture, &srvDesc, &SRV);
if (result == E_OUTOFMEMORY)
{
gl::error(GL_OUT_OF_MEMORY);
}
ASSERT(SUCCEEDED(result));
return SRV;
}
RenderTarget *TextureStorage11_3D::getRenderTarget(int mipLevel)
......@@ -1315,38 +1329,6 @@ ID3D11RenderTargetView *TextureStorage11_3D::getSwizzleRenderTarget(int mipLevel
}
}
ID3D11ShaderResourceView *TextureStorage11_3D::getSRVLevel(int mipLevel)
{
if (mipLevel >= 0 && mipLevel < getLevelCount())
{
if (!mLevelSRVs[mipLevel])
{
ID3D11Device *device = mRenderer->getDevice();
HRESULT result;
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
srvDesc.Format = mShaderResourceFormat;
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE3D;
srvDesc.Texture3D.MostDetailedMip = mTopLevel + mipLevel;
srvDesc.Texture3D.MipLevels = 1;
result = device->CreateShaderResourceView(mTexture, &srvDesc, &mLevelSRVs[mipLevel]);
if (result == E_OUTOFMEMORY)
{
return gl::error(GL_OUT_OF_MEMORY, static_cast<ID3D11ShaderResourceView*>(NULL));
}
ASSERT(SUCCEEDED(result));
}
return mLevelSRVs[mipLevel];
}
else
{
return NULL;
}
}
unsigned int TextureStorage11_3D::getTextureLevelDepth(int mipLevel) const
{
return std::max(mTextureDepth >> mipLevel, 1U);
......@@ -1462,36 +1444,62 @@ ID3D11ShaderResourceView *TextureStorage11_2DArray::getSRV(const gl::SamplerStat
{
bool swizzleRequired = samplerState.swizzleRequired();
bool mipmapping = gl::IsMipmapFiltered(samplerState);
ID3D11ShaderResourceView **resultSRV = &mSRV[swizzleRequired][mipmapping];
if (swizzleRequired)
{
verifySwizzleExists(samplerState.swizzleRed, samplerState.swizzleGreen, samplerState.swizzleBlue, samplerState.swizzleAlpha);
}
if (!(*resultSRV))
if (!mSRV[swizzleRequired][mipmapping])
{
ID3D11Device *device = mRenderer->getDevice();
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
srvDesc.Format = (swizzleRequired ? mSwizzleShaderResourceFormat : mShaderResourceFormat);
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DARRAY;
srvDesc.Texture2DArray.MostDetailedMip = mTopLevel;
srvDesc.Texture2DArray.MipLevels = mipmapping ? (mMipLevels == 0 ? -1 : mMipLevels) : 1;
srvDesc.Texture2DArray.FirstArraySlice = 0;
srvDesc.Texture2DArray.ArraySize = mTextureDepth;
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);
}
ID3D11Texture2D *sourceTexture = swizzleRequired ? getSwizzleTexture() : mTexture;
HRESULT result = device->CreateShaderResourceView(sourceTexture, &srvDesc, resultSRV);
return mSRV[swizzleRequired][mipmapping];
}
if (result == E_OUTOFMEMORY)
ID3D11ShaderResourceView *TextureStorage11_2DArray::getSRVLevel(int mipLevel)
{
if (mipLevel >= 0 && mipLevel < getLevelCount())
{
if (!mLevelSRVs[mipLevel])
{
return gl::error(GL_OUT_OF_MEMORY, static_cast<ID3D11ShaderResourceView*>(NULL));
mLevelSRVs[mipLevel] = createSRV(mipLevel, 1, mShaderResourceFormat, mTexture);
}
ASSERT(SUCCEEDED(result));
return mLevelSRVs[mipLevel];
}
else
{
return NULL;
}
}
ID3D11ShaderResourceView *TextureStorage11_2DArray::createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture)
{
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
srvDesc.Format = format;
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DARRAY;
srvDesc.Texture2DArray.MostDetailedMip = mTopLevel + baseLevel;
srvDesc.Texture2DArray.MipLevels = mipLevels;
srvDesc.Texture2DArray.FirstArraySlice = 0;
srvDesc.Texture2DArray.ArraySize = mTextureDepth;
ID3D11ShaderResourceView *SRV = NULL;
return *resultSRV;
ID3D11Device *device = mRenderer->getDevice();
HRESULT result = device->CreateShaderResourceView(texture, &srvDesc, &SRV);
if (result == E_OUTOFMEMORY)
{
gl::error(GL_OUT_OF_MEMORY);
}
ASSERT(SUCCEEDED(result));
return SRV;
}
RenderTarget *TextureStorage11_2DArray::getRenderTargetLayer(int mipLevel, int layer)
......@@ -1642,40 +1650,6 @@ ID3D11RenderTargetView *TextureStorage11_2DArray::getSwizzleRenderTarget(int mip
}
}
ID3D11ShaderResourceView *TextureStorage11_2DArray::getSRVLevel(int mipLevel)
{
if (mipLevel >= 0 && mipLevel < getLevelCount())
{
if (!mLevelSRVs[mipLevel])
{
ID3D11Device *device = mRenderer->getDevice();
HRESULT result;
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
srvDesc.Format = mShaderResourceFormat;
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DARRAY;
srvDesc.Texture2DArray.MostDetailedMip = mTopLevel + mipLevel;
srvDesc.Texture2DArray.MipLevels = 1;
srvDesc.Texture2DArray.FirstArraySlice = 0;
srvDesc.Texture2DArray.ArraySize = mTextureDepth;
result = device->CreateShaderResourceView(mTexture, &srvDesc, &mLevelSRVs[mipLevel]);
if (result == E_OUTOFMEMORY)
{
return gl::error(GL_OUT_OF_MEMORY, static_cast<ID3D11ShaderResourceView*>(NULL));
}
ASSERT(SUCCEEDED(result));
}
return mLevelSRVs[mipLevel];
}
else
{
return NULL;
}
}
unsigned int TextureStorage11_2DArray::getTextureLevelDepth(int mipLevel) const
{
return mTextureDepth;
......
......@@ -131,6 +131,8 @@ class TextureStorage11_2D : public TextureStorage11
private:
DISALLOW_COPY_AND_ASSIGN(TextureStorage11_2D);
ID3D11ShaderResourceView *createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture);
ID3D11Texture2D *mTexture;
RenderTarget11 *mRenderTarget[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
......@@ -166,6 +168,8 @@ class TextureStorage11_Cube : public TextureStorage11
private:
DISALLOW_COPY_AND_ASSIGN(TextureStorage11_Cube);
ID3D11ShaderResourceView *createSRV(bool arraySRV, int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture);
ID3D11Texture2D *mTexture;
RenderTarget11 *mRenderTarget[6][gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
......@@ -203,6 +207,8 @@ class TextureStorage11_3D : public TextureStorage11
private:
DISALLOW_COPY_AND_ASSIGN(TextureStorage11_3D);
ID3D11ShaderResourceView *createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture);
typedef std::pair<int, int> LevelLayerKey;
typedef std::map<LevelLayerKey, RenderTarget11*> RenderTargetMap;
RenderTargetMap mLevelLayerRenderTargets;
......@@ -243,6 +249,8 @@ class TextureStorage11_2DArray : public TextureStorage11
private:
DISALLOW_COPY_AND_ASSIGN(TextureStorage11_2DArray);
ID3D11ShaderResourceView *createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture);
typedef std::pair<int, int> LevelLayerKey;
typedef std::map<LevelLayerKey, RenderTarget11*> RenderTargetMap;
RenderTargetMap mRenderTargets;
......
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