Commit 417df92f by Jamie Madill Committed by Commit Bot

Revert "D3D11: Add support to compile and link compute shaders."

Fails https://build.chromium.org/p/chromium.gpu.fyi/builders/Linux%20Debug%20%28New%20Intel%29/builds/5769 BUG=angleproject:1442 This reverts commit 2cd9d7e0. Change-Id: Ic1610d20ba0449b423528fa9840aa951c012cf84 Reviewed-on: https://chromium-review.googlesource.com/427229Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>
parent afcc41ce
...@@ -115,11 +115,6 @@ OutputHLSL::OutputHLSL(sh::GLenum shaderType, ...@@ -115,11 +115,6 @@ OutputHLSL::OutputHLSL(sh::GLenum shaderType,
mUsesInstanceID = false; mUsesInstanceID = false;
mUsesVertexID = false; mUsesVertexID = false;
mUsesFragDepth = false; mUsesFragDepth = false;
mUsesNumWorkGroups = false;
mUsesWorkGroupID = false;
mUsesLocalInvocationID = false;
mUsesGlobalInvocationID = false;
mUsesLocalInvocationIndex = false;
mUsesXor = false; mUsesXor = false;
mUsesDiscardRewriting = false; mUsesDiscardRewriting = false;
mUsesNestedBreak = false; mUsesNestedBreak = false;
...@@ -545,7 +540,7 @@ void OutputHLSL::header(TInfoSinkBase &out, const BuiltInFunctionEmulator *built ...@@ -545,7 +540,7 @@ void OutputHLSL::header(TInfoSinkBase &out, const BuiltInFunctionEmulator *built
out << "#define GL_USES_FRAG_DATA\n"; out << "#define GL_USES_FRAG_DATA\n";
} }
} }
else if (mShaderType == GL_VERTEX_SHADER) else // Vertex shader
{ {
out << "// Attributes\n"; out << "// Attributes\n";
out << attributes; out << attributes;
...@@ -636,40 +631,6 @@ void OutputHLSL::header(TInfoSinkBase &out, const BuiltInFunctionEmulator *built ...@@ -636,40 +631,6 @@ void OutputHLSL::header(TInfoSinkBase &out, const BuiltInFunctionEmulator *built
out << "\n"; out << "\n";
} }
} }
else // Compute shader
{
ASSERT(mShaderType == GL_COMPUTE_SHADER);
if (mUsesNumWorkGroups)
{
out << "cbuffer DriverConstants : register(b1)\n"
"{\n";
out << " uint3 gl_NumWorkGroups : packoffset(c0);\n";
out << "};\n";
}
// Follow built-in variables would be initialized in
// DynamicHLSL::generateComputeShaderLinkHLSL, if they
// are used in compute shader.
if (mUsesWorkGroupID)
{
out << "static uint3 gl_WorkGroupID = uint3(0, 0, 0);\n";
}
if (mUsesLocalInvocationID)
{
out << "static uint3 gl_LocalInvocationID = uint3(0, 0, 0);\n";
}
if (mUsesGlobalInvocationID)
{
out << "static uint3 gl_GlobalInvocationID = uint3(0, 0, 0);\n";
}
if (mUsesLocalInvocationIndex)
{
out << "static uint gl_LocalInvocationIndex = uint(0);\n";
}
}
bool getDimensionsIgnoresBaseLevel = bool getDimensionsIgnoresBaseLevel =
(mCompileOptions & SH_HLSL_GET_DIMENSIONS_IGNORES_BASE_LEVEL) != 0; (mCompileOptions & SH_HLSL_GET_DIMENSIONS_IGNORES_BASE_LEVEL) != 0;
...@@ -705,31 +666,6 @@ void OutputHLSL::header(TInfoSinkBase &out, const BuiltInFunctionEmulator *built ...@@ -705,31 +666,6 @@ void OutputHLSL::header(TInfoSinkBase &out, const BuiltInFunctionEmulator *built
out << "#define GL_USES_DEPTH_RANGE\n"; out << "#define GL_USES_DEPTH_RANGE\n";
} }
if (mUsesNumWorkGroups)
{
out << "#define GL_USES_NUM_WORK_GROUPS\n";
}
if (mUsesWorkGroupID)
{
out << "#define GL_USES_WORK_GROUP_ID\n";
}
if (mUsesLocalInvocationID)
{
out << "#define GL_USES_LOCAL_INVOCATION_ID\n";
}
if (mUsesGlobalInvocationID)
{
out << "#define GL_USES_GLOBAL_INVOCATION_ID\n";
}
if (mUsesLocalInvocationIndex)
{
out << "#define GL_USES_LOCAL_INVOCATION_INDEX\n";
}
if (mUsesXor) if (mUsesXor)
{ {
out << "bool xor(bool p, bool q)\n" out << "bool xor(bool p, bool q)\n"
...@@ -843,31 +779,6 @@ void OutputHLSL::visitSymbol(TIntermSymbol *node) ...@@ -843,31 +779,6 @@ void OutputHLSL::visitSymbol(TIntermSymbol *node)
mUsesFragDepth = true; mUsesFragDepth = true;
out << "gl_Depth"; out << "gl_Depth";
} }
else if (qualifier == EvqNumWorkGroups)
{
mUsesNumWorkGroups = true;
out << name;
}
else if (qualifier == EvqWorkGroupID)
{
mUsesWorkGroupID = true;
out << name;
}
else if (qualifier == EvqLocalInvocationID)
{
mUsesLocalInvocationID = true;
out << name;
}
else if (qualifier == EvqGlobalInvocationID)
{
mUsesGlobalInvocationID = true;
out << name;
}
else if (qualifier == EvqLocalInvocationIndex)
{
mUsesLocalInvocationIndex = true;
out << name;
}
else else
{ {
out << DecorateIfNeeded(node->getName()); out << DecorateIfNeeded(node->getName());
......
...@@ -173,11 +173,6 @@ class OutputHLSL : public TIntermTraverser ...@@ -173,11 +173,6 @@ class OutputHLSL : public TIntermTraverser
bool mUsesInstanceID; bool mUsesInstanceID;
bool mUsesVertexID; bool mUsesVertexID;
bool mUsesFragDepth; bool mUsesFragDepth;
bool mUsesNumWorkGroups;
bool mUsesWorkGroupID;
bool mUsesLocalInvocationID;
bool mUsesGlobalInvocationID;
bool mUsesLocalInvocationIndex;
bool mUsesXor; bool mUsesXor;
bool mUsesDiscardRewriting; bool mUsesDiscardRewriting;
bool mUsesNestedBreak; bool mUsesNestedBreak;
......
...@@ -42,8 +42,7 @@ PrimitiveType GetPrimitiveType(GLenum drawMode); ...@@ -42,8 +42,7 @@ PrimitiveType GetPrimitiveType(GLenum drawMode);
enum SamplerType enum SamplerType
{ {
SAMPLER_PIXEL, SAMPLER_PIXEL,
SAMPLER_VERTEX, SAMPLER_VERTEX
SAMPLER_COMPUTE
}; };
struct Rectangle struct Rectangle
...@@ -289,11 +288,6 @@ inline DestT *GetImplAs(SrcT *src) ...@@ -289,11 +288,6 @@ inline DestT *GetImplAs(SrcT *src)
return GetAs<DestT>(src->getImplementation()); return GetAs<DestT>(src->getImplementation());
} }
template <typename DestT, typename SrcT>
inline DestT *SafeGetImplAs(SrcT *src)
{
return src != nullptr ? GetAs<DestT>(src->getImplementation()) : nullptr;
}
} }
#include "angletypes.inl" #include "angletypes.inl"
......
...@@ -764,79 +764,6 @@ void DynamicHLSL::generateShaderLinkHLSL(const gl::ContextState &data, ...@@ -764,79 +764,6 @@ void DynamicHLSL::generateShaderLinkHLSL(const gl::ContextState &data,
*pixelHLSL = pixelStream.str(); *pixelHLSL = pixelStream.str();
} }
std::string DynamicHLSL::generateComputeShaderLinkHLSL(const gl::ProgramState &programData) const
{
const gl::Shader *computeShaderGL = programData.getAttachedComputeShader();
std::stringstream computeStream;
std::string translatedSource = computeShaderGL->getTranslatedSource();
computeStream << translatedSource;
bool usesWorkGroupID = translatedSource.find("GL_USES_WORK_GROUP_ID") != std::string::npos;
bool usesLocalInvocationID =
translatedSource.find("GL_USES_LOCAL_INVOCATION_ID") != std::string::npos;
bool usesGlobalInvocationID =
translatedSource.find("GL_USES_GLOBAL_INVOCATION_ID") != std::string::npos;
bool usesLocalInvocationIndex =
translatedSource.find("GL_USES_LOCAL_INVOCATION_INDEX") != std::string::npos;
computeStream << "\nstruct CS_INPUT\n{\n";
if (usesWorkGroupID)
{
computeStream << " uint3 dx_WorkGroupID : "
<< "SV_GroupID;\n";
}
if (usesLocalInvocationID)
{
computeStream << " uint3 dx_LocalInvocationID : "
<< "SV_GroupThreadID;\n";
}
if (usesGlobalInvocationID)
{
computeStream << " uint3 dx_GlobalInvocationID : "
<< "SV_DispatchThreadID;\n";
}
if (usesLocalInvocationIndex)
{
computeStream << " uint dx_LocalInvocationIndex : "
<< "SV_GroupIndex;\n";
}
computeStream << "};\n\n";
const sh::WorkGroupSize &localSize = computeShaderGL->getWorkGroupSize();
computeStream << "[numthreads(" << localSize[0] << ", " << localSize[1] << ", " << localSize[2]
<< ")]\n";
computeStream << "void main(CS_INPUT input)\n"
<< "{\n";
if (usesWorkGroupID)
{
computeStream << " gl_WorkGroupID = input.dx_WorkGroupID;\n";
}
if (usesLocalInvocationID)
{
computeStream << " gl_LocalInvocationID = input.dx_LocalInvocationID;\n";
}
if (usesGlobalInvocationID)
{
computeStream << " gl_GlobalInvocationID = input.dx_GlobalInvocationID;\n";
}
if (usesLocalInvocationIndex)
{
computeStream << " gl_LocalInvocationIndex = input.dx_LocalInvocationIndex;\n";
}
computeStream << "\n"
<< " gl_main();\n"
<< "}\n";
return computeStream.str();
}
std::string DynamicHLSL::generateGeometryShaderPreamble(const VaryingPacking &varyingPacking, std::string DynamicHLSL::generateGeometryShaderPreamble(const VaryingPacking &varyingPacking,
const BuiltinVaryingsD3D &builtinsD3D) const const BuiltinVaryingsD3D &builtinsD3D) const
{ {
......
...@@ -115,7 +115,6 @@ class DynamicHLSL : angle::NonCopyable ...@@ -115,7 +115,6 @@ class DynamicHLSL : angle::NonCopyable
const BuiltinVaryingsD3D &builtinsD3D, const BuiltinVaryingsD3D &builtinsD3D,
std::string *pixelHLSL, std::string *pixelHLSL,
std::string *vertexHLSL) const; std::string *vertexHLSL) const;
std::string generateComputeShaderLinkHLSL(const gl::ProgramState &programData) const;
std::string generateGeometryShaderPreamble(const gl::VaryingPacking &varyingPacking, std::string generateGeometryShaderPreamble(const gl::VaryingPacking &varyingPacking,
const BuiltinVaryingsD3D &builtinsD3D) const; const BuiltinVaryingsD3D &builtinsD3D) const;
......
...@@ -246,7 +246,6 @@ D3DUniform::D3DUniform(GLenum typeIn, ...@@ -246,7 +246,6 @@ D3DUniform::D3DUniform(GLenum typeIn,
dirty(true), dirty(true),
vsRegisterIndex(GL_INVALID_INDEX), vsRegisterIndex(GL_INVALID_INDEX),
psRegisterIndex(GL_INVALID_INDEX), psRegisterIndex(GL_INVALID_INDEX),
csRegisterIndex(GL_INVALID_INDEX),
registerCount(0), registerCount(0),
registerElement(0) registerElement(0)
{ {
...@@ -284,11 +283,6 @@ bool D3DUniform::isReferencedByFragmentShader() const ...@@ -284,11 +283,6 @@ bool D3DUniform::isReferencedByFragmentShader() const
return psRegisterIndex != GL_INVALID_INDEX; return psRegisterIndex != GL_INVALID_INDEX;
} }
bool D3DUniform::isReferencedByComputeShader() const
{
return csRegisterIndex != GL_INVALID_INDEX;
}
// D3DVarying Implementation // D3DVarying Implementation
D3DVarying::D3DVarying() : semanticIndex(0), componentCount(0), outputSlot(0) D3DVarying::D3DVarying() : semanticIndex(0), componentCount(0), outputSlot(0)
...@@ -493,17 +487,14 @@ unsigned int ProgramD3D::mCurrentSerial = 1; ...@@ -493,17 +487,14 @@ unsigned int ProgramD3D::mCurrentSerial = 1;
ProgramD3D::ProgramD3D(const gl::ProgramState &state, RendererD3D *renderer) ProgramD3D::ProgramD3D(const gl::ProgramState &state, RendererD3D *renderer)
: ProgramImpl(state), : ProgramImpl(state),
mRenderer(renderer), mRenderer(renderer),
mDynamicHLSL(nullptr), mDynamicHLSL(NULL),
mGeometryExecutables(gl::PRIMITIVE_TYPE_MAX), mGeometryExecutables(gl::PRIMITIVE_TYPE_MAX, nullptr),
mComputeExecutable(nullptr),
mUsesPointSize(false), mUsesPointSize(false),
mUsesFlatInterpolation(false), mUsesFlatInterpolation(false),
mVertexUniformStorage(nullptr), mVertexUniformStorage(NULL),
mFragmentUniformStorage(nullptr), mFragmentUniformStorage(NULL),
mComputeUniformStorage(nullptr),
mUsedVertexSamplerRange(0), mUsedVertexSamplerRange(0),
mUsedPixelSamplerRange(0), mUsedPixelSamplerRange(0),
mUsedComputeSamplerRange(0),
mDirtySamplerMapping(true), mDirtySamplerMapping(true),
mSerial(issueSerial()) mSerial(issueSerial())
{ {
...@@ -558,13 +549,6 @@ GLint ProgramD3D::getSamplerMapping(gl::SamplerType type, ...@@ -558,13 +549,6 @@ GLint ProgramD3D::getSamplerMapping(gl::SamplerType type,
logicalTextureUnit = mSamplersVS[samplerIndex].logicalTextureUnit; logicalTextureUnit = mSamplersVS[samplerIndex].logicalTextureUnit;
} }
break; break;
case gl::SAMPLER_COMPUTE:
ASSERT(samplerIndex < caps.maxComputeTextureImageUnits);
if (samplerIndex < mSamplersCS.size() && mSamplersCS[samplerIndex].active)
{
logicalTextureUnit = mSamplersCS[samplerIndex].logicalTextureUnit;
}
break;
default: default:
UNREACHABLE(); UNREACHABLE();
} }
...@@ -592,10 +576,6 @@ GLenum ProgramD3D::getSamplerTextureType(gl::SamplerType type, unsigned int samp ...@@ -592,10 +576,6 @@ GLenum ProgramD3D::getSamplerTextureType(gl::SamplerType type, unsigned int samp
ASSERT(samplerIndex < mSamplersVS.size()); ASSERT(samplerIndex < mSamplersVS.size());
ASSERT(mSamplersVS[samplerIndex].active); ASSERT(mSamplersVS[samplerIndex].active);
return mSamplersVS[samplerIndex].textureType; return mSamplersVS[samplerIndex].textureType;
case gl::SAMPLER_COMPUTE:
ASSERT(samplerIndex < mSamplersCS.size());
ASSERT(mSamplersCS[samplerIndex].active);
return mSamplersCS[samplerIndex].textureType;
default: default:
UNREACHABLE(); UNREACHABLE();
} }
...@@ -611,8 +591,6 @@ GLuint ProgramD3D::getUsedSamplerRange(gl::SamplerType type) const ...@@ -611,8 +591,6 @@ GLuint ProgramD3D::getUsedSamplerRange(gl::SamplerType type) const
return mUsedPixelSamplerRange; return mUsedPixelSamplerRange;
case gl::SAMPLER_VERTEX: case gl::SAMPLER_VERTEX:
return mUsedVertexSamplerRange; return mUsedVertexSamplerRange;
case gl::SAMPLER_COMPUTE:
return mUsedComputeSamplerRange;
default: default:
UNREACHABLE(); UNREACHABLE();
return 0u; return 0u;
...@@ -671,22 +649,6 @@ void ProgramD3D::updateSamplerMapping() ...@@ -671,22 +649,6 @@ void ProgramD3D::updateSamplerMapping()
} }
} }
} }
if (d3dUniform->isReferencedByComputeShader())
{
unsigned int firstIndex = d3dUniform->csRegisterIndex;
for (int i = 0; i < count; i++)
{
unsigned int samplerIndex = firstIndex + i;
if (samplerIndex < mSamplersCS.size())
{
ASSERT(mSamplersCS[samplerIndex].active);
mSamplersCS[samplerIndex].logicalTextureUnit = v[i][0];
}
}
}
} }
} }
...@@ -740,19 +702,8 @@ LinkResult ProgramD3D::load(const ContextImpl *contextImpl, ...@@ -740,19 +702,8 @@ LinkResult ProgramD3D::load(const ContextImpl *contextImpl,
mSamplersVS.push_back(sampler); mSamplersVS.push_back(sampler);
} }
const unsigned int csSamplerCount = stream->readInt<unsigned int>();
for (unsigned int i = 0; i < csSamplerCount; ++i)
{
Sampler sampler;
stream->readBool(&sampler.active);
stream->readInt(&sampler.logicalTextureUnit);
stream->readInt(&sampler.textureType);
mSamplersCS.push_back(sampler);
}
stream->readInt(&mUsedVertexSamplerRange); stream->readInt(&mUsedVertexSamplerRange);
stream->readInt(&mUsedPixelSamplerRange); stream->readInt(&mUsedPixelSamplerRange);
stream->readInt(&mUsedComputeSamplerRange);
const unsigned int uniformCount = stream->readInt<unsigned int>(); const unsigned int uniformCount = stream->readInt<unsigned int>();
if (stream->error()) if (stream->error())
...@@ -772,7 +723,6 @@ LinkResult ProgramD3D::load(const ContextImpl *contextImpl, ...@@ -772,7 +723,6 @@ LinkResult ProgramD3D::load(const ContextImpl *contextImpl,
linkedUniform.isInDefaultBlock()); linkedUniform.isInDefaultBlock());
stream->readInt(&d3dUniform->psRegisterIndex); stream->readInt(&d3dUniform->psRegisterIndex);
stream->readInt(&d3dUniform->vsRegisterIndex); stream->readInt(&d3dUniform->vsRegisterIndex);
stream->readInt(&d3dUniform->csRegisterIndex);
stream->readInt(&d3dUniform->registerCount); stream->readInt(&d3dUniform->registerCount);
stream->readInt(&d3dUniform->registerElement); stream->readInt(&d3dUniform->registerElement);
...@@ -792,7 +742,6 @@ LinkResult ProgramD3D::load(const ContextImpl *contextImpl, ...@@ -792,7 +742,6 @@ LinkResult ProgramD3D::load(const ContextImpl *contextImpl,
D3DUniformBlock uniformBlock; D3DUniformBlock uniformBlock;
stream->readInt(&uniformBlock.psRegisterIndex); stream->readInt(&uniformBlock.psRegisterIndex);
stream->readInt(&uniformBlock.vsRegisterIndex); stream->readInt(&uniformBlock.vsRegisterIndex);
stream->readInt(&uniformBlock.csRegisterIndex);
mD3DUniformBlocks.push_back(uniformBlock); mD3DUniformBlocks.push_back(uniformBlock);
} }
...@@ -867,8 +816,8 @@ LinkResult ProgramD3D::load(const ContextImpl *contextImpl, ...@@ -867,8 +816,8 @@ LinkResult ProgramD3D::load(const ContextImpl *contextImpl,
VertexExecutable::getSignature(mRenderer, inputLayout, &signature); VertexExecutable::getSignature(mRenderer, inputLayout, &signature);
// add new binary // add new binary
mVertexExecutables.push_back(std::unique_ptr<VertexExecutable>( mVertexExecutables.push_back(
new VertexExecutable(inputLayout, signature, shaderExecutable))); new VertexExecutable(inputLayout, signature, shaderExecutable));
stream->skip(vertexShaderSize); stream->skip(vertexShaderSize);
} }
...@@ -898,8 +847,7 @@ LinkResult ProgramD3D::load(const ContextImpl *contextImpl, ...@@ -898,8 +847,7 @@ LinkResult ProgramD3D::load(const ContextImpl *contextImpl,
} }
// add new binary // add new binary
mPixelExecutables.push_back( mPixelExecutables.push_back(new PixelExecutable(outputs, shaderExecutable));
std::unique_ptr<PixelExecutable>(new PixelExecutable(outputs, shaderExecutable)));
stream->skip(pixelShaderSize); stream->skip(pixelShaderSize);
} }
...@@ -910,46 +858,24 @@ LinkResult ProgramD3D::load(const ContextImpl *contextImpl, ...@@ -910,46 +858,24 @@ LinkResult ProgramD3D::load(const ContextImpl *contextImpl,
unsigned int geometryShaderSize = stream->readInt<unsigned int>(); unsigned int geometryShaderSize = stream->readInt<unsigned int>();
if (geometryShaderSize == 0) if (geometryShaderSize == 0)
{ {
mGeometryExecutables[geometryExeIndex] = nullptr;
continue; continue;
} }
const unsigned char *geometryShaderFunction = binary + stream->offset(); const unsigned char *geometryShaderFunction = binary + stream->offset();
ShaderExecutableD3D *geometryExecutable = nullptr;
ANGLE_TRY(mRenderer->loadExecutable(geometryShaderFunction, geometryShaderSize, ANGLE_TRY(mRenderer->loadExecutable(geometryShaderFunction, geometryShaderSize,
SHADER_GEOMETRY, mStreamOutVaryings, separateAttribs, SHADER_GEOMETRY, mStreamOutVaryings, separateAttribs,
&geometryExecutable)); &mGeometryExecutables[geometryExeIndex]));
if (!geometryExecutable) if (!mGeometryExecutables[geometryExeIndex])
{ {
infoLog << "Could not create geometry shader."; infoLog << "Could not create geometry shader.";
return false; return false;
} }
mGeometryExecutables[geometryExeIndex].reset(geometryExecutable);
stream->skip(geometryShaderSize); stream->skip(geometryShaderSize);
} }
unsigned int computeShaderSize = stream->readInt<unsigned int>();
if (computeShaderSize > 0)
{
const unsigned char *computeShaderFunction = binary + stream->offset();
ShaderExecutableD3D *computeExecutable = nullptr;
ANGLE_TRY(mRenderer->loadExecutable(computeShaderFunction, computeShaderSize,
SHADER_COMPUTE, std::vector<D3DVarying>(), false,
&computeExecutable));
if (!computeExecutable)
{
infoLog << "Could not create compute shader.";
return false;
}
mComputeExecutable.reset(computeExecutable);
}
initializeUniformStorage(); initializeUniformStorage();
return true; return true;
...@@ -987,17 +913,8 @@ gl::Error ProgramD3D::save(gl::BinaryOutputStream *stream) ...@@ -987,17 +913,8 @@ gl::Error ProgramD3D::save(gl::BinaryOutputStream *stream)
stream->writeInt(mSamplersVS[i].textureType); stream->writeInt(mSamplersVS[i].textureType);
} }
stream->writeInt(mSamplersCS.size());
for (unsigned int i = 0; i < mSamplersCS.size(); ++i)
{
stream->writeInt(mSamplersCS[i].active);
stream->writeInt(mSamplersCS[i].logicalTextureUnit);
stream->writeInt(mSamplersCS[i].textureType);
}
stream->writeInt(mUsedVertexSamplerRange); stream->writeInt(mUsedVertexSamplerRange);
stream->writeInt(mUsedPixelSamplerRange); stream->writeInt(mUsedPixelSamplerRange);
stream->writeInt(mUsedComputeSamplerRange);
stream->writeInt(mD3DUniforms.size()); stream->writeInt(mD3DUniforms.size());
for (const D3DUniform *uniform : mD3DUniforms) for (const D3DUniform *uniform : mD3DUniforms)
...@@ -1005,7 +922,6 @@ gl::Error ProgramD3D::save(gl::BinaryOutputStream *stream) ...@@ -1005,7 +922,6 @@ gl::Error ProgramD3D::save(gl::BinaryOutputStream *stream)
// Type, name and arraySize are redundant, so aren't stored in the binary. // Type, name and arraySize are redundant, so aren't stored in the binary.
stream->writeIntOrNegOne(uniform->psRegisterIndex); stream->writeIntOrNegOne(uniform->psRegisterIndex);
stream->writeIntOrNegOne(uniform->vsRegisterIndex); stream->writeIntOrNegOne(uniform->vsRegisterIndex);
stream->writeIntOrNegOne(uniform->csRegisterIndex);
stream->writeInt(uniform->registerCount); stream->writeInt(uniform->registerCount);
stream->writeInt(uniform->registerElement); stream->writeInt(uniform->registerElement);
} }
...@@ -1019,7 +935,6 @@ gl::Error ProgramD3D::save(gl::BinaryOutputStream *stream) ...@@ -1019,7 +935,6 @@ gl::Error ProgramD3D::save(gl::BinaryOutputStream *stream)
{ {
stream->writeIntOrNegOne(uniformBlock.psRegisterIndex); stream->writeIntOrNegOne(uniformBlock.psRegisterIndex);
stream->writeIntOrNegOne(uniformBlock.vsRegisterIndex); stream->writeIntOrNegOne(uniformBlock.vsRegisterIndex);
stream->writeIntOrNegOne(uniformBlock.csRegisterIndex);
} }
stream->writeInt(mStreamOutVaryings.size()); stream->writeInt(mStreamOutVaryings.size());
...@@ -1059,7 +974,7 @@ gl::Error ProgramD3D::save(gl::BinaryOutputStream *stream) ...@@ -1059,7 +974,7 @@ gl::Error ProgramD3D::save(gl::BinaryOutputStream *stream)
for (size_t vertexExecutableIndex = 0; vertexExecutableIndex < mVertexExecutables.size(); for (size_t vertexExecutableIndex = 0; vertexExecutableIndex < mVertexExecutables.size();
vertexExecutableIndex++) vertexExecutableIndex++)
{ {
VertexExecutable *vertexExecutable = mVertexExecutables[vertexExecutableIndex].get(); VertexExecutable *vertexExecutable = mVertexExecutables[vertexExecutableIndex];
const auto &inputLayout = vertexExecutable->inputs(); const auto &inputLayout = vertexExecutable->inputs();
stream->writeInt(inputLayout.size()); stream->writeInt(inputLayout.size());
...@@ -1080,7 +995,7 @@ gl::Error ProgramD3D::save(gl::BinaryOutputStream *stream) ...@@ -1080,7 +995,7 @@ gl::Error ProgramD3D::save(gl::BinaryOutputStream *stream)
for (size_t pixelExecutableIndex = 0; pixelExecutableIndex < mPixelExecutables.size(); for (size_t pixelExecutableIndex = 0; pixelExecutableIndex < mPixelExecutables.size();
pixelExecutableIndex++) pixelExecutableIndex++)
{ {
PixelExecutable *pixelExecutable = mPixelExecutables[pixelExecutableIndex].get(); PixelExecutable *pixelExecutable = mPixelExecutables[pixelExecutableIndex];
const std::vector<GLenum> outputs = pixelExecutable->outputSignature(); const std::vector<GLenum> outputs = pixelExecutable->outputSignature();
stream->writeInt(outputs.size()); stream->writeInt(outputs.size());
...@@ -1096,28 +1011,17 @@ gl::Error ProgramD3D::save(gl::BinaryOutputStream *stream) ...@@ -1096,28 +1011,17 @@ gl::Error ProgramD3D::save(gl::BinaryOutputStream *stream)
stream->writeBytes(pixelBlob, pixelShaderSize); stream->writeBytes(pixelBlob, pixelShaderSize);
} }
for (auto const &geometryExecutable : mGeometryExecutables) for (const ShaderExecutableD3D *geometryExe : mGeometryExecutables)
{ {
if (!geometryExecutable) if (geometryExe == nullptr)
{ {
stream->writeInt(0); stream->writeInt(0);
continue; continue;
} }
size_t geometryShaderSize = geometryExecutable->getLength(); size_t geometryShaderSize = geometryExe->getLength();
stream->writeInt(geometryShaderSize); stream->writeInt(geometryShaderSize);
stream->writeBytes(geometryExecutable->getFunction(), geometryShaderSize); stream->writeBytes(geometryExe->getFunction(), geometryShaderSize);
}
if (mComputeExecutable)
{
size_t computeShaderSize = mComputeExecutable->getLength();
stream->writeInt(computeShaderSize);
stream->writeBytes(mComputeExecutable->getFunction(), computeShaderSize);
}
else
{
stream->writeInt(0);
} }
return gl::NoError(); return gl::NoError();
...@@ -1183,8 +1087,7 @@ gl::Error ProgramD3D::getPixelExecutableForOutputLayout(const std::vector<GLenum ...@@ -1183,8 +1087,7 @@ gl::Error ProgramD3D::getPixelExecutableForOutputLayout(const std::vector<GLenum
if (pixelExecutable) if (pixelExecutable)
{ {
mPixelExecutables.push_back(std::unique_ptr<PixelExecutable>( mPixelExecutables.push_back(new PixelExecutable(outputSignature, pixelExecutable));
new PixelExecutable(outputSignature, pixelExecutable)));
} }
else if (!infoLog) else if (!infoLog)
{ {
...@@ -1228,8 +1131,8 @@ gl::Error ProgramD3D::getVertexExecutableForInputLayout(const gl::InputLayout &i ...@@ -1228,8 +1131,8 @@ gl::Error ProgramD3D::getVertexExecutableForInputLayout(const gl::InputLayout &i
if (vertexExecutable) if (vertexExecutable)
{ {
mVertexExecutables.push_back(std::unique_ptr<VertexExecutable>( mVertexExecutables.push_back(
new VertexExecutable(inputLayout, mCachedVertexSignature, vertexExecutable))); new VertexExecutable(inputLayout, mCachedVertexSignature, vertexExecutable));
} }
else if (!infoLog) else if (!infoLog)
{ {
...@@ -1259,11 +1162,11 @@ gl::Error ProgramD3D::getGeometryExecutableForPrimitiveType(const gl::ContextSta ...@@ -1259,11 +1162,11 @@ gl::Error ProgramD3D::getGeometryExecutableForPrimitiveType(const gl::ContextSta
gl::PrimitiveType geometryShaderType = GetGeometryShaderTypeFromDrawMode(drawMode); gl::PrimitiveType geometryShaderType = GetGeometryShaderTypeFromDrawMode(drawMode);
if (mGeometryExecutables[geometryShaderType]) if (mGeometryExecutables[geometryShaderType] != nullptr)
{ {
if (outExecutable) if (outExecutable)
{ {
*outExecutable = mGeometryExecutables[geometryShaderType].get(); *outExecutable = mGeometryExecutables[geometryShaderType];
} }
return gl::NoError(); return gl::NoError();
} }
...@@ -1275,11 +1178,10 @@ gl::Error ProgramD3D::getGeometryExecutableForPrimitiveType(const gl::ContextSta ...@@ -1275,11 +1178,10 @@ gl::Error ProgramD3D::getGeometryExecutableForPrimitiveType(const gl::ContextSta
gl::InfoLog tempInfoLog; gl::InfoLog tempInfoLog;
gl::InfoLog *currentInfoLog = infoLog ? infoLog : &tempInfoLog; gl::InfoLog *currentInfoLog = infoLog ? infoLog : &tempInfoLog;
ShaderExecutableD3D *geometryExecutable = nullptr;
gl::Error error = mRenderer->compileToExecutable( gl::Error error = mRenderer->compileToExecutable(
*currentInfoLog, geometryHLSL, SHADER_GEOMETRY, mStreamOutVaryings, *currentInfoLog, geometryHLSL, SHADER_GEOMETRY, mStreamOutVaryings,
(mState.getTransformFeedbackBufferMode() == GL_SEPARATE_ATTRIBS), (mState.getTransformFeedbackBufferMode() == GL_SEPARATE_ATTRIBS),
angle::CompilerWorkaroundsD3D(), &geometryExecutable); angle::CompilerWorkaroundsD3D(), &mGeometryExecutables[geometryShaderType]);
if (!infoLog && error.isError()) if (!infoLog && error.isError())
{ {
...@@ -1287,14 +1189,9 @@ gl::Error ProgramD3D::getGeometryExecutableForPrimitiveType(const gl::ContextSta ...@@ -1287,14 +1189,9 @@ gl::Error ProgramD3D::getGeometryExecutableForPrimitiveType(const gl::ContextSta
<< tempInfoLog.str() << std::endl; << tempInfoLog.str() << std::endl;
} }
if (geometryExecutable != nullptr)
{
mGeometryExecutables[geometryShaderType].reset(geometryExecutable);
}
if (outExecutable) if (outExecutable)
{ {
*outExecutable = mGeometryExecutables[geometryShaderType].get(); *outExecutable = mGeometryExecutables[geometryShaderType];
} }
return error; return error;
} }
...@@ -1437,62 +1334,12 @@ LinkResult ProgramD3D::compileProgramExecutables(const gl::ContextState &context ...@@ -1437,62 +1334,12 @@ LinkResult ProgramD3D::compileProgramExecutables(const gl::ContextState &context
(!usesGeometryShader(GL_POINTS) || pointGS)); (!usesGeometryShader(GL_POINTS) || pointGS));
} }
LinkResult ProgramD3D::compileComputeExecutable(gl::InfoLog &infoLog)
{
// Ensure the compiler is initialized to avoid race conditions.
ANGLE_TRY(mRenderer->ensureHLSLCompilerInitialized());
std::string computeShader = mDynamicHLSL->generateComputeShaderLinkHLSL(mState);
ShaderExecutableD3D *computeExecutable = nullptr;
ANGLE_TRY(mRenderer->compileToExecutable(infoLog, computeShader, SHADER_COMPUTE,
std::vector<D3DVarying>(), false,
angle::CompilerWorkaroundsD3D(), &computeExecutable));
if (computeExecutable == nullptr)
{
ERR() << "Error compiling dynamic compute executable:" << std::endl
<< infoLog.str() << std::endl;
}
else
{
const ShaderD3D *computeShaderD3D = GetImplAs<ShaderD3D>(mState.getAttachedComputeShader());
computeShaderD3D->appendDebugInfo(computeExecutable->getDebugInfo());
mComputeExecutable.reset(computeExecutable);
}
return mComputeExecutable.get() != nullptr;
}
LinkResult ProgramD3D::link(const gl::ContextState &data, LinkResult ProgramD3D::link(const gl::ContextState &data,
const gl::VaryingPacking &packing, const gl::VaryingPacking &packing,
gl::InfoLog &infoLog) gl::InfoLog &infoLog)
{ {
reset(); reset();
const gl::Shader *computeShader = mState.getAttachedComputeShader();
if (computeShader)
{
mSamplersCS.resize(data.getCaps().maxComputeTextureImageUnits);
defineUniformsAndAssignRegisters();
LinkResult result = compileComputeExecutable(infoLog);
if (result.isError())
{
infoLog << result.getError().getMessage();
return result;
}
else if (!result.getResult())
{
infoLog << "Failed to create D3D compute shader.";
return result;
}
initUniformBlockInfo(computeShader);
}
else
{
const gl::Shader *vertexShader = mState.getAttachedVertexShader(); const gl::Shader *vertexShader = mState.getAttachedVertexShader();
const gl::Shader *fragmentShader = mState.getAttachedFragmentShader(); const gl::Shader *fragmentShader = mState.getAttachedFragmentShader();
...@@ -1540,8 +1387,7 @@ LinkResult ProgramD3D::link(const gl::ContextState &data, ...@@ -1540,8 +1387,7 @@ LinkResult ProgramD3D::link(const gl::ContextState &data,
if (mRenderer->getMajorShaderModel() >= 4) if (mRenderer->getMajorShaderModel() >= 4)
{ {
mGeometryShaderPreamble = mGeometryShaderPreamble = mDynamicHLSL->generateGeometryShaderPreamble(packing, builtins);
mDynamicHLSL->generateGeometryShaderPreamble(packing, builtins);
} }
initAttribLocationsToD3DSemantic(); initAttribLocationsToD3DSemantic();
...@@ -1562,9 +1408,7 @@ LinkResult ProgramD3D::link(const gl::ContextState &data, ...@@ -1562,9 +1408,7 @@ LinkResult ProgramD3D::link(const gl::ContextState &data,
return result; return result;
} }
initUniformBlockInfo(vertexShader); initUniformBlockInfo();
initUniformBlockInfo(fragmentShader);
}
return true; return true;
} }
...@@ -1575,18 +1419,34 @@ GLboolean ProgramD3D::validate(const gl::Caps & /*caps*/, gl::InfoLog * /*infoLo ...@@ -1575,18 +1419,34 @@ GLboolean ProgramD3D::validate(const gl::Caps & /*caps*/, gl::InfoLog * /*infoLo
return GL_TRUE; return GL_TRUE;
} }
void ProgramD3D::initUniformBlockInfo(const gl::Shader *shader) void ProgramD3D::initUniformBlockInfo()
{ {
for (const sh::InterfaceBlock &interfaceBlock : shader->getInterfaceBlocks()) const gl::Shader *vertexShader = mState.getAttachedVertexShader();
for (const sh::InterfaceBlock &vertexBlock : vertexShader->getInterfaceBlocks())
{
if (!vertexBlock.staticUse && vertexBlock.layout == sh::BLOCKLAYOUT_PACKED)
continue;
if (mBlockDataSizes.count(vertexBlock.name) > 0)
continue;
size_t dataSize = getUniformBlockInfo(vertexBlock);
mBlockDataSizes[vertexBlock.name] = dataSize;
}
const gl::Shader *fragmentShader = mState.getAttachedFragmentShader();
for (const sh::InterfaceBlock &fragmentBlock : fragmentShader->getInterfaceBlocks())
{ {
if (!interfaceBlock.staticUse && interfaceBlock.layout == sh::BLOCKLAYOUT_PACKED) if (!fragmentBlock.staticUse && fragmentBlock.layout == sh::BLOCKLAYOUT_PACKED)
continue; continue;
if (mBlockDataSizes.count(interfaceBlock.name) > 0) if (mBlockDataSizes.count(fragmentBlock.name) > 0)
continue; continue;
size_t dataSize = getUniformBlockInfo(interfaceBlock); size_t dataSize = getUniformBlockInfo(fragmentBlock);
mBlockDataSizes[interfaceBlock.name] = dataSize; mBlockDataSizes[fragmentBlock.name] = dataSize;
} }
} }
...@@ -1599,10 +1459,8 @@ void ProgramD3D::ensureUniformBlocksInitialized() ...@@ -1599,10 +1459,8 @@ void ProgramD3D::ensureUniformBlocksInitialized()
} }
// Assign registers and update sizes. // Assign registers and update sizes.
const ShaderD3D *vertexShaderD3D = SafeGetImplAs<ShaderD3D>(mState.getAttachedVertexShader()); const ShaderD3D *vertexShaderD3D = GetImplAs<ShaderD3D>(mState.getAttachedVertexShader());
const ShaderD3D *fragmentShaderD3D = const ShaderD3D *fragmentShaderD3D = GetImplAs<ShaderD3D>(mState.getAttachedFragmentShader());
SafeGetImplAs<ShaderD3D>(mState.getAttachedFragmentShader());
const ShaderD3D *computeShaderD3D = SafeGetImplAs<ShaderD3D>(mState.getAttachedComputeShader());
for (const gl::UniformBlock &uniformBlock : mState.getUniformBlocks()) for (const gl::UniformBlock &uniformBlock : mState.getUniformBlocks())
{ {
...@@ -1612,7 +1470,6 @@ void ProgramD3D::ensureUniformBlocksInitialized() ...@@ -1612,7 +1470,6 @@ void ProgramD3D::ensureUniformBlocksInitialized()
if (uniformBlock.vertexStaticUse) if (uniformBlock.vertexStaticUse)
{ {
ASSERT(vertexShaderD3D != nullptr);
unsigned int baseRegister = unsigned int baseRegister =
vertexShaderD3D->getInterfaceBlockRegister(uniformBlock.name); vertexShaderD3D->getInterfaceBlockRegister(uniformBlock.name);
d3dUniformBlock.vsRegisterIndex = baseRegister + uniformBlockElement; d3dUniformBlock.vsRegisterIndex = baseRegister + uniformBlockElement;
...@@ -1620,20 +1477,11 @@ void ProgramD3D::ensureUniformBlocksInitialized() ...@@ -1620,20 +1477,11 @@ void ProgramD3D::ensureUniformBlocksInitialized()
if (uniformBlock.fragmentStaticUse) if (uniformBlock.fragmentStaticUse)
{ {
ASSERT(fragmentShaderD3D != nullptr);
unsigned int baseRegister = unsigned int baseRegister =
fragmentShaderD3D->getInterfaceBlockRegister(uniformBlock.name); fragmentShaderD3D->getInterfaceBlockRegister(uniformBlock.name);
d3dUniformBlock.psRegisterIndex = baseRegister + uniformBlockElement; d3dUniformBlock.psRegisterIndex = baseRegister + uniformBlockElement;
} }
if (uniformBlock.computeStaticUse)
{
ASSERT(computeShaderD3D != nullptr);
unsigned int baseRegister =
computeShaderD3D->getInterfaceBlockRegister(uniformBlock.name);
d3dUniformBlock.csRegisterIndex = baseRegister + uniformBlockElement;
}
mD3DUniformBlocks.push_back(d3dUniformBlock); mD3DUniformBlocks.push_back(d3dUniformBlock);
} }
} }
...@@ -1643,7 +1491,6 @@ void ProgramD3D::initializeUniformStorage() ...@@ -1643,7 +1491,6 @@ void ProgramD3D::initializeUniformStorage()
// Compute total default block size // Compute total default block size
unsigned int vertexRegisters = 0; unsigned int vertexRegisters = 0;
unsigned int fragmentRegisters = 0; unsigned int fragmentRegisters = 0;
unsigned int computeRegisters = 0;
for (const D3DUniform *d3dUniform : mD3DUniforms) for (const D3DUniform *d3dUniform : mD3DUniforms)
{ {
if (!d3dUniform->isSampler()) if (!d3dUniform->isSampler())
...@@ -1658,20 +1505,11 @@ void ProgramD3D::initializeUniformStorage() ...@@ -1658,20 +1505,11 @@ void ProgramD3D::initializeUniformStorage()
fragmentRegisters = std::max( fragmentRegisters = std::max(
fragmentRegisters, d3dUniform->psRegisterIndex + d3dUniform->registerCount); fragmentRegisters, d3dUniform->psRegisterIndex + d3dUniform->registerCount);
} }
if (d3dUniform->isReferencedByComputeShader())
{
computeRegisters = std::max(
computeRegisters, d3dUniform->csRegisterIndex + d3dUniform->registerCount);
}
} }
} }
mVertexUniformStorage = mVertexUniformStorage = mRenderer->createUniformStorage(vertexRegisters * 16u);
std::unique_ptr<UniformStorageD3D>(mRenderer->createUniformStorage(vertexRegisters * 16u)); mFragmentUniformStorage = mRenderer->createUniformStorage(fragmentRegisters * 16u);
mFragmentUniformStorage = std::unique_ptr<UniformStorageD3D>(
mRenderer->createUniformStorage(fragmentRegisters * 16u));
mComputeUniformStorage =
std::unique_ptr<UniformStorageD3D>(mRenderer->createUniformStorage(computeRegisters * 16u));
} }
gl::Error ProgramD3D::applyUniforms(GLenum drawMode) gl::Error ProgramD3D::applyUniforms(GLenum drawMode)
...@@ -1895,20 +1733,6 @@ void ProgramD3D::setUniformBlockBinding(GLuint /*uniformBlockIndex*/, ...@@ -1895,20 +1733,6 @@ void ProgramD3D::setUniformBlockBinding(GLuint /*uniformBlockIndex*/,
void ProgramD3D::defineUniformsAndAssignRegisters() void ProgramD3D::defineUniformsAndAssignRegisters()
{ {
D3DUniformMap uniformMap; D3DUniformMap uniformMap;
const gl::Shader *computeShader = mState.getAttachedComputeShader();
if (computeShader)
{
for (const sh::Uniform &computeUniform : computeShader->getUniforms())
{
if (computeUniform.staticUse)
{
defineUniformBase(computeShader, computeUniform, &uniformMap);
}
}
}
else
{
const gl::Shader *vertexShader = mState.getAttachedVertexShader(); const gl::Shader *vertexShader = mState.getAttachedVertexShader();
for (const sh::Uniform &vertexUniform : vertexShader->getUniforms()) for (const sh::Uniform &vertexUniform : vertexShader->getUniforms())
...@@ -1927,7 +1751,6 @@ void ProgramD3D::defineUniformsAndAssignRegisters() ...@@ -1927,7 +1751,6 @@ void ProgramD3D::defineUniformsAndAssignRegisters()
defineUniformBase(fragmentShader, fragmentUniform, &uniformMap); defineUniformBase(fragmentShader, fragmentUniform, &uniformMap);
} }
} }
}
// Initialize the D3DUniform list to mirror the indexing of the GL layer. // Initialize the D3DUniform list to mirror the indexing of the GL layer.
for (const gl::LinkedUniform &glUniform : mState.getUniforms()) for (const gl::LinkedUniform &glUniform : mState.getUniforms())
...@@ -2051,14 +1874,10 @@ void ProgramD3D::defineUniform(GLenum shaderType, ...@@ -2051,14 +1874,10 @@ void ProgramD3D::defineUniform(GLenum shaderType,
{ {
d3dUniform->psRegisterIndex = reg; d3dUniform->psRegisterIndex = reg;
} }
else if (shaderType == GL_VERTEX_SHADER)
{
d3dUniform->vsRegisterIndex = reg;
}
else else
{ {
ASSERT(shaderType == GL_COMPUTE_SHADER); ASSERT(shaderType == GL_VERTEX_SHADER);
d3dUniform->csRegisterIndex = reg; d3dUniform->vsRegisterIndex = reg;
} }
// Arrays are treated as aggregate types // Arrays are treated as aggregate types
...@@ -2221,23 +2040,9 @@ void ProgramD3D::assignAllSamplerRegisters() ...@@ -2221,23 +2040,9 @@ void ProgramD3D::assignAllSamplerRegisters()
void ProgramD3D::assignSamplerRegisters(D3DUniform *d3dUniform) void ProgramD3D::assignSamplerRegisters(D3DUniform *d3dUniform)
{ {
ASSERT(d3dUniform->isSampler()); ASSERT(d3dUniform->isSampler());
const gl::Shader *computeShader = mState.getAttachedComputeShader();
if (computeShader)
{
const ShaderD3D *computeShaderD3D = GetImplAs<ShaderD3D>(mState.getAttachedComputeShader());
ASSERT(computeShaderD3D->hasUniform(d3dUniform));
d3dUniform->csRegisterIndex = computeShaderD3D->getUniformRegister(d3dUniform->name);
ASSERT(d3dUniform->csRegisterIndex != GL_INVALID_INDEX);
AssignSamplers(d3dUniform->csRegisterIndex, d3dUniform->type, d3dUniform->arraySize,
mSamplersCS, &mUsedComputeSamplerRange);
}
else
{
const ShaderD3D *vertexShaderD3D = GetImplAs<ShaderD3D>(mState.getAttachedVertexShader()); const ShaderD3D *vertexShaderD3D = GetImplAs<ShaderD3D>(mState.getAttachedVertexShader());
const ShaderD3D *fragmentShaderD3D = const ShaderD3D *fragmentShaderD3D = GetImplAs<ShaderD3D>(mState.getAttachedFragmentShader());
GetImplAs<ShaderD3D>(mState.getAttachedFragmentShader()); ASSERT(vertexShaderD3D->hasUniform(d3dUniform) || fragmentShaderD3D->hasUniform(d3dUniform));
ASSERT(vertexShaderD3D->hasUniform(d3dUniform) ||
fragmentShaderD3D->hasUniform(d3dUniform));
if (vertexShaderD3D->hasUniform(d3dUniform)) if (vertexShaderD3D->hasUniform(d3dUniform))
{ {
d3dUniform->vsRegisterIndex = vertexShaderD3D->getUniformRegister(d3dUniform->name); d3dUniform->vsRegisterIndex = vertexShaderD3D->getUniformRegister(d3dUniform->name);
...@@ -2252,7 +2057,6 @@ void ProgramD3D::assignSamplerRegisters(D3DUniform *d3dUniform) ...@@ -2252,7 +2057,6 @@ void ProgramD3D::assignSamplerRegisters(D3DUniform *d3dUniform)
AssignSamplers(d3dUniform->psRegisterIndex, d3dUniform->type, d3dUniform->arraySize, AssignSamplers(d3dUniform->psRegisterIndex, d3dUniform->type, d3dUniform->arraySize,
mSamplersPS, &mUsedPixelSamplerRange); mSamplersPS, &mUsedPixelSamplerRange);
} }
}
} }
// static // static
...@@ -2278,16 +2082,14 @@ void ProgramD3D::AssignSamplers(unsigned int startSamplerIndex, ...@@ -2278,16 +2082,14 @@ void ProgramD3D::AssignSamplers(unsigned int startSamplerIndex,
void ProgramD3D::reset() void ProgramD3D::reset()
{ {
mVertexExecutables.clear(); SafeDeleteContainer(mVertexExecutables);
mPixelExecutables.clear(); SafeDeleteContainer(mPixelExecutables);
for (auto &geometryExecutable : mGeometryExecutables) for (auto &element : mGeometryExecutables)
{ {
geometryExecutable.reset(nullptr); SafeDelete(element);
} }
mComputeExecutable.reset(nullptr);
mVertexHLSL.clear(); mVertexHLSL.clear();
mVertexWorkarounds = angle::CompilerWorkaroundsD3D(); mVertexWorkarounds = angle::CompilerWorkaroundsD3D();
...@@ -2301,17 +2103,14 @@ void ProgramD3D::reset() ...@@ -2301,17 +2103,14 @@ void ProgramD3D::reset()
SafeDeleteContainer(mD3DUniforms); SafeDeleteContainer(mD3DUniforms);
mD3DUniformBlocks.clear(); mD3DUniformBlocks.clear();
mVertexUniformStorage.reset(nullptr); SafeDelete(mVertexUniformStorage);
mFragmentUniformStorage.reset(nullptr); SafeDelete(mFragmentUniformStorage);
mComputeUniformStorage.reset(nullptr);
mSamplersPS.clear(); mSamplersPS.clear();
mSamplersVS.clear(); mSamplersVS.clear();
mSamplersCS.clear();
mUsedVertexSamplerRange = 0; mUsedVertexSamplerRange = 0;
mUsedPixelSamplerRange = 0; mUsedPixelSamplerRange = 0;
mUsedComputeSamplerRange = 0;
mDirtySamplerMapping = true; mDirtySamplerMapping = true;
mAttribLocationToD3DSemantic.fill(-1); mAttribLocationToD3DSemantic.fill(-1);
......
...@@ -44,7 +44,6 @@ struct D3DUniform : angle::NonCopyable ...@@ -44,7 +44,6 @@ struct D3DUniform : angle::NonCopyable
unsigned int elementCount() const { return std::max(1u, arraySize); } unsigned int elementCount() const { return std::max(1u, arraySize); }
bool isReferencedByVertexShader() const; bool isReferencedByVertexShader() const;
bool isReferencedByFragmentShader() const; bool isReferencedByFragmentShader() const;
bool isReferencedByComputeShader() const;
// Duplicated from the GL layer // Duplicated from the GL layer
GLenum type; GLenum type;
...@@ -61,7 +60,6 @@ struct D3DUniform : angle::NonCopyable ...@@ -61,7 +60,6 @@ struct D3DUniform : angle::NonCopyable
// Register information. // Register information.
unsigned int vsRegisterIndex; unsigned int vsRegisterIndex;
unsigned int psRegisterIndex; unsigned int psRegisterIndex;
unsigned int csRegisterIndex;
unsigned int registerCount; unsigned int registerCount;
// Register "elements" are used for uniform structs in ES3, to appropriately identify single // Register "elements" are used for uniform structs in ES3, to appropriately identify single
...@@ -72,22 +70,14 @@ struct D3DUniform : angle::NonCopyable ...@@ -72,22 +70,14 @@ struct D3DUniform : angle::NonCopyable
struct D3DUniformBlock struct D3DUniformBlock
{ {
D3DUniformBlock() D3DUniformBlock() : vsRegisterIndex(GL_INVALID_INDEX), psRegisterIndex(GL_INVALID_INDEX) {}
: vsRegisterIndex(GL_INVALID_INDEX),
psRegisterIndex(GL_INVALID_INDEX),
csRegisterIndex(GL_INVALID_INDEX)
{
}
bool vertexStaticUse() const { return vsRegisterIndex != GL_INVALID_INDEX; } bool vertexStaticUse() const { return vsRegisterIndex != GL_INVALID_INDEX; }
bool fragmentStaticUse() const { return psRegisterIndex != GL_INVALID_INDEX; } bool fragmentStaticUse() const { return psRegisterIndex != GL_INVALID_INDEX; }
bool computeStaticUse() const { return csRegisterIndex != GL_INVALID_INDEX; }
unsigned int vsRegisterIndex; unsigned int vsRegisterIndex;
unsigned int psRegisterIndex; unsigned int psRegisterIndex;
unsigned int csRegisterIndex;
}; };
struct D3DVarying final struct D3DVarying final
...@@ -176,9 +166,6 @@ class ProgramD3D : public ProgramImpl ...@@ -176,9 +166,6 @@ class ProgramD3D : public ProgramImpl
GLenum drawMode, GLenum drawMode,
ShaderExecutableD3D **outExecutable, ShaderExecutableD3D **outExecutable,
gl::InfoLog *infoLog); gl::InfoLog *infoLog);
gl::Error getComputeExecutable(const gl::ContextState &data,
ShaderExecutableD3D **outExecutable,
gl::InfoLog *infoLog);
LinkResult link(const gl::ContextState &data, LinkResult link(const gl::ContextState &data,
const gl::VaryingPacking &packing, const gl::VaryingPacking &packing,
...@@ -249,18 +236,8 @@ class ProgramD3D : public ProgramImpl ...@@ -249,18 +236,8 @@ class ProgramD3D : public ProgramImpl
void setUniformBlockBinding(GLuint uniformBlockIndex, GLuint uniformBlockBinding) override; void setUniformBlockBinding(GLuint uniformBlockIndex, GLuint uniformBlockBinding) override;
const UniformStorageD3D &getVertexUniformStorage() const const UniformStorageD3D &getVertexUniformStorage() const { return *mVertexUniformStorage; }
{ const UniformStorageD3D &getFragmentUniformStorage() const { return *mFragmentUniformStorage; }
return *mVertexUniformStorage.get();
}
const UniformStorageD3D &getFragmentUniformStorage() const
{
return *mFragmentUniformStorage.get();
}
const UniformStorageD3D &getComputeUniformStorage() const
{
return *mComputeUniformStorage.get();
}
unsigned int getSerial() const; unsigned int getSerial() const;
...@@ -375,7 +352,6 @@ class ProgramD3D : public ProgramImpl ...@@ -375,7 +352,6 @@ class ProgramD3D : public ProgramImpl
GLenum targetUniformType); GLenum targetUniformType);
LinkResult compileProgramExecutables(const gl::ContextState &data, gl::InfoLog &infoLog); LinkResult compileProgramExecutables(const gl::ContextState &data, gl::InfoLog &infoLog);
LinkResult compileComputeExecutable(gl::InfoLog &infoLog);
void gatherTransformFeedbackVaryings(const gl::VaryingPacking &varyings, void gatherTransformFeedbackVaryings(const gl::VaryingPacking &varyings,
const BuiltinInfo &builtins); const BuiltinInfo &builtins);
...@@ -387,16 +363,15 @@ class ProgramD3D : public ProgramImpl ...@@ -387,16 +363,15 @@ class ProgramD3D : public ProgramImpl
void reset(); void reset();
void ensureUniformBlocksInitialized(); void ensureUniformBlocksInitialized();
void initUniformBlockInfo(const gl::Shader *shader); void initUniformBlockInfo();
size_t getUniformBlockInfo(const sh::InterfaceBlock &interfaceBlock); size_t getUniformBlockInfo(const sh::InterfaceBlock &interfaceBlock);
RendererD3D *mRenderer; RendererD3D *mRenderer;
DynamicHLSL *mDynamicHLSL; DynamicHLSL *mDynamicHLSL;
std::vector<std::unique_ptr<VertexExecutable>> mVertexExecutables; std::vector<VertexExecutable *> mVertexExecutables;
std::vector<std::unique_ptr<PixelExecutable>> mPixelExecutables; std::vector<PixelExecutable *> mPixelExecutables;
std::vector<std::unique_ptr<ShaderExecutableD3D>> mGeometryExecutables; std::vector<ShaderExecutableD3D *> mGeometryExecutables;
std::unique_ptr<ShaderExecutableD3D> mComputeExecutable;
std::string mVertexHLSL; std::string mVertexHLSL;
angle::CompilerWorkaroundsD3D mVertexWorkarounds; angle::CompilerWorkaroundsD3D mVertexWorkarounds;
...@@ -414,16 +389,13 @@ class ProgramD3D : public ProgramImpl ...@@ -414,16 +389,13 @@ class ProgramD3D : public ProgramImpl
bool mUsesPointSize; bool mUsesPointSize;
bool mUsesFlatInterpolation; bool mUsesFlatInterpolation;
std::unique_ptr<UniformStorageD3D> mVertexUniformStorage; UniformStorageD3D *mVertexUniformStorage;
std::unique_ptr<UniformStorageD3D> mFragmentUniformStorage; UniformStorageD3D *mFragmentUniformStorage;
std::unique_ptr<UniformStorageD3D> mComputeUniformStorage;
std::vector<Sampler> mSamplersPS; std::vector<Sampler> mSamplersPS;
std::vector<Sampler> mSamplersVS; std::vector<Sampler> mSamplersVS;
std::vector<Sampler> mSamplersCS;
GLuint mUsedVertexSamplerRange; GLuint mUsedVertexSamplerRange;
GLuint mUsedPixelSamplerRange; GLuint mUsedPixelSamplerRange;
GLuint mUsedComputeSamplerRange;
bool mDirtySamplerMapping; bool mDirtySamplerMapping;
// Cache for getPixelExecutableForFramebuffer // Cache for getPixelExecutableForFramebuffer
......
...@@ -75,7 +75,6 @@ enum ShaderType ...@@ -75,7 +75,6 @@ enum ShaderType
SHADER_VERTEX, SHADER_VERTEX,
SHADER_PIXEL, SHADER_PIXEL,
SHADER_GEOMETRY, SHADER_GEOMETRY,
SHADER_COMPUTE,
SHADER_TYPE_MAX SHADER_TYPE_MAX
}; };
......
...@@ -29,9 +29,6 @@ const char *GetShaderTypeString(GLenum type) ...@@ -29,9 +29,6 @@ const char *GetShaderTypeString(GLenum type)
case GL_FRAGMENT_SHADER: case GL_FRAGMENT_SHADER:
return "FRAGMENT"; return "FRAGMENT";
case GL_COMPUTE_SHADER:
return "COMPUTE";
default: default:
UNREACHABLE(); UNREACHABLE();
return ""; return "";
......
...@@ -3459,14 +3459,15 @@ gl::Error Renderer11::loadExecutable(const void *function, ...@@ -3459,14 +3459,15 @@ gl::Error Renderer11::loadExecutable(const void *function,
{ {
case SHADER_VERTEX: case SHADER_VERTEX:
{ {
ID3D11VertexShader *vertexShader = nullptr; ID3D11VertexShader *vertexShader = NULL;
ID3D11GeometryShader *streamOutShader = nullptr; ID3D11GeometryShader *streamOutShader = NULL;
HRESULT result = mDevice->CreateVertexShader(function, length, NULL, &vertexShader); HRESULT result = mDevice->CreateVertexShader(function, length, NULL, &vertexShader);
ASSERT(SUCCEEDED(result)); ASSERT(SUCCEEDED(result));
if (FAILED(result)) if (FAILED(result))
{ {
return gl::OutOfMemory() << "Failed to create vertex shader, " << result; return gl::Error(GL_OUT_OF_MEMORY, "Failed to create vertex shader, result: 0x%X.",
result);
} }
if (!streamOutVaryings.empty()) if (!streamOutVaryings.empty())
...@@ -3494,7 +3495,8 @@ gl::Error Renderer11::loadExecutable(const void *function, ...@@ -3494,7 +3495,8 @@ gl::Error Renderer11::loadExecutable(const void *function,
ASSERT(SUCCEEDED(result)); ASSERT(SUCCEEDED(result));
if (FAILED(result)) if (FAILED(result))
{ {
return gl::OutOfMemory() << "Failed to create steam output shader, " << result; return gl::Error(GL_OUT_OF_MEMORY,
"Failed to create steam output shader, result: 0x%X.", result);
} }
} }
...@@ -3504,13 +3506,14 @@ gl::Error Renderer11::loadExecutable(const void *function, ...@@ -3504,13 +3506,14 @@ gl::Error Renderer11::loadExecutable(const void *function,
break; break;
case SHADER_PIXEL: case SHADER_PIXEL:
{ {
ID3D11PixelShader *pixelShader = nullptr; ID3D11PixelShader *pixelShader = NULL;
HRESULT result = mDevice->CreatePixelShader(function, length, NULL, &pixelShader); HRESULT result = mDevice->CreatePixelShader(function, length, NULL, &pixelShader);
ASSERT(SUCCEEDED(result)); ASSERT(SUCCEEDED(result));
if (FAILED(result)) if (FAILED(result))
{ {
return gl::OutOfMemory() << "Failed to create pixel shader, " << result; return gl::Error(GL_OUT_OF_MEMORY, "Failed to create pixel shader, result: 0x%X.",
result);
} }
*outExecutable = new ShaderExecutable11(function, length, pixelShader); *outExecutable = new ShaderExecutable11(function, length, pixelShader);
...@@ -3518,32 +3521,19 @@ gl::Error Renderer11::loadExecutable(const void *function, ...@@ -3518,32 +3521,19 @@ gl::Error Renderer11::loadExecutable(const void *function,
break; break;
case SHADER_GEOMETRY: case SHADER_GEOMETRY:
{ {
ID3D11GeometryShader *geometryShader = nullptr; ID3D11GeometryShader *geometryShader = NULL;
HRESULT result = mDevice->CreateGeometryShader(function, length, NULL, &geometryShader); HRESULT result = mDevice->CreateGeometryShader(function, length, NULL, &geometryShader);
ASSERT(SUCCEEDED(result)); ASSERT(SUCCEEDED(result));
if (FAILED(result)) if (FAILED(result))
{ {
return gl::OutOfMemory() << "Failed to create geometry shader, " << result; return gl::Error(GL_OUT_OF_MEMORY,
"Failed to create geometry shader, result: 0x%X.", result);
} }
*outExecutable = new ShaderExecutable11(function, length, geometryShader); *outExecutable = new ShaderExecutable11(function, length, geometryShader);
} }
break; break;
case SHADER_COMPUTE:
{
ID3D11ComputeShader *computeShader = nullptr;
HRESULT result = mDevice->CreateComputeShader(function, length, NULL, &computeShader);
ASSERT(SUCCEEDED(result));
if (FAILED(result))
{
return gl::OutOfMemory() << "Failed to create compute shader, " << result;
}
*outExecutable = new ShaderExecutable11(function, length, computeShader);
}
break;
default: default:
UNREACHABLE(); UNREACHABLE();
return gl::Error(GL_INVALID_OPERATION); return gl::Error(GL_INVALID_OPERATION);
...@@ -3573,9 +3563,6 @@ gl::Error Renderer11::compileToExecutable(gl::InfoLog &infoLog, ...@@ -3573,9 +3563,6 @@ gl::Error Renderer11::compileToExecutable(gl::InfoLog &infoLog,
case SHADER_GEOMETRY: case SHADER_GEOMETRY:
profileStream << "gs"; profileStream << "gs";
break; break;
case SHADER_COMPUTE:
profileStream << "cs";
break;
default: default:
UNREACHABLE(); UNREACHABLE();
return gl::Error(GL_INVALID_OPERATION); return gl::Error(GL_INVALID_OPERATION);
......
...@@ -17,42 +17,27 @@ ShaderExecutable11::ShaderExecutable11(const void *function, size_t length, ID3D ...@@ -17,42 +17,27 @@ ShaderExecutable11::ShaderExecutable11(const void *function, size_t length, ID3D
: ShaderExecutableD3D(function, length) : ShaderExecutableD3D(function, length)
{ {
mPixelExecutable = executable; mPixelExecutable = executable;
mVertexExecutable = nullptr; mVertexExecutable = NULL;
mGeometryExecutable = nullptr; mGeometryExecutable = NULL;
mStreamOutExecutable = nullptr; mStreamOutExecutable = NULL;
mComputeExecutable = nullptr;
} }
ShaderExecutable11::ShaderExecutable11(const void *function, size_t length, ID3D11VertexShader *executable, ID3D11GeometryShader *streamOut) ShaderExecutable11::ShaderExecutable11(const void *function, size_t length, ID3D11VertexShader *executable, ID3D11GeometryShader *streamOut)
: ShaderExecutableD3D(function, length) : ShaderExecutableD3D(function, length)
{ {
mVertexExecutable = executable; mVertexExecutable = executable;
mPixelExecutable = nullptr; mPixelExecutable = NULL;
mGeometryExecutable = nullptr; mGeometryExecutable = NULL;
mStreamOutExecutable = streamOut; mStreamOutExecutable = streamOut;
mComputeExecutable = nullptr;
} }
ShaderExecutable11::ShaderExecutable11(const void *function, size_t length, ID3D11GeometryShader *executable) ShaderExecutable11::ShaderExecutable11(const void *function, size_t length, ID3D11GeometryShader *executable)
: ShaderExecutableD3D(function, length) : ShaderExecutableD3D(function, length)
{ {
mGeometryExecutable = executable; mGeometryExecutable = executable;
mVertexExecutable = nullptr; mVertexExecutable = NULL;
mPixelExecutable = nullptr; mPixelExecutable = NULL;
mStreamOutExecutable = nullptr; mStreamOutExecutable = NULL;
mComputeExecutable = nullptr;
}
ShaderExecutable11::ShaderExecutable11(const void *function,
size_t length,
ID3D11ComputeShader *executable)
: ShaderExecutableD3D(function, length)
{
mComputeExecutable = executable;
mPixelExecutable = nullptr;
mVertexExecutable = nullptr;
mGeometryExecutable = nullptr;
mStreamOutExecutable = nullptr;
} }
ShaderExecutable11::~ShaderExecutable11() ShaderExecutable11::~ShaderExecutable11()
...@@ -61,7 +46,6 @@ ShaderExecutable11::~ShaderExecutable11() ...@@ -61,7 +46,6 @@ ShaderExecutable11::~ShaderExecutable11()
SafeRelease(mPixelExecutable); SafeRelease(mPixelExecutable);
SafeRelease(mGeometryExecutable); SafeRelease(mGeometryExecutable);
SafeRelease(mStreamOutExecutable); SafeRelease(mStreamOutExecutable);
SafeRelease(mComputeExecutable);
} }
ID3D11VertexShader *ShaderExecutable11::getVertexShader() const ID3D11VertexShader *ShaderExecutable11::getVertexShader() const
...@@ -84,11 +68,6 @@ ID3D11GeometryShader *ShaderExecutable11::getStreamOutShader() const ...@@ -84,11 +68,6 @@ ID3D11GeometryShader *ShaderExecutable11::getStreamOutShader() const
return mStreamOutExecutable; return mStreamOutExecutable;
} }
ID3D11ComputeShader *ShaderExecutable11::getComputeShader() const
{
return mComputeExecutable;
}
UniformStorage11::UniformStorage11(Renderer11 *renderer, size_t initialSize) UniformStorage11::UniformStorage11(Renderer11 *renderer, size_t initialSize)
: UniformStorageD3D(initialSize), : UniformStorageD3D(initialSize),
mConstantBuffer(NULL) mConstantBuffer(NULL)
......
...@@ -23,7 +23,6 @@ class ShaderExecutable11 : public ShaderExecutableD3D ...@@ -23,7 +23,6 @@ class ShaderExecutable11 : public ShaderExecutableD3D
ShaderExecutable11(const void *function, size_t length, ID3D11PixelShader *executable); ShaderExecutable11(const void *function, size_t length, ID3D11PixelShader *executable);
ShaderExecutable11(const void *function, size_t length, ID3D11VertexShader *executable, ID3D11GeometryShader *streamOut); ShaderExecutable11(const void *function, size_t length, ID3D11VertexShader *executable, ID3D11GeometryShader *streamOut);
ShaderExecutable11(const void *function, size_t length, ID3D11GeometryShader *executable); ShaderExecutable11(const void *function, size_t length, ID3D11GeometryShader *executable);
ShaderExecutable11(const void *function, size_t length, ID3D11ComputeShader *executable);
virtual ~ShaderExecutable11(); virtual ~ShaderExecutable11();
...@@ -31,14 +30,12 @@ class ShaderExecutable11 : public ShaderExecutableD3D ...@@ -31,14 +30,12 @@ class ShaderExecutable11 : public ShaderExecutableD3D
ID3D11VertexShader *getVertexShader() const; ID3D11VertexShader *getVertexShader() const;
ID3D11GeometryShader *getGeometryShader() const; ID3D11GeometryShader *getGeometryShader() const;
ID3D11GeometryShader *getStreamOutShader() const; ID3D11GeometryShader *getStreamOutShader() const;
ID3D11ComputeShader *getComputeShader() const;
private: private:
ID3D11PixelShader *mPixelExecutable; ID3D11PixelShader *mPixelExecutable;
ID3D11VertexShader *mVertexExecutable; ID3D11VertexShader *mVertexExecutable;
ID3D11GeometryShader *mGeometryExecutable; ID3D11GeometryShader *mGeometryExecutable;
ID3D11GeometryShader *mStreamOutExecutable; ID3D11GeometryShader *mStreamOutExecutable;
ID3D11ComputeShader *mComputeExecutable;
}; };
class UniformStorage11 : public UniformStorageD3D class UniformStorage11 : public UniformStorageD3D
......
...@@ -830,84 +830,6 @@ size_t GetMaximumPixelTextureUnits(D3D_FEATURE_LEVEL featureLevel) ...@@ -830,84 +830,6 @@ size_t GetMaximumPixelTextureUnits(D3D_FEATURE_LEVEL featureLevel)
} }
} }
std::array<GLuint, 3> GetMaxComputeWorkGroupCount(D3D_FEATURE_LEVEL featureLevel)
{
switch (featureLevel)
{
case D3D_FEATURE_LEVEL_11_1:
case D3D_FEATURE_LEVEL_11_0:
return {{D3D11_CS_DISPATCH_MAX_THREAD_GROUPS_PER_DIMENSION,
D3D11_CS_DISPATCH_MAX_THREAD_GROUPS_PER_DIMENSION,
D3D11_CS_DISPATCH_MAX_THREAD_GROUPS_PER_DIMENSION}};
break;
default:
return {{0, 0, 0}};
}
}
std::array<GLuint, 3> GetMaxComputeWorkGroupSize(D3D_FEATURE_LEVEL featureLevel)
{
switch (featureLevel)
{
case D3D_FEATURE_LEVEL_11_1:
case D3D_FEATURE_LEVEL_11_0:
return {{D3D11_CS_THREAD_GROUP_MAX_X, D3D11_CS_THREAD_GROUP_MAX_Y,
D3D11_CS_THREAD_GROUP_MAX_Z}};
break;
default:
return {{0, 0, 0}};
}
}
size_t GetMaxComputeWorkGroupInvocations(D3D_FEATURE_LEVEL featureLevel)
{
switch (featureLevel)
{
case D3D_FEATURE_LEVEL_11_1:
case D3D_FEATURE_LEVEL_11_0:
return D3D11_CS_THREAD_GROUP_MAX_THREADS_PER_GROUP;
default:
return 0;
}
}
size_t GetMaximumComputeUniformVectors(D3D_FEATURE_LEVEL featureLevel)
{
switch (featureLevel)
{
case D3D_FEATURE_LEVEL_11_1:
case D3D_FEATURE_LEVEL_11_0:
return D3D11_REQ_CONSTANT_BUFFER_ELEMENT_COUNT;
default:
return 0;
}
}
size_t GetMaximumComputeUniformBlocks(D3D_FEATURE_LEVEL featureLevel)
{
switch (featureLevel)
{
case D3D_FEATURE_LEVEL_11_1:
case D3D_FEATURE_LEVEL_11_0:
return D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT -
d3d11::RESERVED_CONSTANT_BUFFER_SLOT_COUNT;
default:
return 0;
}
}
size_t GetMaximumComputeTextureUnits(D3D_FEATURE_LEVEL featureLevel)
{
switch (featureLevel)
{
case D3D_FEATURE_LEVEL_11_1:
case D3D_FEATURE_LEVEL_11_0:
return D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT;
default:
return 0;
}
}
int GetMinimumTexelOffset(D3D_FEATURE_LEVEL featureLevel) int GetMinimumTexelOffset(D3D_FEATURE_LEVEL featureLevel)
{ {
switch (featureLevel) switch (featureLevel)
...@@ -1238,18 +1160,6 @@ void GenerateCaps(ID3D11Device *device, ID3D11DeviceContext *deviceContext, cons ...@@ -1238,18 +1160,6 @@ void GenerateCaps(ID3D11Device *device, ID3D11DeviceContext *deviceContext, cons
caps->minProgramTexelOffset = GetMinimumTexelOffset(featureLevel); caps->minProgramTexelOffset = GetMinimumTexelOffset(featureLevel);
caps->maxProgramTexelOffset = GetMaximumTexelOffset(featureLevel); caps->maxProgramTexelOffset = GetMaximumTexelOffset(featureLevel);
// Compute shader limits
caps->maxComputeWorkGroupCount = GetMaxComputeWorkGroupCount(featureLevel);
caps->maxComputeWorkGroupSize = GetMaxComputeWorkGroupSize(featureLevel);
caps->maxComputeWorkGroupInvocations =
static_cast<GLuint>(GetMaxComputeWorkGroupInvocations(featureLevel));
caps->maxComputeUniformComponents =
static_cast<GLuint>(GetMaximumComputeUniformVectors(featureLevel)) * 4;
caps->maxComputeUniformBlocks =
static_cast<GLuint>(GetMaximumComputeUniformBlocks(featureLevel));
caps->maxComputeTextureImageUnits =
static_cast<GLuint>(GetMaximumComputeTextureUnits(featureLevel));
// Aggregate shader limits // Aggregate shader limits
caps->maxUniformBufferBindings = caps->maxVertexUniformBlocks + caps->maxFragmentUniformBlocks; caps->maxUniformBufferBindings = caps->maxVertexUniformBlocks + caps->maxFragmentUniformBlocks;
caps->maxUniformBlockSize = GetMaximumConstantBufferSize(featureLevel); caps->maxUniformBlockSize = GetMaximumConstantBufferSize(featureLevel);
...@@ -1265,9 +1175,6 @@ void GenerateCaps(ID3D11Device *device, ID3D11DeviceContext *deviceContext, cons ...@@ -1265,9 +1175,6 @@ void GenerateCaps(ID3D11Device *device, ID3D11DeviceContext *deviceContext, cons
static_cast<GLint64>(caps->maxVertexUniformComponents); static_cast<GLint64>(caps->maxVertexUniformComponents);
caps->maxCombinedFragmentUniformComponents = (static_cast<GLint64>(caps->maxFragmentUniformBlocks) * static_cast<GLint64>(caps->maxUniformBlockSize / 4)) + caps->maxCombinedFragmentUniformComponents = (static_cast<GLint64>(caps->maxFragmentUniformBlocks) * static_cast<GLint64>(caps->maxUniformBlockSize / 4)) +
static_cast<GLint64>(caps->maxFragmentUniformComponents); static_cast<GLint64>(caps->maxFragmentUniformComponents);
caps->maxCombinedComputeUniformComponents =
static_cast<GLuint>(caps->maxComputeUniformBlocks * (caps->maxUniformBlockSize / 4) +
caps->maxComputeUniformComponents);
caps->maxVaryingComponents = caps->maxVaryingComponents =
static_cast<GLuint>(GetMaximumVertexOutputVectors(featureLevel)) * 4; static_cast<GLuint>(GetMaximumVertexOutputVectors(featureLevel)) * 4;
caps->maxVaryingVectors = static_cast<GLuint>(GetMaximumVertexOutputVectors(featureLevel)); caps->maxVaryingVectors = static_cast<GLuint>(GetMaximumVertexOutputVectors(featureLevel));
......
...@@ -211,41 +211,6 @@ TEST_P(ComputeShaderTest, AttachmentCount) ...@@ -211,41 +211,6 @@ TEST_P(ComputeShaderTest, AttachmentCount)
EXPECT_GL_NO_ERROR(); EXPECT_GL_NO_ERROR();
} }
// Access all compute shader special variables.
TEST_P(ComputeShaderTest, AccessAllSpecialVariables)
{
const std::string csSource =
"#version 310 es\n"
"layout(local_size_x=4, local_size_y=3, local_size_z=2) in;\n"
"void main()\n"
"{\n"
" uvec3 temp1 = gl_NumWorkGroups;\n"
" uvec3 temp2 = gl_WorkGroupSize;\n"
" uvec3 temp3 = gl_WorkGroupID;\n"
" uvec3 temp4 = gl_LocalInvocationID;\n"
" uvec3 temp5 = gl_GlobalInvocationID;\n"
" uint temp6 = gl_LocalInvocationIndex;\n"
"}\n";
ANGLE_GL_COMPUTE_PROGRAM(program, csSource);
}
// Access part compute shader special variables.
TEST_P(ComputeShaderTest, AccessPartSpecialVariables)
{
const std::string csSource =
"#version 310 es\n"
"layout(local_size_x=4, local_size_y=3, local_size_z=2) in;\n"
"void main()\n"
"{\n"
" uvec3 temp1 = gl_WorkGroupSize;\n"
" uvec3 temp2 = gl_WorkGroupID;\n"
" uint temp3 = gl_LocalInvocationIndex;\n"
"}\n";
ANGLE_GL_COMPUTE_PROGRAM(program, csSource);
}
// Check that it is not possible to create a compute shader when the context does not support ES // Check that it is not possible to create a compute shader when the context does not support ES
// 3.10 // 3.10
TEST_P(ComputeShaderTestES3, NotSupported) TEST_P(ComputeShaderTestES3, NotSupported)
...@@ -255,7 +220,7 @@ TEST_P(ComputeShaderTestES3, NotSupported) ...@@ -255,7 +220,7 @@ TEST_P(ComputeShaderTestES3, NotSupported)
EXPECT_GL_ERROR(GL_INVALID_ENUM); EXPECT_GL_ERROR(GL_INVALID_ENUM);
} }
ANGLE_INSTANTIATE_TEST(ComputeShaderTest, ES31_OPENGL(), ES31_OPENGLES(), ES31_D3D11()); ANGLE_INSTANTIATE_TEST(ComputeShaderTest, ES31_OPENGL(), ES31_OPENGLES());
ANGLE_INSTANTIATE_TEST(ComputeShaderTestES3, ES3_OPENGL(), ES3_OPENGLES()); ANGLE_INSTANTIATE_TEST(ComputeShaderTestES3, ES3_OPENGL(), ES3_OPENGLES());
} // namespace } // namespace
...@@ -335,69 +335,6 @@ TEST_P(ProgramBinaryES3Test, UniformBlockBindingNoDraw) ...@@ -335,69 +335,6 @@ TEST_P(ProgramBinaryES3Test, UniformBlockBindingNoDraw)
ANGLE_INSTANTIATE_TEST(ProgramBinaryES3Test, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES()); ANGLE_INSTANTIATE_TEST(ProgramBinaryES3Test, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES());
class ProgramBinaryES31Test : public ANGLETest
{
protected:
ProgramBinaryES31Test()
{
setWindowWidth(128);
setWindowHeight(128);
setConfigRedBits(8);
setConfigGreenBits(8);
setConfigBlueBits(8);
setConfigAlphaBits(8);
}
};
// Tests that saving and loading a program attached with computer shader.
TEST_P(ProgramBinaryES31Test, ProgramBinaryWithComputeShader)
{
// We can't run the test if no program binary formats are supported.
GLint binaryFormatCount = 0;
glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS, &binaryFormatCount);
if (binaryFormatCount == 0)
{
std::cout << "Test skipped because no program binary formats available." << std::endl;
return;
}
const std::string &computeShader =
"#version 310 es\n"
"layout(local_size_x=4, local_size_y=3, local_size_z=1) in;\n"
"uniform block {\n"
" vec2 f;\n"
"};\n"
"uniform vec2 g;\n"
"uniform highp sampler2D tex;\n"
"void main() {\n"
" vec4 color = texture(tex, f + g);\n"
"}";
ANGLE_GL_COMPUTE_PROGRAM(program, computeShader);
// Read back the binary.
GLint programLength = 0;
glGetProgramiv(program.get(), GL_PROGRAM_BINARY_LENGTH, &programLength);
ASSERT_GL_NO_ERROR();
GLsizei readLength = 0;
GLenum binaryFormat = GL_NONE;
std::vector<uint8_t> binary(programLength);
glGetProgramBinary(program.get(), programLength, &readLength, &binaryFormat, binary.data());
ASSERT_GL_NO_ERROR();
EXPECT_EQ(static_cast<GLsizei>(programLength), readLength);
// Load a new program with the binary.
ANGLE_GL_BINARY_ES3_PROGRAM(binaryProgram, binary, binaryFormat);
// TODO(Xinghua): add dispatch support when available.
ASSERT_GL_NO_ERROR();
}
ANGLE_INSTANTIATE_TEST(ProgramBinaryES31Test, ES31_D3D11(), ES31_OPENGL(), ES31_OPENGLES());
class ProgramBinaryTransformFeedbackTest : public ANGLETest class ProgramBinaryTransformFeedbackTest : public ANGLETest
{ {
protected: protected:
......
...@@ -491,21 +491,6 @@ PlatformParameters ES3_D3D11_FL10_1() ...@@ -491,21 +491,6 @@ PlatformParameters ES3_D3D11_FL10_1()
return PlatformParameters(3, 0, egl_platform::D3D11_FL10_1()); return PlatformParameters(3, 0, egl_platform::D3D11_FL10_1());
} }
PlatformParameters ES31_D3D11()
{
return PlatformParameters(3, 1, egl_platform::D3D11());
}
PlatformParameters ES31_D3D11_FL11_1()
{
return PlatformParameters(3, 1, egl_platform::D3D11_FL11_1());
}
PlatformParameters ES31_D3D11_FL11_0()
{
return PlatformParameters(3, 1, egl_platform::D3D11_FL11_0());
}
PlatformParameters ES3_D3D11_WARP() PlatformParameters ES3_D3D11_WARP()
{ {
return PlatformParameters(3, 0, egl_platform::D3D11_WARP()); return PlatformParameters(3, 0, egl_platform::D3D11_WARP());
......
...@@ -113,9 +113,6 @@ PlatformParameters ES3_D3D11(); ...@@ -113,9 +113,6 @@ PlatformParameters ES3_D3D11();
PlatformParameters ES3_D3D11_FL11_1(); PlatformParameters ES3_D3D11_FL11_1();
PlatformParameters ES3_D3D11_FL11_0(); PlatformParameters ES3_D3D11_FL11_0();
PlatformParameters ES3_D3D11_FL10_1(); PlatformParameters ES3_D3D11_FL10_1();
PlatformParameters ES31_D3D11();
PlatformParameters ES31_D3D11_FL11_1();
PlatformParameters ES31_D3D11_FL11_0();
PlatformParameters ES3_D3D11_WARP(); PlatformParameters ES3_D3D11_WARP();
PlatformParameters ES3_D3D11_FL11_1_WARP(); PlatformParameters ES3_D3D11_FL11_1_WARP();
......
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