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 @@
"ESSL static builtins:src/compiler/translator/builtin_function_declarations.txt":
"e5e567406476306ea06984d885be028d",
"ESSL static builtins:src/compiler/translator/builtin_variables.json":
"2be179f5b2f04d68367d023bec7209e3",
"d07ec4348b35d0db1eeab3c99a5e91f9",
"ESSL static builtins:src/compiler/translator/gen_builtin_symbols.py":
"9a5226ee6573650897bdc21e1bb0bfd0",
"Emulated HLSL functions:src/compiler/translator/emulated_builtin_function_data_hlsl.json":
......
......@@ -971,6 +971,7 @@ constexpr const TSymbolUniqueId BuiltInId::gl_VertexID;
constexpr const TSymbolUniqueId BuiltInId::gl_ViewportIndex;
constexpr const TSymbolUniqueId BuiltInId::gl_LayerVS;
constexpr const TSymbolUniqueId BuiltInId::gl_DrawID;
constexpr const TSymbolUniqueId BuiltInId::gl_DrawIDESSL1;
constexpr const TSymbolUniqueId BuiltInId::gl_NumWorkGroups;
constexpr const TSymbolUniqueId BuiltInId::gl_WorkGroupSize;
constexpr const TSymbolUniqueId BuiltInId::gl_WorkGroupID;
......@@ -988,7 +989,7 @@ constexpr const TSymbolUniqueId BuiltInId::gl_PositionGS;
constexpr const TSymbolUniqueId BuiltInId::gl_ViewID_OVR;
constexpr const TSymbolUniqueId BuiltInId::gl_ViewID_OVRESSL1;
const int TSymbolTable::kLastBuiltInId = 1024;
const int TSymbolTable::kLastBuiltInId = 1025;
namespace BuiltInName
{
......@@ -1460,6 +1461,11 @@ constexpr const TVariable kVar_gl_DrawID(BuiltInId::gl_DrawID,
SymbolType::BuiltIn,
TExtension::ANGLE_multi_draw,
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(
BuiltInId::gl_FragColor,
BuiltInName::gl_FragColor,
......@@ -2043,6 +2049,11 @@ const TVariable *gl_DrawID()
return &kVar_gl_DrawID;
}
const TVariable *gl_DrawIDESSL1()
{
return &kVar_gl_DrawIDESSL1;
}
const TVariable *gl_FragColor()
{
return &kVar_gl_FragColor;
......@@ -7336,7 +7347,7 @@ constexpr const TFunction kFunction_texture_0Y2B(
BuiltInId::texture_USamplerCube1_Float3,
BuiltInName::texture,
TExtension::UNDEFINED,
BuiltInParameters::p0Y2B0B,
BuiltInParameters::p0Y2B2B2B,
2,
StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
EOpCallBuiltInFunction,
......@@ -9613,7 +9624,7 @@ constexpr const TFunction kFunction_textureGather_0Y2B(
BuiltInId::textureGather_USamplerCube1_Float3,
BuiltInName::textureGather,
TExtension::UNDEFINED,
BuiltInParameters::p0Y2B0B,
BuiltInParameters::p0Y2B2B2B,
2,
StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
EOpCallBuiltInFunction,
......@@ -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)
{
switch (nameHash)
......@@ -17265,7 +17290,7 @@ const TSymbol *TSymbolTable::findBuiltIn(const ImmutableString &name, int shader
{
if (name == BuiltInName::gl_DrawID)
{
return &BuiltInVariable::kVar_gl_DrawID;
return &BuiltInVariable::kVar_gl_DrawIDESSL1;
}
break;
}
......
14be2ba8753af7df7955d25bff00e0f5
\ No newline at end of file
87bb6e2c1015c9e9aaf2a89e1595cd30
\ No newline at end of file
......@@ -675,17 +675,36 @@
"subgroups":{
"ANGLEMultiDraw":{
"condition": "mResources.ANGLE_multi_draw",
"variables":{
"gl_DrawID":{
"level":"ESSL1_BUILTINS",
"extension":"ANGLE_multi_draw",
"type":{
"basic":"Int",
"precision":"High",
"qualifier":"DrawID"
"subgroups":{
"ESSL3":{
"variables":{
"gl_DrawID":{
"level":"ESSL3_BUILTINS",
"extension":"ANGLE_multi_draw",
"type":{
"basic":"Int",
"precision":"High",
"qualifier":"DrawID"
}
}
}
},
"ESSL1":{
"variables":{
"gl_DrawID":{
"suffix":"ESSL1",
"level":"ESSL1_BUILTINS",
"extension":"ANGLE_multi_draw",
"type":{
"basic":"Int",
"precision":"High",
"qualifier":"DrawID"
}
}
}
}
}
}
}
},
......
......@@ -29,21 +29,22 @@ constexpr const ImmutableString kEmulatedGLDrawIDName("angle_DrawID");
class FindGLDrawIDTraverser : public TIntermTraverser
{
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:
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:
bool mFound;
const TVariable *mVariable;
};
} // namespace
......@@ -55,7 +56,8 @@ void EmulateGLDrawID(TIntermBlock *root,
{
FindGLDrawIDTraverser 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 TVariable *drawID =
......@@ -69,7 +71,7 @@ void EmulateGLDrawID(TIntermBlock *root,
uniform.mappedName = kEmulatedGLDrawIDName.data();
uniform.type = GLVariableType(*type);
uniform.precision = GLVariablePrecision(*type);
uniform.staticUse = symbolTable->isStaticallyUsed(*BuiltInVariable::gl_DrawID());
uniform.staticUse = symbolTable->isStaticallyUsed(*builtInVariable);
uniform.active = true;
uniform.binding = type->getLayoutQualifier().binding;
uniform.location = type->getLayoutQualifier().location;
......@@ -80,7 +82,7 @@ void EmulateGLDrawID(TIntermBlock *root,
}
DeclareGlobalVariable(root, drawID);
ReplaceVariable(root, BuiltInVariable::gl_DrawID(), drawID);
ReplaceVariable(root, builtInVariable, drawID);
}
}
......
......@@ -1298,22 +1298,23 @@ class BuiltInId
static constexpr const TSymbolUniqueId gl_ViewportIndex = TSymbolUniqueId(1006);
static constexpr const TSymbolUniqueId gl_LayerVS = TSymbolUniqueId(1007);
static constexpr const TSymbolUniqueId gl_DrawID = TSymbolUniqueId(1008);
static constexpr const TSymbolUniqueId gl_NumWorkGroups = TSymbolUniqueId(1009);
static constexpr const TSymbolUniqueId gl_WorkGroupSize = TSymbolUniqueId(1010);
static constexpr const TSymbolUniqueId gl_WorkGroupID = TSymbolUniqueId(1011);
static constexpr const TSymbolUniqueId gl_LocalInvocationID = TSymbolUniqueId(1012);
static constexpr const TSymbolUniqueId gl_GlobalInvocationID = TSymbolUniqueId(1013);
static constexpr const TSymbolUniqueId gl_LocalInvocationIndex = TSymbolUniqueId(1014);
static constexpr const TSymbolUniqueId gl_PrimitiveIDIn = TSymbolUniqueId(1015);
static constexpr const TSymbolUniqueId gl_InvocationID = TSymbolUniqueId(1016);
static constexpr const TSymbolUniqueId gl_PrimitiveIDGS = TSymbolUniqueId(1017);
static constexpr const TSymbolUniqueId gl_LayerGS = TSymbolUniqueId(1018);
static constexpr const TSymbolUniqueId gl_PerVertex = TSymbolUniqueId(1019);
static constexpr const TSymbolUniqueId gl_in = TSymbolUniqueId(1020);
static constexpr const TSymbolUniqueId gl_PerVertexOutBlock = TSymbolUniqueId(1021);
static constexpr const TSymbolUniqueId gl_PositionGS = TSymbolUniqueId(1022);
static constexpr const TSymbolUniqueId gl_ViewID_OVR = TSymbolUniqueId(1023);
static constexpr const TSymbolUniqueId gl_ViewID_OVRESSL1 = TSymbolUniqueId(1024);
static constexpr const TSymbolUniqueId gl_DrawIDESSL1 = TSymbolUniqueId(1009);
static constexpr const TSymbolUniqueId gl_NumWorkGroups = TSymbolUniqueId(1010);
static constexpr const TSymbolUniqueId gl_WorkGroupSize = TSymbolUniqueId(1011);
static constexpr const TSymbolUniqueId gl_WorkGroupID = TSymbolUniqueId(1012);
static constexpr const TSymbolUniqueId gl_LocalInvocationID = TSymbolUniqueId(1013);
static constexpr const TSymbolUniqueId gl_GlobalInvocationID = TSymbolUniqueId(1014);
static constexpr const TSymbolUniqueId gl_LocalInvocationIndex = TSymbolUniqueId(1015);
static constexpr const TSymbolUniqueId gl_PrimitiveIDIn = TSymbolUniqueId(1016);
static constexpr const TSymbolUniqueId gl_InvocationID = TSymbolUniqueId(1017);
static constexpr const TSymbolUniqueId gl_PrimitiveIDGS = TSymbolUniqueId(1018);
static constexpr const TSymbolUniqueId gl_LayerGS = TSymbolUniqueId(1019);
static constexpr const TSymbolUniqueId gl_PerVertex = TSymbolUniqueId(1020);
static constexpr const TSymbolUniqueId gl_in = TSymbolUniqueId(1021);
static constexpr const TSymbolUniqueId gl_PerVertexOutBlock = TSymbolUniqueId(1022);
static constexpr const TSymbolUniqueId gl_PositionGS = TSymbolUniqueId(1023);
static constexpr const TSymbolUniqueId gl_ViewID_OVR = TSymbolUniqueId(1024);
static constexpr const TSymbolUniqueId gl_ViewID_OVRESSL1 = TSymbolUniqueId(1025);
}; // class BuiltInId
......@@ -1321,6 +1322,7 @@ namespace BuiltInVariable
{
const TVariable *gl_DrawID();
const TVariable *gl_DrawIDESSL1();
const TVariable *gl_FragColor();
const TVariable *gl_FragCoord();
const TVariable *gl_FragDepth();
......
......@@ -52,6 +52,21 @@ TEST_F(EmulateGLDrawIDTest, RequiresEmulation)
"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
TEST_F(EmulateGLDrawIDTest, EmulatesUniform)
{
......
......@@ -1062,6 +1062,7 @@ TEST(ImmutableStringTest, ScriptGeneratedHashesMatch)
ASSERT_EQ(0x7e645c89u, ImmutableString("gl_FragDepth").mangledNameHash());
ASSERT_EQ(0x7e6be47fu, ImmutableString("gl_InstanceID").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(0x7ea6cdf6u, ImmutableString("gl_MaxVaryingVectors").mangledNameHash());
ASSERT_EQ(0x7e5a0c08u, ImmutableString("gl_FragData").mangledNameHash());
......@@ -1072,7 +1073,6 @@ TEST(ImmutableStringTest, ScriptGeneratedHashesMatch)
ASSERT_EQ(0x7e7970c2u, ImmutableString("gl_LastFragData").mangledNameHash());
ASSERT_EQ(0x7e802016u, ImmutableString("gl_LastFragColor").mangledNameHash());
ASSERT_EQ(0x7e9f0a88u, ImmutableString("gl_LastFragColorARM").mangledNameHash());
ASSERT_EQ(0x7e4c3c42u, ImmutableString("gl_DrawID").mangledNameHash());
ASSERT_EQ(0x7ebeff64u, ImmutableString("gl_DepthRangeParameters").mangledNameHash());
ASSERT_EQ(0x7e6af03cu, ImmutableString("gl_DepthRange").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