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