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 ...@@ -312,6 +312,15 @@ void AppendVertexShaderDepthCorrectionToMain(TIntermBlock *root, TSymbolTable *s
RunAtTheEndOfShader(root, assignment, symbolTable); 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 // 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 // block is used to implement Vulkan-specific features and workarounds. Returns the driver uniforms
// variable. // variable.
...@@ -761,6 +770,12 @@ void TranslatorVulkan::translate(TIntermBlock *root, ...@@ -761,6 +770,12 @@ void TranslatorVulkan::translate(TIntermBlock *root,
AddANGLEPositionVarying(root, &getSymbolTable()); 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. // Append depth range translation to main.
AppendVertexShaderDepthCorrectionToMain(root, &getSymbolTable()); AppendVertexShaderDepthCorrectionToMain(root, &getSymbolTable());
} }
......
...@@ -37,6 +37,8 @@ namespace ...@@ -37,6 +37,8 @@ namespace
constexpr char kMarkerStart[] = "@@ "; constexpr char kMarkerStart[] = "@@ ";
constexpr char kQualifierMarkerBegin[] = "@@ QUALIFIER-"; constexpr char kQualifierMarkerBegin[] = "@@ QUALIFIER-";
constexpr char kLayoutMarkerBegin[] = "@@ LAYOUT-"; constexpr char kLayoutMarkerBegin[] = "@@ LAYOUT-";
constexpr char kXfbDeclMarkerBegin[] = "@@ XFB-DECL";
constexpr char kXfbOutMarkerBegin[] = "@@ XFB-OUT";
constexpr char kMarkerEnd[] = " @@"; constexpr char kMarkerEnd[] = " @@";
constexpr char kLayoutParamsBegin = '('; constexpr char kLayoutParamsBegin = '(';
constexpr char kLayoutParamsEnd = ')'; constexpr char kLayoutParamsEnd = ')';
...@@ -108,8 +110,11 @@ class IntermediateShaderSource final : angle::NonCopyable ...@@ -108,8 +110,11 @@ class IntermediateShaderSource final : angle::NonCopyable
// Find @@ QUALIFIER-name @@ and replace it with |specifier|. // Find @@ QUALIFIER-name @@ and replace it with |specifier|.
void insertQualifierSpecifier(const std::string &name, const std::string &specifier); void insertQualifierSpecifier(const std::string &name, const std::string &specifier);
// Replace @@ DEFAULT-UNIFORMS-SET-BINDING @@ with |specifier|. // Replace @@ XFB-DECL @@ with |decl|.
void insertDefaultUniformsSpecifier(std::string &&specifier); 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 // Remove @@ LAYOUT-name(*) @@ and @@ QUALIFIER-name @@ altogether, optionally replacing them
// with something to make sure the shader still compiles. // with something to make sure the shader still compiles.
...@@ -127,6 +132,10 @@ class IntermediateShaderSource final : angle::NonCopyable ...@@ -127,6 +132,10 @@ class IntermediateShaderSource final : angle::NonCopyable
Qualifier, Qualifier,
// Block corresponding to @@ LAYOUT-abc(extra, args) @@ // Block corresponding to @@ LAYOUT-abc(extra, args) @@
Layout, Layout,
// Block corresponding to @@ XFB-DECL @@
TransformFeedbackDeclaration,
// Block corresponding to @@ XFB-OUT @@
TransformFeedbackOutput,
}; };
struct Token struct Token
...@@ -142,6 +151,10 @@ class IntermediateShaderSource final : angle::NonCopyable ...@@ -142,6 +151,10 @@ class IntermediateShaderSource final : angle::NonCopyable
void addTextBlock(std::string &&text); void addTextBlock(std::string &&text);
void addLayoutBlock(std::string &&name, std::string &&args); void addLayoutBlock(std::string &&name, std::string &&args);
void addQualifierBlock(std::string &&name); void addQualifierBlock(std::string &&name);
void addTransformFeedbackDeclarationBlock();
void addTransformFeedbackOutputBlock();
void replaceSingleMacro(TokenType type, const std::string &&text);
std::vector<Token> mTokens; std::vector<Token> mTokens;
}; };
...@@ -169,6 +182,18 @@ void IntermediateShaderSource::addQualifierBlock(std::string &&name) ...@@ -169,6 +182,18 @@ void IntermediateShaderSource::addQualifierBlock(std::string &&name)
mTokens.emplace_back(std::move(token)); 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) IntermediateShaderSource::IntermediateShaderSource(const std::string &source)
{ {
size_t cur = 0; size_t cur = 0;
...@@ -208,6 +233,16 @@ IntermediateShaderSource::IntermediateShaderSource(const std::string &source) ...@@ -208,6 +233,16 @@ IntermediateShaderSource::IntermediateShaderSource(const std::string &source)
cur += args.length() + 1; cur += args.length() + 1;
addLayoutBlock(std::move(name), std::move(args)); 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 else
{ {
// If reached here, @@ was met in the shader source itself which would have been a // 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, ...@@ -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, void IntermediateShaderSource::eraseLayoutAndQualifierSpecifiers(const std::string &name,
const std::string &replacement) const std::string &replacement)
{ {
...@@ -584,6 +642,12 @@ void GlslangWrapper::GetShaderSource(const gl::ProgramState &programState, ...@@ -584,6 +642,12 @@ void GlslangWrapper::GetShaderSource(const gl::ProgramState &programState,
vertexSource.insertLayoutSpecifier(kVaryingName, layout); vertexSource.insertLayoutSpecifier(kVaryingName, layout);
fragmentSource.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"); vertexSource.insertQualifierSpecifier(kVaryingName, "out");
fragmentSource.insertQualifierSpecifier(kVaryingName, "in"); 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