Commit 17b10a9a by Jamie Madill Committed by Commit Bot

D3D11: Store more format info by-reference.

This CL stores the d3d11::TextureFormat by reference in the texture storage. Adding the internalFormat to the TextureFormat allows us to store a single ref instead of three per TextureStorage11. Also store the format sets in a d3d11::TextureFormat by-ref instead of by-pointer, making the code a bit cleaner. BUG=angleproject:1455 Change-Id: I3c0e966d948c694435577d7d45dc0cd156480cdb Reviewed-on: https://chromium-review.googlesource.com/365412Reviewed-by: 's avatarOlli Etuaho <oetuaho@nvidia.com> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>
parent 3416ff3e
...@@ -44,8 +44,8 @@ class SwapChainD3D : angle::NonCopyable ...@@ -44,8 +44,8 @@ class SwapChainD3D : angle::NonCopyable
virtual RenderTargetD3D *getColorRenderTarget() = 0; virtual RenderTargetD3D *getColorRenderTarget() = 0;
virtual RenderTargetD3D *getDepthStencilRenderTarget() = 0; virtual RenderTargetD3D *getDepthStencilRenderTarget() = 0;
GLenum GetRenderTargetInternalFormat() const { return mOffscreenRenderTargetFormat; } GLenum getRenderTargetInternalFormat() const { return mOffscreenRenderTargetFormat; }
GLenum GetDepthBufferInternalFormat() const { return mDepthBufferFormat; } GLenum getDepthBufferInternalFormat() const { return mDepthBufferFormat; }
HANDLE getShareHandle() { return mShareHandle; } HANDLE getShareHandle() { return mShareHandle; }
virtual void *getKeyedMutex() = 0; virtual void *getKeyedMutex() = 0;
......
...@@ -68,7 +68,7 @@ gl::Error Image11::generateMipmap(Image11 *dest, ...@@ -68,7 +68,7 @@ gl::Error Image11::generateMipmap(Image11 *dest,
uint8_t *destData = reinterpret_cast<uint8_t*>(destMapped.pData); uint8_t *destData = reinterpret_cast<uint8_t*>(destMapped.pData);
auto mipGenerationFunction = d3d11::GetTextureFormatInfo(src->getInternalFormat(), rendererCaps) auto mipGenerationFunction = d3d11::GetTextureFormatInfo(src->getInternalFormat(), rendererCaps)
.formatSet->mipGenerationFunction; .formatSet.mipGenerationFunction;
mipGenerationFunction(src->getWidth(), src->getHeight(), src->getDepth(), sourceData, mipGenerationFunction(src->getWidth(), src->getHeight(), src->getDepth(), sourceData,
srcMapped.RowPitch, srcMapped.DepthPitch, destData, destMapped.RowPitch, srcMapped.RowPitch, srcMapped.DepthPitch, destData, destMapped.RowPitch,
destMapped.DepthPitch); destMapped.DepthPitch);
...@@ -222,8 +222,8 @@ bool Image11::redefine(GLenum target, GLenum internalformat, const gl::Extents & ...@@ -222,8 +222,8 @@ bool Image11::redefine(GLenum target, GLenum internalformat, const gl::Extents &
// compute the d3d format that will be used // compute the d3d format that will be used
const d3d11::TextureFormat &formatInfo = const d3d11::TextureFormat &formatInfo =
d3d11::GetTextureFormatInfo(internalformat, mRenderer->getRenderer11DeviceCaps()); d3d11::GetTextureFormatInfo(internalformat, mRenderer->getRenderer11DeviceCaps());
mDXGIFormat = formatInfo.formatSet->texFormat; mDXGIFormat = formatInfo.formatSet.texFormat;
mRenderable = (formatInfo.formatSet->rtvFormat != DXGI_FORMAT_UNKNOWN); mRenderable = (formatInfo.formatSet.rtvFormat != DXGI_FORMAT_UNKNOWN);
releaseStagingTexture(); releaseStagingTexture();
mDirty = (formatInfo.dataInitializerFunction != NULL); mDirty = (formatInfo.dataInitializerFunction != NULL);
...@@ -360,7 +360,7 @@ gl::Error Image11::copyFromFramebuffer(const gl::Offset &destOffset, ...@@ -360,7 +360,7 @@ gl::Error Image11::copyFromFramebuffer(const gl::Offset &destOffset,
const auto &d3d11Format = const auto &d3d11Format =
d3d11::GetTextureFormatInfo(sourceInternalFormat, mRenderer->getRenderer11DeviceCaps()); d3d11::GetTextureFormatInfo(sourceInternalFormat, mRenderer->getRenderer11DeviceCaps());
if (d3d11Format.formatSet->texFormat == mDXGIFormat && sourceInternalFormat == mInternalFormat) if (d3d11Format.formatSet.texFormat == mDXGIFormat && sourceInternalFormat == mInternalFormat)
{ {
RenderTargetD3D *renderTarget = nullptr; RenderTargetD3D *renderTarget = nullptr;
gl::Error error = srcAttachment->getRenderTarget(&renderTarget); gl::Error error = srcAttachment->getRenderTarget(&renderTarget);
......
...@@ -197,7 +197,7 @@ gl::Error PixelTransfer11::copyBufferToTexture(const gl::PixelUnpackState &unpac ...@@ -197,7 +197,7 @@ gl::Error PixelTransfer11::copyBufferToTexture(const gl::PixelUnpackState &unpac
GLenum sourceFormat = gl::GetSizedInternalFormat(unsizedFormat, sourcePixelsType); GLenum sourceFormat = gl::GetSizedInternalFormat(unsizedFormat, sourcePixelsType);
const d3d11::TextureFormat &sourceFormatInfo = d3d11::GetTextureFormatInfo(sourceFormat, mRenderer->getRenderer11DeviceCaps()); const d3d11::TextureFormat &sourceFormatInfo = d3d11::GetTextureFormatInfo(sourceFormat, mRenderer->getRenderer11DeviceCaps());
DXGI_FORMAT srvFormat = sourceFormatInfo.formatSet->srvFormat; DXGI_FORMAT srvFormat = sourceFormatInfo.formatSet.srvFormat;
ASSERT(srvFormat != DXGI_FORMAT_UNKNOWN); ASSERT(srvFormat != DXGI_FORMAT_UNKNOWN);
Buffer11 *bufferStorage11 = GetAs<Buffer11>(sourceBuffer.getImplementation()); Buffer11 *bufferStorage11 = GetAs<Buffer11>(sourceBuffer.getImplementation());
ID3D11ShaderResourceView *bufferSRV = nullptr; ID3D11ShaderResourceView *bufferSRV = nullptr;
......
...@@ -182,17 +182,17 @@ unsigned int GetDSVSubresourceIndex(ID3D11Resource *resource, ID3D11DepthStencil ...@@ -182,17 +182,17 @@ unsigned int GetDSVSubresourceIndex(ID3D11Resource *resource, ID3D11DepthStencil
GLenum GetSurfaceRTFormat(bool depth, SwapChain11 *swapChain) GLenum GetSurfaceRTFormat(bool depth, SwapChain11 *swapChain)
{ {
return (depth ? swapChain->GetDepthBufferInternalFormat() return (depth ? swapChain->getDepthBufferInternalFormat()
: swapChain->GetRenderTargetInternalFormat()); : swapChain->getRenderTargetInternalFormat());
} }
const d3d11::ANGLEFormatSet &GetSurfaceFormatSet(bool depth, const d3d11::ANGLEFormatSet &GetSurfaceFormatSet(bool depth,
SwapChain11 *swapChain, SwapChain11 *swapChain,
Renderer11 *renderer) Renderer11 *renderer)
{ {
return *d3d11::GetTextureFormatInfo(GetSurfaceRTFormat(depth, swapChain), return d3d11::GetTextureFormatInfo(GetSurfaceRTFormat(depth, swapChain),
renderer->getRenderer11DeviceCaps()) renderer->getRenderer11DeviceCaps())
.formatSet; .formatSet;
} }
} // anonymous namespace } // anonymous namespace
......
...@@ -3136,7 +3136,7 @@ gl::Error Renderer11::createRenderTarget(int width, int height, GLenum format, G ...@@ -3136,7 +3136,7 @@ gl::Error Renderer11::createRenderTarget(int width, int height, GLenum format, G
desc.Height = height; desc.Height = height;
desc.MipLevels = 1; desc.MipLevels = 1;
desc.ArraySize = 1; desc.ArraySize = 1;
desc.Format = formatInfo.formatSet->texFormat; desc.Format = formatInfo.formatSet.texFormat;
desc.SampleDesc.Count = (supportedSamples == 0) ? 1 : supportedSamples; desc.SampleDesc.Count = (supportedSamples == 0) ? 1 : supportedSamples;
desc.SampleDesc.Quality = 0; desc.SampleDesc.Quality = 0;
desc.Usage = D3D11_USAGE_DEFAULT; desc.Usage = D3D11_USAGE_DEFAULT;
...@@ -3147,9 +3147,9 @@ gl::Error Renderer11::createRenderTarget(int width, int height, GLenum format, G ...@@ -3147,9 +3147,9 @@ gl::Error Renderer11::createRenderTarget(int width, int height, GLenum format, G
// we'll flag it to allow binding that way. Shader resource views are a little // we'll flag it to allow binding that way. Shader resource views are a little
// more complicated. // more complicated.
bool bindRTV = false, bindDSV = false, bindSRV = false; bool bindRTV = false, bindDSV = false, bindSRV = false;
bindRTV = (formatInfo.formatSet->rtvFormat != DXGI_FORMAT_UNKNOWN); bindRTV = (formatInfo.formatSet.rtvFormat != DXGI_FORMAT_UNKNOWN);
bindDSV = (formatInfo.formatSet->dsvFormat != DXGI_FORMAT_UNKNOWN); bindDSV = (formatInfo.formatSet.dsvFormat != DXGI_FORMAT_UNKNOWN);
bindSRV = (formatInfo.formatSet->srvFormat != DXGI_FORMAT_UNKNOWN); bindSRV = (formatInfo.formatSet.srvFormat != DXGI_FORMAT_UNKNOWN);
desc.BindFlags = (bindRTV ? D3D11_BIND_RENDER_TARGET : 0) | desc.BindFlags = (bindRTV ? D3D11_BIND_RENDER_TARGET : 0) |
(bindDSV ? D3D11_BIND_DEPTH_STENCIL : 0) | (bindDSV ? D3D11_BIND_DEPTH_STENCIL : 0) |
...@@ -3171,7 +3171,7 @@ gl::Error Renderer11::createRenderTarget(int width, int height, GLenum format, G ...@@ -3171,7 +3171,7 @@ gl::Error Renderer11::createRenderTarget(int width, int height, GLenum format, G
if (bindSRV) if (bindSRV)
{ {
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc; D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
srvDesc.Format = formatInfo.formatSet->srvFormat; srvDesc.Format = formatInfo.formatSet.srvFormat;
srvDesc.ViewDimension = (supportedSamples == 0) ? D3D11_SRV_DIMENSION_TEXTURE2D : D3D11_SRV_DIMENSION_TEXTURE2DMS; srvDesc.ViewDimension = (supportedSamples == 0) ? D3D11_SRV_DIMENSION_TEXTURE2D : D3D11_SRV_DIMENSION_TEXTURE2DMS;
srvDesc.Texture2D.MostDetailedMip = 0; srvDesc.Texture2D.MostDetailedMip = 0;
srvDesc.Texture2D.MipLevels = 1; srvDesc.Texture2D.MipLevels = 1;
...@@ -3184,10 +3184,10 @@ gl::Error Renderer11::createRenderTarget(int width, int height, GLenum format, G ...@@ -3184,10 +3184,10 @@ gl::Error Renderer11::createRenderTarget(int width, int height, GLenum format, G
return gl::Error(GL_OUT_OF_MEMORY, "Failed to create render target shader resource view, result: 0x%X.", result); return gl::Error(GL_OUT_OF_MEMORY, "Failed to create render target shader resource view, result: 0x%X.", result);
} }
if (formatInfo.formatSet->blitSRVFormat != formatInfo.formatSet->srvFormat) if (formatInfo.formatSet.blitSRVFormat != formatInfo.formatSet.srvFormat)
{ {
D3D11_SHADER_RESOURCE_VIEW_DESC blitSRVDesc; D3D11_SHADER_RESOURCE_VIEW_DESC blitSRVDesc;
blitSRVDesc.Format = formatInfo.formatSet->blitSRVFormat; blitSRVDesc.Format = formatInfo.formatSet.blitSRVFormat;
blitSRVDesc.ViewDimension = (supportedSamples == 0) blitSRVDesc.ViewDimension = (supportedSamples == 0)
? D3D11_SRV_DIMENSION_TEXTURE2D ? D3D11_SRV_DIMENSION_TEXTURE2D
: D3D11_SRV_DIMENSION_TEXTURE2DMS; : D3D11_SRV_DIMENSION_TEXTURE2DMS;
...@@ -3216,7 +3216,7 @@ gl::Error Renderer11::createRenderTarget(int width, int height, GLenum format, G ...@@ -3216,7 +3216,7 @@ gl::Error Renderer11::createRenderTarget(int width, int height, GLenum format, G
if (bindDSV) if (bindDSV)
{ {
D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc; D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc;
dsvDesc.Format = formatInfo.formatSet->dsvFormat; dsvDesc.Format = formatInfo.formatSet.dsvFormat;
dsvDesc.ViewDimension = (supportedSamples == 0) ? D3D11_DSV_DIMENSION_TEXTURE2D : D3D11_DSV_DIMENSION_TEXTURE2DMS; dsvDesc.ViewDimension = (supportedSamples == 0) ? D3D11_DSV_DIMENSION_TEXTURE2D : D3D11_DSV_DIMENSION_TEXTURE2DMS;
dsvDesc.Texture2D.MipSlice = 0; dsvDesc.Texture2D.MipSlice = 0;
dsvDesc.Flags = 0; dsvDesc.Flags = 0;
...@@ -3232,7 +3232,7 @@ gl::Error Renderer11::createRenderTarget(int width, int height, GLenum format, G ...@@ -3232,7 +3232,7 @@ gl::Error Renderer11::createRenderTarget(int width, int height, GLenum format, G
return gl::Error(GL_OUT_OF_MEMORY, "Failed to create render target depth stencil view, result: 0x%X.", result); return gl::Error(GL_OUT_OF_MEMORY, "Failed to create render target depth stencil view, result: 0x%X.", result);
} }
*outRT = new TextureRenderTarget11(dsv, texture, srv, format, *formatInfo.formatSet, *outRT = new TextureRenderTarget11(dsv, texture, srv, format, formatInfo.formatSet,
width, height, 1, supportedSamples); width, height, 1, supportedSamples);
SafeRelease(dsv); SafeRelease(dsv);
...@@ -3240,7 +3240,7 @@ gl::Error Renderer11::createRenderTarget(int width, int height, GLenum format, G ...@@ -3240,7 +3240,7 @@ gl::Error Renderer11::createRenderTarget(int width, int height, GLenum format, G
else if (bindRTV) else if (bindRTV)
{ {
D3D11_RENDER_TARGET_VIEW_DESC rtvDesc; D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
rtvDesc.Format = formatInfo.formatSet->rtvFormat; rtvDesc.Format = formatInfo.formatSet.rtvFormat;
rtvDesc.ViewDimension = (supportedSamples == 0) ? D3D11_RTV_DIMENSION_TEXTURE2D : D3D11_RTV_DIMENSION_TEXTURE2DMS; rtvDesc.ViewDimension = (supportedSamples == 0) ? D3D11_RTV_DIMENSION_TEXTURE2D : D3D11_RTV_DIMENSION_TEXTURE2DMS;
rtvDesc.Texture2D.MipSlice = 0; rtvDesc.Texture2D.MipSlice = 0;
...@@ -3262,7 +3262,7 @@ gl::Error Renderer11::createRenderTarget(int width, int height, GLenum format, G ...@@ -3262,7 +3262,7 @@ gl::Error Renderer11::createRenderTarget(int width, int height, GLenum format, G
} }
*outRT = *outRT =
new TextureRenderTarget11(rtv, texture, srv, blitSRV, format, *formatInfo.formatSet, new TextureRenderTarget11(rtv, texture, srv, blitSRV, format, formatInfo.formatSet,
width, height, 1, supportedSamples); width, height, 1, supportedSamples);
SafeRelease(rtv); SafeRelease(rtv);
...@@ -3526,7 +3526,7 @@ bool Renderer11::supportsFastCopyBufferToTexture(GLenum internalFormat) const ...@@ -3526,7 +3526,7 @@ bool Renderer11::supportsFastCopyBufferToTexture(GLenum internalFormat) const
} }
// We cannot support direct copies to non-color-renderable formats // We cannot support direct copies to non-color-renderable formats
if (d3d11FormatInfo.formatSet->rtvFormat == DXGI_FORMAT_UNKNOWN) if (d3d11FormatInfo.formatSet.rtvFormat == DXGI_FORMAT_UNKNOWN)
{ {
return false; return false;
} }
...@@ -3538,7 +3538,7 @@ bool Renderer11::supportsFastCopyBufferToTexture(GLenum internalFormat) const ...@@ -3538,7 +3538,7 @@ bool Renderer11::supportsFastCopyBufferToTexture(GLenum internalFormat) const
} }
// We don't support formats which we can't represent without conversion // We don't support formats which we can't represent without conversion
if (d3d11FormatInfo.formatSet->glInternalFormat != internalFormat) if (d3d11FormatInfo.formatSet.glInternalFormat != internalFormat)
{ {
return false; return false;
} }
......
...@@ -209,7 +209,7 @@ EGLint SwapChain11::resetOffscreenColorBuffer(int backbufferWidth, int backbuffe ...@@ -209,7 +209,7 @@ EGLint SwapChain11::resetOffscreenColorBuffer(int backbufferWidth, int backbuffe
if (offscreenTextureDesc.Width != (UINT)backbufferWidth || if (offscreenTextureDesc.Width != (UINT)backbufferWidth ||
offscreenTextureDesc.Height != (UINT)backbufferHeight || offscreenTextureDesc.Height != (UINT)backbufferHeight ||
offscreenTextureDesc.Format != backbufferFormatInfo.formatSet->texFormat || offscreenTextureDesc.Format != backbufferFormatInfo.formatSet.texFormat ||
offscreenTextureDesc.MipLevels != 1 || offscreenTextureDesc.ArraySize != 1) offscreenTextureDesc.MipLevels != 1 || offscreenTextureDesc.ArraySize != 1)
{ {
ERR("Invalid texture parameters in the shared offscreen texture pbuffer"); ERR("Invalid texture parameters in the shared offscreen texture pbuffer");
...@@ -225,7 +225,7 @@ EGLint SwapChain11::resetOffscreenColorBuffer(int backbufferWidth, int backbuffe ...@@ -225,7 +225,7 @@ EGLint SwapChain11::resetOffscreenColorBuffer(int backbufferWidth, int backbuffe
D3D11_TEXTURE2D_DESC offscreenTextureDesc = {0}; D3D11_TEXTURE2D_DESC offscreenTextureDesc = {0};
offscreenTextureDesc.Width = backbufferWidth; offscreenTextureDesc.Width = backbufferWidth;
offscreenTextureDesc.Height = backbufferHeight; offscreenTextureDesc.Height = backbufferHeight;
offscreenTextureDesc.Format = backbufferFormatInfo.formatSet->texFormat; offscreenTextureDesc.Format = backbufferFormatInfo.formatSet.texFormat;
offscreenTextureDesc.MipLevels = 1; offscreenTextureDesc.MipLevels = 1;
offscreenTextureDesc.ArraySize = 1; offscreenTextureDesc.ArraySize = 1;
offscreenTextureDesc.SampleDesc.Count = 1; offscreenTextureDesc.SampleDesc.Count = 1;
...@@ -283,7 +283,7 @@ EGLint SwapChain11::resetOffscreenColorBuffer(int backbufferWidth, int backbuffe ...@@ -283,7 +283,7 @@ EGLint SwapChain11::resetOffscreenColorBuffer(int backbufferWidth, int backbuffe
mKeyedMutex = d3d11::DynamicCastComObject<IDXGIKeyedMutex>(mOffscreenTexture); mKeyedMutex = d3d11::DynamicCastComObject<IDXGIKeyedMutex>(mOffscreenTexture);
D3D11_RENDER_TARGET_VIEW_DESC offscreenRTVDesc; D3D11_RENDER_TARGET_VIEW_DESC offscreenRTVDesc;
offscreenRTVDesc.Format = backbufferFormatInfo.formatSet->rtvFormat; offscreenRTVDesc.Format = backbufferFormatInfo.formatSet.rtvFormat;
offscreenRTVDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D; offscreenRTVDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
offscreenRTVDesc.Texture2D.MipSlice = 0; offscreenRTVDesc.Texture2D.MipSlice = 0;
...@@ -292,7 +292,7 @@ EGLint SwapChain11::resetOffscreenColorBuffer(int backbufferWidth, int backbuffe ...@@ -292,7 +292,7 @@ EGLint SwapChain11::resetOffscreenColorBuffer(int backbufferWidth, int backbuffe
d3d11::SetDebugName(mOffscreenRTView, "Offscreen back buffer render target"); d3d11::SetDebugName(mOffscreenRTView, "Offscreen back buffer render target");
D3D11_SHADER_RESOURCE_VIEW_DESC offscreenSRVDesc; D3D11_SHADER_RESOURCE_VIEW_DESC offscreenSRVDesc;
offscreenSRVDesc.Format = backbufferFormatInfo.formatSet->srvFormat; offscreenSRVDesc.Format = backbufferFormatInfo.formatSet.srvFormat;
offscreenSRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; offscreenSRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
offscreenSRVDesc.Texture2D.MostDetailedMip = 0; offscreenSRVDesc.Texture2D.MostDetailedMip = 0;
offscreenSRVDesc.Texture2D.MipLevels = static_cast<UINT>(-1); offscreenSRVDesc.Texture2D.MipLevels = static_cast<UINT>(-1);
...@@ -339,7 +339,7 @@ EGLint SwapChain11::resetOffscreenDepthBuffer(int backbufferWidth, int backbuffe ...@@ -339,7 +339,7 @@ EGLint SwapChain11::resetOffscreenDepthBuffer(int backbufferWidth, int backbuffe
D3D11_TEXTURE2D_DESC depthStencilTextureDesc; D3D11_TEXTURE2D_DESC depthStencilTextureDesc;
depthStencilTextureDesc.Width = backbufferWidth; depthStencilTextureDesc.Width = backbufferWidth;
depthStencilTextureDesc.Height = backbufferHeight; depthStencilTextureDesc.Height = backbufferHeight;
depthStencilTextureDesc.Format = depthBufferFormatInfo.formatSet->texFormat; depthStencilTextureDesc.Format = depthBufferFormatInfo.formatSet.texFormat;
depthStencilTextureDesc.MipLevels = 1; depthStencilTextureDesc.MipLevels = 1;
depthStencilTextureDesc.ArraySize = 1; depthStencilTextureDesc.ArraySize = 1;
depthStencilTextureDesc.SampleDesc.Count = 1; depthStencilTextureDesc.SampleDesc.Count = 1;
...@@ -347,7 +347,7 @@ EGLint SwapChain11::resetOffscreenDepthBuffer(int backbufferWidth, int backbuffe ...@@ -347,7 +347,7 @@ EGLint SwapChain11::resetOffscreenDepthBuffer(int backbufferWidth, int backbuffe
depthStencilTextureDesc.Usage = D3D11_USAGE_DEFAULT; depthStencilTextureDesc.Usage = D3D11_USAGE_DEFAULT;
depthStencilTextureDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL; depthStencilTextureDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL;
if (depthBufferFormatInfo.formatSet->srvFormat != DXGI_FORMAT_UNKNOWN) if (depthBufferFormatInfo.formatSet.srvFormat != DXGI_FORMAT_UNKNOWN)
{ {
depthStencilTextureDesc.BindFlags |= D3D11_BIND_SHADER_RESOURCE; depthStencilTextureDesc.BindFlags |= D3D11_BIND_SHADER_RESOURCE;
} }
...@@ -375,7 +375,7 @@ EGLint SwapChain11::resetOffscreenDepthBuffer(int backbufferWidth, int backbuffe ...@@ -375,7 +375,7 @@ EGLint SwapChain11::resetOffscreenDepthBuffer(int backbufferWidth, int backbuffe
d3d11::SetDebugName(mDepthStencilTexture, "Offscreen depth stencil texture"); d3d11::SetDebugName(mDepthStencilTexture, "Offscreen depth stencil texture");
D3D11_DEPTH_STENCIL_VIEW_DESC depthStencilDesc; D3D11_DEPTH_STENCIL_VIEW_DESC depthStencilDesc;
depthStencilDesc.Format = depthBufferFormatInfo.formatSet->dsvFormat; depthStencilDesc.Format = depthBufferFormatInfo.formatSet.dsvFormat;
depthStencilDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D; depthStencilDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
depthStencilDesc.Flags = 0; depthStencilDesc.Flags = 0;
depthStencilDesc.Texture2D.MipSlice = 0; depthStencilDesc.Texture2D.MipSlice = 0;
...@@ -384,10 +384,10 @@ EGLint SwapChain11::resetOffscreenDepthBuffer(int backbufferWidth, int backbuffe ...@@ -384,10 +384,10 @@ EGLint SwapChain11::resetOffscreenDepthBuffer(int backbufferWidth, int backbuffe
ASSERT(SUCCEEDED(result)); ASSERT(SUCCEEDED(result));
d3d11::SetDebugName(mDepthStencilDSView, "Offscreen depth stencil view"); d3d11::SetDebugName(mDepthStencilDSView, "Offscreen depth stencil view");
if (depthBufferFormatInfo.formatSet->srvFormat != DXGI_FORMAT_UNKNOWN) if (depthBufferFormatInfo.formatSet.srvFormat != DXGI_FORMAT_UNKNOWN)
{ {
D3D11_SHADER_RESOURCE_VIEW_DESC depthStencilSRVDesc; D3D11_SHADER_RESOURCE_VIEW_DESC depthStencilSRVDesc;
depthStencilSRVDesc.Format = depthBufferFormatInfo.formatSet->srvFormat; depthStencilSRVDesc.Format = depthBufferFormatInfo.formatSet.srvFormat;
depthStencilSRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; depthStencilSRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
depthStencilSRVDesc.Texture2D.MostDetailedMip = 0; depthStencilSRVDesc.Texture2D.MostDetailedMip = 0;
depthStencilSRVDesc.Texture2D.MipLevels = static_cast<UINT>(-1); depthStencilSRVDesc.Texture2D.MipLevels = static_cast<UINT>(-1);
...@@ -489,7 +489,7 @@ DXGI_FORMAT SwapChain11::getSwapChainNativeFormat() const ...@@ -489,7 +489,7 @@ DXGI_FORMAT SwapChain11::getSwapChainNativeFormat() const
return (mOffscreenRenderTargetFormat == GL_BGRA8_EXT) ? DXGI_FORMAT_B8G8R8A8_UNORM : DXGI_FORMAT_R8G8B8A8_UNORM; return (mOffscreenRenderTargetFormat == GL_BGRA8_EXT) ? DXGI_FORMAT_B8G8R8A8_UNORM : DXGI_FORMAT_R8G8B8A8_UNORM;
} }
EGLint SwapChain11::reset(int backbufferWidth, int backbufferHeight, EGLint swapInterval) EGLint SwapChain11::reset(EGLint backbufferWidth, EGLint backbufferHeight, EGLint swapInterval)
{ {
mSwapInterval = static_cast<unsigned int>(swapInterval); mSwapInterval = static_cast<unsigned int>(swapInterval);
if (mSwapInterval > 4) if (mSwapInterval > 4)
...@@ -876,4 +876,4 @@ void SwapChain11::recreate() ...@@ -876,4 +876,4 @@ void SwapChain11::recreate()
// possibly should use this method instead of reset // possibly should use this method instead of reset
} }
} } // namespace rx
...@@ -18,7 +18,7 @@ namespace rx ...@@ -18,7 +18,7 @@ namespace rx
class Renderer11; class Renderer11;
class NativeWindow11; class NativeWindow11;
class SwapChain11 : public SwapChainD3D class SwapChain11 final : public SwapChainD3D
{ {
public: public:
SwapChain11(Renderer11 *renderer, SwapChain11(Renderer11 *renderer,
...@@ -30,20 +30,20 @@ class SwapChain11 : public SwapChainD3D ...@@ -30,20 +30,20 @@ class SwapChain11 : public SwapChainD3D
virtual ~SwapChain11(); virtual ~SwapChain11();
EGLint resize(EGLint backbufferWidth, EGLint backbufferHeight); EGLint resize(EGLint backbufferWidth, EGLint backbufferHeight);
virtual EGLint reset(EGLint backbufferWidth, EGLint backbufferHeight, EGLint swapInterval); EGLint reset(EGLint backbufferWidth, EGLint backbufferHeight, EGLint swapInterval) override;
virtual EGLint swapRect(EGLint x, EGLint y, EGLint width, EGLint height); EGLint swapRect(EGLint x, EGLint y, EGLint width, EGLint height) override;
virtual void recreate(); void recreate() override;
RenderTargetD3D *getColorRenderTarget() override { return &mColorRenderTarget; } RenderTargetD3D *getColorRenderTarget() override { return &mColorRenderTarget; }
RenderTargetD3D *getDepthStencilRenderTarget() override { return &mDepthStencilRenderTarget; } RenderTargetD3D *getDepthStencilRenderTarget() override { return &mDepthStencilRenderTarget; }
virtual ID3D11Texture2D *getOffscreenTexture(); ID3D11Texture2D *getOffscreenTexture();
virtual ID3D11RenderTargetView *getRenderTarget(); ID3D11RenderTargetView *getRenderTarget();
virtual ID3D11ShaderResourceView *getRenderTargetShaderResource(); ID3D11ShaderResourceView *getRenderTargetShaderResource();
virtual ID3D11Texture2D *getDepthStencilTexture(); ID3D11Texture2D *getDepthStencilTexture();
virtual ID3D11DepthStencilView *getDepthStencil(); ID3D11DepthStencilView *getDepthStencil();
virtual ID3D11ShaderResourceView *getDepthStencilShaderResource(); ID3D11ShaderResourceView *getDepthStencilShaderResource();
EGLint getWidth() const { return mWidth; } EGLint getWidth() const { return mWidth; }
EGLint getHeight() const { return mHeight; } EGLint getHeight() const { return mHeight; }
...@@ -103,5 +103,5 @@ class SwapChain11 : public SwapChainD3D ...@@ -103,5 +103,5 @@ class SwapChain11 : public SwapChainD3D
SurfaceRenderTarget11 mDepthStencilRenderTarget; SurfaceRenderTarget11 mDepthStencilRenderTarget;
}; };
} } // namespace rx
#endif // LIBANGLE_RENDERER_D3D_D3D11_SWAPCHAIN11_H_ #endif // LIBANGLE_RENDERER_D3D_D3D11_SWAPCHAIN11_H_
...@@ -42,13 +42,15 @@ bool TextureStorage11::SRVKey::operator<(const SRVKey &rhs) const ...@@ -42,13 +42,15 @@ bool TextureStorage11::SRVKey::operator<(const SRVKey &rhs) const
std::tie(rhs.baseLevel, rhs.mipLevels, rhs.swizzle); std::tie(rhs.baseLevel, rhs.mipLevels, rhs.swizzle);
} }
TextureStorage11::TextureStorage11(Renderer11 *renderer, UINT bindFlags, UINT miscFlags) TextureStorage11::TextureStorage11(Renderer11 *renderer,
UINT bindFlags,
UINT miscFlags,
GLenum internalFormat)
: mRenderer(renderer), : mRenderer(renderer),
mTopLevel(0), mTopLevel(0),
mMipLevels(0), mMipLevels(0),
mInternalFormat(GL_NONE), mFormatInfo(
mTextureFormatSet(nullptr), d3d11::GetTextureFormatInfo(internalFormat, mRenderer->getRenderer11DeviceCaps())),
mSwizzleFormatSet(nullptr),
mTextureWidth(0), mTextureWidth(0),
mTextureHeight(0), mTextureHeight(0),
mTextureDepth(0), mTextureDepth(0),
...@@ -82,15 +84,15 @@ DWORD TextureStorage11::GetTextureBindFlags(GLenum internalFormat, ...@@ -82,15 +84,15 @@ DWORD TextureStorage11::GetTextureBindFlags(GLenum internalFormat,
const d3d11::TextureFormat &formatInfo = const d3d11::TextureFormat &formatInfo =
d3d11::GetTextureFormatInfo(internalFormat, renderer11DeviceCaps); d3d11::GetTextureFormatInfo(internalFormat, renderer11DeviceCaps);
if (formatInfo.formatSet->srvFormat != DXGI_FORMAT_UNKNOWN) if (formatInfo.formatSet.srvFormat != DXGI_FORMAT_UNKNOWN)
{ {
bindFlags |= D3D11_BIND_SHADER_RESOURCE; bindFlags |= D3D11_BIND_SHADER_RESOURCE;
} }
if (formatInfo.formatSet->dsvFormat != DXGI_FORMAT_UNKNOWN) if (formatInfo.formatSet.dsvFormat != DXGI_FORMAT_UNKNOWN)
{ {
bindFlags |= D3D11_BIND_DEPTH_STENCIL; bindFlags |= D3D11_BIND_DEPTH_STENCIL;
} }
if (formatInfo.formatSet->rtvFormat != DXGI_FORMAT_UNKNOWN && renderTarget) if (formatInfo.formatSet.rtvFormat != DXGI_FORMAT_UNKNOWN && renderTarget)
{ {
bindFlags |= D3D11_BIND_RENDER_TARGET; bindFlags |= D3D11_BIND_RENDER_TARGET;
} }
...@@ -110,7 +112,7 @@ DWORD TextureStorage11::GetTextureMiscFlags(GLenum internalFormat, ...@@ -110,7 +112,7 @@ DWORD TextureStorage11::GetTextureMiscFlags(GLenum internalFormat,
if (renderTarget && levels > 1) if (renderTarget && levels > 1)
{ {
const d3d11::DXGIFormat &dxgiFormatInfo = const d3d11::DXGIFormat &dxgiFormatInfo =
d3d11::GetDXGIFormatInfo(formatInfo.formatSet->texFormat); d3d11::GetDXGIFormatInfo(formatInfo.formatSet.texFormat);
if (dxgiFormatInfo.nativeMipmapSupport(renderer11DeviceCaps.featureLevel)) if (dxgiFormatInfo.nativeMipmapSupport(renderer11DeviceCaps.featureLevel))
{ {
...@@ -245,7 +247,7 @@ gl::Error TextureStorage11::getCachedOrCreateSRV(const SRVKey &key, ...@@ -245,7 +247,7 @@ gl::Error TextureStorage11::getCachedOrCreateSRV(const SRVKey &key,
ID3D11ShaderResourceView *srv = nullptr; ID3D11ShaderResourceView *srv = nullptr;
DXGI_FORMAT format = DXGI_FORMAT format =
(key.swizzle ? mSwizzleFormatSet->srvFormat : mTextureFormatSet->srvFormat); (key.swizzle ? mFormatInfo.swizzleFormatSet.srvFormat : mFormatInfo.formatSet.srvFormat);
ANGLE_TRY(createSRV(key.baseLevel, key.mipLevels, format, texture, &srv)); ANGLE_TRY(createSRV(key.baseLevel, key.mipLevels, format, texture, &srv));
mSrvCache.insert(std::make_pair(key, srv)); mSrvCache.insert(std::make_pair(key, srv));
...@@ -267,7 +269,7 @@ gl::Error TextureStorage11::getSRVLevel(int mipLevel, ...@@ -267,7 +269,7 @@ gl::Error TextureStorage11::getSRVLevel(int mipLevel,
{ {
// Only create a different SRV for blit if blit format is different from regular srv format // Only create a different SRV for blit if blit format is different from regular srv format
if (otherLevelSRVs[mipLevel] && if (otherLevelSRVs[mipLevel] &&
mTextureFormatSet->srvFormat == mTextureFormatSet->blitSRVFormat) mFormatInfo.formatSet.srvFormat == mFormatInfo.formatSet.blitSRVFormat)
{ {
levelSRVs[mipLevel] = otherLevelSRVs[mipLevel]; levelSRVs[mipLevel] = otherLevelSRVs[mipLevel];
levelSRVs[mipLevel]->AddRef(); levelSRVs[mipLevel]->AddRef();
...@@ -282,7 +284,7 @@ gl::Error TextureStorage11::getSRVLevel(int mipLevel, ...@@ -282,7 +284,7 @@ gl::Error TextureStorage11::getSRVLevel(int mipLevel,
} }
DXGI_FORMAT resourceFormat = DXGI_FORMAT resourceFormat =
blitSRV ? mTextureFormatSet->blitSRVFormat : mTextureFormatSet->srvFormat; blitSRV ? mFormatInfo.formatSet.blitSRVFormat : mFormatInfo.formatSet.srvFormat;
error = createSRV(mipLevel, 1, resourceFormat, resource, &levelSRVs[mipLevel]); error = createSRV(mipLevel, 1, resourceFormat, resource, &levelSRVs[mipLevel]);
if (error.isError()) if (error.isError())
{ {
...@@ -329,7 +331,7 @@ gl::Error TextureStorage11::getSRVLevels(GLint baseLevel, ...@@ -329,7 +331,7 @@ gl::Error TextureStorage11::getSRVLevels(GLint baseLevel,
const d3d11::ANGLEFormatSet &TextureStorage11::getFormatSet() const const d3d11::ANGLEFormatSet &TextureStorage11::getFormatSet() const
{ {
return *mTextureFormatSet; return mFormatInfo.formatSet;
} }
gl::Error TextureStorage11::generateSwizzles(const gl::SwizzleState &swizzleTarget) gl::Error TextureStorage11::generateSwizzles(const gl::SwizzleState &swizzleTarget)
...@@ -425,8 +427,8 @@ gl::Error TextureStorage11::updateSubresourceLevel(ID3D11Resource *srcTexture, ...@@ -425,8 +427,8 @@ gl::Error TextureStorage11::updateSubresourceLevel(ID3D11Resource *srcTexture,
ASSERT(dstTexture); ASSERT(dstTexture);
const d3d11::DXGIFormatSize &dxgiFormatSizeInfo = const d3d11::DXGIFormatSize &dxgiFormatSizeInfo =
d3d11::GetDXGIFormatSizeInfo(mTextureFormatSet->texFormat); d3d11::GetDXGIFormatSizeInfo(mFormatInfo.formatSet.texFormat);
if (!fullCopy && mTextureFormatSet->dsvFormat != DXGI_FORMAT_UNKNOWN) if (!fullCopy && mFormatInfo.formatSet.dsvFormat != DXGI_FORMAT_UNKNOWN)
{ {
// CopySubresourceRegion cannot copy partial depth stencils, use the blitter instead // CopySubresourceRegion cannot copy partial depth stencils, use the blitter instead
Blit11 *blitter = mRenderer->getBlitter(); Blit11 *blitter = mRenderer->getBlitter();
...@@ -494,7 +496,7 @@ gl::Error TextureStorage11::copySubresourceLevel(ID3D11Resource *dstTexture, ...@@ -494,7 +496,7 @@ gl::Error TextureStorage11::copySubresourceLevel(ID3D11Resource *dstTexture,
// However, D3D10Level9 doesn't always perform CopySubresourceRegion correctly unless the // However, D3D10Level9 doesn't always perform CopySubresourceRegion correctly unless the
// source box is specified. This is okay, since we don't perform CopySubresourceRegion on // source box is specified. This is okay, since we don't perform CopySubresourceRegion on
// depth/stencil textures on 9_3. // depth/stencil textures on 9_3.
ASSERT(mTextureFormatSet->dsvFormat == DXGI_FORMAT_UNKNOWN); ASSERT(mFormatInfo.formatSet.dsvFormat == DXGI_FORMAT_UNKNOWN);
srcBox.left = region.x; srcBox.left = region.x;
srcBox.right = region.x + region.width; srcBox.right = region.x + region.width;
srcBox.top = region.y; srcBox.top = region.y;
...@@ -657,7 +659,7 @@ gl::Error TextureStorage11::setData(const gl::ImageIndex &index, ...@@ -657,7 +659,7 @@ gl::Error TextureStorage11::setData(const gl::ImageIndex &index,
const d3d11::TextureFormat &d3d11Format = d3d11::GetTextureFormatInfo( const d3d11::TextureFormat &d3d11Format = d3d11::GetTextureFormatInfo(
image->getInternalFormat(), mRenderer->getRenderer11DeviceCaps()); image->getInternalFormat(), mRenderer->getRenderer11DeviceCaps());
const d3d11::DXGIFormatSize &dxgiFormatInfo = const d3d11::DXGIFormatSize &dxgiFormatInfo =
d3d11::GetDXGIFormatSizeInfo(d3d11Format.formatSet->texFormat); d3d11::GetDXGIFormatSizeInfo(d3d11Format.formatSet.texFormat);
const size_t outputPixelSize = dxgiFormatInfo.pixelBytes; const size_t outputPixelSize = dxgiFormatInfo.pixelBytes;
...@@ -711,7 +713,10 @@ gl::Error TextureStorage11::setData(const gl::ImageIndex &index, ...@@ -711,7 +713,10 @@ gl::Error TextureStorage11::setData(const gl::ImageIndex &index,
} }
TextureStorage11_2D::TextureStorage11_2D(Renderer11 *renderer, SwapChain11 *swapchain) TextureStorage11_2D::TextureStorage11_2D(Renderer11 *renderer, SwapChain11 *swapchain)
: TextureStorage11(renderer, D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE, 0), : TextureStorage11(renderer,
D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE,
0,
swapchain->getRenderTargetInternalFormat()),
mTexture(swapchain->getOffscreenTexture()), mTexture(swapchain->getOffscreenTexture()),
mLevelZeroTexture(nullptr), mLevelZeroTexture(nullptr),
mLevelZeroRenderTarget(nullptr), mLevelZeroRenderTarget(nullptr),
...@@ -734,13 +739,6 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer11 *renderer, SwapChain11 *swap ...@@ -734,13 +739,6 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer11 *renderer, SwapChain11 *swap
mTextureHeight = texDesc.Height; mTextureHeight = texDesc.Height;
mTextureDepth = 1; mTextureDepth = 1;
mHasKeyedMutex = (texDesc.MiscFlags & D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX) != 0; mHasKeyedMutex = (texDesc.MiscFlags & D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX) != 0;
mInternalFormat = swapchain->GetRenderTargetInternalFormat();
const auto &formatInfo =
d3d11::GetTextureFormatInfo(mInternalFormat, mRenderer->getRenderer11DeviceCaps());
mTextureFormatSet = formatInfo.formatSet;
mSwizzleFormatSet = formatInfo.swizzleFormatSet;
} }
TextureStorage11_2D::TextureStorage11_2D(Renderer11 *renderer, TextureStorage11_2D::TextureStorage11_2D(Renderer11 *renderer,
...@@ -756,7 +754,8 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer11 *renderer, ...@@ -756,7 +754,8 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer11 *renderer,
GetTextureMiscFlags(internalformat, GetTextureMiscFlags(internalformat,
renderer->getRenderer11DeviceCaps(), renderer->getRenderer11DeviceCaps(),
renderTarget, renderTarget,
levels)), levels),
internalformat),
mTexture(nullptr), mTexture(nullptr),
mHasKeyedMutex(false), mHasKeyedMutex(false),
mLevelZeroTexture(nullptr), mLevelZeroTexture(nullptr),
...@@ -771,14 +770,7 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer11 *renderer, ...@@ -771,14 +770,7 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer11 *renderer,
mSwizzleRenderTargets[i] = nullptr; mSwizzleRenderTargets[i] = nullptr;
} }
mInternalFormat = internalformat; d3d11::MakeValidSize(false, mFormatInfo.formatSet.texFormat, &width, &height, &mTopLevel);
const d3d11::TextureFormat &formatInfo =
d3d11::GetTextureFormatInfo(internalformat, renderer->getRenderer11DeviceCaps());
mTextureFormatSet = formatInfo.formatSet;
mSwizzleFormatSet = formatInfo.swizzleFormatSet;
d3d11::MakeValidSize(false, mTextureFormatSet->texFormat, &width, &height, &mTopLevel);
mMipLevels = mTopLevel + levels; mMipLevels = mTopLevel + levels;
mTextureWidth = width; mTextureWidth = width;
mTextureHeight = height; mTextureHeight = height;
...@@ -1106,7 +1098,7 @@ gl::Error TextureStorage11_2D::ensureTextureExists(int mipLevels) ...@@ -1106,7 +1098,7 @@ gl::Error TextureStorage11_2D::ensureTextureExists(int mipLevels)
desc.Height = mTextureHeight; desc.Height = mTextureHeight;
desc.MipLevels = mipLevels; desc.MipLevels = mipLevels;
desc.ArraySize = 1; desc.ArraySize = 1;
desc.Format = mTextureFormatSet->texFormat; desc.Format = mFormatInfo.formatSet.texFormat;
desc.SampleDesc.Count = 1; desc.SampleDesc.Count = 1;
desc.SampleDesc.Quality = 0; desc.SampleDesc.Quality = 0;
desc.Usage = D3D11_USAGE_DEFAULT; desc.Usage = D3D11_USAGE_DEFAULT;
...@@ -1187,7 +1179,7 @@ gl::Error TextureStorage11_2D::getRenderTarget(const gl::ImageIndex &index, Rend ...@@ -1187,7 +1179,7 @@ gl::Error TextureStorage11_2D::getRenderTarget(const gl::ImageIndex &index, Rend
if (!mLevelZeroRenderTarget) if (!mLevelZeroRenderTarget)
{ {
D3D11_RENDER_TARGET_VIEW_DESC rtvDesc; D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
rtvDesc.Format = mTextureFormatSet->rtvFormat; rtvDesc.Format = mFormatInfo.formatSet.rtvFormat;
rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D; rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
rtvDesc.Texture2D.MipSlice = mTopLevel + level; rtvDesc.Texture2D.MipSlice = mTopLevel + level;
...@@ -1204,8 +1196,8 @@ gl::Error TextureStorage11_2D::getRenderTarget(const gl::ImageIndex &index, Rend ...@@ -1204,8 +1196,8 @@ gl::Error TextureStorage11_2D::getRenderTarget(const gl::ImageIndex &index, Rend
ASSERT(SUCCEEDED(result)); ASSERT(SUCCEEDED(result));
mLevelZeroRenderTarget = new TextureRenderTarget11( mLevelZeroRenderTarget = new TextureRenderTarget11(
rtv, mLevelZeroTexture, nullptr, nullptr, mInternalFormat, getFormatSet(), rtv, mLevelZeroTexture, nullptr, nullptr, mFormatInfo.internalFormat,
getLevelWidth(level), getLevelHeight(level), 1, 0); getFormatSet(), getLevelWidth(level), getLevelHeight(level), 1, 0);
// RenderTarget will take ownership of these resources // RenderTarget will take ownership of these resources
SafeRelease(rtv); SafeRelease(rtv);
...@@ -1215,10 +1207,10 @@ gl::Error TextureStorage11_2D::getRenderTarget(const gl::ImageIndex &index, Rend ...@@ -1215,10 +1207,10 @@ gl::Error TextureStorage11_2D::getRenderTarget(const gl::ImageIndex &index, Rend
return gl::Error(GL_NO_ERROR); return gl::Error(GL_NO_ERROR);
} }
if (mTextureFormatSet->rtvFormat != DXGI_FORMAT_UNKNOWN) if (mFormatInfo.formatSet.rtvFormat != DXGI_FORMAT_UNKNOWN)
{ {
D3D11_RENDER_TARGET_VIEW_DESC rtvDesc; D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
rtvDesc.Format = mTextureFormatSet->rtvFormat; rtvDesc.Format = mFormatInfo.formatSet.rtvFormat;
rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D; rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
rtvDesc.Texture2D.MipSlice = mTopLevel + level; rtvDesc.Texture2D.MipSlice = mTopLevel + level;
...@@ -1234,9 +1226,9 @@ gl::Error TextureStorage11_2D::getRenderTarget(const gl::ImageIndex &index, Rend ...@@ -1234,9 +1226,9 @@ gl::Error TextureStorage11_2D::getRenderTarget(const gl::ImageIndex &index, Rend
result); result);
} }
mRenderTarget[level] = mRenderTarget[level] = new TextureRenderTarget11(
new TextureRenderTarget11(rtv, texture, srv, blitSRV, mInternalFormat, getFormatSet(), rtv, texture, srv, blitSRV, mFormatInfo.internalFormat, getFormatSet(),
getLevelWidth(level), getLevelHeight(level), 1, 0); getLevelWidth(level), getLevelHeight(level), 1, 0);
// RenderTarget will take ownership of these resources // RenderTarget will take ownership of these resources
SafeRelease(rtv); SafeRelease(rtv);
...@@ -1245,10 +1237,10 @@ gl::Error TextureStorage11_2D::getRenderTarget(const gl::ImageIndex &index, Rend ...@@ -1245,10 +1237,10 @@ gl::Error TextureStorage11_2D::getRenderTarget(const gl::ImageIndex &index, Rend
return gl::Error(GL_NO_ERROR); return gl::Error(GL_NO_ERROR);
} }
ASSERT(mTextureFormatSet->dsvFormat != DXGI_FORMAT_UNKNOWN); ASSERT(mFormatInfo.formatSet.dsvFormat != DXGI_FORMAT_UNKNOWN);
D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc; D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc;
dsvDesc.Format = mTextureFormatSet->dsvFormat; dsvDesc.Format = mFormatInfo.formatSet.dsvFormat;
dsvDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D; dsvDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
dsvDesc.Texture2D.MipSlice = mTopLevel + level; dsvDesc.Texture2D.MipSlice = mTopLevel + level;
dsvDesc.Flags = 0; dsvDesc.Flags = 0;
...@@ -1266,7 +1258,7 @@ gl::Error TextureStorage11_2D::getRenderTarget(const gl::ImageIndex &index, Rend ...@@ -1266,7 +1258,7 @@ gl::Error TextureStorage11_2D::getRenderTarget(const gl::ImageIndex &index, Rend
} }
mRenderTarget[level] = mRenderTarget[level] =
new TextureRenderTarget11(dsv, texture, srv, mInternalFormat, getFormatSet(), new TextureRenderTarget11(dsv, texture, srv, mFormatInfo.internalFormat, getFormatSet(),
getLevelWidth(level), getLevelHeight(level), 1, 0); getLevelWidth(level), getLevelHeight(level), 1, 0);
// RenderTarget will take ownership of these resources // RenderTarget will take ownership of these resources
...@@ -1341,7 +1333,7 @@ gl::Error TextureStorage11_2D::getSwizzleTexture(ID3D11Resource **outTexture) ...@@ -1341,7 +1333,7 @@ gl::Error TextureStorage11_2D::getSwizzleTexture(ID3D11Resource **outTexture)
desc.Height = mTextureHeight; desc.Height = mTextureHeight;
desc.MipLevels = mMipLevels; desc.MipLevels = mMipLevels;
desc.ArraySize = 1; desc.ArraySize = 1;
desc.Format = mSwizzleFormatSet->texFormat; desc.Format = mFormatInfo.swizzleFormatSet.texFormat;
desc.SampleDesc.Count = 1; desc.SampleDesc.Count = 1;
desc.SampleDesc.Quality = 0; desc.SampleDesc.Quality = 0;
desc.Usage = D3D11_USAGE_DEFAULT; desc.Usage = D3D11_USAGE_DEFAULT;
...@@ -1382,7 +1374,7 @@ gl::Error TextureStorage11_2D::getSwizzleRenderTarget(int mipLevel, ID3D11Render ...@@ -1382,7 +1374,7 @@ gl::Error TextureStorage11_2D::getSwizzleRenderTarget(int mipLevel, ID3D11Render
ID3D11Device *device = mRenderer->getDevice(); ID3D11Device *device = mRenderer->getDevice();
D3D11_RENDER_TARGET_VIEW_DESC rtvDesc; D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
rtvDesc.Format = mSwizzleFormatSet->rtvFormat; rtvDesc.Format = mFormatInfo.swizzleFormatSet.rtvFormat;
rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D; rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
rtvDesc.Texture2D.MipSlice = mTopLevel + mipLevel; rtvDesc.Texture2D.MipSlice = mTopLevel + mipLevel;
...@@ -1406,7 +1398,7 @@ TextureStorage11_External::TextureStorage11_External( ...@@ -1406,7 +1398,7 @@ TextureStorage11_External::TextureStorage11_External(
Renderer11 *renderer, Renderer11 *renderer,
egl::Stream *stream, egl::Stream *stream,
const egl::Stream::GLTextureDescription &glDesc) const egl::Stream::GLTextureDescription &glDesc)
: TextureStorage11(renderer, D3D11_BIND_SHADER_RESOURCE, 0) : TextureStorage11(renderer, D3D11_BIND_SHADER_RESOURCE, 0, glDesc.internalFormat)
{ {
ASSERT(stream->getProducerType() == egl::Stream::ProducerType::D3D11TextureNV12); ASSERT(stream->getProducerType() == egl::Stream::ProducerType::D3D11TextureNV12);
StreamProducerNV12 *producer = static_cast<StreamProducerNV12 *>(stream->getImplementation()); StreamProducerNV12 *producer = static_cast<StreamProducerNV12 *>(stream->getImplementation());
...@@ -1420,13 +1412,7 @@ TextureStorage11_External::TextureStorage11_External( ...@@ -1420,13 +1412,7 @@ TextureStorage11_External::TextureStorage11_External(
mTextureWidth = desc.Width; mTextureWidth = desc.Width;
mTextureHeight = desc.Height; mTextureHeight = desc.Height;
mTextureDepth = 1; mTextureDepth = 1;
mInternalFormat = glDesc.internalFormat;
mHasKeyedMutex = (desc.MiscFlags & D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX) != 0; mHasKeyedMutex = (desc.MiscFlags & D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX) != 0;
const d3d11::TextureFormat &formatInfo =
d3d11::GetTextureFormatInfo(mInternalFormat, renderer->getRenderer11DeviceCaps());
mTextureFormatSet = formatInfo.formatSet;
mSwizzleFormatSet = formatInfo.swizzleFormatSet;
} }
TextureStorage11_External::~TextureStorage11_External() TextureStorage11_External::~TextureStorage11_External()
...@@ -1558,22 +1544,21 @@ gl::Error TextureStorage11_External::getSwizzleRenderTarget(int mipLevel, ...@@ -1558,22 +1544,21 @@ gl::Error TextureStorage11_External::getSwizzleRenderTarget(int mipLevel,
TextureStorage11_EGLImage::TextureStorage11_EGLImage(Renderer11 *renderer, TextureStorage11_EGLImage::TextureStorage11_EGLImage(Renderer11 *renderer,
EGLImageD3D *eglImage, EGLImageD3D *eglImage,
RenderTarget11 *renderTarget11) RenderTarget11 *renderTarget11)
: TextureStorage11(renderer, D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE, 0), : TextureStorage11(renderer,
D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE,
0,
renderTarget11->getInternalFormat()),
mImage(eglImage), mImage(eglImage),
mCurrentRenderTarget(0), mCurrentRenderTarget(0),
mSwizzleTexture(nullptr), mSwizzleTexture(nullptr),
mSwizzleRenderTargets(gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS, nullptr) mSwizzleRenderTargets(gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS, nullptr)
{ {
mCurrentRenderTarget = reinterpret_cast<uintptr_t>(renderTarget11); mCurrentRenderTarget = reinterpret_cast<uintptr_t>(renderTarget11);
mMipLevels = 1; mMipLevels = 1;
mTextureFormatSet = &renderTarget11->getFormatSet();
mSwizzleFormatSet = &d3d11::GetANGLEFormatSet(mTextureFormatSet->swizzleFormat,
renderer->getRenderer11DeviceCaps());
mTextureWidth = renderTarget11->getWidth(); mTextureWidth = renderTarget11->getWidth();
mTextureHeight = renderTarget11->getHeight(); mTextureHeight = renderTarget11->getHeight();
mTextureDepth = 1; mTextureDepth = 1;
mInternalFormat = renderTarget11->getInternalFormat();
} }
TextureStorage11_EGLImage::~TextureStorage11_EGLImage() TextureStorage11_EGLImage::~TextureStorage11_EGLImage()
...@@ -1587,32 +1572,18 @@ TextureStorage11_EGLImage::~TextureStorage11_EGLImage() ...@@ -1587,32 +1572,18 @@ TextureStorage11_EGLImage::~TextureStorage11_EGLImage()
gl::Error TextureStorage11_EGLImage::getResource(ID3D11Resource **outResource) gl::Error TextureStorage11_EGLImage::getResource(ID3D11Resource **outResource)
{ {
gl::Error error = checkForUpdatedRenderTarget(); ANGLE_TRY(checkForUpdatedRenderTarget());
if (error.isError())
{
return error;
}
RenderTarget11 *renderTarget11 = nullptr; RenderTarget11 *renderTarget11 = nullptr;
error = getImageRenderTarget(&renderTarget11); ANGLE_TRY(getImageRenderTarget(&renderTarget11));
if (error.isError())
{
return error;
}
*outResource = renderTarget11->getTexture(); *outResource = renderTarget11->getTexture();
return gl::Error(GL_NO_ERROR); return gl::NoError();
} }
gl::Error TextureStorage11_EGLImage::getSRV(const gl::TextureState &textureState, gl::Error TextureStorage11_EGLImage::getSRV(const gl::TextureState &textureState,
ID3D11ShaderResourceView **outSRV) ID3D11ShaderResourceView **outSRV)
{ {
gl::Error error = checkForUpdatedRenderTarget(); ANGLE_TRY(checkForUpdatedRenderTarget());
if (error.isError())
{
return error;
}
return TextureStorage11::getSRV(textureState, outSRV); return TextureStorage11::getSRV(textureState, outSRV);
} }
...@@ -1703,7 +1674,7 @@ gl::Error TextureStorage11_EGLImage::getSwizzleTexture(ID3D11Resource **outTextu ...@@ -1703,7 +1674,7 @@ gl::Error TextureStorage11_EGLImage::getSwizzleTexture(ID3D11Resource **outTextu
desc.Height = mTextureHeight; desc.Height = mTextureHeight;
desc.MipLevels = mMipLevels; desc.MipLevels = mMipLevels;
desc.ArraySize = 1; desc.ArraySize = 1;
desc.Format = mSwizzleFormatSet->texFormat; desc.Format = mFormatInfo.swizzleFormatSet.texFormat;
desc.SampleDesc.Count = 1; desc.SampleDesc.Count = 1;
desc.SampleDesc.Quality = 0; desc.SampleDesc.Quality = 0;
desc.Usage = D3D11_USAGE_DEFAULT; desc.Usage = D3D11_USAGE_DEFAULT;
...@@ -1745,7 +1716,7 @@ gl::Error TextureStorage11_EGLImage::getSwizzleRenderTarget(int mipLevel, ...@@ -1745,7 +1716,7 @@ gl::Error TextureStorage11_EGLImage::getSwizzleRenderTarget(int mipLevel,
ID3D11Device *device = mRenderer->getDevice(); ID3D11Device *device = mRenderer->getDevice();
D3D11_RENDER_TARGET_VIEW_DESC rtvDesc; D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
rtvDesc.Format = mSwizzleFormatSet->rtvFormat; rtvDesc.Format = mFormatInfo.swizzleFormatSet.rtvFormat;
rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D; rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
rtvDesc.Texture2D.MipSlice = mTopLevel + mipLevel; rtvDesc.Texture2D.MipSlice = mTopLevel + mipLevel;
...@@ -1768,11 +1739,7 @@ gl::Error TextureStorage11_EGLImage::getSwizzleRenderTarget(int mipLevel, ...@@ -1768,11 +1739,7 @@ gl::Error TextureStorage11_EGLImage::getSwizzleRenderTarget(int mipLevel,
gl::Error TextureStorage11_EGLImage::checkForUpdatedRenderTarget() gl::Error TextureStorage11_EGLImage::checkForUpdatedRenderTarget()
{ {
RenderTarget11 *renderTarget11 = nullptr; RenderTarget11 *renderTarget11 = nullptr;
gl::Error error = getImageRenderTarget(&renderTarget11); ANGLE_TRY(getImageRenderTarget(&renderTarget11));
if (error.isError())
{
return error;
}
if (mCurrentRenderTarget != reinterpret_cast<uintptr_t>(renderTarget11)) if (mCurrentRenderTarget != reinterpret_cast<uintptr_t>(renderTarget11))
{ {
...@@ -1780,7 +1747,7 @@ gl::Error TextureStorage11_EGLImage::checkForUpdatedRenderTarget() ...@@ -1780,7 +1747,7 @@ gl::Error TextureStorage11_EGLImage::checkForUpdatedRenderTarget()
mCurrentRenderTarget = reinterpret_cast<uintptr_t>(renderTarget11); mCurrentRenderTarget = reinterpret_cast<uintptr_t>(renderTarget11);
} }
return gl::Error(GL_NO_ERROR); return gl::NoError();
} }
gl::Error TextureStorage11_EGLImage::createSRV(int baseLevel, gl::Error TextureStorage11_EGLImage::createSRV(int baseLevel,
...@@ -1837,14 +1804,9 @@ gl::Error TextureStorage11_EGLImage::createSRV(int baseLevel, ...@@ -1837,14 +1804,9 @@ gl::Error TextureStorage11_EGLImage::createSRV(int baseLevel,
gl::Error TextureStorage11_EGLImage::getImageRenderTarget(RenderTarget11 **outRT) const gl::Error TextureStorage11_EGLImage::getImageRenderTarget(RenderTarget11 **outRT) const
{ {
RenderTargetD3D *renderTargetD3D = nullptr; RenderTargetD3D *renderTargetD3D = nullptr;
gl::Error error = mImage->getRenderTarget(&renderTargetD3D); ANGLE_TRY(mImage->getRenderTarget(&renderTargetD3D));
if (error.isError())
{
return error;
}
*outRT = GetAs<RenderTarget11>(renderTargetD3D); *outRT = GetAs<RenderTarget11>(renderTargetD3D);
return gl::Error(GL_NO_ERROR); return gl::NoError();
} }
TextureStorage11_Cube::TextureStorage11_Cube(Renderer11 *renderer, TextureStorage11_Cube::TextureStorage11_Cube(Renderer11 *renderer,
...@@ -1859,7 +1821,8 @@ TextureStorage11_Cube::TextureStorage11_Cube(Renderer11 *renderer, ...@@ -1859,7 +1821,8 @@ TextureStorage11_Cube::TextureStorage11_Cube(Renderer11 *renderer,
GetTextureMiscFlags(internalformat, GetTextureMiscFlags(internalformat,
renderer->getRenderer11DeviceCaps(), renderer->getRenderer11DeviceCaps(),
renderTarget, renderTarget,
levels)), levels),
internalformat),
mTexture(nullptr), mTexture(nullptr),
mLevelZeroTexture(nullptr), mLevelZeroTexture(nullptr),
mUseLevelZeroTexture(hintLevelZeroOnly && levels > 1), mUseLevelZeroTexture(hintLevelZeroOnly && levels > 1),
...@@ -1880,16 +1843,9 @@ TextureStorage11_Cube::TextureStorage11_Cube(Renderer11 *renderer, ...@@ -1880,16 +1843,9 @@ TextureStorage11_Cube::TextureStorage11_Cube(Renderer11 *renderer,
mLevelZeroRenderTarget[face] = nullptr; mLevelZeroRenderTarget[face] = nullptr;
} }
mInternalFormat = internalformat;
const d3d11::TextureFormat &formatInfo =
d3d11::GetTextureFormatInfo(internalformat, renderer->getRenderer11DeviceCaps());
mTextureFormatSet = formatInfo.formatSet;
mSwizzleFormatSet = formatInfo.swizzleFormatSet;
// adjust size if needed for compressed textures // adjust size if needed for compressed textures
int height = size; int height = size;
d3d11::MakeValidSize(false, mTextureFormatSet->texFormat, &size, &height, &mTopLevel); d3d11::MakeValidSize(false, mFormatInfo.formatSet.texFormat, &size, &height, &mTopLevel);
mMipLevels = mTopLevel + levels; mMipLevels = mTopLevel + levels;
mTextureWidth = size; mTextureWidth = size;
...@@ -2252,7 +2208,7 @@ gl::Error TextureStorage11_Cube::ensureTextureExists(int mipLevels) ...@@ -2252,7 +2208,7 @@ gl::Error TextureStorage11_Cube::ensureTextureExists(int mipLevels)
desc.Height = mTextureHeight; desc.Height = mTextureHeight;
desc.MipLevels = mipLevels; desc.MipLevels = mipLevels;
desc.ArraySize = CUBE_FACE_COUNT; desc.ArraySize = CUBE_FACE_COUNT;
desc.Format = mTextureFormatSet->texFormat; desc.Format = mFormatInfo.formatSet.texFormat;
desc.SampleDesc.Count = 1; desc.SampleDesc.Count = 1;
desc.SampleDesc.Quality = 0; desc.SampleDesc.Quality = 0;
desc.Usage = D3D11_USAGE_DEFAULT; desc.Usage = D3D11_USAGE_DEFAULT;
...@@ -2344,7 +2300,7 @@ gl::Error TextureStorage11_Cube::getRenderTarget(const gl::ImageIndex &index, ...@@ -2344,7 +2300,7 @@ gl::Error TextureStorage11_Cube::getRenderTarget(const gl::ImageIndex &index,
if (!mLevelZeroRenderTarget[faceIndex]) if (!mLevelZeroRenderTarget[faceIndex])
{ {
D3D11_RENDER_TARGET_VIEW_DESC rtvDesc; D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
rtvDesc.Format = mTextureFormatSet->rtvFormat; rtvDesc.Format = mFormatInfo.formatSet.rtvFormat;
rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY; rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY;
rtvDesc.Texture2DArray.MipSlice = mTopLevel + level; rtvDesc.Texture2DArray.MipSlice = mTopLevel + level;
rtvDesc.Texture2DArray.FirstArraySlice = faceIndex; rtvDesc.Texture2DArray.FirstArraySlice = faceIndex;
...@@ -2363,8 +2319,8 @@ gl::Error TextureStorage11_Cube::getRenderTarget(const gl::ImageIndex &index, ...@@ -2363,8 +2319,8 @@ gl::Error TextureStorage11_Cube::getRenderTarget(const gl::ImageIndex &index,
ASSERT(SUCCEEDED(result)); ASSERT(SUCCEEDED(result));
mLevelZeroRenderTarget[faceIndex] = new TextureRenderTarget11( mLevelZeroRenderTarget[faceIndex] = new TextureRenderTarget11(
rtv, mLevelZeroTexture, nullptr, nullptr, mInternalFormat, getFormatSet(), rtv, mLevelZeroTexture, nullptr, nullptr, mFormatInfo.internalFormat,
getLevelWidth(level), getLevelHeight(level), 1, 0); getFormatSet(), getLevelWidth(level), getLevelHeight(level), 1, 0);
// RenderTarget will take ownership of these resources // RenderTarget will take ownership of these resources
SafeRelease(rtv); SafeRelease(rtv);
...@@ -2376,16 +2332,16 @@ gl::Error TextureStorage11_Cube::getRenderTarget(const gl::ImageIndex &index, ...@@ -2376,16 +2332,16 @@ gl::Error TextureStorage11_Cube::getRenderTarget(const gl::ImageIndex &index,
} }
ID3D11ShaderResourceView *srv = nullptr; ID3D11ShaderResourceView *srv = nullptr;
error = createRenderTargetSRV(texture, index, mTextureFormatSet->srvFormat, &srv); error = createRenderTargetSRV(texture, index, mFormatInfo.formatSet.srvFormat, &srv);
if (error.isError()) if (error.isError())
{ {
return error; return error;
} }
ID3D11ShaderResourceView *blitSRV = nullptr; ID3D11ShaderResourceView *blitSRV = nullptr;
if (mTextureFormatSet->blitSRVFormat != mTextureFormatSet->srvFormat) if (mFormatInfo.formatSet.blitSRVFormat != mFormatInfo.formatSet.srvFormat)
{ {
error = error = createRenderTargetSRV(texture, index, mFormatInfo.formatSet.blitSRVFormat,
createRenderTargetSRV(texture, index, mTextureFormatSet->blitSRVFormat, &blitSRV); &blitSRV);
if (error.isError()) if (error.isError())
{ {
SafeRelease(srv); SafeRelease(srv);
...@@ -2400,10 +2356,10 @@ gl::Error TextureStorage11_Cube::getRenderTarget(const gl::ImageIndex &index, ...@@ -2400,10 +2356,10 @@ gl::Error TextureStorage11_Cube::getRenderTarget(const gl::ImageIndex &index,
d3d11::SetDebugName(srv, "TexStorageCube.RenderTargetSRV"); d3d11::SetDebugName(srv, "TexStorageCube.RenderTargetSRV");
if (mTextureFormatSet->rtvFormat != DXGI_FORMAT_UNKNOWN) if (mFormatInfo.formatSet.rtvFormat != DXGI_FORMAT_UNKNOWN)
{ {
D3D11_RENDER_TARGET_VIEW_DESC rtvDesc; D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
rtvDesc.Format = mTextureFormatSet->rtvFormat; rtvDesc.Format = mFormatInfo.formatSet.rtvFormat;
rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY; rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY;
rtvDesc.Texture2DArray.MipSlice = mTopLevel + level; rtvDesc.Texture2DArray.MipSlice = mTopLevel + level;
rtvDesc.Texture2DArray.FirstArraySlice = faceIndex; rtvDesc.Texture2DArray.FirstArraySlice = faceIndex;
...@@ -2426,18 +2382,18 @@ gl::Error TextureStorage11_Cube::getRenderTarget(const gl::ImageIndex &index, ...@@ -2426,18 +2382,18 @@ gl::Error TextureStorage11_Cube::getRenderTarget(const gl::ImageIndex &index,
d3d11::SetDebugName(rtv, "TexStorageCube.RenderTargetRTV"); d3d11::SetDebugName(rtv, "TexStorageCube.RenderTargetRTV");
mRenderTarget[faceIndex][level] = new TextureRenderTarget11( mRenderTarget[faceIndex][level] = new TextureRenderTarget11(
rtv, texture, srv, blitSRV, mInternalFormat, getFormatSet(), getLevelWidth(level), rtv, texture, srv, blitSRV, mFormatInfo.internalFormat, getFormatSet(),
getLevelHeight(level), 1, 0); getLevelWidth(level), getLevelHeight(level), 1, 0);
// RenderTarget will take ownership of these resources // RenderTarget will take ownership of these resources
SafeRelease(rtv); SafeRelease(rtv);
SafeRelease(srv); SafeRelease(srv);
SafeRelease(blitSRV); SafeRelease(blitSRV);
} }
else if (mTextureFormatSet->dsvFormat != DXGI_FORMAT_UNKNOWN) else if (mFormatInfo.formatSet.dsvFormat != DXGI_FORMAT_UNKNOWN)
{ {
D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc; D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc;
dsvDesc.Format = mTextureFormatSet->dsvFormat; dsvDesc.Format = mFormatInfo.formatSet.dsvFormat;
dsvDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2DARRAY; dsvDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2DARRAY;
dsvDesc.Flags = 0; dsvDesc.Flags = 0;
dsvDesc.Texture2DArray.MipSlice = mTopLevel + level; dsvDesc.Texture2DArray.MipSlice = mTopLevel + level;
...@@ -2460,9 +2416,9 @@ gl::Error TextureStorage11_Cube::getRenderTarget(const gl::ImageIndex &index, ...@@ -2460,9 +2416,9 @@ gl::Error TextureStorage11_Cube::getRenderTarget(const gl::ImageIndex &index,
d3d11::SetDebugName(dsv, "TexStorageCube.RenderTargetDSV"); d3d11::SetDebugName(dsv, "TexStorageCube.RenderTargetDSV");
mRenderTarget[faceIndex][level] = mRenderTarget[faceIndex][level] = new TextureRenderTarget11(
new TextureRenderTarget11(dsv, texture, srv, mInternalFormat, getFormatSet(), dsv, texture, srv, mFormatInfo.internalFormat, getFormatSet(), getLevelWidth(level),
getLevelWidth(level), getLevelHeight(level), 1, 0); getLevelHeight(level), 1, 0);
// RenderTarget will take ownership of these resources // RenderTarget will take ownership of these resources
SafeRelease(dsv); SafeRelease(dsv);
...@@ -2560,7 +2516,7 @@ gl::Error TextureStorage11_Cube::getSwizzleTexture(ID3D11Resource **outTexture) ...@@ -2560,7 +2516,7 @@ gl::Error TextureStorage11_Cube::getSwizzleTexture(ID3D11Resource **outTexture)
desc.Height = mTextureHeight; desc.Height = mTextureHeight;
desc.MipLevels = mMipLevels; desc.MipLevels = mMipLevels;
desc.ArraySize = CUBE_FACE_COUNT; desc.ArraySize = CUBE_FACE_COUNT;
desc.Format = mSwizzleFormatSet->texFormat; desc.Format = mFormatInfo.swizzleFormatSet.texFormat;
desc.SampleDesc.Count = 1; desc.SampleDesc.Count = 1;
desc.SampleDesc.Quality = 0; desc.SampleDesc.Quality = 0;
desc.Usage = D3D11_USAGE_DEFAULT; desc.Usage = D3D11_USAGE_DEFAULT;
...@@ -2602,7 +2558,7 @@ gl::Error TextureStorage11_Cube::getSwizzleRenderTarget(int mipLevel, ...@@ -2602,7 +2558,7 @@ gl::Error TextureStorage11_Cube::getSwizzleRenderTarget(int mipLevel,
ID3D11Device *device = mRenderer->getDevice(); ID3D11Device *device = mRenderer->getDevice();
D3D11_RENDER_TARGET_VIEW_DESC rtvDesc; D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
rtvDesc.Format = mSwizzleFormatSet->rtvFormat; rtvDesc.Format = mFormatInfo.swizzleFormatSet.rtvFormat;
rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY; rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY;
rtvDesc.Texture2DArray.MipSlice = mTopLevel + mipLevel; rtvDesc.Texture2DArray.MipSlice = mTopLevel + mipLevel;
rtvDesc.Texture2DArray.FirstArraySlice = 0; rtvDesc.Texture2DArray.FirstArraySlice = 0;
...@@ -2637,7 +2593,8 @@ TextureStorage11_3D::TextureStorage11_3D(Renderer11 *renderer, ...@@ -2637,7 +2593,8 @@ TextureStorage11_3D::TextureStorage11_3D(Renderer11 *renderer,
GetTextureMiscFlags(internalformat, GetTextureMiscFlags(internalformat,
renderer->getRenderer11DeviceCaps(), renderer->getRenderer11DeviceCaps(),
renderTarget, renderTarget,
levels)) levels),
internalformat)
{ {
mTexture = nullptr; mTexture = nullptr;
mSwizzleTexture = nullptr; mSwizzleTexture = nullptr;
...@@ -2649,15 +2606,8 @@ TextureStorage11_3D::TextureStorage11_3D(Renderer11 *renderer, ...@@ -2649,15 +2606,8 @@ TextureStorage11_3D::TextureStorage11_3D(Renderer11 *renderer,
mSwizzleRenderTargets[i] = nullptr; mSwizzleRenderTargets[i] = nullptr;
} }
mInternalFormat = internalformat;
const d3d11::TextureFormat &formatInfo =
d3d11::GetTextureFormatInfo(internalformat, renderer->getRenderer11DeviceCaps());
mTextureFormatSet = formatInfo.formatSet;
mSwizzleFormatSet = formatInfo.swizzleFormatSet;
// adjust size if needed for compressed textures // adjust size if needed for compressed textures
d3d11::MakeValidSize(false, mTextureFormatSet->texFormat, &width, &height, &mTopLevel); d3d11::MakeValidSize(false, mFormatInfo.formatSet.texFormat, &width, &height, &mTopLevel);
mMipLevels = mTopLevel + levels; mMipLevels = mTopLevel + levels;
mTextureWidth = width; mTextureWidth = width;
...@@ -2797,7 +2747,7 @@ gl::Error TextureStorage11_3D::getResource(ID3D11Resource **outResource) ...@@ -2797,7 +2747,7 @@ gl::Error TextureStorage11_3D::getResource(ID3D11Resource **outResource)
desc.Height = mTextureHeight; desc.Height = mTextureHeight;
desc.Depth = mTextureDepth; desc.Depth = mTextureDepth;
desc.MipLevels = mMipLevels; desc.MipLevels = mMipLevels;
desc.Format = mTextureFormatSet->texFormat; desc.Format = mFormatInfo.formatSet.texFormat;
desc.Usage = D3D11_USAGE_DEFAULT; desc.Usage = D3D11_USAGE_DEFAULT;
desc.BindFlags = getBindFlags(); desc.BindFlags = getBindFlags();
desc.CPUAccessFlags = 0; desc.CPUAccessFlags = 0;
...@@ -2860,7 +2810,7 @@ gl::Error TextureStorage11_3D::getRenderTarget(const gl::ImageIndex &index, Rend ...@@ -2860,7 +2810,7 @@ gl::Error TextureStorage11_3D::getRenderTarget(const gl::ImageIndex &index, Rend
const int mipLevel = index.mipIndex; const int mipLevel = index.mipIndex;
ASSERT(mipLevel >= 0 && mipLevel < getLevelCount()); ASSERT(mipLevel >= 0 && mipLevel < getLevelCount());
ASSERT(mTextureFormatSet->rtvFormat != DXGI_FORMAT_UNKNOWN); ASSERT(mFormatInfo.formatSet.rtvFormat != DXGI_FORMAT_UNKNOWN);
if (!index.hasLayer()) if (!index.hasLayer())
{ {
...@@ -2890,7 +2840,7 @@ gl::Error TextureStorage11_3D::getRenderTarget(const gl::ImageIndex &index, Rend ...@@ -2890,7 +2840,7 @@ gl::Error TextureStorage11_3D::getRenderTarget(const gl::ImageIndex &index, Rend
ID3D11Device *device = mRenderer->getDevice(); ID3D11Device *device = mRenderer->getDevice();
D3D11_RENDER_TARGET_VIEW_DESC rtvDesc; D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
rtvDesc.Format = mTextureFormatSet->rtvFormat; rtvDesc.Format = mFormatInfo.formatSet.rtvFormat;
rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE3D; rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE3D;
rtvDesc.Texture3D.MipSlice = mTopLevel + mipLevel; rtvDesc.Texture3D.MipSlice = mTopLevel + mipLevel;
rtvDesc.Texture3D.FirstWSlice = 0; rtvDesc.Texture3D.FirstWSlice = 0;
...@@ -2913,7 +2863,7 @@ gl::Error TextureStorage11_3D::getRenderTarget(const gl::ImageIndex &index, Rend ...@@ -2913,7 +2863,7 @@ gl::Error TextureStorage11_3D::getRenderTarget(const gl::ImageIndex &index, Rend
d3d11::SetDebugName(rtv, "TexStorage3D.RTV"); d3d11::SetDebugName(rtv, "TexStorage3D.RTV");
mLevelRenderTargets[mipLevel] = new TextureRenderTarget11( mLevelRenderTargets[mipLevel] = new TextureRenderTarget11(
rtv, texture, srv, blitSRV, mInternalFormat, getFormatSet(), rtv, texture, srv, blitSRV, mFormatInfo.internalFormat, getFormatSet(),
getLevelWidth(mipLevel), getLevelHeight(mipLevel), getLevelDepth(mipLevel), 0); getLevelWidth(mipLevel), getLevelHeight(mipLevel), getLevelDepth(mipLevel), 0);
// RenderTarget will take ownership of these resources // RenderTarget will take ownership of these resources
...@@ -2946,7 +2896,7 @@ gl::Error TextureStorage11_3D::getRenderTarget(const gl::ImageIndex &index, Rend ...@@ -2946,7 +2896,7 @@ gl::Error TextureStorage11_3D::getRenderTarget(const gl::ImageIndex &index, Rend
ID3D11ShaderResourceView *blitSRV = nullptr; ID3D11ShaderResourceView *blitSRV = nullptr;
D3D11_RENDER_TARGET_VIEW_DESC rtvDesc; D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
rtvDesc.Format = mTextureFormatSet->rtvFormat; rtvDesc.Format = mFormatInfo.formatSet.rtvFormat;
rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE3D; rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE3D;
rtvDesc.Texture3D.MipSlice = mTopLevel + mipLevel; rtvDesc.Texture3D.MipSlice = mTopLevel + mipLevel;
rtvDesc.Texture3D.FirstWSlice = layer; rtvDesc.Texture3D.FirstWSlice = layer;
...@@ -2970,7 +2920,7 @@ gl::Error TextureStorage11_3D::getRenderTarget(const gl::ImageIndex &index, Rend ...@@ -2970,7 +2920,7 @@ gl::Error TextureStorage11_3D::getRenderTarget(const gl::ImageIndex &index, Rend
d3d11::SetDebugName(rtv, "TexStorage3D.LayerRTV"); d3d11::SetDebugName(rtv, "TexStorage3D.LayerRTV");
mLevelLayerRenderTargets[key] = new TextureRenderTarget11( mLevelLayerRenderTargets[key] = new TextureRenderTarget11(
rtv, texture, srv, blitSRV, mInternalFormat, getFormatSet(), rtv, texture, srv, blitSRV, mFormatInfo.internalFormat, getFormatSet(),
getLevelWidth(mipLevel), getLevelHeight(mipLevel), 1, 0); getLevelWidth(mipLevel), getLevelHeight(mipLevel), 1, 0);
// RenderTarget will take ownership of these resources // RenderTarget will take ownership of these resources
...@@ -2996,7 +2946,7 @@ gl::Error TextureStorage11_3D::getSwizzleTexture(ID3D11Resource **outTexture) ...@@ -2996,7 +2946,7 @@ gl::Error TextureStorage11_3D::getSwizzleTexture(ID3D11Resource **outTexture)
desc.Height = mTextureHeight; desc.Height = mTextureHeight;
desc.Depth = mTextureDepth; desc.Depth = mTextureDepth;
desc.MipLevels = mMipLevels; desc.MipLevels = mMipLevels;
desc.Format = mSwizzleFormatSet->texFormat; desc.Format = mFormatInfo.swizzleFormatSet.texFormat;
desc.Usage = D3D11_USAGE_DEFAULT; desc.Usage = D3D11_USAGE_DEFAULT;
desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET; desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
desc.CPUAccessFlags = 0; desc.CPUAccessFlags = 0;
...@@ -3035,7 +2985,7 @@ gl::Error TextureStorage11_3D::getSwizzleRenderTarget(int mipLevel, ID3D11Render ...@@ -3035,7 +2985,7 @@ gl::Error TextureStorage11_3D::getSwizzleRenderTarget(int mipLevel, ID3D11Render
ID3D11Device *device = mRenderer->getDevice(); ID3D11Device *device = mRenderer->getDevice();
D3D11_RENDER_TARGET_VIEW_DESC rtvDesc; D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
rtvDesc.Format = mSwizzleFormatSet->rtvFormat; rtvDesc.Format = mFormatInfo.swizzleFormatSet.rtvFormat;
rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE3D; rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE3D;
rtvDesc.Texture3D.MipSlice = mTopLevel + mipLevel; rtvDesc.Texture3D.MipSlice = mTopLevel + mipLevel;
rtvDesc.Texture3D.FirstWSlice = 0; rtvDesc.Texture3D.FirstWSlice = 0;
...@@ -3072,7 +3022,8 @@ TextureStorage11_2DArray::TextureStorage11_2DArray(Renderer11 *renderer, ...@@ -3072,7 +3022,8 @@ TextureStorage11_2DArray::TextureStorage11_2DArray(Renderer11 *renderer,
GetTextureMiscFlags(internalformat, GetTextureMiscFlags(internalformat,
renderer->getRenderer11DeviceCaps(), renderer->getRenderer11DeviceCaps(),
renderTarget, renderTarget,
levels)) levels),
internalformat)
{ {
mTexture = nullptr; mTexture = nullptr;
mSwizzleTexture = nullptr; mSwizzleTexture = nullptr;
...@@ -3082,15 +3033,8 @@ TextureStorage11_2DArray::TextureStorage11_2DArray(Renderer11 *renderer, ...@@ -3082,15 +3033,8 @@ TextureStorage11_2DArray::TextureStorage11_2DArray(Renderer11 *renderer,
mSwizzleRenderTargets[level] = nullptr; mSwizzleRenderTargets[level] = nullptr;
} }
mInternalFormat = internalformat;
const d3d11::TextureFormat &formatInfo =
d3d11::GetTextureFormatInfo(internalformat, renderer->getRenderer11DeviceCaps());
mTextureFormatSet = formatInfo.formatSet;
mSwizzleFormatSet = formatInfo.swizzleFormatSet;
// adjust size if needed for compressed textures // adjust size if needed for compressed textures
d3d11::MakeValidSize(false, mTextureFormatSet->texFormat, &width, &height, &mTopLevel); d3d11::MakeValidSize(false, mFormatInfo.formatSet.texFormat, &width, &height, &mTopLevel);
mMipLevels = mTopLevel + levels; mMipLevels = mTopLevel + levels;
mTextureWidth = width; mTextureWidth = width;
...@@ -3231,7 +3175,7 @@ gl::Error TextureStorage11_2DArray::getResource(ID3D11Resource **outResource) ...@@ -3231,7 +3175,7 @@ gl::Error TextureStorage11_2DArray::getResource(ID3D11Resource **outResource)
desc.Height = mTextureHeight; desc.Height = mTextureHeight;
desc.MipLevels = mMipLevels; desc.MipLevels = mMipLevels;
desc.ArraySize = mTextureDepth; desc.ArraySize = mTextureDepth;
desc.Format = mTextureFormatSet->texFormat; desc.Format = mFormatInfo.formatSet.texFormat;
desc.SampleDesc.Count = 1; desc.SampleDesc.Count = 1;
desc.SampleDesc.Quality = 0; desc.SampleDesc.Quality = 0;
desc.Usage = D3D11_USAGE_DEFAULT; desc.Usage = D3D11_USAGE_DEFAULT;
...@@ -3342,16 +3286,16 @@ gl::Error TextureStorage11_2DArray::getRenderTarget(const gl::ImageIndex &index, ...@@ -3342,16 +3286,16 @@ gl::Error TextureStorage11_2DArray::getRenderTarget(const gl::ImageIndex &index,
return error; return error;
} }
ID3D11ShaderResourceView *srv; ID3D11ShaderResourceView *srv;
error = createRenderTargetSRV(texture, index, mTextureFormatSet->srvFormat, &srv); error = createRenderTargetSRV(texture, index, mFormatInfo.formatSet.srvFormat, &srv);
if (error.isError()) if (error.isError())
{ {
return error; return error;
} }
ID3D11ShaderResourceView *blitSRV; ID3D11ShaderResourceView *blitSRV;
if (mTextureFormatSet->blitSRVFormat != mTextureFormatSet->srvFormat) if (mFormatInfo.formatSet.blitSRVFormat != mFormatInfo.formatSet.srvFormat)
{ {
error = error = createRenderTargetSRV(texture, index, mFormatInfo.formatSet.blitSRVFormat,
createRenderTargetSRV(texture, index, mTextureFormatSet->blitSRVFormat, &blitSRV); &blitSRV);
if (error.isError()) if (error.isError())
{ {
SafeRelease(srv); SafeRelease(srv);
...@@ -3366,10 +3310,10 @@ gl::Error TextureStorage11_2DArray::getRenderTarget(const gl::ImageIndex &index, ...@@ -3366,10 +3310,10 @@ gl::Error TextureStorage11_2DArray::getRenderTarget(const gl::ImageIndex &index,
d3d11::SetDebugName(srv, "TexStorage2DArray.RenderTargetSRV"); d3d11::SetDebugName(srv, "TexStorage2DArray.RenderTargetSRV");
if (mTextureFormatSet->rtvFormat != DXGI_FORMAT_UNKNOWN) if (mFormatInfo.formatSet.rtvFormat != DXGI_FORMAT_UNKNOWN)
{ {
D3D11_RENDER_TARGET_VIEW_DESC rtvDesc; D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
rtvDesc.Format = mTextureFormatSet->rtvFormat; rtvDesc.Format = mFormatInfo.formatSet.rtvFormat;
rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY; rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY;
rtvDesc.Texture2DArray.MipSlice = mTopLevel + mipLevel; rtvDesc.Texture2DArray.MipSlice = mTopLevel + mipLevel;
rtvDesc.Texture2DArray.FirstArraySlice = layer; rtvDesc.Texture2DArray.FirstArraySlice = layer;
...@@ -3392,7 +3336,7 @@ gl::Error TextureStorage11_2DArray::getRenderTarget(const gl::ImageIndex &index, ...@@ -3392,7 +3336,7 @@ gl::Error TextureStorage11_2DArray::getRenderTarget(const gl::ImageIndex &index,
d3d11::SetDebugName(rtv, "TexStorage2DArray.RenderTargetRTV"); d3d11::SetDebugName(rtv, "TexStorage2DArray.RenderTargetRTV");
mRenderTargets[key] = new TextureRenderTarget11( mRenderTargets[key] = new TextureRenderTarget11(
rtv, texture, srv, blitSRV, mInternalFormat, getFormatSet(), rtv, texture, srv, blitSRV, mFormatInfo.internalFormat, getFormatSet(),
getLevelWidth(mipLevel), getLevelHeight(mipLevel), 1, 0); getLevelWidth(mipLevel), getLevelHeight(mipLevel), 1, 0);
// RenderTarget will take ownership of these resources // RenderTarget will take ownership of these resources
...@@ -3402,10 +3346,10 @@ gl::Error TextureStorage11_2DArray::getRenderTarget(const gl::ImageIndex &index, ...@@ -3402,10 +3346,10 @@ gl::Error TextureStorage11_2DArray::getRenderTarget(const gl::ImageIndex &index,
} }
else else
{ {
ASSERT(mTextureFormatSet->dsvFormat != DXGI_FORMAT_UNKNOWN); ASSERT(mFormatInfo.formatSet.dsvFormat != DXGI_FORMAT_UNKNOWN);
D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc; D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc;
dsvDesc.Format = mTextureFormatSet->dsvFormat; dsvDesc.Format = mFormatInfo.formatSet.dsvFormat;
dsvDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2DARRAY; dsvDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2DARRAY;
dsvDesc.Texture2DArray.MipSlice = mTopLevel + mipLevel; dsvDesc.Texture2DArray.MipSlice = mTopLevel + mipLevel;
dsvDesc.Texture2DArray.FirstArraySlice = layer; dsvDesc.Texture2DArray.FirstArraySlice = layer;
...@@ -3426,9 +3370,9 @@ gl::Error TextureStorage11_2DArray::getRenderTarget(const gl::ImageIndex &index, ...@@ -3426,9 +3370,9 @@ gl::Error TextureStorage11_2DArray::getRenderTarget(const gl::ImageIndex &index,
d3d11::SetDebugName(dsv, "TexStorage2DArray.RenderTargetDSV"); d3d11::SetDebugName(dsv, "TexStorage2DArray.RenderTargetDSV");
mRenderTargets[key] = mRenderTargets[key] = new TextureRenderTarget11(
new TextureRenderTarget11(dsv, texture, srv, mInternalFormat, getFormatSet(), dsv, texture, srv, mFormatInfo.internalFormat, getFormatSet(),
getLevelWidth(mipLevel), getLevelHeight(mipLevel), 1, 0); getLevelWidth(mipLevel), getLevelHeight(mipLevel), 1, 0);
// RenderTarget will take ownership of these resources // RenderTarget will take ownership of these resources
SafeRelease(dsv); SafeRelease(dsv);
...@@ -3453,7 +3397,7 @@ gl::Error TextureStorage11_2DArray::getSwizzleTexture(ID3D11Resource **outTextur ...@@ -3453,7 +3397,7 @@ gl::Error TextureStorage11_2DArray::getSwizzleTexture(ID3D11Resource **outTextur
desc.Height = mTextureHeight; desc.Height = mTextureHeight;
desc.MipLevels = mMipLevels; desc.MipLevels = mMipLevels;
desc.ArraySize = mTextureDepth; desc.ArraySize = mTextureDepth;
desc.Format = mSwizzleFormatSet->texFormat; desc.Format = mFormatInfo.swizzleFormatSet.texFormat;
desc.SampleDesc.Count = 1; desc.SampleDesc.Count = 1;
desc.SampleDesc.Quality = 0; desc.SampleDesc.Quality = 0;
desc.Usage = D3D11_USAGE_DEFAULT; desc.Usage = D3D11_USAGE_DEFAULT;
...@@ -3495,7 +3439,7 @@ gl::Error TextureStorage11_2DArray::getSwizzleRenderTarget(int mipLevel, ...@@ -3495,7 +3439,7 @@ gl::Error TextureStorage11_2DArray::getSwizzleRenderTarget(int mipLevel,
ID3D11Device *device = mRenderer->getDevice(); ID3D11Device *device = mRenderer->getDevice();
D3D11_RENDER_TARGET_VIEW_DESC rtvDesc; D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
rtvDesc.Format = mSwizzleFormatSet->rtvFormat; rtvDesc.Format = mFormatInfo.swizzleFormatSet.rtvFormat;
rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY; rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY;
rtvDesc.Texture2DArray.MipSlice = mTopLevel + mipLevel; rtvDesc.Texture2DArray.MipSlice = mTopLevel + mipLevel;
rtvDesc.Texture2DArray.FirstArraySlice = 0; rtvDesc.Texture2DArray.FirstArraySlice = 0;
......
...@@ -82,7 +82,7 @@ class TextureStorage11 : public TextureStorage ...@@ -82,7 +82,7 @@ class TextureStorage11 : public TextureStorage
const d3d11::ANGLEFormatSet &getFormatSet() const; const d3d11::ANGLEFormatSet &getFormatSet() const;
protected: protected:
TextureStorage11(Renderer11 *renderer, UINT bindFlags, UINT miscFlags); TextureStorage11(Renderer11 *renderer, UINT bindFlags, UINT miscFlags, GLenum internalFormat);
int getLevelWidth(int mipLevel) const; int getLevelWidth(int mipLevel) const;
int getLevelHeight(int mipLevel) const; int getLevelHeight(int mipLevel) const;
int getLevelDepth(int mipLevel) const; int getLevelDepth(int mipLevel) const;
...@@ -107,9 +107,7 @@ class TextureStorage11 : public TextureStorage ...@@ -107,9 +107,7 @@ class TextureStorage11 : public TextureStorage
int mTopLevel; int mTopLevel;
unsigned int mMipLevels; unsigned int mMipLevels;
GLenum mInternalFormat; const d3d11::TextureFormat &mFormatInfo;
const d3d11::ANGLEFormatSet *mTextureFormatSet;
const d3d11::ANGLEFormatSet *mSwizzleFormatSet;
unsigned int mTextureWidth; unsigned int mTextureWidth;
unsigned int mTextureHeight; unsigned int mTextureHeight;
unsigned int mTextureDepth; unsigned int mTextureDepth;
......
...@@ -364,21 +364,21 @@ static gl::TextureCaps GenerateTextureFormatCaps(GLint maxClientVersion, GLenum ...@@ -364,21 +364,21 @@ static gl::TextureCaps GenerateTextureFormatCaps(GLint maxClientVersion, GLenum
} }
} }
textureCaps.texturable = support.query(formatInfo.formatSet->texFormat, texSupportMask); textureCaps.texturable = support.query(formatInfo.formatSet.texFormat, texSupportMask);
textureCaps.filterable = textureCaps.filterable =
support.query(formatInfo.formatSet->srvFormat, D3D11_FORMAT_SUPPORT_SHADER_SAMPLE); support.query(formatInfo.formatSet.srvFormat, D3D11_FORMAT_SUPPORT_SHADER_SAMPLE);
textureCaps.renderable = textureCaps.renderable =
(support.query(formatInfo.formatSet->rtvFormat, D3D11_FORMAT_SUPPORT_RENDER_TARGET)) || (support.query(formatInfo.formatSet.rtvFormat, D3D11_FORMAT_SUPPORT_RENDER_TARGET)) ||
(support.query(formatInfo.formatSet->dsvFormat, D3D11_FORMAT_SUPPORT_DEPTH_STENCIL)); (support.query(formatInfo.formatSet.dsvFormat, D3D11_FORMAT_SUPPORT_DEPTH_STENCIL));
DXGI_FORMAT renderFormat = DXGI_FORMAT_UNKNOWN; DXGI_FORMAT renderFormat = DXGI_FORMAT_UNKNOWN;
if (formatInfo.formatSet->dsvFormat != DXGI_FORMAT_UNKNOWN) if (formatInfo.formatSet.dsvFormat != DXGI_FORMAT_UNKNOWN)
{ {
renderFormat = formatInfo.formatSet->dsvFormat; renderFormat = formatInfo.formatSet.dsvFormat;
} }
else if (formatInfo.formatSet->rtvFormat != DXGI_FORMAT_UNKNOWN) else if (formatInfo.formatSet.rtvFormat != DXGI_FORMAT_UNKNOWN)
{ {
renderFormat = formatInfo.formatSet->rtvFormat; renderFormat = formatInfo.formatSet.rtvFormat;
} }
if (renderFormat != DXGI_FORMAT_UNKNOWN && if (renderFormat != DXGI_FORMAT_UNKNOWN &&
support.query(renderFormat, D3D11_FORMAT_SUPPORT_MULTISAMPLE_RENDERTARGET)) support.query(renderFormat, D3D11_FORMAT_SUPPORT_MULTISAMPLE_RENDERTARGET))
...@@ -1372,7 +1372,7 @@ void GenerateInitialTextureData(GLint internalFormat, ...@@ -1372,7 +1372,7 @@ void GenerateInitialTextureData(GLint internalFormat,
ASSERT(d3dFormatInfo.dataInitializerFunction != NULL); ASSERT(d3dFormatInfo.dataInitializerFunction != NULL);
const d3d11::DXGIFormatSize &dxgiFormatInfo = const d3d11::DXGIFormatSize &dxgiFormatInfo =
d3d11::GetDXGIFormatSizeInfo(d3dFormatInfo.formatSet->texFormat); d3d11::GetDXGIFormatSizeInfo(d3dFormatInfo.formatSet.texFormat);
outSubresourceData->resize(mipLevels); outSubresourceData->resize(mipLevels);
outData->resize(mipLevels); outData->resize(mipLevels);
......
...@@ -63,15 +63,13 @@ TextureFormat::TextureFormat(GLenum internalFormat, ...@@ -63,15 +63,13 @@ TextureFormat::TextureFormat(GLenum internalFormat,
const ANGLEFormat angleFormat, const ANGLEFormat angleFormat,
InitializeTextureDataFunction internalFormatInitializer, InitializeTextureDataFunction internalFormatInitializer,
const Renderer11DeviceCaps &deviceCaps) const Renderer11DeviceCaps &deviceCaps)
: dataInitializerFunction(internalFormatInitializer) : internalFormat(internalFormat),
formatSet(GetANGLEFormatSet(angleFormat, deviceCaps)),
swizzleFormatSet(GetANGLEFormatSet(formatSet.swizzleFormat, deviceCaps)),
dataInitializerFunction(internalFormatInitializer),
loadFunctions(GetLoadFunctionsMap(internalFormat, formatSet.texFormat))
{ {
formatSet = &GetANGLEFormatSet(angleFormat, deviceCaps); ASSERT(!loadFunctions.empty() || angleFormat == ANGLE_FORMAT_NONE);
swizzleFormatSet = &GetANGLEFormatSet(formatSet->swizzleFormat, deviceCaps);
// Gather all the load functions for this internal format
loadFunctions = GetLoadFunctionsMap(internalFormat, formatSet->texFormat);
ASSERT(loadFunctions.size() != 0 || angleFormat == ANGLE_FORMAT_NONE);
} }
} // namespace d3d11 } // namespace d3d11
......
...@@ -84,8 +84,9 @@ struct TextureFormat : public angle::NonCopyable ...@@ -84,8 +84,9 @@ struct TextureFormat : public angle::NonCopyable
InitializeTextureDataFunction internalFormatInitializer, InitializeTextureDataFunction internalFormatInitializer,
const Renderer11DeviceCaps &deviceCaps); const Renderer11DeviceCaps &deviceCaps);
const ANGLEFormatSet *formatSet; GLenum internalFormat;
const ANGLEFormatSet *swizzleFormatSet; const ANGLEFormatSet &formatSet;
const ANGLEFormatSet &swizzleFormatSet;
InitializeTextureDataFunction dataInitializerFunction; InitializeTextureDataFunction dataInitializerFunction;
typedef std::map<GLenum, LoadImageFunctionInfo> LoadFunctionMap; typedef std::map<GLenum, LoadImageFunctionInfo> LoadFunctionMap;
......
...@@ -130,7 +130,8 @@ GLsizei SurfaceRenderTarget9::getDepth() const ...@@ -130,7 +130,8 @@ GLsizei SurfaceRenderTarget9::getDepth() const
GLenum SurfaceRenderTarget9::getInternalFormat() const GLenum SurfaceRenderTarget9::getInternalFormat() const
{ {
return (mDepth ? mSwapChain->GetDepthBufferInternalFormat() : mSwapChain->GetRenderTargetInternalFormat()); return (mDepth ? mSwapChain->getDepthBufferInternalFormat()
: mSwapChain->getRenderTargetInternalFormat());
} }
GLsizei SurfaceRenderTarget9::getSamples() const GLsizei SurfaceRenderTarget9::getSamples() const
......
...@@ -107,7 +107,7 @@ TextureStorage9_2D::TextureStorage9_2D(Renderer9 *renderer, SwapChain9 *swapchai ...@@ -107,7 +107,7 @@ TextureStorage9_2D::TextureStorage9_2D(Renderer9 *renderer, SwapChain9 *swapchai
mTexture = surfaceTexture; mTexture = surfaceTexture;
mMipLevels = surfaceTexture->GetLevelCount(); mMipLevels = surfaceTexture->GetLevelCount();
mInternalFormat = swapchain->GetRenderTargetInternalFormat(); mInternalFormat = swapchain->getRenderTargetInternalFormat();
D3DSURFACE_DESC surfaceDesc; D3DSURFACE_DESC surfaceDesc;
surfaceTexture->GetLevelDesc(0, &surfaceDesc); surfaceTexture->GetLevelDesc(0, &surfaceDesc);
......
...@@ -67,14 +67,14 @@ TEST_P(D3D11FormatTablesTest, TestFormatSupport) ...@@ -67,14 +67,14 @@ TEST_P(D3D11FormatTablesTest, TestFormatSupport)
UINT texSupport; UINT texSupport;
bool texSuccess = bool texSuccess =
SUCCEEDED(device->CheckFormatSupport(formatInfo.formatSet->texFormat, &texSupport)); SUCCEEDED(device->CheckFormatSupport(formatInfo.formatSet.texFormat, &texSupport));
bool textureable = texSuccess && ((texSupport & texSupportMask) == texSupportMask); bool textureable = texSuccess && ((texSupport & texSupportMask) == texSupportMask);
EXPECT_EQ(textureable, textureInfo.texturable); EXPECT_EQ(textureable, textureInfo.texturable);
// Bits for filtering // Bits for filtering
UINT filterSupport; UINT filterSupport;
bool filterSuccess = bool filterSuccess =
SUCCEEDED(device->CheckFormatSupport(formatInfo.formatSet->srvFormat, &filterSupport)); SUCCEEDED(device->CheckFormatSupport(formatInfo.formatSet.srvFormat, &filterSupport));
bool filterable = filterSuccess && ((filterSupport & D3D11_FORMAT_SUPPORT_SHADER_SAMPLE) != 0); bool filterable = filterSuccess && ((filterSupport & D3D11_FORMAT_SUPPORT_SHADER_SAMPLE) != 0);
EXPECT_EQ(filterable, textureInfo.filterable); EXPECT_EQ(filterable, textureInfo.filterable);
...@@ -84,25 +84,25 @@ TEST_P(D3D11FormatTablesTest, TestFormatSupport) ...@@ -84,25 +84,25 @@ TEST_P(D3D11FormatTablesTest, TestFormatSupport)
DXGI_FORMAT renderFormat = DXGI_FORMAT_UNKNOWN; DXGI_FORMAT renderFormat = DXGI_FORMAT_UNKNOWN;
if (internalFormatInfo.depthBits > 0 || internalFormatInfo.stencilBits > 0) if (internalFormatInfo.depthBits > 0 || internalFormatInfo.stencilBits > 0)
{ {
renderFormat = formatInfo.formatSet->dsvFormat; renderFormat = formatInfo.formatSet.dsvFormat;
bool depthSuccess = SUCCEEDED( bool depthSuccess = SUCCEEDED(
device->CheckFormatSupport(formatInfo.formatSet->dsvFormat, &renderSupport)); device->CheckFormatSupport(formatInfo.formatSet.dsvFormat, &renderSupport));
renderable = renderable =
depthSuccess && ((renderSupport & D3D11_FORMAT_SUPPORT_DEPTH_STENCIL) != 0); depthSuccess && ((renderSupport & D3D11_FORMAT_SUPPORT_DEPTH_STENCIL) != 0);
if (renderable) if (renderable)
{ {
EXPECT_NE(DXGI_FORMAT_UNKNOWN, formatInfo.formatSet->dsvFormat); EXPECT_NE(DXGI_FORMAT_UNKNOWN, formatInfo.formatSet.dsvFormat);
} }
} }
else else
{ {
renderFormat = formatInfo.formatSet->rtvFormat; renderFormat = formatInfo.formatSet.rtvFormat;
bool rtSuccess = SUCCEEDED( bool rtSuccess = SUCCEEDED(
device->CheckFormatSupport(formatInfo.formatSet->rtvFormat, &renderSupport)); device->CheckFormatSupport(formatInfo.formatSet.rtvFormat, &renderSupport));
renderable = rtSuccess && ((renderSupport & D3D11_FORMAT_SUPPORT_RENDER_TARGET) != 0); renderable = rtSuccess && ((renderSupport & D3D11_FORMAT_SUPPORT_RENDER_TARGET) != 0);
if (renderable) if (renderable)
{ {
EXPECT_NE(DXGI_FORMAT_UNKNOWN, formatInfo.formatSet->rtvFormat); EXPECT_NE(DXGI_FORMAT_UNKNOWN, formatInfo.formatSet.rtvFormat);
} }
} }
EXPECT_EQ(renderable, textureInfo.renderable); EXPECT_EQ(renderable, textureInfo.renderable);
......
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