Index: gpu/command_buffer/service/memory_program_cache.cc |
diff --git a/gpu/command_buffer/service/memory_program_cache.cc b/gpu/command_buffer/service/memory_program_cache.cc |
index 410914db2b0d1941ee209ce27d7b5d721077aadc..b24cbd7e42f74149e8d804f9ad973b165c91a95b 100644 |
--- a/gpu/command_buffer/service/memory_program_cache.cc |
+++ b/gpu/command_buffer/service/memory_program_cache.cc |
@@ -200,6 +200,12 @@ void RunShaderCallback(const ShaderCacheCallback& callback, |
callback.Run(key, shader); |
} |
+bool ProgramBinaryExtensionsAvailable() { |
+ return gl::g_current_gl_driver && |
+ (gl::g_current_gl_driver->ext.b_GL_ARB_get_program_binary || |
+ gl::g_current_gl_driver->ext.b_GL_OES_get_program_binary); |
+} |
+ |
} // namespace |
MemoryProgramCache::MemoryProgramCache( |
@@ -229,6 +235,11 @@ ProgramCache::ProgramLoadResult MemoryProgramCache::LoadLinkedProgram( |
const std::vector<std::string>& transform_feedback_varyings, |
GLenum transform_feedback_buffer_mode, |
const ShaderCacheCallback& shader_callback) { |
+ if (!ProgramBinaryExtensionsAvailable()) { |
+ // Early exit if this context can't support program binaries |
+ return PROGRAM_LOAD_FAILURE; |
+ } |
+ |
char a_sha[kHashLength]; |
char b_sha[kHashLength]; |
DCHECK(shader_a && !shader_a->last_compiled_source().empty() && |
@@ -295,6 +306,10 @@ void MemoryProgramCache::SaveLinkedProgram( |
const std::vector<std::string>& transform_feedback_varyings, |
GLenum transform_feedback_buffer_mode, |
const ShaderCacheCallback& shader_callback) { |
+ if (!ProgramBinaryExtensionsAvailable()) { |
+ // Early exit if this context can't support program binaries |
+ return; |
+ } |
if (disable_program_caching_for_transform_feedback_ && |
!transform_feedback_varyings.empty()) { |
return; |