Commit 5dce5e29 by Geoff Lang

Updated TextureStorage11 to use Error objects for D3D11 object creation.

BUG=angle:520 Change-Id: I2b4d3d2be99d4185ff1ff1c6521fbd66a1e771ae Reviewed-on: https://chromium-review.googlesource.com/217337Reviewed-by: 's avatarBrandon Jones <bajones@chromium.org> Reviewed-by: 's avatarShannon Woods <shannonwoods@chromium.org> Tested-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent edbeae5f
......@@ -541,7 +541,11 @@ gl::Error Renderer11::setTexture(gl::SamplerType type, int index, gl::Texture *t
TextureStorage11 *storage11 = TextureStorage11::makeTextureStorage11(texStorage);
gl::SamplerState samplerState;
texture->getSamplerStateWithNativeOffset(&samplerState);
textureSRV = storage11->getSRV(samplerState);
gl::Error error = storage11->getSRV(samplerState, &textureSRV);
if (error.isError())
{
return error;
}
// If we get NULL back from getSRV here, something went wrong in the texture class and we're unexpectedly
// missing the shader resource view
......
......@@ -172,7 +172,7 @@ UINT TextureStorage11::getSubresourceIndex(const gl::ImageIndex &index) const
return subresource;
}
ID3D11ShaderResourceView *TextureStorage11::getSRV(const gl::SamplerState &samplerState)
gl::Error TextureStorage11::getSRV(const gl::SamplerState &samplerState, ID3D11ShaderResourceView **outSRV)
{
bool swizzleRequired = samplerState.swizzleRequired();
bool mipmapping = gl::IsMipmapFiltered(samplerState);
......@@ -190,35 +190,55 @@ ID3D11ShaderResourceView *TextureStorage11::getSRV(const gl::SamplerState &sampl
SRVCache::const_iterator iter = mSrvCache.find(key);
if (iter != mSrvCache.end())
{
return iter->second;
*outSRV = iter->second;
}
else
{
ID3D11Resource *texture = NULL;
if (swizzleRequired)
{
gl::Error error = getSwizzleTexture(&texture);
if (error.isError())
{
return error;
}
}
else
{
texture = getResource();
}
ID3D11ShaderResourceView *srv = NULL;
DXGI_FORMAT format = (swizzleRequired ? mSwizzleShaderResourceFormat : mShaderResourceFormat);
ID3D11Resource *texture = swizzleRequired ? getSwizzleTexture() : getResource();
gl::Error error = createSRV(samplerState.baseLevel, mipLevels, format, texture, &srv);
if (error.isError())
{
return error;
}
ID3D11ShaderResourceView *srv = createSRV(samplerState.baseLevel, mipLevels, format, texture);
mSrvCache.insert(std::make_pair(key, srv));
return srv;
*outSRV = srv;
}
return gl::Error(GL_NO_ERROR);
}
ID3D11ShaderResourceView *TextureStorage11::getSRVLevel(int mipLevel)
gl::Error TextureStorage11::getSRVLevel(int mipLevel, ID3D11ShaderResourceView **outSRV)
{
if (mipLevel >= 0 && mipLevel < getLevelCount())
ASSERT(mipLevel >= 0 && mipLevel < getLevelCount());
if (!mLevelSRVs[mipLevel])
{
if (!mLevelSRVs[mipLevel])
gl::Error error = createSRV(mipLevel, 1, mShaderResourceFormat, getResource(), &mLevelSRVs[mipLevel]);
if (error.isError())
{
mLevelSRVs[mipLevel] = createSRV(mipLevel, 1, mShaderResourceFormat, getResource());
return error;
}
return mLevelSRVs[mipLevel];
}
else
{
return NULL;
}
*outSRV = mLevelSRVs[mipLevel];
return gl::Error(GL_NO_ERROR);
}
gl::Error TextureStorage11::generateSwizzles(GLenum swizzleRed, GLenum swizzleGreen, GLenum swizzleBlue, GLenum swizzleAlpha)
......@@ -230,14 +250,25 @@ gl::Error TextureStorage11::generateSwizzles(GLenum swizzleRed, GLenum swizzleGr
if (mSwizzleCache[level] != swizzleTarget)
{
// Need to re-render the swizzle for this level
ID3D11ShaderResourceView *sourceSRV = getSRVLevel(level);
ID3D11RenderTargetView *destRTV = getSwizzleRenderTarget(level);
ID3D11ShaderResourceView *sourceSRV = NULL;
gl::Error error = getSRVLevel(level, &sourceSRV);
if (error.isError())
{
return error;
}
ID3D11RenderTargetView *destRTV = NULL;
error = getSwizzleRenderTarget(level, &destRTV);
if (error.isError())
{
return error;
}
gl::Extents size(getLevelWidth(level), getLevelHeight(level), getLevelDepth(level));
Blit11 *blitter = mRenderer->getBlitter();
gl::Error error = blitter->swizzleTexture(sourceSRV, destRTV, size, swizzleRed, swizzleGreen, swizzleBlue, swizzleAlpha);
error = blitter->swizzleTexture(sourceSRV, destRTV, size, swizzleRed, swizzleGreen, swizzleBlue, swizzleAlpha);
if (error.isError())
{
return error;
......@@ -689,8 +720,8 @@ RenderTarget *TextureStorage11_2D::getRenderTarget(const gl::ImageIndex &index)
{
if (!mRenderTarget[level])
{
ID3D11ShaderResourceView *srv = getSRVLevel(level);
if (!srv)
ID3D11ShaderResourceView *srv = NULL;
if (getSRVLevel(level, &srv).isError())
{
return NULL;
}
......@@ -757,30 +788,33 @@ RenderTarget *TextureStorage11_2D::getRenderTarget(const gl::ImageIndex &index)
}
}
ID3D11ShaderResourceView *TextureStorage11_2D::createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture)
gl::Error TextureStorage11_2D::createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture,
ID3D11ShaderResourceView **outSRV) const
{
ASSERT(outSRV);
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);
HRESULT result = device->CreateShaderResourceView(texture, &srvDesc, outSRV);
if (result == E_OUTOFMEMORY)
ASSERT(result == E_OUTOFMEMORY || SUCCEEDED(result));
if (FAILED(result))
{
gl::error(GL_OUT_OF_MEMORY);
return gl::Error(GL_OUT_OF_MEMORY, "Failed to create internal texture storage SRV, result: 0x%X.", result);
}
ASSERT(SUCCEEDED(result));
return SRV;
return gl::Error(GL_NO_ERROR);
}
ID3D11Resource *TextureStorage11_2D::getSwizzleTexture()
gl::Error TextureStorage11_2D::getSwizzleTexture(ID3D11Resource **outTexture)
{
ASSERT(outTexture);
if (!mSwizzleTexture)
{
ID3D11Device *device = mRenderer->getDevice();
......@@ -800,49 +834,49 @@ ID3D11Resource *TextureStorage11_2D::getSwizzleTexture()
HRESULT result = device->CreateTexture2D(&desc, NULL, &mSwizzleTexture);
if (result == E_OUTOFMEMORY)
ASSERT(result == E_OUTOFMEMORY || SUCCEEDED(result));
if (FAILED(result))
{
return gl::error(GL_OUT_OF_MEMORY, static_cast<ID3D11Texture2D*>(NULL));
return gl::Error(GL_OUT_OF_MEMORY, "Failed to create internal swizzle texture, result: 0x%X.", result);
}
ASSERT(SUCCEEDED(result));
}
return mSwizzleTexture;
*outTexture = mSwizzleTexture;
return gl::Error(GL_NO_ERROR);
}
ID3D11RenderTargetView *TextureStorage11_2D::getSwizzleRenderTarget(int mipLevel)
gl::Error TextureStorage11_2D::getSwizzleRenderTarget(int mipLevel, ID3D11RenderTargetView **outRTV)
{
if (mipLevel >= 0 && mipLevel < getLevelCount())
ASSERT(mipLevel >= 0 && mipLevel < getLevelCount());
ASSERT(outRTV);
if (!mSwizzleRenderTargets[mipLevel])
{
if (!mSwizzleRenderTargets[mipLevel])
ID3D11Resource *swizzleTexture = NULL;
gl::Error error = getSwizzleTexture(&swizzleTexture);
if (error.isError())
{
ID3D11Resource *swizzleTexture = getSwizzleTexture();
if (!swizzleTexture)
{
return NULL;
}
return error;
}
ID3D11Device *device = mRenderer->getDevice();
ID3D11Device *device = mRenderer->getDevice();
D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
rtvDesc.Format = mSwizzleRenderTargetFormat;
rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
rtvDesc.Texture2D.MipSlice = mTopLevel + mipLevel;
D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
rtvDesc.Format = mSwizzleRenderTargetFormat;
rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
rtvDesc.Texture2D.MipSlice = mTopLevel + mipLevel;
HRESULT result = device->CreateRenderTargetView(mSwizzleTexture, &rtvDesc, &mSwizzleRenderTargets[mipLevel]);
if (result == E_OUTOFMEMORY)
{
return gl::error(GL_OUT_OF_MEMORY, static_cast<ID3D11RenderTargetView*>(NULL));
}
ASSERT(SUCCEEDED(result));
}
HRESULT result = device->CreateRenderTargetView(mSwizzleTexture, &rtvDesc, &mSwizzleRenderTargets[mipLevel]);
return mSwizzleRenderTargets[mipLevel];
}
else
{
return NULL;
ASSERT(result == E_OUTOFMEMORY || SUCCEEDED(result));
if (FAILED(result))
{
return gl::Error(GL_OUT_OF_MEMORY, "Failed to create internal swizzle render target view, result: 0x%X.", result);
}
}
*outRTV = mSwizzleRenderTargets[mipLevel];
return gl::Error(GL_NO_ERROR);
}
TextureStorage11_Cube::TextureStorage11_Cube(Renderer *renderer, GLenum internalformat, bool renderTarget, int size, int levels)
......@@ -1149,8 +1183,11 @@ RenderTarget *TextureStorage11_Cube::getRenderTarget(const gl::ImageIndex &index
}
}
ID3D11ShaderResourceView *TextureStorage11_Cube::createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture)
gl::Error TextureStorage11_Cube::createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture,
ID3D11ShaderResourceView **outSRV) const
{
ASSERT(outSRV);
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
srvDesc.Format = format;
......@@ -1171,22 +1208,22 @@ ID3D11ShaderResourceView *TextureStorage11_Cube::createSRV(int baseLevel, int mi
srvDesc.TextureCube.MostDetailedMip = mTopLevel + baseLevel;
}
ID3D11ShaderResourceView *SRV = NULL;
ID3D11Device *device = mRenderer->getDevice();
HRESULT result = device->CreateShaderResourceView(texture, &srvDesc, &SRV);
HRESULT result = device->CreateShaderResourceView(texture, &srvDesc, outSRV);
if (result == E_OUTOFMEMORY)
ASSERT(result == E_OUTOFMEMORY || SUCCEEDED(result));
if (FAILED(result))
{
gl::error(GL_OUT_OF_MEMORY);
return gl::Error(GL_OUT_OF_MEMORY, "Failed to create internal texture storage SRV, result: 0x%X.", result);
}
ASSERT(SUCCEEDED(result));
return SRV;
return gl::Error(GL_NO_ERROR);
}
ID3D11Resource *TextureStorage11_Cube::getSwizzleTexture()
gl::Error TextureStorage11_Cube::getSwizzleTexture(ID3D11Resource **outTexture)
{
ASSERT(outTexture);
if (!mSwizzleTexture)
{
ID3D11Device *device = mRenderer->getDevice();
......@@ -1206,52 +1243,51 @@ ID3D11Resource *TextureStorage11_Cube::getSwizzleTexture()
HRESULT result = device->CreateTexture2D(&desc, NULL, &mSwizzleTexture);
if (result == E_OUTOFMEMORY)
ASSERT(result == E_OUTOFMEMORY || SUCCEEDED(result));
if (FAILED(result))
{
return gl::error(GL_OUT_OF_MEMORY, static_cast<ID3D11Texture2D*>(NULL));
return gl::Error(GL_OUT_OF_MEMORY, "Failed to create internal swizzle texture, result: 0x%X.", result);
}
ASSERT(SUCCEEDED(result));
}
return mSwizzleTexture;
*outTexture = mSwizzleTexture;
return gl::Error(GL_NO_ERROR);
}
ID3D11RenderTargetView *TextureStorage11_Cube::getSwizzleRenderTarget(int mipLevel)
gl::Error TextureStorage11_Cube::getSwizzleRenderTarget(int mipLevel, ID3D11RenderTargetView **outRTV)
{
if (mipLevel >= 0 && mipLevel < getLevelCount())
ASSERT(mipLevel >= 0 && mipLevel < getLevelCount());
ASSERT(outRTV);
if (!mSwizzleRenderTargets[mipLevel])
{
if (!mSwizzleRenderTargets[mipLevel])
ID3D11Resource *swizzleTexture = NULL;
gl::Error error = getSwizzleTexture(&swizzleTexture);
if (error.isError())
{
ID3D11Resource *swizzleTexture = getSwizzleTexture();
if (!swizzleTexture)
{
return NULL;
}
return error;
}
ID3D11Device *device = mRenderer->getDevice();
ID3D11Device *device = mRenderer->getDevice();
D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
rtvDesc.Format = mSwizzleRenderTargetFormat;
rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY;
rtvDesc.Texture2DArray.MipSlice = mTopLevel + mipLevel;
rtvDesc.Texture2DArray.FirstArraySlice = 0;
rtvDesc.Texture2DArray.ArraySize = 6;
D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
rtvDesc.Format = mSwizzleRenderTargetFormat;
rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY;
rtvDesc.Texture2DArray.MipSlice = mTopLevel + mipLevel;
rtvDesc.Texture2DArray.FirstArraySlice = 0;
rtvDesc.Texture2DArray.ArraySize = 6;
HRESULT result = device->CreateRenderTargetView(mSwizzleTexture, &rtvDesc, &mSwizzleRenderTargets[mipLevel]);
HRESULT result = device->CreateRenderTargetView(mSwizzleTexture, &rtvDesc, &mSwizzleRenderTargets[mipLevel]);
if (result == E_OUTOFMEMORY)
{
return gl::error(GL_OUT_OF_MEMORY, static_cast<ID3D11RenderTargetView*>(NULL));
}
ASSERT(SUCCEEDED(result));
ASSERT(result == E_OUTOFMEMORY || SUCCEEDED(result));
if (FAILED(result))
{
return gl::Error(GL_OUT_OF_MEMORY, "Failed to create internal swizzle render target view, result: 0x%X.", result);
}
return mSwizzleRenderTargets[mipLevel];
}
else
{
return NULL;
}
*outRTV = mSwizzleRenderTargets[mipLevel];
return gl::Error(GL_NO_ERROR);
}
TextureStorage11_3D::TextureStorage11_3D(Renderer *renderer, GLenum internalformat, bool renderTarget,
......@@ -1445,26 +1481,27 @@ ID3D11Resource *TextureStorage11_3D::getResource() const
return mTexture;
}
ID3D11ShaderResourceView *TextureStorage11_3D::createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture)
gl::Error TextureStorage11_3D::createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture,
ID3D11ShaderResourceView **outSRV) const
{
ASSERT(outSRV);
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
srvDesc.Format = format;
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE3D;
srvDesc.Texture3D.MostDetailedMip = baseLevel;
srvDesc.Texture3D.MipLevels = mipLevels;
ID3D11ShaderResourceView *SRV = NULL;
ID3D11Device *device = mRenderer->getDevice();
HRESULT result = device->CreateShaderResourceView(texture, &srvDesc, &SRV);
HRESULT result = device->CreateShaderResourceView(texture, &srvDesc, outSRV);
if (result == E_OUTOFMEMORY)
ASSERT(result == E_OUTOFMEMORY || SUCCEEDED(result));
if (FAILED(result))
{
gl::error(GL_OUT_OF_MEMORY);
return gl::Error(GL_OUT_OF_MEMORY, "Failed to create internal texture storage SRV, result: 0x%X.", result);
}
ASSERT(SUCCEEDED(result));
return SRV;
return gl::Error(GL_NO_ERROR);
}
RenderTarget *TextureStorage11_3D::getRenderTarget(const gl::ImageIndex &index)
......@@ -1479,8 +1516,8 @@ RenderTarget *TextureStorage11_3D::getRenderTarget(const gl::ImageIndex &index)
{
if (!mLevelRenderTargets[mipLevel])
{
ID3D11ShaderResourceView *srv = getSRVLevel(mipLevel);
if (!srv)
ID3D11ShaderResourceView *srv = NULL;
if (getSRVLevel(mipLevel, &srv).isError())
{
return NULL;
}
......@@ -1556,8 +1593,10 @@ RenderTarget *TextureStorage11_3D::getRenderTarget(const gl::ImageIndex &index)
return NULL;
}
ID3D11Resource *TextureStorage11_3D::getSwizzleTexture()
gl::Error TextureStorage11_3D::getSwizzleTexture(ID3D11Resource **outTexture)
{
ASSERT(outTexture);
if (!mSwizzleTexture)
{
ID3D11Device *device = mRenderer->getDevice();
......@@ -1575,52 +1614,51 @@ ID3D11Resource *TextureStorage11_3D::getSwizzleTexture()
HRESULT result = device->CreateTexture3D(&desc, NULL, &mSwizzleTexture);
if (result == E_OUTOFMEMORY)
ASSERT(result == E_OUTOFMEMORY || SUCCEEDED(result));
if (FAILED(result))
{
return gl::error(GL_OUT_OF_MEMORY, static_cast<ID3D11Texture3D*>(NULL));
return gl::Error(GL_OUT_OF_MEMORY, "Failed to create internal swizzle texture, result: 0x%X.", result);
}
ASSERT(SUCCEEDED(result));
}
return mSwizzleTexture;
*outTexture = mSwizzleTexture;
return gl::Error(GL_NO_ERROR);
}
ID3D11RenderTargetView *TextureStorage11_3D::getSwizzleRenderTarget(int mipLevel)
gl::Error TextureStorage11_3D::getSwizzleRenderTarget(int mipLevel, ID3D11RenderTargetView **outRTV)
{
if (mipLevel >= 0 && mipLevel < getLevelCount())
ASSERT(mipLevel >= 0 && mipLevel < getLevelCount());
ASSERT(outRTV);
if (!mSwizzleRenderTargets[mipLevel])
{
if (!mSwizzleRenderTargets[mipLevel])
ID3D11Resource *swizzleTexture = NULL;
gl::Error error = getSwizzleTexture(&swizzleTexture);
if (error.isError())
{
ID3D11Resource *swizzleTexture = getSwizzleTexture();
if (!swizzleTexture)
{
return NULL;
}
return error;
}
ID3D11Device *device = mRenderer->getDevice();
ID3D11Device *device = mRenderer->getDevice();
D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
rtvDesc.Format = mSwizzleRenderTargetFormat;
rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE3D;
rtvDesc.Texture3D.MipSlice = mTopLevel + mipLevel;
rtvDesc.Texture3D.FirstWSlice = 0;
rtvDesc.Texture3D.WSize = -1;
D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
rtvDesc.Format = mSwizzleRenderTargetFormat;
rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE3D;
rtvDesc.Texture3D.MipSlice = mTopLevel + mipLevel;
rtvDesc.Texture3D.FirstWSlice = 0;
rtvDesc.Texture3D.WSize = -1;
HRESULT result = device->CreateRenderTargetView(mSwizzleTexture, &rtvDesc, &mSwizzleRenderTargets[mipLevel]);
HRESULT result = device->CreateRenderTargetView(mSwizzleTexture, &rtvDesc, &mSwizzleRenderTargets[mipLevel]);
if (result == E_OUTOFMEMORY)
{
return gl::error(GL_OUT_OF_MEMORY, static_cast<ID3D11RenderTargetView*>(NULL));
}
ASSERT(SUCCEEDED(result));
ASSERT(result == E_OUTOFMEMORY || SUCCEEDED(result));
if (FAILED(result))
{
return gl::Error(GL_OUT_OF_MEMORY, "Failed to create internal swizzle render target view, result: 0x%X.", result);
}
return mSwizzleRenderTargets[mipLevel];
}
else
{
return NULL;
}
*outRTV = mSwizzleRenderTargets[mipLevel];
return gl::Error(GL_NO_ERROR);
}
TextureStorage11_2DArray::TextureStorage11_2DArray(Renderer *renderer, GLenum internalformat, bool renderTarget,
......@@ -1812,7 +1850,8 @@ ID3D11Resource *TextureStorage11_2DArray::getResource() const
return mTexture;
}
ID3D11ShaderResourceView *TextureStorage11_2DArray::createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture)
gl::Error TextureStorage11_2DArray::createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture,
ID3D11ShaderResourceView **outSRV) const
{
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
srvDesc.Format = format;
......@@ -1822,18 +1861,16 @@ ID3D11ShaderResourceView *TextureStorage11_2DArray::createSRV(int baseLevel, int
srvDesc.Texture2DArray.FirstArraySlice = 0;
srvDesc.Texture2DArray.ArraySize = mTextureDepth;
ID3D11ShaderResourceView *SRV = NULL;
ID3D11Device *device = mRenderer->getDevice();
HRESULT result = device->CreateShaderResourceView(texture, &srvDesc, &SRV);
HRESULT result = device->CreateShaderResourceView(texture, &srvDesc, outSRV);
if (result == E_OUTOFMEMORY)
ASSERT(result == E_OUTOFMEMORY || SUCCEEDED(result));
if (FAILED(result))
{
gl::error(GL_OUT_OF_MEMORY);
return gl::Error(GL_OUT_OF_MEMORY, "Failed to create internal texture storage SRV, result: 0x%X.", result);
}
ASSERT(SUCCEEDED(result));
return SRV;
return gl::Error(GL_NO_ERROR);
}
RenderTarget *TextureStorage11_2DArray::getRenderTarget(const gl::ImageIndex &index)
......@@ -1907,7 +1944,7 @@ RenderTarget *TextureStorage11_2DArray::getRenderTarget(const gl::ImageIndex &in
}
}
ID3D11Resource *TextureStorage11_2DArray::getSwizzleTexture()
gl::Error TextureStorage11_2DArray::getSwizzleTexture(ID3D11Resource **outTexture)
{
if (!mSwizzleTexture)
{
......@@ -1928,52 +1965,51 @@ ID3D11Resource *TextureStorage11_2DArray::getSwizzleTexture()
HRESULT result = device->CreateTexture2D(&desc, NULL, &mSwizzleTexture);
if (result == E_OUTOFMEMORY)
ASSERT(result == E_OUTOFMEMORY || SUCCEEDED(result));
if (FAILED(result))
{
return gl::error(GL_OUT_OF_MEMORY, static_cast<ID3D11Texture2D*>(NULL));
return gl::Error(GL_OUT_OF_MEMORY, "Failed to create internal swizzle texture, result: 0x%X.", result);
}
ASSERT(SUCCEEDED(result));
}
return mSwizzleTexture;
*outTexture = mSwizzleTexture;
return gl::Error(GL_NO_ERROR);
}
ID3D11RenderTargetView *TextureStorage11_2DArray::getSwizzleRenderTarget(int mipLevel)
gl::Error TextureStorage11_2DArray::getSwizzleRenderTarget(int mipLevel, ID3D11RenderTargetView **outRTV)
{
if (mipLevel >= 0 && mipLevel < getLevelCount())
ASSERT(mipLevel >= 0 && mipLevel < getLevelCount());
ASSERT(outRTV);
if (!mSwizzleRenderTargets[mipLevel])
{
if (!mSwizzleRenderTargets[mipLevel])
ID3D11Resource *swizzleTexture = NULL;
gl::Error error = getSwizzleTexture(&swizzleTexture);
if (error.isError())
{
ID3D11Resource *swizzleTexture = getSwizzleTexture();
if (!swizzleTexture)
{
return NULL;
}
return error;
}
ID3D11Device *device = mRenderer->getDevice();
ID3D11Device *device = mRenderer->getDevice();
D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
rtvDesc.Format = mSwizzleRenderTargetFormat;
rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY;
rtvDesc.Texture2DArray.MipSlice = mTopLevel + mipLevel;
rtvDesc.Texture2DArray.FirstArraySlice = 0;
rtvDesc.Texture2DArray.ArraySize = mTextureDepth;
D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
rtvDesc.Format = mSwizzleRenderTargetFormat;
rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY;
rtvDesc.Texture2DArray.MipSlice = mTopLevel + mipLevel;
rtvDesc.Texture2DArray.FirstArraySlice = 0;
rtvDesc.Texture2DArray.ArraySize = mTextureDepth;
HRESULT result = device->CreateRenderTargetView(mSwizzleTexture, &rtvDesc, &mSwizzleRenderTargets[mipLevel]);
HRESULT result = device->CreateRenderTargetView(mSwizzleTexture, &rtvDesc, &mSwizzleRenderTargets[mipLevel]);
if (result == E_OUTOFMEMORY)
{
return gl::error(GL_OUT_OF_MEMORY, static_cast<ID3D11RenderTargetView*>(NULL));
}
ASSERT(SUCCEEDED(result));
ASSERT(result == E_OUTOFMEMORY || SUCCEEDED(result));
if (FAILED(result))
{
return gl::Error(GL_OUT_OF_MEMORY, "Failed to create internal swizzle render target view, result: 0x%X.", result);
}
return mSwizzleRenderTargets[mipLevel];
}
else
{
return NULL;
}
*outRTV = mSwizzleRenderTargets[mipLevel];
return gl::Error(GL_NO_ERROR);
}
}
......@@ -42,7 +42,7 @@ class TextureStorage11 : public TextureStorage
UINT getBindFlags() const;
virtual ID3D11Resource *getResource() const = 0;
virtual ID3D11ShaderResourceView *getSRV(const gl::SamplerState &samplerState);
virtual gl::Error getSRV(const gl::SamplerState &samplerState, ID3D11ShaderResourceView **outSRV);
virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index) = 0;
virtual void generateMipmap(const gl::ImageIndex &sourceIndex, const gl::ImageIndex &destIndex);
......@@ -78,11 +78,12 @@ class TextureStorage11 : public TextureStorage
int getLevelHeight(int mipLevel) const;
int getLevelDepth(int mipLevel) const;
virtual ID3D11Resource *getSwizzleTexture() = 0;
virtual ID3D11RenderTargetView *getSwizzleRenderTarget(int mipLevel) = 0;
ID3D11ShaderResourceView *getSRVLevel(int mipLevel);
virtual gl::Error getSwizzleTexture(ID3D11Resource **outTexture) = 0;
virtual gl::Error getSwizzleRenderTarget(int mipLevel, ID3D11RenderTargetView **outRTV) = 0;
gl::Error getSRVLevel(int mipLevel, ID3D11ShaderResourceView **outSRV);
virtual ID3D11ShaderResourceView *createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture) = 0;
virtual gl::Error createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture,
ID3D11ShaderResourceView **outSRV) const = 0;
void verifySwizzleExists(GLenum swizzleRed, GLenum swizzleGreen, GLenum swizzleBlue, GLenum swizzleAlpha);
......@@ -155,13 +156,14 @@ class TextureStorage11_2D : public TextureStorage11
virtual gl::Error releaseAssociatedImage(const gl::ImageIndex &index, Image11* incomingImage);
protected:
virtual ID3D11Resource *getSwizzleTexture();
virtual ID3D11RenderTargetView *getSwizzleRenderTarget(int mipLevel);
virtual gl::Error getSwizzleTexture(ID3D11Resource **outTexture);
virtual gl::Error getSwizzleRenderTarget(int mipLevel, ID3D11RenderTargetView **outRTV);
private:
DISALLOW_COPY_AND_ASSIGN(TextureStorage11_2D);
virtual ID3D11ShaderResourceView *createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture);
virtual gl::Error createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture,
ID3D11ShaderResourceView **outSRV) const;
ID3D11Texture2D *mTexture;
RenderTarget11 *mRenderTarget[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
......@@ -189,13 +191,14 @@ class TextureStorage11_Cube : public TextureStorage11
virtual gl::Error releaseAssociatedImage(const gl::ImageIndex &index, Image11* incomingImage);
protected:
virtual ID3D11Resource *getSwizzleTexture();
virtual ID3D11RenderTargetView *getSwizzleRenderTarget(int mipLevel);
virtual gl::Error getSwizzleTexture(ID3D11Resource **outTexture);
virtual gl::Error getSwizzleRenderTarget(int mipLevel, ID3D11RenderTargetView **outRTV);
private:
DISALLOW_COPY_AND_ASSIGN(TextureStorage11_Cube);
virtual ID3D11ShaderResourceView *createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture);
virtual gl::Error createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture,
ID3D11ShaderResourceView **outSRV) const;
ID3D11Texture2D *mTexture;
RenderTarget11 *mRenderTarget[6][gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
......@@ -226,13 +229,14 @@ class TextureStorage11_3D : public TextureStorage11
virtual gl::Error releaseAssociatedImage(const gl::ImageIndex &index, Image11* incomingImage);
protected:
virtual ID3D11Resource *getSwizzleTexture();
virtual ID3D11RenderTargetView *getSwizzleRenderTarget(int mipLevel);
virtual gl::Error getSwizzleTexture(ID3D11Resource **outTexture);
virtual gl::Error getSwizzleRenderTarget(int mipLevel, ID3D11RenderTargetView **outRTV);
private:
DISALLOW_COPY_AND_ASSIGN(TextureStorage11_3D);
virtual ID3D11ShaderResourceView *createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture);
virtual gl::Error createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture,
ID3D11ShaderResourceView **outSRV) const;
typedef std::pair<int, int> LevelLayerKey;
typedef std::map<LevelLayerKey, RenderTarget11*> RenderTargetMap;
......@@ -265,13 +269,14 @@ class TextureStorage11_2DArray : public TextureStorage11
virtual gl::Error releaseAssociatedImage(const gl::ImageIndex &index, Image11* incomingImage);
protected:
virtual ID3D11Resource *getSwizzleTexture();
virtual ID3D11RenderTargetView *getSwizzleRenderTarget(int mipLevel);
virtual gl::Error getSwizzleTexture(ID3D11Resource **outTexture);
virtual gl::Error getSwizzleRenderTarget(int mipLevel, ID3D11RenderTargetView **outRTV);
private:
DISALLOW_COPY_AND_ASSIGN(TextureStorage11_2DArray);
virtual ID3D11ShaderResourceView *createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture);
virtual gl::Error createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture,
ID3D11ShaderResourceView **outSRV) const;
typedef std::pair<int, int> LevelLayerKey;
typedef std::map<LevelLayerKey, RenderTarget11*> RenderTargetMap;
......
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