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