Commit 153e0224 by Austin Eng Committed by Commit Bot

Add gl_DrawID emulation for ESSL3 with ANGLE_multi_draw

Bug: chromium:890539 Change-Id: I3d9a9429608afb454f076013f3ed844e115c56cc Reviewed-on: https://chromium-review.googlesource.com/c/1368784Reviewed-by: 's avatarKai Ninomiya <kainino@chromium.org> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Commit-Queue: Austin Eng <enga@chromium.org>
parent 19f2f9eb
...@@ -38,7 +38,7 @@ ...@@ -38,7 +38,7 @@
"ESSL static builtins:src/compiler/translator/builtin_function_declarations.txt": "ESSL static builtins:src/compiler/translator/builtin_function_declarations.txt":
"e5e567406476306ea06984d885be028d", "e5e567406476306ea06984d885be028d",
"ESSL static builtins:src/compiler/translator/builtin_variables.json": "ESSL static builtins:src/compiler/translator/builtin_variables.json":
"2be179f5b2f04d68367d023bec7209e3", "d07ec4348b35d0db1eeab3c99a5e91f9",
"ESSL static builtins:src/compiler/translator/gen_builtin_symbols.py": "ESSL static builtins:src/compiler/translator/gen_builtin_symbols.py":
"9a5226ee6573650897bdc21e1bb0bfd0", "9a5226ee6573650897bdc21e1bb0bfd0",
"Emulated HLSL functions:src/compiler/translator/emulated_builtin_function_data_hlsl.json": "Emulated HLSL functions:src/compiler/translator/emulated_builtin_function_data_hlsl.json":
......
...@@ -971,6 +971,7 @@ constexpr const TSymbolUniqueId BuiltInId::gl_VertexID; ...@@ -971,6 +971,7 @@ constexpr const TSymbolUniqueId BuiltInId::gl_VertexID;
constexpr const TSymbolUniqueId BuiltInId::gl_ViewportIndex; constexpr const TSymbolUniqueId BuiltInId::gl_ViewportIndex;
constexpr const TSymbolUniqueId BuiltInId::gl_LayerVS; constexpr const TSymbolUniqueId BuiltInId::gl_LayerVS;
constexpr const TSymbolUniqueId BuiltInId::gl_DrawID; constexpr const TSymbolUniqueId BuiltInId::gl_DrawID;
constexpr const TSymbolUniqueId BuiltInId::gl_DrawIDESSL1;
constexpr const TSymbolUniqueId BuiltInId::gl_NumWorkGroups; constexpr const TSymbolUniqueId BuiltInId::gl_NumWorkGroups;
constexpr const TSymbolUniqueId BuiltInId::gl_WorkGroupSize; constexpr const TSymbolUniqueId BuiltInId::gl_WorkGroupSize;
constexpr const TSymbolUniqueId BuiltInId::gl_WorkGroupID; constexpr const TSymbolUniqueId BuiltInId::gl_WorkGroupID;
...@@ -988,7 +989,7 @@ constexpr const TSymbolUniqueId BuiltInId::gl_PositionGS; ...@@ -988,7 +989,7 @@ constexpr const TSymbolUniqueId BuiltInId::gl_PositionGS;
constexpr const TSymbolUniqueId BuiltInId::gl_ViewID_OVR; constexpr const TSymbolUniqueId BuiltInId::gl_ViewID_OVR;
constexpr const TSymbolUniqueId BuiltInId::gl_ViewID_OVRESSL1; constexpr const TSymbolUniqueId BuiltInId::gl_ViewID_OVRESSL1;
const int TSymbolTable::kLastBuiltInId = 1024; const int TSymbolTable::kLastBuiltInId = 1025;
namespace BuiltInName namespace BuiltInName
{ {
...@@ -1460,6 +1461,11 @@ constexpr const TVariable kVar_gl_DrawID(BuiltInId::gl_DrawID, ...@@ -1460,6 +1461,11 @@ constexpr const TVariable kVar_gl_DrawID(BuiltInId::gl_DrawID,
SymbolType::BuiltIn, SymbolType::BuiltIn,
TExtension::ANGLE_multi_draw, TExtension::ANGLE_multi_draw,
StaticType::Get<EbtInt, EbpHigh, EvqDrawID, 1, 1>()); StaticType::Get<EbtInt, EbpHigh, EvqDrawID, 1, 1>());
constexpr const TVariable kVar_gl_DrawIDESSL1(BuiltInId::gl_DrawIDESSL1,
BuiltInName::gl_DrawID,
SymbolType::BuiltIn,
TExtension::ANGLE_multi_draw,
StaticType::Get<EbtInt, EbpHigh, EvqDrawID, 1, 1>());
constexpr const TVariable kVar_gl_FragColor( constexpr const TVariable kVar_gl_FragColor(
BuiltInId::gl_FragColor, BuiltInId::gl_FragColor,
BuiltInName::gl_FragColor, BuiltInName::gl_FragColor,
...@@ -2043,6 +2049,11 @@ const TVariable *gl_DrawID() ...@@ -2043,6 +2049,11 @@ const TVariable *gl_DrawID()
return &kVar_gl_DrawID; return &kVar_gl_DrawID;
} }
const TVariable *gl_DrawIDESSL1()
{
return &kVar_gl_DrawIDESSL1;
}
const TVariable *gl_FragColor() const TVariable *gl_FragColor()
{ {
return &kVar_gl_FragColor; return &kVar_gl_FragColor;
...@@ -7336,7 +7347,7 @@ constexpr const TFunction kFunction_texture_0Y2B( ...@@ -7336,7 +7347,7 @@ constexpr const TFunction kFunction_texture_0Y2B(
BuiltInId::texture_USamplerCube1_Float3, BuiltInId::texture_USamplerCube1_Float3,
BuiltInName::texture, BuiltInName::texture,
TExtension::UNDEFINED, TExtension::UNDEFINED,
BuiltInParameters::p0Y2B0B, BuiltInParameters::p0Y2B2B2B,
2, 2,
StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
EOpCallBuiltInFunction, EOpCallBuiltInFunction,
...@@ -9613,7 +9624,7 @@ constexpr const TFunction kFunction_textureGather_0Y2B( ...@@ -9613,7 +9624,7 @@ constexpr const TFunction kFunction_textureGather_0Y2B(
BuiltInId::textureGather_USamplerCube1_Float3, BuiltInId::textureGather_USamplerCube1_Float3,
BuiltInName::textureGather, BuiltInName::textureGather,
TExtension::UNDEFINED, TExtension::UNDEFINED,
BuiltInParameters::p0Y2B0B, BuiltInParameters::p0Y2B2B2B,
2, 2,
StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
EOpCallBuiltInFunction, EOpCallBuiltInFunction,
...@@ -16781,6 +16792,20 @@ const TSymbol *TSymbolTable::findBuiltIn(const ImmutableString &name, int shader ...@@ -16781,6 +16792,20 @@ const TSymbol *TSymbolTable::findBuiltIn(const ImmutableString &name, int shader
} }
} }
} }
if ((mShaderType == GL_VERTEX_SHADER) && (mResources.ANGLE_multi_draw))
{
switch (nameHash)
{
case 0x7e4c3c42u:
{
if (name == BuiltInName::gl_DrawID)
{
return &BuiltInVariable::kVar_gl_DrawID;
}
break;
}
}
}
if (mResources.OVR_multiview && mShaderType != GL_COMPUTE_SHADER) if (mResources.OVR_multiview && mShaderType != GL_COMPUTE_SHADER)
{ {
switch (nameHash) switch (nameHash)
...@@ -17265,7 +17290,7 @@ const TSymbol *TSymbolTable::findBuiltIn(const ImmutableString &name, int shader ...@@ -17265,7 +17290,7 @@ const TSymbol *TSymbolTable::findBuiltIn(const ImmutableString &name, int shader
{ {
if (name == BuiltInName::gl_DrawID) if (name == BuiltInName::gl_DrawID)
{ {
return &BuiltInVariable::kVar_gl_DrawID; return &BuiltInVariable::kVar_gl_DrawIDESSL1;
} }
break; break;
} }
......
14be2ba8753af7df7955d25bff00e0f5 87bb6e2c1015c9e9aaf2a89e1595cd30
\ No newline at end of file \ No newline at end of file
...@@ -675,8 +675,24 @@ ...@@ -675,8 +675,24 @@
"subgroups":{ "subgroups":{
"ANGLEMultiDraw":{ "ANGLEMultiDraw":{
"condition": "mResources.ANGLE_multi_draw", "condition": "mResources.ANGLE_multi_draw",
"subgroups":{
"ESSL3":{
"variables":{
"gl_DrawID":{
"level":"ESSL3_BUILTINS",
"extension":"ANGLE_multi_draw",
"type":{
"basic":"Int",
"precision":"High",
"qualifier":"DrawID"
}
}
}
},
"ESSL1":{
"variables":{ "variables":{
"gl_DrawID":{ "gl_DrawID":{
"suffix":"ESSL1",
"level":"ESSL1_BUILTINS", "level":"ESSL1_BUILTINS",
"extension":"ANGLE_multi_draw", "extension":"ANGLE_multi_draw",
"type":{ "type":{
...@@ -688,6 +704,9 @@ ...@@ -688,6 +704,9 @@
} }
} }
} }
}
}
}, },
"ComputeShader":{ "ComputeShader":{
"condition":"shaderType == GL_COMPUTE_SHADER", "condition":"shaderType == GL_COMPUTE_SHADER",
......
...@@ -29,21 +29,22 @@ constexpr const ImmutableString kEmulatedGLDrawIDName("angle_DrawID"); ...@@ -29,21 +29,22 @@ constexpr const ImmutableString kEmulatedGLDrawIDName("angle_DrawID");
class FindGLDrawIDTraverser : public TIntermTraverser class FindGLDrawIDTraverser : public TIntermTraverser
{ {
public: public:
FindGLDrawIDTraverser() : TIntermTraverser(true, false, false), mFound(false) {} FindGLDrawIDTraverser() : TIntermTraverser(true, false, false), mVariable(nullptr) {}
bool isGLDrawIDUsed() const { return mFound; } const TVariable *getGLDrawIDBuiltinVariable() { return mVariable; }
protected: protected:
void visitSymbol(TIntermSymbol *node) override void visitSymbol(TIntermSymbol *node) override
{ {
if (&node->variable() == BuiltInVariable::gl_DrawID()) if (&node->variable() == BuiltInVariable::gl_DrawID() ||
&node->variable() == BuiltInVariable::gl_DrawIDESSL1())
{ {
mFound = true; mVariable = &node->variable();
} }
} }
private: private:
bool mFound; const TVariable *mVariable;
}; };
} // namespace } // namespace
...@@ -55,7 +56,8 @@ void EmulateGLDrawID(TIntermBlock *root, ...@@ -55,7 +56,8 @@ void EmulateGLDrawID(TIntermBlock *root,
{ {
FindGLDrawIDTraverser traverser; FindGLDrawIDTraverser traverser;
root->traverse(&traverser); root->traverse(&traverser);
if (traverser.isGLDrawIDUsed()) const TVariable *builtInVariable = traverser.getGLDrawIDBuiltinVariable();
if (builtInVariable)
{ {
const TType *type = StaticType::Get<EbtInt, EbpHigh, EvqUniform, 1, 1>(); const TType *type = StaticType::Get<EbtInt, EbpHigh, EvqUniform, 1, 1>();
const TVariable *drawID = const TVariable *drawID =
...@@ -69,7 +71,7 @@ void EmulateGLDrawID(TIntermBlock *root, ...@@ -69,7 +71,7 @@ void EmulateGLDrawID(TIntermBlock *root,
uniform.mappedName = kEmulatedGLDrawIDName.data(); uniform.mappedName = kEmulatedGLDrawIDName.data();
uniform.type = GLVariableType(*type); uniform.type = GLVariableType(*type);
uniform.precision = GLVariablePrecision(*type); uniform.precision = GLVariablePrecision(*type);
uniform.staticUse = symbolTable->isStaticallyUsed(*BuiltInVariable::gl_DrawID()); uniform.staticUse = symbolTable->isStaticallyUsed(*builtInVariable);
uniform.active = true; uniform.active = true;
uniform.binding = type->getLayoutQualifier().binding; uniform.binding = type->getLayoutQualifier().binding;
uniform.location = type->getLayoutQualifier().location; uniform.location = type->getLayoutQualifier().location;
...@@ -80,7 +82,7 @@ void EmulateGLDrawID(TIntermBlock *root, ...@@ -80,7 +82,7 @@ void EmulateGLDrawID(TIntermBlock *root,
} }
DeclareGlobalVariable(root, drawID); DeclareGlobalVariable(root, drawID);
ReplaceVariable(root, BuiltInVariable::gl_DrawID(), drawID); ReplaceVariable(root, builtInVariable, drawID);
} }
} }
......
...@@ -1298,22 +1298,23 @@ class BuiltInId ...@@ -1298,22 +1298,23 @@ class BuiltInId
static constexpr const TSymbolUniqueId gl_ViewportIndex = TSymbolUniqueId(1006); static constexpr const TSymbolUniqueId gl_ViewportIndex = TSymbolUniqueId(1006);
static constexpr const TSymbolUniqueId gl_LayerVS = TSymbolUniqueId(1007); static constexpr const TSymbolUniqueId gl_LayerVS = TSymbolUniqueId(1007);
static constexpr const TSymbolUniqueId gl_DrawID = TSymbolUniqueId(1008); static constexpr const TSymbolUniqueId gl_DrawID = TSymbolUniqueId(1008);
static constexpr const TSymbolUniqueId gl_NumWorkGroups = TSymbolUniqueId(1009); static constexpr const TSymbolUniqueId gl_DrawIDESSL1 = TSymbolUniqueId(1009);
static constexpr const TSymbolUniqueId gl_WorkGroupSize = TSymbolUniqueId(1010); static constexpr const TSymbolUniqueId gl_NumWorkGroups = TSymbolUniqueId(1010);
static constexpr const TSymbolUniqueId gl_WorkGroupID = TSymbolUniqueId(1011); static constexpr const TSymbolUniqueId gl_WorkGroupSize = TSymbolUniqueId(1011);
static constexpr const TSymbolUniqueId gl_LocalInvocationID = TSymbolUniqueId(1012); static constexpr const TSymbolUniqueId gl_WorkGroupID = TSymbolUniqueId(1012);
static constexpr const TSymbolUniqueId gl_GlobalInvocationID = TSymbolUniqueId(1013); static constexpr const TSymbolUniqueId gl_LocalInvocationID = TSymbolUniqueId(1013);
static constexpr const TSymbolUniqueId gl_LocalInvocationIndex = TSymbolUniqueId(1014); static constexpr const TSymbolUniqueId gl_GlobalInvocationID = TSymbolUniqueId(1014);
static constexpr const TSymbolUniqueId gl_PrimitiveIDIn = TSymbolUniqueId(1015); static constexpr const TSymbolUniqueId gl_LocalInvocationIndex = TSymbolUniqueId(1015);
static constexpr const TSymbolUniqueId gl_InvocationID = TSymbolUniqueId(1016); static constexpr const TSymbolUniqueId gl_PrimitiveIDIn = TSymbolUniqueId(1016);
static constexpr const TSymbolUniqueId gl_PrimitiveIDGS = TSymbolUniqueId(1017); static constexpr const TSymbolUniqueId gl_InvocationID = TSymbolUniqueId(1017);
static constexpr const TSymbolUniqueId gl_LayerGS = TSymbolUniqueId(1018); static constexpr const TSymbolUniqueId gl_PrimitiveIDGS = TSymbolUniqueId(1018);
static constexpr const TSymbolUniqueId gl_PerVertex = TSymbolUniqueId(1019); static constexpr const TSymbolUniqueId gl_LayerGS = TSymbolUniqueId(1019);
static constexpr const TSymbolUniqueId gl_in = TSymbolUniqueId(1020); static constexpr const TSymbolUniqueId gl_PerVertex = TSymbolUniqueId(1020);
static constexpr const TSymbolUniqueId gl_PerVertexOutBlock = TSymbolUniqueId(1021); static constexpr const TSymbolUniqueId gl_in = TSymbolUniqueId(1021);
static constexpr const TSymbolUniqueId gl_PositionGS = TSymbolUniqueId(1022); static constexpr const TSymbolUniqueId gl_PerVertexOutBlock = TSymbolUniqueId(1022);
static constexpr const TSymbolUniqueId gl_ViewID_OVR = TSymbolUniqueId(1023); static constexpr const TSymbolUniqueId gl_PositionGS = TSymbolUniqueId(1023);
static constexpr const TSymbolUniqueId gl_ViewID_OVRESSL1 = TSymbolUniqueId(1024); static constexpr const TSymbolUniqueId gl_ViewID_OVR = TSymbolUniqueId(1024);
static constexpr const TSymbolUniqueId gl_ViewID_OVRESSL1 = TSymbolUniqueId(1025);
}; // class BuiltInId }; // class BuiltInId
...@@ -1321,6 +1322,7 @@ namespace BuiltInVariable ...@@ -1321,6 +1322,7 @@ namespace BuiltInVariable
{ {
const TVariable *gl_DrawID(); const TVariable *gl_DrawID();
const TVariable *gl_DrawIDESSL1();
const TVariable *gl_FragColor(); const TVariable *gl_FragColor();
const TVariable *gl_FragCoord(); const TVariable *gl_FragCoord();
const TVariable *gl_FragDepth(); const TVariable *gl_FragDepth();
......
...@@ -52,6 +52,21 @@ TEST_F(EmulateGLDrawIDTest, RequiresEmulation) ...@@ -52,6 +52,21 @@ TEST_F(EmulateGLDrawIDTest, RequiresEmulation)
"extension is not supported"); "extension is not supported");
} }
// Check that compiling with emulation with gl_DrawID works with different shader versions
TEST_F(EmulateGLDrawIDTest, CheckCompile)
{
const std::string shaderString =
"#extension GL_ANGLE_multi_draw : require\n"
"void main() {\n"
" gl_Position = vec4(float(gl_DrawID), 0.0, 0.0, 1.0);\n"
"}\n";
compile(shaderString, SH_OBJECT_CODE | SH_VARIABLES | SH_EMULATE_GL_DRAW_ID);
compile("#version 100\n" + shaderString, SH_OBJECT_CODE | SH_VARIABLES | SH_EMULATE_GL_DRAW_ID);
compile("#version 300 es\n" + shaderString,
SH_OBJECT_CODE | SH_VARIABLES | SH_EMULATE_GL_DRAW_ID);
}
// Check that gl_DrawID is properly emulated // Check that gl_DrawID is properly emulated
TEST_F(EmulateGLDrawIDTest, EmulatesUniform) TEST_F(EmulateGLDrawIDTest, EmulatesUniform)
{ {
......
...@@ -1062,6 +1062,7 @@ TEST(ImmutableStringTest, ScriptGeneratedHashesMatch) ...@@ -1062,6 +1062,7 @@ TEST(ImmutableStringTest, ScriptGeneratedHashesMatch)
ASSERT_EQ(0x7e645c89u, ImmutableString("gl_FragDepth").mangledNameHash()); ASSERT_EQ(0x7e645c89u, ImmutableString("gl_FragDepth").mangledNameHash());
ASSERT_EQ(0x7e6be47fu, ImmutableString("gl_InstanceID").mangledNameHash()); ASSERT_EQ(0x7e6be47fu, ImmutableString("gl_InstanceID").mangledNameHash());
ASSERT_EQ(0x7e5f8987u, ImmutableString("gl_VertexID").mangledNameHash()); ASSERT_EQ(0x7e5f8987u, ImmutableString("gl_VertexID").mangledNameHash());
ASSERT_EQ(0x7e4c3c42u, ImmutableString("gl_DrawID").mangledNameHash());
ASSERT_EQ(0x7e6f6de9u, ImmutableString("gl_ViewID_OVR").mangledNameHash()); ASSERT_EQ(0x7e6f6de9u, ImmutableString("gl_ViewID_OVR").mangledNameHash());
ASSERT_EQ(0x7ea6cdf6u, ImmutableString("gl_MaxVaryingVectors").mangledNameHash()); ASSERT_EQ(0x7ea6cdf6u, ImmutableString("gl_MaxVaryingVectors").mangledNameHash());
ASSERT_EQ(0x7e5a0c08u, ImmutableString("gl_FragData").mangledNameHash()); ASSERT_EQ(0x7e5a0c08u, ImmutableString("gl_FragData").mangledNameHash());
...@@ -1072,7 +1073,6 @@ TEST(ImmutableStringTest, ScriptGeneratedHashesMatch) ...@@ -1072,7 +1073,6 @@ TEST(ImmutableStringTest, ScriptGeneratedHashesMatch)
ASSERT_EQ(0x7e7970c2u, ImmutableString("gl_LastFragData").mangledNameHash()); ASSERT_EQ(0x7e7970c2u, ImmutableString("gl_LastFragData").mangledNameHash());
ASSERT_EQ(0x7e802016u, ImmutableString("gl_LastFragColor").mangledNameHash()); ASSERT_EQ(0x7e802016u, ImmutableString("gl_LastFragColor").mangledNameHash());
ASSERT_EQ(0x7e9f0a88u, ImmutableString("gl_LastFragColorARM").mangledNameHash()); ASSERT_EQ(0x7e9f0a88u, ImmutableString("gl_LastFragColorARM").mangledNameHash());
ASSERT_EQ(0x7e4c3c42u, ImmutableString("gl_DrawID").mangledNameHash());
ASSERT_EQ(0x7ebeff64u, ImmutableString("gl_DepthRangeParameters").mangledNameHash()); ASSERT_EQ(0x7ebeff64u, ImmutableString("gl_DepthRangeParameters").mangledNameHash());
ASSERT_EQ(0x7e6af03cu, ImmutableString("gl_DepthRange").mangledNameHash()); ASSERT_EQ(0x7e6af03cu, ImmutableString("gl_DepthRange").mangledNameHash());
ASSERT_EQ(0x7e9ad799u, ImmutableString("gl_MaxVertexAttribs").mangledNameHash()); ASSERT_EQ(0x7e9ad799u, ImmutableString("gl_MaxVertexAttribs").mangledNameHash());
......
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