Commit 5643afc0 by Shahbaz Youssefi Committed by Commit Bot

Vulkan: add GLSL placeholder for transform feedback output

Bug: angleproject:3205 Change-Id: Id3941b6953e03e7b2183acc57b2c6db4a6439352 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1643424 Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: 's avatarTobin Ehlis <tobine@google.com> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org>
parent ac8bafc0
......@@ -312,6 +312,15 @@ void AppendVertexShaderDepthCorrectionToMain(TIntermBlock *root, TSymbolTable *s
RunAtTheEndOfShader(root, assignment, symbolTable);
}
void AppendVertexShaderTransformFeedbackOutputToMain(TIntermBlock *root, TSymbolTable *symbolTable)
{
TVariable *xfbPlaceholder = new TVariable(symbolTable, ImmutableString("@@ XFB-OUT @@"),
new TType(), SymbolType::AngleInternal);
// Append the assignment as a statement at the end of the shader.
RunAtTheEndOfShader(root, new TIntermSymbol(xfbPlaceholder), symbolTable);
}
// The AddDriverUniformsToShader operation adds an internal uniform block to a shader. The driver
// block is used to implement Vulkan-specific features and workarounds. Returns the driver uniforms
// variable.
......@@ -761,6 +770,12 @@ void TranslatorVulkan::translate(TIntermBlock *root,
AddANGLEPositionVarying(root, &getSymbolTable());
// Add a macro to declare transform feedback buffers.
sink << "@@ XFB-DECL @@\n\n";
// Append a macro for transform feedback substitution prior to modifying depth.
AppendVertexShaderTransformFeedbackOutputToMain(root, &getSymbolTable());
// Append depth range translation to main.
AppendVertexShaderDepthCorrectionToMain(root, &getSymbolTable());
}
......
......@@ -37,6 +37,8 @@ namespace
constexpr char kMarkerStart[] = "@@ ";
constexpr char kQualifierMarkerBegin[] = "@@ QUALIFIER-";
constexpr char kLayoutMarkerBegin[] = "@@ LAYOUT-";
constexpr char kXfbDeclMarkerBegin[] = "@@ XFB-DECL";
constexpr char kXfbOutMarkerBegin[] = "@@ XFB-OUT";
constexpr char kMarkerEnd[] = " @@";
constexpr char kLayoutParamsBegin = '(';
constexpr char kLayoutParamsEnd = ')';
......@@ -108,8 +110,11 @@ class IntermediateShaderSource final : angle::NonCopyable
// Find @@ QUALIFIER-name @@ and replace it with |specifier|.
void insertQualifierSpecifier(const std::string &name, const std::string &specifier);
// Replace @@ DEFAULT-UNIFORMS-SET-BINDING @@ with |specifier|.
void insertDefaultUniformsSpecifier(std::string &&specifier);
// Replace @@ XFB-DECL @@ with |decl|.
void insertTransformFeedbackDeclaration(const std::string &&decl);
// Replace @@ XFB-OUT @@ with |output| code block.
void insertTransformFeedbackOutput(const std::string &&output);
// Remove @@ LAYOUT-name(*) @@ and @@ QUALIFIER-name @@ altogether, optionally replacing them
// with something to make sure the shader still compiles.
......@@ -127,6 +132,10 @@ class IntermediateShaderSource final : angle::NonCopyable
Qualifier,
// Block corresponding to @@ LAYOUT-abc(extra, args) @@
Layout,
// Block corresponding to @@ XFB-DECL @@
TransformFeedbackDeclaration,
// Block corresponding to @@ XFB-OUT @@
TransformFeedbackOutput,
};
struct Token
......@@ -142,6 +151,10 @@ class IntermediateShaderSource final : angle::NonCopyable
void addTextBlock(std::string &&text);
void addLayoutBlock(std::string &&name, std::string &&args);
void addQualifierBlock(std::string &&name);
void addTransformFeedbackDeclarationBlock();
void addTransformFeedbackOutputBlock();
void replaceSingleMacro(TokenType type, const std::string &&text);
std::vector<Token> mTokens;
};
......@@ -169,6 +182,18 @@ void IntermediateShaderSource::addQualifierBlock(std::string &&name)
mTokens.emplace_back(std::move(token));
}
void IntermediateShaderSource::addTransformFeedbackDeclarationBlock()
{
Token token = {TokenType::TransformFeedbackDeclaration, "", ""};
mTokens.emplace_back(std::move(token));
}
void IntermediateShaderSource::addTransformFeedbackOutputBlock()
{
Token token = {TokenType::TransformFeedbackOutput, "", ""};
mTokens.emplace_back(std::move(token));
}
IntermediateShaderSource::IntermediateShaderSource(const std::string &source)
{
size_t cur = 0;
......@@ -208,6 +233,16 @@ IntermediateShaderSource::IntermediateShaderSource(const std::string &source)
cur += args.length() + 1;
addLayoutBlock(std::move(name), std::move(args));
}
else if (source.compare(cur, ConstStrLen(kXfbDeclMarkerBegin), kXfbDeclMarkerBegin) == 0)
{
cur += ConstStrLen(kXfbDeclMarkerBegin);
addTransformFeedbackOutputBlock();
}
else if (source.compare(cur, ConstStrLen(kXfbOutMarkerBegin), kXfbOutMarkerBegin) == 0)
{
cur += ConstStrLen(kXfbOutMarkerBegin);
addTransformFeedbackDeclarationBlock();
}
else
{
// If reached here, @@ was met in the shader source itself which would have been a
......@@ -253,6 +288,29 @@ void IntermediateShaderSource::insertQualifierSpecifier(const std::string &name,
}
}
void IntermediateShaderSource::replaceSingleMacro(TokenType type, const std::string &&text)
{
for (Token &block : mTokens)
{
if (block.type == type)
{
block.type = TokenType::Text;
block.text = std::move(text);
break;
}
}
}
void IntermediateShaderSource::insertTransformFeedbackDeclaration(const std::string &&decl)
{
replaceSingleMacro(TokenType::TransformFeedbackDeclaration, std::move(decl));
}
void IntermediateShaderSource::insertTransformFeedbackOutput(const std::string &&output)
{
replaceSingleMacro(TokenType::TransformFeedbackOutput, std::move(output));
}
void IntermediateShaderSource::eraseLayoutAndQualifierSpecifiers(const std::string &name,
const std::string &replacement)
{
......@@ -584,6 +642,12 @@ void GlslangWrapper::GetShaderSource(const gl::ProgramState &programState,
vertexSource.insertLayoutSpecifier(kVaryingName, layout);
fragmentSource.insertLayoutSpecifier(kVaryingName, layout);
// Write transform feedback output code.
// TODO(syoussefi): support transform feedback. http://anglebug.com/3205
ASSERT(programState.getLinkedTransformFeedbackVaryings().size() == 0);
vertexSource.insertTransformFeedbackDeclaration("");
vertexSource.insertTransformFeedbackOutput("");
vertexSource.insertQualifierSpecifier(kVaryingName, "out");
fragmentSource.insertQualifierSpecifier(kVaryingName, "in");
......
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