Support reloading the shader compiler
Trac #19900
Issue=291
- Move compiler initialization to a separate function
- all this function to ensure the compiler is loaded when a compile is attempted
(previously if the compiler was released, you'd have to create a new shader object
to get it reloaded).
Signed-off-by: Shannon Woods
Signed-off-by: Nicolas Capens
git-svn-id: https://angleproject.googlecode.com/svn/trunk@992 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/Shader.cpp b/src/libGLESv2/Shader.cpp
index 9b65301..6277e84 100644
--- a/src/libGLESv2/Shader.cpp
+++ b/src/libGLESv2/Shader.cpp
@@ -28,33 +28,7 @@
mInfoLog = NULL;
uncompile();
-
- // Perform a one-time initialization of the shader compiler (or after being destructed by releaseCompiler)
- if (!mFragmentCompiler)
- {
- int result = ShInitialize();
-
- if (result)
- {
- ShBuiltInResources resources;
- ShInitBuiltInResources(&resources);
- Context *context = getContext();
-
- resources.MaxVertexAttribs = MAX_VERTEX_ATTRIBS;
- resources.MaxVertexUniformVectors = MAX_VERTEX_UNIFORM_VECTORS;
- resources.MaxVaryingVectors = context->getMaximumVaryingVectors();
- resources.MaxVertexTextureImageUnits = context->getMaximumVertexTextureImageUnits();
- resources.MaxCombinedTextureImageUnits = context->getMaximumCombinedTextureImageUnits();
- resources.MaxTextureImageUnits = MAX_TEXTURE_IMAGE_UNITS;
- resources.MaxFragmentUniformVectors = context->getMaximumFragmentUniformVectors();
- resources.MaxDrawBuffers = MAX_DRAW_BUFFERS;
- resources.OES_standard_derivatives = 1;
- // resources.OES_EGL_image_external = getDisplay()->isD3d9ExDevice() ? 1 : 0; // TODO: commented out until the extension is actually supported.
-
- mFragmentCompiler = ShConstructCompiler(SH_FRAGMENT_SHADER, SH_GLES2_SPEC, SH_HLSL_OUTPUT, &resources);
- mVertexCompiler = ShConstructCompiler(SH_VERTEX_SHADER, SH_GLES2_SPEC, SH_HLSL_OUTPUT, &resources);
- }
- }
+ initializeCompiler();
mRefCount = 0;
mDeleteStatus = false;
@@ -246,6 +220,36 @@
mDeleteStatus = true;
}
+// Perform a one-time initialization of the shader compiler (or after being destructed by releaseCompiler)
+void Shader::initializeCompiler()
+{
+ if (!mFragmentCompiler)
+ {
+ int result = ShInitialize();
+
+ if (result)
+ {
+ ShBuiltInResources resources;
+ ShInitBuiltInResources(&resources);
+ Context *context = getContext();
+
+ resources.MaxVertexAttribs = MAX_VERTEX_ATTRIBS;
+ resources.MaxVertexUniformVectors = MAX_VERTEX_UNIFORM_VECTORS;
+ resources.MaxVaryingVectors = context->getMaximumVaryingVectors();
+ resources.MaxVertexTextureImageUnits = context->getMaximumVertexTextureImageUnits();
+ resources.MaxCombinedTextureImageUnits = context->getMaximumCombinedTextureImageUnits();
+ resources.MaxTextureImageUnits = MAX_TEXTURE_IMAGE_UNITS;
+ resources.MaxFragmentUniformVectors = context->getMaximumFragmentUniformVectors();
+ resources.MaxDrawBuffers = MAX_DRAW_BUFFERS;
+ resources.OES_standard_derivatives = 1;
+ // resources.OES_EGL_image_external = getDisplay()->isD3d9ExDevice() ? 1 : 0; // TODO: commented out until the extension is actually supported.
+
+ mFragmentCompiler = ShConstructCompiler(SH_FRAGMENT_SHADER, SH_GLES2_SPEC, SH_HLSL_OUTPUT, &resources);
+ mVertexCompiler = ShConstructCompiler(SH_VERTEX_SHADER, SH_GLES2_SPEC, SH_HLSL_OUTPUT, &resources);
+ }
+ }
+}
+
void Shader::releaseCompiler()
{
ShDestruct(mFragmentCompiler);
@@ -323,6 +327,9 @@
source = mSource;
}
+ // ensure the compiler is loaded
+ initializeCompiler();
+
int compileOptions = SH_OBJECT_CODE;
std::string sourcePath;
if (perfActive())