Defer shader compiles when possible.
When using the program binary memory cache inside ANGLE, this will
give a potential fast path. If the user doesn't query the shader
compile status or info log before calling LinkProgram, then we can
check the program cache before translating the program, and if it
finds a hit, we don't even need to call the translator.
To preserve the shader settings at compile time, a reference to the
current shader translator is kept in a binding pointer on the call
to compile. This mirrors a similar implementation in Chromium's
command buffer. Also the compile options and source are cached at
compile to preserve the correct shader state.
BUG=angleproject:1897
Change-Id: I3c046d7ac8c3b5c8cc169c4802ffe47f95537212
Reviewed-on: https://chromium-review.googlesource.com/517379
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libANGLE/Program.h b/src/libANGLE/Program.h
index 6724e6c..867ea6f 100644
--- a/src/libANGLE/Program.h
+++ b/src/libANGLE/Program.h
@@ -206,9 +206,9 @@
const std::string &getLabel();
- const Shader *getAttachedVertexShader() const { return mAttachedVertexShader; }
- const Shader *getAttachedFragmentShader() const { return mAttachedFragmentShader; }
- const Shader *getAttachedComputeShader() const { return mAttachedComputeShader; }
+ Shader *getAttachedVertexShader() const { return mAttachedVertexShader; }
+ Shader *getAttachedFragmentShader() const { return mAttachedFragmentShader; }
+ Shader *getAttachedComputeShader() const { return mAttachedComputeShader; }
const std::vector<std::string> &getTransformFeedbackVaryingNames() const
{
return mTransformFeedbackVaryingNames;
@@ -314,9 +314,10 @@
void bindUniformLocation(GLuint index, const char *name);
// CHROMIUM_path_rendering
- BindingInfo getFragmentInputBindingInfo(GLint index) const;
+ BindingInfo getFragmentInputBindingInfo(const Context *context, GLint index) const;
void bindFragmentInputLocation(GLint index, const char *name);
- void pathFragmentInputGen(GLint index,
+ void pathFragmentInputGen(const Context *context,
+ GLint index,
GLenum genMode,
GLint components,
const GLfloat *coeffs);
@@ -491,7 +492,7 @@
void unlink();
void resetUniformBlockBindings();
- bool linkAttributes(const ContextState &data, InfoLog &infoLog);
+ bool linkAttributes(const Context *context, InfoLog &infoLog);
bool validateUniformBlocksCount(GLuint maxUniformBlocks,
const std::vector<sh::InterfaceBlock> &block,
const std::string &errorMessage,
@@ -501,10 +502,12 @@
const std::vector<sh::InterfaceBlock> &fragmentInterfaceBlocks,
InfoLog &infoLog,
bool webglCompatibility) const;
- bool linkUniformBlocks(InfoLog &infoLog, const Caps &caps, bool webglCompatibility);
- bool linkVaryings(InfoLog &infoLog) const;
+ bool linkUniformBlocks(const Context *context, InfoLog &infoLog);
+ bool linkVaryings(const Context *context, InfoLog &infoLog) const;
- bool linkUniforms(InfoLog &infoLog, const Caps &caps, const Bindings &uniformLocationBindings);
+ bool linkUniforms(const Context *context,
+ InfoLog &infoLog,
+ const Bindings &uniformLocationBindings);
void linkSamplerBindings();
bool areMatchingInterfaceBlocks(InfoLog &infoLog,
@@ -517,7 +520,7 @@
const sh::Varying &vertexVarying,
const sh::Varying &fragmentVarying,
int shaderVersion);
- bool linkValidateBuiltInVaryings(InfoLog &infoLog) const;
+ bool linkValidateBuiltInVaryings(const Context *context, InfoLog &infoLog) const;
bool linkValidateTransformFeedback(const gl::Context *context,
InfoLog &infoLog,
const MergedVaryings &linkedVaryings,
@@ -525,13 +528,13 @@
void gatherTransformFeedbackVaryings(const MergedVaryings &varyings);
- MergedVaryings getMergedVaryings() const;
+ MergedVaryings getMergedVaryings(const Context *context) const;
std::vector<PackedVarying> getPackedVaryings(const MergedVaryings &mergedVaryings) const;
- void linkOutputVariables();
+ void linkOutputVariables(const Context *context);
void setUniformValuesFromBindingQualifiers();
- void gatherInterfaceBlockInfo();
+ void gatherInterfaceBlockInfo(const Context *context);
template <typename VarT>
void defineUniformBlockMembers(const std::vector<VarT> &fields,
const std::string &prefix,