Commit 049743a9 by Austin Kinross Committed by Jamie Madill

Restrict depth buffer formats on D3D11 Feature Level 9_3

*_TYPELESS formats weren't supported in D3D10Level9 until Windows 8. Some Win8 D3D9 drivers don't support them either. To workaround this, we avoid _TYPELESS formats on D3D11 FL9_3. BUG=angle:856 BUG=435726 Change-Id: I280dc7f87e3a2c737c14284ebb744188e7f10616 Reviewed-on: https://chromium-review.googlesource.com/237292Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Tested-by: 's avatarAustin Kinross <aukinros@microsoft.com> Tested-by: 's avatarJamie Madill <jmadill@chromium.org>
parent 4fd18b1b
...@@ -47,7 +47,7 @@ class Image ...@@ -47,7 +47,7 @@ class Image
void markClean() {mDirty = false;} void markClean() {mDirty = false;}
virtual bool isDirty() const = 0; virtual bool isDirty() const = 0;
virtual bool redefine(RendererD3D *renderer, GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, bool forceRelease) = 0; virtual bool redefine(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, bool forceRelease) = 0;
virtual gl::Error loadData(GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, virtual gl::Error loadData(GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth,
GLint unpackAlignment, GLenum type, const void *input) = 0; GLint unpackAlignment, GLenum type, const void *input) = 0;
......
...@@ -812,12 +812,12 @@ gl::Error TextureD3D_2D::storage(GLenum target, GLsizei levels, GLenum internalf ...@@ -812,12 +812,12 @@ gl::Error TextureD3D_2D::storage(GLenum target, GLsizei levels, GLenum internalf
{ {
GLsizei levelWidth = std::max(1, width >> level); GLsizei levelWidth = std::max(1, width >> level);
GLsizei levelHeight = std::max(1, height >> level); GLsizei levelHeight = std::max(1, height >> level);
mImageArray[level]->redefine(mRenderer, GL_TEXTURE_2D, internalformat, levelWidth, levelHeight, 1, true); mImageArray[level]->redefine(GL_TEXTURE_2D, internalformat, levelWidth, levelHeight, 1, true);
} }
for (int level = levels; level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++) for (int level = levels; level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++)
{ {
mImageArray[level]->redefine(mRenderer, GL_TEXTURE_2D, GL_NONE, 0, 0, 0, true); mImageArray[level]->redefine(GL_TEXTURE_2D, GL_NONE, 0, 0, 0, true);
} }
// TODO(geofflang): Verify storage creation had no errors // TODO(geofflang): Verify storage creation had no errors
...@@ -840,7 +840,7 @@ void TextureD3D_2D::bindTexImage(egl::Surface *surface) ...@@ -840,7 +840,7 @@ void TextureD3D_2D::bindTexImage(egl::Surface *surface)
{ {
GLenum internalformat = surface->getFormat(); GLenum internalformat = surface->getFormat();
mImageArray[0]->redefine(mRenderer, GL_TEXTURE_2D, internalformat, surface->getWidth(), surface->getHeight(), 1, true); mImageArray[0]->redefine(GL_TEXTURE_2D, internalformat, surface->getWidth(), surface->getHeight(), 1, true);
if (mTexStorage) if (mTexStorage)
{ {
...@@ -864,7 +864,7 @@ void TextureD3D_2D::releaseTexImage() ...@@ -864,7 +864,7 @@ void TextureD3D_2D::releaseTexImage()
for (int i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++) for (int i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)
{ {
mImageArray[i]->redefine(mRenderer, GL_TEXTURE_2D, GL_NONE, 0, 0, 0, true); mImageArray[i]->redefine(GL_TEXTURE_2D, GL_NONE, 0, 0, 0, true);
} }
} }
...@@ -1087,7 +1087,7 @@ void TextureD3D_2D::redefineImage(GLint level, GLenum internalformat, GLsizei wi ...@@ -1087,7 +1087,7 @@ void TextureD3D_2D::redefineImage(GLint level, GLenum internalformat, GLsizei wi
const int storageHeight = std::max(1, getBaseLevelHeight() >> level); const int storageHeight = std::max(1, getBaseLevelHeight() >> level);
const GLenum storageFormat = getBaseLevelInternalFormat(); const GLenum storageFormat = getBaseLevelInternalFormat();
mImageArray[level]->redefine(mRenderer, GL_TEXTURE_2D, internalformat, width, height, 1, false); mImageArray[level]->redefine(GL_TEXTURE_2D, internalformat, width, height, 1, false);
if (mTexStorage) if (mTexStorage)
{ {
...@@ -1344,7 +1344,7 @@ gl::Error TextureD3D_Cube::storage(GLenum target, GLsizei levels, GLenum interna ...@@ -1344,7 +1344,7 @@ gl::Error TextureD3D_Cube::storage(GLenum target, GLsizei levels, GLenum interna
GLsizei mipSize = std::max(1, width >> level); GLsizei mipSize = std::max(1, width >> level);
for (int faceIndex = 0; faceIndex < 6; faceIndex++) for (int faceIndex = 0; faceIndex < 6; faceIndex++)
{ {
mImageArray[faceIndex][level]->redefine(mRenderer, GL_TEXTURE_CUBE_MAP, internalformat, mipSize, mipSize, 1, true); mImageArray[faceIndex][level]->redefine(GL_TEXTURE_CUBE_MAP, internalformat, mipSize, mipSize, 1, true);
} }
} }
...@@ -1352,7 +1352,7 @@ gl::Error TextureD3D_Cube::storage(GLenum target, GLsizei levels, GLenum interna ...@@ -1352,7 +1352,7 @@ gl::Error TextureD3D_Cube::storage(GLenum target, GLsizei levels, GLenum interna
{ {
for (int faceIndex = 0; faceIndex < 6; faceIndex++) for (int faceIndex = 0; faceIndex < 6; faceIndex++)
{ {
mImageArray[faceIndex][level]->redefine(mRenderer, GL_TEXTURE_CUBE_MAP, GL_NONE, 0, 0, 0, true); mImageArray[faceIndex][level]->redefine(GL_TEXTURE_CUBE_MAP, GL_NONE, 0, 0, 0, true);
} }
} }
...@@ -1629,7 +1629,7 @@ void TextureD3D_Cube::redefineImage(int faceIndex, GLint level, GLenum internalf ...@@ -1629,7 +1629,7 @@ void TextureD3D_Cube::redefineImage(int faceIndex, GLint level, GLenum internalf
const int storageHeight = std::max(1, getBaseLevelHeight() >> level); const int storageHeight = std::max(1, getBaseLevelHeight() >> level);
const GLenum storageFormat = getBaseLevelInternalFormat(); const GLenum storageFormat = getBaseLevelInternalFormat();
mImageArray[faceIndex][level]->redefine(mRenderer, GL_TEXTURE_CUBE_MAP, internalformat, width, height, 1, false); mImageArray[faceIndex][level]->redefine(GL_TEXTURE_CUBE_MAP, internalformat, width, height, 1, false);
if (mTexStorage) if (mTexStorage)
{ {
...@@ -1937,12 +1937,12 @@ gl::Error TextureD3D_3D::storage(GLenum target, GLsizei levels, GLenum internalf ...@@ -1937,12 +1937,12 @@ gl::Error TextureD3D_3D::storage(GLenum target, GLsizei levels, GLenum internalf
GLsizei levelWidth = std::max(1, width >> level); GLsizei levelWidth = std::max(1, width >> level);
GLsizei levelHeight = std::max(1, height >> level); GLsizei levelHeight = std::max(1, height >> level);
GLsizei levelDepth = std::max(1, depth >> level); GLsizei levelDepth = std::max(1, depth >> level);
mImageArray[level]->redefine(mRenderer, GL_TEXTURE_3D, internalformat, levelWidth, levelHeight, levelDepth, true); mImageArray[level]->redefine(GL_TEXTURE_3D, internalformat, levelWidth, levelHeight, levelDepth, true);
} }
for (int level = levels; level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++) for (int level = levels; level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++)
{ {
mImageArray[level]->redefine(mRenderer, GL_TEXTURE_3D, GL_NONE, 0, 0, 0, true); mImageArray[level]->redefine(GL_TEXTURE_3D, GL_NONE, 0, 0, 0, true);
} }
// TODO(geofflang): Verify storage creation had no errors // TODO(geofflang): Verify storage creation had no errors
...@@ -2195,7 +2195,7 @@ void TextureD3D_3D::redefineImage(GLint level, GLenum internalformat, GLsizei wi ...@@ -2195,7 +2195,7 @@ void TextureD3D_3D::redefineImage(GLint level, GLenum internalformat, GLsizei wi
const int storageDepth = std::max(1, getBaseLevelDepth() >> level); const int storageDepth = std::max(1, getBaseLevelDepth() >> level);
const GLenum storageFormat = getBaseLevelInternalFormat(); const GLenum storageFormat = getBaseLevelInternalFormat();
mImageArray[level]->redefine(mRenderer, GL_TEXTURE_3D, internalformat, width, height, depth, false); mImageArray[level]->redefine(GL_TEXTURE_3D, internalformat, width, height, depth, false);
if (mTexStorage) if (mTexStorage)
{ {
...@@ -2479,7 +2479,7 @@ gl::Error TextureD3D_2DArray::storage(GLenum target, GLsizei levels, GLenum inte ...@@ -2479,7 +2479,7 @@ gl::Error TextureD3D_2DArray::storage(GLenum target, GLsizei levels, GLenum inte
for (int layer = 0; layer < mLayerCounts[level]; layer++) for (int layer = 0; layer < mLayerCounts[level]; layer++)
{ {
mImageArray[level][layer] = ImageD3D::makeImageD3D(mRenderer->createImage()); mImageArray[level][layer] = ImageD3D::makeImageD3D(mRenderer->createImage());
mImageArray[level][layer]->redefine(mRenderer, GL_TEXTURE_2D_ARRAY, internalformat, levelWidth, mImageArray[level][layer]->redefine(GL_TEXTURE_2D_ARRAY, internalformat, levelWidth,
levelHeight, 1, true); levelHeight, 1, true);
} }
} }
...@@ -2757,7 +2757,7 @@ void TextureD3D_2DArray::redefineImage(GLint level, GLenum internalformat, GLsiz ...@@ -2757,7 +2757,7 @@ void TextureD3D_2DArray::redefineImage(GLint level, GLenum internalformat, GLsiz
for (int layer = 0; layer < mLayerCounts[level]; layer++) for (int layer = 0; layer < mLayerCounts[level]; layer++)
{ {
mImageArray[level][layer] = ImageD3D::makeImageD3D(mRenderer->createImage()); mImageArray[level][layer] = ImageD3D::makeImageD3D(mRenderer->createImage());
mImageArray[level][layer]->redefine(mRenderer, GL_TEXTURE_2D_ARRAY, internalformat, width, height, 1, false); mImageArray[level][layer]->redefine(GL_TEXTURE_2D_ARRAY, internalformat, width, height, 1, false);
} }
} }
......
...@@ -21,8 +21,8 @@ ...@@ -21,8 +21,8 @@
namespace rx namespace rx
{ {
Image11::Image11() Image11::Image11(Renderer11 *renderer)
: mRenderer(NULL), : mRenderer(renderer),
mDXGIFormat(DXGI_FORMAT_UNKNOWN), mDXGIFormat(DXGI_FORMAT_UNKNOWN),
mStagingTexture(NULL), mStagingTexture(NULL),
mStagingSubresource(0), mStagingSubresource(0),
...@@ -30,8 +30,10 @@ Image11::Image11() ...@@ -30,8 +30,10 @@ Image11::Image11()
mAssociatedStorage(NULL), mAssociatedStorage(NULL),
mAssociatedImageIndex(gl::ImageIndex::MakeInvalid()), mAssociatedImageIndex(gl::ImageIndex::MakeInvalid()),
mRecoveredFromStorageCount(0) mRecoveredFromStorageCount(0)
{ {
// mRenderer should remain unchanged during the lifetime of the Image11 object.
// This lets us safely use mRenderer (and its Feature Level) in Image11's methods.
mFeatureLevel = renderer->getFeatureLevel();
} }
Image11::~Image11() Image11::~Image11()
...@@ -91,7 +93,7 @@ bool Image11::isDirty() const ...@@ -91,7 +93,7 @@ bool Image11::isDirty() const
// AND mStagingTexture doesn't exist AND mStagingTexture doesn't need to be recovered from TextureStorage // AND mStagingTexture doesn't exist AND mStagingTexture doesn't need to be recovered from TextureStorage
// AND the texture doesn't require init data (i.e. a blank new texture will suffice) // AND the texture doesn't require init data (i.e. a blank new texture will suffice)
// then isDirty should still return false. // then isDirty should still return false.
if (mDirty && !mStagingTexture && !mRecoverFromStorage && !(d3d11::GetTextureFormatInfo(mInternalFormat).dataInitializerFunction != NULL)) if (mDirty && !mStagingTexture && !mRecoverFromStorage && !(d3d11::GetTextureFormatInfo(mInternalFormat, mFeatureLevel).dataInitializerFunction != NULL))
{ {
return false; return false;
} }
...@@ -200,7 +202,7 @@ void Image11::disassociateStorage() ...@@ -200,7 +202,7 @@ void Image11::disassociateStorage()
} }
} }
bool Image11::redefine(RendererD3D *renderer, GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, bool forceRelease) bool Image11::redefine(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, bool forceRelease)
{ {
if (mWidth != width || if (mWidth != width ||
mHeight != height || mHeight != height ||
...@@ -212,8 +214,6 @@ bool Image11::redefine(RendererD3D *renderer, GLenum target, GLenum internalform ...@@ -212,8 +214,6 @@ bool Image11::redefine(RendererD3D *renderer, GLenum target, GLenum internalform
disassociateStorage(); disassociateStorage();
mRecoveredFromStorageCount = 0; mRecoveredFromStorageCount = 0;
mRenderer = Renderer11::makeRenderer11(renderer);
mWidth = width; mWidth = width;
mHeight = height; mHeight = height;
mDepth = depth; mDepth = depth;
...@@ -221,7 +221,7 @@ bool Image11::redefine(RendererD3D *renderer, GLenum target, GLenum internalform ...@@ -221,7 +221,7 @@ bool Image11::redefine(RendererD3D *renderer, GLenum target, GLenum internalform
mTarget = target; mTarget = target;
// compute the d3d format that will be used // compute the d3d format that will be used
const d3d11::TextureFormat &formatInfo = d3d11::GetTextureFormatInfo(internalformat); const d3d11::TextureFormat &formatInfo = d3d11::GetTextureFormatInfo(internalformat, mFeatureLevel);
const d3d11::DXGIFormat &dxgiFormatInfo = d3d11::GetDXGIFormatInfo(formatInfo.texFormat); const d3d11::DXGIFormat &dxgiFormatInfo = d3d11::GetDXGIFormatInfo(formatInfo.texFormat);
mDXGIFormat = formatInfo.texFormat; mDXGIFormat = formatInfo.texFormat;
mActualFormat = dxgiFormatInfo.internalFormat; mActualFormat = dxgiFormatInfo.internalFormat;
...@@ -257,7 +257,7 @@ gl::Error Image11::loadData(GLint xoffset, GLint yoffset, GLint zoffset, GLsizei ...@@ -257,7 +257,7 @@ gl::Error Image11::loadData(GLint xoffset, GLint yoffset, GLint zoffset, GLsizei
const d3d11::DXGIFormat &dxgiFormatInfo = d3d11::GetDXGIFormatInfo(mDXGIFormat); const d3d11::DXGIFormat &dxgiFormatInfo = d3d11::GetDXGIFormatInfo(mDXGIFormat);
GLuint outputPixelSize = dxgiFormatInfo.pixelBytes; GLuint outputPixelSize = dxgiFormatInfo.pixelBytes;
const d3d11::TextureFormat &d3dFormatInfo = d3d11::GetTextureFormatInfo(mInternalFormat); const d3d11::TextureFormat &d3dFormatInfo = d3d11::GetTextureFormatInfo(mInternalFormat, mFeatureLevel);
LoadImageFunction loadFunction = d3dFormatInfo.loadFunctions.at(type); LoadImageFunction loadFunction = d3dFormatInfo.loadFunctions.at(type);
D3D11_MAPPED_SUBRESOURCE mappedImage; D3D11_MAPPED_SUBRESOURCE mappedImage;
...@@ -292,7 +292,7 @@ gl::Error Image11::loadCompressedData(GLint xoffset, GLint yoffset, GLint zoffse ...@@ -292,7 +292,7 @@ gl::Error Image11::loadCompressedData(GLint xoffset, GLint yoffset, GLint zoffse
ASSERT(xoffset % outputBlockWidth == 0); ASSERT(xoffset % outputBlockWidth == 0);
ASSERT(yoffset % outputBlockHeight == 0); ASSERT(yoffset % outputBlockHeight == 0);
const d3d11::TextureFormat &d3dFormatInfo = d3d11::GetTextureFormatInfo(mInternalFormat); const d3d11::TextureFormat &d3dFormatInfo = d3d11::GetTextureFormatInfo(mInternalFormat, mFeatureLevel);
LoadImageFunction loadFunction = d3dFormatInfo.loadFunctions.at(GL_UNSIGNED_BYTE); LoadImageFunction loadFunction = d3dFormatInfo.loadFunctions.at(GL_UNSIGNED_BYTE);
D3D11_MAPPED_SUBRESOURCE mappedImage; D3D11_MAPPED_SUBRESOURCE mappedImage;
...@@ -512,11 +512,11 @@ gl::Error Image11::createStagingTexture() ...@@ -512,11 +512,11 @@ gl::Error Image11::createStagingTexture()
desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE; desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
desc.MiscFlags = 0; desc.MiscFlags = 0;
if (d3d11::GetTextureFormatInfo(mInternalFormat).dataInitializerFunction != NULL) if (d3d11::GetTextureFormatInfo(mInternalFormat, mFeatureLevel).dataInitializerFunction != NULL)
{ {
std::vector<D3D11_SUBRESOURCE_DATA> initialData; std::vector<D3D11_SUBRESOURCE_DATA> initialData;
std::vector< std::vector<BYTE> > textureData; std::vector< std::vector<BYTE> > textureData;
d3d11::GenerateInitialTextureData(mInternalFormat, width, height, mDepth, d3d11::GenerateInitialTextureData(mInternalFormat, mFeatureLevel, width, height, mDepth,
lodOffset + 1, &initialData, &textureData); lodOffset + 1, &initialData, &textureData);
result = device->CreateTexture3D(&desc, initialData.data(), &newTexture); result = device->CreateTexture3D(&desc, initialData.data(), &newTexture);
...@@ -552,11 +552,11 @@ gl::Error Image11::createStagingTexture() ...@@ -552,11 +552,11 @@ gl::Error Image11::createStagingTexture()
desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE; desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
desc.MiscFlags = 0; desc.MiscFlags = 0;
if (d3d11::GetTextureFormatInfo(mInternalFormat).dataInitializerFunction != NULL) if (d3d11::GetTextureFormatInfo(mInternalFormat, mFeatureLevel).dataInitializerFunction != NULL)
{ {
std::vector<D3D11_SUBRESOURCE_DATA> initialData; std::vector<D3D11_SUBRESOURCE_DATA> initialData;
std::vector< std::vector<BYTE> > textureData; std::vector< std::vector<BYTE> > textureData;
d3d11::GenerateInitialTextureData(mInternalFormat, width, height, 1, d3d11::GenerateInitialTextureData(mInternalFormat, mFeatureLevel, width, height, 1,
lodOffset + 1, &initialData, &textureData); lodOffset + 1, &initialData, &textureData);
result = device->CreateTexture2D(&desc, initialData.data(), &newTexture); result = device->CreateTexture2D(&desc, initialData.data(), &newTexture);
......
...@@ -28,7 +28,7 @@ class TextureStorage11; ...@@ -28,7 +28,7 @@ class TextureStorage11;
class Image11 : public ImageD3D class Image11 : public ImageD3D
{ {
public: public:
Image11(); Image11(Renderer11 *renderer);
virtual ~Image11(); virtual ~Image11();
static Image11 *makeImage11(Image *img); static Image11 *makeImage11(Image *img);
...@@ -39,7 +39,7 @@ class Image11 : public ImageD3D ...@@ -39,7 +39,7 @@ class Image11 : public ImageD3D
virtual gl::Error copyToStorage(TextureStorage *storage, const gl::ImageIndex &index, const gl::Box &region); virtual gl::Error copyToStorage(TextureStorage *storage, const gl::ImageIndex &index, const gl::Box &region);
bool redefine(RendererD3D *renderer, GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, bool forceRelease) override; bool redefine(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, bool forceRelease) override;
DXGI_FORMAT getDXGIFormat() const; DXGI_FORMAT getDXGIFormat() const;
...@@ -71,6 +71,7 @@ class Image11 : public ImageD3D ...@@ -71,6 +71,7 @@ class Image11 : public ImageD3D
void releaseStagingTexture(); void releaseStagingTexture();
Renderer11 *mRenderer; Renderer11 *mRenderer;
D3D_FEATURE_LEVEL mFeatureLevel;
DXGI_FORMAT mDXGIFormat; DXGI_FORMAT mDXGIFormat;
ID3D11Resource *mStagingTexture; ID3D11Resource *mStagingTexture;
......
...@@ -201,7 +201,7 @@ gl::Error PixelTransfer11::copyBufferToTexture(const gl::PixelUnpackState &unpac ...@@ -201,7 +201,7 @@ gl::Error PixelTransfer11::copyBufferToTexture(const gl::PixelUnpackState &unpac
GLenum unsizedFormat = gl::GetInternalFormatInfo(destinationFormat).format; GLenum unsizedFormat = gl::GetInternalFormatInfo(destinationFormat).format;
GLenum sourceFormat = gl::GetFormatTypeInfo(unsizedFormat, sourcePixelsType).internalFormat; GLenum sourceFormat = gl::GetFormatTypeInfo(unsizedFormat, sourcePixelsType).internalFormat;
const d3d11::TextureFormat &sourceFormatInfo = d3d11::GetTextureFormatInfo(sourceFormat); const d3d11::TextureFormat &sourceFormatInfo = d3d11::GetTextureFormatInfo(sourceFormat, mRenderer->getFeatureLevel());
DXGI_FORMAT srvFormat = sourceFormatInfo.srvFormat; DXGI_FORMAT srvFormat = sourceFormatInfo.srvFormat;
ASSERT(srvFormat != DXGI_FORMAT_UNKNOWN); ASSERT(srvFormat != DXGI_FORMAT_UNKNOWN);
Buffer11 *bufferStorage11 = Buffer11::makeBuffer11(sourceBuffer.getImplementation()); Buffer11 *bufferStorage11 = Buffer11::makeBuffer11(sourceBuffer.getImplementation());
......
...@@ -328,8 +328,9 @@ unsigned int TextureRenderTarget11::getSubresourceIndex() const ...@@ -328,8 +328,9 @@ unsigned int TextureRenderTarget11::getSubresourceIndex() const
} }
SurfaceRenderTarget11::SurfaceRenderTarget11(SwapChain11 *swapChain, bool depth) SurfaceRenderTarget11::SurfaceRenderTarget11(SwapChain11 *swapChain, Renderer11 *renderer, bool depth)
: mSwapChain(swapChain), : mSwapChain(swapChain),
mRenderer(renderer),
mDepth(depth) mDepth(depth)
{ {
ASSERT(mSwapChain); ASSERT(mSwapChain);
...@@ -361,7 +362,7 @@ GLenum SurfaceRenderTarget11::getInternalFormat() const ...@@ -361,7 +362,7 @@ GLenum SurfaceRenderTarget11::getInternalFormat() const
GLenum SurfaceRenderTarget11::getActualFormat() const GLenum SurfaceRenderTarget11::getActualFormat() const
{ {
return d3d11::GetDXGIFormatInfo(d3d11::GetTextureFormatInfo(getInternalFormat()).texFormat).internalFormat; return d3d11::GetDXGIFormatInfo(d3d11::GetTextureFormatInfo(getInternalFormat(), mRenderer->getFeatureLevel()).texFormat).internalFormat;
} }
GLsizei SurfaceRenderTarget11::getSamples() const GLsizei SurfaceRenderTarget11::getSamples() const
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#define LIBANGLE_RENDERER_D3D_D3D11_RENDERTARGET11_H_ #define LIBANGLE_RENDERER_D3D_D3D11_RENDERTARGET11_H_
#include "libANGLE/renderer/RenderTarget.h" #include "libANGLE/renderer/RenderTarget.h"
#include "libANGLE/renderer/d3d/d3d11/Renderer11.h"
namespace rx namespace rx
{ {
...@@ -33,6 +34,7 @@ class RenderTarget11 : public RenderTarget ...@@ -33,6 +34,7 @@ class RenderTarget11 : public RenderTarget
private: private:
DISALLOW_COPY_AND_ASSIGN(RenderTarget11); DISALLOW_COPY_AND_ASSIGN(RenderTarget11);
D3D_FEATURE_LEVEL mFeatureLevel;
}; };
class TextureRenderTarget11 : public RenderTarget11 class TextureRenderTarget11 : public RenderTarget11
...@@ -79,7 +81,7 @@ class TextureRenderTarget11 : public RenderTarget11 ...@@ -79,7 +81,7 @@ class TextureRenderTarget11 : public RenderTarget11
class SurfaceRenderTarget11 : public RenderTarget11 class SurfaceRenderTarget11 : public RenderTarget11
{ {
public: public:
SurfaceRenderTarget11(SwapChain11 *swapChain, bool depth); SurfaceRenderTarget11(SwapChain11 *swapChain, Renderer11 *renderer, bool depth);
virtual ~SurfaceRenderTarget11(); virtual ~SurfaceRenderTarget11();
GLsizei getWidth() const override; GLsizei getWidth() const override;
...@@ -100,6 +102,7 @@ class SurfaceRenderTarget11 : public RenderTarget11 ...@@ -100,6 +102,7 @@ class SurfaceRenderTarget11 : public RenderTarget11
DISALLOW_COPY_AND_ASSIGN(SurfaceRenderTarget11); DISALLOW_COPY_AND_ASSIGN(SurfaceRenderTarget11);
SwapChain11 *mSwapChain; SwapChain11 *mSwapChain;
Renderer11 *mRenderer;
bool mDepth; bool mDepth;
}; };
......
...@@ -2328,7 +2328,7 @@ void Renderer11::setOneTimeRenderTarget(ID3D11RenderTargetView *renderTargetView ...@@ -2328,7 +2328,7 @@ void Renderer11::setOneTimeRenderTarget(ID3D11RenderTargetView *renderTargetView
gl::Error Renderer11::createRenderTarget(int width, int height, GLenum format, GLsizei samples, RenderTarget **outRT) gl::Error Renderer11::createRenderTarget(int width, int height, GLenum format, GLsizei samples, RenderTarget **outRT)
{ {
const d3d11::TextureFormat &formatInfo = d3d11::GetTextureFormatInfo(format); const d3d11::TextureFormat &formatInfo = d3d11::GetTextureFormatInfo(format, mFeatureLevel);
const gl::TextureCaps &textureCaps = getRendererTextureCaps().get(format); const gl::TextureCaps &textureCaps = getRendererTextureCaps().get(format);
GLuint supportedSamples = textureCaps.getNearestSamples(samples); GLuint supportedSamples = textureCaps.getNearestSamples(samples);
...@@ -2468,12 +2468,12 @@ DefaultAttachmentImpl *Renderer11::createDefaultAttachment(GLenum type, egl::Sur ...@@ -2468,12 +2468,12 @@ DefaultAttachmentImpl *Renderer11::createDefaultAttachment(GLenum type, egl::Sur
switch (type) switch (type)
{ {
case GL_BACK: case GL_BACK:
return new DefaultAttachmentD3D(new SurfaceRenderTarget11(swapChain, false)); return new DefaultAttachmentD3D(new SurfaceRenderTarget11(swapChain, this, false));
case GL_DEPTH: case GL_DEPTH:
if (gl::GetInternalFormatInfo(swapChain->GetDepthBufferInternalFormat()).depthBits > 0) if (gl::GetInternalFormatInfo(swapChain->GetDepthBufferInternalFormat()).depthBits > 0)
{ {
return new DefaultAttachmentD3D(new SurfaceRenderTarget11(swapChain, true)); return new DefaultAttachmentD3D(new SurfaceRenderTarget11(swapChain, this, true));
} }
else else
{ {
...@@ -2483,7 +2483,7 @@ DefaultAttachmentImpl *Renderer11::createDefaultAttachment(GLenum type, egl::Sur ...@@ -2483,7 +2483,7 @@ DefaultAttachmentImpl *Renderer11::createDefaultAttachment(GLenum type, egl::Sur
case GL_STENCIL: case GL_STENCIL:
if (gl::GetInternalFormatInfo(swapChain->GetDepthBufferInternalFormat()).stencilBits > 0) if (gl::GetInternalFormatInfo(swapChain->GetDepthBufferInternalFormat()).stencilBits > 0)
{ {
return new DefaultAttachmentD3D(new SurfaceRenderTarget11(swapChain, true)); return new DefaultAttachmentD3D(new SurfaceRenderTarget11(swapChain, this, true));
} }
else else
{ {
...@@ -2730,7 +2730,7 @@ bool Renderer11::supportsFastCopyBufferToTexture(GLenum internalFormat) const ...@@ -2730,7 +2730,7 @@ bool Renderer11::supportsFastCopyBufferToTexture(GLenum internalFormat) const
ASSERT(getRendererExtensions().pixelBufferObject); ASSERT(getRendererExtensions().pixelBufferObject);
const gl::InternalFormat &internalFormatInfo = gl::GetInternalFormatInfo(internalFormat); const gl::InternalFormat &internalFormatInfo = gl::GetInternalFormatInfo(internalFormat);
const d3d11::TextureFormat &d3d11FormatInfo = d3d11::GetTextureFormatInfo(internalFormat); const d3d11::TextureFormat &d3d11FormatInfo = d3d11::GetTextureFormatInfo(internalFormat, mFeatureLevel);
const d3d11::DXGIFormat &dxgiFormatInfo = d3d11::GetDXGIFormatInfo(d3d11FormatInfo.texFormat); const d3d11::DXGIFormat &dxgiFormatInfo = d3d11::GetDXGIFormatInfo(d3d11FormatInfo.texFormat);
// sRGB formats do not work with D3D11 buffer SRVs // sRGB formats do not work with D3D11 buffer SRVs
...@@ -2769,7 +2769,7 @@ gl::Error Renderer11::fastCopyBufferToTexture(const gl::PixelUnpackState &unpack ...@@ -2769,7 +2769,7 @@ gl::Error Renderer11::fastCopyBufferToTexture(const gl::PixelUnpackState &unpack
Image *Renderer11::createImage() Image *Renderer11::createImage()
{ {
return new Image11(); return new Image11(this);
} }
gl::Error Renderer11::generateMipmap(Image *dest, Image *src) gl::Error Renderer11::generateMipmap(Image *dest, Image *src)
......
...@@ -106,7 +106,7 @@ EGLint SwapChain11::resetOffscreenTexture(int backbufferWidth, int backbufferHei ...@@ -106,7 +106,7 @@ EGLint SwapChain11::resetOffscreenTexture(int backbufferWidth, int backbufferHei
releaseOffscreenTexture(); releaseOffscreenTexture();
const d3d11::TextureFormat &backbufferFormatInfo = d3d11::GetTextureFormatInfo(mBackBufferFormat); const d3d11::TextureFormat &backbufferFormatInfo = d3d11::GetTextureFormatInfo(mBackBufferFormat, mRenderer->getFeatureLevel());
// If the app passed in a share handle, open the resource // If the app passed in a share handle, open the resource
// See EGL_ANGLE_d3d_share_handle_client_buffer // See EGL_ANGLE_d3d_share_handle_client_buffer
...@@ -228,7 +228,7 @@ EGLint SwapChain11::resetOffscreenTexture(int backbufferWidth, int backbufferHei ...@@ -228,7 +228,7 @@ EGLint SwapChain11::resetOffscreenTexture(int backbufferWidth, int backbufferHei
ASSERT(SUCCEEDED(result)); ASSERT(SUCCEEDED(result));
d3d11::SetDebugName(mOffscreenSRView, "Offscreen back buffer shader resource"); d3d11::SetDebugName(mOffscreenSRView, "Offscreen back buffer shader resource");
const d3d11::TextureFormat &depthBufferFormatInfo = d3d11::GetTextureFormatInfo(mDepthBufferFormat); const d3d11::TextureFormat &depthBufferFormatInfo = d3d11::GetTextureFormatInfo(mDepthBufferFormat, mRenderer->getFeatureLevel());
if (mDepthBufferFormat != GL_NONE) if (mDepthBufferFormat != GL_NONE)
{ {
...@@ -241,7 +241,13 @@ EGLint SwapChain11::resetOffscreenTexture(int backbufferWidth, int backbufferHei ...@@ -241,7 +241,13 @@ EGLint SwapChain11::resetOffscreenTexture(int backbufferWidth, int backbufferHei
depthStencilTextureDesc.SampleDesc.Count = 1; depthStencilTextureDesc.SampleDesc.Count = 1;
depthStencilTextureDesc.SampleDesc.Quality = 0; depthStencilTextureDesc.SampleDesc.Quality = 0;
depthStencilTextureDesc.Usage = D3D11_USAGE_DEFAULT; depthStencilTextureDesc.Usage = D3D11_USAGE_DEFAULT;
depthStencilTextureDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL | D3D11_BIND_SHADER_RESOURCE; depthStencilTextureDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL;
if (depthBufferFormatInfo.srvFormat != DXGI_FORMAT_UNKNOWN)
{
depthStencilTextureDesc.BindFlags |= D3D11_BIND_SHADER_RESOURCE;
}
depthStencilTextureDesc.CPUAccessFlags = 0; depthStencilTextureDesc.CPUAccessFlags = 0;
depthStencilTextureDesc.MiscFlags = 0; depthStencilTextureDesc.MiscFlags = 0;
...@@ -272,15 +278,18 @@ EGLint SwapChain11::resetOffscreenTexture(int backbufferWidth, int backbufferHei ...@@ -272,15 +278,18 @@ EGLint SwapChain11::resetOffscreenTexture(int backbufferWidth, int backbufferHei
ASSERT(SUCCEEDED(result)); ASSERT(SUCCEEDED(result));
d3d11::SetDebugName(mDepthStencilDSView, "Offscreen depth stencil view"); d3d11::SetDebugName(mDepthStencilDSView, "Offscreen depth stencil view");
D3D11_SHADER_RESOURCE_VIEW_DESC depthStencilSRVDesc; if (depthBufferFormatInfo.srvFormat != DXGI_FORMAT_UNKNOWN)
depthStencilSRVDesc.Format = depthBufferFormatInfo.srvFormat; {
depthStencilSRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; D3D11_SHADER_RESOURCE_VIEW_DESC depthStencilSRVDesc;
depthStencilSRVDesc.Texture2D.MostDetailedMip = 0; depthStencilSRVDesc.Format = depthBufferFormatInfo.srvFormat;
depthStencilSRVDesc.Texture2D.MipLevels = -1; depthStencilSRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
depthStencilSRVDesc.Texture2D.MostDetailedMip = 0;
result = device->CreateShaderResourceView(mDepthStencilTexture, &depthStencilSRVDesc, &mDepthStencilSRView); depthStencilSRVDesc.Texture2D.MipLevels = -1;
ASSERT(SUCCEEDED(result));
d3d11::SetDebugName(mDepthStencilSRView, "Offscreen depth stencil shader resource"); result = device->CreateShaderResourceView(mDepthStencilTexture, &depthStencilSRVDesc, &mDepthStencilSRView);
ASSERT(SUCCEEDED(result));
d3d11::SetDebugName(mDepthStencilSRView, "Offscreen depth stencil shader resource");
}
} }
mWidth = backbufferWidth; mWidth = backbufferWidth;
...@@ -335,7 +344,7 @@ EGLint SwapChain11::resize(EGLint backbufferWidth, EGLint backbufferHeight) ...@@ -335,7 +344,7 @@ EGLint SwapChain11::resize(EGLint backbufferWidth, EGLint backbufferHeight)
// Resize swap chain // Resize swap chain
DXGI_SWAP_CHAIN_DESC desc; DXGI_SWAP_CHAIN_DESC desc;
mSwapChain->GetDesc(&desc); mSwapChain->GetDesc(&desc);
const d3d11::TextureFormat &backbufferFormatInfo = d3d11::GetTextureFormatInfo(mBackBufferFormat); const d3d11::TextureFormat &backbufferFormatInfo = d3d11::GetTextureFormatInfo(mBackBufferFormat, mRenderer->getFeatureLevel());
HRESULT result = mSwapChain->ResizeBuffers(desc.BufferCount, backbufferWidth, backbufferHeight, backbufferFormatInfo.texFormat, 0); HRESULT result = mSwapChain->ResizeBuffers(desc.BufferCount, backbufferWidth, backbufferHeight, backbufferFormatInfo.texFormat, 0);
if (FAILED(result)) if (FAILED(result))
...@@ -401,7 +410,7 @@ EGLint SwapChain11::reset(int backbufferWidth, int backbufferHeight, EGLint swap ...@@ -401,7 +410,7 @@ EGLint SwapChain11::reset(int backbufferWidth, int backbufferHeight, EGLint swap
if (mNativeWindow.getNativeWindow()) if (mNativeWindow.getNativeWindow())
{ {
const d3d11::TextureFormat &backbufferFormatInfo = d3d11::GetTextureFormatInfo(mBackBufferFormat); const d3d11::TextureFormat &backbufferFormatInfo = d3d11::GetTextureFormatInfo(mBackBufferFormat, mRenderer->getFeatureLevel());
HRESULT result = mNativeWindow.createSwapChain(device, mRenderer->getDxgiFactory(), HRESULT result = mNativeWindow.createSwapChain(device, mRenderer->getDxgiFactory(),
backbufferFormatInfo.texFormat, backbufferFormatInfo.texFormat,
......
...@@ -101,11 +101,11 @@ TextureStorage11 *TextureStorage11::makeTextureStorage11(TextureStorage *storage ...@@ -101,11 +101,11 @@ TextureStorage11 *TextureStorage11::makeTextureStorage11(TextureStorage *storage
return static_cast<TextureStorage11*>(storage); return static_cast<TextureStorage11*>(storage);
} }
DWORD TextureStorage11::GetTextureBindFlags(GLenum internalFormat, bool renderTarget) DWORD TextureStorage11::GetTextureBindFlags(GLenum internalFormat, D3D_FEATURE_LEVEL featureLevel, bool renderTarget)
{ {
UINT bindFlags = 0; UINT bindFlags = 0;
const d3d11::TextureFormat &formatInfo = d3d11::GetTextureFormatInfo(internalFormat); const d3d11::TextureFormat &formatInfo = d3d11::GetTextureFormatInfo(internalFormat, featureLevel);
if (formatInfo.srvFormat != DXGI_FORMAT_UNKNOWN) if (formatInfo.srvFormat != DXGI_FORMAT_UNKNOWN)
{ {
bindFlags |= D3D11_BIND_SHADER_RESOURCE; bindFlags |= D3D11_BIND_SHADER_RESOURCE;
...@@ -491,7 +491,7 @@ gl::Error TextureStorage11::setData(const gl::ImageIndex &index, Image *image, c ...@@ -491,7 +491,7 @@ gl::Error TextureStorage11::setData(const gl::ImageIndex &index, Image *image, c
UINT srcRowPitch = internalFormatInfo.computeRowPitch(type, width, unpack.alignment); UINT srcRowPitch = internalFormatInfo.computeRowPitch(type, width, unpack.alignment);
UINT srcDepthPitch = internalFormatInfo.computeDepthPitch(type, width, height, unpack.alignment); UINT srcDepthPitch = internalFormatInfo.computeDepthPitch(type, width, height, unpack.alignment);
const d3d11::TextureFormat &d3d11Format = d3d11::GetTextureFormatInfo(image->getInternalFormat()); const d3d11::TextureFormat &d3d11Format = d3d11::GetTextureFormatInfo(image->getInternalFormat(), mRenderer->getFeatureLevel());
const d3d11::DXGIFormat &dxgiFormatInfo = d3d11::GetDXGIFormatInfo(d3d11Format.texFormat); const d3d11::DXGIFormat &dxgiFormatInfo = d3d11::GetDXGIFormatInfo(d3d11Format.texFormat);
size_t outputPixelSize = dxgiFormatInfo.pixelBytes; size_t outputPixelSize = dxgiFormatInfo.pixelBytes;
...@@ -576,7 +576,7 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer11 *renderer, SwapChain11 *swap ...@@ -576,7 +576,7 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer11 *renderer, SwapChain11 *swap
mRenderTargetFormat = rtvDesc.Format; mRenderTargetFormat = rtvDesc.Format;
const d3d11::DXGIFormat &dxgiFormatInfo = d3d11::GetDXGIFormatInfo(mTextureFormat); const d3d11::DXGIFormat &dxgiFormatInfo = d3d11::GetDXGIFormatInfo(mTextureFormat);
const d3d11::TextureFormat &formatInfo = d3d11::GetTextureFormatInfo(dxgiFormatInfo.internalFormat); const d3d11::TextureFormat &formatInfo = d3d11::GetTextureFormatInfo(dxgiFormatInfo.internalFormat, mRenderer->getFeatureLevel());
mSwizzleTextureFormat = formatInfo.swizzleTexFormat; mSwizzleTextureFormat = formatInfo.swizzleTexFormat;
mSwizzleShaderResourceFormat = formatInfo.swizzleSRVFormat; mSwizzleShaderResourceFormat = formatInfo.swizzleSRVFormat;
mSwizzleRenderTargetFormat = formatInfo.swizzleRTVFormat; mSwizzleRenderTargetFormat = formatInfo.swizzleRTVFormat;
...@@ -587,7 +587,7 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer11 *renderer, SwapChain11 *swap ...@@ -587,7 +587,7 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer11 *renderer, SwapChain11 *swap
} }
TextureStorage11_2D::TextureStorage11_2D(Renderer11 *renderer, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, int levels) TextureStorage11_2D::TextureStorage11_2D(Renderer11 *renderer, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, int levels)
: TextureStorage11(renderer, GetTextureBindFlags(internalformat, renderTarget)), : TextureStorage11(renderer, GetTextureBindFlags(internalformat, renderer->getFeatureLevel(), renderTarget)),
mTexture(NULL), mTexture(NULL),
mSwizzleTexture(NULL) mSwizzleTexture(NULL)
{ {
...@@ -600,7 +600,7 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer11 *renderer, GLenum internalfo ...@@ -600,7 +600,7 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer11 *renderer, GLenum internalfo
mInternalFormat = internalformat; mInternalFormat = internalformat;
const d3d11::TextureFormat &formatInfo = d3d11::GetTextureFormatInfo(internalformat); const d3d11::TextureFormat &formatInfo = d3d11::GetTextureFormatInfo(internalformat, renderer->getFeatureLevel());
mTextureFormat = formatInfo.texFormat; mTextureFormat = formatInfo.texFormat;
mShaderResourceFormat = formatInfo.srvFormat; mShaderResourceFormat = formatInfo.srvFormat;
mDepthStencilFormat = formatInfo.dsvFormat; mDepthStencilFormat = formatInfo.dsvFormat;
...@@ -947,7 +947,7 @@ gl::Error TextureStorage11_2D::getSwizzleRenderTarget(int mipLevel, ID3D11Render ...@@ -947,7 +947,7 @@ gl::Error TextureStorage11_2D::getSwizzleRenderTarget(int mipLevel, ID3D11Render
} }
TextureStorage11_Cube::TextureStorage11_Cube(Renderer11 *renderer, GLenum internalformat, bool renderTarget, int size, int levels) TextureStorage11_Cube::TextureStorage11_Cube(Renderer11 *renderer, GLenum internalformat, bool renderTarget, int size, int levels)
: TextureStorage11(renderer, GetTextureBindFlags(internalformat, renderTarget)) : TextureStorage11(renderer, GetTextureBindFlags(internalformat, renderer->getFeatureLevel(), renderTarget))
{ {
mTexture = NULL; mTexture = NULL;
mSwizzleTexture = NULL; mSwizzleTexture = NULL;
...@@ -964,7 +964,7 @@ TextureStorage11_Cube::TextureStorage11_Cube(Renderer11 *renderer, GLenum intern ...@@ -964,7 +964,7 @@ TextureStorage11_Cube::TextureStorage11_Cube(Renderer11 *renderer, GLenum intern
mInternalFormat = internalformat; mInternalFormat = internalformat;
const d3d11::TextureFormat &formatInfo = d3d11::GetTextureFormatInfo(internalformat); const d3d11::TextureFormat &formatInfo = d3d11::GetTextureFormatInfo(internalformat, renderer->getFeatureLevel());
mTextureFormat = formatInfo.texFormat; mTextureFormat = formatInfo.texFormat;
mShaderResourceFormat = formatInfo.srvFormat; mShaderResourceFormat = formatInfo.srvFormat;
mDepthStencilFormat = formatInfo.dsvFormat; mDepthStencilFormat = formatInfo.dsvFormat;
...@@ -1370,7 +1370,7 @@ gl::Error TextureStorage11_Cube::getSwizzleRenderTarget(int mipLevel, ID3D11Rend ...@@ -1370,7 +1370,7 @@ gl::Error TextureStorage11_Cube::getSwizzleRenderTarget(int mipLevel, ID3D11Rend
TextureStorage11_3D::TextureStorage11_3D(Renderer11 *renderer, GLenum internalformat, bool renderTarget, TextureStorage11_3D::TextureStorage11_3D(Renderer11 *renderer, GLenum internalformat, bool renderTarget,
GLsizei width, GLsizei height, GLsizei depth, int levels) GLsizei width, GLsizei height, GLsizei depth, int levels)
: TextureStorage11(renderer, GetTextureBindFlags(internalformat, renderTarget)) : TextureStorage11(renderer, GetTextureBindFlags(internalformat, renderer->getFeatureLevel(), renderTarget))
{ {
mTexture = NULL; mTexture = NULL;
mSwizzleTexture = NULL; mSwizzleTexture = NULL;
...@@ -1384,7 +1384,7 @@ TextureStorage11_3D::TextureStorage11_3D(Renderer11 *renderer, GLenum internalfo ...@@ -1384,7 +1384,7 @@ TextureStorage11_3D::TextureStorage11_3D(Renderer11 *renderer, GLenum internalfo
mInternalFormat = internalformat; mInternalFormat = internalformat;
const d3d11::TextureFormat &formatInfo = d3d11::GetTextureFormatInfo(internalformat); const d3d11::TextureFormat &formatInfo = d3d11::GetTextureFormatInfo(internalformat, renderer->getFeatureLevel());
mTextureFormat = formatInfo.texFormat; mTextureFormat = formatInfo.texFormat;
mShaderResourceFormat = formatInfo.srvFormat; mShaderResourceFormat = formatInfo.srvFormat;
mDepthStencilFormat = formatInfo.dsvFormat; mDepthStencilFormat = formatInfo.dsvFormat;
...@@ -1756,7 +1756,7 @@ gl::Error TextureStorage11_3D::getSwizzleRenderTarget(int mipLevel, ID3D11Render ...@@ -1756,7 +1756,7 @@ gl::Error TextureStorage11_3D::getSwizzleRenderTarget(int mipLevel, ID3D11Render
TextureStorage11_2DArray::TextureStorage11_2DArray(Renderer11 *renderer, GLenum internalformat, bool renderTarget, TextureStorage11_2DArray::TextureStorage11_2DArray(Renderer11 *renderer, GLenum internalformat, bool renderTarget,
GLsizei width, GLsizei height, GLsizei depth, int levels) GLsizei width, GLsizei height, GLsizei depth, int levels)
: TextureStorage11(renderer, GetTextureBindFlags(internalformat, renderTarget)) : TextureStorage11(renderer, GetTextureBindFlags(internalformat, renderer->getFeatureLevel(), renderTarget))
{ {
mTexture = NULL; mTexture = NULL;
mSwizzleTexture = NULL; mSwizzleTexture = NULL;
...@@ -1768,7 +1768,7 @@ TextureStorage11_2DArray::TextureStorage11_2DArray(Renderer11 *renderer, GLenum ...@@ -1768,7 +1768,7 @@ TextureStorage11_2DArray::TextureStorage11_2DArray(Renderer11 *renderer, GLenum
mInternalFormat = internalformat; mInternalFormat = internalformat;
const d3d11::TextureFormat &formatInfo = d3d11::GetTextureFormatInfo(internalformat); const d3d11::TextureFormat &formatInfo = d3d11::GetTextureFormatInfo(internalformat, renderer->getFeatureLevel());
mTextureFormat = formatInfo.texFormat; mTextureFormat = formatInfo.texFormat;
mShaderResourceFormat = formatInfo.srvFormat; mShaderResourceFormat = formatInfo.srvFormat;
mDepthStencilFormat = formatInfo.dsvFormat; mDepthStencilFormat = formatInfo.dsvFormat;
......
...@@ -36,7 +36,7 @@ class TextureStorage11 : public TextureStorage ...@@ -36,7 +36,7 @@ class TextureStorage11 : public TextureStorage
static TextureStorage11 *makeTextureStorage11(TextureStorage *storage); static TextureStorage11 *makeTextureStorage11(TextureStorage *storage);
static DWORD GetTextureBindFlags(GLenum internalFormat, bool renderTarget); static DWORD GetTextureBindFlags(GLenum internalFormat, D3D_FEATURE_LEVEL featureLevel, bool renderTarget);
UINT getBindFlags() const; UINT getBindFlags() const;
......
...@@ -824,6 +824,26 @@ static inline void InsertD3D11FormatInfo(D3D11ES3FormatMap *map, GLenum internal ...@@ -824,6 +824,26 @@ static inline void InsertD3D11FormatInfo(D3D11ES3FormatMap *map, GLenum internal
map->insert(std::make_pair(internalFormat, info)); map->insert(std::make_pair(internalFormat, info));
} }
static D3D11ES3FormatMap BuildD3D11_FL9_3FormatOverrideMap()
{
// D3D11 Feature Level 9_3 doesn't support as many texture formats as Feature Level 10_0+.
// In particular, it doesn't support:
// - *_TYPELESS formats
// - DXGI_FORMAT_D32_FLOAT_S8X24_UINT or DXGI_FORMAT_D32_FLOAT
D3D11ES3FormatMap map;
// | GL internal format | D3D11 texture format | D3D11 SRV format | D3D11 RTV format | D3D11 DSV format
InsertD3D11FormatInfo(&map, GL_DEPTH_COMPONENT16, DXGI_FORMAT_D16_UNORM, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_D16_UNORM);
InsertD3D11FormatInfo(&map, GL_DEPTH_COMPONENT24, DXGI_FORMAT_D24_UNORM_S8_UINT, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_D24_UNORM_S8_UINT);
InsertD3D11FormatInfo(&map, GL_DEPTH_COMPONENT32F, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN);
InsertD3D11FormatInfo(&map, GL_DEPTH24_STENCIL8, DXGI_FORMAT_D24_UNORM_S8_UINT, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_D24_UNORM_S8_UINT);
InsertD3D11FormatInfo(&map, GL_DEPTH32F_STENCIL8, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN);
InsertD3D11FormatInfo(&map, GL_STENCIL_INDEX8, DXGI_FORMAT_D24_UNORM_S8_UINT, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_D24_UNORM_S8_UINT);
return map;
}
static D3D11ES3FormatMap BuildD3D11FormatMap() static D3D11ES3FormatMap BuildD3D11FormatMap()
{ {
D3D11ES3FormatMap map; D3D11ES3FormatMap map;
...@@ -941,9 +961,21 @@ static D3D11ES3FormatMap BuildD3D11FormatMap() ...@@ -941,9 +961,21 @@ static D3D11ES3FormatMap BuildD3D11FormatMap()
return map; return map;
} }
const TextureFormat &GetTextureFormatInfo(GLenum internalFormat) const TextureFormat &GetTextureFormatInfo(GLenum internalFormat, D3D_FEATURE_LEVEL featureLevel)
{ {
static const D3D11ES3FormatMap formatMap = BuildD3D11FormatMap(); static const D3D11ES3FormatMap formatMap = BuildD3D11FormatMap();
static const D3D11ES3FormatMap formatMapFL9_3Override = BuildD3D11_FL9_3FormatOverrideMap();
if (featureLevel == D3D_FEATURE_LEVEL_9_3)
{
// First see if the internalFormat has a special map for FL9_3
D3D11ES3FormatMap::const_iterator fl9_3Iter = formatMapFL9_3Override.find(internalFormat);
if (fl9_3Iter != formatMapFL9_3Override.end())
{
return fl9_3Iter->second;
}
}
D3D11ES3FormatMap::const_iterator iter = formatMap.find(internalFormat); D3D11ES3FormatMap::const_iterator iter = formatMap.find(internalFormat);
if (iter != formatMap.end()) if (iter != formatMap.end())
{ {
......
...@@ -71,7 +71,7 @@ struct TextureFormat ...@@ -71,7 +71,7 @@ struct TextureFormat
typedef std::map<GLenum, LoadImageFunction> LoadFunctionMap; typedef std::map<GLenum, LoadImageFunction> LoadFunctionMap;
LoadFunctionMap loadFunctions; LoadFunctionMap loadFunctions;
}; };
const TextureFormat &GetTextureFormatInfo(GLenum internalFormat); const TextureFormat &GetTextureFormatInfo(GLenum internalFormat, D3D_FEATURE_LEVEL featureLevel);
struct VertexFormat struct VertexFormat
{ {
......
...@@ -231,7 +231,7 @@ static gl::TextureCaps GenerateTextureFormatCaps(GLenum internalFormat, ID3D11De ...@@ -231,7 +231,7 @@ static gl::TextureCaps GenerateTextureFormatCaps(GLenum internalFormat, ID3D11De
{ {
gl::TextureCaps textureCaps; gl::TextureCaps textureCaps;
const d3d11::TextureFormat &formatInfo = d3d11::GetTextureFormatInfo(internalFormat); const d3d11::TextureFormat &formatInfo = d3d11::GetTextureFormatInfo(internalFormat, device->GetFeatureLevel());
UINT formatSupport; UINT formatSupport;
if (SUCCEEDED(device->CheckFormatSupport(formatInfo.texFormat, &formatSupport))) if (SUCCEEDED(device->CheckFormatSupport(formatInfo.texFormat, &formatSupport)))
...@@ -1015,11 +1015,11 @@ void MakeValidSize(bool isImage, DXGI_FORMAT format, GLsizei *requestWidth, GLsi ...@@ -1015,11 +1015,11 @@ void MakeValidSize(bool isImage, DXGI_FORMAT format, GLsizei *requestWidth, GLsi
*levelOffset = upsampleCount; *levelOffset = upsampleCount;
} }
void GenerateInitialTextureData(GLint internalFormat, GLuint width, GLuint height, GLuint depth, void GenerateInitialTextureData(GLint internalFormat, D3D_FEATURE_LEVEL featureLevel, GLuint width, GLuint height, GLuint depth,
GLuint mipLevels, std::vector<D3D11_SUBRESOURCE_DATA> *outSubresourceData, GLuint mipLevels, std::vector<D3D11_SUBRESOURCE_DATA> *outSubresourceData,
std::vector< std::vector<BYTE> > *outData) std::vector< std::vector<BYTE> > *outData)
{ {
const d3d11::TextureFormat &d3dFormatInfo = d3d11::GetTextureFormatInfo(internalFormat); const d3d11::TextureFormat &d3dFormatInfo = d3d11::GetTextureFormatInfo(internalFormat, featureLevel);
ASSERT(d3dFormatInfo.dataInitializerFunction != NULL); ASSERT(d3dFormatInfo.dataInitializerFunction != NULL);
const d3d11::DXGIFormat &dxgiFormatInfo = d3d11::GetDXGIFormatInfo(d3dFormatInfo.texFormat); const d3d11::DXGIFormat &dxgiFormatInfo = d3d11::GetDXGIFormatInfo(d3dFormatInfo.texFormat);
......
...@@ -59,7 +59,7 @@ namespace d3d11 ...@@ -59,7 +59,7 @@ namespace d3d11
void MakeValidSize(bool isImage, DXGI_FORMAT format, GLsizei *requestWidth, GLsizei *requestHeight, int *levelOffset); void MakeValidSize(bool isImage, DXGI_FORMAT format, GLsizei *requestWidth, GLsizei *requestHeight, int *levelOffset);
void GenerateInitialTextureData(GLint internalFormat, GLuint width, GLuint height, GLuint depth, void GenerateInitialTextureData(GLint internalFormat, D3D_FEATURE_LEVEL featureLevel, GLuint width, GLuint height, GLuint depth,
GLuint mipLevels, std::vector<D3D11_SUBRESOURCE_DATA> *outSubresourceData, GLuint mipLevels, std::vector<D3D11_SUBRESOURCE_DATA> *outSubresourceData,
std::vector< std::vector<BYTE> > *outData); std::vector< std::vector<BYTE> > *outData);
......
...@@ -21,13 +21,15 @@ ...@@ -21,13 +21,15 @@
namespace rx namespace rx
{ {
Image9::Image9() Image9::Image9(Renderer9 *renderer)
{ {
mSurface = NULL; mSurface = NULL;
mRenderer = NULL; mRenderer = NULL;
mD3DPool = D3DPOOL_SYSTEMMEM; mD3DPool = D3DPOOL_SYSTEMMEM;
mD3DFormat = D3DFMT_UNKNOWN; mD3DFormat = D3DFMT_UNKNOWN;
mRenderer = renderer;
} }
Image9::~Image9() Image9::~Image9()
...@@ -167,7 +169,7 @@ gl::Error Image9::copyLockableSurfaces(IDirect3DSurface9 *dest, IDirect3DSurface ...@@ -167,7 +169,7 @@ gl::Error Image9::copyLockableSurfaces(IDirect3DSurface9 *dest, IDirect3DSurface
return gl::Error(GL_NO_ERROR); return gl::Error(GL_NO_ERROR);
} }
bool Image9::redefine(RendererD3D *renderer, GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, bool forceRelease) bool Image9::redefine(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, bool forceRelease)
{ {
// 3D textures are not supported by the D3D9 backend. // 3D textures are not supported by the D3D9 backend.
ASSERT(depth <= 1); ASSERT(depth <= 1);
...@@ -181,8 +183,6 @@ bool Image9::redefine(RendererD3D *renderer, GLenum target, GLenum internalforma ...@@ -181,8 +183,6 @@ bool Image9::redefine(RendererD3D *renderer, GLenum target, GLenum internalforma
mInternalFormat != internalformat || mInternalFormat != internalformat ||
forceRelease) forceRelease)
{ {
mRenderer = Renderer9::makeRenderer9(renderer);
mWidth = width; mWidth = width;
mHeight = height; mHeight = height;
mDepth = depth; mDepth = depth;
......
...@@ -25,7 +25,7 @@ class Renderer9; ...@@ -25,7 +25,7 @@ class Renderer9;
class Image9 : public ImageD3D class Image9 : public ImageD3D
{ {
public: public:
Image9(); Image9(Renderer9 *renderer);
~Image9(); ~Image9();
static Image9 *makeImage9(Image *img); static Image9 *makeImage9(Image *img);
...@@ -34,7 +34,7 @@ class Image9 : public ImageD3D ...@@ -34,7 +34,7 @@ class Image9 : public ImageD3D
static gl::Error generateMip(IDirect3DSurface9 *destSurface, IDirect3DSurface9 *sourceSurface); static gl::Error generateMip(IDirect3DSurface9 *destSurface, IDirect3DSurface9 *sourceSurface);
static gl::Error copyLockableSurfaces(IDirect3DSurface9 *dest, IDirect3DSurface9 *source); static gl::Error copyLockableSurfaces(IDirect3DSurface9 *dest, IDirect3DSurface9 *source);
bool redefine(RendererD3D *renderer, GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, bool forceRelease) override; bool redefine(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, bool forceRelease) override;
D3DFORMAT getD3DFormat() const; D3DFORMAT getD3DFormat() const;
......
...@@ -2750,7 +2750,7 @@ gl::Error Renderer9::copyToRenderTarget(IDirect3DSurface9 *dest, IDirect3DSurfac ...@@ -2750,7 +2750,7 @@ gl::Error Renderer9::copyToRenderTarget(IDirect3DSurface9 *dest, IDirect3DSurfac
Image *Renderer9::createImage() Image *Renderer9::createImage()
{ {
return new Image9(); return new Image9(this);
} }
gl::Error Renderer9::generateMipmap(Image *dest, Image *src) gl::Error Renderer9::generateMipmap(Image *dest, Image *src)
......
...@@ -2,9 +2,7 @@ ...@@ -2,9 +2,7 @@
// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against. // Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against.
// D3D11 Feature Level 9_3 uses different D3D formats for vertex attribs compared to Feature Levels 10_0+, so we should test them separately. // D3D11 Feature Level 9_3 uses different D3D formats for vertex attribs compared to Feature Levels 10_0+, so we should test them separately.
// TODO(jmadill): Re-enable on FL9_3 once we fix support on Windows 7 ANGLE_TYPED_TEST_CASE(VertexAttributeTest, ES2_D3D9, ES2_D3D11, ES2_D3D11_FL9_3);
// See: https://code.google.com/p/angleproject/issues/detail?id=856
ANGLE_TYPED_TEST_CASE(VertexAttributeTest, ES2_D3D9, ES2_D3D11);
template<typename T> template<typename T>
class VertexAttributeTest : public ANGLETest class VertexAttributeTest : public ANGLETest
......
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