Implement ANGLE_program_cache_control extensions.

This will give the browsers the ability to control the cache size,
query and populate the contents, and trim cache contents on memory
pressure.

BUG=angleproject:1897

Change-Id: I6edaa7d307b890223db98792d5b074e4a7fdfaa4
Reviewed-on: https://chromium-review.googlesource.com/563606
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
diff --git a/src/libANGLE/State.cpp b/src/libANGLE/State.cpp
index 63f196c..2635c76 100644
--- a/src/libANGLE/State.cpp
+++ b/src/libANGLE/State.cpp
@@ -63,7 +63,8 @@
       mMultiSampling(false),
       mSampleAlphaToOne(false),
       mFramebufferSRGB(true),
-      mRobustResourceInit(false)
+      mRobustResourceInit(false),
+      mProgramBinaryCacheEnabled(false)
 {
 }
 
@@ -75,7 +76,8 @@
                        bool debug,
                        bool bindGeneratesResource,
                        bool clientArraysEnabled,
-                       bool robustResourceInit)
+                       bool robustResourceInit,
+                       bool programBinaryCacheEnabled)
 {
     const Caps &caps             = context->getCaps();
     const Extensions &extensions = context->getExtensions();
@@ -186,6 +188,7 @@
     mPathStencilMask = std::numeric_limits<GLuint>::max();
 
     mRobustResourceInit = robustResourceInit;
+    mProgramBinaryCacheEnabled = programBinaryCacheEnabled;
 }
 
 void State::reset(const Context *context)
@@ -687,7 +690,12 @@
           return getFramebufferSRGB();
       case GL_CONTEXT_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
           return mRobustResourceInit;
-      default:                               UNREACHABLE(); return false;
+      case GL_PROGRAM_CACHE_ENABLED_ANGLE:
+          return mProgramBinaryCacheEnabled;
+
+      default:
+          UNREACHABLE();
+          return false;
     }
 }
 
@@ -1666,6 +1674,10 @@
       case GL_CONTEXT_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
           *params = mRobustResourceInit ? GL_TRUE : GL_FALSE;
           break;
+      case GL_PROGRAM_CACHE_ENABLED_ANGLE:
+          *params = mProgramBinaryCacheEnabled ? GL_TRUE : GL_FALSE;
+          break;
+
       default:
         UNREACHABLE();
         break;