diff --git a/Test/310.frag b/Test/310.frag
index 0de75e86f089cbb78f90191d6bd87a44f5c642e8..3de390a908085c010b60285127c28d137f1c283f 100644
--- a/Test/310.frag
+++ b/Test/310.frag
@@ -341,3 +341,59 @@ void goodImageAtom()
     imageAtomicMax(badIm2Du, P, datu);      // ERROR, not an allowed layout() on the image
     imageAtomicExchange(badIm2Df, P, datf); // ERROR, not an allowed layout() on the image
 }
+
+sample in vec4 colorSampInBad;       // ERROR, reserved
+centroid out vec4 colorCentroidBad;  // ERROR
+flat out vec4 colorBadFlat;          // ERROR
+smooth out vec4 colorBadSmooth;      // ERROR
+noperspective out vec4 colorBadNo;   // ERROR
+flat centroid in vec2 colorfc;
+in float scalarIn;
+
+void badInterp()
+{
+    interpolateAtCentroid(colorfc);             // ERROR, need extension
+    interpolateAtSample(colorfc, 1);            // ERROR, need extension
+    interpolateAtOffset(colorfc, vec2(0.2));    // ERROR, need extension
+}
+
+#if defined GL_OES_shader_multisample_interpolation
+#extension GL_OES_shader_multisample_interpolation : enable
+#endif
+
+sample in vec4 colorSampIn;
+sample out vec4 colorSampleBad;     // ERROR
+flat sample in vec4 colorfsi;
+sample in vec3 sampInArray[4];
+
+void interp()
+{
+    float res;
+    vec2 res2;
+    vec3 res3;
+    vec4 res4;
+
+    res2 = interpolateAtCentroid(colorfc);
+    res4 = interpolateAtCentroid(colorSampIn);
+    res4 = interpolateAtCentroid(colorfsi);
+    res  = interpolateAtCentroid(scalarIn);
+    res3 = interpolateAtCentroid(sampInArray);         // ERROR
+    res3 = interpolateAtCentroid(sampInArray[2]);
+    res2 = interpolateAtCentroid(sampInArray[2].xy);   // ERROR
+
+    res3 = interpolateAtSample(sampInArray, 1);        // ERROR
+    res3 = interpolateAtSample(sampInArray[i], 0);
+    res2 = interpolateAtSample(sampInArray[2].xy, 2);  // ERROR
+    res  = interpolateAtSample(scalarIn, 1);
+
+    res3 = interpolateAtOffset(sampInArray, vec2(0.2));         // ERROR
+    res3 = interpolateAtOffset(sampInArray[2], vec2(0.2));
+    res2 = interpolateAtOffset(sampInArray[2].xy, vec2(0.2));   // ERROR, no swizzle
+    res  = interpolateAtOffset(scalarIn + scalarIn, vec2(0.2)); // ERROR, no binary ops other than dereference
+    res  = interpolateAtOffset(scalarIn, vec2(0.2));
+
+    float f;
+    res  = interpolateAtCentroid(f);           // ERROR, not interpolant
+    res4 = interpolateAtSample(outp, 0);       // ERROR, not interpolant
+}
+
diff --git a/Test/310.vert b/Test/310.vert
index ae0fe3a27282b9fba91ba6b6945e99fe188b8e24..3ea0e6d9298f7ee2bdb7585be8b6471227ebf5e2 100644
--- a/Test/310.vert
+++ b/Test/310.vert
@@ -373,3 +373,19 @@ void goodImageAtom()
     imageAtomicCompSwap(im2Di, P,  3, dati);
     imageAtomicCompSwap(im2Du, P, 5u, datu);
 }
+
+sample out vec4 colorSampInBad;       // ERROR, reserved
+
+#extension GL_OES_shader_multisample_interpolation : enable
+
+sample out vec4 colorSample;
+flat sample out vec4 colorfsi;
+sample out vec3 sampInArray[4];
+in vec4 inv4;
+
+void badInterp()
+{
+    interpolateAtCentroid(inv4);             // ERROR, wrong stage
+    interpolateAtSample(inv4, 1);            // ERROR, need extension
+    interpolateAtOffset(inv4, vec2(0.2));    // ERROR, need extension
+}
diff --git a/Test/400.frag b/Test/400.frag
index f8ca8f526ed79110ae35c5ebf9641d6f07896784..bda588ad31145ebd7cd1534b6def4dfcde87e9b4 100644
--- a/Test/400.frag
+++ b/Test/400.frag
@@ -99,3 +99,43 @@ void foodc2()
     d = packDouble2x32(u2);
     u2 = unpackDouble2x32(d);
 }
+
+sample in vec4 colorSampIn;
+sample out vec4 colorSampleBad;     // ERROR
+noperspective in vec4 colorfsi;
+sample in vec3 sampInArray[4];
+smooth in float scalarIn;
+flat centroid in vec2 colorfc;
+
+struct S {
+    float x;
+};
+
+in S s1;
+sample S s2;
+
+void interp()
+{
+    interpolateAtCentroid(colorfc);
+    interpolateAtCentroid(colorSampIn);
+    interpolateAtCentroid(colorfsi);
+    interpolateAtCentroid(scalarIn);
+    interpolateAtCentroid(sampInArray);         // ERROR
+    interpolateAtCentroid(sampInArray[2]);
+    interpolateAtCentroid(sampInArray[2].xy);   // ERROR
+
+    interpolateAtSample(sampInArray, 1);        // ERROR
+    interpolateAtSample(sampInArray[i], 0);
+    interpolateAtSample(s1.x, 2);               // ERROR
+    interpolateAtSample(scalarIn, 1);
+
+    interpolateAtOffset(sampInArray, vec2(0.2));         // ERROR
+    interpolateAtOffset(sampInArray[2], vec2(0.2));
+    interpolateAtOffset(sampInArray[2].xy, vec2(0.2));   // ERROR, no swizzle
+    interpolateAtOffset(scalarIn + scalarIn, vec2(0.2)); // ERROR, no binary ops other than dereference
+    interpolateAtOffset(s2.x, vec2(0.2));      // ERROR
+
+    float f;
+    interpolateAtCentroid(f);           // ERROR, not interpolant
+    interpolateAtSample(outp, 0);       // ERROR, not interpolant
+}
\ No newline at end of file
diff --git a/Test/440.frag b/Test/440.frag
index ef1808fac2efeb1e78bfcb736b5f2bed0e21d73f..3a20dabc1fadf04bc47b4d7363a20e83c23a97a8 100644
--- a/Test/440.frag
+++ b/Test/440.frag
@@ -138,3 +138,10 @@ layout(std430, align = 128) uniform block24301 {
 
 int aconst[gl_MaxTransformFeedbackBuffers];
 int bconst[gl_MaxTransformFeedbackInterleavedComponents];
+
+sample in vec3 sampInArray[4];
+
+void interp()
+{
+    interpolateAtCentroid(sampInArray[2].xy);
+}
diff --git a/Test/baseResults/310.frag.out b/Test/baseResults/310.frag.out
index 36c94dbf5aef270afb4822fc3449a483cd0ca461..40e0e2d48c176d10903e55e145118cda82a06141 100644
--- a/Test/baseResults/310.frag.out
+++ b/Test/baseResults/310.frag.out
@@ -98,7 +98,30 @@ ERROR: 0:314: 'rgba16i' : format requires readonly or writeonly memory qualifier
 ERROR: 0:340: 'imageAtomicMax' : only supported on image with format r32i or r32ui 
 ERROR: 0:341: 'imageAtomicMax' : only supported on image with format r32i or r32ui 
 ERROR: 0:342: 'imageAtomicExchange' : only supported on image with format r32f 
-ERROR: 90 compilation errors.  No code generated.
+ERROR: 0:345: 'sample' : Reserved word. 
+ERROR: 0:346: 'centroid/sample/patch' : can't use auxiliary qualifier on a fragment output 
+ERROR: 0:347: 'flat/smooth/noperspective' : can't use interpolation qualifier on a fragment output 
+ERROR: 0:348: 'flat/smooth/noperspective' : can't use interpolation qualifier on a fragment output 
+ERROR: 0:349: 'noperspective' : Reserved word. 
+ERROR: 0:349: 'noperspective' : not supported with this profile: es
+ERROR: 0:349: 'flat/smooth/noperspective' : can't use interpolation qualifier on a fragment output 
+ERROR: 0:355: 'interpolateAtCentroid' : required extension not requested: GL_OES_shader_multisample_interpolation
+ERROR: 0:356: 'interpolateAtSample' : required extension not requested: GL_OES_shader_multisample_interpolation
+ERROR: 0:357: 'interpolateAtOffset' : required extension not requested: GL_OES_shader_multisample_interpolation
+ERROR: 0:365: 'centroid/sample/patch' : can't use auxiliary qualifier on a fragment output 
+ERROR: 0:380: 'interpolateAtCentroid' : no matching overloaded function found 
+ERROR: 0:380: 'assign' :  cannot convert from 'const float' to 'temp mediump 3-component vector of float'
+ERROR: 0:382: 'interpolateAtCentroid' : first argument must be an interpolant, or interpolant-array element 
+ERROR: 0:384: 'interpolateAtSample' : no matching overloaded function found 
+ERROR: 0:384: 'assign' :  cannot convert from 'const float' to 'temp mediump 3-component vector of float'
+ERROR: 0:386: 'interpolateAtSample' : first argument must be an interpolant, or interpolant-array element 
+ERROR: 0:389: 'interpolateAtOffset' : no matching overloaded function found 
+ERROR: 0:389: 'assign' :  cannot convert from 'const float' to 'temp mediump 3-component vector of float'
+ERROR: 0:391: 'interpolateAtOffset' : first argument must be an interpolant, or interpolant-array element 
+ERROR: 0:392: 'interpolateAtOffset' : first argument must be an interpolant, or interpolant-array element 
+ERROR: 0:396: 'interpolateAtCentroid' : first argument must be an interpolant, or interpolant-array element 
+ERROR: 0:397: 'interpolateAtSample' : first argument must be an interpolant, or interpolant-array element 
+ERROR: 113 compilation errors.  No code generated.
 
 
 Shader version: 310
@@ -109,6 +132,7 @@ Requested GL_OES_gpu_shader5
 Requested GL_OES_sample_variables
 Requested GL_OES_shader_image_atomic
 Requested GL_OES_shader_io_blocks
+Requested GL_OES_shader_multisample_interpolation
 gl_FragCoord pixel center is integer
 gl_FragCoord origin is upper left
 using early_fragment_tests
@@ -736,6 +760,143 @@ ERROR: node is still EOpNull!
 0:342        'badIm2Df' (layout(rgba32f ) uniform highp image2D)
 0:342        'P' (uniform mediump 2-component vector of int)
 0:342        'datf' (temp mediump float)
+0:353  Function Definition: badInterp( (global void)
+0:353    Function Parameters: 
+0:355    Sequence
+0:355      interpolateAtCentroid (global mediump 2-component vector of float)
+0:355        'colorfc' (centroid flat in mediump 2-component vector of float)
+0:356      interpolateAtSample (global mediump 2-component vector of float)
+0:356        'colorfc' (centroid flat in mediump 2-component vector of float)
+0:356        Constant:
+0:356          1 (const int)
+0:357      interpolateAtOffset (global mediump 2-component vector of float)
+0:357        'colorfc' (centroid flat in mediump 2-component vector of float)
+0:357        Constant:
+0:357          0.200000
+0:357          0.200000
+0:369  Function Definition: interp( (global void)
+0:369    Function Parameters: 
+0:?     Sequence
+0:376      move second child to first child (temp mediump 2-component vector of float)
+0:376        'res2' (temp mediump 2-component vector of float)
+0:376        interpolateAtCentroid (global mediump 2-component vector of float)
+0:376          'colorfc' (centroid flat in mediump 2-component vector of float)
+0:377      move second child to first child (temp mediump 4-component vector of float)
+0:377        'res4' (temp mediump 4-component vector of float)
+0:377        interpolateAtCentroid (global mediump 4-component vector of float)
+0:377          'colorSampIn' (smooth sample in mediump 4-component vector of float)
+0:378      move second child to first child (temp mediump 4-component vector of float)
+0:378        'res4' (temp mediump 4-component vector of float)
+0:378        interpolateAtCentroid (global mediump 4-component vector of float)
+0:378          'colorfsi' (flat sample in mediump 4-component vector of float)
+0:379      move second child to first child (temp mediump float)
+0:379        'res' (temp mediump float)
+0:379        interpolateAtCentroid (global mediump float)
+0:379          'scalarIn' (smooth in mediump float)
+0:380      'res3' (temp mediump 3-component vector of float)
+0:381      move second child to first child (temp mediump 3-component vector of float)
+0:381        'res3' (temp mediump 3-component vector of float)
+0:381        interpolateAtCentroid (global mediump 3-component vector of float)
+0:381          direct index (smooth sample temp mediump 3-component vector of float)
+0:381            'sampInArray' (smooth sample in 4-element array of mediump 3-component vector of float)
+0:381            Constant:
+0:381              2 (const int)
+0:382      move second child to first child (temp mediump 2-component vector of float)
+0:382        'res2' (temp mediump 2-component vector of float)
+0:382        interpolateAtCentroid (global mediump 2-component vector of float)
+0:382          vector swizzle (temp mediump 2-component vector of float)
+0:382            direct index (smooth sample temp mediump 3-component vector of float)
+0:382              'sampInArray' (smooth sample in 4-element array of mediump 3-component vector of float)
+0:382              Constant:
+0:382                2 (const int)
+0:382            Sequence
+0:382              Constant:
+0:382                0 (const int)
+0:382              Constant:
+0:382                1 (const int)
+0:384      'res3' (temp mediump 3-component vector of float)
+0:385      move second child to first child (temp mediump 3-component vector of float)
+0:385        'res3' (temp mediump 3-component vector of float)
+0:385        interpolateAtSample (global mediump 3-component vector of float)
+0:385          indirect index (smooth sample temp mediump 3-component vector of float)
+0:385            'sampInArray' (smooth sample in 4-element array of mediump 3-component vector of float)
+0:385            'i' (uniform mediump int)
+0:385          Constant:
+0:385            0 (const int)
+0:386      move second child to first child (temp mediump 2-component vector of float)
+0:386        'res2' (temp mediump 2-component vector of float)
+0:386        interpolateAtSample (global mediump 2-component vector of float)
+0:386          vector swizzle (temp mediump 2-component vector of float)
+0:386            direct index (smooth sample temp mediump 3-component vector of float)
+0:386              'sampInArray' (smooth sample in 4-element array of mediump 3-component vector of float)
+0:386              Constant:
+0:386                2 (const int)
+0:386            Sequence
+0:386              Constant:
+0:386                0 (const int)
+0:386              Constant:
+0:386                1 (const int)
+0:386          Constant:
+0:386            2 (const int)
+0:387      move second child to first child (temp mediump float)
+0:387        'res' (temp mediump float)
+0:387        interpolateAtSample (global mediump float)
+0:387          'scalarIn' (smooth in mediump float)
+0:387          Constant:
+0:387            1 (const int)
+0:389      'res3' (temp mediump 3-component vector of float)
+0:390      move second child to first child (temp mediump 3-component vector of float)
+0:390        'res3' (temp mediump 3-component vector of float)
+0:390        interpolateAtOffset (global mediump 3-component vector of float)
+0:390          direct index (smooth sample temp mediump 3-component vector of float)
+0:390            'sampInArray' (smooth sample in 4-element array of mediump 3-component vector of float)
+0:390            Constant:
+0:390              2 (const int)
+0:390          Constant:
+0:390            0.200000
+0:390            0.200000
+0:391      move second child to first child (temp mediump 2-component vector of float)
+0:391        'res2' (temp mediump 2-component vector of float)
+0:391        interpolateAtOffset (global mediump 2-component vector of float)
+0:391          vector swizzle (temp mediump 2-component vector of float)
+0:391            direct index (smooth sample temp mediump 3-component vector of float)
+0:391              'sampInArray' (smooth sample in 4-element array of mediump 3-component vector of float)
+0:391              Constant:
+0:391                2 (const int)
+0:391            Sequence
+0:391              Constant:
+0:391                0 (const int)
+0:391              Constant:
+0:391                1 (const int)
+0:391          Constant:
+0:391            0.200000
+0:391            0.200000
+0:392      move second child to first child (temp mediump float)
+0:392        'res' (temp mediump float)
+0:392        interpolateAtOffset (global mediump float)
+0:392          add (temp mediump float)
+0:392            'scalarIn' (smooth in mediump float)
+0:392            'scalarIn' (smooth in mediump float)
+0:392          Constant:
+0:392            0.200000
+0:392            0.200000
+0:393      move second child to first child (temp mediump float)
+0:393        'res' (temp mediump float)
+0:393        interpolateAtOffset (global mediump float)
+0:393          'scalarIn' (smooth in mediump float)
+0:393          Constant:
+0:393            0.200000
+0:393            0.200000
+0:396      move second child to first child (temp mediump float)
+0:396        'res' (temp mediump float)
+0:396        interpolateAtCentroid (global mediump float)
+0:396          'f' (temp mediump float)
+0:397      move second child to first child (temp mediump 4-component vector of float)
+0:397        'res4' (temp mediump 4-component vector of float)
+0:397        interpolateAtSample (global mediump 4-component vector of float)
+0:397          'outp' (out mediump 4-component vector of float)
+0:397          Constant:
+0:397            0 (const int)
 0:?   Linker Objects
 0:?     'gl_FragCoord' (smooth in mediump 4-component vector of float)
 0:?     'v3' (layout(location=2 ) smooth in mediump 3-component vector of float)
@@ -818,6 +979,17 @@ ERROR: node is still EOpNull!
 0:?     'badIm2Df' (layout(rgba32f ) uniform highp image2D)
 0:?     'badIm2Du' (layout(rgba8ui ) uniform highp uimage2D)
 0:?     'badIm2Di' (layout(rgba16i ) uniform highp iimage2D)
+0:?     'colorSampInBad' (smooth sample in mediump 4-component vector of float)
+0:?     'colorCentroidBad' (centroid out mediump 4-component vector of float)
+0:?     'colorBadFlat' (flat out mediump 4-component vector of float)
+0:?     'colorBadSmooth' (smooth out mediump 4-component vector of float)
+0:?     'colorBadNo' (noperspective out mediump 4-component vector of float)
+0:?     'colorfc' (centroid flat in mediump 2-component vector of float)
+0:?     'scalarIn' (smooth in mediump float)
+0:?     'colorSampIn' (smooth sample in mediump 4-component vector of float)
+0:?     'colorSampleBad' (sample out mediump 4-component vector of float)
+0:?     'colorfsi' (flat sample in mediump 4-component vector of float)
+0:?     'sampInArray' (smooth sample in 4-element array of mediump 3-component vector of float)
 
 
 Linked fragment stage:
@@ -832,6 +1004,7 @@ Requested GL_OES_gpu_shader5
 Requested GL_OES_sample_variables
 Requested GL_OES_shader_image_atomic
 Requested GL_OES_shader_io_blocks
+Requested GL_OES_shader_multisample_interpolation
 gl_FragCoord pixel center is integer
 gl_FragCoord origin is upper left
 using early_fragment_tests
@@ -1459,6 +1632,143 @@ ERROR: node is still EOpNull!
 0:342        'badIm2Df' (layout(rgba32f ) uniform highp image2D)
 0:342        'P' (uniform mediump 2-component vector of int)
 0:342        'datf' (temp mediump float)
+0:353  Function Definition: badInterp( (global void)
+0:353    Function Parameters: 
+0:355    Sequence
+0:355      interpolateAtCentroid (global mediump 2-component vector of float)
+0:355        'colorfc' (centroid flat in mediump 2-component vector of float)
+0:356      interpolateAtSample (global mediump 2-component vector of float)
+0:356        'colorfc' (centroid flat in mediump 2-component vector of float)
+0:356        Constant:
+0:356          1 (const int)
+0:357      interpolateAtOffset (global mediump 2-component vector of float)
+0:357        'colorfc' (centroid flat in mediump 2-component vector of float)
+0:357        Constant:
+0:357          0.200000
+0:357          0.200000
+0:369  Function Definition: interp( (global void)
+0:369    Function Parameters: 
+0:?     Sequence
+0:376      move second child to first child (temp mediump 2-component vector of float)
+0:376        'res2' (temp mediump 2-component vector of float)
+0:376        interpolateAtCentroid (global mediump 2-component vector of float)
+0:376          'colorfc' (centroid flat in mediump 2-component vector of float)
+0:377      move second child to first child (temp mediump 4-component vector of float)
+0:377        'res4' (temp mediump 4-component vector of float)
+0:377        interpolateAtCentroid (global mediump 4-component vector of float)
+0:377          'colorSampIn' (smooth sample in mediump 4-component vector of float)
+0:378      move second child to first child (temp mediump 4-component vector of float)
+0:378        'res4' (temp mediump 4-component vector of float)
+0:378        interpolateAtCentroid (global mediump 4-component vector of float)
+0:378          'colorfsi' (flat sample in mediump 4-component vector of float)
+0:379      move second child to first child (temp mediump float)
+0:379        'res' (temp mediump float)
+0:379        interpolateAtCentroid (global mediump float)
+0:379          'scalarIn' (smooth in mediump float)
+0:380      'res3' (temp mediump 3-component vector of float)
+0:381      move second child to first child (temp mediump 3-component vector of float)
+0:381        'res3' (temp mediump 3-component vector of float)
+0:381        interpolateAtCentroid (global mediump 3-component vector of float)
+0:381          direct index (smooth sample temp mediump 3-component vector of float)
+0:381            'sampInArray' (smooth sample in 4-element array of mediump 3-component vector of float)
+0:381            Constant:
+0:381              2 (const int)
+0:382      move second child to first child (temp mediump 2-component vector of float)
+0:382        'res2' (temp mediump 2-component vector of float)
+0:382        interpolateAtCentroid (global mediump 2-component vector of float)
+0:382          vector swizzle (temp mediump 2-component vector of float)
+0:382            direct index (smooth sample temp mediump 3-component vector of float)
+0:382              'sampInArray' (smooth sample in 4-element array of mediump 3-component vector of float)
+0:382              Constant:
+0:382                2 (const int)
+0:382            Sequence
+0:382              Constant:
+0:382                0 (const int)
+0:382              Constant:
+0:382                1 (const int)
+0:384      'res3' (temp mediump 3-component vector of float)
+0:385      move second child to first child (temp mediump 3-component vector of float)
+0:385        'res3' (temp mediump 3-component vector of float)
+0:385        interpolateAtSample (global mediump 3-component vector of float)
+0:385          indirect index (smooth sample temp mediump 3-component vector of float)
+0:385            'sampInArray' (smooth sample in 4-element array of mediump 3-component vector of float)
+0:385            'i' (uniform mediump int)
+0:385          Constant:
+0:385            0 (const int)
+0:386      move second child to first child (temp mediump 2-component vector of float)
+0:386        'res2' (temp mediump 2-component vector of float)
+0:386        interpolateAtSample (global mediump 2-component vector of float)
+0:386          vector swizzle (temp mediump 2-component vector of float)
+0:386            direct index (smooth sample temp mediump 3-component vector of float)
+0:386              'sampInArray' (smooth sample in 4-element array of mediump 3-component vector of float)
+0:386              Constant:
+0:386                2 (const int)
+0:386            Sequence
+0:386              Constant:
+0:386                0 (const int)
+0:386              Constant:
+0:386                1 (const int)
+0:386          Constant:
+0:386            2 (const int)
+0:387      move second child to first child (temp mediump float)
+0:387        'res' (temp mediump float)
+0:387        interpolateAtSample (global mediump float)
+0:387          'scalarIn' (smooth in mediump float)
+0:387          Constant:
+0:387            1 (const int)
+0:389      'res3' (temp mediump 3-component vector of float)
+0:390      move second child to first child (temp mediump 3-component vector of float)
+0:390        'res3' (temp mediump 3-component vector of float)
+0:390        interpolateAtOffset (global mediump 3-component vector of float)
+0:390          direct index (smooth sample temp mediump 3-component vector of float)
+0:390            'sampInArray' (smooth sample in 4-element array of mediump 3-component vector of float)
+0:390            Constant:
+0:390              2 (const int)
+0:390          Constant:
+0:390            0.200000
+0:390            0.200000
+0:391      move second child to first child (temp mediump 2-component vector of float)
+0:391        'res2' (temp mediump 2-component vector of float)
+0:391        interpolateAtOffset (global mediump 2-component vector of float)
+0:391          vector swizzle (temp mediump 2-component vector of float)
+0:391            direct index (smooth sample temp mediump 3-component vector of float)
+0:391              'sampInArray' (smooth sample in 4-element array of mediump 3-component vector of float)
+0:391              Constant:
+0:391                2 (const int)
+0:391            Sequence
+0:391              Constant:
+0:391                0 (const int)
+0:391              Constant:
+0:391                1 (const int)
+0:391          Constant:
+0:391            0.200000
+0:391            0.200000
+0:392      move second child to first child (temp mediump float)
+0:392        'res' (temp mediump float)
+0:392        interpolateAtOffset (global mediump float)
+0:392          add (temp mediump float)
+0:392            'scalarIn' (smooth in mediump float)
+0:392            'scalarIn' (smooth in mediump float)
+0:392          Constant:
+0:392            0.200000
+0:392            0.200000
+0:393      move second child to first child (temp mediump float)
+0:393        'res' (temp mediump float)
+0:393        interpolateAtOffset (global mediump float)
+0:393          'scalarIn' (smooth in mediump float)
+0:393          Constant:
+0:393            0.200000
+0:393            0.200000
+0:396      move second child to first child (temp mediump float)
+0:396        'res' (temp mediump float)
+0:396        interpolateAtCentroid (global mediump float)
+0:396          'f' (temp mediump float)
+0:397      move second child to first child (temp mediump 4-component vector of float)
+0:397        'res4' (temp mediump 4-component vector of float)
+0:397        interpolateAtSample (global mediump 4-component vector of float)
+0:397          'outp' (out mediump 4-component vector of float)
+0:397          Constant:
+0:397            0 (const int)
 0:?   Linker Objects
 0:?     'gl_FragCoord' (smooth in mediump 4-component vector of float)
 0:?     'v3' (layout(location=2 ) smooth in mediump 3-component vector of float)
@@ -1541,4 +1851,15 @@ ERROR: node is still EOpNull!
 0:?     'badIm2Df' (layout(rgba32f ) uniform highp image2D)
 0:?     'badIm2Du' (layout(rgba8ui ) uniform highp uimage2D)
 0:?     'badIm2Di' (layout(rgba16i ) uniform highp iimage2D)
+0:?     'colorSampInBad' (smooth sample in mediump 4-component vector of float)
+0:?     'colorCentroidBad' (centroid out mediump 4-component vector of float)
+0:?     'colorBadFlat' (flat out mediump 4-component vector of float)
+0:?     'colorBadSmooth' (smooth out mediump 4-component vector of float)
+0:?     'colorBadNo' (noperspective out mediump 4-component vector of float)
+0:?     'colorfc' (centroid flat in mediump 2-component vector of float)
+0:?     'scalarIn' (smooth in mediump float)
+0:?     'colorSampIn' (smooth sample in mediump 4-component vector of float)
+0:?     'colorSampleBad' (sample out mediump 4-component vector of float)
+0:?     'colorfsi' (flat sample in mediump 4-component vector of float)
+0:?     'sampInArray' (smooth sample in 4-element array of mediump 3-component vector of float)
 
diff --git a/Test/baseResults/310.vert.out b/Test/baseResults/310.vert.out
index ecd6fd14dba10feb4a15f223952b7cf97bac84b0..3833d754c8240a5bd7da060d50f7d285174036b0 100644
--- a/Test/baseResults/310.vert.out
+++ b/Test/baseResults/310.vert.out
@@ -90,7 +90,11 @@ ERROR: 0:318: 'sampler/image' : type requires declaration of default precision q
 ERROR: 0:319: 'sampler/image' : type requires declaration of default precision qualifier 
 ERROR: 0:339: 'textureSize' : no matching overloaded function found 
 ERROR: 0:339: '=' :  cannot convert from 'const float' to 'temp highp 3-component vector of int'
-ERROR: 86 compilation errors.  No code generated.
+ERROR: 0:377: 'sample' : Reserved word. 
+ERROR: 0:388: 'interpolateAtCentroid' : no matching overloaded function found 
+ERROR: 0:389: 'interpolateAtSample' : no matching overloaded function found 
+ERROR: 0:390: 'interpolateAtOffset' : no matching overloaded function found 
+ERROR: 90 compilation errors.  No code generated.
 
 
 Shader version: 310
@@ -98,6 +102,7 @@ Requested GL_EXT_texture_buffer
 Requested GL_OES_gpu_shader5
 Requested GL_OES_shader_image_atomic
 Requested GL_OES_shader_io_blocks
+Requested GL_OES_shader_multisample_interpolation
 Requested GL_OES_texture_buffer
 Requested GL_OES_texture_cube_map_array
 Requested GL_OES_texture_storage_multisample_2d_array
@@ -852,6 +857,15 @@ ERROR: node is still EOpNull!
 0:374        Constant:
 0:374          5 (const uint)
 0:374        'datu' (temp highp uint)
+0:386  Function Definition: badInterp( (global void)
+0:386    Function Parameters: 
+0:388    Sequence
+0:388      Constant:
+0:388        0.000000
+0:389      Constant:
+0:389        0.000000
+0:390      Constant:
+0:390        0.000000
 0:?   Linker Objects
 0:?     's' (shared highp 4-component vector of float)
 0:?     'v' (buffer highp 4-component vector of float)
@@ -953,6 +967,11 @@ ERROR: node is still EOpNull!
 0:?     'im2Du' (layout(r32ui ) uniform highp uimage2D)
 0:?     'im2Di' (layout(r32i ) uniform highp iimage2D)
 0:?     'P' (uniform highp 2-component vector of int)
+0:?     'colorSampInBad' (smooth sample out highp 4-component vector of float)
+0:?     'colorSample' (smooth sample out highp 4-component vector of float)
+0:?     'colorfsi' (flat sample out highp 4-component vector of float)
+0:?     'sampInArray' (smooth sample out 4-element array of highp 3-component vector of float)
+0:?     'inv4' (in highp 4-component vector of float)
 0:?     'gl_VertexID' (gl_VertexId highp int VertexId)
 0:?     'gl_InstanceID' (gl_InstanceId highp int InstanceId)
 
@@ -965,6 +984,7 @@ Requested GL_EXT_texture_buffer
 Requested GL_OES_gpu_shader5
 Requested GL_OES_shader_image_atomic
 Requested GL_OES_shader_io_blocks
+Requested GL_OES_shader_multisample_interpolation
 Requested GL_OES_texture_buffer
 Requested GL_OES_texture_cube_map_array
 Requested GL_OES_texture_storage_multisample_2d_array
@@ -1719,6 +1739,15 @@ ERROR: node is still EOpNull!
 0:374        Constant:
 0:374          5 (const uint)
 0:374        'datu' (temp highp uint)
+0:386  Function Definition: badInterp( (global void)
+0:386    Function Parameters: 
+0:388    Sequence
+0:388      Constant:
+0:388        0.000000
+0:389      Constant:
+0:389        0.000000
+0:390      Constant:
+0:390        0.000000
 0:?   Linker Objects
 0:?     's' (shared highp 4-component vector of float)
 0:?     'v' (buffer highp 4-component vector of float)
@@ -1820,6 +1849,11 @@ ERROR: node is still EOpNull!
 0:?     'im2Du' (layout(r32ui ) uniform highp uimage2D)
 0:?     'im2Di' (layout(r32i ) uniform highp iimage2D)
 0:?     'P' (uniform highp 2-component vector of int)
+0:?     'colorSampInBad' (smooth sample out highp 4-component vector of float)
+0:?     'colorSample' (smooth sample out highp 4-component vector of float)
+0:?     'colorfsi' (flat sample out highp 4-component vector of float)
+0:?     'sampInArray' (smooth sample out 4-element array of highp 3-component vector of float)
+0:?     'inv4' (in highp 4-component vector of float)
 0:?     'gl_VertexID' (gl_VertexId highp int VertexId)
 0:?     'gl_InstanceID' (gl_InstanceId highp int InstanceId)
 
diff --git a/Test/baseResults/400.frag.out b/Test/baseResults/400.frag.out
index 7f1572875ae300991649181967a5e461aba0ce6b..5ecb9082499f53157885d9e6ac093ef70d09f187 100644
--- a/Test/baseResults/400.frag.out
+++ b/Test/baseResults/400.frag.out
@@ -15,11 +15,22 @@ ERROR: 0:54: 'texel offset' : value is out of range: [gl_MinProgramTexelOffset,
 ERROR: 0:54: 'texel offset' : value is out of range: [gl_MinProgramTexelOffset, gl_MaxProgramTexelOffset]
 ERROR: 0:57: 'patch' : not supported in this stage: fragment
 ERROR: 0:58: 'patch' : not supported in this stage: fragment
+ERROR: 0:58: 'centroid/sample/patch' : can't use auxiliary qualifier on a fragment output 
 ERROR: 0:73: 'dFdxFine' : required extension not requested: GL_ARB_derivative_control
 ERROR: 0:74: 'dFdyCoarse' : required extension not requested: GL_ARB_derivative_control
 ERROR: 0:75: 'fwidthCoarse' : required extension not requested: GL_ARB_derivative_control
 ERROR: 0:75: 'fwidthFine' : required extension not requested: GL_ARB_derivative_control
-ERROR: 19 compilation errors.  No code generated.
+ERROR: 0:104: 'centroid/sample/patch' : can't use auxiliary qualifier on a fragment output 
+ERROR: 0:123: 'interpolateAtCentroid' : no matching overloaded function found 
+ERROR: 0:125: 'interpolateAtCentroid' : first argument must be an interpolant, or interpolant-array element 
+ERROR: 0:127: 'interpolateAtSample' : no matching overloaded function found 
+ERROR: 0:132: 'interpolateAtOffset' : no matching overloaded function found 
+ERROR: 0:134: 'interpolateAtOffset' : first argument must be an interpolant, or interpolant-array element 
+ERROR: 0:135: 'interpolateAtOffset' : first argument must be an interpolant, or interpolant-array element 
+ERROR: 0:136: 'interpolateAtOffset' : first argument must be an interpolant, or interpolant-array element 
+ERROR: 0:139: 'interpolateAtCentroid' : first argument must be an interpolant, or interpolant-array element 
+ERROR: 0:140: 'interpolateAtSample' : first argument must be an interpolant, or interpolant-array element 
+ERROR: 30 compilation errors.  No code generated.
 
 
 Shader version: 400
@@ -298,6 +309,99 @@ ERROR: node is still EOpNull!
 0:100        'u2' (temp 2-component vector of uint)
 0:100        UnpackUnorm4x8 (global 2-component vector of uint)
 0:100          'd' (temp double)
+0:117  Function Definition: interp( (global void)
+0:117    Function Parameters: 
+0:119    Sequence
+0:119      interpolateAtCentroid (global 2-component vector of float)
+0:119        'colorfc' (centroid flat in 2-component vector of float)
+0:120      interpolateAtCentroid (global 4-component vector of float)
+0:120        'colorSampIn' (smooth sample in 4-component vector of float)
+0:121      interpolateAtCentroid (global 4-component vector of float)
+0:121        'colorfsi' (noperspective in 4-component vector of float)
+0:122      interpolateAtCentroid (global float)
+0:122        'scalarIn' (smooth in float)
+0:123      Constant:
+0:123        0.000000
+0:124      interpolateAtCentroid (global 3-component vector of float)
+0:124        direct index (smooth sample temp 3-component vector of float)
+0:124          'sampInArray' (smooth sample in 4-element array of 3-component vector of float)
+0:124          Constant:
+0:124            2 (const int)
+0:125      interpolateAtCentroid (global 2-component vector of float)
+0:125        vector swizzle (temp 2-component vector of float)
+0:125          direct index (smooth sample temp 3-component vector of float)
+0:125            'sampInArray' (smooth sample in 4-element array of 3-component vector of float)
+0:125            Constant:
+0:125              2 (const int)
+0:125          Sequence
+0:125            Constant:
+0:125              0 (const int)
+0:125            Constant:
+0:125              1 (const int)
+0:127      Constant:
+0:127        0.000000
+0:128      interpolateAtSample (global 3-component vector of float)
+0:128        indirect index (smooth sample temp 3-component vector of float)
+0:128          'sampInArray' (smooth sample in 4-element array of 3-component vector of float)
+0:128          'i' (flat in int)
+0:128        Constant:
+0:128          0 (const int)
+0:129      interpolateAtSample (global float)
+0:129        x: direct index for structure (global float)
+0:129          's1' (smooth in structure{global float x})
+0:129          Constant:
+0:129            0 (const int)
+0:129        Constant:
+0:129          2 (const int)
+0:130      interpolateAtSample (global float)
+0:130        'scalarIn' (smooth in float)
+0:130        Constant:
+0:130          1 (const int)
+0:132      Constant:
+0:132        0.000000
+0:133      interpolateAtOffset (global 3-component vector of float)
+0:133        direct index (smooth sample temp 3-component vector of float)
+0:133          'sampInArray' (smooth sample in 4-element array of 3-component vector of float)
+0:133          Constant:
+0:133            2 (const int)
+0:133        Constant:
+0:133          0.200000
+0:133          0.200000
+0:134      interpolateAtOffset (global 2-component vector of float)
+0:134        vector swizzle (temp 2-component vector of float)
+0:134          direct index (smooth sample temp 3-component vector of float)
+0:134            'sampInArray' (smooth sample in 4-element array of 3-component vector of float)
+0:134            Constant:
+0:134              2 (const int)
+0:134          Sequence
+0:134            Constant:
+0:134              0 (const int)
+0:134            Constant:
+0:134              1 (const int)
+0:134        Constant:
+0:134          0.200000
+0:134          0.200000
+0:135      interpolateAtOffset (global float)
+0:135        add (temp float)
+0:135          'scalarIn' (smooth in float)
+0:135          'scalarIn' (smooth in float)
+0:135        Constant:
+0:135          0.200000
+0:135          0.200000
+0:136      interpolateAtOffset (global float)
+0:136        x: direct index for structure (global float)
+0:136          's2' (sample temp structure{global float x})
+0:136          Constant:
+0:136            0 (const int)
+0:136        Constant:
+0:136          0.200000
+0:136          0.200000
+0:139      interpolateAtCentroid (global float)
+0:139        'f' (temp float)
+0:140      interpolateAtSample (global 4-component vector of float)
+0:140        'outp' (out 4-component vector of float)
+0:140        Constant:
+0:140          0 (const int)
 0:?   Linker Objects
 0:?     'c2D' (smooth in 2-component vector of float)
 0:?     'i' (flat in int)
@@ -320,6 +424,14 @@ ERROR: node is still EOpNull!
 0:?     'in2' (smooth in 2-component vector of float)
 0:?     'in3' (smooth in 3-component vector of float)
 0:?     'in4' (smooth in 4-component vector of float)
+0:?     'colorSampIn' (smooth sample in 4-component vector of float)
+0:?     'colorSampleBad' (sample out 4-component vector of float)
+0:?     'colorfsi' (noperspective in 4-component vector of float)
+0:?     'sampInArray' (smooth sample in 4-element array of 3-component vector of float)
+0:?     'scalarIn' (smooth in float)
+0:?     'colorfc' (centroid flat in 2-component vector of float)
+0:?     's1' (smooth in structure{global float x})
+0:?     's2' (sample temp structure{global float x})
 
 
 Linked fragment stage:
@@ -601,6 +713,99 @@ ERROR: node is still EOpNull!
 0:100        'u2' (temp 2-component vector of uint)
 0:100        UnpackUnorm4x8 (global 2-component vector of uint)
 0:100          'd' (temp double)
+0:117  Function Definition: interp( (global void)
+0:117    Function Parameters: 
+0:119    Sequence
+0:119      interpolateAtCentroid (global 2-component vector of float)
+0:119        'colorfc' (centroid flat in 2-component vector of float)
+0:120      interpolateAtCentroid (global 4-component vector of float)
+0:120        'colorSampIn' (smooth sample in 4-component vector of float)
+0:121      interpolateAtCentroid (global 4-component vector of float)
+0:121        'colorfsi' (noperspective in 4-component vector of float)
+0:122      interpolateAtCentroid (global float)
+0:122        'scalarIn' (smooth in float)
+0:123      Constant:
+0:123        0.000000
+0:124      interpolateAtCentroid (global 3-component vector of float)
+0:124        direct index (smooth sample temp 3-component vector of float)
+0:124          'sampInArray' (smooth sample in 4-element array of 3-component vector of float)
+0:124          Constant:
+0:124            2 (const int)
+0:125      interpolateAtCentroid (global 2-component vector of float)
+0:125        vector swizzle (temp 2-component vector of float)
+0:125          direct index (smooth sample temp 3-component vector of float)
+0:125            'sampInArray' (smooth sample in 4-element array of 3-component vector of float)
+0:125            Constant:
+0:125              2 (const int)
+0:125          Sequence
+0:125            Constant:
+0:125              0 (const int)
+0:125            Constant:
+0:125              1 (const int)
+0:127      Constant:
+0:127        0.000000
+0:128      interpolateAtSample (global 3-component vector of float)
+0:128        indirect index (smooth sample temp 3-component vector of float)
+0:128          'sampInArray' (smooth sample in 4-element array of 3-component vector of float)
+0:128          'i' (flat in int)
+0:128        Constant:
+0:128          0 (const int)
+0:129      interpolateAtSample (global float)
+0:129        x: direct index for structure (global float)
+0:129          's1' (smooth in structure{global float x})
+0:129          Constant:
+0:129            0 (const int)
+0:129        Constant:
+0:129          2 (const int)
+0:130      interpolateAtSample (global float)
+0:130        'scalarIn' (smooth in float)
+0:130        Constant:
+0:130          1 (const int)
+0:132      Constant:
+0:132        0.000000
+0:133      interpolateAtOffset (global 3-component vector of float)
+0:133        direct index (smooth sample temp 3-component vector of float)
+0:133          'sampInArray' (smooth sample in 4-element array of 3-component vector of float)
+0:133          Constant:
+0:133            2 (const int)
+0:133        Constant:
+0:133          0.200000
+0:133          0.200000
+0:134      interpolateAtOffset (global 2-component vector of float)
+0:134        vector swizzle (temp 2-component vector of float)
+0:134          direct index (smooth sample temp 3-component vector of float)
+0:134            'sampInArray' (smooth sample in 4-element array of 3-component vector of float)
+0:134            Constant:
+0:134              2 (const int)
+0:134          Sequence
+0:134            Constant:
+0:134              0 (const int)
+0:134            Constant:
+0:134              1 (const int)
+0:134        Constant:
+0:134          0.200000
+0:134          0.200000
+0:135      interpolateAtOffset (global float)
+0:135        add (temp float)
+0:135          'scalarIn' (smooth in float)
+0:135          'scalarIn' (smooth in float)
+0:135        Constant:
+0:135          0.200000
+0:135          0.200000
+0:136      interpolateAtOffset (global float)
+0:136        x: direct index for structure (global float)
+0:136          's2' (sample temp structure{global float x})
+0:136          Constant:
+0:136            0 (const int)
+0:136        Constant:
+0:136          0.200000
+0:136          0.200000
+0:139      interpolateAtCentroid (global float)
+0:139        'f' (temp float)
+0:140      interpolateAtSample (global 4-component vector of float)
+0:140        'outp' (out 4-component vector of float)
+0:140        Constant:
+0:140          0 (const int)
 0:?   Linker Objects
 0:?     'c2D' (smooth in 2-component vector of float)
 0:?     'i' (flat in int)
@@ -623,4 +828,12 @@ ERROR: node is still EOpNull!
 0:?     'in2' (smooth in 2-component vector of float)
 0:?     'in3' (smooth in 3-component vector of float)
 0:?     'in4' (smooth in 4-component vector of float)
+0:?     'colorSampIn' (smooth sample in 4-component vector of float)
+0:?     'colorSampleBad' (sample out 4-component vector of float)
+0:?     'colorfsi' (noperspective in 4-component vector of float)
+0:?     'sampInArray' (smooth sample in 4-element array of 3-component vector of float)
+0:?     'scalarIn' (smooth in float)
+0:?     'colorfc' (centroid flat in 2-component vector of float)
+0:?     's1' (smooth in structure{global float x})
+0:?     's2' (sample temp structure{global float x})
 
diff --git a/Test/baseResults/440.frag.out b/Test/baseResults/440.frag.out
index fdc675f13c9a789d4c8d4375e720eefac7e96716..6de68c70eefbdc1ed660394afb84f2d6686a452b 100644
--- a/Test/baseResults/440.frag.out
+++ b/Test/baseResults/440.frag.out
@@ -53,6 +53,20 @@ ERROR: 48 compilation errors.  No code generated.
 
 Shader version: 440
 ERROR: node is still EOpNull!
+0:144  Function Definition: interp( (global void)
+0:144    Function Parameters: 
+0:146    Sequence
+0:146      interpolateAtCentroid (global 2-component vector of float)
+0:146        vector swizzle (temp 2-component vector of float)
+0:146          direct index (smooth sample temp 3-component vector of float)
+0:146            'sampInArray' (smooth sample in 4-element array of 3-component vector of float)
+0:146            Constant:
+0:146              2 (const int)
+0:146          Sequence
+0:146            Constant:
+0:146              0 (const int)
+0:146            Constant:
+0:146              1 (const int)
 0:?   Linker Objects
 0:?     'a' (layout(location=4 component=2 ) smooth in 2-component vector of float)
 0:?     'b' (layout(location=4 component=1 ) smooth in float)
@@ -88,6 +102,7 @@ ERROR: node is still EOpNull!
 0:?     'specExample4301' (layout(column_major std430 align=128 ) uniform block{layout(column_major std430 offset=0 align=128 ) uniform 4-component vector of float a, layout(column_major std430 offset=128 align=128 ) uniform 3-component vector of float b, layout(column_major std430 offset=256 align=128 ) uniform 2-component vector of float d, layout(column_major std430 offset=512 align=128 ) uniform float e, layout(column_major std430 offset=520 align=8 ) uniform double f, layout(column_major std430 offset=640 align=128 ) uniform float h, layout(column_major std430 offset=768 align=128 ) uniform 3-component vector of double i})
 0:?     'aconst' (global 4-element array of int)
 0:?     'bconst' (global 64-element array of int)
+0:?     'sampInArray' (smooth sample in 4-element array of 3-component vector of float)
 
 
 Linked fragment stage:
@@ -96,6 +111,20 @@ ERROR: Linking fragment stage: Missing entry point: Each stage requires one "voi
 
 Shader version: 440
 ERROR: node is still EOpNull!
+0:144  Function Definition: interp( (global void)
+0:144    Function Parameters: 
+0:146    Sequence
+0:146      interpolateAtCentroid (global 2-component vector of float)
+0:146        vector swizzle (temp 2-component vector of float)
+0:146          direct index (smooth sample temp 3-component vector of float)
+0:146            'sampInArray' (smooth sample in 4-element array of 3-component vector of float)
+0:146            Constant:
+0:146              2 (const int)
+0:146          Sequence
+0:146            Constant:
+0:146              0 (const int)
+0:146            Constant:
+0:146              1 (const int)
 0:?   Linker Objects
 0:?     'a' (layout(location=4 component=2 ) smooth in 2-component vector of float)
 0:?     'b' (layout(location=4 component=1 ) smooth in float)
@@ -131,4 +160,5 @@ ERROR: node is still EOpNull!
 0:?     'specExample4301' (layout(column_major std430 align=128 ) uniform block{layout(column_major std430 offset=0 align=128 ) uniform 4-component vector of float a, layout(column_major std430 offset=128 align=128 ) uniform 3-component vector of float b, layout(column_major std430 offset=256 align=128 ) uniform 2-component vector of float d, layout(column_major std430 offset=512 align=128 ) uniform float e, layout(column_major std430 offset=520 align=8 ) uniform double f, layout(column_major std430 offset=640 align=128 ) uniform float h, layout(column_major std430 offset=768 align=128 ) uniform 3-component vector of double i})
 0:?     'aconst' (global 4-element array of int)
 0:?     'bconst' (global 64-element array of int)
+0:?     'sampInArray' (smooth sample in 4-element array of 3-component vector of float)
 
diff --git a/glslang/Include/intermediate.h b/glslang/Include/intermediate.h
index 103f0df36febe8416348dc022c9d8766b8bf3b0f..9d9d28a1eda5700fc90e73934af780b23702b386 100644
--- a/glslang/Include/intermediate.h
+++ b/glslang/Include/intermediate.h
@@ -226,6 +226,10 @@ enum TOperator {
     EOpDPdyCoarse,      // Fragment only
     EOpFwidthCoarse,    // Fragment only
 
+    EOpInterpolateAtCentroid, // Fragment only
+    EOpInterpolateAtSample,   // Fragment only
+    EOpInterpolateAtOffset,   // Fragment only
+
     EOpMatrixTimesMatrix,
     EOpOuterProduct,
     EOpDeterminant,
diff --git a/glslang/Include/revision.h b/glslang/Include/revision.h
index c76f907c5de69a3a88aeb34339e53d0b66b0690b..a4c86e87b07b2c12bb4c833dd0ba63fccd0ab27f 100644
--- a/glslang/Include/revision.h
+++ b/glslang/Include/revision.h
@@ -2,5 +2,5 @@
 // For the version, it uses the latest git tag followed by the number of commits.
 // For the date, it uses the current date (when then script is run).
 
-#define GLSLANG_REVISION "3.0.730"
-#define GLSLANG_DATE "21-Aug-2015"
+#define GLSLANG_REVISION "3.0.732"
+#define GLSLANG_DATE "22-Aug-2015"
diff --git a/glslang/MachineIndependent/Initialize.cpp b/glslang/MachineIndependent/Initialize.cpp
index 0ea99f0c5e89763c17313ae40771273c9aef8fce..0411a46ebc5a6771924722efb893ae6950490ad8 100644
--- a/glslang/MachineIndependent/Initialize.cpp
+++ b/glslang/MachineIndependent/Initialize.cpp
@@ -1185,6 +1185,28 @@ void TBuiltIns::initialize(int version, EProfile profile)
             "\n");
     }
 
+    // GL_OES_shader_multisample_interpolation
+    if ((profile == EEsProfile && version >= 310) ||
+        (profile != EEsProfile && version >= 400)) {
+        stageBuiltins[EShLangFragment].append(
+            "float interpolateAtCentroid(float);"
+            "vec2  interpolateAtCentroid(vec2);"
+            "vec3  interpolateAtCentroid(vec3);"
+            "vec4  interpolateAtCentroid(vec4);"
+
+            "float interpolateAtSample(float, int);"
+            "vec2  interpolateAtSample(vec2,  int);"
+            "vec3  interpolateAtSample(vec3,  int);"
+            "vec4  interpolateAtSample(vec4,  int);"
+
+            "float interpolateAtOffset(float, vec2);"
+            "vec2  interpolateAtOffset(vec2,  vec2);"
+            "vec3  interpolateAtOffset(vec3,  vec2);"
+            "vec4  interpolateAtOffset(vec4,  vec2);"
+
+            "\n");
+    }
+
     //============================================================================
     //
     // Standard Uniforms
@@ -3009,8 +3031,12 @@ void IdentifyBuiltIns(int version, EProfile profile, EShLanguage language, TSymb
                 symbolTable.setFunctionExtensions("dFdy",   1, &E_GL_OES_standard_derivatives);
                 symbolTable.setFunctionExtensions("fwidth", 1, &E_GL_OES_standard_derivatives);
             }
-            if (version >= 310)
+            if (version >= 310) {
                 symbolTable.setFunctionExtensions("fma", Num_AEP_gpu_shader5, AEP_gpu_shader5);
+                symbolTable.setFunctionExtensions("interpolateAtCentroid", 1, &E_GL_OES_shader_multisample_interpolation);
+                symbolTable.setFunctionExtensions("interpolateAtSample",   1, &E_GL_OES_shader_multisample_interpolation);
+                symbolTable.setFunctionExtensions("interpolateAtOffset",   1, &E_GL_OES_shader_multisample_interpolation);
+            }
         } else if (version < 130) {
             symbolTable.setFunctionExtensions("texture1DLod",        1, &E_GL_ARB_shader_texture_lod);
             symbolTable.setFunctionExtensions("texture2DLod",        1, &E_GL_ARB_shader_texture_lod);
@@ -3351,6 +3377,9 @@ void IdentifyBuiltIns(int version, EProfile profile, EShLanguage language, TSymb
             symbolTable.relateToOperator("dFdyCoarse",   EOpDPdyCoarse);
             symbolTable.relateToOperator("fwidthCoarse", EOpFwidthCoarse);
         }
+        symbolTable.relateToOperator("interpolateAtCentroid", EOpInterpolateAtCentroid);
+        symbolTable.relateToOperator("interpolateAtSample",   EOpInterpolateAtSample);
+        symbolTable.relateToOperator("interpolateAtOffset",   EOpInterpolateAtOffset);
         break;
 
     case EShLangCompute:
diff --git a/glslang/MachineIndependent/Intermediate.cpp b/glslang/MachineIndependent/Intermediate.cpp
index ac0a302ecdea9bf86728b9bd7de57804e53aea09..35be93b847001f801b21b0a8a999a9d61f1dde2b 100644
--- a/glslang/MachineIndependent/Intermediate.cpp
+++ b/glslang/MachineIndependent/Intermediate.cpp
@@ -860,6 +860,35 @@ TIntermTyped* TIntermediate::addSwizzle(TVectorFields& fields, const TSourceLoc&
     return node;
 }
 
+//
+// Follow the left branches down to the root of an l-value
+// expression (just "." and []).
+//
+// Return the base of the l-value (where following indexing quits working).
+// Return nullptr if a chain following dereferences cannot be followed.
+//
+// 'swizzleOkay' says whether or not it is okay to consider a swizzle 
+// a valid part of the dereference chain.
+//
+const TIntermTyped* TIntermediate::findLValueBase(const TIntermTyped* node, bool swizzleOkay)
+{
+    do {
+        const TIntermBinary* binary = node->getAsBinaryNode();
+        if (binary == nullptr)
+            return node;
+        TOperator op = binary->getOp();
+        if (op != EOpIndexDirect && op != EOpIndexIndirect && op != EOpIndexDirectStruct && op != EOpVectorSwizzle)
+            return nullptr;
+        if (! swizzleOkay) {
+            if (op == EOpVectorSwizzle)
+                return nullptr;
+            if ((op == EOpIndexDirect || op == EOpIndexIndirect) && binary->getLeft()->getType().isVector() && ! binary->getLeft()->getType().isArray())
+                return nullptr;
+        }
+        node = node->getAsBinaryNode()->getLeft();
+    } while (true);
+}
+
 //
 // Create loop nodes.
 //
diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp
index c31396d96eea30565ef7fb6e6c22f7dfab6c5fd0..f983313f1317ac4e255516b4bb331477cedffc60 100644
--- a/glslang/MachineIndependent/ParseHelper.cpp
+++ b/glslang/MachineIndependent/ParseHelper.cpp
@@ -1485,6 +1485,30 @@ void TParseContext::builtInOpCheck(const TSourceLoc& loc, const TFunction& fnCan
         break;
     }
 
+    case EOpInterpolateAtCentroid:
+    case EOpInterpolateAtSample:
+    case EOpInterpolateAtOffset:
+        // "For the interpolateAt* functions, the call will return a precision
+        // qualification matching the precision of the 'interpolant' argument to
+        // the function call."
+        callNode.getQualifier().precision = arg0->getQualifier().precision;
+
+        // Make sure the first argument is an interpolant, or an array element of an interpolant
+        if (arg0->getType().getQualifier().storage != EvqVaryingIn) {
+            // It might still be an array element.
+            //
+            // We could check more, but the semantics of the first argument are already met; the
+            // only way to turn an array into a float/vec* is array dereference and swizzle.
+            //
+            // ES and desktop 4.3 and earlier:  swizzles may not be used
+            // desktop 4.4 and later: swizzles may be used
+            bool swizzleOkay = (profile != EEsProfile) && (version >= 440);
+            const TIntermTyped* base = TIntermediate::findLValueBase(arg0, swizzleOkay);
+            if (base == nullptr || base->getType().getQualifier().storage != EvqVaryingIn)
+                error(loc, "first argument must be an interpolant, or interpolant-array element", fnCandidate.getName().c_str(), "");
+        }
+        break;
+
     default:
         break;
     }
@@ -2456,6 +2480,10 @@ void TParseContext::globalQualifierTypeCheck(const TSourceLoc& loc, const TQuali
                 error(loc, "cannot be a matrix", GetStorageQualifierString(qualifier.storage), "");
                 return;
             }
+            if (qualifier.isAuxiliary())
+                error(loc, "can't use auxiliary qualifier on a fragment output", "centroid/sample/patch", "");
+            if (qualifier.isInterpolation())
+                error(loc, "can't use interpolation qualifier on a fragment output", "flat/smooth/noperspective", "");
         break;
 
         case EShLangCompute:
diff --git a/glslang/MachineIndependent/Scan.cpp b/glslang/MachineIndependent/Scan.cpp
index 4a4cd471836227dff03f86d2571e0960dd1c8d77..325a9a99d40132728b40e5d6f18b165070de151a 100644
--- a/glslang/MachineIndependent/Scan.cpp
+++ b/glslang/MachineIndependent/Scan.cpp
@@ -738,6 +738,10 @@ int TScanContext::tokenizeIdentifier()
         return es30ReservedFromGLSL(400);
 
     case SAMPLE:
+        if (parseContext.extensionsTurnedOn(1, &E_GL_OES_shader_multisample_interpolation))
+            return keyword;
+        return es30ReservedFromGLSL(400);
+
     case SUBROUTINE:
         return es30ReservedFromGLSL(400);
 
diff --git a/glslang/MachineIndependent/Versions.cpp b/glslang/MachineIndependent/Versions.cpp
index b0a371827ef5ef5a46d91b3f091adf94cbe2dccb..a269ea3d2d0ea007b1df243a5d0f2270e1ec4219 100644
--- a/glslang/MachineIndependent/Versions.cpp
+++ b/glslang/MachineIndependent/Versions.cpp
@@ -183,7 +183,7 @@ void TParseContext::initializeExtensionBehavior()
     extensionBehavior[E_GL_KHR_blend_equation_advanced]              = EBhDisablePartial;
     extensionBehavior[E_GL_OES_sample_variables]                     = EBhDisable;
     extensionBehavior[E_GL_OES_shader_image_atomic]                  = EBhDisable;
-    extensionBehavior[E_GL_OES_shader_multisample_interpolation]     = EBhDisablePartial;
+    extensionBehavior[E_GL_OES_shader_multisample_interpolation]     = EBhDisable;
     extensionBehavior[E_GL_OES_texture_storage_multisample_2d_array] = EBhDisable;
     extensionBehavior[E_GL_EXT_geometry_shader]                      = EBhDisable;
     extensionBehavior[E_GL_EXT_geometry_point_size]                  = EBhDisable;
diff --git a/glslang/MachineIndependent/intermOut.cpp b/glslang/MachineIndependent/intermOut.cpp
index 5c302b9799f1bb07039c420d99c877f263da56e8..7edae3884397316c946b6bbae3cc20de16c6d2e4 100644
--- a/glslang/MachineIndependent/intermOut.cpp
+++ b/glslang/MachineIndependent/intermOut.cpp
@@ -286,6 +286,9 @@ bool TOutputTraverser::visitUnary(TVisit /* visit */, TIntermUnary* node)
     case EOpDPdxCoarse:     out.debug << "dPdxCoarse";           break;
     case EOpDPdyCoarse:     out.debug << "dPdyCoarse";           break;
     case EOpFwidthCoarse:   out.debug << "fwidthCoarse";         break;
+
+    case EOpInterpolateAtCentroid: out.debug << "interpolateAtCentroid";  break;
+
     case EOpDeterminant:    out.debug << "determinant";          break;
     case EOpMatrixInverse:  out.debug << "inverse";              break;
     case EOpTranspose:      out.debug << "transpose";            break;
@@ -473,8 +476,11 @@ bool TOutputTraverser::visitAggregate(TVisit /* visit */, TIntermAggregate* node
     case EOpBitfieldInsert:             out.debug << "bitfieldInsert";        break;
 
     case EOpFma:                        out.debug << "fma";                   break;
-    case EOpFrexp:                        out.debug << "frexp";                 break;
-    case EOpLdexp:                        out.debug << "ldexp";                 break;
+    case EOpFrexp:                      out.debug << "frexp";                 break;
+    case EOpLdexp:                      out.debug << "ldexp";                 break;
+
+    case EOpInterpolateAtSample:   out.debug << "interpolateAtSample";    break;
+    case EOpInterpolateAtOffset:   out.debug << "interpolateAtOffset";    break;
 
     default: out.debug.message(EPrefixError, "Bad aggregation op");
     }
diff --git a/glslang/MachineIndependent/localintermediate.h b/glslang/MachineIndependent/localintermediate.h
index 8e4e381a02211784e2e75d530af78d9a5211230e..627f503b361610adc471d88b5ae8eeda9add58ff 100644
--- a/glslang/MachineIndependent/localintermediate.h
+++ b/glslang/MachineIndependent/localintermediate.h
@@ -192,6 +192,9 @@ public:
     TIntermTyped* foldDereference(TIntermTyped* node, int index, const TSourceLoc&);
     TIntermTyped* foldSwizzle(TIntermTyped* node, TVectorFields& fields, const TSourceLoc&);
 
+    // Tree ops
+    static const TIntermTyped* findLValueBase(const TIntermTyped*, bool swizzleOkay);
+
     // Linkage related
     void addSymbolLinkageNodes(TIntermAggregate*& linkage, EShLanguage, TSymbolTable&);
     void addSymbolLinkageNode(TIntermAggregate*& linkage, TSymbolTable&, const TString&);