Commit 26143fdd by Xinghua Cao Committed by Commit Bot

ES31: Support bindImageTexture on Texture2D for compute shaders on D3D

BUG=angleproject:1987 TEST=angle_end2end_tests Change-Id: I3b0afb441a41dbd7f204b1d1bba7884c8d203ce1 Reviewed-on: https://chromium-review.googlesource.com/749004 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org>
parent 10d41397
......@@ -25,7 +25,7 @@
// Version number for shader translation API.
// It is incremented every time the API changes.
#define ANGLE_SH_VERSION 193
#define ANGLE_SH_VERSION 194
enum ShShaderSpec
{
......
......@@ -170,6 +170,8 @@ struct Uniform : public VariableWithLocation
int binding;
int offset;
bool readonly;
bool writeonly;
// Decide whether two uniforms are the same at shader link time,
// assuming one from vertex shader and the other from fragment shader.
......
......@@ -93,7 +93,7 @@ struct UniformTypeInfo final : angle::NonCopyable
{
constexpr UniformTypeInfo(GLenum type,
GLenum componentType,
GLenum samplerTextureType,
GLenum textureType,
GLenum transposedMatrixType,
GLenum boolVectorType,
int rowCount,
......@@ -107,7 +107,7 @@ struct UniformTypeInfo final : angle::NonCopyable
bool isImageType)
: type(type),
componentType(componentType),
samplerTextureType(samplerTextureType),
textureType(textureType),
transposedMatrixType(transposedMatrixType),
boolVectorType(boolVectorType),
rowCount(rowCount),
......@@ -124,7 +124,7 @@ struct UniformTypeInfo final : angle::NonCopyable
GLenum type;
GLenum componentType;
GLenum samplerTextureType;
GLenum textureType;
GLenum transposedMatrixType;
GLenum boolVectorType;
int rowCount;
......
......@@ -697,6 +697,8 @@ Uniform CollectVariablesTraverser::recordUniform(const TIntermSymbol &variable)
uniform.binding = variable.getType().getLayoutQualifier().binding;
uniform.location = variable.getType().getLayoutQualifier().location;
uniform.offset = variable.getType().getLayoutQualifier().offset;
uniform.readonly = variable.getType().getMemoryQualifier().readonly;
uniform.writeonly = variable.getType().getMemoryQualifier().writeonly;
return uniform;
}
......
......@@ -245,7 +245,8 @@ bool ShaderVariable::isSameVariableAtLinkTime(const ShaderVariable &other,
return true;
}
Uniform::Uniform() : binding(-1), offset(-1)
Uniform::Uniform() : binding(-1), offset(-1), readonly(false), writeonly(false)
{
}
......@@ -254,7 +255,11 @@ Uniform::~Uniform()
}
Uniform::Uniform(const Uniform &other)
: VariableWithLocation(other), binding(other.binding), offset(other.offset)
: VariableWithLocation(other),
binding(other.binding),
offset(other.offset),
readonly(other.readonly),
writeonly(other.writeonly)
{
}
......@@ -263,13 +268,15 @@ Uniform &Uniform::operator=(const Uniform &other)
VariableWithLocation::operator=(other);
binding = other.binding;
offset = other.offset;
readonly = other.readonly;
writeonly = other.writeonly;
return *this;
}
bool Uniform::operator==(const Uniform &other) const
{
return VariableWithLocation::operator==(other) && binding == other.binding &&
offset == other.offset;
offset == other.offset && readonly == other.readonly && writeonly == other.writeonly;
}
bool Uniform::isSameUniformAtLinkTime(const Uniform &other) const
......@@ -288,6 +295,10 @@ bool Uniform::isSameUniformAtLinkTime(const Uniform &other) const
{
return false;
}
if (readonly != other.readonly || writeonly != other.writeonly)
{
return false;
}
return VariableWithLocation::isSameVariableAtLinkTime(other, true, true);
}
......
......@@ -23,7 +23,6 @@
#include "libANGLE/renderer/ContextImpl.h"
#include "libANGLE/renderer/d3d/DynamicHLSL.h"
#include "libANGLE/renderer/d3d/FramebufferD3D.h"
#include "libANGLE/renderer/d3d/RendererD3D.h"
#include "libANGLE/renderer/d3d/ShaderD3D.h"
#include "libANGLE/renderer/d3d/ShaderExecutableD3D.h"
#include "libANGLE/renderer/d3d/VertexDataManager.h"
......@@ -53,7 +52,7 @@ void GetDefaultInputLayoutFromShader(const gl::Context *context,
{
GLenum componentType = gl::VariableComponentType(transposedType);
GLuint components = static_cast<GLuint>(gl::VariableColumnCount(transposedType));
bool pureInt = (componentType != GL_FLOAT);
bool pureInt = (componentType != GL_FLOAT);
gl::VertexFormatType defaultType =
gl::GetVertexFormatType(componentType, GL_FALSE, components, pureInt);
......@@ -111,8 +110,8 @@ bool ExpandMatrix(T *target, const GLfloat *value)
{
constexpr int targetWidth = 4;
constexpr int targetHeight = rows;
constexpr int srcWidth = cols;
constexpr int srcHeight = rows;
constexpr int srcWidth = cols;
constexpr int srcHeight = rows;
constexpr int copyWidth = std::min(targetWidth, srcWidth);
constexpr int copyHeight = std::min(targetHeight, srcHeight);
......@@ -295,6 +294,7 @@ bool UniformBlockInfo::getBlockMemberInfo(const std::string &name,
// D3DUniform Implementation
D3DUniform::D3DUniform(GLenum type,
HLSLRegisterType reg,
const std::string &nameIn,
const std::vector<unsigned int> &arraySizesIn,
bool defaultBlock)
......@@ -304,6 +304,7 @@ D3DUniform::D3DUniform(GLenum type,
vsData(nullptr),
psData(nullptr),
csData(nullptr),
regType(reg),
vsRegisterIndex(GL_INVALID_INDEX),
psRegisterIndex(GL_INVALID_INDEX),
csRegisterIndex(GL_INVALID_INDEX),
......@@ -347,6 +348,11 @@ bool D3DUniform::isSampler() const
return typeInfo.isSampler;
}
bool D3DUniform::isImage() const
{
return typeInfo.isImageType;
}
bool D3DUniform::isReferencedByVertexShader() const
{
return vsRegisterIndex != GL_INVALID_INDEX;
......@@ -557,7 +563,7 @@ void ProgramD3D::VertexExecutable::getSignature(RendererD3D *renderer,
if ((conversionType & VERTEX_CONVERT_GPU) == 0)
continue;
GLenum componentType = renderer->getVertexComponentType(vertexFormatType);
GLenum componentType = renderer->getVertexComponentType(vertexFormatType);
(*signatureOut)[index] = GetAttribType(componentType);
}
}
......@@ -592,6 +598,10 @@ ProgramD3D::Sampler::Sampler() : active(false), logicalTextureUnit(0), textureTy
{
}
ProgramD3D::Image::Image() : active(false), logicalImageUnit(0)
{
}
unsigned int ProgramD3D::mCurrentSerial = 1;
ProgramD3D::ProgramD3D(const gl::ProgramState &state, RendererD3D *renderer)
......@@ -609,6 +619,8 @@ ProgramD3D::ProgramD3D(const gl::ProgramState &state, RendererD3D *renderer)
mUsedPixelSamplerRange(0),
mUsedComputeSamplerRange(0),
mDirtySamplerMapping(true),
mUsedComputeImageRange(0),
mUsedComputeReadonlyImageRange(0),
mSerial(issueSerial()),
mVertexUniformsDirty(true),
mFragmentUniformsDirty(true),
......@@ -803,6 +815,52 @@ ProgramD3D::SamplerMapping ProgramD3D::updateSamplerMapping()
return SamplerMapping::WasDirty;
}
GLint ProgramD3D::getImageMapping(gl::ShaderType type,
unsigned int imageIndex,
bool readonly,
const gl::Caps &caps) const
{
GLint logicalImageUnit = -1;
ASSERT(imageIndex < caps.maxImageUnits);
switch (type)
{
case gl::SHADER_COMPUTE:
if (readonly && imageIndex < mReadonlyImagesCS.size() &&
mReadonlyImagesCS[imageIndex].active)
{
logicalImageUnit = mReadonlyImagesCS[imageIndex].logicalImageUnit;
}
else if (imageIndex < mImagesCS.size() && mImagesCS[imageIndex].active)
{
logicalImageUnit = mImagesCS[imageIndex].logicalImageUnit;
}
break;
// TODO(xinghua.cao@intel.com): add image mapping for vertex shader and pixel shader.
default:
UNREACHABLE();
}
if (logicalImageUnit >= 0 && logicalImageUnit < static_cast<GLint>(caps.maxImageUnits))
{
return logicalImageUnit;
}
return -1;
}
GLuint ProgramD3D::getUsedImageRange(gl::ShaderType type, bool readonly) const
{
switch (type)
{
case gl::SHADER_COMPUTE:
return readonly ? mUsedComputeReadonlyImageRange : mUsedComputeImageRange;
// TODO(xinghua.cao@intel.com): add image range of vertex shader and pixel shader.
default:
UNREACHABLE();
return 0u;
}
}
gl::LinkResult ProgramD3D::load(const gl::Context *context,
gl::InfoLog &infoLog,
gl::BinaryInputStream *stream)
......@@ -863,9 +921,29 @@ gl::LinkResult ProgramD3D::load(const gl::Context *context,
mSamplersCS.push_back(sampler);
}
const unsigned int csImageCount = stream->readInt<unsigned int>();
for (unsigned int i = 0; i < csImageCount; ++i)
{
Image image;
stream->readBool(&image.active);
stream->readInt(&image.logicalImageUnit);
mImagesCS.push_back(image);
}
const unsigned int csReadonlyImageCount = stream->readInt<unsigned int>();
for (unsigned int i = 0; i < csReadonlyImageCount; ++i)
{
Image image;
stream->readBool(&image.active);
stream->readInt(&image.logicalImageUnit);
mReadonlyImagesCS.push_back(image);
}
stream->readInt(&mUsedVertexSamplerRange);
stream->readInt(&mUsedPixelSamplerRange);
stream->readInt(&mUsedComputeSamplerRange);
stream->readInt(&mUsedComputeImageRange);
stream->readInt(&mUsedComputeReadonlyImageRange);
const unsigned int uniformCount = stream->readInt<unsigned int>();
if (stream->error())
......@@ -881,8 +959,9 @@ gl::LinkResult ProgramD3D::load(const gl::Context *context,
const gl::LinkedUniform &linkedUniform = linkedUniforms[uniformIndex];
D3DUniform *d3dUniform =
new D3DUniform(linkedUniform.type, linkedUniform.name, linkedUniform.arraySizes,
linkedUniform.isInDefaultBlock());
new D3DUniform(linkedUniform.type, HLSLRegisterType::None, linkedUniform.name,
linkedUniform.arraySizes, linkedUniform.isInDefaultBlock());
stream->readInt<HLSLRegisterType>(&d3dUniform->regType);
stream->readInt(&d3dUniform->psRegisterIndex);
stream->readInt(&d3dUniform->vsRegisterIndex);
stream->readInt(&d3dUniform->csRegisterIndex);
......@@ -1110,14 +1189,31 @@ void ProgramD3D::save(const gl::Context *context, gl::BinaryOutputStream *stream
stream->writeInt(mSamplersCS[i].textureType);
}
stream->writeInt(mImagesCS.size());
for (unsigned int i = 0; i < mImagesCS.size(); ++i)
{
stream->writeInt(mImagesCS[i].active);
stream->writeInt(mImagesCS[i].logicalImageUnit);
}
stream->writeInt(mReadonlyImagesCS.size());
for (unsigned int i = 0; i < mReadonlyImagesCS.size(); ++i)
{
stream->writeInt(mReadonlyImagesCS[i].active);
stream->writeInt(mReadonlyImagesCS[i].logicalImageUnit);
}
stream->writeInt(mUsedVertexSamplerRange);
stream->writeInt(mUsedPixelSamplerRange);
stream->writeInt(mUsedComputeSamplerRange);
stream->writeInt(mUsedComputeImageRange);
stream->writeInt(mUsedComputeReadonlyImageRange);
stream->writeInt(mD3DUniforms.size());
for (const D3DUniform *uniform : mD3DUniforms)
{
// Type, name and arraySize are redundant, so aren't stored in the binary.
stream->writeInt(static_cast<unsigned int>(uniform->regType));
stream->writeIntOrNegOne(uniform->psRegisterIndex);
stream->writeIntOrNegOne(uniform->vsRegisterIndex);
stream->writeIntOrNegOne(uniform->csRegisterIndex);
......@@ -1584,6 +1680,8 @@ gl::LinkResult ProgramD3D::link(const gl::Context *context,
if (computeShader)
{
mSamplersCS.resize(data.getCaps().maxComputeTextureImageUnits);
mImagesCS.resize(data.getCaps().maxImageUnits);
mReadonlyImagesCS.resize(data.getCaps().maxImageUnits);
defineUniformsAndAssignRegisters(context);
......@@ -1640,7 +1738,7 @@ gl::LinkResult ProgramD3D::link(const gl::Context *context,
mUsesPointSize = vertexShaderD3D->usesPointSize();
mDynamicHLSL->getPixelShaderOutputKey(data, mState, metadata, &mPixelShaderKey);
mUsesFragDepth = metadata.usesFragDepth();
mUsesFragDepth = metadata.usesFragDepth();
mUsesViewID = metadata.usesViewID();
mHasANGLEMultiviewEnabled = metadata.hasANGLEMultiviewEnabled();
......@@ -2070,6 +2168,7 @@ void ProgramD3D::defineUniformsAndAssignRegisters(const gl::Context *context)
}
assignAllSamplerRegisters();
assignAllImageRegisters();
initializeUniformStorage();
}
......@@ -2077,21 +2176,44 @@ void ProgramD3D::defineUniformBase(const gl::Shader *shader,
const sh::Uniform &uniform,
D3DUniformMap *uniformMap)
{
// Samplers get their registers assigned in assignAllSamplerRegisters.
if (uniform.isBuiltIn() || gl::IsSamplerType(uniform.type))
// Samplers get their registers assigned in assignAllSamplerRegisters, and images get their
// registers assigned in assignAllImageRegisters.
if (gl::IsSamplerType(uniform.type))
{
defineUniform(shader->getType(), uniform, uniform.name, HLSLRegisterType::Texture, nullptr,
uniformMap);
return;
}
else if (gl::IsImageType(uniform.type))
{
if (uniform.readonly)
{
defineUniform(shader->getType(), uniform, uniform.name, HLSLRegisterType::Texture,
nullptr, uniformMap);
}
else
{
defineUniform(shader->getType(), uniform, uniform.name,
HLSLRegisterType::UnorderedAccessView, nullptr, uniformMap);
}
mImageBindingMap[uniform.name] = uniform.binding;
return;
}
else if (uniform.isBuiltIn())
{
defineUniform(shader->getType(), uniform, uniform.name, nullptr, uniformMap);
defineUniform(shader->getType(), uniform, uniform.name, HLSLRegisterType::None, nullptr,
uniformMap);
return;
}
const ShaderD3D *shaderD3D = GetImplAs<ShaderD3D>(shader);
unsigned int startRegister = shaderD3D->getUniformRegister(uniform.name);
ShShaderOutput outputType = shaderD3D->getCompilerOutputType();
ShShaderOutput outputType = shaderD3D->getCompilerOutputType();
sh::HLSLBlockEncoder encoder(sh::HLSLBlockEncoder::GetStrategyFor(outputType), true);
encoder.skipRegisters(startRegister);
defineUniform(shader->getType(), uniform, uniform.name, &encoder, uniformMap);
defineUniform(shader->getType(), uniform, uniform.name, HLSLRegisterType::None, &encoder,
uniformMap);
}
D3DUniform *ProgramD3D::getD3DUniformByName(const std::string &name)
......@@ -2110,6 +2232,7 @@ D3DUniform *ProgramD3D::getD3DUniformByName(const std::string &name)
void ProgramD3D::defineStructUniformFields(GLenum shaderType,
const std::vector<sh::ShaderVariable> &fields,
const std::string &namePrefix,
const HLSLRegisterType regType,
sh::HLSLBlockEncoder *encoder,
D3DUniformMap *uniformMap)
{
......@@ -2126,11 +2249,11 @@ void ProgramD3D::defineStructUniformFields(GLenum shaderType,
// extracted out of the struct by the shader translator.
if (gl::IsSamplerType(field.type))
{
defineUniform(shaderType, field, fieldFullName, nullptr, uniformMap);
defineUniform(shaderType, field, fieldFullName, regType, nullptr, uniformMap);
}
else
{
defineUniform(shaderType, field, fieldFullName, encoder, uniformMap);
defineUniform(shaderType, field, fieldFullName, regType, encoder, uniformMap);
}
}
......@@ -2142,6 +2265,7 @@ void ProgramD3D::defineArrayOfStructsUniformFields(GLenum shaderType,
const sh::ShaderVariable &uniform,
unsigned int arrayNestingIndex,
const std::string &prefix,
const HLSLRegisterType regType,
sh::HLSLBlockEncoder *encoder,
D3DUniformMap *uniformMap)
{
......@@ -2154,11 +2278,11 @@ void ProgramD3D::defineArrayOfStructsUniformFields(GLenum shaderType,
if (arrayNestingIndex + 1u < uniform.arraySizes.size())
{
defineArrayOfStructsUniformFields(shaderType, uniform, arrayNestingIndex + 1u,
elementString, encoder, uniformMap);
elementString, regType, encoder, uniformMap);
}
else
{
defineStructUniformFields(shaderType, uniform.fields, elementString, encoder,
defineStructUniformFields(shaderType, uniform.fields, elementString, regType, encoder,
uniformMap);
}
}
......@@ -2167,6 +2291,7 @@ void ProgramD3D::defineArrayOfStructsUniformFields(GLenum shaderType,
void ProgramD3D::defineArrayUniformElements(GLenum shaderType,
const sh::ShaderVariable &uniform,
const std::string &fullName,
const HLSLRegisterType regType,
sh::HLSLBlockEncoder *encoder,
D3DUniformMap *uniformMap)
{
......@@ -2178,7 +2303,7 @@ void ProgramD3D::defineArrayUniformElements(GLenum shaderType,
for (unsigned int arrayIndex = 0u; arrayIndex < uniform.getOutermostArraySize(); ++arrayIndex)
{
std::string elementFullName = fullName + ArrayString(arrayIndex);
defineUniform(shaderType, uniformElement, elementFullName, encoder, uniformMap);
defineUniform(shaderType, uniformElement, elementFullName, regType, encoder, uniformMap);
}
if (encoder)
......@@ -2188,6 +2313,7 @@ void ProgramD3D::defineArrayUniformElements(GLenum shaderType,
void ProgramD3D::defineUniform(GLenum shaderType,
const sh::ShaderVariable &uniform,
const std::string &fullName,
const HLSLRegisterType regType,
sh::HLSLBlockEncoder *encoder,
D3DUniformMap *uniformMap)
{
......@@ -2195,18 +2321,19 @@ void ProgramD3D::defineUniform(GLenum shaderType,
{
if (uniform.isArray())
{
defineArrayOfStructsUniformFields(shaderType, uniform, 0u, fullName, encoder,
defineArrayOfStructsUniformFields(shaderType, uniform, 0u, fullName, regType, encoder,
uniformMap);
}
else
{
defineStructUniformFields(shaderType, uniform.fields, fullName, encoder, uniformMap);
defineStructUniformFields(shaderType, uniform.fields, fullName, regType, encoder,
uniformMap);
}
return;
}
if (uniform.isArrayOfArrays())
{
defineArrayUniformElements(shaderType, uniform, fullName, encoder, uniformMap);
defineArrayUniformElements(shaderType, uniform, fullName, regType, encoder, uniformMap);
return;
}
......@@ -2230,7 +2357,7 @@ void ProgramD3D::defineUniform(GLenum shaderType,
}
else
{
d3dUniform = new D3DUniform(uniform.type, fullName, uniform.arraySizes, true);
d3dUniform = new D3DUniform(uniform.type, regType, fullName, uniform.arraySizes, true);
(*uniformMap)[fullName] = d3dUniform;
}
......@@ -2490,13 +2617,102 @@ void ProgramD3D::AssignSamplers(unsigned int startSamplerIndex,
ASSERT(samplerIndex < outSamplers.size());
Sampler *sampler = &outSamplers[samplerIndex];
sampler->active = true;
sampler->textureType = typeInfo.samplerTextureType;
sampler->textureType = typeInfo.textureType;
sampler->logicalTextureUnit = 0;
*outUsedRange = std::max(samplerIndex + 1, *outUsedRange);
samplerIndex++;
} while (samplerIndex < startSamplerIndex + samplerCount);
}
void ProgramD3D::assignAllImageRegisters()
{
for (size_t uniformIndex = 0; uniformIndex < mD3DUniforms.size(); ++uniformIndex)
{
if (mD3DUniforms[uniformIndex]->isImage())
{
assignImageRegisters(uniformIndex);
}
}
}
void ProgramD3D::assignImageRegisters(size_t uniformIndex)
{
D3DUniform *d3dUniform = mD3DUniforms[uniformIndex];
ASSERT(d3dUniform->isImage());
// If the uniform is an array of arrays, then we have separate entries for each inner array in
// mD3DUniforms. However, the image register info is stored in the shader only for the
// outermost array.
std::vector<unsigned int> subscripts;
const std::string baseName = gl::ParseResourceName(d3dUniform->name, &subscripts);
unsigned int registerOffset = mState.getUniforms()[uniformIndex].flattenedOffsetInParentArrays *
d3dUniform->getArraySizeProduct();
const gl::Shader *computeShader = mState.getAttachedComputeShader();
if (computeShader)
{
const ShaderD3D *computeShaderD3D = GetImplAs<ShaderD3D>(mState.getAttachedComputeShader());
ASSERT(computeShaderD3D->hasUniform(baseName));
d3dUniform->csRegisterIndex =
computeShaderD3D->getUniformRegister(baseName) + registerOffset;
ASSERT(d3dUniform->csRegisterIndex != GL_INVALID_INDEX);
auto bindingIter = mImageBindingMap.find(baseName);
ASSERT(bindingIter != mImageBindingMap.end());
if (d3dUniform->regType == HLSLRegisterType::Texture)
{
AssignImages(d3dUniform->csRegisterIndex, bindingIter->second,
d3dUniform->getArraySizeProduct(), mReadonlyImagesCS,
&mUsedComputeReadonlyImageRange);
}
else if (d3dUniform->regType == HLSLRegisterType::UnorderedAccessView)
{
AssignImages(d3dUniform->csRegisterIndex, bindingIter->second,
d3dUniform->getArraySizeProduct(), mImagesCS, &mUsedComputeImageRange);
}
else
{
UNREACHABLE();
}
}
else
{
// TODO(xinghua.cao@intel.com): Implement image variables in vertex shader and pixel shader.
UNIMPLEMENTED();
}
}
// static
void ProgramD3D::AssignImages(unsigned int startImageIndex,
int startLogicalImageUnit,
unsigned int imageCount,
std::vector<Image> &outImages,
GLuint *outUsedRange)
{
unsigned int imageIndex = startImageIndex;
// If declare without a binding qualifier, any uniform image variable (include all elements of
// unbound image array) shoud be bound to unit zero.
if (startLogicalImageUnit == -1)
{
ASSERT(imageIndex < outImages.size());
Image *image = &outImages[imageIndex];
image->active = true;
image->logicalImageUnit = 0;
*outUsedRange = std::max(imageIndex + 1, *outUsedRange);
return;
}
unsigned int logcalImageUnit = startLogicalImageUnit;
do
{
ASSERT(imageIndex < outImages.size());
Image *image = &outImages[imageIndex];
image->active = true;
image->logicalImageUnit = logcalImageUnit;
*outUsedRange = std::max(imageIndex + 1, *outUsedRange);
imageIndex++;
logcalImageUnit++;
} while (imageIndex < startImageIndex + imageCount);
}
void ProgramD3D::reset()
{
mVertexExecutables.clear();
......@@ -2513,12 +2729,12 @@ void ProgramD3D::reset()
mVertexWorkarounds = angle::CompilerWorkaroundsD3D();
mPixelHLSL.clear();
mPixelWorkarounds = angle::CompilerWorkaroundsD3D();
mUsesFragDepth = false;
mPixelWorkarounds = angle::CompilerWorkaroundsD3D();
mUsesFragDepth = false;
mHasANGLEMultiviewEnabled = false;
mUsesViewID = false;
mPixelShaderKey.clear();
mUsesPointSize = false;
mUsesPointSize = false;
mUsesFlatInterpolation = false;
SafeDeleteContainer(mD3DUniforms);
......@@ -2531,11 +2747,15 @@ void ProgramD3D::reset()
mSamplersPS.clear();
mSamplersVS.clear();
mSamplersCS.clear();
mUsedVertexSamplerRange = 0;
mUsedPixelSamplerRange = 0;
mUsedComputeSamplerRange = 0;
mDirtySamplerMapping = true;
mImagesCS.clear();
mReadonlyImagesCS.clear();
mUsedVertexSamplerRange = 0;
mUsedPixelSamplerRange = 0;
mUsedComputeSamplerRange = 0;
mDirtySamplerMapping = true;
mUsedComputeImageRange = 0;
mUsedComputeReadonlyImageRange = 0;
mAttribLocationToD3DSemantic.fill(-1);
......
......@@ -17,6 +17,7 @@
#include "libANGLE/formatutils.h"
#include "libANGLE/renderer/ProgramImpl.h"
#include "libANGLE/renderer/d3d/DynamicHLSL.h"
#include "libANGLE/renderer/d3d/RendererD3D.h"
#include "platform/WorkaroundsD3D.h"
namespace rx
......@@ -31,22 +32,29 @@ class ShaderExecutableD3D;
#define ANGLE_COMPILE_OPTIMIZATION_LEVEL D3DCOMPILE_OPTIMIZATION_LEVEL1
#endif
enum class HLSLRegisterType : uint8_t
{
None = 0,
Texture = 1,
UnorderedAccessView = 2
};
// Helper struct representing a single shader uniform
// TODO(jmadill): Make uniform blocks shared between all programs, so we don't need separate
// register indices.
struct D3DUniform : private angle::NonCopyable
{
D3DUniform(GLenum type,
HLSLRegisterType reg,
const std::string &nameIn,
const std::vector<unsigned int> &arraySizesIn,
bool defaultBlock);
~D3DUniform();
bool isSampler() const;
bool isImage() const;
bool isArray() const { return !arraySizes.empty(); }
unsigned int getArraySizeProduct() const;
bool isReferencedByVertexShader() const;
bool isReferencedByFragmentShader() const;
bool isReferencedByComputeShader() const;
......@@ -65,6 +73,7 @@ struct D3DUniform : private angle::NonCopyable
uint8_t *csData;
// Register information.
HLSLRegisterType regType;
unsigned int vsRegisterIndex;
unsigned int psRegisterIndex;
unsigned int csRegisterIndex;
......@@ -175,6 +184,13 @@ class ProgramD3D : public ProgramImpl
SamplerMapping updateSamplerMapping();
GLint getImageMapping(gl::ShaderType type,
unsigned int imageIndex,
bool readonly,
const gl::Caps &caps) const;
GLuint getUsedImageRange(gl::ShaderType type, bool readonly) const;
GLenum getImageTextureType(gl::ShaderType type, unsigned int imageIndex, bool readonly) const;
bool usesPointSize() const { return mUsesPointSize; }
bool usesPointSpriteEmulation() const;
bool usesGeometryShader(GLenum drawMode) const;
......@@ -368,6 +384,13 @@ class ProgramD3D : public ProgramImpl
GLenum textureType;
};
struct Image
{
Image();
bool active;
GLint logicalImageUnit;
};
typedef std::map<std::string, D3DUniform *> D3DUniformMap;
void defineUniformsAndAssignRegisters(const gl::Context *context);
......@@ -377,22 +400,26 @@ class ProgramD3D : public ProgramImpl
void defineStructUniformFields(GLenum shaderType,
const std::vector<sh::ShaderVariable> &fields,
const std::string &namePrefix,
const HLSLRegisterType regType,
sh::HLSLBlockEncoder *encoder,
D3DUniformMap *uniformMap);
void defineArrayOfStructsUniformFields(GLenum shaderType,
const sh::ShaderVariable &uniform,
unsigned int arrayNestingIndex,
const std::string &prefix,
const HLSLRegisterType regType,
sh::HLSLBlockEncoder *encoder,
D3DUniformMap *uniformMap);
void defineArrayUniformElements(GLenum shaderType,
const sh::ShaderVariable &uniform,
const std::string &fullName,
const HLSLRegisterType regType,
sh::HLSLBlockEncoder *encoder,
D3DUniformMap *uniformMap);
void defineUniform(GLenum shaderType,
const sh::ShaderVariable &uniform,
const std::string &fullName,
const HLSLRegisterType regType,
sh::HLSLBlockEncoder *encoder,
D3DUniformMap *uniformMap);
void assignAllSamplerRegisters();
......@@ -404,6 +431,14 @@ class ProgramD3D : public ProgramImpl
std::vector<Sampler> &outSamplers,
GLuint *outUsedRange);
void assignAllImageRegisters();
void assignImageRegisters(size_t uniformIndex);
static void AssignImages(unsigned int startImageIndex,
int startLogicalImageUnit,
unsigned int imageCount,
std::vector<Image> &outImages,
GLuint *outUsedRange);
template <typename DestT>
void getUniformInternal(GLint location, DestT *dataOut) const;
......@@ -491,6 +526,11 @@ class ProgramD3D : public ProgramImpl
GLuint mUsedComputeSamplerRange;
bool mDirtySamplerMapping;
std::vector<Image> mImagesCS;
std::vector<Image> mReadonlyImagesCS;
GLuint mUsedComputeImageRange;
GLuint mUsedComputeReadonlyImageRange;
// Cache for pixel shader output layout to save reallocations.
std::vector<GLenum> mPixelShaderOutputLayoutCache;
Optional<size_t> mCachedPixelExecutableIndex;
......@@ -507,6 +547,7 @@ class ProgramD3D : public ProgramImpl
std::vector<D3DVarying> mStreamOutVaryings;
std::vector<D3DUniform *> mD3DUniforms;
std::map<std::string, int> mImageBindingMap;
std::vector<D3DUniformBlock> mD3DUniformBlocks;
bool mVertexUniformsDirty;
......
......@@ -211,6 +211,14 @@ HRESULT CreateResource(ID3D11Device *device,
}
HRESULT CreateResource(ID3D11Device *device,
const D3D11_UNORDERED_ACCESS_VIEW_DESC *desc,
ID3D11Resource *resource,
ID3D11UnorderedAccessView **resourceOut)
{
return device->CreateUnorderedAccessView(resource, desc, resourceOut);
}
HRESULT CreateResource(ID3D11Device *device,
const D3D11_TEXTURE2D_DESC *desc,
const D3D11_SUBRESOURCE_DATA *initData,
ID3D11Texture2D **texture)
......
......@@ -42,26 +42,28 @@ using InputElementArray = WrappedArray<D3D11_INPUT_ELEMENT_DESC>;
using ShaderData = WrappedArray<uint8_t>;
// Format: ResourceType, D3D11 type, DESC type, init data type.
#define ANGLE_RESOURCE_TYPE_OP(NAME, OP) \
OP(NAME, BlendState, ID3D11BlendState, D3D11_BLEND_DESC, void) \
OP(NAME, Buffer, ID3D11Buffer, D3D11_BUFFER_DESC, const D3D11_SUBRESOURCE_DATA) \
OP(NAME, ComputeShader, ID3D11ComputeShader, ShaderData, void) \
OP(NAME, DepthStencilState, ID3D11DepthStencilState, D3D11_DEPTH_STENCIL_DESC, void) \
OP(NAME, DepthStencilView, ID3D11DepthStencilView, D3D11_DEPTH_STENCIL_VIEW_DESC, \
ID3D11Resource) \
OP(NAME, GeometryShader, ID3D11GeometryShader, ShaderData, \
const std::vector<D3D11_SO_DECLARATION_ENTRY>) \
OP(NAME, InputLayout, ID3D11InputLayout, InputElementArray, const ShaderData) \
OP(NAME, PixelShader, ID3D11PixelShader, ShaderData, void) \
OP(NAME, Query, ID3D11Query, D3D11_QUERY_DESC, void) \
OP(NAME, RasterizerState, ID3D11RasterizerState, D3D11_RASTERIZER_DESC, void) \
OP(NAME, RenderTargetView, ID3D11RenderTargetView, D3D11_RENDER_TARGET_VIEW_DESC, \
ID3D11Resource) \
OP(NAME, SamplerState, ID3D11SamplerState, D3D11_SAMPLER_DESC, void) \
OP(NAME, ShaderResourceView, ID3D11ShaderResourceView, D3D11_SHADER_RESOURCE_VIEW_DESC, \
ID3D11Resource) \
OP(NAME, Texture2D, ID3D11Texture2D, D3D11_TEXTURE2D_DESC, const D3D11_SUBRESOURCE_DATA) \
OP(NAME, Texture3D, ID3D11Texture3D, D3D11_TEXTURE3D_DESC, const D3D11_SUBRESOURCE_DATA) \
#define ANGLE_RESOURCE_TYPE_OP(NAME, OP) \
OP(NAME, BlendState, ID3D11BlendState, D3D11_BLEND_DESC, void) \
OP(NAME, Buffer, ID3D11Buffer, D3D11_BUFFER_DESC, const D3D11_SUBRESOURCE_DATA) \
OP(NAME, ComputeShader, ID3D11ComputeShader, ShaderData, void) \
OP(NAME, DepthStencilState, ID3D11DepthStencilState, D3D11_DEPTH_STENCIL_DESC, void) \
OP(NAME, DepthStencilView, ID3D11DepthStencilView, D3D11_DEPTH_STENCIL_VIEW_DESC, \
ID3D11Resource) \
OP(NAME, GeometryShader, ID3D11GeometryShader, ShaderData, \
const std::vector<D3D11_SO_DECLARATION_ENTRY>) \
OP(NAME, InputLayout, ID3D11InputLayout, InputElementArray, const ShaderData) \
OP(NAME, PixelShader, ID3D11PixelShader, ShaderData, void) \
OP(NAME, Query, ID3D11Query, D3D11_QUERY_DESC, void) \
OP(NAME, RasterizerState, ID3D11RasterizerState, D3D11_RASTERIZER_DESC, void) \
OP(NAME, RenderTargetView, ID3D11RenderTargetView, D3D11_RENDER_TARGET_VIEW_DESC, \
ID3D11Resource) \
OP(NAME, SamplerState, ID3D11SamplerState, D3D11_SAMPLER_DESC, void) \
OP(NAME, ShaderResourceView, ID3D11ShaderResourceView, D3D11_SHADER_RESOURCE_VIEW_DESC, \
ID3D11Resource) \
OP(NAME, UnorderedAccessView, ID3D11UnorderedAccessView, D3D11_UNORDERED_ACCESS_VIEW_DESC, \
ID3D11Resource) \
OP(NAME, Texture2D, ID3D11Texture2D, D3D11_TEXTURE2D_DESC, const D3D11_SUBRESOURCE_DATA) \
OP(NAME, Texture3D, ID3D11Texture3D, D3D11_TEXTURE3D_DESC, const D3D11_SUBRESOURCE_DATA) \
OP(NAME, VertexShader, ID3D11VertexShader, ShaderData, void)
#define ANGLE_RESOURCE_TYPE_LIST(NAME, RESTYPE, D3D11TYPE, DESCTYPE, INITDATATYPE) RESTYPE,
......@@ -357,6 +359,7 @@ namespace d3d11
ANGLE_RESOURCE_TYPE_OP(ClassList, ANGLE_RESOURCE_TYPE_CLASS)
using SharedSRV = SharedResource11<ID3D11ShaderResourceView>;
using SharedUAV = SharedResource11<ID3D11UnorderedAccessView>;
} // namespace d3d11
#undef ANGLE_RESOURCE_TYPE_CLASS
......
......@@ -179,55 +179,73 @@ void UpdateUniformBuffer(ID3D11DeviceContext *deviceContext,
} // anonymous namespace
// StateManager11::SRVCache Implementation.
StateManager11::SRVCache::SRVCache() : mHighestUsedSRV(0)
// StateManager11::ViewCache Implementation.
template <typename ViewType, typename DescType>
StateManager11::ViewCache<ViewType, DescType>::ViewCache() : mHighestUsedView(0)
{
}
StateManager11::SRVCache::~SRVCache()
template <typename ViewType, typename DescType>
StateManager11::ViewCache<ViewType, DescType>::~ViewCache()
{
}
void StateManager11::SRVCache::update(size_t resourceIndex, ID3D11ShaderResourceView *srv)
template <typename ViewType, typename DescType>
void StateManager11::ViewCache<ViewType, DescType>::update(size_t resourceIndex, ViewType *view)
{
ASSERT(resourceIndex < mCurrentSRVs.size());
SRVRecord *record = &mCurrentSRVs[resourceIndex];
ASSERT(resourceIndex < mCurrentViews.size());
ViewRecord<DescType> *record = &mCurrentViews[resourceIndex];
record->srv = reinterpret_cast<uintptr_t>(srv);
if (srv)
record->view = reinterpret_cast<uintptr_t>(view);
if (view)
{
record->resource = reinterpret_cast<uintptr_t>(GetViewResource(srv));
srv->GetDesc(&record->desc);
mHighestUsedSRV = std::max(resourceIndex + 1, mHighestUsedSRV);
record->resource = reinterpret_cast<uintptr_t>(GetViewResource(view));
view->GetDesc(&record->desc);
mHighestUsedView = std::max(resourceIndex + 1, mHighestUsedView);
}
else
{
record->resource = 0;
if (resourceIndex + 1 == mHighestUsedSRV)
if (resourceIndex + 1 == mHighestUsedView)
{
do
{
--mHighestUsedSRV;
} while (mHighestUsedSRV > 0 && mCurrentSRVs[mHighestUsedSRV].srv == 0);
--mHighestUsedView;
} while (mHighestUsedView > 0 && mCurrentViews[mHighestUsedView].view == 0);
}
}
}
void StateManager11::SRVCache::clear()
template <typename ViewType, typename DescType>
void StateManager11::ViewCache<ViewType, DescType>::clear()
{
if (mCurrentSRVs.empty())
if (mCurrentViews.empty())
{
return;
}
memset(&mCurrentSRVs[0], 0, sizeof(SRVRecord) * mCurrentSRVs.size());
mHighestUsedSRV = 0;
memset(&mCurrentViews[0], 0, sizeof(ViewRecord<DescType>) * mCurrentViews.size());
mHighestUsedView = 0;
}
// ShaderConstants11 implementation
StateManager11::SRVCache *StateManager11::getSRVCache(gl::ShaderType shaderType)
{
switch (shaderType)
{
case gl::SHADER_VERTEX:
return &mCurVertexSRVs;
case gl::SHADER_FRAGMENT:
return &mCurPixelSRVs;
case gl::SHADER_COMPUTE:
return &mCurComputeSRVs;
default:
UNREACHABLE();
return &mCurVertexSRVs;
}
}
// ShaderConstants11 implementation
ShaderConstants11::ShaderConstants11()
: mVertexDirty(true),
mPixelDirty(true),
......@@ -624,25 +642,49 @@ void StateManager11::setShaderResourceInternal(gl::ShaderType shaderType,
UINT resourceSlot,
const SRVType *srv)
{
auto &currentSRVs = (shaderType == gl::SHADER_VERTEX ? mCurVertexSRVs : mCurPixelSRVs);
auto *currentSRVs = getSRVCache(shaderType);
ASSERT(static_cast<size_t>(resourceSlot) < currentSRVs->size());
const ViewRecord<D3D11_SHADER_RESOURCE_VIEW_DESC> &record = (*currentSRVs)[resourceSlot];
ASSERT(static_cast<size_t>(resourceSlot) < currentSRVs.size());
const SRVRecord &record = currentSRVs[resourceSlot];
if (record.srv != reinterpret_cast<uintptr_t>(srv))
if (record.view != reinterpret_cast<uintptr_t>(srv))
{
ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
ID3D11ShaderResourceView *srvPtr = srv ? srv->get() : nullptr;
if (shaderType == gl::SHADER_VERTEX)
{
deviceContext->VSSetShaderResources(resourceSlot, 1, &srvPtr);
}
else
switch (shaderType)
{
deviceContext->PSSetShaderResources(resourceSlot, 1, &srvPtr);
case gl::SHADER_VERTEX:
deviceContext->VSSetShaderResources(resourceSlot, 1, &srvPtr);
break;
case gl::SHADER_FRAGMENT:
deviceContext->PSSetShaderResources(resourceSlot, 1, &srvPtr);
break;
case gl::SHADER_COMPUTE:
deviceContext->CSSetShaderResources(resourceSlot, 1, &srvPtr);
break;
default:
UNREACHABLE();
}
currentSRVs.update(resourceSlot, srvPtr);
currentSRVs->update(resourceSlot, srvPtr);
}
}
template <typename UAVType>
void StateManager11::setUnorderedAccessViewInternal(gl::ShaderType shaderType,
UINT resourceSlot,
const UAVType *uav)
{
ASSERT(shaderType == gl::SHADER_COMPUTE);
ASSERT(static_cast<size_t>(resourceSlot) < mCurComputeUAVs.size());
const ViewRecord<D3D11_UNORDERED_ACCESS_VIEW_DESC> &record = mCurComputeUAVs[resourceSlot];
if (record.view != reinterpret_cast<uintptr_t>(uav))
{
auto deviceContext = mRenderer->getDeviceContext();
ID3D11UnorderedAccessView *uavPtr = uav ? uav->get() : nullptr;
deviceContext->CSSetUnorderedAccessViews(resourceSlot, 1, &uavPtr, nullptr);
mCurComputeUAVs.update(resourceSlot, uavPtr);
}
}
......@@ -700,7 +742,7 @@ gl::Error StateManager11::updateStateForCompute(const gl::Context *context,
ANGLE_TRY(generateSwizzlesForShader(context, gl::SHADER_COMPUTE));
// TODO(jmadill): More complete implementation.
ANGLE_TRY(syncTextures(context));
ANGLE_TRY(syncTexturesForCompute(context));
// TODO(Xinghua): applyUniformBuffers for compute shader.
......@@ -1520,40 +1562,73 @@ gl::Error StateManager11::onMakeCurrent(const gl::Context *context)
return gl::NoError();
}
gl::Error StateManager11::clearTextures(gl::ShaderType shaderType,
size_t rangeStart,
size_t rangeEnd)
gl::Error StateManager11::clearSRVs(gl::ShaderType shaderType, size_t rangeStart, size_t rangeEnd)
{
if (rangeStart == rangeEnd)
{
return gl::NoError();
}
auto &currentSRVs = (shaderType == gl::SHADER_VERTEX ? mCurVertexSRVs : mCurPixelSRVs);
gl::Range<size_t> clearRange(rangeStart, std::min(rangeEnd, currentSRVs.highestUsed()));
auto *currentSRVs = getSRVCache(shaderType);
gl::Range<size_t> clearRange(rangeStart, std::min(rangeEnd, currentSRVs->highestUsed()));
if (clearRange.empty())
{
return gl::NoError();
}
ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
if (shaderType == gl::SHADER_VERTEX)
switch (shaderType)
{
deviceContext->VSSetShaderResources(static_cast<unsigned int>(clearRange.low()),
static_cast<unsigned int>(clearRange.length()),
&mNullSRVs[0]);
case gl::SHADER_VERTEX:
deviceContext->VSSetShaderResources(static_cast<unsigned int>(clearRange.low()),
static_cast<unsigned int>(clearRange.length()),
&mNullSRVs[0]);
break;
case gl::SHADER_FRAGMENT:
deviceContext->PSSetShaderResources(static_cast<unsigned int>(clearRange.low()),
static_cast<unsigned int>(clearRange.length()),
&mNullSRVs[0]);
break;
case gl::SHADER_COMPUTE:
deviceContext->CSSetShaderResources(static_cast<unsigned int>(clearRange.low()),
static_cast<unsigned int>(clearRange.length()),
&mNullSRVs[0]);
break;
default:
UNREACHABLE();
break;
}
else
for (size_t samplerIndex : clearRange)
{
deviceContext->PSSetShaderResources(static_cast<unsigned int>(clearRange.low()),
static_cast<unsigned int>(clearRange.length()),
&mNullSRVs[0]);
currentSRVs->update(samplerIndex, nullptr);
}
for (size_t samplerIndex : clearRange)
return gl::NoError();
}
gl::Error StateManager11::clearUAVs(gl::ShaderType shaderType, size_t rangeStart, size_t rangeEnd)
{
ASSERT(shaderType == gl::SHADER_COMPUTE);
if (rangeStart == rangeEnd)
{
currentSRVs.update(samplerIndex, nullptr);
return gl::NoError();
}
gl::Range<size_t> clearRange(rangeStart, std::min(rangeEnd, mCurComputeUAVs.highestUsed()));
if (clearRange.empty())
{
return gl::NoError();
}
auto deviceContext = mRenderer->getDeviceContext();
deviceContext->CSSetUnorderedAccessViews(static_cast<unsigned int>(clearRange.low()),
static_cast<unsigned int>(clearRange.length()),
&mNullUAVs[0], nullptr);
for (size_t index : clearRange)
{
mCurComputeUAVs.update(index, nullptr);
}
return gl::NoError();
......@@ -1570,15 +1645,15 @@ bool StateManager11::unsetConflictingSRVs(gl::ShaderType shaderType,
uintptr_t resource,
const gl::ImageIndex *index)
{
auto &currentSRVs = (shaderType == gl::SHADER_VERTEX ? mCurVertexSRVs : mCurPixelSRVs);
auto *currentSRVs = getSRVCache(shaderType);
bool foundOne = false;
for (size_t resourceIndex = 0; resourceIndex < currentSRVs.size(); ++resourceIndex)
for (size_t resourceIndex = 0; resourceIndex < currentSRVs->size(); ++resourceIndex)
{
auto &record = currentSRVs[resourceIndex];
auto &record = (*currentSRVs)[resourceIndex];
if (record.srv && record.resource == resource &&
if (record.view && record.resource == resource &&
(!index || ImageIndexConflictsWithSRV(*index, record.desc)))
{
setShaderResourceInternal<d3d11::ShaderResourceView>(
......@@ -1617,9 +1692,16 @@ gl::Error StateManager11::initialize(const gl::Caps &caps, const gl::Extensions
mCurVertexSRVs.initialize(caps.maxVertexTextureImageUnits);
mCurPixelSRVs.initialize(caps.maxTextureImageUnits);
// TODO(xinghua.cao@intel.com): need to add compute shader texture image units.
mCurComputeSRVs.initialize(caps.maxImageUnits);
mCurComputeUAVs.initialize(caps.maxImageUnits);
// Initialize cached NULL SRV block
mNullSRVs.resize(caps.maxTextureImageUnits, nullptr);
mNullUAVs.resize(caps.maxImageUnits, nullptr);
mCurrentValueAttribs.resize(caps.maxVertexAttributes);
mForceSetVertexSamplerStates.resize(caps.maxVertexTextureImageUnits, true);
......@@ -2242,6 +2324,7 @@ void StateManager11::setScissorRectD3D(const D3D11_RECT &d3dRect)
// Sampler mapping needs to be up-to-date on the program object before this is called.
gl::Error StateManager11::applyTextures(const gl::Context *context, gl::ShaderType shaderType)
{
ASSERT(shaderType != gl::SHADER_COMPUTE);
const auto &glState = context->getGLState();
const auto &caps = context->getCaps();
ProgramD3D *programD3D = GetImplAs<ProgramD3D>(glState.getProgram());
......@@ -2286,7 +2369,7 @@ gl::Error StateManager11::applyTextures(const gl::Context *context, gl::ShaderTy
// Set all the remaining textures to NULL
size_t samplerCount = (shaderType == gl::SHADER_FRAGMENT) ? caps.maxTextureImageUnits
: caps.maxVertexTextureImageUnits;
ANGLE_TRY(clearTextures(shaderType, samplerRange, samplerCount));
ANGLE_TRY(clearSRVs(shaderType, samplerRange, samplerCount));
return gl::NoError();
}
......@@ -2386,6 +2469,7 @@ gl::Error StateManager11::setTexture(const gl::Context *context,
int index,
gl::Texture *texture)
{
ASSERT(type != gl::SHADER_COMPUTE);
const d3d11::SharedSRV *textureSRV = nullptr;
if (texture)
......@@ -2400,7 +2484,7 @@ gl::Error StateManager11::setTexture(const gl::Context *context,
TextureStorage11 *storage11 = GetAs<TextureStorage11>(texStorage);
ANGLE_TRY(storage11->getSRV(context, texture->getTextureState(), &textureSRV));
ANGLE_TRY(storage11->getSRVForSampler(context, texture->getTextureState(), &textureSRV));
// If we get an invalid SRV here, something went wrong in the texture class and we're
// unexpectedly missing the shader resource view.
......@@ -2419,6 +2503,88 @@ gl::Error StateManager11::setTexture(const gl::Context *context,
return gl::NoError();
}
gl::Error StateManager11::syncTexturesForCompute(const gl::Context *context)
{
const auto &glState = context->getGLState();
const auto &caps = context->getCaps();
ProgramD3D *programD3D = GetImplAs<ProgramD3D>(glState.getProgram());
// TODO(xinghua.cao@intel.com): Implement sampler feature in compute shader.
unsigned int readonlyImageRange = programD3D->getUsedImageRange(gl::SHADER_COMPUTE, true);
for (unsigned int readonlyImageIndex = 0; readonlyImageIndex < readonlyImageRange;
readonlyImageIndex++)
{
GLint imageUnitIndex =
programD3D->getImageMapping(gl::SHADER_COMPUTE, readonlyImageIndex, true, caps);
ASSERT(imageUnitIndex != -1);
const gl::ImageUnit &imageUnit = glState.getImageUnit(imageUnitIndex);
ANGLE_TRY(
setTextureForImage(context, gl::SHADER_COMPUTE, readonlyImageIndex, true, imageUnit));
}
unsigned int imageRange = programD3D->getUsedImageRange(gl::SHADER_COMPUTE, false);
for (unsigned int imageIndex = 0; imageIndex < imageRange; imageIndex++)
{
GLint imageUnitIndex =
programD3D->getImageMapping(gl::SHADER_COMPUTE, imageIndex, false, caps);
ASSERT(imageUnitIndex != -1);
const gl::ImageUnit &imageUnit = glState.getImageUnit(imageUnitIndex);
ANGLE_TRY(setTextureForImage(context, gl::SHADER_COMPUTE, imageIndex, false, imageUnit));
}
// Set all the remaining textures to NULL
size_t readonlyImageCount = caps.maxImageUnits;
size_t imageCount = caps.maxImageUnits;
ANGLE_TRY(clearSRVs(gl::SHADER_COMPUTE, readonlyImageRange, readonlyImageCount));
ANGLE_TRY(clearUAVs(gl::SHADER_COMPUTE, imageRange, imageCount));
return gl::NoError();
}
gl::Error StateManager11::setTextureForImage(const gl::Context *context,
gl::ShaderType type,
int index,
bool readonly,
const gl::ImageUnit &imageUnit)
{
TextureD3D *textureImpl = nullptr;
if (!imageUnit.texture.get())
{
return gl::NoError();
}
textureImpl = GetImplAs<TextureD3D>(imageUnit.texture.get());
TextureStorage *texStorage = nullptr;
ANGLE_TRY(textureImpl->getNativeTexture(context, &texStorage));
// Texture should be complete and have a storage
ASSERT(texStorage);
TextureStorage11 *storage11 = GetAs<TextureStorage11>(texStorage);
if (readonly)
{
const d3d11::SharedSRV *textureSRV = nullptr;
ANGLE_TRY(storage11->getSRVForImage(context, imageUnit, &textureSRV));
// If we get an invalid SRV here, something went wrong in the texture class and we're
// unexpectedly missing the shader resource view.
ASSERT(textureSRV->valid());
ASSERT((static_cast<unsigned int>(index) < mRenderer->getNativeCaps().maxImageUnits));
setShaderResourceInternal(type, index, textureSRV);
}
else
{
const d3d11::SharedUAV *textureUAV = nullptr;
ANGLE_TRY(storage11->getUAVForImage(context, imageUnit, &textureUAV));
// If we get an invalid UAV here, something went wrong in the texture class and we're
// unexpectedly missing the unordered access view.
ASSERT(textureUAV->valid());
ASSERT((static_cast<unsigned int>(index) < mRenderer->getNativeCaps().maxImageUnits));
setUnorderedAccessViewInternal(type, index, textureUAV);
}
textureImpl->resetDirty();
return gl::NoError();
}
// Things that affect a program's dirtyness:
// 1. Directly changing the program executable -> triggered in StateManager11::syncState.
// 2. The vertex attribute layout -> triggered in VertexArray11::syncState/signal.
......
......@@ -295,6 +295,10 @@ class StateManager11 final : angle::NonCopyable
void setShaderResourceInternal(gl::ShaderType shaderType,
UINT resourceSlot,
const SRVType *srv);
template <typename UAVType>
void setUnorderedAccessViewInternal(gl::ShaderType shaderType,
UINT resourceSlot,
const UAVType *uav);
bool unsetConflictingView(ID3D11View *view);
bool unsetConflictingSRVs(gl::ShaderType shaderType,
......@@ -324,6 +328,7 @@ class StateManager11 final : angle::NonCopyable
gl::Error syncTextures(const gl::Context *context);
gl::Error applyTextures(const gl::Context *context, gl::ShaderType shaderType);
gl::Error syncTexturesForCompute(const gl::Context *context);
gl::Error setSamplerState(const gl::Context *context,
gl::ShaderType type,
......@@ -334,9 +339,15 @@ class StateManager11 final : angle::NonCopyable
gl::ShaderType type,
int index,
gl::Texture *texture);
gl::Error setTextureForImage(const gl::Context *context,
gl::ShaderType type,
int index,
bool readonly,
const gl::ImageUnit &imageUnit);
// Faster than calling setTexture a jillion times
gl::Error clearTextures(gl::ShaderType shaderType, size_t rangeStart, size_t rangeEnd);
gl::Error clearSRVs(gl::ShaderType shaderType, size_t rangeStart, size_t rangeEnd);
gl::Error clearUAVs(gl::ShaderType shaderType, size_t rangeStart, size_t rangeEnd);
void handleMultiviewDrawFramebufferChange(const gl::Context *context);
gl::Error syncCurrentValueAttribs(const gl::State &glState);
......@@ -432,42 +443,50 @@ class StateManager11 final : angle::NonCopyable
std::set<Query11 *> mCurrentQueries;
// Currently applied textures
struct SRVRecord
template <typename DescType>
struct ViewRecord
{
uintptr_t srv;
uintptr_t view;
uintptr_t resource;
D3D11_SHADER_RESOURCE_VIEW_DESC desc;
DescType desc;
};
// A cache of current SRVs that also tracks the highest 'used' (non-NULL) SRV
// A cache of current Views that also tracks the highest 'used' (non-NULL) View.
// We might want to investigate a more robust approach that is also fast when there's
// a large gap between used SRVs (e.g. if SRV 0 and 7 are non-NULL, this approach will
// waste time on SRVs 1-6.)
class SRVCache : angle::NonCopyable
// a large gap between used Views (e.g. if View 0 and 7 are non-NULL, this approach will
// waste time on Views 1-6.)
template <typename ViewType, typename DescType>
class ViewCache : angle::NonCopyable
{
public:
SRVCache();
~SRVCache();
ViewCache();
~ViewCache();
void initialize(size_t size) { mCurrentSRVs.resize(size); }
void initialize(size_t size) { mCurrentViews.resize(size); }
size_t size() const { return mCurrentSRVs.size(); }
size_t highestUsed() const { return mHighestUsedSRV; }
size_t size() const { return mCurrentViews.size(); }
size_t highestUsed() const { return mHighestUsedView; }
const SRVRecord &operator[](size_t index) const { return mCurrentSRVs[index]; }
const ViewRecord<DescType> &operator[](size_t index) const { return mCurrentViews[index]; }
void clear();
void update(size_t resourceIndex, ID3D11ShaderResourceView *srv);
void update(size_t resourceIndex, ViewType *view);
private:
std::vector<SRVRecord> mCurrentSRVs;
size_t mHighestUsedSRV;
std::vector<ViewRecord<DescType>> mCurrentViews;
size_t mHighestUsedView;
};
using SRVCache = ViewCache<ID3D11ShaderResourceView, D3D11_SHADER_RESOURCE_VIEW_DESC>;
using UAVCache = ViewCache<ID3D11UnorderedAccessView, D3D11_UNORDERED_ACCESS_VIEW_DESC>;
SRVCache mCurVertexSRVs;
SRVCache mCurPixelSRVs;
SRVCache mCurComputeSRVs;
UAVCache mCurComputeUAVs;
SRVCache *getSRVCache(gl::ShaderType shaderType);
// A block of NULL pointers, cached so we don't re-allocate every draw call
std::vector<ID3D11ShaderResourceView *> mNullSRVs;
std::vector<ID3D11UnorderedAccessView *> mNullUAVs;
// Current translations of "Current-Value" data - owned by Context, not VertexArray.
gl::AttributesMask mDirtyCurrentValueAttribs;
......
......@@ -64,17 +64,45 @@ void InvalidateRenderTargetContainer(const gl::Context *context, T *renderTarget
} // anonymous namespace
TextureStorage11::SRVKey::SRVKey(int baseLevel, int mipLevels, bool swizzle, bool dropStencil)
TextureStorage11::SamplerKey::SamplerKey()
: baseLevel(0), mipLevels(0), swizzle(false), dropStencil(false)
{
}
TextureStorage11::SamplerKey::SamplerKey(int baseLevel,
int mipLevels,
bool swizzle,
bool dropStencil)
: baseLevel(baseLevel), mipLevels(mipLevels), swizzle(swizzle), dropStencil(dropStencil)
{
}
bool TextureStorage11::SRVKey::operator<(const SRVKey &rhs) const
bool TextureStorage11::SamplerKey::operator<(const SamplerKey &rhs) const
{
return std::tie(baseLevel, mipLevels, swizzle, dropStencil) <
std::tie(rhs.baseLevel, rhs.mipLevels, rhs.swizzle, rhs.dropStencil);
}
TextureStorage11::ImageKey::ImageKey()
: level(0), layered(false), layer(0), access(GL_READ_ONLY), format(GL_R32UI)
{
}
TextureStorage11::ImageKey::ImageKey(int level,
bool layered,
int layer,
GLenum access,
GLenum format)
: level(level), layered(layered), layer(layer), access(access), format(format)
{
}
bool TextureStorage11::ImageKey::operator<(const ImageKey &rhs) const
{
return std::tie(level, layered, layer, access, format) <
std::tie(rhs.level, rhs.layered, rhs.layer, rhs.access, rhs.format);
}
TextureStorage11::TextureStorage11(Renderer11 *renderer,
UINT bindFlags,
UINT miscFlags,
......@@ -94,7 +122,7 @@ TextureStorage11::TextureStorage11(Renderer11 *renderer,
TextureStorage11::~TextureStorage11()
{
mSrvCache.clear();
mSrvCacheForSampler.clear();
}
DWORD TextureStorage11::GetTextureBindFlags(GLenum internalFormat,
......@@ -108,6 +136,12 @@ DWORD TextureStorage11::GetTextureBindFlags(GLenum internalFormat,
{
bindFlags |= D3D11_BIND_SHADER_RESOURCE;
}
if (formatInfo.uavFormat != DXGI_FORMAT_UNKNOWN &&
renderer11DeviceCaps.featureLevel >= d3d11_gl::GetMinimumFeatureLevelForES31())
{
// If we find performance issues later on some specific GPUs, this may be the cause.
bindFlags |= D3D11_BIND_UNORDERED_ACCESS;
}
if (formatInfo.dsvFormat != DXGI_FORMAT_UNKNOWN)
{
bindFlags |= D3D11_BIND_DEPTH_STENCIL;
......@@ -206,9 +240,9 @@ UINT TextureStorage11::getSubresourceIndex(const gl::ImageIndex &index) const
return subresource;
}
gl::Error TextureStorage11::getSRV(const gl::Context *context,
const gl::TextureState &textureState,
const d3d11::SharedSRV **outSRV)
gl::Error TextureStorage11::getSRVForSampler(const gl::Context *context,
const gl::TextureState &textureState,
const d3d11::SharedSRV **outSRV)
{
// Make sure to add the level offset for our tiny compressed texture workaround
const GLuint effectiveBaseLevel = textureState.getEffectiveBaseLevel();
......@@ -249,7 +283,7 @@ gl::Error TextureStorage11::getSRV(const gl::Context *context,
(getLevelWidth(effectiveTopLevel) <= 2 || getLevelHeight(effectiveTopLevel) <= 2);
bool useDropStencil = (workaround && hasStencil && hasSmallMips);
SRVKey key(effectiveBaseLevel, mipLevels, swizzleRequired, useDropStencil);
SamplerKey key(effectiveBaseLevel, mipLevels, swizzleRequired, useDropStencil);
if (useDropStencil)
{
// Ensure drop texture gets created.
......@@ -258,31 +292,31 @@ gl::Error TextureStorage11::getSRV(const gl::Context *context,
// Clear the SRV cache if necessary.
// TODO(jmadill): Re-use find query result.
auto srvEntry = mSrvCache.find(key);
if (result == DropStencil::CREATED && srvEntry != mSrvCache.end())
auto srvEntry = mSrvCacheForSampler.find(key);
if (result == DropStencil::CREATED && srvEntry != mSrvCacheForSampler.end())
{
mSrvCache.erase(key);
mSrvCacheForSampler.erase(key);
}
}
ANGLE_TRY(getCachedOrCreateSRV(context, key, outSRV));
ANGLE_TRY(getCachedOrCreateSRVForSampler(context, key, outSRV));
return gl::NoError();
}
gl::Error TextureStorage11::getCachedOrCreateSRV(const gl::Context *context,
const SRVKey &key,
const d3d11::SharedSRV **outSRV)
gl::Error TextureStorage11::getCachedOrCreateSRVForSampler(const gl::Context *context,
const SamplerKey &key,
const d3d11::SharedSRV **outSRV)
{
auto iter = mSrvCache.find(key);
if (iter != mSrvCache.end())
auto iter = mSrvCacheForSampler.find(key);
if (iter != mSrvCacheForSampler.end())
{
*outSRV = &iter->second;
return gl::NoError();
}
const TextureHelper11 *texture = nullptr;
DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN;
DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN;
if (key.swizzle)
{
......@@ -306,9 +340,9 @@ gl::Error TextureStorage11::getCachedOrCreateSRV(const gl::Context *context,
d3d11::SharedSRV srv;
ANGLE_TRY(createSRV(context, key.baseLevel, key.mipLevels, format, *texture, &srv));
ANGLE_TRY(createSRVForSampler(context, key.baseLevel, key.mipLevels, format, *texture, &srv));
const auto &insertIt = mSrvCache.insert(std::make_pair(key, std::move(srv)));
const auto &insertIt = mSrvCacheForSampler.insert(std::make_pair(key, std::move(srv)));
*outSRV = &insertIt.first->second;
return gl::NoError();
......@@ -338,8 +372,8 @@ gl::Error TextureStorage11::getSRVLevel(const gl::Context *context,
DXGI_FORMAT resourceFormat =
blitSRV ? mFormatInfo.blitSRVFormat : mFormatInfo.srvFormat;
ANGLE_TRY(
createSRV(context, mipLevel, 1, resourceFormat, *resource, &levelSRVs[mipLevel]));
ANGLE_TRY(createSRVForSampler(context, mipLevel, 1, resourceFormat, *resource,
&levelSRVs[mipLevel]));
}
}
......@@ -372,12 +406,76 @@ gl::Error TextureStorage11::getSRVLevels(const gl::Context *context,
// TODO(jmadill): Assert we don't need to drop stencil.
SRVKey key(baseLevel, mipLevels, false, false);
ANGLE_TRY(getCachedOrCreateSRV(context, key, outSRV));
SamplerKey key(baseLevel, mipLevels, false, false);
ANGLE_TRY(getCachedOrCreateSRVForSampler(context, key, outSRV));
return gl::NoError();
}
gl::Error TextureStorage11::getSRVForImage(const gl::Context *context,
const gl::ImageUnit &imageUnit,
const d3d11::SharedSRV **outSRV)
{
// TODO(Xinghua.cao@intel.com): Add solution to handle swizzle required.
ImageKey key(imageUnit.level, imageUnit.layered, imageUnit.layer, imageUnit.access,
imageUnit.format);
ANGLE_TRY(getCachedOrCreateSRVForImage(context, key, outSRV));
return gl::NoError();
}
gl::Error TextureStorage11::getCachedOrCreateSRVForImage(const gl::Context *context,
const ImageKey &key,
const d3d11::SharedSRV **outSRV)
{
auto iter = mSrvCacheForImage.find(key);
if (iter != mSrvCacheForImage.end())
{
*outSRV = &iter->second;
return gl::NoError();
}
const TextureHelper11 *texture = nullptr;
ANGLE_TRY(getResource(context, &texture));
DXGI_FORMAT format =
d3d11::Format::Get(key.format, mRenderer->getRenderer11DeviceCaps()).srvFormat;
d3d11::SharedSRV srv;
ANGLE_TRY(createSRVForImage(context, key.level, format, *texture, &srv));
const auto &insertIt = mSrvCacheForImage.insert(std::make_pair(key, std::move(srv)));
*outSRV = &insertIt.first->second;
return gl::NoError();
}
gl::Error TextureStorage11::getUAVForImage(const gl::Context *context,
const gl::ImageUnit &imageUnit,
const d3d11::SharedUAV **outUAV)
{
// TODO(Xinghua.cao@intel.com): Add solution to handle swizzle required.
ImageKey key(imageUnit.level, imageUnit.layered, imageUnit.layer, imageUnit.access,
imageUnit.format);
ANGLE_TRY(getCachedOrCreateUAVForImage(context, key, outUAV));
return gl::NoError();
}
gl::Error TextureStorage11::getCachedOrCreateUAVForImage(const gl::Context *context,
const ImageKey &key,
const d3d11::SharedUAV **outUAV)
{
auto iter = mUavCacheForImage.find(key);
if (iter != mUavCacheForImage.end())
{
*outUAV = &iter->second;
return gl::NoError();
}
const TextureHelper11 *texture = nullptr;
ANGLE_TRY(getResource(context, &texture));
DXGI_FORMAT format =
d3d11::Format::Get(key.format, mRenderer->getRenderer11DeviceCaps()).uavFormat;
d3d11::SharedUAV uav;
ANGLE_TRY(createUAVForImage(context, key.level, format, *texture, &uav));
const auto &insertIt = mUavCacheForImage.insert(std::make_pair(key, std::move(uav)));
*outUAV = &insertIt.first->second;
return gl::NoError();
}
const d3d11::Format &TextureStorage11::getFormatSet() const
{
return mFormatInfo;
......@@ -479,7 +577,7 @@ gl::Error TextureStorage11::updateSubresourceLevel(const gl::Context *context,
if (!fullCopy && mFormatInfo.dsvFormat != DXGI_FORMAT_UNKNOWN)
{
// CopySubresourceRegion cannot copy partial depth stencils, use the blitter instead
Blit11 *blitter = mRenderer->getBlitter();
Blit11 *blitter = mRenderer->getBlitter();
return blitter->copyDepthStencil(srcTexture, sourceSubresource, copyArea, texSize,
*dstTexture, dstSubresource, copyArea, texSize, nullptr);
}
......@@ -604,7 +702,7 @@ void TextureStorage11::verifySwizzleExists(const gl::SwizzleState &swizzleState)
void TextureStorage11::clearSRVCache()
{
markDirty();
mSrvCache.clear();
mSrvCacheForSampler.clear();
for (size_t level = 0; level < mLevelSRVs.size(); level++)
{
......@@ -620,7 +718,7 @@ gl::Error TextureStorage11::copyToStorage(const gl::Context *context, TextureSto
const TextureHelper11 *sourceResouce = nullptr;
ANGLE_TRY(getResource(context, &sourceResouce));
TextureStorage11 *dest11 = GetAs<TextureStorage11>(destStorage);
TextureStorage11 *dest11 = GetAs<TextureStorage11>(destStorage);
const TextureHelper11 *destResource = nullptr;
ANGLE_TRY(dest11->getResource(context, &destResource));
......@@ -689,9 +787,9 @@ gl::Error TextureStorage11::setData(const gl::Context *context,
UINT bufferRowPitch = static_cast<unsigned int>(outputPixelSize) * width;
UINT bufferDepthPitch = bufferRowPitch * height;
const size_t neededSize = bufferDepthPitch * depth;
const size_t neededSize = bufferDepthPitch * depth;
angle::MemoryBuffer *conversionBuffer = nullptr;
const uint8_t *data = nullptr;
const uint8_t *data = nullptr;
LoadImageFunctionInfo loadFunctionInfo = d3d11Format.getLoadFunctions()(type);
if (loadFunctionInfo.requiresConversion)
......@@ -755,8 +853,8 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer11 *renderer, SwapChain11 *swap
{
for (unsigned int i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)
{
mAssociatedImages[i] = nullptr;
mRenderTarget[i] = nullptr;
mAssociatedImages[i] = nullptr;
mRenderTarget[i] = nullptr;
}
D3D11_TEXTURE2D_DESC texDesc;
......@@ -792,8 +890,8 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer11 *renderer,
{
for (unsigned int i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)
{
mAssociatedImages[i] = nullptr;
mRenderTarget[i] = nullptr;
mAssociatedImages[i] = nullptr;
mRenderTarget[i] = nullptr;
}
d3d11::MakeValidSize(false, mFormatInfo.texFormat, &width, &height, &mTopLevel);
......@@ -1162,12 +1260,12 @@ gl::Error TextureStorage11_2D::getRenderTarget(const gl::Context *context,
return gl::NoError();
}
gl::Error TextureStorage11_2D::createSRV(const gl::Context *context,
int baseLevel,
int mipLevels,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV)
gl::Error TextureStorage11_2D::createSRVForSampler(const gl::Context *context,
int baseLevel,
int mipLevels,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV)
{
ASSERT(outSRV);
......@@ -1206,6 +1304,41 @@ gl::Error TextureStorage11_2D::createSRV(const gl::Context *context,
return gl::NoError();
}
gl::Error TextureStorage11_2D::createSRVForImage(const gl::Context *context,
int level,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV)
{
ASSERT(outSRV);
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
srvDesc.Format = format;
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
srvDesc.Texture2D.MostDetailedMip = mTopLevel + level;
srvDesc.Texture2D.MipLevels = 1;
const TextureHelper11 *srvTexture = &texture;
ANGLE_TRY(mRenderer->allocateResource(srvDesc, srvTexture->get(), outSRV));
outSRV->setDebugName("TexStorage2D.SRVForImage");
return gl::NoError();
}
gl::Error TextureStorage11_2D::createUAVForImage(const gl::Context *context,
int level,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedUAV *outUAV)
{
ASSERT(outUAV);
D3D11_UNORDERED_ACCESS_VIEW_DESC uavDesc;
uavDesc.Format = format;
uavDesc.ViewDimension = D3D11_UAV_DIMENSION_TEXTURE2D;
uavDesc.Texture2D.MipSlice = mTopLevel + level;
const TextureHelper11 *uavTexture = &texture;
ANGLE_TRY(mRenderer->allocateResource(uavDesc, uavTexture->get(), outUAV));
outUAV->setDebugName("TexStorage2D.UAVForImage");
return gl::NoError();
}
gl::Error TextureStorage11_2D::getSwizzleTexture(const TextureHelper11 **outTexture)
{
ASSERT(outTexture);
......@@ -1300,7 +1433,7 @@ TextureStorage11_External::TextureStorage11_External(
ASSERT(stream->getProducerType() == egl::Stream::ProducerType::D3D11Texture);
auto *producer = static_cast<StreamProducerD3DTexture *>(stream->getImplementation());
mTexture.set(producer->getD3DTexture(), mFormatInfo);
mSubresourceIndex = producer->getArraySlice();
mSubresourceIndex = producer->getArraySlice();
mTexture.get()->AddRef();
mMipLevels = 1;
......@@ -1394,12 +1527,12 @@ gl::Error TextureStorage11_External::getRenderTarget(const gl::Context *context,
return gl::InternalError();
}
gl::Error TextureStorage11_External::createSRV(const gl::Context *context,
int baseLevel,
int mipLevels,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV)
gl::Error TextureStorage11_External::createSRVForSampler(const gl::Context *context,
int baseLevel,
int mipLevels,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV)
{
// Since external textures are treates as non-mipmapped textures, we ignore mipmap levels and
// use the specified subresource ID the storage was created with.
......@@ -1421,6 +1554,26 @@ gl::Error TextureStorage11_External::createSRV(const gl::Context *context,
return gl::NoError();
}
gl::Error TextureStorage11_External::createSRVForImage(const gl::Context *context,
int level,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV)
{
UNREACHABLE();
return gl::InternalError();
}
gl::Error TextureStorage11_External::createUAVForImage(const gl::Context *context,
int level,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedUAV *outUAV)
{
UNREACHABLE();
return gl::InternalError();
}
gl::Error TextureStorage11_External::getSwizzleTexture(const TextureHelper11 **outTexture)
{
UNIMPLEMENTED();
......@@ -1469,12 +1622,12 @@ gl::Error TextureStorage11_EGLImage::getResource(const gl::Context *context,
return gl::NoError();
}
gl::Error TextureStorage11_EGLImage::getSRV(const gl::Context *context,
const gl::TextureState &textureState,
const d3d11::SharedSRV **outSRV)
gl::Error TextureStorage11_EGLImage::getSRVForSampler(const gl::Context *context,
const gl::TextureState &textureState,
const d3d11::SharedSRV **outSRV)
{
ANGLE_TRY(checkForUpdatedRenderTarget(context));
return TextureStorage11::getSRV(context, textureState, outSRV);
return TextureStorage11::getSRVForSampler(context, textureState, outSRV);
}
gl::Error TextureStorage11_EGLImage::getMippedResource(const gl::Context *context,
......@@ -1505,7 +1658,7 @@ gl::Error TextureStorage11_EGLImage::copyToStorage(const gl::Context *context,
ANGLE_TRY(getResource(context, &sourceResouce));
ASSERT(destStorage);
TextureStorage11_2D *dest11 = GetAs<TextureStorage11_2D>(destStorage);
TextureStorage11_2D *dest11 = GetAs<TextureStorage11_2D>(destStorage);
const TextureHelper11 *destResource = nullptr;
ANGLE_TRY(dest11->getResource(context, &destResource));
......@@ -1610,12 +1763,12 @@ gl::Error TextureStorage11_EGLImage::checkForUpdatedRenderTarget(const gl::Conte
return gl::NoError();
}
gl::Error TextureStorage11_EGLImage::createSRV(const gl::Context *context,
int baseLevel,
int mipLevels,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV)
gl::Error TextureStorage11_EGLImage::createSRVForSampler(const gl::Context *context,
int baseLevel,
int mipLevels,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV)
{
ASSERT(baseLevel == 0);
ASSERT(mipLevels == 1);
......@@ -1647,6 +1800,26 @@ gl::Error TextureStorage11_EGLImage::createSRV(const gl::Context *context,
return gl::NoError();
}
gl::Error TextureStorage11_EGLImage::createSRVForImage(const gl::Context *context,
int level,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV)
{
UNREACHABLE();
return gl::InternalError();
}
gl::Error TextureStorage11_EGLImage::createUAVForImage(const gl::Context *context,
int level,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedUAV *outUAV)
{
UNREACHABLE();
return gl::InternalError();
}
gl::Error TextureStorage11_EGLImage::getImageRenderTarget(const gl::Context *context,
RenderTarget11 **outRT) const
{
......@@ -2119,12 +2292,12 @@ gl::Error TextureStorage11_Cube::getRenderTarget(const gl::Context *context,
return gl::NoError();
}
gl::Error TextureStorage11_Cube::createSRV(const gl::Context *context,
int baseLevel,
int mipLevels,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV)
gl::Error TextureStorage11_Cube::createSRVForSampler(const gl::Context *context,
int baseLevel,
int mipLevels,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV)
{
ASSERT(outSRV);
......@@ -2178,6 +2351,26 @@ gl::Error TextureStorage11_Cube::createSRV(const gl::Context *context,
return gl::NoError();
}
gl::Error TextureStorage11_Cube::createSRVForImage(const gl::Context *context,
int level,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV)
{
UNIMPLEMENTED();
return gl::InternalError();
}
gl::Error TextureStorage11_Cube::createUAVForImage(const gl::Context *context,
int level,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedUAV *outUAV)
{
UNIMPLEMENTED();
return gl::InternalError();
}
gl::Error TextureStorage11_Cube::getSwizzleTexture(const TextureHelper11 **outTexture)
{
ASSERT(outTexture);
......@@ -2306,8 +2499,8 @@ TextureStorage11_3D::TextureStorage11_3D(Renderer11 *renderer,
{
for (unsigned int i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)
{
mAssociatedImages[i] = nullptr;
mLevelRenderTargets[i] = nullptr;
mAssociatedImages[i] = nullptr;
mLevelRenderTargets[i] = nullptr;
}
// adjust size if needed for compressed textures
......@@ -2431,12 +2624,12 @@ gl::Error TextureStorage11_3D::getResource(const gl::Context *context,
return gl::NoError();
}
gl::Error TextureStorage11_3D::createSRV(const gl::Context *context,
int baseLevel,
int mipLevels,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV)
gl::Error TextureStorage11_3D::createSRVForSampler(const gl::Context *context,
int baseLevel,
int mipLevels,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV)
{
ASSERT(outSRV);
......@@ -2452,6 +2645,26 @@ gl::Error TextureStorage11_3D::createSRV(const gl::Context *context,
return gl::NoError();
}
gl::Error TextureStorage11_3D::createSRVForImage(const gl::Context *context,
int level,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV)
{
UNIMPLEMENTED();
return gl::InternalError();
}
gl::Error TextureStorage11_3D::createUAVForImage(const gl::Context *context,
int level,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedUAV *outUAV)
{
UNIMPLEMENTED();
return gl::InternalError();
}
gl::Error TextureStorage11_3D::getRenderTarget(const gl::Context *context,
const gl::ImageIndex &index,
RenderTargetD3D **outRT)
......@@ -2738,12 +2951,12 @@ gl::Error TextureStorage11_2DArray::getResource(const gl::Context *context,
return gl::NoError();
}
gl::Error TextureStorage11_2DArray::createSRV(const gl::Context *context,
int baseLevel,
int mipLevels,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV)
gl::Error TextureStorage11_2DArray::createSRVForSampler(const gl::Context *context,
int baseLevel,
int mipLevels,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV)
{
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
srvDesc.Format = format;
......@@ -2759,6 +2972,26 @@ gl::Error TextureStorage11_2DArray::createSRV(const gl::Context *context,
return gl::NoError();
}
gl::Error TextureStorage11_2DArray::createSRVForImage(const gl::Context *context,
int level,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV)
{
UNIMPLEMENTED();
return gl::InternalError();
}
gl::Error TextureStorage11_2DArray::createUAVForImage(const gl::Context *context,
int level,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedUAV *outUAV)
{
UNIMPLEMENTED();
return gl::InternalError();
}
gl::Error TextureStorage11_2DArray::createRenderTargetSRV(const TextureHelper11 &texture,
const gl::ImageIndex &index,
DXGI_FORMAT resourceFormat,
......@@ -2783,8 +3016,8 @@ gl::Error TextureStorage11_2DArray::getRenderTarget(const gl::Context *context,
{
ASSERT(index.hasLayer());
const int mipLevel = index.mipIndex;
const int layer = index.layerIndex;
const int mipLevel = index.mipIndex;
const int layer = index.layerIndex;
const int numLayers = index.numLayers;
ASSERT(mipLevel >= 0 && mipLevel < getLevelCount());
......@@ -3031,7 +3264,7 @@ gl::Error TextureStorage11_2DMultisample::ensureTextureExists(int mipLevels)
desc.ArraySize = 1;
desc.Format = mFormatInfo.texFormat;
desc.Usage = D3D11_USAGE_DEFAULT;
desc.BindFlags = getBindFlags();
desc.BindFlags = getBindFlags() & ~D3D11_BIND_UNORDERED_ACCESS;
desc.CPUAccessFlags = 0;
desc.MiscFlags = getMiscFlags();
......@@ -3108,12 +3341,12 @@ gl::Error TextureStorage11_2DMultisample::getRenderTarget(const gl::Context *con
return gl::NoError();
}
gl::Error TextureStorage11_2DMultisample::createSRV(const gl::Context *context,
int baseLevel,
int mipLevels,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV)
gl::Error TextureStorage11_2DMultisample::createSRVForSampler(const gl::Context *context,
int baseLevel,
int mipLevels,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV)
{
ASSERT(outSRV);
......@@ -3126,6 +3359,26 @@ gl::Error TextureStorage11_2DMultisample::createSRV(const gl::Context *context,
return gl::NoError();
}
gl::Error TextureStorage11_2DMultisample::createSRVForImage(const gl::Context *context,
int level,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV)
{
UNREACHABLE();
return gl::InternalError();
}
gl::Error TextureStorage11_2DMultisample::createUAVForImage(const gl::Context *context,
int level,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedUAV *outUAV)
{
UNREACHABLE();
return gl::InternalError();
}
gl::Error TextureStorage11_2DMultisample::getSwizzleTexture(const TextureHelper11 **outTexture)
{
UNIMPLEMENTED();
......
......@@ -5,7 +5,8 @@
//
// TextureStorage11.h: Defines the abstract rx::TextureStorage11 class and its concrete derived
// classes TextureStorage11_2D and TextureStorage11_Cube, which act as the interface to the D3D11 texture.
// classes TextureStorage11_2D and TextureStorage11_Cube, which act as the interface to the D3D11
// texture.
#ifndef LIBANGLE_RENDERER_D3D_D3D11_TEXTURESTORAGE11_H_
#define LIBANGLE_RENDERER_D3D_D3D11_TEXTURESTORAGE11_H_
......@@ -45,8 +46,13 @@ class TextureStorage11 : public TextureStorage
public:
~TextureStorage11() override;
static DWORD GetTextureBindFlags(GLenum internalFormat, const Renderer11DeviceCaps &renderer11DeviceCaps, bool renderTarget);
static DWORD GetTextureMiscFlags(GLenum internalFormat, const Renderer11DeviceCaps &renderer11DeviceCaps, bool renderTarget, int levels);
static DWORD GetTextureBindFlags(GLenum internalFormat,
const Renderer11DeviceCaps &renderer11DeviceCaps,
bool renderTarget);
static DWORD GetTextureMiscFlags(GLenum internalFormat,
const Renderer11DeviceCaps &renderer11DeviceCaps,
bool renderTarget,
int levels);
UINT getBindFlags() const;
UINT getMiscFlags() const;
......@@ -89,19 +95,25 @@ class TextureStorage11 : public TextureStorage
const gl::PixelUnpackState &unpack,
const uint8_t *pixelData) override;
virtual gl::Error getSRV(const gl::Context *context,
const gl::TextureState &textureState,
virtual gl::Error getSRVForSampler(const gl::Context *context,
const gl::TextureState &textureState,
const d3d11::SharedSRV **outSRV);
gl::Error getSRVForImage(const gl::Context *context,
const gl::ImageUnit &imageUnit,
const d3d11::SharedSRV **outSRV);
gl::Error getUAVForImage(const gl::Context *context,
const gl::ImageUnit &imageUnit,
const d3d11::SharedUAV **outUAV);
virtual UINT getSubresourceIndex(const gl::ImageIndex &index) const;
virtual gl::Error getResource(const gl::Context *context,
const TextureHelper11 **outResource) = 0;
virtual void associateImage(Image11* image, const gl::ImageIndex &index) = 0;
virtual void disassociateImage(const gl::ImageIndex &index, Image11* expectedImage) = 0;
const TextureHelper11 **outResource) = 0;
virtual void associateImage(Image11 *image, const gl::ImageIndex &index) = 0;
virtual void disassociateImage(const gl::ImageIndex &index, Image11 *expectedImage) = 0;
virtual void verifyAssociatedImageValid(const gl::ImageIndex &index,
Image11 *expectedImage) = 0;
Image11 *expectedImage) = 0;
virtual gl::Error releaseAssociatedImage(const gl::Context *context,
const gl::ImageIndex &index,
Image11 *incomingImage) = 0;
Image11 *incomingImage) = 0;
protected:
TextureStorage11(Renderer11 *renderer, UINT bindFlags, UINT miscFlags, GLenum internalFormat);
......@@ -113,7 +125,7 @@ class TextureStorage11 : public TextureStorage
virtual gl::Error getMippedResource(const gl::Context *context,
const TextureHelper11 **outResource);
virtual gl::Error getSwizzleTexture(const TextureHelper11 **outTexture) = 0;
virtual gl::Error getSwizzleTexture(const TextureHelper11 **outTexture) = 0;
virtual gl::Error getSwizzleRenderTarget(int mipLevel,
const d3d11::RenderTargetView **outRTV) = 0;
gl::Error getSRVLevel(const gl::Context *context,
......@@ -131,12 +143,22 @@ class TextureStorage11 : public TextureStorage
gl::Error initDropStencilTexture(const gl::Context *context, const gl::ImageIndexIterator &it);
// The baseLevel parameter should *not* have mTopLevel applied.
virtual gl::Error createSRV(const gl::Context *context,
int baseLevel,
int mipLevels,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV) = 0;
virtual gl::Error createSRVForSampler(const gl::Context *context,
int baseLevel,
int mipLevels,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV) = 0;
virtual gl::Error createSRVForImage(const gl::Context *context,
int level,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV) = 0;
virtual gl::Error createUAVForImage(const gl::Context *context,
int level,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedUAV *outUAV) = 0;
void verifySwizzleExists(const gl::SwizzleState &swizzleState);
......@@ -159,24 +181,50 @@ class TextureStorage11 : public TextureStorage
const UINT mBindFlags;
const UINT mMiscFlags;
struct SRVKey
struct SamplerKey
{
SRVKey(int baseLevel, int mipLevels, bool swizzle, bool dropStencil);
SamplerKey();
SamplerKey(int baseLevel, int mipLevels, bool swizzle, bool dropStencil);
bool operator<(const SamplerKey &rhs) const;
int baseLevel;
int mipLevels;
bool swizzle;
bool dropStencil;
};
bool operator<(const SRVKey &rhs) const;
gl::Error getCachedOrCreateSRVForSampler(const gl::Context *context,
const SamplerKey &key,
const d3d11::SharedSRV **outSRV);
int baseLevel = 0; // Without mTopLevel applied.
int mipLevels = 0;
bool swizzle = false;
bool dropStencil = false;
using SRVCacheForSampler = std::map<SamplerKey, d3d11::SharedSRV>;
SRVCacheForSampler mSrvCacheForSampler;
struct ImageKey
{
ImageKey();
ImageKey(int level, bool layered, int layer, GLenum access, GLenum format);
bool operator<(const ImageKey &rhs) const;
int level;
bool layered;
int layer;
GLenum access;
GLenum format;
};
typedef std::map<SRVKey, d3d11::SharedSRV> SRVCache;
gl::Error getCachedOrCreateSRV(const gl::Context *context,
const SRVKey &key,
const d3d11::SharedSRV **outSRV);
gl::Error getCachedOrCreateSRVForImage(const gl::Context *context,
const ImageKey &key,
const d3d11::SharedSRV **outSRV);
gl::Error getCachedOrCreateUAVForImage(const gl::Context *context,
const ImageKey &key,
const d3d11::SharedUAV **outUAV);
using SRVCacheForImage = std::map<ImageKey, d3d11::SharedSRV>;
SRVCacheForImage mSrvCacheForImage;
using UAVCacheForImage = std::map<ImageKey, d3d11::SharedUAV>;
UAVCacheForImage mUavCacheForImage;
SRVCache mSrvCache;
TexLevelArray<d3d11::SharedSRV> mLevelSRVs;
TexLevelArray<d3d11::SharedSRV> mLevelBlitSRVs;
};
......@@ -185,7 +233,13 @@ class TextureStorage11_2D : public TextureStorage11
{
public:
TextureStorage11_2D(Renderer11 *renderer, SwapChain11 *swapchain);
TextureStorage11_2D(Renderer11 *renderer, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, int levels, bool hintLevelZeroOnly = false);
TextureStorage11_2D(Renderer11 *renderer,
GLenum internalformat,
bool renderTarget,
GLsizei width,
GLsizei height,
int levels,
bool hintLevelZeroOnly = false);
~TextureStorage11_2D() override;
gl::Error onDestroy(const gl::Context *context) override;
......@@ -218,26 +272,38 @@ class TextureStorage11_2D : public TextureStorage11
gl::Error ensureTextureExists(int mipLevels);
private:
gl::Error createSRV(const gl::Context *context,
int baseLevel,
int mipLevels,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV) override;
gl::Error createSRVForSampler(const gl::Context *context,
int baseLevel,
int mipLevels,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV) override;
gl::Error createSRVForImage(const gl::Context *context,
int level,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV) override;
gl::Error createUAVForImage(const gl::Context *context,
int level,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedUAV *outUAV) override;
TextureHelper11 mTexture;
TexLevelArray<std::unique_ptr<RenderTarget11>> mRenderTarget;
bool mHasKeyedMutex;
// These are members related to the zero max-LOD workaround.
// D3D11 Feature Level 9_3 can't disable mipmaps on a mipmapped texture (i.e. solely sample from level zero).
// These members are used to work around this limitation.
// Usually only mTexture XOR mLevelZeroTexture will exist.
// For example, if an app creates a texture with only one level, then 9_3 will only create mLevelZeroTexture.
// However, in some scenarios, both textures have to be created. This incurs additional memory overhead.
// One example of this is an application that creates a texture, calls glGenerateMipmap, and then disables mipmaps on the texture.
// A more likely example is an app that creates an empty texture, renders to it, and then calls glGenerateMipmap
// TODO: In this rendering scenario, release the mLevelZeroTexture after mTexture has been created to save memory.
// D3D11 Feature Level 9_3 can't disable mipmaps on a mipmapped texture (i.e. solely sample from
// level zero). These members are used to work around this limitation. Usually only mTexture XOR
// mLevelZeroTexture will exist. For example, if an app creates a texture with only one level,
// then 9_3 will only create mLevelZeroTexture. However, in some scenarios, both textures have
// to be created. This incurs additional memory overhead. One example of this is an application
// that creates a texture, calls glGenerateMipmap, and then disables mipmaps on the texture. A
// more likely example is an app that creates an empty texture, renders to it, and then calls
// glGenerateMipmap
// TODO: In this rendering scenario, release the mLevelZeroTexture after mTexture has been
// created to save memory.
TextureHelper11 mLevelZeroTexture;
std::unique_ptr<RenderTarget11> mLevelZeroRenderTarget;
bool mUseLevelZeroTexture;
......@@ -280,12 +346,22 @@ class TextureStorage11_External : public TextureStorage11
gl::Error getSwizzleRenderTarget(int mipLevel, const d3d11::RenderTargetView **outRTV) override;
private:
gl::Error createSRV(const gl::Context *context,
int baseLevel,
int mipLevels,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV) override;
gl::Error createSRVForSampler(const gl::Context *context,
int baseLevel,
int mipLevels,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV) override;
gl::Error createSRVForImage(const gl::Context *context,
int level,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV) override;
gl::Error createUAVForImage(const gl::Context *context,
int level,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedUAV *outUAV) override;
TextureHelper11 mTexture;
int mSubresourceIndex;
......@@ -303,9 +379,9 @@ class TextureStorage11_EGLImage final : public TextureStorage11
~TextureStorage11_EGLImage() override;
gl::Error getResource(const gl::Context *context, const TextureHelper11 **outResource) override;
gl::Error getSRV(const gl::Context *context,
const gl::TextureState &textureState,
const d3d11::SharedSRV **outSRV) override;
gl::Error getSRVForSampler(const gl::Context *context,
const gl::TextureState &textureState,
const d3d11::SharedSRV **outSRV) override;
gl::Error getMippedResource(const gl::Context *context,
const TextureHelper11 **outResource) override;
gl::Error getRenderTarget(const gl::Context *context,
......@@ -333,12 +409,22 @@ class TextureStorage11_EGLImage final : public TextureStorage11
// any SRVs and other resources based on the image's old render target.
gl::Error checkForUpdatedRenderTarget(const gl::Context *context);
gl::Error createSRV(const gl::Context *context,
int baseLevel,
int mipLevels,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV) override;
gl::Error createSRVForSampler(const gl::Context *context,
int baseLevel,
int mipLevels,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV) override;
gl::Error createSRVForImage(const gl::Context *context,
int level,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV) override;
gl::Error createUAVForImage(const gl::Context *context,
int level,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedUAV *outUAV) override;
gl::Error getImageRenderTarget(const gl::Context *context, RenderTarget11 **outRT) const;
......@@ -353,7 +439,12 @@ class TextureStorage11_EGLImage final : public TextureStorage11
class TextureStorage11_Cube : public TextureStorage11
{
public:
TextureStorage11_Cube(Renderer11 *renderer, GLenum internalformat, bool renderTarget, int size, int levels, bool hintLevelZeroOnly);
TextureStorage11_Cube(Renderer11 *renderer,
GLenum internalformat,
bool renderTarget,
int size,
int levels,
bool hintLevelZeroOnly);
~TextureStorage11_Cube() override;
gl::Error onDestroy(const gl::Context *context) override;
......@@ -388,12 +479,22 @@ class TextureStorage11_Cube : public TextureStorage11
gl::Error ensureTextureExists(int mipLevels);
private:
gl::Error createSRV(const gl::Context *context,
int baseLevel,
int mipLevels,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV) override;
gl::Error createSRVForSampler(const gl::Context *context,
int baseLevel,
int mipLevels,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV) override;
gl::Error createSRVForImage(const gl::Context *context,
int level,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV) override;
gl::Error createUAVForImage(const gl::Context *context,
int level,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedUAV *outUAV) override;
gl::Error createRenderTargetSRV(const TextureHelper11 &texture,
const gl::ImageIndex &index,
DXGI_FORMAT resourceFormat,
......@@ -402,7 +503,8 @@ class TextureStorage11_Cube : public TextureStorage11
TextureHelper11 mTexture;
CubeFaceArray<TexLevelArray<std::unique_ptr<RenderTarget11>>> mRenderTarget;
// Level-zero workaround members. See TextureStorage11_2D's workaround members for a description.
// Level-zero workaround members. See TextureStorage11_2D's workaround members for a
// description.
TextureHelper11 mLevelZeroTexture;
CubeFaceArray<std::unique_ptr<RenderTarget11>> mLevelZeroRenderTarget;
bool mUseLevelZeroTexture;
......@@ -416,8 +518,13 @@ class TextureStorage11_Cube : public TextureStorage11
class TextureStorage11_3D : public TextureStorage11
{
public:
TextureStorage11_3D(Renderer11 *renderer, GLenum internalformat, bool renderTarget,
GLsizei width, GLsizei height, GLsizei depth, int levels);
TextureStorage11_3D(Renderer11 *renderer,
GLenum internalformat,
bool renderTarget,
GLsizei width,
GLsizei height,
GLsizei depth,
int levels);
~TextureStorage11_3D() override;
gl::Error onDestroy(const gl::Context *context) override;
......@@ -441,12 +548,22 @@ class TextureStorage11_3D : public TextureStorage11
gl::Error getSwizzleRenderTarget(int mipLevel, const d3d11::RenderTargetView **outRTV) override;
private:
gl::Error createSRV(const gl::Context *context,
int baseLevel,
int mipLevels,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV) override;
gl::Error createSRVForSampler(const gl::Context *context,
int baseLevel,
int mipLevels,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV) override;
gl::Error createSRVForImage(const gl::Context *context,
int level,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV) override;
gl::Error createUAVForImage(const gl::Context *context,
int level,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedUAV *outUAV) override;
typedef std::pair<int, int> LevelLayerKey;
std::map<LevelLayerKey, std::unique_ptr<RenderTarget11>> mLevelLayerRenderTargets;
......@@ -463,8 +580,13 @@ class TextureStorage11_3D : public TextureStorage11
class TextureStorage11_2DArray : public TextureStorage11
{
public:
TextureStorage11_2DArray(Renderer11 *renderer, GLenum internalformat, bool renderTarget,
GLsizei width, GLsizei height, GLsizei depth, int levels);
TextureStorage11_2DArray(Renderer11 *renderer,
GLenum internalformat,
bool renderTarget,
GLsizei width,
GLsizei height,
GLsizei depth,
int levels);
~TextureStorage11_2DArray() override;
gl::Error onDestroy(const gl::Context *context) override;
......@@ -512,12 +634,22 @@ class TextureStorage11_2DArray : public TextureStorage11
};
private:
gl::Error createSRV(const gl::Context *context,
int baseLevel,
int mipLevels,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV) override;
gl::Error createSRVForSampler(const gl::Context *context,
int baseLevel,
int mipLevels,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV) override;
gl::Error createSRVForImage(const gl::Context *context,
int level,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV) override;
gl::Error createUAVForImage(const gl::Context *context,
int level,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedUAV *outUAV) override;
gl::Error createRenderTargetSRV(const TextureHelper11 &texture,
const gl::ImageIndex &index,
DXGI_FORMAT resourceFormat,
......@@ -571,12 +703,22 @@ class TextureStorage11_2DMultisample : public TextureStorage11
gl::Error ensureTextureExists(int mipLevels);
private:
gl::Error createSRV(const gl::Context *context,
int baseLevel,
int mipLevels,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV) override;
gl::Error createSRVForSampler(const gl::Context *context,
int baseLevel,
int mipLevels,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV) override;
gl::Error createSRVForImage(const gl::Context *context,
int level,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV) override;
gl::Error createUAVForImage(const gl::Context *context,
int level,
DXGI_FORMAT format,
const TextureHelper11 &texture,
d3d11::SharedUAV *outUAV) override;
TextureHelper11 mTexture;
std::unique_ptr<RenderTarget11> mRenderTarget;
......
......@@ -87,7 +87,7 @@ def get_swizzle_format_id(internal_format, angle_format):
# The format itself can be used for swizzles if it can be accessed as a render target and
# sampled and the bit count for all 4 channels is the same.
if "rtvFormat" in angle_format and "srvFormat" in angle_format and not channels_different and len(angle_format['channels']) == 4:
if "rtvFormat" in angle_format and "srvFormat" in angle_format and "uavFormat" in angle_format and not channels_different and len(angle_format['channels']) == 4:
return angle_format["glInternalFormat"] if "glInternalFormat" in angle_format else internal_format
b = int(math.ceil(float(max_component_bits) / 8) * 8)
......@@ -144,6 +144,7 @@ format_entry_template = """{space}{{
{space} angle::Format::ID::{formatName},
{space} {texFormat},
{space} {srvFormat},
{space} {uavFormat},
{space} {rtvFormat},
{space} {dsvFormat},
{space} {blitSRVFormat},
......@@ -159,6 +160,7 @@ split_format_entry_template = """{space} {condition}
{space} angle::Format::ID::{formatName},
{space} {texFormat},
{space} {srvFormat},
{space} {uavFormat},
{space} {rtvFormat},
{space} {dsvFormat},
{space} {blitSRVFormat},
......@@ -178,6 +180,7 @@ def json_to_table_data(internal_format, format_name, prefix, json):
"formatName": format_name,
"texFormat": "DXGI_FORMAT_UNKNOWN",
"srvFormat": "DXGI_FORMAT_UNKNOWN",
"uavFormat": "DXGI_FORMAT_UNKNOWN",
"rtvFormat": "DXGI_FORMAT_UNKNOWN",
"dsvFormat": "DXGI_FORMAT_UNKNOWN",
"condition": prefix,
......
......@@ -52,6 +52,9 @@ static constexpr std::array<SamplePositionsArray, 5> kSamplePositions = {
0.375f, 0.875f, 0.5f, 0.0625f, 0.25f, 0.125f, 0.125f, 0.75f,
0.0f, 0.5f, 0.9375f, 0.25f, 0.875f, 0.9375f, 0.0625f, 0.0f}}}};
// TODO(xinghua.cao@intel.com): Get a more accurate limit.
static D3D_FEATURE_LEVEL kMinimumFeatureLevelForES31 = D3D_FEATURE_LEVEL_11_0;
// Helper functor for querying DXGI support. Saves passing the parameters repeatedly.
class DXGISupportHelper : angle::NonCopyable
{
......@@ -1208,6 +1211,11 @@ gl::Version GetMaximumClientVersion(D3D_FEATURE_LEVEL featureLevel)
}
}
D3D_FEATURE_LEVEL GetMinimumFeatureLevelForES31()
{
return kMinimumFeatureLevelForES31;
}
unsigned int GetMaxViewportAndScissorRectanglesPerPipeline(D3D_FEATURE_LEVEL featureLevel)
{
switch (featureLevel)
......
......@@ -73,6 +73,8 @@ void GenerateCaps(ID3D11Device *device, ID3D11DeviceContext *deviceContext, cons
void GetSamplePosition(GLsizei sampleCount, size_t index, GLfloat *xy);
D3D_FEATURE_LEVEL GetMinimumFeatureLevelForES31();
} // namespace d3d11_gl
namespace d3d11
......
......@@ -14,6 +14,7 @@
"R8G8B8A8_UNORM": {
"texFormat": "DXGI_FORMAT_R8G8B8A8_UNORM",
"srvFormat": "DXGI_FORMAT_R8G8B8A8_UNORM",
"uavFormat": "DXGI_FORMAT_R8G8B8A8_UNORM",
"rtvFormat": "DXGI_FORMAT_R8G8B8A8_UNORM",
"channels": "rgba",
"componentType": "unorm",
......@@ -32,6 +33,7 @@
"R16G16B16A16_FLOAT": {
"texFormat": "DXGI_FORMAT_R16G16B16A16_FLOAT",
"srvFormat": "DXGI_FORMAT_R16G16B16A16_FLOAT",
"uavFormat": "DXGI_FORMAT_R16G16B16A16_FLOAT",
"rtvFormat": "DXGI_FORMAT_R16G16B16A16_FLOAT",
"channels": "rgba",
"componentType": "float",
......@@ -41,6 +43,7 @@
"R32G32B32A32_FLOAT": {
"texFormat": "DXGI_FORMAT_R32G32B32A32_FLOAT",
"srvFormat": "DXGI_FORMAT_R32G32B32A32_FLOAT",
"uavFormat": "DXGI_FORMAT_R32G32B32A32_FLOAT",
"rtvFormat": "DXGI_FORMAT_R32G32B32A32_FLOAT",
"channels": "rgba",
"componentType": "float",
......@@ -204,6 +207,7 @@
"R32_FLOAT": {
"texFormat": "DXGI_FORMAT_R32_FLOAT",
"srvFormat": "DXGI_FORMAT_R32_FLOAT",
"uavFormat": "DXGI_FORMAT_R32_FLOAT",
"rtvFormat": "DXGI_FORMAT_R32_FLOAT",
"channels": "r",
"componentType": "float",
......@@ -213,6 +217,7 @@
"R32_SINT": {
"texFormat": "DXGI_FORMAT_R32_SINT",
"srvFormat": "DXGI_FORMAT_R32_SINT",
"uavFormat": "DXGI_FORMAT_R32_SINT",
"rtvFormat": "DXGI_FORMAT_R32_SINT",
"channels": "r",
"componentType": "int",
......@@ -222,6 +227,7 @@
"R32_UINT": {
"texFormat": "DXGI_FORMAT_R32_UINT",
"srvFormat": "DXGI_FORMAT_R32_UINT",
"uavFormat": "DXGI_FORMAT_R32_UINT",
"rtvFormat": "DXGI_FORMAT_R32_UINT",
"channels": "r",
"componentType": "uint",
......@@ -373,6 +379,7 @@
"R16G16B16A16_SINT": {
"texFormat": "DXGI_FORMAT_R16G16B16A16_SINT",
"srvFormat": "DXGI_FORMAT_R16G16B16A16_SINT",
"uavFormat": "DXGI_FORMAT_R16G16B16A16_SINT",
"rtvFormat": "DXGI_FORMAT_R16G16B16A16_SINT",
"channels": "rgba",
"componentType": "int",
......@@ -382,6 +389,7 @@
"R16G16B16A16_UINT": {
"texFormat": "DXGI_FORMAT_R16G16B16A16_UINT",
"srvFormat": "DXGI_FORMAT_R16G16B16A16_UINT",
"uavFormat": "DXGI_FORMAT_R16G16B16A16_UINT",
"rtvFormat": "DXGI_FORMAT_R16G16B16A16_UINT",
"channels": "rgba",
"componentType": "uint",
......@@ -391,6 +399,7 @@
"R32G32B32A32_SINT": {
"texFormat": "DXGI_FORMAT_R32G32B32A32_SINT",
"srvFormat": "DXGI_FORMAT_R32G32B32A32_SINT",
"uavFormat": "DXGI_FORMAT_R32G32B32A32_SINT",
"rtvFormat": "DXGI_FORMAT_R32G32B32A32_SINT",
"channels": "rgba",
"componentType": "int",
......@@ -400,6 +409,7 @@
"R32G32B32A32_UINT": {
"texFormat": "DXGI_FORMAT_R32G32B32A32_UINT",
"srvFormat": "DXGI_FORMAT_R32G32B32A32_UINT",
"uavFormat": "DXGI_FORMAT_R32G32B32A32_UINT",
"rtvFormat": "DXGI_FORMAT_R32G32B32A32_UINT",
"channels": "rgba",
"componentType": "uint",
......@@ -438,6 +448,7 @@
"R8G8B8A8_UINT": {
"texFormat": "DXGI_FORMAT_R8G8B8A8_UINT",
"srvFormat": "DXGI_FORMAT_R8G8B8A8_UINT",
"uavFormat": "DXGI_FORMAT_R8G8B8A8_UINT",
"rtvFormat": "DXGI_FORMAT_R8G8B8A8_UINT",
"channels": "rgba",
"componentType": "uint",
......@@ -447,6 +458,7 @@
"R8G8B8A8_SNORM": {
"texFormat": "DXGI_FORMAT_R8G8B8A8_SNORM",
"srvFormat": "DXGI_FORMAT_R8G8B8A8_SNORM",
"uavFormat": "DXGI_FORMAT_R8G8B8A8_SNORM",
"channels": "rgba",
"componentType": "snorm",
"bits": { "red": 8, "green": 8, "blue": 8, "alpha": 8 },
......
......@@ -37,6 +37,7 @@ struct Format final : private angle::NonCopyable
angle::Format::ID formatID,
DXGI_FORMAT texFormat,
DXGI_FORMAT srvFormat,
DXGI_FORMAT uavFormat,
DXGI_FORMAT rtvFormat,
DXGI_FORMAT dsvFormat,
DXGI_FORMAT blitSRVFormat,
......@@ -54,6 +55,7 @@ struct Format final : private angle::NonCopyable
DXGI_FORMAT texFormat;
DXGI_FORMAT srvFormat;
DXGI_FORMAT uavFormat;
DXGI_FORMAT rtvFormat;
DXGI_FORMAT dsvFormat;
......@@ -69,6 +71,7 @@ constexpr Format::Format()
formatID(angle::Format::ID::NONE),
texFormat(DXGI_FORMAT_UNKNOWN),
srvFormat(DXGI_FORMAT_UNKNOWN),
uavFormat(DXGI_FORMAT_UNKNOWN),
rtvFormat(DXGI_FORMAT_UNKNOWN),
dsvFormat(DXGI_FORMAT_UNKNOWN),
blitSRVFormat(DXGI_FORMAT_UNKNOWN),
......@@ -81,6 +84,7 @@ constexpr Format::Format(GLenum internalFormat,
angle::Format::ID formatID,
DXGI_FORMAT texFormat,
DXGI_FORMAT srvFormat,
DXGI_FORMAT uavFormat,
DXGI_FORMAT rtvFormat,
DXGI_FORMAT dsvFormat,
DXGI_FORMAT blitSRVFormat,
......@@ -90,6 +94,7 @@ constexpr Format::Format(GLenum internalFormat,
formatID(formatID),
texFormat(texFormat),
srvFormat(srvFormat),
uavFormat(uavFormat),
rtvFormat(rtvFormat),
dsvFormat(dsvFormat),
blitSRVFormat(blitSRVFormat),
......
......@@ -40,6 +40,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R16G16B16A16_FLOAT,
DXGI_FORMAT_R16G16B16A16_FLOAT,
DXGI_FORMAT_R16G16B16A16_FLOAT,
DXGI_FORMAT_R16G16B16A16_FLOAT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R16G16B16A16_FLOAT,
GL_RGBA16F,
......@@ -53,6 +54,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R32G32B32A32_FLOAT,
DXGI_FORMAT_R32G32B32A32_FLOAT,
DXGI_FORMAT_R32G32B32A32_FLOAT,
DXGI_FORMAT_R32G32B32A32_FLOAT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R32G32B32A32_FLOAT,
GL_RGBA32F,
......@@ -67,6 +69,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
angle::Format::ID::A8_UNORM,
DXGI_FORMAT_A8_UNORM,
DXGI_FORMAT_A8_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_A8_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_A8_UNORM,
......@@ -81,6 +84,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R8G8B8A8_UNORM,
GL_RGBA8,
......@@ -96,6 +100,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
angle::Format::ID::B5G6R5_UNORM,
DXGI_FORMAT_B5G6R5_UNORM,
DXGI_FORMAT_B5G6R5_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_B5G6R5_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_B5G6R5_UNORM,
......@@ -110,6 +115,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R8G8B8A8_UNORM,
GL_RGBA8,
......@@ -123,6 +129,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
angle::Format::ID::B8G8R8A8_UNORM,
DXGI_FORMAT_B8G8R8A8_UNORM,
DXGI_FORMAT_B8G8R8A8_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_B8G8R8A8_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_B8G8R8A8_UNORM,
......@@ -136,6 +143,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
angle::Format::ID::B8G8R8A8_UNORM,
DXGI_FORMAT_B8G8R8A8_UNORM,
DXGI_FORMAT_B8G8R8A8_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_B8G8R8A8_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_B8G8R8A8_UNORM,
......@@ -149,6 +157,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
angle::Format::ID::B8G8R8A8_UNORM,
DXGI_FORMAT_B8G8R8A8_UNORM,
DXGI_FORMAT_B8G8R8A8_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_B8G8R8A8_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_B8G8R8A8_UNORM,
......@@ -162,6 +171,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
angle::Format::ID::B8G8R8A8_UNORM_SRGB,
DXGI_FORMAT_B8G8R8A8_UNORM_SRGB,
DXGI_FORMAT_B8G8R8A8_UNORM_SRGB,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_B8G8R8A8_UNORM_SRGB,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_B8G8R8A8_UNORM_SRGB,
......@@ -175,6 +185,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
angle::Format::ID::R8_UNORM,
DXGI_FORMAT_R8_UNORM,
DXGI_FORMAT_R8_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R8_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R8_UNORM,
......@@ -188,6 +199,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
angle::Format::ID::R8G8_UNORM,
DXGI_FORMAT_R8G8_UNORM,
DXGI_FORMAT_R8G8_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R8G8_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R8G8_UNORM,
......@@ -202,6 +214,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R8G8B8A8_UNORM,
GL_RGBA8,
......@@ -216,6 +229,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_BC1_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_BC1_UNORM,
GL_RGBA8,
nullptr);
......@@ -228,6 +242,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R8G8B8A8_UNORM,
GL_RGBA8,
......@@ -242,6 +257,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_BC1_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_BC1_UNORM,
GL_RGBA8,
nullptr);
......@@ -254,6 +270,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R8G8B8A8_UNORM,
GL_RGBA8,
......@@ -269,6 +286,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
GL_NONE,
nullptr);
return info;
......@@ -282,6 +300,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
GL_NONE,
nullptr);
return info;
......@@ -295,6 +314,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
GL_NONE,
nullptr);
return info;
......@@ -308,6 +328,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
GL_NONE,
nullptr);
return info;
......@@ -321,6 +342,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
GL_NONE,
nullptr);
return info;
......@@ -334,6 +356,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
GL_NONE,
nullptr);
return info;
......@@ -347,6 +370,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
GL_NONE,
nullptr);
return info;
......@@ -360,6 +384,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
GL_NONE,
nullptr);
return info;
......@@ -373,6 +398,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
GL_NONE,
nullptr);
return info;
......@@ -386,6 +412,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
GL_NONE,
nullptr);
return info;
......@@ -399,6 +426,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
GL_NONE,
nullptr);
return info;
......@@ -412,6 +440,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
GL_NONE,
nullptr);
return info;
......@@ -425,6 +454,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
GL_NONE,
nullptr);
return info;
......@@ -438,6 +468,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
GL_NONE,
nullptr);
return info;
......@@ -450,6 +481,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_BC1_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_BC1_UNORM,
GL_RGBA8,
nullptr);
......@@ -463,6 +495,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_BC2_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_BC2_UNORM,
GL_RGBA8,
nullptr);
......@@ -476,6 +509,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_BC3_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_BC3_UNORM,
GL_RGBA8,
nullptr);
......@@ -489,6 +523,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_BC1_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_BC1_UNORM,
GL_RGBA8,
nullptr);
......@@ -502,6 +537,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R8_SNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R8_SNORM,
GL_RGBA8_SNORM,
nullptr);
......@@ -515,6 +551,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R8G8_SNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R8G8_SNORM,
GL_RGBA8_SNORM,
nullptr);
......@@ -529,6 +566,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
GL_NONE,
nullptr);
return info;
......@@ -542,6 +580,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
GL_NONE,
nullptr);
return info;
......@@ -555,6 +594,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
GL_NONE,
nullptr);
return info;
......@@ -568,6 +608,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
GL_NONE,
nullptr);
return info;
......@@ -581,6 +622,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
GL_NONE,
nullptr);
return info;
......@@ -594,6 +636,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
GL_NONE,
nullptr);
return info;
......@@ -607,6 +650,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
GL_NONE,
nullptr);
return info;
......@@ -620,6 +664,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
GL_NONE,
nullptr);
return info;
......@@ -633,6 +678,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
GL_NONE,
nullptr);
return info;
......@@ -646,6 +692,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
GL_NONE,
nullptr);
return info;
......@@ -659,6 +706,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
GL_NONE,
nullptr);
return info;
......@@ -672,6 +720,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
GL_NONE,
nullptr);
return info;
......@@ -685,6 +734,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
GL_NONE,
nullptr);
return info;
......@@ -698,6 +748,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
GL_NONE,
nullptr);
return info;
......@@ -708,6 +759,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
angle::Format::ID::R8G8B8A8_UNORM_SRGB,
DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
......@@ -721,6 +773,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
angle::Format::ID::R8G8B8A8_UNORM_SRGB,
DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
......@@ -736,6 +789,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_BC1_UNORM_SRGB,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_BC1_UNORM_SRGB,
GL_RGBA8,
nullptr);
......@@ -747,6 +801,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
angle::Format::ID::R8G8B8A8_UNORM_SRGB,
DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
......@@ -762,6 +817,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_BC1_UNORM_SRGB,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_BC1_UNORM_SRGB,
GL_RGBA8,
nullptr);
......@@ -775,6 +831,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_BC1_UNORM_SRGB,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_BC1_UNORM_SRGB,
GL_RGBA8,
nullptr);
......@@ -788,6 +845,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_BC2_UNORM_SRGB,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_BC2_UNORM_SRGB,
GL_RGBA8,
nullptr);
......@@ -801,6 +859,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_BC3_UNORM_SRGB,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_BC3_UNORM_SRGB,
GL_RGBA8,
nullptr);
......@@ -814,6 +873,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_BC1_UNORM_SRGB,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_BC1_UNORM_SRGB,
GL_RGBA8,
nullptr);
......@@ -828,6 +888,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R24G8_TYPELESS,
DXGI_FORMAT_R24_UNORM_X8_TYPELESS,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_D24_UNORM_S8_UINT,
DXGI_FORMAT_R24_UNORM_X8_TYPELESS,
GL_RGBA32F,
......@@ -841,6 +902,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_D24_UNORM_S8_UINT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_D24_UNORM_S8_UINT,
DXGI_FORMAT_UNKNOWN,
GL_RGBA32F,
......@@ -855,6 +917,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R32G8X24_TYPELESS,
DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_D32_FLOAT_S8X24_UINT,
DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS,
GL_RGBA32F,
......@@ -870,6 +933,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R16_TYPELESS,
DXGI_FORMAT_R16_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_D16_UNORM,
DXGI_FORMAT_R16_UNORM,
GL_RGBA16_EXT,
......@@ -883,6 +947,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_D16_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_D16_UNORM,
DXGI_FORMAT_UNKNOWN,
GL_RGBA16_EXT,
......@@ -899,6 +964,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R24G8_TYPELESS,
DXGI_FORMAT_R24_UNORM_X8_TYPELESS,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_D24_UNORM_S8_UINT,
DXGI_FORMAT_R24_UNORM_X8_TYPELESS,
GL_RGBA32F,
......@@ -912,6 +978,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_D24_UNORM_S8_UINT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_D24_UNORM_S8_UINT,
DXGI_FORMAT_UNKNOWN,
GL_RGBA32F,
......@@ -926,6 +993,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R32_TYPELESS,
DXGI_FORMAT_R32_FLOAT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_D32_FLOAT,
DXGI_FORMAT_R32_FLOAT,
GL_RGBA32F,
......@@ -941,6 +1009,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R24G8_TYPELESS,
DXGI_FORMAT_R24_UNORM_X8_TYPELESS,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_D24_UNORM_S8_UINT,
DXGI_FORMAT_R24_UNORM_X8_TYPELESS,
GL_RGBA32F,
......@@ -954,6 +1023,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_D24_UNORM_S8_UINT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_D24_UNORM_S8_UINT,
DXGI_FORMAT_UNKNOWN,
GL_RGBA32F,
......@@ -969,6 +1039,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_BC1_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_BC1_UNORM,
GL_RGBA8,
nullptr);
......@@ -981,6 +1052,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R8G8B8A8_UNORM,
GL_RGBA8,
......@@ -994,6 +1066,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R16G16B16A16_FLOAT,
DXGI_FORMAT_R16G16B16A16_FLOAT,
DXGI_FORMAT_R16G16B16A16_FLOAT,
DXGI_FORMAT_R16G16B16A16_FLOAT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R16G16B16A16_FLOAT,
GL_RGBA16F,
......@@ -1007,6 +1080,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R32G32B32A32_FLOAT,
DXGI_FORMAT_R32G32B32A32_FLOAT,
DXGI_FORMAT_R32G32B32A32_FLOAT,
DXGI_FORMAT_R32G32B32A32_FLOAT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R32G32B32A32_FLOAT,
GL_RGBA32F,
......@@ -1020,6 +1094,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R8G8B8A8_UNORM,
GL_RGBA8,
......@@ -1033,6 +1108,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R8G8B8A8_UNORM,
GL_RGBA8,
......@@ -1046,6 +1122,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R16G16B16A16_FLOAT,
DXGI_FORMAT_R16G16B16A16_FLOAT,
DXGI_FORMAT_R16G16B16A16_FLOAT,
DXGI_FORMAT_R16G16B16A16_FLOAT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R16G16B16A16_FLOAT,
GL_RGBA16F,
......@@ -1059,6 +1136,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R32G32B32A32_FLOAT,
DXGI_FORMAT_R32G32B32A32_FLOAT,
DXGI_FORMAT_R32G32B32A32_FLOAT,
DXGI_FORMAT_R32G32B32A32_FLOAT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R32G32B32A32_FLOAT,
GL_RGBA32F,
......@@ -1074,6 +1152,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
GL_NONE,
nullptr);
return info;
......@@ -1084,6 +1163,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
angle::Format::ID::R11G11B10_FLOAT,
DXGI_FORMAT_R11G11B10_FLOAT,
DXGI_FORMAT_R11G11B10_FLOAT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R11G11B10_FLOAT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R11G11B10_FLOAT,
......@@ -1097,6 +1177,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
angle::Format::ID::R16_FLOAT,
DXGI_FORMAT_R16_FLOAT,
DXGI_FORMAT_R16_FLOAT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R16_FLOAT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R16_FLOAT,
......@@ -1110,6 +1191,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
angle::Format::ID::R16_SINT,
DXGI_FORMAT_R16_SINT,
DXGI_FORMAT_R16_SINT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R16_SINT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R16_SINT,
......@@ -1123,6 +1205,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
angle::Format::ID::R16_UINT,
DXGI_FORMAT_R16_UINT,
DXGI_FORMAT_R16_UINT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R16_UINT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R16_UINT,
......@@ -1136,6 +1219,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
angle::Format::ID::R16_UNORM,
DXGI_FORMAT_R16_UNORM,
DXGI_FORMAT_R16_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R16_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R16_UNORM,
......@@ -1151,6 +1235,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R16_SNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R16_SNORM,
GL_RGBA16_SNORM_EXT,
nullptr);
......@@ -1163,6 +1248,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R32_FLOAT,
DXGI_FORMAT_R32_FLOAT,
DXGI_FORMAT_R32_FLOAT,
DXGI_FORMAT_R32_FLOAT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R32_FLOAT,
GL_RGBA32F,
......@@ -1176,6 +1262,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R32_SINT,
DXGI_FORMAT_R32_SINT,
DXGI_FORMAT_R32_SINT,
DXGI_FORMAT_R32_SINT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R32_SINT,
GL_RGBA32I,
......@@ -1189,6 +1276,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R32_UINT,
DXGI_FORMAT_R32_UINT,
DXGI_FORMAT_R32_UINT,
DXGI_FORMAT_R32_UINT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R32_UINT,
GL_RGBA32I,
......@@ -1201,6 +1289,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
angle::Format::ID::R8_UNORM,
DXGI_FORMAT_R8_UNORM,
DXGI_FORMAT_R8_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R8_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R8_UNORM,
......@@ -1214,6 +1303,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
angle::Format::ID::R8_SINT,
DXGI_FORMAT_R8_SINT,
DXGI_FORMAT_R8_SINT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R8_SINT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R8_SINT,
......@@ -1227,6 +1317,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
angle::Format::ID::R8_UINT,
DXGI_FORMAT_R8_UINT,
DXGI_FORMAT_R8_UINT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R8_UINT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R8_UINT,
......@@ -1242,6 +1333,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R8_SNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R8_SNORM,
GL_RGBA8_SNORM,
nullptr);
......@@ -1253,6 +1345,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
angle::Format::ID::R16G16_FLOAT,
DXGI_FORMAT_R16G16_FLOAT,
DXGI_FORMAT_R16G16_FLOAT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R16G16_FLOAT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R16G16_FLOAT,
......@@ -1266,6 +1359,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
angle::Format::ID::R16G16_SINT,
DXGI_FORMAT_R16G16_SINT,
DXGI_FORMAT_R16G16_SINT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R16G16_SINT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R16G16_SINT,
......@@ -1279,6 +1373,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
angle::Format::ID::R16G16_UINT,
DXGI_FORMAT_R16G16_UINT,
DXGI_FORMAT_R16G16_UINT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R16G16_UINT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R16G16_UINT,
......@@ -1292,6 +1387,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
angle::Format::ID::R16G16_UNORM,
DXGI_FORMAT_R16G16_UNORM,
DXGI_FORMAT_R16G16_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R16G16_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R16G16_UNORM,
......@@ -1307,6 +1403,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R16G16_SNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R16G16_SNORM,
GL_RGBA16_SNORM_EXT,
nullptr);
......@@ -1318,6 +1415,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
angle::Format::ID::R32G32_FLOAT,
DXGI_FORMAT_R32G32_FLOAT,
DXGI_FORMAT_R32G32_FLOAT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R32G32_FLOAT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R32G32_FLOAT,
......@@ -1331,6 +1429,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
angle::Format::ID::R32G32_SINT,
DXGI_FORMAT_R32G32_SINT,
DXGI_FORMAT_R32G32_SINT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R32G32_SINT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R32G32_SINT,
......@@ -1344,6 +1443,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
angle::Format::ID::R32G32_UINT,
DXGI_FORMAT_R32G32_UINT,
DXGI_FORMAT_R32G32_UINT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R32G32_UINT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R32G32_UINT,
......@@ -1357,6 +1457,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
angle::Format::ID::R8G8_UNORM,
DXGI_FORMAT_R8G8_UNORM,
DXGI_FORMAT_R8G8_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R8G8_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R8G8_UNORM,
......@@ -1370,6 +1471,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
angle::Format::ID::R8G8_SINT,
DXGI_FORMAT_R8G8_SINT,
DXGI_FORMAT_R8G8_SINT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R8G8_SINT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R8G8_SINT,
......@@ -1383,6 +1485,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
angle::Format::ID::R8G8_UINT,
DXGI_FORMAT_R8G8_UINT,
DXGI_FORMAT_R8G8_UINT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R8G8_UINT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R8G8_UINT,
......@@ -1398,6 +1501,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R8G8_SNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R8G8_SNORM,
GL_RGBA8_SNORM,
nullptr);
......@@ -1410,6 +1514,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R8G8B8A8_UNORM,
GL_RGBA8,
......@@ -1422,6 +1527,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
angle::Format::ID::R10G10B10A2_UNORM,
DXGI_FORMAT_R10G10B10A2_UNORM,
DXGI_FORMAT_R10G10B10A2_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R10G10B10A2_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R10G10B10A2_UNORM,
......@@ -1435,6 +1541,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
angle::Format::ID::R10G10B10A2_UINT,
DXGI_FORMAT_R10G10B10A2_UINT,
DXGI_FORMAT_R10G10B10A2_UINT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R10G10B10A2_UINT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R10G10B10A2_UINT,
......@@ -1449,6 +1556,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R16G16B16A16_FLOAT,
DXGI_FORMAT_R16G16B16A16_FLOAT,
DXGI_FORMAT_R16G16B16A16_FLOAT,
DXGI_FORMAT_R16G16B16A16_FLOAT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R16G16B16A16_FLOAT,
GL_RGBA16F,
......@@ -1462,6 +1570,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R16G16B16A16_SINT,
DXGI_FORMAT_R16G16B16A16_SINT,
DXGI_FORMAT_R16G16B16A16_SINT,
DXGI_FORMAT_R16G16B16A16_SINT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R16G16B16A16_SINT,
GL_RGBA16I,
......@@ -1475,6 +1584,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R16G16B16A16_UINT,
DXGI_FORMAT_R16G16B16A16_UINT,
DXGI_FORMAT_R16G16B16A16_UINT,
DXGI_FORMAT_R16G16B16A16_UINT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R16G16B16A16_UINT,
GL_RGBA16UI,
......@@ -1487,6 +1597,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
angle::Format::ID::R16G16B16A16_UNORM,
DXGI_FORMAT_R16G16B16A16_UNORM,
DXGI_FORMAT_R16G16B16A16_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R16G16B16A16_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R16G16B16A16_UNORM,
......@@ -1502,6 +1613,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R16G16B16A16_SNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R16G16B16A16_SNORM,
GL_RGBA16_SNORM_EXT,
Initialize4ComponentData<GLushort, 0x0000, 0x0000, 0x0000, 0x7FFF>);
......@@ -1514,6 +1626,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R32G32B32A32_FLOAT,
DXGI_FORMAT_R32G32B32A32_FLOAT,
DXGI_FORMAT_R32G32B32A32_FLOAT,
DXGI_FORMAT_R32G32B32A32_FLOAT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R32G32B32A32_FLOAT,
GL_RGBA32F,
......@@ -1527,6 +1640,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R32G32B32A32_SINT,
DXGI_FORMAT_R32G32B32A32_SINT,
DXGI_FORMAT_R32G32B32A32_SINT,
DXGI_FORMAT_R32G32B32A32_SINT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R32G32B32A32_SINT,
GL_RGBA32I,
......@@ -1540,6 +1654,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R32G32B32A32_UINT,
DXGI_FORMAT_R32G32B32A32_UINT,
DXGI_FORMAT_R32G32B32A32_UINT,
DXGI_FORMAT_R32G32B32A32_UINT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R32G32B32A32_UINT,
GL_RGBA32UI,
......@@ -1554,6 +1669,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
angle::Format::ID::B5G6R5_UNORM,
DXGI_FORMAT_B5G6R5_UNORM,
DXGI_FORMAT_B5G6R5_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_B5G6R5_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_B5G6R5_UNORM,
......@@ -1568,6 +1684,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R8G8B8A8_UNORM,
GL_RGBA8,
......@@ -1583,6 +1700,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
angle::Format::ID::B5G5R5A1_UNORM,
DXGI_FORMAT_B5G5R5A1_UNORM,
DXGI_FORMAT_B5G5R5A1_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_B5G5R5A1_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_B5G5R5A1_UNORM,
......@@ -1597,6 +1715,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R8G8B8A8_UNORM,
GL_RGBA8,
......@@ -1611,6 +1730,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R8G8B8A8_UNORM,
GL_RGBA8,
......@@ -1623,6 +1743,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
angle::Format::ID::R8G8B8A8_SINT,
DXGI_FORMAT_R8G8B8A8_SINT,
DXGI_FORMAT_R8G8B8A8_SINT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R8G8B8A8_SINT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R8G8B8A8_SINT,
......@@ -1637,6 +1758,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R8G8B8A8_UINT,
DXGI_FORMAT_R8G8B8A8_UINT,
DXGI_FORMAT_R8G8B8A8_UINT,
DXGI_FORMAT_R8G8B8A8_UINT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R8G8B8A8_UINT,
GL_RGBA8UI,
......@@ -1649,6 +1771,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
angle::Format::ID::R8G8B8A8_SNORM,
DXGI_FORMAT_R8G8B8A8_SNORM,
DXGI_FORMAT_R8G8B8A8_SNORM,
DXGI_FORMAT_R8G8B8A8_SNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R8G8B8A8_SNORM,
......@@ -1664,6 +1787,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R9G9B9E5_SHAREDEXP,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R9G9B9E5_SHAREDEXP,
GL_RGBA16F_EXT,
nullptr);
......@@ -1676,6 +1800,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R8G8B8A8_UNORM,
GL_RGBA8,
......@@ -1689,6 +1814,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R16G16B16A16_FLOAT,
DXGI_FORMAT_R16G16B16A16_FLOAT,
DXGI_FORMAT_R16G16B16A16_FLOAT,
DXGI_FORMAT_R16G16B16A16_FLOAT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R16G16B16A16_FLOAT,
GL_RGBA16F,
......@@ -1702,6 +1828,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R16G16B16A16_SINT,
DXGI_FORMAT_R16G16B16A16_SINT,
DXGI_FORMAT_R16G16B16A16_SINT,
DXGI_FORMAT_R16G16B16A16_SINT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R16G16B16A16_SINT,
GL_RGBA16I,
......@@ -1715,6 +1842,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R16G16B16A16_UINT,
DXGI_FORMAT_R16G16B16A16_UINT,
DXGI_FORMAT_R16G16B16A16_UINT,
DXGI_FORMAT_R16G16B16A16_UINT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R16G16B16A16_UINT,
GL_RGBA16UI,
......@@ -1727,6 +1855,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
angle::Format::ID::R16G16B16A16_UNORM,
DXGI_FORMAT_R16G16B16A16_UNORM,
DXGI_FORMAT_R16G16B16A16_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R16G16B16A16_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R16G16B16A16_UNORM,
......@@ -1742,6 +1871,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R16G16B16A16_SNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R16G16B16A16_SNORM,
GL_RGBA16_SNORM_EXT,
nullptr);
......@@ -1754,6 +1884,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R32G32B32A32_FLOAT,
DXGI_FORMAT_R32G32B32A32_FLOAT,
DXGI_FORMAT_R32G32B32A32_FLOAT,
DXGI_FORMAT_R32G32B32A32_FLOAT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R32G32B32A32_FLOAT,
GL_RGBA32F,
......@@ -1767,6 +1898,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R32G32B32A32_SINT,
DXGI_FORMAT_R32G32B32A32_SINT,
DXGI_FORMAT_R32G32B32A32_SINT,
DXGI_FORMAT_R32G32B32A32_SINT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R32G32B32A32_SINT,
GL_RGBA32I,
......@@ -1780,6 +1912,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R32G32B32A32_UINT,
DXGI_FORMAT_R32G32B32A32_UINT,
DXGI_FORMAT_R32G32B32A32_UINT,
DXGI_FORMAT_R32G32B32A32_UINT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R32G32B32A32_UINT,
GL_RGBA32UI,
......@@ -1794,6 +1927,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
angle::Format::ID::B4G4R4A4_UNORM,
DXGI_FORMAT_B4G4R4A4_UNORM,
DXGI_FORMAT_B4G4R4A4_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_B4G4R4A4_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_B4G4R4A4_UNORM,
......@@ -1808,6 +1942,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R8G8B8A8_UNORM,
GL_RGBA8,
......@@ -1822,6 +1957,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R8G8B8A8_UNORM,
GL_RGBA8,
......@@ -1834,6 +1970,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
angle::Format::ID::R8G8B8A8_SINT,
DXGI_FORMAT_R8G8B8A8_SINT,
DXGI_FORMAT_R8G8B8A8_SINT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R8G8B8A8_SINT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R8G8B8A8_SINT,
......@@ -1848,6 +1985,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R8G8B8A8_UINT,
DXGI_FORMAT_R8G8B8A8_UINT,
DXGI_FORMAT_R8G8B8A8_UINT,
DXGI_FORMAT_R8G8B8A8_UINT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R8G8B8A8_UINT,
GL_RGBA8UI,
......@@ -1860,6 +1998,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
angle::Format::ID::R8G8B8A8_SNORM,
DXGI_FORMAT_R8G8B8A8_SNORM,
DXGI_FORMAT_R8G8B8A8_SNORM,
DXGI_FORMAT_R8G8B8A8_SNORM,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R8G8B8A8_SNORM,
......@@ -1873,6 +2012,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
angle::Format::ID::R8G8B8A8_UNORM_SRGB,
DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
......@@ -1886,6 +2026,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
angle::Format::ID::R8G8B8A8_UNORM_SRGB,
DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
......@@ -1902,6 +2043,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_R24G8_TYPELESS,
DXGI_FORMAT_R24_UNORM_X8_TYPELESS,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_D24_UNORM_S8_UINT,
DXGI_FORMAT_R24_UNORM_X8_TYPELESS,
GL_RGBA32F,
......@@ -1915,6 +2057,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
DXGI_FORMAT_D24_UNORM_S8_UINT,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_D24_UNORM_S8_UINT,
DXGI_FORMAT_UNKNOWN,
GL_RGBA32F,
......
......@@ -346,8 +346,6 @@ TEST_P(ComputeShaderTest, DispatchCompute)
// Use image uniform to write texture in compute shader, and verify the content is expected.
TEST_P(ComputeShaderTest, BindImageTexture)
{
ANGLE_SKIP_TEST_IF(IsD3D11());
GLTexture mTexture[2];
GLFramebuffer mFramebuffer;
const std::string csSource =
......@@ -528,6 +526,88 @@ TEST_P(ComputeShaderTest, ImageSize)
EXPECT_GL_NO_ERROR();
}
// Use image uniform to read and write textures in compute shader, and verify the contents.
TEST_P(ComputeShaderTest, BindImageTextureWithTexture2D)
{
GLTexture texture[2];
GLFramebuffer framebuffer;
const std::string csSource =
R"(#version 310 es
layout(local_size_x=4, local_size_y=2, local_size_z=1) in;
layout(r32ui, binding = 0) readonly uniform highp uimage2D uImage_1;
layout(r32ui, binding = 1) writeonly uniform highp uimage2D uImage_2;
void main()
{
uvec4 value = imageLoad(uImage_1, ivec2(gl_LocalInvocationID.xy));
imageStore(uImage_2, ivec2(gl_LocalInvocationID.xy), value);
})";
constexpr int kWidth = 4, kHeight = 2;
constexpr GLuint kInputValues[2][8] = {{200, 200, 200, 200, 200, 200, 200, 200},
{100, 100, 100, 100, 100, 100, 100, 100}};
glBindTexture(GL_TEXTURE_2D, texture[0]);
glTexStorage2D(GL_TEXTURE_2D, 1, GL_R32UI, kWidth, kHeight);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kWidth, kHeight, GL_RED_INTEGER, GL_UNSIGNED_INT,
kInputValues[0]);
EXPECT_GL_NO_ERROR();
glBindTexture(GL_TEXTURE_2D, texture[1]);
glTexStorage2D(GL_TEXTURE_2D, 1, GL_R32UI, kWidth, kHeight);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kWidth, kHeight, GL_RED_INTEGER, GL_UNSIGNED_INT,
kInputValues[1]);
EXPECT_GL_NO_ERROR();
glUseProgram(0);
GLuint outputValues[8];
constexpr GLuint expectedValue_1 = 200;
constexpr GLuint expectedValue_2 = 100;
glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffer);
glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture[0], 0);
EXPECT_GL_NO_ERROR();
glReadPixels(0, 0, kWidth, kHeight, GL_RED_INTEGER, GL_UNSIGNED_INT, outputValues);
for (int i = 0; i < kWidth * kHeight; i++)
{
EXPECT_EQ(expectedValue_1, outputValues[i]);
}
glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture[1], 0);
EXPECT_GL_NO_ERROR();
glReadPixels(0, 0, kWidth, kHeight, GL_RED_INTEGER, GL_UNSIGNED_INT, outputValues);
for (int i = 0; i < kWidth * kHeight; i++)
{
EXPECT_EQ(expectedValue_2, outputValues[i]);
}
ANGLE_GL_COMPUTE_PROGRAM(program, csSource);
glUseProgram(program.get());
glBindImageTexture(0, texture[0], 0, GL_FALSE, 0, GL_READ_ONLY, GL_R32UI);
EXPECT_GL_NO_ERROR();
glBindImageTexture(1, texture[1], 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_R32UI);
EXPECT_GL_NO_ERROR();
glDispatchCompute(1, 1, 1);
EXPECT_GL_NO_ERROR();
glUseProgram(0);
glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffer);
glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture[1], 0);
EXPECT_GL_NO_ERROR();
glReadPixels(0, 0, kWidth, kHeight, GL_RED_INTEGER, GL_UNSIGNED_INT, outputValues);
EXPECT_GL_NO_ERROR();
for (int i = 0; i < kWidth * kHeight; i++)
{
EXPECT_EQ(expectedValue_1, outputValues[i]);
}
}
// Check that it is not possible to create a compute shader when the context does not support ES
// 3.10
TEST_P(ComputeShaderTestES3, NotSupported)
......
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