Remove (unused) geometry shader support

Bug: skia:8451 skia:10827
Change-Id: I5b38a1d72cd4558f8e2a92aaf9b12f05efce0923
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/442683
Commit-Queue: Brian Osman <brianosman@google.com>
Reviewed-by: Chris Dalton <csmartdalton@google.com>
Reviewed-by: John Stiles <johnstiles@google.com>
diff --git a/BUILD.gn b/BUILD.gn
index 91e649e..3237af7 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -667,7 +667,6 @@
   copy("sksl_pre_includes") {
     sources = [
       "src/sksl/sksl_frag.sksl",
-      "src/sksl/sksl_geom.sksl",
       "src/sksl/sksl_gpu.sksl",
       "src/sksl/sksl_public.sksl",
       "src/sksl/sksl_rt_blend.sksl",
@@ -755,11 +754,9 @@
         sources += [ src ]
 
         foreach(outExtension, invoker.outExtensions) {
-          # SPIR-V uses separate extensions for .vert and .geom shaders.
+          # SPIR-V uses separate extensions for .vert shaders.
           if (ext == "vert" && outExtension == ".asm.frag") {
             outExtension = ".asm.vert"
-          } else if (ext == "geom" && outExtension == ".asm.frag") {
-            outExtension = ".asm.geom"
           }
           outputs +=
               [ target_out_dir + "/" +
diff --git a/gn/compile_sksl_tests.py b/gn/compile_sksl_tests.py
index 9c89762..fbb8366 100755
--- a/gn/compile_sksl_tests.py
+++ b/gn/compile_sksl_tests.py
@@ -46,7 +46,7 @@
         pass
 
 def extensionForSpirvAsm(ext):
-    return ext if (ext == '.frag' or ext == '.vert' or ext == '.geom') else '.frag'
+    return ext if (ext == '.frag' or ext == '.vert') else '.frag'
 
 if settings != "--settings" and settings != "--nosettings":
     sys.exit("### Expected --settings or --nosettings, got " + settings)
diff --git a/gn/sksl_tests.gni b/gn/sksl_tests.gni
index 9f1a1c8..fed3dd4 100644
--- a/gn/sksl_tests.gni
+++ b/gn/sksl_tests.gni
@@ -70,7 +70,6 @@
   "/sksl/errors/InvalidToken.sksl",
   "/sksl/errors/InvalidUnary.sksl",
   "/sksl/errors/LayoutInFunctions.sksl",
-  "/sksl/errors/LayoutMultiplePrimitiveTypes.sksl",
   "/sksl/errors/LayoutRepeatedQualifiers.sksl",
   "/sksl/errors/MatrixToVectorCast3x3.sksl",
   "/sksl/errors/MatrixToVectorCastBoolean.sksl",
@@ -321,11 +320,6 @@
   "/sksl/shared/Functions.sksl",
   "/sksl/shared/GaussianBlur.sksl",
   "/sksl/shared/GeometricIntrinsics.sksl",
-  "/sksl/shared/Geometry.geom",
-  "/sksl/shared/GeometryExtension.geom",
-  "/sksl/shared/GeometryGSInvocations.geom",
-  "/sksl/shared/GeometryNoGSInvocations.geom",
-  "/sksl/shared/GeometryNoGSInvocationsReorder.geom",
   "/sksl/shared/HelloWorld.sksl",
   "/sksl/shared/Hex.sksl",
   "/sksl/shared/HexUnsigned.sksl",
@@ -341,7 +335,6 @@
   "/sksl/shared/NegatedVectorLiteral.sksl",
   "/sksl/shared/NoFragCoordsPos.vert",
   "/sksl/shared/NoFragCoordsPosRT.vert",
-  "/sksl/shared/NormalizationGeo.geom",
   "/sksl/shared/NormalizationVert.vert",
   "/sksl/shared/NumberCasts.sksl",
   "/sksl/shared/NumberConversions.sksl",
diff --git a/include/gpu/GrContextOptions.h b/include/gpu/GrContextOptions.h
index 331fe0b..fe6cd98 100644
--- a/include/gpu/GrContextOptions.h
+++ b/include/gpu/GrContextOptions.h
@@ -303,11 +303,6 @@
     bool fSuppressFramebufferFetch = false;
 
     /**
-     * If true, the caps will never support geometry shaders.
-     */
-    bool fSuppressGeometryShaders = false;
-
-    /**
      * If greater than zero and less than the actual hardware limit, overrides the maximum number of
      * tessellation segments supported by the caps.
      */
diff --git a/include/gpu/mock/GrMockTypes.h b/include/gpu/mock/GrMockTypes.h
index 6a147ce..2adba6d 100644
--- a/include/gpu/mock/GrMockTypes.h
+++ b/include/gpu/mock/GrMockTypes.h
@@ -121,7 +121,6 @@
     ConfigOptions fCompressedOptions[SkImage::kCompressionTypeCount];
 
     // GrShaderCaps options.
-    bool fGeometryShaderSupport = false;
     bool fIntegerSupport = false;
     bool fFlatInterpolationSupport = false;
     int fMaxVertexSamplers = 0;
diff --git a/include/private/GrTypesPriv.h b/include/private/GrTypesPriv.h
index b7d02d8..30bf996 100644
--- a/include/private/GrTypesPriv.h
+++ b/include/private/GrTypesPriv.h
@@ -354,7 +354,6 @@
 
 enum GrShaderType {
     kVertex_GrShaderType,
-    kGeometry_GrShaderType,
     kFragment_GrShaderType,
 
     kLastkFragment_GrShaderType = kFragment_GrShaderType
@@ -366,8 +365,7 @@
     kVertex_GrShaderFlag         = 1 << 0,
     kTessControl_GrShaderFlag    = 1 << 1,
     kTessEvaluation_GrShaderFlag = 1 << 2,
-    kGeometry_GrShaderFlag       = 1 << 3,
-    kFragment_GrShaderFlag       = 1 << 4
+    kFragment_GrShaderFlag       = 1 << 3
 };
 GR_MAKE_BITFIELD_OPS(GrShaderFlags)
 
diff --git a/include/private/SkSLLayout.h b/include/private/SkSLLayout.h
index 70462fd..58c4c4e 100644
--- a/include/private/SkSLLayout.h
+++ b/include/private/SkSLLayout.h
@@ -32,24 +32,10 @@
         kSet_Flag                        = 1 <<  8,
         kBuiltin_Flag                    = 1 <<  9,
         kInputAttachmentIndex_Flag       = 1 << 10,
-        kPrimitive_Flag                  = 1 << 11,
-        kMaxVertices_Flag                = 1 << 12,
-        kInvocations_Flag                = 1 << 13,
-    };
-
-    enum Primitive {
-        kUnspecified_Primitive = -1,
-        kPoints_Primitive,
-        kLines_Primitive,
-        kLineStrip_Primitive,
-        kLinesAdjacency_Primitive,
-        kTriangles_Primitive,
-        kTriangleStrip_Primitive,
-        kTrianglesAdjacency_Primitive
     };
 
     Layout(int flags, int location, int offset, int binding, int index, int set, int builtin,
-           int inputAttachmentIndex, Primitive primitive, int maxVertices, int invocations)
+           int inputAttachmentIndex)
     : fFlags(flags)
     , fLocation(location)
     , fOffset(offset)
@@ -57,10 +43,7 @@
     , fIndex(index)
     , fSet(set)
     , fBuiltin(builtin)
-    , fInputAttachmentIndex(inputAttachmentIndex)
-    , fPrimitive(primitive)
-    , fMaxVertices(maxVertices)
-    , fInvocations(invocations) {}
+    , fInputAttachmentIndex(inputAttachmentIndex) {}
 
     Layout()
     : fFlags(0)
@@ -70,10 +53,7 @@
     , fIndex(-1)
     , fSet(-1)
     , fBuiltin(-1)
-    , fInputAttachmentIndex(-1)
-    , fPrimitive(kUnspecified_Primitive)
-    , fMaxVertices(-1)
-    , fInvocations(-1) {}
+    , fInputAttachmentIndex(-1) {}
 
     static Layout builtin(int builtin) {
         Layout result;
@@ -123,37 +103,6 @@
         if (fFlags & kSRGBUnpremul_Flag) {
             result += separator() + "srgb_unpremul";
         }
-        switch (fPrimitive) {
-            case kPoints_Primitive:
-                result += separator() + "points";
-                break;
-            case kLines_Primitive:
-                result += separator() + "lines";
-                break;
-            case kLineStrip_Primitive:
-                result += separator() + "line_strip";
-                break;
-            case kLinesAdjacency_Primitive:
-                result += separator() + "lines_adjacency";
-                break;
-            case kTriangles_Primitive:
-                result += separator() + "triangles";
-                break;
-            case kTriangleStrip_Primitive:
-                result += separator() + "triangle_strip";
-                break;
-            case kTrianglesAdjacency_Primitive:
-                result += separator() + "triangles_adjacency";
-                break;
-            case kUnspecified_Primitive:
-                break;
-        }
-        if (fMaxVertices >= 0) {
-            result += separator() + "max_vertices = " + to_string(fMaxVertices);
-        }
-        if (fInvocations >= 0) {
-            result += separator() + "invocations = " + to_string(fInvocations);
-        }
         if (result.size() > 0) {
             result = "layout (" + result + ")";
         }
@@ -168,10 +117,7 @@
                fIndex                == other.fIndex &&
                fSet                  == other.fSet &&
                fBuiltin              == other.fBuiltin &&
-               fInputAttachmentIndex == other.fInputAttachmentIndex &&
-               fPrimitive            == other.fPrimitive &&
-               fMaxVertices          == other.fMaxVertices &&
-               fInvocations          == other.fInvocations;
+               fInputAttachmentIndex == other.fInputAttachmentIndex;
     }
 
     bool operator!=(const Layout& other) const {
@@ -190,9 +136,6 @@
     // input_attachment_index comes from Vulkan/SPIR-V to connect a shader variable to the a
     // corresponding attachment on the subpass in which the shader is being used.
     int fInputAttachmentIndex;
-    Primitive fPrimitive;
-    int fMaxVertices;
-    int fInvocations;
 };
 
 }  // namespace SkSL
diff --git a/include/private/SkSLProgramKind.h b/include/private/SkSLProgramKind.h
index 8cf8c46..a3f4e52 100644
--- a/include/private/SkSLProgramKind.h
+++ b/include/private/SkSLProgramKind.h
@@ -18,7 +18,6 @@
 enum class ProgramKind : int8_t {
     kFragment,
     kVertex,
-    kGeometry,
     kRuntimeColorFilter,  // Runtime effect only suitable as SkColorFilter
     kRuntimeShader,       //   "       "     "      "     "  SkShader
     kRuntimeBlender,      //   "       "     "      "     "  SkBlender
diff --git a/resources/sksl/errors/LayoutInFunctions.sksl b/resources/sksl/errors/LayoutInFunctions.sksl
index 3d88e0e..ee05b5a 100644
--- a/resources/sksl/errors/LayoutInFunctions.sksl
+++ b/resources/sksl/errors/LayoutInFunctions.sksl
@@ -9,9 +9,7 @@
     index = 1,
     set = 1,
     builtin = 1,
-    input_attachment_index = 1,
-    max_vertices = 1,
-    invocations = 1)
+    input_attachment_index = 1)
 void on_return() {}
 
 void on_param(
@@ -26,6 +24,4 @@
     index = 1,
     set = 1,
     builtin = 1,
-    input_attachment_index = 1,
-    max_vertices = 1,
-    invocations = 1) float x) {}
+    input_attachment_index = 1) float x) {}
diff --git a/resources/sksl/errors/LayoutMultiplePrimitiveTypes.sksl b/resources/sksl/errors/LayoutMultiplePrimitiveTypes.sksl
deleted file mode 100644
index 7b799fa..0000000
--- a/resources/sksl/errors/LayoutMultiplePrimitiveTypes.sksl
+++ /dev/null
@@ -1,8 +0,0 @@
-layout (
-    points,
-    lines,
-    line_strip,
-    lines_adjacency,
-    triangles,
-    triangle_strip
-) in;
diff --git a/resources/sksl/errors/LayoutRepeatedQualifiers.sksl b/resources/sksl/errors/LayoutRepeatedQualifiers.sksl
index 3589a95..aa46992 100644
--- a/resources/sksl/errors/LayoutRepeatedQualifiers.sksl
+++ b/resources/sksl/errors/LayoutRepeatedQualifiers.sksl
@@ -10,8 +10,6 @@
     set = 1,
     builtin = 1,
     input_attachment_index = 1,
-    max_vertices = 1,
-    invocations = 1,
 
     origin_upper_left,
     push_constant,
@@ -23,7 +21,5 @@
     index = 2,
     set = 2,
     builtin = 2,
-    input_attachment_index = 2,
-    max_vertices = 2,
-    invocations = 2
+    input_attachment_index = 2
 ) float x;
diff --git a/resources/sksl/shared/Geometry.geom b/resources/sksl/shared/Geometry.geom
deleted file mode 100644
index 2900afd..0000000
--- a/resources/sksl/shared/Geometry.geom
+++ /dev/null
@@ -1,13 +0,0 @@
-/*#pragma settings GeometryShaderSupport*/
-
-layout(points) in;
-layout(invocations = 2) in;
-layout(line_strip, max_vertices = 2) out;
-
-void main() {
-    sk_Position = sk_in[0].sk_Position + float4(-0.5, 0, 0, sk_InvocationID);
-    EmitVertex();
-    sk_Position = sk_in[0].sk_Position + float4(0.5, 0, 0, sk_InvocationID);
-    EmitVertex();
-    EndPrimitive();
-}
diff --git a/resources/sksl/shared/GeometryExtension.geom b/resources/sksl/shared/GeometryExtension.geom
deleted file mode 100644
index 278e561..0000000
--- a/resources/sksl/shared/GeometryExtension.geom
+++ /dev/null
@@ -1,11 +0,0 @@
-/*#pragma settings GeometryShaderExtensionString*/
-
-layout(points, invocations = 2) in;
-layout(invocations = 3) in;
-layout(line_strip, max_vertices = 2) out;
-
-void main() {
-    sk_Position = sk_in[0].sk_Position + float4(-0.5, 0, 0, sk_InvocationID);
-    EmitVertex();
-    EndPrimitive();
-}
diff --git a/resources/sksl/shared/GeometryGSInvocations.geom b/resources/sksl/shared/GeometryGSInvocations.geom
deleted file mode 100644
index c502538..0000000
--- a/resources/sksl/shared/GeometryGSInvocations.geom
+++ /dev/null
@@ -1,11 +0,0 @@
-/*#pragma settings GSInvocationsExtensionString*/
-
-layout(points, invocations = 2) in;
-layout(invocations = 3) in;
-layout(line_strip, max_vertices = 2) out;
-
-void main() {
-    sk_Position = sk_in[0].sk_Position + float4(-0.5, 0, 0, sk_InvocationID);
-    EmitVertex();
-    EndPrimitive();
-}
diff --git a/resources/sksl/shared/GeometryNoGSInvocations.geom b/resources/sksl/shared/GeometryNoGSInvocations.geom
deleted file mode 100644
index 9751957..0000000
--- a/resources/sksl/shared/GeometryNoGSInvocations.geom
+++ /dev/null
@@ -1,16 +0,0 @@
-/*#pragma settings NoGSInvocationsSupport*/
-
-layout(points) in;
-layout(invocations = 2) in;
-layout(line_strip, max_vertices = 2) out;
-
-void test() {
-    sk_Position = sk_in[0].sk_Position + float4(0.5, 0, 0, sk_InvocationID);
-    EmitVertex();
-}
-
-void main() {
-    test();
-    sk_Position = sk_in[0].sk_Position + float4(-0.5, 0, 0, sk_InvocationID);
-    EmitVertex();
-}
diff --git a/resources/sksl/shared/GeometryNoGSInvocationsReorder.geom b/resources/sksl/shared/GeometryNoGSInvocationsReorder.geom
deleted file mode 100644
index a2ca7a0..0000000
--- a/resources/sksl/shared/GeometryNoGSInvocationsReorder.geom
+++ /dev/null
@@ -1,20 +0,0 @@
-/*#pragma settings NoGSInvocationsSupport*/
-
-layout(points) in;
-
-// Subtle error: Declaring max_vertices before invocations causes us not to
-// apply the workaround fixup to max_vertices. It *should* be 4 (2*2) in the
-// GLSL, but is currently only 2. (skbug.com/10827)
-layout(line_strip, max_vertices = 2) out;
-layout(invocations = 2) in;
-
-void test() {
-    sk_Position = sk_in[0].sk_Position + float4(0.5, 0, 0, sk_InvocationID);
-    EmitVertex();
-}
-
-void main() {
-    test();
-    sk_Position = sk_in[0].sk_Position + float4(-0.5, 0, 0, sk_InvocationID);
-    EmitVertex();
-}
diff --git a/resources/sksl/shared/NormalizationGeo.geom b/resources/sksl/shared/NormalizationGeo.geom
deleted file mode 100644
index 8f2f143..0000000
--- a/resources/sksl/shared/NormalizationGeo.geom
+++ /dev/null
@@ -1,14 +0,0 @@
-/*#pragma settings GeometryShaderSupport*/
-
-uniform float4 sk_RTAdjust;
-layout(points) in;
-layout(invocations = 2) in;
-layout(line_strip, max_vertices = 2) out;
-
-void main() {
-    sk_Position = sk_in[0].sk_Position + float4(-0.5, 0, 0, sk_InvocationID);
-    EmitVertex();
-    sk_Position = sk_in[0].sk_Position + float4(0.5, 0, 0, sk_InvocationID);
-    EmitVertex();
-    EndPrimitive();
-}
diff --git a/src/gpu/GrGeometryProcessor.cpp b/src/gpu/GrGeometryProcessor.cpp
index d87ee46..05057d0 100644
--- a/src/gpu/GrGeometryProcessor.cpp
+++ b/src/gpu/GrGeometryProcessor.cpp
@@ -69,7 +69,7 @@
 
     GrShaderVar positionVar = gpArgs.fPositionVar;
     // skia:12198
-    if (args.fGeomProc.willUseGeoShader() || args.fGeomProc.willUseTessellationShaders()) {
+    if (args.fGeomProc.willUseTessellationShaders()) {
         positionVar = {};
     }
     FPCoordsMap transformMap = this->collectTransforms(args.fVertBuilder,
@@ -86,38 +86,13 @@
     }
 
     GrGLSLVertexBuilder* vBuilder = args.fVertBuilder;
-    if (!args.fGeomProc.willUseGeoShader()) {
-        // Emit the vertex position to the hardware in the normalized window coordinates it expects.
-        SkASSERT(kFloat2_GrSLType == gpArgs.fPositionVar.getType() ||
-                 kFloat3_GrSLType == gpArgs.fPositionVar.getType());
-        vBuilder->emitNormalizedSkPosition(gpArgs.fPositionVar.c_str(),
-                                           gpArgs.fPositionVar.getType());
-        if (kFloat2_GrSLType == gpArgs.fPositionVar.getType()) {
-            args.fVaryingHandler->setNoPerspective();
-        }
-    } else {
-        // Since we have a geometry shader, leave the vertex position in Skia device space for now.
-        // The geometry Shader will operate in device space, and then convert the final positions to
-        // normalized hardware window coordinates under the hood, once everything else has finished.
-        // The subclass must call setNoPerspective on the varying handler, if applicable.
-        vBuilder->codeAppendf("sk_Position = float4(%s", gpArgs.fPositionVar.c_str());
-        switch (gpArgs.fPositionVar.getType()) {
-            case kFloat_GrSLType:
-                vBuilder->codeAppend(", 0");
-                [[fallthrough]];
-            case kFloat2_GrSLType:
-                vBuilder->codeAppend(", 0");
-                [[fallthrough]];
-            case kFloat3_GrSLType:
-                vBuilder->codeAppend(", 1");
-                [[fallthrough]];
-            case kFloat4_GrSLType:
-                vBuilder->codeAppend(");");
-                break;
-            default:
-                SK_ABORT("Invalid position var type");
-                break;
-        }
+    // Emit the vertex position to the hardware in the normalized window coordinates it expects.
+    SkASSERT(kFloat2_GrSLType == gpArgs.fPositionVar.getType() ||
+                kFloat3_GrSLType == gpArgs.fPositionVar.getType());
+    vBuilder->emitNormalizedSkPosition(gpArgs.fPositionVar.c_str(),
+                                        gpArgs.fPositionVar.getType());
+    if (kFloat2_GrSLType == gpArgs.fPositionVar.getType()) {
+        args.fVaryingHandler->setNoPerspective();
     }
     return transformMap;
 }
diff --git a/src/gpu/GrGeometryProcessor.h b/src/gpu/GrGeometryProcessor.h
index b0131bc..31667b4 100644
--- a/src/gpu/GrGeometryProcessor.h
+++ b/src/gpu/GrGeometryProcessor.h
@@ -21,7 +21,6 @@
 #include <unordered_map>
 
 class GrGLSLFPFragmentBuilder;
-class GrGLSLGeometryBuilder;
 class GrGLSLVaryingHandler;
 class GrGLSLUniformHandler;
 class GrGLSLVertexBuilder;
@@ -186,10 +185,6 @@
         return fShaders & (kTessControl_GrShaderFlag | kTessEvaluation_GrShaderFlag);
     }
 
-    bool willUseGeoShader() const {
-        return fShaders & kGeometry_GrShaderFlag;
-    }
-
     /**
      * Computes a key for the transforms owned by an FP based on the shader code that will be
      * emitted by the primitive processor to implement them.
@@ -249,7 +244,6 @@
     void setWillUseTessellationShaders() {
         fShaders |= kTessControl_GrShaderFlag | kTessEvaluation_GrShaderFlag;
     }
-    void setWillUseGeoShader() { fShaders |= kGeometry_GrShaderFlag; }
     void setTextureSamplerCnt(int cnt) {
         SkASSERT(cnt >= 0);
         fTextureSamplerCnt = cnt;
@@ -296,7 +290,6 @@
 
     struct EmitArgs {
         EmitArgs(GrGLSLVertexBuilder* vertBuilder,
-                 GrGLSLGeometryBuilder* geomBuilder,
                  GrGLSLFPFragmentBuilder* fragBuilder,
                  GrGLSLVaryingHandler* varyingHandler,
                  GrGLSLUniformHandler* uniformHandler,
@@ -306,7 +299,6 @@
                  const char* outputCoverage,
                  const SamplerHandle* texSamplers)
                 : fVertBuilder(vertBuilder)
-                , fGeomBuilder(geomBuilder)
                 , fFragBuilder(fragBuilder)
                 , fVaryingHandler(varyingHandler)
                 , fUniformHandler(uniformHandler)
@@ -316,7 +308,6 @@
                 , fOutputCoverage(outputCoverage)
                 , fTexSamplers(texSamplers) {}
         GrGLSLVertexBuilder* fVertBuilder;
-        GrGLSLGeometryBuilder* fGeomBuilder;
         GrGLSLFPFragmentBuilder* fFragBuilder;
         GrGLSLVaryingHandler* fVaryingHandler;
         GrGLSLUniformHandler* fUniformHandler;
diff --git a/src/gpu/GrPersistentCacheUtils.cpp b/src/gpu/GrPersistentCacheUtils.cpp
index 71443e6..c5c3ab2 100644
--- a/src/gpu/GrPersistentCacheUtils.cpp
+++ b/src/gpu/GrPersistentCacheUtils.cpp
@@ -13,7 +13,7 @@
 
 namespace GrPersistentCacheUtils {
 
-static constexpr int kCurrentVersion = 7;
+static constexpr int kCurrentVersion = 8;
 
 int GetCurrentVersion() {
     // The persistent cache stores a copy of the SkSL::Program::Inputs struct. If you alter the
diff --git a/src/gpu/GrSPIRVVaryingHandler.cpp b/src/gpu/GrSPIRVVaryingHandler.cpp
index 8b9045a..a0c8ea9 100644
--- a/src/gpu/GrSPIRVVaryingHandler.cpp
+++ b/src/gpu/GrSPIRVVaryingHandler.cpp
@@ -109,8 +109,6 @@
 void GrSPIRVVaryingHandler::onFinalize() {
     finalize_helper(fVertexInputs);
     finalize_helper(fVertexOutputs);
-    finalize_helper(fGeomInputs);
-    finalize_helper(fGeomOutputs);
     finalize_helper(fFragInputs);
     finalize_helper(fFragOutputs);
 }
diff --git a/src/gpu/GrShaderCaps.cpp b/src/gpu/GrShaderCaps.cpp
index 365476e..3f1d309 100644
--- a/src/gpu/GrShaderCaps.cpp
+++ b/src/gpu/GrShaderCaps.cpp
@@ -16,8 +16,6 @@
 GrShaderCaps::GrShaderCaps(const GrContextOptions& options) {
     fGLSLGeneration = k330_GrGLSLGeneration;
     fShaderDerivativeSupport = false;
-    fGeometryShaderSupport = false;
-    fGSInvocationsSupport = false;
     fDstReadInShaderSupport = false;
     fDualSourceBlendingSupport = false;
     fIntegerSupport = false;
@@ -70,8 +68,6 @@
 
     fVersionDeclString = nullptr;
     fShaderDerivativeExtensionString = nullptr;
-    fGeometryShaderExtensionString = nullptr;
-    fGSInvocationsExtensionString = nullptr;
     fSecondaryOutputExtensionString = nullptr;
     fExternalTextureExtensionString = nullptr;
     fSecondExternalTextureExtensionString = nullptr;
@@ -90,8 +86,6 @@
     writer->beginObject();
 
     writer->appendBool("Shader Derivative Support", fShaderDerivativeSupport);
-    writer->appendBool("Geometry Shader Support", fGeometryShaderSupport);
-    writer->appendBool("Geometry Shader Invocations Support", fGSInvocationsSupport);
     writer->appendBool("Dst Read In Shader Support", fDstReadInShaderSupport);
     writer->appendBool("Dual Source Blending Support", fDualSourceBlendingSupport);
     writer->appendBool("Integer Support", fIntegerSupport);
@@ -202,9 +196,6 @@
     if (options.fSuppressFramebufferFetch) {
         fFBFetchSupport = false;
     }
-    if (options.fSuppressGeometryShaders) {
-        fGeometryShaderSupport = false;
-    }
     if (options.fMaxTessellationSegmentsOverride > 0) {
         fMaxTessellationSegments = std::min(options.fMaxTessellationSegmentsOverride,
                                             fMaxTessellationSegments);
diff --git a/src/gpu/GrShaderCaps.h b/src/gpu/GrShaderCaps.h
index a3ba50b..e026c10 100644
--- a/src/gpu/GrShaderCaps.h
+++ b/src/gpu/GrShaderCaps.h
@@ -42,8 +42,6 @@
     bool supportsDistanceFieldText() const { return fShaderDerivativeSupport; }
 
     bool shaderDerivativeSupport() const { return fShaderDerivativeSupport; }
-    bool geometryShaderSupport() const { return fGeometryShaderSupport; }
-    bool gsInvocationsSupport() const { return fGSInvocationsSupport; }
     bool dstReadInShaderSupport() const { return fDstReadInShaderSupport; }
     bool dualSourceBlendingSupport() const { return fDualSourceBlendingSupport; }
     bool nonsquareMatrixSupport() const { return fNonsquareMatrixSupport; }
@@ -224,22 +222,6 @@
         return fShaderDerivativeExtensionString;
     }
 
-    // Returns the string of an extension that must be enabled in the shader to support geometry
-    // shaders. If nullptr is returned then no extension needs to be enabled. Before calling this
-    // function, the caller must verify that geometryShaderSupport exists.
-    const char* geometryShaderExtensionString() const {
-        SkASSERT(this->geometryShaderSupport());
-        return fGeometryShaderExtensionString;
-    }
-
-    // Returns the string of an extension that must be enabled in the shader to support
-    // geometry shader invocations. If nullptr is returned then no extension needs to be enabled.
-    // Before calling this function, the caller must verify that gsInvocationsSupport exists.
-    const char* gsInvocationsExtensionString() const {
-        SkASSERT(this->gsInvocationsSupport());
-        return fGSInvocationsExtensionString;
-    }
-
     // This returns the name of an extension that must be enabled in the shader, if such a thing is
     // required in order to use a secondary output in the shader. This returns a nullptr if no such
     // extension is required. However, the return value of this function does not say whether dual
@@ -290,8 +272,6 @@
     GrGLSLGeneration fGLSLGeneration;
 
     bool fShaderDerivativeSupport           : 1;
-    bool fGeometryShaderSupport             : 1;
-    bool fGSInvocationsSupport              : 1;
     bool fDstReadInShaderSupport            : 1;
     bool fDualSourceBlendingSupport         : 1;
     bool fIntegerSupport                    : 1;
@@ -351,8 +331,6 @@
     const char* fVersionDeclString;
 
     const char* fShaderDerivativeExtensionString;
-    const char* fGeometryShaderExtensionString;
-    const char* fGSInvocationsExtensionString;
     const char* fSecondaryOutputExtensionString;
     const char* fExternalTextureExtensionString;
     const char* fSecondExternalTextureExtensionString;
diff --git a/src/gpu/GrShaderUtils.cpp b/src/gpu/GrShaderUtils.cpp
index e3c2903..1e6f618 100644
--- a/src/gpu/GrShaderUtils.cpp
+++ b/src/gpu/GrShaderUtils.cpp
@@ -228,7 +228,6 @@
     const char* typeName = "Unknown";
     switch (programKind) {
         case SkSL::ProgramKind::kVertex:   typeName = "Vertex";   break;
-        case SkSL::ProgramKind::kGeometry: typeName = "Geometry"; break;
         case SkSL::ProgramKind::kFragment: typeName = "Fragment"; break;
         default: break;
     }
diff --git a/src/gpu/d3d/GrD3DCaps.cpp b/src/gpu/d3d/GrD3DCaps.cpp
index 2b6eaca..40ba868 100644
--- a/src/gpu/d3d/GrD3DCaps.cpp
+++ b/src/gpu/d3d/GrD3DCaps.cpp
@@ -229,8 +229,6 @@
 
     shaderCaps->fShaderDerivativeSupport = true;
 
-    shaderCaps->fGeometryShaderSupport = shaderCaps->fGSInvocationsSupport = true;
-
     shaderCaps->fDualSourceBlendingSupport = true;
 
     shaderCaps->fIntegerSupport = true;
diff --git a/src/gpu/d3d/GrD3DPipelineStateBuilder.cpp b/src/gpu/d3d/GrD3DPipelineStateBuilder.cpp
index 0f98899..738d36f 100644
--- a/src/gpu/d3d/GrD3DPipelineStateBuilder.cpp
+++ b/src/gpu/d3d/GrD3DPipelineStateBuilder.cpp
@@ -86,9 +86,6 @@
         case SkSL::ProgramKind::kVertex:
             compileTarget = "vs_5_1";
             break;
-        case SkSL::ProgramKind::kGeometry:
-            compileTarget = "gs_5_1";
-            break;
         case SkSL::ProgramKind::kFragment:
             compileTarget = "ps_5_1";
             break;
@@ -133,9 +130,7 @@
     };
 
     return compile(SkSL::ProgramKind::kVertex, kVertex_GrShaderType) &&
-           compile(SkSL::ProgramKind::kFragment, kFragment_GrShaderType) &&
-           (hlsl[kGeometry_GrShaderType].empty() ||
-            compile(SkSL::ProgramKind::kGeometry, kGeometry_GrShaderType));
+           compile(SkSL::ProgramKind::kFragment, kFragment_GrShaderType);
 }
 
 gr_cp<ID3DBlob> GrD3DPipelineStateBuilder::compileD3DProgram(
@@ -501,7 +496,7 @@
 
 gr_cp<ID3D12PipelineState> create_pipeline_state(
         GrD3DGpu* gpu, const GrProgramInfo& programInfo, const sk_sp<GrD3DRootSignature>& rootSig,
-        gr_cp<ID3DBlob> vertexShader, gr_cp<ID3DBlob> geometryShader, gr_cp<ID3DBlob> pixelShader,
+        gr_cp<ID3DBlob> vertexShader, gr_cp<ID3DBlob> pixelShader,
         DXGI_FORMAT renderTargetFormat, DXGI_FORMAT depthStencilFormat,
         unsigned int sampleQualityPattern) {
     D3D12_GRAPHICS_PIPELINE_STATE_DESC psoDesc = {};
@@ -513,11 +508,6 @@
     psoDesc.PS = { reinterpret_cast<UINT8*>(pixelShader->GetBufferPointer()),
                    pixelShader->GetBufferSize() };
 
-    if (geometryShader.get()) {
-        psoDesc.GS = { reinterpret_cast<UINT8*>(geometryShader->GetBufferPointer()),
-                       geometryShader->GetBufferSize() };
-    }
-
     psoDesc.StreamOutput = { nullptr, 0, nullptr, 0, 0 };
 
     fill_in_blend_state(programInfo.pipeline(), &psoDesc.BlendState);
@@ -605,7 +595,6 @@
         SkSL::Program::Inputs inputs[kGrShaderTypeCount];
         SkSL::String* sksl[kGrShaderTypeCount] = {
             &fVS.fCompilerString,
-            &fGS.fCompilerString,
             &fFS.fCompilerString,
         };
         SkSL::String cached_sksl[kGrShaderTypeCount];
@@ -631,12 +620,6 @@
             return nullptr;
         }
 
-        if (geomProc.willUseGeoShader()) {
-            if (!compile(SkSL::ProgramKind::kGeometry, kGeometry_GrShaderType)) {
-                return nullptr;
-            }
-        }
-
         if (persistentCache && !cached) {
             const bool cacheSkSL = fGpu->getContext()->priv().options().fShaderCacheStrategy ==
                                    GrContextOptions::ShaderCacheStrategy::kSkSL;
@@ -665,7 +648,7 @@
     const GrD3DRenderTarget* rt = static_cast<const GrD3DRenderTarget*>(fRenderTarget);
     gr_cp<ID3D12PipelineState> pipelineState = create_pipeline_state(
             fGpu, fProgramInfo, rootSig, std::move(shaders[kVertex_GrShaderType]),
-            std::move(shaders[kGeometry_GrShaderType]), std::move(shaders[kFragment_GrShaderType]),
+            std::move(shaders[kFragment_GrShaderType]),
             rt->dxgiFormat(), rt->stencilDxgiFormat(), rt->sampleQualityPattern());
     sk_sp<GrD3DPipeline> pipeline = GrD3DPipeline::Make(std::move(pipelineState));
 
diff --git a/src/gpu/gl/GrGLCaps.cpp b/src/gpu/gl/GrGLCaps.cpp
index d65f932..9c3f9e2 100644
--- a/src/gpu/gl/GrGLCaps.cpp
+++ b/src/gpu/gl/GrGLCaps.cpp
@@ -364,18 +364,6 @@
 
         shaderCaps->fShaderDerivativeSupport = true;
 
-        // we don't support GL_ARB_geometry_shader4, just GL 3.2+ GS
-        shaderCaps->fGeometryShaderSupport = version >= GR_GL_VER(3, 2) &&
-            ctxInfo.glslGeneration() >= k150_GrGLSLGeneration;
-        if (shaderCaps->fGeometryShaderSupport) {
-            if (ctxInfo.glslGeneration() >= k400_GrGLSLGeneration) {
-                shaderCaps->fGSInvocationsSupport = true;
-            } else if (ctxInfo.hasExtension("GL_ARB_gpu_shader5")) {
-                shaderCaps->fGSInvocationsSupport = true;
-                shaderCaps->fGSInvocationsExtensionString = "GL_ARB_gpu_shader5";
-            }
-        }
-
         shaderCaps->fIntegerSupport = version >= GR_GL_VER(3, 0) &&
             ctxInfo.glslGeneration() >= k130_GrGLSLGeneration;
 
@@ -387,22 +375,6 @@
         shaderCaps->fShaderDerivativeSupport = version >= GR_GL_VER(3, 0) ||
             ctxInfo.hasExtension("GL_OES_standard_derivatives");
 
-        // Mali and early Adreno both have support for geometry shaders, but they appear to be
-        // implemented in software. In practice with ccpr, they were slower than the backup impl
-        // that only uses vertex shaders.
-        if (ctxInfo.vendor()   != GrGLVendor::kARM         &&
-            ctxInfo.renderer() != GrGLRenderer::kAdreno3xx &&
-            ctxInfo.renderer() != GrGLRenderer::kAdreno4xx_other) {
-
-            if (version >= GR_GL_VER(3,2)) {
-                shaderCaps->fGeometryShaderSupport = true;
-            } else if (ctxInfo.hasExtension("GL_EXT_geometry_shader")) {
-                shaderCaps->fGeometryShaderSupport = true;
-                shaderCaps->fGeometryShaderExtensionString = "GL_EXT_geometry_shader";
-            }
-            shaderCaps->fGSInvocationsSupport = shaderCaps->fGeometryShaderSupport;
-        }
-
         shaderCaps->fIntegerSupport = version >= GR_GL_VER(3, 0) &&
             ctxInfo.glslGeneration() >= k330_GrGLSLGeneration; // We use this value for GLSL ES 3.0.
         shaderCaps->fNonsquareMatrixSupport = ctxInfo.glslGeneration() >= k330_GrGLSLGeneration;
@@ -3547,23 +3519,6 @@
         fClearTextureSupport = false;
     }
 
-#ifdef SK_BUILD_FOR_MAC
-    // Radeon MacBooks hit a crash in glReadPixels() when using geometry shaders.
-    // http://skbug.com/8097
-    if (ctxInfo.vendor() == GrGLVendor::kATI) {
-        shaderCaps->fGeometryShaderSupport = false;
-    }
-    // On at least some MacBooks, GLSL 4.0 geometry shaders break if we use invocations.
-    shaderCaps->fGSInvocationsSupport = false;
-#endif
-
-    // Qualcomm driver @103.0 has been observed to crash compiling ccpr geometry
-    // shaders. @127.0 is the earliest verified driver to not crash.
-    if (ctxInfo.driver() == GrGLDriver::kQualcomm &&
-        ctxInfo.driverVersion() < GR_GL_DRIVER_VER(127, 0, 0)) {
-        shaderCaps->fGeometryShaderSupport = false;
-    }
-
     // glBlitFramebuffer seems to produce incorrect results on QC, Mali400, and Tegra3 but
     // glCopyTexSubImage2D works (even though there is no extension that specifically allows it).
     if (ctxInfo.vendor()   == GrGLVendor::kQualcomm  ||
diff --git a/src/gpu/gl/GrGLDefines.h b/src/gpu/gl/GrGLDefines.h
index 76c785a..b682695 100644
--- a/src/gpu/gl/GrGLDefines.h
+++ b/src/gpu/gl/GrGLDefines.h
@@ -545,7 +545,6 @@
 /* Shaders */
 #define GR_GL_FRAGMENT_SHADER                          0x8B30
 #define GR_GL_VERTEX_SHADER                            0x8B31
-#define GR_GL_GEOMETRY_SHADER                          0x8DD9
 #define GR_GL_TESS_CONTROL_SHADER                      0x8E88
 #define GR_GL_TESS_EVALUATION_SHADER                   0x8E87
 #define GR_GL_MAX_VERTEX_ATTRIBS                       0x8869
diff --git a/src/gpu/gl/builders/GrGLProgramBuilder.cpp b/src/gpu/gl/builders/GrGLProgramBuilder.cpp
index 0a570f8..d58e863 100644
--- a/src/gpu/gl/builders/GrGLProgramBuilder.cpp
+++ b/src/gpu/gl/builders/GrGLProgramBuilder.cpp
@@ -246,7 +246,6 @@
     SkSL::String glsl[kGrShaderTypeCount];
     SkSL::String* sksl[kGrShaderTypeCount] = {
         &fVS.fCompilerString,
-        &fGS.fCompilerString,
         &fFS.fCompilerString,
     };
     SkSL::String cached_sksl[kGrShaderTypeCount];
@@ -413,31 +412,6 @@
             }
         }
 
-        /*
-           Geometry Shader
-        */
-        if (geomProc.willUseGeoShader()) {
-            if (glsl[kGeometry_GrShaderType].empty()) {
-                // Don't have cached GLSL, need to compile SkSL->GLSL
-                std::unique_ptr<SkSL::Program> gs;
-                gs = GrSkSLtoGLSL(this->gpu(),
-                                  SkSL::ProgramKind::kGeometry,
-                                  *sksl[kGeometry_GrShaderType],
-                                  settings,
-                                  &glsl[kGeometry_GrShaderType],
-                                  errorHandler);
-                if (!gs) {
-                    cleanup_program(fGpu, programID, shadersToDelete);
-                    return nullptr;
-                }
-            }
-            if (!this->compileAndAttachShaders(glsl[kGeometry_GrShaderType], programID,
-                                               GR_GL_GEOMETRY_SHADER, &shadersToDelete,
-                                               errorHandler)) {
-                cleanup_program(fGpu, programID, shadersToDelete);
-                return nullptr;
-            }
-        }
         this->bindProgramResourceLocations(programID);
 
         {
@@ -499,16 +473,10 @@
         SkSL::String allShaders;
         if (sksl) {
             allShaders.appendf("// Vertex SKSL\n%s\n", sksl[kVertex_GrShaderType]->c_str());
-            if (!sksl[kGeometry_GrShaderType]->empty()) {
-                allShaders.appendf("// Geometry SKSL\n%s\n", sksl[kGeometry_GrShaderType]->c_str());
-            }
             allShaders.appendf("// Fragment SKSL\n%s\n", sksl[kFragment_GrShaderType]->c_str());
         }
         if (glsl) {
             allShaders.appendf("// Vertex GLSL\n%s\n", glsl[kVertex_GrShaderType].c_str());
-            if (!glsl[kGeometry_GrShaderType].empty()) {
-                allShaders.appendf("// Geometry GLSL\n%s\n", glsl[kGeometry_GrShaderType].c_str());
-            }
             allShaders.appendf("// Fragment GLSL\n%s\n", glsl[kFragment_GrShaderType].c_str());
         }
         GrGLint infoLen = GR_GL_INIT_ZERO;
@@ -601,11 +569,7 @@
                        GR_GL_FRAGMENT_SHADER) ||
         !compileShader(SkSL::ProgramKind::kVertex,
                        shaders[kVertex_GrShaderType],
-                       GR_GL_VERTEX_SHADER) ||
-        (!shaders[kGeometry_GrShaderType].empty() &&
-         !compileShader(SkSL::ProgramKind::kGeometry,
-                       shaders[kGeometry_GrShaderType],
-                       GR_GL_GEOMETRY_SHADER))) {
+                       GR_GL_VERTEX_SHADER)) {
         cleanup_program(glGpu, programID, shadersToDelete);
         return false;
     }
diff --git a/src/gpu/glsl/GrGLSLProgramBuilder.cpp b/src/gpu/glsl/GrGLSLProgramBuilder.cpp
index a1506c6..04f54a6 100644
--- a/src/gpu/glsl/GrGLSLProgramBuilder.cpp
+++ b/src/gpu/glsl/GrGLSLProgramBuilder.cpp
@@ -27,7 +27,6 @@
 GrGLSLProgramBuilder::GrGLSLProgramBuilder(const GrProgramDesc& desc,
                                            const GrProgramInfo& programInfo)
         : fVS(this)
-        , fGS(this)
         , fFS(this)
         , fDesc(desc)
         , fProgramInfo(programInfo)
@@ -41,10 +40,6 @@
     if (shaders & kVertex_GrShaderFlag) {
         fVS.addFeature(featureBit, extensionName);
     }
-    if (shaders & kGeometry_GrShaderFlag) {
-        SkASSERT(this->geometryProcessor().willUseGeoShader());
-        fGS.addFeature(featureBit, extensionName);
-    }
     if (shaders & kFragment_GrShaderFlag) {
         fFS.addFeature(featureBit, extensionName);
     }
@@ -84,9 +79,7 @@
 
     SkASSERT(!fUniformHandles.fRTAdjustmentUni.isValid());
     GrShaderFlags rtAdjustVisibility;
-    if (geomProc.willUseGeoShader()) {
-        rtAdjustVisibility = kGeometry_GrShaderFlag;
-    } else if (geomProc.willUseTessellationShaders()) {
+    if (geomProc.willUseTessellationShaders()) {
         rtAdjustVisibility = kTessEvaluation_GrShaderFlag;
     } else {
         rtAdjustVisibility = kVertex_GrShaderFlag;
@@ -115,7 +108,6 @@
     }
 
     GrGeometryProcessor::ProgramImpl::EmitArgs args(&fVS,
-                                                    geomProc.willUseGeoShader() ? &fGS : nullptr,
                                                     &fFS,
                                                     this->varyingHandler(),
                                                     this->uniformHandler(),
@@ -493,9 +485,5 @@
 void GrGLSLProgramBuilder::finalizeShaders() {
     this->varyingHandler()->finalize();
     fVS.finalize(kVertex_GrShaderFlag);
-    if (this->geometryProcessor().willUseGeoShader()) {
-        SkASSERT(this->shaderCaps()->geometryShaderSupport());
-        fGS.finalize(kGeometry_GrShaderFlag);
-    }
     fFS.finalize(kFragment_GrShaderFlag);
 }
diff --git a/src/gpu/glsl/GrGLSLProgramBuilder.h b/src/gpu/glsl/GrGLSLProgramBuilder.h
index 364b4d3..994af71 100644
--- a/src/gpu/glsl/GrGLSLProgramBuilder.h
+++ b/src/gpu/glsl/GrGLSLProgramBuilder.h
@@ -96,7 +96,6 @@
     static const int kVarsPerBlock;
 
     GrGLSLVertexBuilder          fVS;
-    GrGLSLGeometryBuilder        fGS;
     GrGLSLFragmentShaderBuilder  fFS;
 
     const GrProgramDesc&         fDesc;
diff --git a/src/gpu/glsl/GrGLSLVarying.cpp b/src/gpu/glsl/GrGLSLVarying.cpp
index a334d63..39eb875 100644
--- a/src/gpu/glsl/GrGLSLVarying.cpp
+++ b/src/gpu/glsl/GrGLSLVarying.cpp
@@ -13,7 +13,6 @@
                                                    const char* output,
                                                    Interpolation interpolation) {
     SkASSERT(vsVar.getType() != kVoid_GrSLType);
-    SkASSERT(!fProgramBuilder->geometryProcessor().willUseGeoShader());
     GrGLSLVarying v(vsVar.getType());
     this->addVarying(vsVar.c_str(), &v, interpolation);
     fProgramBuilder->fVS.codeAppendf("%s = %s;", v.vsOut(), vsVar.c_str());
@@ -40,7 +39,6 @@
 void GrGLSLVaryingHandler::addVarying(const char* name, GrGLSLVarying* varying,
                                       Interpolation interpolation) {
     SkASSERT(GrSLTypeIsFloatType(varying->type()) || Interpolation::kMustBeFlat == interpolation);
-    bool willUseGeoShader = fProgramBuilder->geometryProcessor().willUseGeoShader();
     VaryingInfo& v = fVaryings.push_back();
 
     SkASSERT(varying);
@@ -53,14 +51,8 @@
         varying->fVsOut = v.fVsOut.c_str();
         v.fVisibility |= kVertex_GrShaderFlag;
     }
-    if (willUseGeoShader) {
-        v.fGsOut = fProgramBuilder->nameVariable('g', name);
-        varying->fGsIn = v.fVsOut.c_str();
-        varying->fGsOut = v.fGsOut.c_str();
-        v.fVisibility |= kGeometry_GrShaderFlag;
-    }
     if (varying->isInFragmentShader()) {
-        varying->fFsIn = (willUseGeoShader ? v.fGsOut : v.fVsOut).c_str();
+        varying->fFsIn = v.fVsOut.c_str();
         v.fVisibility |= kFragment_GrShaderFlag;
     }
 }
@@ -93,9 +85,6 @@
     if (const char* extension = caps.noperspectiveInterpolationExtensionString()) {
         int bit = 1 << GrGLSLShaderBuilder::kNoPerspectiveInterpolation_GLSLPrivateFeature;
         fProgramBuilder->fVS.addFeature(bit, extension);
-        if (fProgramBuilder->geometryProcessor().willUseGeoShader()) {
-            fProgramBuilder->fGS.addFeature(bit, extension);
-        }
         fProgramBuilder->fFS.addFeature(bit, extension);
     }
     fDefaultInterpolationModifier = "noperspective";
@@ -107,18 +96,9 @@
         if (v.fVisibility & kVertex_GrShaderFlag) {
             fVertexOutputs.emplace_back(v.fVsOut, v.fType, GrShaderVar::TypeModifier::Out,
                                         GrShaderVar::kNonArray, SkString(), SkString(modifier));
-            if (v.fVisibility & kGeometry_GrShaderFlag) {
-                fGeomInputs.emplace_back(v.fVsOut, v.fType, GrShaderVar::TypeModifier::In,
-                                         GrShaderVar::kUnsizedArray, SkString(), SkString(modifier));
-            }
         }
         if (v.fVisibility & kFragment_GrShaderFlag) {
             const char* fsIn = v.fVsOut.c_str();
-            if (v.fVisibility & kGeometry_GrShaderFlag) {
-                fGeomOutputs.emplace_back(v.fGsOut, v.fType, GrShaderVar::TypeModifier::Out,
-                                          GrShaderVar::kNonArray, SkString(), SkString(modifier));
-                fsIn = v.fGsOut.c_str();
-            }
             fFragInputs.emplace_back(SkString(fsIn), v.fType, GrShaderVar::TypeModifier::In,
                                      GrShaderVar::kNonArray, SkString(), SkString(modifier));
         }
@@ -138,11 +118,6 @@
     this->appendDecls(fVertexOutputs, outputDecls);
 }
 
-void GrGLSLVaryingHandler::getGeomDecls(SkString* inputDecls, SkString* outputDecls) const {
-    this->appendDecls(fGeomInputs, inputDecls);
-    this->appendDecls(fGeomOutputs, outputDecls);
-}
-
 void GrGLSLVaryingHandler::getFragDecls(SkString* inputDecls, SkString* outputDecls) const {
     // We should not have any outputs in the fragment shader when using version 1.10
     SkASSERT(k110_GrGLSLGeneration != fProgramBuilder->shaderCaps()->generation() ||
diff --git a/src/gpu/glsl/GrGLSLVarying.h b/src/gpu/glsl/GrGLSLVarying.h
index 80df23c..48902d4 100644
--- a/src/gpu/glsl/GrGLSLVarying.h
+++ b/src/gpu/glsl/GrGLSLVarying.h
@@ -62,8 +62,6 @@
     bool isInFragmentShader() const { return Scope::kVertToGeo != fScope; }
 
     const char* vsOut() const { SkASSERT(this->isInVertexShader()); return fVsOut; }
-    const char* gsIn() const { return fGsIn; }
-    const char* gsOut() const { return fGsOut; }
     const char* fsIn() const { SkASSERT(this->isInFragmentShader()); return fFsIn; }
 
     GrShaderVar vsOutVar() const {
@@ -80,8 +78,6 @@
     GrSLType fType = kVoid_GrSLType;
     Scope fScope = Scope::kVertToFrag;
     const char* fVsOut = nullptr;
-    const char* fGsIn = nullptr;
-    const char* fGsOut = nullptr;
     const char* fFsIn = nullptr;
 
     friend class GrGLSLVaryingHandler;
@@ -95,8 +91,6 @@
         : fVaryings(kVaryingsPerBlock)
         , fVertexInputs(kVaryingsPerBlock)
         , fVertexOutputs(kVaryingsPerBlock)
-        , fGeomInputs(kVaryingsPerBlock)
-        , fGeomOutputs(kVaryingsPerBlock)
         , fFragInputs(kVaryingsPerBlock)
         , fFragOutputs(kVaryingsPerBlock)
         , fProgramBuilder(program)
@@ -132,8 +126,7 @@
     /**
      * The GP can use these calls to pass a vertex shader variable directly to 'output' in the
      * fragment shader. Though this adds code to vertex and fragment stages, 'output' is expected to
-     * be defined in the fragment shader before the call is made. This cannot be used with a
-     * geometry shader.
+     * be defined in the fragment shader before the call is made.
      * TODO it might be nicer behavior to have a flag to declare output inside these calls
      */
     void addPassThroughAttribute(const GrShaderVar& vsVar,
@@ -147,7 +140,6 @@
     void finalize();
 
     void getVertexDecls(SkString* inputDecls, SkString* outputDecls) const;
-    void getGeomDecls(SkString* inputDecls, SkString* outputDecls) const;
     void getFragDecls(SkString* inputDecls, SkString* outputDecls) const;
 
 protected:
@@ -155,7 +147,6 @@
         GrSLType         fType;
         bool             fIsFlat;
         SkString         fVsOut;
-        SkString         fGsOut;
         GrShaderFlags    fVisibility;
     };
 
@@ -165,8 +156,6 @@
     VaryingList    fVaryings;
     VarArray       fVertexInputs;
     VarArray       fVertexOutputs;
-    VarArray       fGeomInputs;
-    VarArray       fGeomOutputs;
     VarArray       fFragInputs;
     VarArray       fFragOutputs;
 
diff --git a/src/gpu/glsl/GrGLSLVertexGeoBuilder.cpp b/src/gpu/glsl/GrGLSLVertexGeoBuilder.cpp
index 0c28e52..781e1fa 100644
--- a/src/gpu/glsl/GrGLSLVertexGeoBuilder.cpp
+++ b/src/gpu/glsl/GrGLSLVertexGeoBuilder.cpp
@@ -39,49 +39,3 @@
     }
     fProgramBuilder->varyingHandler()->getVertexDecls(&this->inputs(), &this->outputs());
 }
-
-static const char* input_type_name(GrGLSLGeometryBuilder::InputType in) {
-    using InputType = GrGLSLGeometryBuilder::InputType;
-    switch (in) {
-        case InputType::kPoints: return "points";
-        case InputType::kLines: return "lines";
-        case InputType::kTriangles: return "triangles";
-    }
-    SK_ABORT("invalid input type");
-}
-
-static const char* output_type_name(GrGLSLGeometryBuilder::OutputType out) {
-    using OutputType = GrGLSLGeometryBuilder::OutputType;
-    switch (out) {
-        case OutputType::kPoints: return "points";
-        case OutputType::kLineStrip: return "line_strip";
-        case OutputType::kTriangleStrip: return "triangle_strip";
-    }
-    SK_ABORT("invalid output type");
-}
-
-void GrGLSLGeometryBuilder::configure(InputType inputType, OutputType outputType, int maxVertices,
-                                      int numInvocations) {
-    SkASSERT(!this->isConfigured());
-    fNumInvocations = numInvocations;
-    this->addLayoutQualifier(input_type_name(inputType), kIn_InterfaceQualifier);
-    this->addLayoutQualifier(SkStringPrintf("invocations = %i", numInvocations).c_str(),
-                             kIn_InterfaceQualifier);
-    this->addLayoutQualifier(output_type_name(outputType), kOut_InterfaceQualifier);
-    this->addLayoutQualifier(SkStringPrintf("max_vertices = %i", maxVertices).c_str(),
-                             kOut_InterfaceQualifier);
-}
-
-void GrGLSLGeometryBuilder::emitVertex(SkString* out, const char* devPos, GrSLType devPosType) {
-    this->emitNormalizedSkPosition(out, devPos, devPosType);
-    out->append("EmitVertex();");
-}
-
-void GrGLSLGeometryBuilder::endPrimitive() {
-    this->codeAppend("EndPrimitive();");
-}
-
-void GrGLSLGeometryBuilder::onFinalize() {
-    SkASSERT(this->isConfigured());
-    fProgramBuilder->varyingHandler()->getGeomDecls(&this->inputs(), &this->outputs());
-}
diff --git a/src/gpu/glsl/GrGLSLVertexGeoBuilder.h b/src/gpu/glsl/GrGLSLVertexGeoBuilder.h
index 20b1fb7..e2c3119 100644
--- a/src/gpu/glsl/GrGLSLVertexGeoBuilder.h
+++ b/src/gpu/glsl/GrGLSLVertexGeoBuilder.h
@@ -12,8 +12,8 @@
 #include "src/gpu/glsl/GrGLSLShaderBuilder.h"
 
 /**
- * Base class for vertex and geometry shader builders. This is the stage that computes input
- * geometry for the rasterizer.
+ * Base class for vertex shader builder. This is the stage that computes input geometry for the
+ * rasterizer.
  */
 class GrGLSLVertexGeoBuilder : public GrGLSLShaderBuilder {
 public:
@@ -55,42 +55,4 @@
     using INHERITED = GrGLSLVertexGeoBuilder;
 };
 
-
-class GrGLSLGeometryBuilder : public GrGLSLVertexGeoBuilder {
-public:
-    GrGLSLGeometryBuilder(GrGLSLProgramBuilder* program) : INHERITED(program) {}
-
-    enum class InputType {
-        kPoints,
-        kLines,
-        kTriangles,
-    };
-
-    enum class OutputType {
-        kPoints,
-        kLineStrip,
-        kTriangleStrip
-    };
-
-    void configure(InputType, OutputType, int maxVertices, int numInvocations = 1);
-    bool isConfigured() const { return fNumInvocations; }
-
-    void emitVertex(const char* devPos, GrSLType devPosType = GrSLType::kFloat2_GrSLType) {
-        this->emitVertex(&this->code(), devPos, devPosType);
-    }
-    void emitVertex(SkString* out, const char* devPos,
-                    GrSLType devPosType = GrSLType::kFloat2_GrSLType);
-
-    void endPrimitive();
-
-private:
-    void onFinalize() override;
-
-    int fNumInvocations = 0;
-
-    friend class GrGLProgramBuilder;
-
-    using INHERITED = GrGLSLVertexGeoBuilder;
-};
-
 #endif
diff --git a/src/gpu/mock/GrMockCaps.h b/src/gpu/mock/GrMockCaps.h
index ad0a15b..ad0aa69 100644
--- a/src/gpu/mock/GrMockCaps.h
+++ b/src/gpu/mock/GrMockCaps.h
@@ -29,7 +29,6 @@
         fSampleLocationsSupport = true;
 
         fShaderCaps.reset(new GrShaderCaps(contextOptions));
-        fShaderCaps->fGeometryShaderSupport = options.fGeometryShaderSupport;
         fShaderCaps->fIntegerSupport = options.fIntegerSupport;
         fShaderCaps->fFlatInterpolationSupport = options.fFlatInterpolationSupport;
         fShaderCaps->fMaxFragmentSamplers = options.fMaxFragmentSamplers;
diff --git a/src/gpu/mtl/GrMtlCaps.mm b/src/gpu/mtl/GrMtlCaps.mm
index fda5af8..54e1930 100644
--- a/src/gpu/mtl/GrMtlCaps.mm
+++ b/src/gpu/mtl/GrMtlCaps.mm
@@ -543,7 +543,6 @@
     shaderCaps->fPreferFlatInterpolation = true;
 
     shaderCaps->fShaderDerivativeSupport = true;
-    shaderCaps->fGeometryShaderSupport = false;
 
     if (@available(macOS 10.12, iOS 11.0, *)) {
         shaderCaps->fDualSourceBlendingSupport = true;
diff --git a/src/gpu/mtl/GrMtlPipelineStateBuilder.mm b/src/gpu/mtl/GrMtlPipelineStateBuilder.mm
index 20da637..70132e0 100644
--- a/src/gpu/mtl/GrMtlPipelineStateBuilder.mm
+++ b/src/gpu/mtl/GrMtlPipelineStateBuilder.mm
@@ -486,9 +486,6 @@
         const GrMtlPrecompiledLibraries* precompiledLibs) {
     TRACE_EVENT0("skia.shaders", TRACE_FUNC);
 
-    // Geometry shaders are not supported
-    SkASSERT(!this->geometryProcessor().willUseGeoShader());
-
     // Set up for cache if needed
     std::unique_ptr<SkBinaryWriteBuffer> writer;
 
diff --git a/src/gpu/mtl/GrMtlVaryingHandler.mm b/src/gpu/mtl/GrMtlVaryingHandler.mm
index a7bebd3..6136e6d 100644
--- a/src/gpu/mtl/GrMtlVaryingHandler.mm
+++ b/src/gpu/mtl/GrMtlVaryingHandler.mm
@@ -39,8 +39,6 @@
 void GrMtlVaryingHandler::onFinalize() {
     finalize_helper(fVertexInputs);
     finalize_helper(fVertexOutputs);
-    finalize_helper(fGeomInputs);
-    finalize_helper(fGeomOutputs);
     finalize_helper(fFragInputs);
     finalize_helper(fFragOutputs);
 }
diff --git a/src/gpu/vk/GrVkCaps.cpp b/src/gpu/vk/GrVkCaps.cpp
index 87b59e1..fda0630 100644
--- a/src/gpu/vk/GrVkCaps.cpp
+++ b/src/gpu/vk/GrVkCaps.cpp
@@ -699,10 +699,6 @@
     // RelaxedPrecision. Rewriting the multiply as a sum of vector*scalar fixes this. (skia:11769)
     shaderCaps->fRewriteMatrixVectorMultiply = (kARM_VkVendor == properties.vendorID);
 
-    // FIXME: http://skbug.com/7733: Disable geometry shaders until Intel/Radeon GMs draw correctly.
-    // shaderCaps->fGeometryShaderSupport =
-    //         shaderCaps->fGSInvocationsSupport = features.features.geometryShader;
-
     shaderCaps->fDualSourceBlendingSupport = features.features.dualSrcBlend;
 
     shaderCaps->fIntegerSupport = true;
@@ -1912,9 +1908,6 @@
 
 VkShaderStageFlags GrVkCaps::getPushConstantStageFlags() const {
     VkShaderStageFlags stageFlags = VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT;
-    if (this->shaderCaps()->geometryShaderSupport()) {
-        stageFlags |= VK_SHADER_STAGE_GEOMETRY_BIT;
-    }
     return stageFlags;
 }
 
diff --git a/src/gpu/vk/GrVkDescriptorSetManager.cpp b/src/gpu/vk/GrVkDescriptorSetManager.cpp
index 14cb1b0..d1882b4 100644
--- a/src/gpu/vk/GrVkDescriptorSetManager.cpp
+++ b/src/gpu/vk/GrVkDescriptorSetManager.cpp
@@ -19,9 +19,6 @@
 GrVkDescriptorSetManager* GrVkDescriptorSetManager::CreateUniformManager(GrVkGpu* gpu) {
     SkSTArray<1, uint32_t> visibilities;
     uint32_t stages = kVertex_GrShaderFlag | kFragment_GrShaderFlag;
-    if (gpu->vkCaps().shaderCaps()->geometryShaderSupport()) {
-        stages |= kGeometry_GrShaderFlag;
-    }
     visibilities.push_back(stages);
     SkTArray<const GrVkSampler*> samplers;
     return Create(gpu, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, visibilities, samplers);
@@ -58,9 +55,6 @@
     if (visibility & kVertex_GrShaderFlag) {
         flags |= VK_SHADER_STAGE_VERTEX_BIT;
     }
-    if (visibility & kGeometry_GrShaderFlag) {
-        flags |= VK_SHADER_STAGE_GEOMETRY_BIT;
-    }
     if (visibility & kFragment_GrShaderFlag) {
         flags |= VK_SHADER_STAGE_FRAGMENT_BIT;
     }
diff --git a/src/gpu/vk/GrVkPipelineStateBuilder.cpp b/src/gpu/vk/GrVkPipelineStateBuilder.cpp
index a056890..51c8a47 100644
--- a/src/gpu/vk/GrVkPipelineStateBuilder.cpp
+++ b/src/gpu/vk/GrVkPipelineStateBuilder.cpp
@@ -130,15 +130,6 @@
                                                      shaders[kFragment_GrShaderType],
                                                      inputs[kFragment_GrShaderType]);
 
-    if (!shaders[kGeometry_GrShaderType].empty()) {
-        success = success && this->installVkShaderModule(VK_SHADER_STAGE_GEOMETRY_BIT,
-                                                         fGS,
-                                                         &outShaderModules[kGeometry_GrShaderType],
-                                                         &outStageInfo[2],
-                                                         shaders[kGeometry_GrShaderType],
-                                                         inputs[kGeometry_GrShaderType]);
-    }
-
     if (!success) {
         for (int i = 0; i < kGrShaderTypeCount; ++i) {
             if (outShaderModules[i]) {
@@ -148,7 +139,7 @@
         }
         return 0;
     }
-    return shaders[kGeometry_GrShaderType].empty() ? 2 : 3;
+    return 2;
 }
 
 void GrVkPipelineStateBuilder::storeShadersInCache(const SkSL::String shaders[],
@@ -177,7 +168,6 @@
 
     VkDescriptorSetLayout dsLayout[GrVkUniformHandler::kDescSetCount];
     VkShaderModule shaderModules[kGrShaderTypeCount] = { VK_NULL_HANDLE,
-                                                         VK_NULL_HANDLE,
                                                          VK_NULL_HANDLE };
 
     GrVkResourceProvider& resourceProvider = fGpu->resourceProvider();
@@ -239,7 +229,6 @@
 
         SkSL::String* sksl[kGrShaderTypeCount] = {
             &fVS.fCompilerString,
-            &fGS.fCompilerString,
             &fFS.fCompilerString,
         };
         SkSL::String cached_sksl[kGrShaderTypeCount];
@@ -268,17 +257,6 @@
                                                         &shaders[kFragment_GrShaderType],
                                                         &inputs[kFragment_GrShaderType]);
 
-        if (this->geometryProcessor().willUseGeoShader()) {
-            success = success && this->createVkShaderModule(VK_SHADER_STAGE_GEOMETRY_BIT,
-                                                            *sksl[kGeometry_GrShaderType],
-                                                            &shaderModules[kGeometry_GrShaderType],
-                                                            &shaderStageInfo[2],
-                                                            settings,
-                                                            &shaders[kGeometry_GrShaderType],
-                                                            &inputs[kGeometry_GrShaderType]);
-            ++numShaderStages;
-        }
-
         if (!success) {
             for (int i = 0; i < kGrShaderTypeCount; ++i) {
                 if (shaderModules[i]) {
diff --git a/src/gpu/vk/GrVkUtil.cpp b/src/gpu/vk/GrVkUtil.cpp
index cba9dc8..9021edf 100644
--- a/src/gpu/vk/GrVkUtil.cpp
+++ b/src/gpu/vk/GrVkUtil.cpp
@@ -79,9 +79,6 @@
     if (VK_SHADER_STAGE_VERTEX_BIT == stage) {
         return SkSL::ProgramKind::kVertex;
     }
-    if (VK_SHADER_STAGE_GEOMETRY_BIT == stage) {
-        return SkSL::ProgramKind::kGeometry;
-    }
     SkASSERT(VK_SHADER_STAGE_FRAGMENT_BIT == stage);
     return SkSL::ProgramKind::kFragment;
 }
diff --git a/src/gpu/vk/GrVkVaryingHandler.cpp b/src/gpu/vk/GrVkVaryingHandler.cpp
index bb3b71a..e6925ea 100644
--- a/src/gpu/vk/GrVkVaryingHandler.cpp
+++ b/src/gpu/vk/GrVkVaryingHandler.cpp
@@ -106,8 +106,6 @@
 void GrVkVaryingHandler::onFinalize() {
     finalize_helper(fVertexInputs);
     finalize_helper(fVertexOutputs);
-    finalize_helper(fGeomInputs);
-    finalize_helper(fGeomOutputs);
     finalize_helper(fFragInputs);
     finalize_helper(fFragOutputs);
 }
diff --git a/src/sksl/SkSLCompiler.cpp b/src/sksl/SkSLCompiler.cpp
index 2c8c8ca..74748a8 100644
--- a/src/sksl/SkSLCompiler.cpp
+++ b/src/sksl/SkSLCompiler.cpp
@@ -59,7 +59,6 @@
 
 // At runtime, we load the dehydrated sksl data files. The data is a (pointer, size) pair.
 #include "src/sksl/generated/sksl_frag.dehydrated.sksl"
-#include "src/sksl/generated/sksl_geom.dehydrated.sksl"
 #include "src/sksl/generated/sksl_gpu.dehydrated.sksl"
 #include "src/sksl/generated/sksl_public.dehydrated.sksl"
 #include "src/sksl/generated/sksl_rt_blend.dehydrated.sksl"
@@ -242,14 +241,6 @@
     return fVertexModule;
 }
 
-const ParsedModule& Compiler::loadGeometryModule() {
-    if (!fGeometryModule.fSymbols) {
-        fGeometryModule = this->parseModule(ProgramKind::kGeometry, MODULE_DATA(geom),
-                                            this->loadGPUModule());
-    }
-    return fGeometryModule;
-}
-
 const ParsedModule& Compiler::loadPublicModule() {
     if (!fPublicModule.fSymbols) {
         fPublicModule = this->parseModule(ProgramKind::kGeneric, MODULE_DATA(public), fRootModule);
@@ -308,7 +299,6 @@
     switch (kind) {
         case ProgramKind::kVertex:             return this->loadVertexModule();             break;
         case ProgramKind::kFragment:           return this->loadFragmentModule();           break;
-        case ProgramKind::kGeometry:           return this->loadGeometryModule();           break;
         case ProgramKind::kRuntimeColorFilter: return this->loadRuntimeColorFilterModule(); break;
         case ProgramKind::kRuntimeShader:      return this->loadRuntimeShaderModule();      break;
         case ProgramKind::kRuntimeBlender:     return this->loadRuntimeBlenderModule();     break;
diff --git a/src/sksl/SkSLCompiler.h b/src/sksl/SkSLCompiler.h
index e417382..b50fd80 100644
--- a/src/sksl/SkSLCompiler.h
+++ b/src/sksl/SkSLCompiler.h
@@ -24,8 +24,6 @@
 #endif
 
 #define SK_FRAGCOLOR_BUILTIN           10001
-#define SK_IN_BUILTIN                  10002
-#define SK_OUT_BUILTIN                 10007
 #define SK_LASTFRAGCOLOR_BUILTIN       10008
 #define SK_MAIN_COORDS_BUILTIN         10009
 #define SK_INPUT_COLOR_BUILTIN         10010
@@ -34,7 +32,6 @@
 #define SK_CLOCKWISE_BUILTIN              17
 #define SK_VERTEXID_BUILTIN               42
 #define SK_INSTANCEID_BUILTIN             43
-#define SK_INVOCATIONID_BUILTIN            8
 #define SK_POSITION_BUILTIN                0
 
 class SkBitSet;
@@ -222,7 +219,6 @@
     const ParsedModule& loadGPUModule();
     const ParsedModule& loadFragmentModule();
     const ParsedModule& loadVertexModule();
-    const ParsedModule& loadGeometryModule();
     const ParsedModule& loadPublicModule();
     const ParsedModule& loadRuntimeColorFilterModule();
     const ParsedModule& loadRuntimeShaderModule();
@@ -261,7 +257,6 @@
     ParsedModule fGPUModule;                 // [Private] + GPU intrinsics, helper functions
     ParsedModule fVertexModule;              // [GPU] + Vertex stage decls
     ParsedModule fFragmentModule;            // [GPU] + Fragment stage decls
-    ParsedModule fGeometryModule;            // [GPU] + Geometry stage decls
 
     ParsedModule fPublicModule;              // [Root] + Public features
     ParsedModule fRuntimeColorFilterModule;  // [Public] + Runtime shader decls
diff --git a/src/sksl/SkSLDSLParser.cpp b/src/sksl/SkSLDSLParser.cpp
index a000eca..4596119 100644
--- a/src/sksl/SkSLDSLParser.cpp
+++ b/src/sksl/SkSLDSLParser.cpp
@@ -92,15 +92,6 @@
     TOKEN(ORIGIN_UPPER_LEFT,            "origin_upper_left");
     TOKEN(BLEND_SUPPORT_ALL_EQUATIONS,  "blend_support_all_equations");
     TOKEN(PUSH_CONSTANT,                "push_constant");
-    TOKEN(POINTS,                       "points");
-    TOKEN(LINES,                        "lines");
-    TOKEN(LINE_STRIP,                   "line_strip");
-    TOKEN(LINES_ADJACENCY,              "lines_adjacency");
-    TOKEN(TRIANGLES,                    "triangles");
-    TOKEN(TRIANGLE_STRIP,               "triangle_strip");
-    TOKEN(TRIANGLES_ADJACENCY,          "triangles_adjacency");
-    TOKEN(MAX_VERTICES,                 "max_vertices");
-    TOKEN(INVOCATIONS,                  "invocations");
     TOKEN(SRGB_UNPREMUL,                "srgb_unpremul");
     #undef TOKEN
 }
diff --git a/src/sksl/SkSLDSLParser.h b/src/sksl/SkSLDSLParser.h
index fc3f1be..a291bf6 100644
--- a/src/sksl/SkSLDSLParser.h
+++ b/src/sksl/SkSLDSLParser.h
@@ -44,15 +44,6 @@
         EARLY_FRAGMENT_TESTS,
         BLEND_SUPPORT_ALL_EQUATIONS,
         PUSH_CONSTANT,
-        POINTS,
-        LINES,
-        LINE_STRIP,
-        LINES_ADJACENCY,
-        TRIANGLES,
-        TRIANGLE_STRIP,
-        TRIANGLES_ADJACENCY,
-        MAX_VERTICES,
-        INVOCATIONS,
         MARKER,
         WHEN,
         KEY,
diff --git a/src/sksl/SkSLDehydrator.cpp b/src/sksl/SkSLDehydrator.cpp
index bce5b94..244a3b9 100644
--- a/src/sksl/SkSLDehydrator.cpp
+++ b/src/sksl/SkSLDehydrator.cpp
@@ -97,9 +97,6 @@
         this->writeS8(l.fSet);
         this->writeS16(l.fBuiltin);
         this->writeS8(l.fInputAttachmentIndex);
-        this->writeS8(l.fPrimitive);
-        this->writeS8(l.fMaxVertices);
-        this->writeS8(l.fInvocations);
     }
 }
 
diff --git a/src/sksl/SkSLIRGenerator.cpp b/src/sksl/SkSLIRGenerator.cpp
index 1c8bc24..bc856d6 100644
--- a/src/sksl/SkSLIRGenerator.cpp
+++ b/src/sksl/SkSLIRGenerator.cpp
@@ -125,8 +125,7 @@
 
 std::unique_ptr<Extension> IRGenerator::convertExtension(int offset, skstd::string_view name) {
     if (this->programKind() != ProgramKind::kFragment &&
-        this->programKind() != ProgramKind::kVertex &&
-        this->programKind() != ProgramKind::kGeometry) {
+        this->programKind() != ProgramKind::kVertex) {
         this->errorReporter().error(offset, "extensions are not allowed here");
         return nullptr;
     }
@@ -163,23 +162,7 @@
             return nullptr;
         default:
             // it's an expression
-            std::unique_ptr<Statement> result = this->convertExpressionStatement(statement);
-            if (fRTAdjust && this->programKind() == ProgramKind::kGeometry) {
-                SkASSERT(result->is<ExpressionStatement>());
-                Expression& expr = *result->as<ExpressionStatement>().expression();
-                if (expr.is<FunctionCall>()) {
-                    FunctionCall& fc = expr.as<FunctionCall>();
-                    if (fc.function().isBuiltin() && fc.function().name() == "EmitVertex") {
-                        StatementArray statements;
-                        statements.reserve_back(2);
-                        statements.push_back(getNormalizeSkPositionCode());
-                        statements.push_back(std::move(result));
-                        return Block::Make(statement.fOffset, std::move(statements),
-                                           fSymbolTable, /*isScope=*/true);
-                    }
-                }
-            }
-            return result;
+            return this->convertExpressionStatement(statement);
     }
 }
 
@@ -412,32 +395,13 @@
 
 std::unique_ptr<ModifiersDeclaration> IRGenerator::convertModifiersDeclaration(const ASTNode& m) {
     if (this->programKind() != ProgramKind::kFragment &&
-        this->programKind() != ProgramKind::kVertex &&
-        this->programKind() != ProgramKind::kGeometry) {
+        this->programKind() != ProgramKind::kVertex) {
         this->errorReporter().error(m.fOffset, "layout qualifiers are not allowed here");
         return nullptr;
     }
 
     SkASSERT(m.fKind == ASTNode::Kind::kModifiers);
     Modifiers modifiers = m.getModifiers();
-    if (modifiers.fLayout.fInvocations != -1) {
-        if (this->programKind() != ProgramKind::kGeometry) {
-            this->errorReporter().error(m.fOffset,
-                                        "'invocations' is only legal in geometry shaders");
-            return nullptr;
-        }
-        fInvocations = modifiers.fLayout.fInvocations;
-        if (!this->caps().gsInvocationsSupport()) {
-            modifiers.fLayout.fInvocations = -1;
-            if (modifiers.fLayout.description() == "") {
-                return nullptr;
-            }
-        }
-    }
-    if (modifiers.fLayout.fMaxVertices != -1 && fInvocations > 0 &&
-        !this->caps().gsInvocationsSupport()) {
-        modifiers.fLayout.fMaxVertices *= fInvocations;
-    }
     return std::make_unique<ModifiersDeclaration>(this->modifiersPool().add(modifiers));
 }
 
@@ -630,39 +594,6 @@
     return DiscardStatement::Make(d.fOffset);
 }
 
-std::unique_ptr<Block> IRGenerator::applyInvocationIDWorkaround(std::unique_ptr<Block> main) {
-    Layout invokeLayout;
-    Modifiers invokeModifiers(invokeLayout, Modifiers::kHasSideEffects_Flag);
-    const FunctionDeclaration* invokeDecl = fSymbolTable->add(std::make_unique<FunctionDeclaration>(
-            /*offset=*/-1,
-            this->modifiersPool().add(invokeModifiers),
-            "_invoke",
-            std::vector<const Variable*>(),
-            fContext.fTypes.fVoid.get(),
-            fIsBuiltinCode));
-    IntrinsicSet referencedIntrinsics;
-    main = this->finalizeFunction(*invokeDecl, std::move(main), &referencedIntrinsics);
-    auto invokeDef = std::make_unique<FunctionDefinition>(/*offset=*/-1, invokeDecl,
-                                                          fIsBuiltinCode, std::move(main),
-                                                          std::move(referencedIntrinsics));
-    invokeDecl->setDefinition(invokeDef.get());
-    fProgramElements->push_back(std::move(invokeDef));
-
-    using namespace SkSL::dsl;
-    DSLGlobalVar loopIdx("sk_InvocationID");
-    std::unique_ptr<Expression> endPrimitive = this->convertIdentifier(/*offset=*/-1,
-                                                                       "EndPrimitive");
-    SkASSERT(endPrimitive);
-
-    std::unique_ptr<Statement> block = DSLBlock(
-        For(loopIdx = 0, loopIdx < fInvocations, loopIdx++, DSLBlock(
-            DSLFunction(invokeDecl)(),
-            DSLExpression(std::move(endPrimitive))({})
-        ))
-    ).release();
-    return std::unique_ptr<Block>(&block.release()->as<Block>());
-}
-
 std::unique_ptr<Statement> IRGenerator::getNormalizeSkPositionCode() {
     using namespace SkSL::dsl;
     using SkSL::dsl::Swizzle;  // disambiguate from SkSL::Swizzle
@@ -743,9 +674,6 @@
         { Layout::kSet_Flag,                      "set"},
         { Layout::kBuiltin_Flag,                  "builtin"},
         { Layout::kInputAttachmentIndex_Flag,     "input_attachment_index"},
-        { Layout::kPrimitive_Flag,                "primitive-type"},
-        { Layout::kMaxVertices_Flag,              "max_vertices"},
-        { Layout::kInvocations_Flag,              "invocations"},
     };
 
     int layoutFlags = modifiers.fLayout.fFlags;
@@ -765,11 +693,6 @@
                                                      std::unique_ptr<Block> body,
                                                      IntrinsicSet* referencedIntrinsics) {
     bool isMain = funcDecl.isMain();
-    bool needInvocationIDWorkaround = fInvocations != -1 && isMain &&
-                                      !this->caps().gsInvocationsSupport();
-    if (needInvocationIDWorkaround) {
-        body = this->applyInvocationIDWorkaround(std::move(body));
-    }
     if (ProgramKind::kVertex == this->programKind() && isMain && fRTAdjust) {
         body->children().push_back(this->getNormalizeSkPositionCode());
     }
@@ -880,8 +803,7 @@
 
 std::unique_ptr<SkSL::InterfaceBlock> IRGenerator::convertInterfaceBlock(const ASTNode& intf) {
     if (this->programKind() != ProgramKind::kFragment &&
-        this->programKind() != ProgramKind::kVertex &&
-        this->programKind() != ProgramKind::kGeometry) {
+        this->programKind() != ProgramKind::kVertex) {
         this->errorReporter().error(intf.fOffset, "interface block is not allowed here");
         return nullptr;
     }
@@ -1464,30 +1386,11 @@
     fIsBuiltinCode = isBuiltinCode;
 
     fInputs = {};
-    fInvocations = -1;
     fRTAdjust = nullptr;
     fRTAdjustInterfaceBlock = nullptr;
     fDefinedStructs.clear();
     this->pushSymbolTable();
 
-    if (this->programKind() == ProgramKind::kGeometry && !fIsBuiltinCode) {
-        // Declare sk_InvocationID programmatically. With invocations support, it's an 'in' builtin.
-        // If we're applying the workaround, then it's a plain global.
-        bool workaround = !this->caps().gsInvocationsSupport();
-        Modifiers m;
-        if (!workaround) {
-            m.fFlags = Modifiers::kIn_Flag;
-            m.fLayout.fBuiltin = SK_INVOCATIONID_BUILTIN;
-        }
-        auto var = std::make_unique<Variable>(/*offset=*/-1, this->modifiersPool().add(m),
-                                              "sk_InvocationID", fContext.fTypes.fInt.get(),
-                                              /*builtin=*/false, Variable::Storage::kGlobal);
-        auto decl = VarDeclaration::Make(fContext, var.get(), fContext.fTypes.fInt.get(),
-                                         /*arraySize=*/0, /*value=*/nullptr);
-        fSymbolTable->add(std::move(var));
-        fProgramElements->push_back(std::make_unique<GlobalVarDeclaration>(std::move(decl)));
-    }
-
     if (this->settings().fExternalFunctions) {
         // Add any external values to the new symbol table, so they're only visible to this Program.
         for (const std::unique_ptr<ExternalFunction>& ef : *this->settings().fExternalFunctions) {
diff --git a/src/sksl/SkSLIRGenerator.h b/src/sksl/SkSLIRGenerator.h
index e23078f..348ec56 100644
--- a/src/sksl/SkSLIRGenerator.h
+++ b/src/sksl/SkSLIRGenerator.h
@@ -221,7 +221,6 @@
     std::unique_ptr<Statement> convertVarDeclarationStatement(const ASTNode& s);
     std::unique_ptr<Statement> convertWhile(const ASTNode& w);
     void convertGlobalVarDeclarations(const ASTNode& decl);
-    std::unique_ptr<Block> applyInvocationIDWorkaround(std::unique_ptr<Block> main);
     // returns a statement which converts sk_Position from device to normalized coordinates
     std::unique_ptr<Statement> getNormalizeSkPositionCode();
 
@@ -262,7 +261,6 @@
     std::shared_ptr<SymbolTable> fSymbolTable = nullptr;
     // Symbols which have definitions in the include files.
     IRIntrinsicMap* fIntrinsics = nullptr;
-    int fInvocations;
     std::unordered_set<const Type*> fDefinedStructs;
     std::vector<std::unique_ptr<ProgramElement>>* fProgramElements = nullptr;
     std::vector<const ProgramElement*>*           fSharedElements = nullptr;
diff --git a/src/sksl/SkSLIntrinsicList.h b/src/sksl/SkSLIntrinsicList.h
index 207192a..a12c8d9 100644
--- a/src/sksl/SkSLIntrinsicList.h
+++ b/src/sksl/SkSLIntrinsicList.h
@@ -33,8 +33,6 @@
     SKSL_INTRINSIC(dFdy)             \
     SKSL_INTRINSIC(distance)         \
     SKSL_INTRINSIC(dot)              \
-    SKSL_INTRINSIC(EmitVertex)       \
-    SKSL_INTRINSIC(EndPrimitive)     \
     SKSL_INTRINSIC(equal)            \
     SKSL_INTRINSIC(exp2)             \
     SKSL_INTRINSIC(exp)              \
diff --git a/src/sksl/SkSLMain.cpp b/src/sksl/SkSLMain.cpp
index 6ba03c8..f66b939 100644
--- a/src/sksl/SkSLMain.cpp
+++ b/src/sksl/SkSLMain.cpp
@@ -139,18 +139,6 @@
                     static auto s_emulateAbsIntCaps = Factory::EmulateAbsIntFunction();
                     *caps = s_emulateAbsIntCaps.get();
                 }
-                if (settingsText.consumeSuffix(" GeometryShaderExtensionString")) {
-                    static auto s_geometryExtCaps = Factory::GeometryShaderExtensionString();
-                    *caps = s_geometryExtCaps.get();
-                }
-                if (settingsText.consumeSuffix(" GeometryShaderSupport")) {
-                    static auto s_geometryShaderCaps = Factory::GeometryShaderSupport();
-                    *caps = s_geometryShaderCaps.get();
-                }
-                if (settingsText.consumeSuffix(" GSInvocationsExtensionString")) {
-                    static auto s_gsInvocationCaps = Factory::GSInvocationsExtensionString();
-                    *caps = s_gsInvocationCaps.get();
-                }
                 if (settingsText.consumeSuffix(" IncompleteShortIntPrecision")) {
                     static auto s_incompleteShortIntCaps = Factory::IncompleteShortIntPrecision();
                     *caps = s_incompleteShortIntCaps.get();
@@ -168,10 +156,6 @@
                             Factory::MustForceNegatedLdexpParamToMultiply();
                     *caps = s_negativeLdexpCaps.get();
                 }
-                if (settingsText.consumeSuffix(" NoGSInvocationsSupport")) {
-                    static auto s_noGSInvocations = Factory::NoGSInvocationsSupport();
-                    *caps = s_noGSInvocations.get();
-                }
                 if (settingsText.consumeSuffix(" RemovePowWithConstantExponent")) {
                     static auto s_powCaps = Factory::RemovePowWithConstantExponent();
                     *caps = s_powCaps.get();
@@ -281,8 +265,6 @@
         kind = SkSL::ProgramKind::kVertex;
     } else if (inputPath.ends_with(".frag") || inputPath.ends_with(".sksl")) {
         kind = SkSL::ProgramKind::kFragment;
-    } else if (inputPath.ends_with(".geom")) {
-        kind = SkSL::ProgramKind::kGeometry;
     } else if (inputPath.ends_with(".rtb")) {
         kind = SkSL::ProgramKind::kRuntimeBlender;
     } else if (inputPath.ends_with(".rtcf")) {
@@ -290,7 +272,7 @@
     } else if (inputPath.ends_with(".rts")) {
         kind = SkSL::ProgramKind::kRuntimeShader;
     } else {
-        printf("input filename must end in '.vert', '.frag', '.geom', '.rtb', '.rtcf', "
+        printf("input filename must end in '.vert', '.frag', '.rtb', '.rtcf', "
                "'.rts', or '.sksl'\n");
         return ResultCode::kInputError;
     }
@@ -354,8 +336,7 @@
                 [](SkSL::Compiler& compiler, SkSL::Program& program, SkSL::OutputStream& out) {
                     return compiler.toSPIRV(program, out);
                 });
-    } else if (outputPath.ends_with(".asm.frag") || outputPath.ends_with(".asm.vert") ||
-               outputPath.ends_with(".asm.geom")) {
+    } else if (outputPath.ends_with(".asm.frag") || outputPath.ends_with(".asm.vert")) {
         return compileProgram(
                 [](SkSL::Compiler& compiler, SkSL::Program& program, SkSL::OutputStream& out) {
                     // Compile program to SPIR-V assembly in a string-stream.
@@ -489,7 +470,7 @@
         }
     } else {
         printf("expected output path to end with one of: .glsl, .metal, .spirv, .asm.frag, .skvm, "
-               ".stage, .asm.vert, .asm.geom, .cpp, .h (got '%s')\n", outputPath.c_str());
+               ".stage, .asm.vert (got '%s')\n", outputPath.c_str());
         return ResultCode::kConfigurationError;
     }
     return ResultCode::kSuccess;
diff --git a/src/sksl/SkSLParser.cpp b/src/sksl/SkSLParser.cpp
index 3a3ae6a..9d7de5d 100644
--- a/src/sksl/SkSLParser.cpp
+++ b/src/sksl/SkSLParser.cpp
@@ -100,15 +100,6 @@
     TOKEN(ORIGIN_UPPER_LEFT,            "origin_upper_left");
     TOKEN(BLEND_SUPPORT_ALL_EQUATIONS,  "blend_support_all_equations");
     TOKEN(PUSH_CONSTANT,                "push_constant");
-    TOKEN(POINTS,                       "points");
-    TOKEN(LINES,                        "lines");
-    TOKEN(LINE_STRIP,                   "line_strip");
-    TOKEN(LINES_ADJACENCY,              "lines_adjacency");
-    TOKEN(TRIANGLES,                    "triangles");
-    TOKEN(TRIANGLE_STRIP,               "triangle_strip");
-    TOKEN(TRIANGLES_ADJACENCY,          "triangles_adjacency");
-    TOKEN(MAX_VERTICES,                 "max_vertices");
-    TOKEN(INVOCATIONS,                  "invocations");
     TOKEN(SRGB_UNPREMUL,                "srgb_unpremul");
     #undef TOKEN
 }
@@ -684,13 +675,10 @@
     int set = -1;
     int builtin = -1;
     int inputAttachmentIndex = -1;
-    Layout::Primitive primitive = Layout::kUnspecified_Primitive;
-    int maxVertices = -1;
-    int invocations = -1;
     if (this->checkNext(Token::Kind::TK_LAYOUT)) {
         if (!this->expect(Token::Kind::TK_LPAREN, "'('")) {
-            return Layout(flags, location, offset, binding, index, set, builtin,
-                          inputAttachmentIndex, primitive, maxVertices, invocations);
+            return Layout(
+                    flags, location, offset, binding, index, set, builtin, inputAttachmentIndex);
         }
         for (;;) {
             Token t = this->nextToken();
@@ -701,13 +689,6 @@
                 }
                 flags |= f;
             };
-            auto setPrimitive = [&](Layout::Primitive p) {
-                if (flags & Layout::kPrimitive_Flag) {
-                    this->error(t, "only one primitive-type layout qualifier is allowed");
-                }
-                flags |= Layout::kPrimitive_Flag;
-                primitive = p;
-            };
 
             auto found = layoutTokens->find(text);
             if (found != layoutTokens->end()) {
@@ -752,35 +733,6 @@
                         setFlag(Layout::kInputAttachmentIndex_Flag);
                         inputAttachmentIndex = this->layoutInt();
                         break;
-                    case LayoutToken::POINTS:
-                        setPrimitive(Layout::kPoints_Primitive);
-                        break;
-                    case LayoutToken::LINES:
-                        setPrimitive(Layout::kLines_Primitive);
-                        break;
-                    case LayoutToken::LINE_STRIP:
-                        setPrimitive(Layout::kLineStrip_Primitive);
-                        break;
-                    case LayoutToken::LINES_ADJACENCY:
-                        setPrimitive(Layout::kLinesAdjacency_Primitive);
-                        break;
-                    case LayoutToken::TRIANGLES:
-                        setPrimitive(Layout::kTriangles_Primitive);
-                        break;
-                    case LayoutToken::TRIANGLE_STRIP:
-                        setPrimitive(Layout::kTriangleStrip_Primitive);
-                        break;
-                    case LayoutToken::TRIANGLES_ADJACENCY:
-                        setPrimitive(Layout::kTrianglesAdjacency_Primitive);
-                        break;
-                    case LayoutToken::MAX_VERTICES:
-                        setFlag(Layout::kMaxVertices_Flag);
-                        maxVertices = this->layoutInt();
-                        break;
-                    case LayoutToken::INVOCATIONS:
-                        setFlag(Layout::kInvocations_Flag);
-                        invocations = this->layoutInt();
-                        break;
                     default:
                         this->error(t, "'" + text + "' is not a valid layout qualifier");
                         break;
@@ -796,8 +748,7 @@
             }
         }
     }
-    return Layout(flags, location, offset, binding, index, set, builtin, inputAttachmentIndex,
-                  primitive, maxVertices, invocations);
+    return Layout(flags, location, offset, binding, index, set, builtin, inputAttachmentIndex);
 }
 
 /* layout? (UNIFORM | CONST | IN | OUT | INOUT | FLAT | NOPERSPECTIVE | INLINE)* */
diff --git a/src/sksl/SkSLParser.h b/src/sksl/SkSLParser.h
index c9bc418..73d2d1e 100644
--- a/src/sksl/SkSLParser.h
+++ b/src/sksl/SkSLParser.h
@@ -40,15 +40,6 @@
         ORIGIN_UPPER_LEFT,
         BLEND_SUPPORT_ALL_EQUATIONS,
         PUSH_CONSTANT,
-        POINTS,
-        LINES,
-        LINE_STRIP,
-        LINES_ADJACENCY,
-        TRIANGLES,
-        TRIANGLE_STRIP,
-        TRIANGLES_ADJACENCY,
-        MAX_VERTICES,
-        INVOCATIONS,
         SRGB_UNPREMUL,
     };
 
diff --git a/src/sksl/SkSLRehydrator.cpp b/src/sksl/SkSLRehydrator.cpp
index 6ed4ad5..1d0ae02 100644
--- a/src/sksl/SkSLRehydrator.cpp
+++ b/src/sksl/SkSLRehydrator.cpp
@@ -107,12 +107,8 @@
             int set = this->readS8();
             int builtin = this->readS16();
             int inputAttachmentIndex = this->readS8();
-            int primitive = this->readS8();
-            int maxVertices = this->readS8();
-            int invocations = this->readS8();
-            return Layout(flags, location, offset, binding, index, set, builtin,
-                          inputAttachmentIndex, (Layout::Primitive)primitive, maxVertices,
-                          invocations);
+            return Layout(
+                    flags, location, offset, binding, index, set, builtin, inputAttachmentIndex);
         }
         default:
             SkASSERT(false);
diff --git a/src/sksl/SkSLRehydrator.h b/src/sksl/SkSLRehydrator.h
index 7d2dfde..113258a 100644
--- a/src/sksl/SkSLRehydrator.h
+++ b/src/sksl/SkSLRehydrator.h
@@ -99,8 +99,7 @@
         // int32 value
         kIntLiteral_Command,
         // int32 flags, int8 location, int8 offset, int8 binding, int8 index, int8 set,
-        // int16 builtin, int8 inputAttachmentIndex, int8 format, int8 primitive, int8 maxVertices,
-        // int8 invocations, String marker, String when, int8 key, int8 ctype
+        // int16 builtin, int8 inputAttachmentIndex
         kLayout_Command,
         // Layout layout, uint8 flags
         kModifiers8Bit_Command,
diff --git a/src/sksl/SkSLUtil.h b/src/sksl/SkSLUtil.h
index 16f8825..aab1444 100644
--- a/src/sksl/SkSLUtil.h
+++ b/src/sksl/SkSLUtil.h
@@ -75,11 +75,6 @@
         return fMustForceNegatedLdexpParamToMultiply;
     }
 
-    bool fGeometryShaderSupport = true;
-    bool geometryShaderSupport() const {
-        return fGeometryShaderSupport;
-    }
-
     bool fShaderDerivativeSupport = true;
     bool shaderDerivativeSupport() const {
         return fShaderDerivativeSupport;
@@ -212,16 +207,6 @@
         return fFragCoordConventionsExtensionString;
     }
 
-    const char* fGeometryShaderExtensionString = nullptr;
-    const char* geometryShaderExtensionString() const {
-        return fGeometryShaderExtensionString;
-    }
-
-    const char* fGSInvocationsExtensionString = nullptr;
-    const char* gsInvocationsExtensionString() const {
-        return fGSInvocationsExtensionString;
-    }
-
     const char* fExternalTextureExtensionString = nullptr;
     const char* externalTextureExtensionString() const {
         return fExternalTextureExtensionString;
@@ -237,11 +222,6 @@
         return fVersionDeclString;
     }
 
-    bool fGSInvocationsSupport = true;
-    bool gsInvocationsSupport() const {
-        return fGSInvocationsSupport;
-    }
-
     bool fCanUseFractForNegativeValues = true;
     bool canUseFractForNegativeValues() const {
         return fCanUseFractForNegativeValues;
@@ -366,32 +346,6 @@
         return result;
     }
 
-    static ShaderCapsPointer GeometryShaderExtensionString() {
-        ShaderCapsPointer result = MakeShaderCaps();
-        result->fVersionDeclString = "#version 310es";
-        result->fGeometryShaderSupport = true;
-        result->fGeometryShaderExtensionString = "GL_EXT_geometry_shader";
-        result->fGSInvocationsSupport = true;
-        return result;
-    }
-
-    static ShaderCapsPointer GeometryShaderSupport() {
-        ShaderCapsPointer result = MakeShaderCaps();
-        result->fVersionDeclString = "#version 400";
-        result->fGeometryShaderSupport = true;
-        result->fGSInvocationsSupport = true;
-        return result;
-    }
-
-    static ShaderCapsPointer GSInvocationsExtensionString() {
-        ShaderCapsPointer result = MakeShaderCaps();
-        result->fVersionDeclString = "#version 400";
-        result->fGeometryShaderSupport = true;
-        result->fGSInvocationsSupport = true;
-        result->fGSInvocationsExtensionString = "GL_ARB_gpu_shader5";
-        return result;
-    }
-
     static ShaderCapsPointer IncompleteShortIntPrecision() {
         ShaderCapsPointer result = MakeShaderCaps();
         result->fVersionDeclString = "#version 310es";
@@ -420,14 +374,6 @@
         return result;
     }
 
-    static ShaderCapsPointer NoGSInvocationsSupport() {
-        ShaderCapsPointer result = MakeShaderCaps();
-        result->fVersionDeclString = "#version 400";
-        result->fGeometryShaderSupport = true;
-        result->fGSInvocationsSupport = false;
-        return result;
-    }
-
     static ShaderCapsPointer RemovePowWithConstantExponent() {
         ShaderCapsPointer result = MakeShaderCaps();
         result->fVersionDeclString = "#version 400";
diff --git a/src/sksl/codegen/SkSLGLSLCodeGenerator.cpp b/src/sksl/codegen/SkSLGLSLCodeGenerator.cpp
index 05332df..81087d9 100644
--- a/src/sksl/codegen/SkSLGLSLCodeGenerator.cpp
+++ b/src/sksl/codegen/SkSLGLSLCodeGenerator.cpp
@@ -784,12 +784,6 @@
         case SK_INSTANCEID_BUILTIN:
             this->write("gl_InstanceID");
             break;
-        case SK_IN_BUILTIN:
-            this->write("gl_in");
-            break;
-        case SK_INVOCATIONID_BUILTIN:
-            this->write("gl_InvocationID");
-            break;
         case SK_LASTFRAGCOLOR_BUILTIN:
             this->write(this->caps().fbFetchColorName());
             break;
@@ -1448,12 +1442,6 @@
             break;
         case ProgramElement::Kind::kModifiers: {
             const Modifiers& modifiers = e.as<ModifiersDeclaration>().modifiers();
-            if (!fFoundGSInvocations && modifiers.fLayout.fInvocations >= 0) {
-                if (this->caps().gsInvocationsExtensionString()) {
-                    this->writeExtension(this->caps().gsInvocationsExtensionString());
-                }
-                fFoundGSInvocations = true;
-            }
             this->writeModifiers(modifiers, true);
             this->writeLine(";");
             break;
@@ -1478,10 +1466,6 @@
 
 bool GLSLCodeGenerator::generateCode() {
     this->writeHeader();
-    if (fProgram.fConfig->fKind == ProgramKind::kGeometry &&
-        this->caps().geometryShaderExtensionString()) {
-        this->writeExtension(this->caps().geometryShaderExtensionString());
-    }
     OutputStream* rawOut = fOut;
     StringStream body;
     fOut = &body;
diff --git a/src/sksl/codegen/SkSLGLSLCodeGenerator.h b/src/sksl/codegen/SkSLGLSLCodeGenerator.h
index 8615baa..a0ba2a4 100644
--- a/src/sksl/codegen/SkSLGLSLCodeGenerator.h
+++ b/src/sksl/codegen/SkSLGLSLCodeGenerator.h
@@ -189,7 +189,6 @@
     bool fFoundDerivatives = false;
     bool fFoundExternalSamplerDecl = false;
     bool fFoundRectSamplerDecl = false;
-    bool fFoundGSInvocations = false;
     bool fSetupClockwise = false;
     bool fSetupFragPosition = false;
     bool fSetupFragCoordWorkaround = false;
diff --git a/src/sksl/codegen/SkSLSPIRVCodeGenerator.cpp b/src/sksl/codegen/SkSLSPIRVCodeGenerator.cpp
index a4baece..a1e0698 100644
--- a/src/sksl/codegen/SkSLSPIRVCodeGenerator.cpp
+++ b/src/sksl/codegen/SkSLSPIRVCodeGenerator.cpp
@@ -171,8 +171,6 @@
                                                                       SpvOpSGreaterThanEqual,
                                                                       SpvOpUGreaterThanEqual,
                                                                       SpvOpUndef);
-    fIntrinsicMap[k_EmitVertex_IntrinsicKind]       = ALL_SPIRV(EmitVertex);
-    fIntrinsicMap[k_EndPrimitive_IntrinsicKind]     = ALL_SPIRV(EndPrimitive);
 // interpolateAt* not yet supported...
 }
 
@@ -399,12 +397,7 @@
             this->writeInstruction(SpvOpCapability, (SpvId) i, out);
         }
     }
-    if (fProgram.fConfig->fKind == ProgramKind::kGeometry) {
-        this->writeInstruction(SpvOpCapability, SpvCapabilityGeometry, out);
-    }
-    else {
-        this->writeInstruction(SpvOpCapability, SpvCapabilityShader, out);
-    }
+    this->writeInstruction(SpvOpCapability, SpvCapabilityShader, out);
 }
 
 SpvId SPIRVCodeGenerator::nextId(const Type* type) {
@@ -1999,13 +1992,7 @@
                                                        /*isMemoryObjectPointer=*/true,
                                                        this->getType(type), precision);
             }
-            SpvId typeId;
-            if (var.modifiers().fLayout.fBuiltin == SK_IN_BUILTIN) {
-                typeId = this->getType(*Type::MakeArrayType("sk_in", var.type().componentType(),
-                                                            fSkInCount));
-            } else {
-                typeId = this->getType(type, this->memoryLayoutForVariable(var));
-            }
+            SpvId typeId = this->getType(type, this->memoryLayoutForVariable(var));
             auto entry = fVariableMap.find(&var);
             SkASSERTF(entry != fVariableMap.end(), "%s", expr.description().c_str());
             return std::make_unique<PointerLValue>(*this, entry->second,
@@ -2979,8 +2966,7 @@
                                layout.fInputAttachmentIndex, fDecorationBuffer);
         fCapabilities |= (((uint64_t) 1) << SpvCapabilityInputAttachment);
     }
-    if (layout.fBuiltin >= 0 && layout.fBuiltin != SK_FRAGCOLOR_BUILTIN &&
-        layout.fBuiltin != SK_IN_BUILTIN && layout.fBuiltin != SK_OUT_BUILTIN) {
+    if (layout.fBuiltin >= 0 && layout.fBuiltin != SK_FRAGCOLOR_BUILTIN) {
         this->writeInstruction(SpvOpDecorate, target, SpvDecorationBuiltIn, layout.fBuiltin,
                                fDecorationBuffer);
     }
@@ -3018,28 +3004,6 @@
     return pushConstant ? MemoryLayout(MemoryLayout::k430_Standard) : fDefaultLayout;
 }
 
-static void update_sk_in_count(const Modifiers& m, int* outSkInCount) {
-    switch (m.fLayout.fPrimitive) {
-        case Layout::kPoints_Primitive:
-            *outSkInCount = 1;
-            break;
-        case Layout::kLines_Primitive:
-            *outSkInCount = 2;
-            break;
-        case Layout::kLinesAdjacency_Primitive:
-            *outSkInCount = 4;
-            break;
-        case Layout::kTriangles_Primitive:
-            *outSkInCount = 3;
-            break;
-        case Layout::kTrianglesAdjacency_Primitive:
-            *outSkInCount = 6;
-            break;
-        default:
-            return;
-    }
-}
-
 SpvId SPIRVCodeGenerator::writeInterfaceBlock(const InterfaceBlock& intf, bool appendRTFlip) {
     MemoryLayout memoryLayout = this->memoryLayoutForVariable(intf.variable());
     SpvId result = this->nextId(nullptr);
@@ -3063,10 +3027,7 @@
                                              /*index=*/-1,
                                              /*set=*/-1,
                                              /*builtin=*/-1,
-                                             /*inputAttachmentIndex=*/-1,
-                                             Layout::kUnspecified_Primitive,
-                                             /*maxVertices=*/1,
-                                             /*invocations=*/-1),
+                                             /*inputAttachmentIndex=*/-1),
                                       /*flags=*/0),
                             SKSL_RTFLIP_NAME,
                             fContext.fTypes.fFloat2.get());
@@ -3096,20 +3057,8 @@
         fWroteRTFlip = true;
         return result;
     }
-    SpvId typeId;
     const Modifiers& intfModifiers = intfVar.modifiers();
-    if (intfModifiers.fLayout.fBuiltin == SK_IN_BUILTIN) {
-        for (const ProgramElement* e : fProgram.elements()) {
-            if (e->is<ModifiersDeclaration>()) {
-                const Modifiers& m = e->as<ModifiersDeclaration>().modifiers();
-                update_sk_in_count(m, &fSkInCount);
-            }
-        }
-        typeId = this->getType(*Type::MakeArrayType("sk_in", type.componentType(), fSkInCount),
-                               memoryLayout);
-    } else {
-        typeId = this->getType(type, memoryLayout);
-    }
+    SpvId typeId = this->getType(type, memoryLayout);
     if (intfModifiers.fLayout.fBuiltin == -1) {
         this->writeInstruction(SpvOpDecorate, typeId, SpvDecorationBlock, fDecorationBuffer);
     }
@@ -3170,14 +3119,7 @@
     }
     SpvId id = this->nextId(&type);
     fVariableMap[&var] = id;
-    SpvId typeId;
-    if (var.modifiers().fLayout.fBuiltin == SK_IN_BUILTIN) {
-        typeId = this->getPointerType(
-                *Type::MakeArrayType("sk_in", type.componentType(), fSkInCount),
-                storageClass);
-    } else {
-        typeId = this->getPointerType(type, storageClass);
-    }
+    SpvId typeId = this->getPointerType(type, storageClass);
     this->writeInstruction(SpvOpVariable, typeId, id, storageClass, fConstantBuffer);
     this->writeInstruction(SpvOpName, id, var.name(), fNameBuffer);
     if (varDecl.value()) {
@@ -3407,72 +3349,6 @@
     }
 }
 
-void SPIRVCodeGenerator::writeGeometryShaderExecutionMode(SpvId entryPoint, OutputStream& out) {
-    SkASSERT(fProgram.fConfig->fKind == ProgramKind::kGeometry);
-    int invocations = 1;
-    for (const ProgramElement* e : fProgram.elements()) {
-        if (e->is<ModifiersDeclaration>()) {
-            const Modifiers& m = e->as<ModifiersDeclaration>().modifiers();
-            if (m.fFlags & Modifiers::kIn_Flag) {
-                if (m.fLayout.fInvocations != -1) {
-                    invocations = m.fLayout.fInvocations;
-                }
-                SpvId input;
-                switch (m.fLayout.fPrimitive) {
-                    case Layout::kPoints_Primitive:
-                        input = SpvExecutionModeInputPoints;
-                        break;
-                    case Layout::kLines_Primitive:
-                        input = SpvExecutionModeInputLines;
-                        break;
-                    case Layout::kLinesAdjacency_Primitive:
-                        input = SpvExecutionModeInputLinesAdjacency;
-                        break;
-                    case Layout::kTriangles_Primitive:
-                        input = SpvExecutionModeTriangles;
-                        break;
-                    case Layout::kTrianglesAdjacency_Primitive:
-                        input = SpvExecutionModeInputTrianglesAdjacency;
-                        break;
-                    default:
-                        input = 0;
-                        break;
-                }
-                update_sk_in_count(m, &fSkInCount);
-                if (input) {
-                    this->writeInstruction(SpvOpExecutionMode, entryPoint, input, out);
-                }
-            } else if (m.fFlags & Modifiers::kOut_Flag) {
-                SpvId output;
-                switch (m.fLayout.fPrimitive) {
-                    case Layout::kPoints_Primitive:
-                        output = SpvExecutionModeOutputPoints;
-                        break;
-                    case Layout::kLineStrip_Primitive:
-                        output = SpvExecutionModeOutputLineStrip;
-                        break;
-                    case Layout::kTriangleStrip_Primitive:
-                        output = SpvExecutionModeOutputTriangleStrip;
-                        break;
-                    default:
-                        output = 0;
-                        break;
-                }
-                if (output) {
-                    this->writeInstruction(SpvOpExecutionMode, entryPoint, output, out);
-                }
-                if (m.fLayout.fMaxVertices != -1) {
-                    this->writeInstruction(SpvOpExecutionMode, entryPoint,
-                                           SpvExecutionModeOutputVertices, m.fLayout.fMaxVertices,
-                                           out);
-                }
-            }
-        }
-    }
-    this->writeInstruction(SpvOpExecutionMode, entryPoint, SpvExecutionModeInvocations,
-                           invocations, out);
-}
-
 // Given any function, returns the top-level symbol table (OUTSIDE of the function's scope).
 static std::shared_ptr<SymbolTable> get_top_level_symbol_table(const FunctionDeclaration& anyFunc) {
     return anyFunc.definition()->body()->as<Block>().symbolTable()->fParent;
@@ -3603,10 +3479,7 @@
                                          /*index=*/-1,
                                          /*set=*/-1,
                                          /*builtin=*/-1,
-                                         /*inputAttachmentIndex=*/-1,
-                                         Layout::kUnspecified_Primitive,
-                                         /*maxVertices=*/1,
-                                         /*invocations=*/-1),
+                                         /*inputAttachmentIndex=*/-1),
                                   /*flags=*/0),
                         SKSL_RTFLIP_NAME,
                         fContext.fTypes.fFloat2.get());
@@ -3633,10 +3506,7 @@
                                    /*index=*/-1,
                                    set,
                                    /*builtin=*/-1,
-                                   /*inputAttachmentIndex=*/-1,
-                                   Layout::kUnspecified_Primitive,
-                                   /*maxVertices=*/-1,
-                                   /*invocations=*/-1),
+                                   /*inputAttachmentIndex=*/-1),
                             Modifiers::kUniform_Flag);
         modsPtr = fProgram.fModifiers->add(modifiers);
     }
@@ -3745,9 +3615,6 @@
         case ProgramKind::kFragment:
             this->writeWord(SpvExecutionModelFragment, out);
             break;
-        case ProgramKind::kGeometry:
-            this->writeWord(SpvExecutionModelGeometry, out);
-            break;
         default:
             SK_ABORT("cannot write this kind of program to SPIR-V\n");
     }
@@ -3757,9 +3624,6 @@
     for (int var : interfaceVars) {
         this->writeWord(var, out);
     }
-    if (program.fConfig->fKind == ProgramKind::kGeometry) {
-        this->writeGeometryShaderExecutionMode(entryPoint, out);
-    }
     if (program.fConfig->fKind == ProgramKind::kFragment) {
         this->writeInstruction(SpvOpExecutionMode,
                                fFunctionMap[main],
diff --git a/src/sksl/codegen/SkSLSPIRVCodeGenerator.h b/src/sksl/codegen/SkSLSPIRVCodeGenerator.h
index e201e99..03650c3 100644
--- a/src/sksl/codegen/SkSLSPIRVCodeGenerator.h
+++ b/src/sksl/codegen/SkSLSPIRVCodeGenerator.h
@@ -440,8 +440,6 @@
                           int32_t word5, int32_t word6, int32_t word7, int32_t word8,
                           OutputStream& out);
 
-    void writeGeometryShaderExecutionMode(SpvId entryPoint, OutputStream& out);
-
     bool isDead(const Variable& var) const;
 
     MemoryLayout memoryLayoutForVariable(const Variable&) const;
diff --git a/src/sksl/dsl/DSLVar.cpp b/src/sksl/dsl/DSLVar.cpp
index 9fb8abb..ae370f7 100644
--- a/src/sksl/dsl/DSLVar.cpp
+++ b/src/sksl/dsl/DSLVar.cpp
@@ -115,9 +115,7 @@
         const SkSL::Modifiers* modifiers = DSLWriter::Context().fModifiersPool->add(
                 SkSL::Modifiers(SkSL::Layout(/*flags=*/0, /*location=*/-1, /*offset=*/-1,
                                              /*binding=*/-1, /*index=*/-1, /*set=*/-1,
-                                             SK_MAIN_COORDS_BUILTIN, /*inputAttachmentIndex=*/-1,
-                                             Layout::kUnspecified_Primitive, /*maxVertices=*/1,
-                                             /*invocations=*/-1),
+                                             SK_MAIN_COORDS_BUILTIN, /*inputAttachmentIndex=*/-1),
                                 SkSL::Modifiers::kNo_Flag));
 
         fVar = DSLWriter::SymbolTable()->takeOwnershipOfIRNode(std::make_unique<SkSL::Variable>(
diff --git a/src/sksl/generated/sksl_frag.dehydrated.sksl b/src/sksl/generated/sksl_frag.dehydrated.sksl
index 86fa55b..635e58a 100644
--- a/src/sksl/generated/sksl_frag.dehydrated.sksl
+++ b/src/sksl/generated/sksl_frag.dehydrated.sksl
@@ -10,23 +10,23 @@
 48,5,0,
 52,1,0,
 36,
-35,0,2,0,0,255,255,255,255,255,15,0,255,255,255,255,2,2,0,
+35,0,2,0,0,255,255,255,255,255,15,0,255,2,2,0,
 49,2,0,15,0,0,
 52,3,0,
 36,
-35,0,2,0,0,255,255,255,255,255,17,0,255,255,255,255,2,22,0,
+35,0,2,0,0,255,255,255,255,255,17,0,255,2,22,0,
 49,4,0,35,0,0,
 52,5,0,
 36,
-35,0,2,0,0,255,255,255,255,255,15,39,255,255,255,255,4,40,0,
+35,0,2,0,0,255,255,255,255,255,15,39,255,4,40,0,
 49,6,0,65,0,0,
 52,7,0,
 36,
-35,144,2,0,0,0,255,255,0,255,17,39,255,255,255,255,4,71,0,
+35,144,2,0,0,0,255,255,0,255,17,39,255,4,71,0,
 46,6,0,0,
 52,8,0,
 36,
-35,0,2,0,0,255,255,255,255,255,24,39,255,255,255,255,0,84,0,
+35,0,2,0,0,255,255,255,255,255,24,39,255,0,84,0,
 46,6,0,0,5,0,
 2,0,
 1,0,
diff --git a/src/sksl/generated/sksl_geom.dehydrated.sksl b/src/sksl/generated/sksl_geom.dehydrated.sksl
deleted file mode 100644
index 6aab91b..0000000
--- a/src/sksl/generated/sksl_geom.dehydrated.sksl
+++ /dev/null
@@ -1,77 +0,0 @@
-static uint8_t SKSL_INCLUDE_sksl_geom[] = {134,0,
-12,115,107,95,80,101,114,86,101,114,116,101,120,
-11,115,107,95,80,111,115,105,116,105,111,110,
-6,102,108,111,97,116,52,
-12,115,107,95,80,111,105,110,116,83,105,122,101,
-5,102,108,111,97,116,
-5,115,107,95,105,110,
-6,115,116,114,101,97,109,
-3,105,110,116,
-16,69,109,105,116,83,116,114,101,97,109,86,101,114,116,101,120,
-4,118,111,105,100,
-18,69,110,100,83,116,114,101,97,109,80,114,105,109,105,116,105,118,101,
-10,69,109,105,116,86,101,114,116,101,120,
-12,69,110,100,80,114,105,109,105,116,105,118,101,
-0,
-48,12,0,
-43,1,0,2,0,2,
-36,
-35,0,2,0,0,255,255,255,255,255,0,0,255,255,255,255,0,15,0,
-49,2,0,27,0,
-36,
-35,0,2,0,0,255,255,255,255,255,1,0,255,255,255,255,0,34,0,
-49,3,0,47,0,
-52,4,0,
-36,
-35,0,2,0,0,255,255,255,255,255,18,39,255,255,255,255,2,53,0,
-0,5,0,
-46,1,0,255,0,
-43,6,0,2,0,2,
-36,
-35,0,2,0,0,255,255,255,255,255,0,0,255,255,255,255,0,15,0,
-46,2,0,
-36,
-35,0,2,0,0,255,255,255,255,255,1,0,255,255,255,255,0,34,0,
-46,3,0,
-52,7,0,
-36,
-35,0,2,0,0,255,255,255,255,255,23,39,255,255,255,255,4,2,0,
-46,6,0,0,
-23,7,0,0,
-23,7,0,1,
-52,8,0,
-17,59,0,
-49,9,0,66,0,3,
-29,10,0,
-36,
-16,64,70,0,1,8,0,
-49,11,0,87,0,
-52,12,0,
-17,59,0,
-46,9,0,3,
-29,13,0,
-36,
-16,64,92,0,1,12,0,
-46,11,0,
-29,14,0,
-36,
-16,64,111,0,0,
-46,11,0,
-29,15,0,
-36,
-16,64,122,0,0,
-46,11,0,7,0,
-7,0,
-10,0,
-11,0,
-9,0,
-5,0,
-4,0,
-1,0,
-20,
-33,
-46,4,0,2,0,53,0,255,
-33,
-46,7,0,2,0,135,0,0,
-21,};
-static constexpr size_t SKSL_INCLUDE_sksl_geom_LENGTH = sizeof(SKSL_INCLUDE_sksl_geom);
diff --git a/src/sksl/generated/sksl_rt_shader.dehydrated.sksl b/src/sksl/generated/sksl_rt_shader.dehydrated.sksl
index 34821a8..0dc1a7c 100644
--- a/src/sksl/generated/sksl_rt_shader.dehydrated.sksl
+++ b/src/sksl/generated/sksl_rt_shader.dehydrated.sksl
@@ -20,7 +20,7 @@
 48,23,0,
 52,1,0,
 36,
-35,0,2,0,0,255,255,255,255,255,15,0,255,255,255,255,0,2,0,
+35,0,2,0,0,255,255,255,255,255,15,0,255,0,2,0,
 49,2,0,15,0,0,
 52,3,0,
 17,22,0,
diff --git a/src/sksl/generated/sksl_vert.dehydrated.sksl b/src/sksl/generated/sksl_vert.dehydrated.sksl
index 9c70b2b..795423d 100644
--- a/src/sksl/generated/sksl_vert.dehydrated.sksl
+++ b/src/sksl/generated/sksl_vert.dehydrated.sksl
@@ -11,10 +11,10 @@
 48,6,0,
 43,1,0,2,0,2,
 36,
-35,0,2,0,0,255,255,255,255,255,0,0,255,255,255,255,0,15,0,
+35,0,2,0,0,255,255,255,255,255,0,0,255,0,15,0,
 49,2,0,27,0,
 36,
-35,0,2,0,0,255,255,255,255,255,1,0,255,255,255,255,0,34,0,
+35,0,2,0,0,255,255,255,255,255,1,0,255,0,34,0,
 49,3,0,47,0,
 52,4,0,
 36,
@@ -24,11 +24,11 @@
 23,4,0,1,
 52,5,0,
 36,
-35,0,2,0,0,255,255,255,255,255,42,0,255,255,255,255,2,53,0,
+35,0,2,0,0,255,255,255,255,255,42,0,255,2,53,0,
 49,6,0,65,0,0,
 52,7,0,
 36,
-35,0,2,0,0,255,255,255,255,255,43,0,255,255,255,255,2,69,0,
+35,0,2,0,0,255,255,255,255,255,43,0,255,2,69,0,
 46,6,0,0,4,0,
 5,0,
 3,0,
diff --git a/src/sksl/ir/SkSLFunctionDeclaration.cpp b/src/sksl/ir/SkSLFunctionDeclaration.cpp
index cbcef93..beb1b60 100644
--- a/src/sksl/ir/SkSLFunctionDeclaration.cpp
+++ b/src/sksl/ir/SkSLFunctionDeclaration.cpp
@@ -203,7 +203,6 @@
             break;
         }
         case ProgramKind::kVertex:
-        case ProgramKind::kGeometry:
             if (parameters.size()) {
                 errors.error(offset, "shader 'main' must have zero parameters");
                 return false;
diff --git a/src/sksl/sksl_geom.sksl b/src/sksl/sksl_geom.sksl
deleted file mode 100644
index a3144ff..0000000
--- a/src/sksl/sksl_geom.sksl
+++ /dev/null
@@ -1,19 +0,0 @@
-// defines built-in interfaces supported by SkiaSL geometry shaders
-
-layout(builtin=10002) in sk_PerVertex {
-  layout(builtin=0) float4 sk_Position;
-  layout(builtin=1) float sk_PointSize;
-} sk_in[];
-
-layout(builtin=10007) out sk_PerVertex {
-    layout(builtin=0) float4 sk_Position;
-    layout(builtin=1) float sk_PointSize;
-};
-
-// sk_InvocationID exists, but is declared programmatically (to support a workaround)
-// layout(builtin=8) in int sk_InvocationID;
-
-sk_has_side_effects void EmitStreamVertex(int stream);
-sk_has_side_effects void EndStreamPrimitive(int stream);
-sk_has_side_effects void EmitVertex();
-sk_has_side_effects void EndPrimitive();
diff --git a/tests/sksl/errors/LayoutInFunctions.glsl b/tests/sksl/errors/LayoutInFunctions.glsl
index 9e0db7b..91b8957 100644
--- a/tests/sksl/errors/LayoutInFunctions.glsl
+++ b/tests/sksl/errors/LayoutInFunctions.glsl
@@ -1,29 +1,25 @@
 ### Compilation failed:
 
-error: 15: layout qualifier 'origin_upper_left' is not permitted here
-error: 15: layout qualifier 'push_constant' is not permitted here
-error: 15: layout qualifier 'blend_support_all_equations' is not permitted here
-error: 15: layout qualifier 'srgb_unpremul' is not permitted here
-error: 15: layout qualifier 'location' is not permitted here
-error: 15: layout qualifier 'offset' is not permitted here
-error: 15: layout qualifier 'binding' is not permitted here
-error: 15: layout qualifier 'index' is not permitted here
-error: 15: layout qualifier 'set' is not permitted here
-error: 15: layout qualifier 'builtin' is not permitted here
-error: 15: layout qualifier 'input_attachment_index' is not permitted here
-error: 15: layout qualifier 'max_vertices' is not permitted here
-error: 15: layout qualifier 'invocations' is not permitted here
-error: 31: layout qualifier 'origin_upper_left' is not permitted here
-error: 31: layout qualifier 'push_constant' is not permitted here
-error: 31: layout qualifier 'blend_support_all_equations' is not permitted here
-error: 31: layout qualifier 'srgb_unpremul' is not permitted here
-error: 31: layout qualifier 'location' is not permitted here
-error: 31: layout qualifier 'offset' is not permitted here
-error: 31: layout qualifier 'binding' is not permitted here
-error: 31: layout qualifier 'index' is not permitted here
-error: 31: layout qualifier 'set' is not permitted here
-error: 31: layout qualifier 'builtin' is not permitted here
-error: 31: layout qualifier 'input_attachment_index' is not permitted here
-error: 31: layout qualifier 'max_vertices' is not permitted here
-error: 31: layout qualifier 'invocations' is not permitted here
-26 errors
+error: 13: layout qualifier 'origin_upper_left' is not permitted here
+error: 13: layout qualifier 'push_constant' is not permitted here
+error: 13: layout qualifier 'blend_support_all_equations' is not permitted here
+error: 13: layout qualifier 'srgb_unpremul' is not permitted here
+error: 13: layout qualifier 'location' is not permitted here
+error: 13: layout qualifier 'offset' is not permitted here
+error: 13: layout qualifier 'binding' is not permitted here
+error: 13: layout qualifier 'index' is not permitted here
+error: 13: layout qualifier 'set' is not permitted here
+error: 13: layout qualifier 'builtin' is not permitted here
+error: 13: layout qualifier 'input_attachment_index' is not permitted here
+error: 27: layout qualifier 'origin_upper_left' is not permitted here
+error: 27: layout qualifier 'push_constant' is not permitted here
+error: 27: layout qualifier 'blend_support_all_equations' is not permitted here
+error: 27: layout qualifier 'srgb_unpremul' is not permitted here
+error: 27: layout qualifier 'location' is not permitted here
+error: 27: layout qualifier 'offset' is not permitted here
+error: 27: layout qualifier 'binding' is not permitted here
+error: 27: layout qualifier 'index' is not permitted here
+error: 27: layout qualifier 'set' is not permitted here
+error: 27: layout qualifier 'builtin' is not permitted here
+error: 27: layout qualifier 'input_attachment_index' is not permitted here
+22 errors
diff --git a/tests/sksl/errors/LayoutMultiplePrimitiveTypes.glsl b/tests/sksl/errors/LayoutMultiplePrimitiveTypes.glsl
deleted file mode 100644
index cb32a4e..0000000
--- a/tests/sksl/errors/LayoutMultiplePrimitiveTypes.glsl
+++ /dev/null
@@ -1,8 +0,0 @@
-### Compilation failed:
-
-error: 3: only one primitive-type layout qualifier is allowed
-error: 4: only one primitive-type layout qualifier is allowed
-error: 5: only one primitive-type layout qualifier is allowed
-error: 6: only one primitive-type layout qualifier is allowed
-error: 7: only one primitive-type layout qualifier is allowed
-5 errors
diff --git a/tests/sksl/errors/LayoutRepeatedQualifiers.glsl b/tests/sksl/errors/LayoutRepeatedQualifiers.glsl
index cf7c58f..40bfbd9 100644
--- a/tests/sksl/errors/LayoutRepeatedQualifiers.glsl
+++ b/tests/sksl/errors/LayoutRepeatedQualifiers.glsl
@@ -1,16 +1,14 @@
 ### Compilation failed:
 
-error: 16: layout qualifier 'origin_upper_left' appears more than once
-error: 17: layout qualifier 'push_constant' appears more than once
-error: 18: layout qualifier 'blend_support_all_equations' appears more than once
-error: 19: layout qualifier 'srgb_unpremul' appears more than once
-error: 20: layout qualifier 'location' appears more than once
-error: 21: layout qualifier 'offset' appears more than once
-error: 22: layout qualifier 'binding' appears more than once
-error: 23: layout qualifier 'index' appears more than once
-error: 24: layout qualifier 'set' appears more than once
-error: 25: layout qualifier 'builtin' appears more than once
-error: 26: layout qualifier 'input_attachment_index' appears more than once
-error: 27: layout qualifier 'max_vertices' appears more than once
-error: 28: layout qualifier 'invocations' appears more than once
-13 errors
+error: 14: layout qualifier 'origin_upper_left' appears more than once
+error: 15: layout qualifier 'push_constant' appears more than once
+error: 16: layout qualifier 'blend_support_all_equations' appears more than once
+error: 17: layout qualifier 'srgb_unpremul' appears more than once
+error: 18: layout qualifier 'location' appears more than once
+error: 19: layout qualifier 'offset' appears more than once
+error: 20: layout qualifier 'binding' appears more than once
+error: 21: layout qualifier 'index' appears more than once
+error: 22: layout qualifier 'set' appears more than once
+error: 23: layout qualifier 'builtin' appears more than once
+error: 24: layout qualifier 'input_attachment_index' appears more than once
+11 errors
diff --git a/tests/sksl/shared/Geometry.asm.geom b/tests/sksl/shared/Geometry.asm.geom
deleted file mode 100644
index 5a9a29a..0000000
--- a/tests/sksl/shared/Geometry.asm.geom
+++ /dev/null
@@ -1,60 +0,0 @@
-OpCapability Geometry
-%1 = OpExtInstImport "GLSL.std.450"
-OpMemoryModel Logical GLSL450
-OpEntryPoint Geometry %main "main" %3 %8 %sk_InvocationID
-OpExecutionMode %main InputPoints
-OpExecutionMode %main OutputLineStrip
-OpExecutionMode %main OutputVertices 2
-OpExecutionMode %main Invocations 2
-OpName %sk_PerVertex "sk_PerVertex"
-OpMemberName %sk_PerVertex 0 "sk_Position"
-OpMemberName %sk_PerVertex 1 "sk_PointSize"
-OpName %sk_InvocationID "sk_InvocationID"
-OpName %main "main"
-OpMemberDecorate %sk_PerVertex 0 BuiltIn Position
-OpMemberDecorate %sk_PerVertex 1 BuiltIn PointSize
-OpDecorate %_arr_sk_PerVertex_int_1 ArrayStride 32
-OpDecorate %sk_InvocationID BuiltIn InvocationId
-%float = OpTypeFloat 32
-%v4float = OpTypeVector %float 4
-%sk_PerVertex = OpTypeStruct %v4float %float
-%_ptr_Output_sk_PerVertex = OpTypePointer Output %sk_PerVertex
-%3 = OpVariable %_ptr_Output_sk_PerVertex Output
-%int = OpTypeInt 32 1
-%int_1 = OpConstant %int 1
-%_arr_sk_PerVertex_int_1 = OpTypeArray %sk_PerVertex %int_1
-%_ptr_Input__arr_sk_PerVertex_int_1 = OpTypePointer Input %_arr_sk_PerVertex_int_1
-%8 = OpVariable %_ptr_Input__arr_sk_PerVertex_int_1 Input
-%_ptr_Input_int = OpTypePointer Input %int
-%sk_InvocationID = OpVariable %_ptr_Input_int Input
-%void = OpTypeVoid
-%16 = OpTypeFunction %void
-%int_0 = OpConstant %int 0
-%_ptr_Input_v4float = OpTypePointer Input %v4float
-%float_n0_5 = OpConstant %float -0.5
-%float_0 = OpConstant %float 0
-%_ptr_Output_v4float = OpTypePointer Output %v4float
-%float_0_5 = OpConstant %float 0.5
-%main = OpFunction %void None %16
-%17 = OpLabel
-%19 = OpAccessChain %_ptr_Input_v4float %8 %int_0 %int_0
-%21 = OpLoad %v4float %19
-%24 = OpLoad %int %sk_InvocationID
-%25 = OpConvertSToF %float %24
-%26 = OpCompositeConstruct %v4float %float_n0_5 %float_0 %float_0 %25
-%27 = OpFAdd %v4float %21 %26
-%28 = OpAccessChain %_ptr_Output_v4float %3 %int_0
-OpStore %28 %27
-OpEmitVertex
-%31 = OpAccessChain %_ptr_Input_v4float %8 %int_0 %int_0
-%32 = OpLoad %v4float %31
-%34 = OpLoad %int %sk_InvocationID
-%35 = OpConvertSToF %float %34
-%36 = OpCompositeConstruct %v4float %float_0_5 %float_0 %float_0 %35
-%37 = OpFAdd %v4float %32 %36
-%38 = OpAccessChain %_ptr_Output_v4float %3 %int_0
-OpStore %38 %37
-OpEmitVertex
-OpEndPrimitive
-OpReturn
-OpFunctionEnd
diff --git a/tests/sksl/shared/Geometry.glsl b/tests/sksl/shared/Geometry.glsl
deleted file mode 100644
index 8e5408a..0000000
--- a/tests/sksl/shared/Geometry.glsl
+++ /dev/null
@@ -1,11 +0,0 @@
-#version 400
-layout (points) in ;
-layout (invocations = 2) in ;
-layout (line_strip, max_vertices = 2) out ;
-void main() {
-    gl_Position = gl_in[0].gl_Position + vec4(-0.5, 0.0, 0.0, float(gl_InvocationID));
-    EmitVertex();
-    gl_Position = gl_in[0].gl_Position + vec4(0.5, 0.0, 0.0, float(gl_InvocationID));
-    EmitVertex();
-    EndPrimitive();
-}
diff --git a/tests/sksl/shared/Geometry.metal b/tests/sksl/shared/Geometry.metal
deleted file mode 100644
index a952f7d..0000000
--- a/tests/sksl/shared/Geometry.metal
+++ /dev/null
@@ -1,4 +0,0 @@
-### Compilation failed:
-
-error: unsupported kind of program
-1 error
diff --git a/tests/sksl/shared/GeometryExtension.asm.geom b/tests/sksl/shared/GeometryExtension.asm.geom
deleted file mode 100644
index 38b5bc5..0000000
--- a/tests/sksl/shared/GeometryExtension.asm.geom
+++ /dev/null
@@ -1,50 +0,0 @@
-OpCapability Geometry
-%1 = OpExtInstImport "GLSL.std.450"
-OpMemoryModel Logical GLSL450
-OpEntryPoint Geometry %main "main" %3 %8 %sk_InvocationID
-OpExecutionMode %main InputPoints
-OpExecutionMode %main OutputLineStrip
-OpExecutionMode %main OutputVertices 2
-OpExecutionMode %main Invocations 3
-OpName %sk_PerVertex "sk_PerVertex"
-OpMemberName %sk_PerVertex 0 "sk_Position"
-OpMemberName %sk_PerVertex 1 "sk_PointSize"
-OpName %sk_InvocationID "sk_InvocationID"
-OpName %main "main"
-OpMemberDecorate %sk_PerVertex 0 BuiltIn Position
-OpMemberDecorate %sk_PerVertex 1 BuiltIn PointSize
-OpDecorate %_arr_sk_PerVertex_int_1 ArrayStride 32
-OpDecorate %sk_InvocationID BuiltIn InvocationId
-%float = OpTypeFloat 32
-%v4float = OpTypeVector %float 4
-%sk_PerVertex = OpTypeStruct %v4float %float
-%_ptr_Output_sk_PerVertex = OpTypePointer Output %sk_PerVertex
-%3 = OpVariable %_ptr_Output_sk_PerVertex Output
-%int = OpTypeInt 32 1
-%int_1 = OpConstant %int 1
-%_arr_sk_PerVertex_int_1 = OpTypeArray %sk_PerVertex %int_1
-%_ptr_Input__arr_sk_PerVertex_int_1 = OpTypePointer Input %_arr_sk_PerVertex_int_1
-%8 = OpVariable %_ptr_Input__arr_sk_PerVertex_int_1 Input
-%_ptr_Input_int = OpTypePointer Input %int
-%sk_InvocationID = OpVariable %_ptr_Input_int Input
-%void = OpTypeVoid
-%16 = OpTypeFunction %void
-%int_0 = OpConstant %int 0
-%_ptr_Input_v4float = OpTypePointer Input %v4float
-%float_n0_5 = OpConstant %float -0.5
-%float_0 = OpConstant %float 0
-%_ptr_Output_v4float = OpTypePointer Output %v4float
-%main = OpFunction %void None %16
-%17 = OpLabel
-%19 = OpAccessChain %_ptr_Input_v4float %8 %int_0 %int_0
-%21 = OpLoad %v4float %19
-%24 = OpLoad %int %sk_InvocationID
-%25 = OpConvertSToF %float %24
-%26 = OpCompositeConstruct %v4float %float_n0_5 %float_0 %float_0 %25
-%27 = OpFAdd %v4float %21 %26
-%28 = OpAccessChain %_ptr_Output_v4float %3 %int_0
-OpStore %28 %27
-OpEmitVertex
-OpEndPrimitive
-OpReturn
-OpFunctionEnd
diff --git a/tests/sksl/shared/GeometryExtension.glsl b/tests/sksl/shared/GeometryExtension.glsl
deleted file mode 100644
index 6291134..0000000
--- a/tests/sksl/shared/GeometryExtension.glsl
+++ /dev/null
@@ -1,10 +0,0 @@
-#version 310es
-#extension GL_EXT_geometry_shader : require
-layout (points, invocations = 2) in ;
-layout (invocations = 3) in ;
-layout (line_strip, max_vertices = 2) out ;
-void main() {
-    gl_Position = gl_in[0].gl_Position + vec4(-0.5, 0.0, 0.0, float(gl_InvocationID));
-    EmitVertex();
-    EndPrimitive();
-}
diff --git a/tests/sksl/shared/GeometryExtension.metal b/tests/sksl/shared/GeometryExtension.metal
deleted file mode 100644
index a952f7d..0000000
--- a/tests/sksl/shared/GeometryExtension.metal
+++ /dev/null
@@ -1,4 +0,0 @@
-### Compilation failed:
-
-error: unsupported kind of program
-1 error
diff --git a/tests/sksl/shared/GeometryGSInvocations.asm.geom b/tests/sksl/shared/GeometryGSInvocations.asm.geom
deleted file mode 100644
index 38b5bc5..0000000
--- a/tests/sksl/shared/GeometryGSInvocations.asm.geom
+++ /dev/null
@@ -1,50 +0,0 @@
-OpCapability Geometry
-%1 = OpExtInstImport "GLSL.std.450"
-OpMemoryModel Logical GLSL450
-OpEntryPoint Geometry %main "main" %3 %8 %sk_InvocationID
-OpExecutionMode %main InputPoints
-OpExecutionMode %main OutputLineStrip
-OpExecutionMode %main OutputVertices 2
-OpExecutionMode %main Invocations 3
-OpName %sk_PerVertex "sk_PerVertex"
-OpMemberName %sk_PerVertex 0 "sk_Position"
-OpMemberName %sk_PerVertex 1 "sk_PointSize"
-OpName %sk_InvocationID "sk_InvocationID"
-OpName %main "main"
-OpMemberDecorate %sk_PerVertex 0 BuiltIn Position
-OpMemberDecorate %sk_PerVertex 1 BuiltIn PointSize
-OpDecorate %_arr_sk_PerVertex_int_1 ArrayStride 32
-OpDecorate %sk_InvocationID BuiltIn InvocationId
-%float = OpTypeFloat 32
-%v4float = OpTypeVector %float 4
-%sk_PerVertex = OpTypeStruct %v4float %float
-%_ptr_Output_sk_PerVertex = OpTypePointer Output %sk_PerVertex
-%3 = OpVariable %_ptr_Output_sk_PerVertex Output
-%int = OpTypeInt 32 1
-%int_1 = OpConstant %int 1
-%_arr_sk_PerVertex_int_1 = OpTypeArray %sk_PerVertex %int_1
-%_ptr_Input__arr_sk_PerVertex_int_1 = OpTypePointer Input %_arr_sk_PerVertex_int_1
-%8 = OpVariable %_ptr_Input__arr_sk_PerVertex_int_1 Input
-%_ptr_Input_int = OpTypePointer Input %int
-%sk_InvocationID = OpVariable %_ptr_Input_int Input
-%void = OpTypeVoid
-%16 = OpTypeFunction %void
-%int_0 = OpConstant %int 0
-%_ptr_Input_v4float = OpTypePointer Input %v4float
-%float_n0_5 = OpConstant %float -0.5
-%float_0 = OpConstant %float 0
-%_ptr_Output_v4float = OpTypePointer Output %v4float
-%main = OpFunction %void None %16
-%17 = OpLabel
-%19 = OpAccessChain %_ptr_Input_v4float %8 %int_0 %int_0
-%21 = OpLoad %v4float %19
-%24 = OpLoad %int %sk_InvocationID
-%25 = OpConvertSToF %float %24
-%26 = OpCompositeConstruct %v4float %float_n0_5 %float_0 %float_0 %25
-%27 = OpFAdd %v4float %21 %26
-%28 = OpAccessChain %_ptr_Output_v4float %3 %int_0
-OpStore %28 %27
-OpEmitVertex
-OpEndPrimitive
-OpReturn
-OpFunctionEnd
diff --git a/tests/sksl/shared/GeometryGSInvocations.glsl b/tests/sksl/shared/GeometryGSInvocations.glsl
deleted file mode 100644
index 9e0dbce..0000000
--- a/tests/sksl/shared/GeometryGSInvocations.glsl
+++ /dev/null
@@ -1,10 +0,0 @@
-#version 400
-#extension GL_ARB_gpu_shader5 : require
-layout (points, invocations = 2) in ;
-layout (invocations = 3) in ;
-layout (line_strip, max_vertices = 2) out ;
-void main() {
-    gl_Position = gl_in[0].gl_Position + vec4(-0.5, 0.0, 0.0, float(gl_InvocationID));
-    EmitVertex();
-    EndPrimitive();
-}
diff --git a/tests/sksl/shared/GeometryGSInvocations.metal b/tests/sksl/shared/GeometryGSInvocations.metal
deleted file mode 100644
index a952f7d..0000000
--- a/tests/sksl/shared/GeometryGSInvocations.metal
+++ /dev/null
@@ -1,4 +0,0 @@
-### Compilation failed:
-
-error: unsupported kind of program
-1 error
diff --git a/tests/sksl/shared/GeometryNoGSInvocations.asm.geom b/tests/sksl/shared/GeometryNoGSInvocations.asm.geom
deleted file mode 100644
index 9784c7c..0000000
--- a/tests/sksl/shared/GeometryNoGSInvocations.asm.geom
+++ /dev/null
@@ -1,79 +0,0 @@
-OpCapability Geometry
-%1 = OpExtInstImport "GLSL.std.450"
-OpMemoryModel Logical GLSL450
-OpEntryPoint Geometry %main "main" %3 %8
-OpExecutionMode %main InputPoints
-OpExecutionMode %main OutputLineStrip
-OpExecutionMode %main OutputVertices 4
-OpExecutionMode %main Invocations 1
-OpName %sk_PerVertex "sk_PerVertex"
-OpMemberName %sk_PerVertex 0 "sk_Position"
-OpMemberName %sk_PerVertex 1 "sk_PointSize"
-OpName %sk_InvocationID "sk_InvocationID"
-OpName %main "main"
-OpMemberDecorate %sk_PerVertex 0 BuiltIn Position
-OpMemberDecorate %sk_PerVertex 1 BuiltIn PointSize
-OpDecorate %_arr_sk_PerVertex_int_1 ArrayStride 32
-%float = OpTypeFloat 32
-%v4float = OpTypeVector %float 4
-%sk_PerVertex = OpTypeStruct %v4float %float
-%_ptr_Output_sk_PerVertex = OpTypePointer Output %sk_PerVertex
-%3 = OpVariable %_ptr_Output_sk_PerVertex Output
-%int = OpTypeInt 32 1
-%int_1 = OpConstant %int 1
-%_arr_sk_PerVertex_int_1 = OpTypeArray %sk_PerVertex %int_1
-%_ptr_Input__arr_sk_PerVertex_int_1 = OpTypePointer Input %_arr_sk_PerVertex_int_1
-%8 = OpVariable %_ptr_Input__arr_sk_PerVertex_int_1 Input
-%_ptr_Private_int = OpTypePointer Private %int
-%sk_InvocationID = OpVariable %_ptr_Private_int Private
-%void = OpTypeVoid
-%16 = OpTypeFunction %void
-%int_0 = OpConstant %int 0
-%int_2 = OpConstant %int 2
-%bool = OpTypeBool
-%_ptr_Input_v4float = OpTypePointer Input %v4float
-%float_0_5 = OpConstant %float 0.5
-%float_0 = OpConstant %float 0
-%_ptr_Output_v4float = OpTypePointer Output %v4float
-%float_n0_5 = OpConstant %float -0.5
-%false = OpConstantFalse %bool
-%main = OpFunction %void None %16
-%17 = OpLabel
-OpStore %sk_InvocationID %int_0
-OpBranch %19
-%19 = OpLabel
-OpLoopMerge %23 %22 None
-OpBranch %20
-%20 = OpLabel
-%24 = OpLoad %int %sk_InvocationID
-%26 = OpSLessThan %bool %24 %int_2
-OpBranchConditional %26 %21 %23
-%21 = OpLabel
-%28 = OpAccessChain %_ptr_Input_v4float %8 %int_0 %int_0
-%30 = OpLoad %v4float %28
-%33 = OpLoad %int %sk_InvocationID
-%34 = OpConvertSToF %float %33
-%35 = OpCompositeConstruct %v4float %float_0_5 %float_0 %float_0 %34
-%36 = OpFAdd %v4float %30 %35
-%37 = OpAccessChain %_ptr_Output_v4float %3 %int_0
-OpStore %37 %36
-OpEmitVertex
-%40 = OpAccessChain %_ptr_Input_v4float %8 %int_0 %int_0
-%41 = OpLoad %v4float %40
-%43 = OpLoad %int %sk_InvocationID
-%44 = OpConvertSToF %float %43
-%45 = OpCompositeConstruct %v4float %float_n0_5 %float_0 %float_0 %44
-%46 = OpFAdd %v4float %41 %45
-%47 = OpAccessChain %_ptr_Output_v4float %3 %int_0
-OpStore %47 %46
-OpEmitVertex
-OpEndPrimitive
-OpBranch %22
-%22 = OpLabel
-%51 = OpLoad %int %sk_InvocationID
-%52 = OpIAdd %int %51 %int_1
-OpStore %sk_InvocationID %52
-OpBranch %19
-%23 = OpLabel
-OpReturn
-OpFunctionEnd
diff --git a/tests/sksl/shared/GeometryNoGSInvocations.glsl b/tests/sksl/shared/GeometryNoGSInvocations.glsl
deleted file mode 100644
index 9d367e9..0000000
--- a/tests/sksl/shared/GeometryNoGSInvocations.glsl
+++ /dev/null
@@ -1,14 +0,0 @@
-#version 400
-int sk_InvocationID;
-layout (points) in ;
-layout (line_strip, max_vertices = 4) out ;
-void main() {
-    for (sk_InvocationID = 0;sk_InvocationID < 2; sk_InvocationID++) {
-        gl_Position = gl_in[0].gl_Position + vec4(0.5, 0.0, 0.0, float(sk_InvocationID));
-        EmitVertex();
-        gl_Position = gl_in[0].gl_Position + vec4(-0.5, 0.0, 0.0, float(sk_InvocationID));
-        EmitVertex();
-        false;
-        EndPrimitive();
-    }
-}
diff --git a/tests/sksl/shared/GeometryNoGSInvocations.metal b/tests/sksl/shared/GeometryNoGSInvocations.metal
deleted file mode 100644
index a952f7d..0000000
--- a/tests/sksl/shared/GeometryNoGSInvocations.metal
+++ /dev/null
@@ -1,4 +0,0 @@
-### Compilation failed:
-
-error: unsupported kind of program
-1 error
diff --git a/tests/sksl/shared/GeometryNoGSInvocationsReorder.asm.geom b/tests/sksl/shared/GeometryNoGSInvocationsReorder.asm.geom
deleted file mode 100644
index 007ed4d..0000000
--- a/tests/sksl/shared/GeometryNoGSInvocationsReorder.asm.geom
+++ /dev/null
@@ -1,79 +0,0 @@
-OpCapability Geometry
-%1 = OpExtInstImport "GLSL.std.450"
-OpMemoryModel Logical GLSL450
-OpEntryPoint Geometry %main "main" %3 %8
-OpExecutionMode %main InputPoints
-OpExecutionMode %main OutputLineStrip
-OpExecutionMode %main OutputVertices 2
-OpExecutionMode %main Invocations 1
-OpName %sk_PerVertex "sk_PerVertex"
-OpMemberName %sk_PerVertex 0 "sk_Position"
-OpMemberName %sk_PerVertex 1 "sk_PointSize"
-OpName %sk_InvocationID "sk_InvocationID"
-OpName %main "main"
-OpMemberDecorate %sk_PerVertex 0 BuiltIn Position
-OpMemberDecorate %sk_PerVertex 1 BuiltIn PointSize
-OpDecorate %_arr_sk_PerVertex_int_1 ArrayStride 32
-%float = OpTypeFloat 32
-%v4float = OpTypeVector %float 4
-%sk_PerVertex = OpTypeStruct %v4float %float
-%_ptr_Output_sk_PerVertex = OpTypePointer Output %sk_PerVertex
-%3 = OpVariable %_ptr_Output_sk_PerVertex Output
-%int = OpTypeInt 32 1
-%int_1 = OpConstant %int 1
-%_arr_sk_PerVertex_int_1 = OpTypeArray %sk_PerVertex %int_1
-%_ptr_Input__arr_sk_PerVertex_int_1 = OpTypePointer Input %_arr_sk_PerVertex_int_1
-%8 = OpVariable %_ptr_Input__arr_sk_PerVertex_int_1 Input
-%_ptr_Private_int = OpTypePointer Private %int
-%sk_InvocationID = OpVariable %_ptr_Private_int Private
-%void = OpTypeVoid
-%16 = OpTypeFunction %void
-%int_0 = OpConstant %int 0
-%int_2 = OpConstant %int 2
-%bool = OpTypeBool
-%_ptr_Input_v4float = OpTypePointer Input %v4float
-%float_0_5 = OpConstant %float 0.5
-%float_0 = OpConstant %float 0
-%_ptr_Output_v4float = OpTypePointer Output %v4float
-%float_n0_5 = OpConstant %float -0.5
-%false = OpConstantFalse %bool
-%main = OpFunction %void None %16
-%17 = OpLabel
-OpStore %sk_InvocationID %int_0
-OpBranch %19
-%19 = OpLabel
-OpLoopMerge %23 %22 None
-OpBranch %20
-%20 = OpLabel
-%24 = OpLoad %int %sk_InvocationID
-%26 = OpSLessThan %bool %24 %int_2
-OpBranchConditional %26 %21 %23
-%21 = OpLabel
-%28 = OpAccessChain %_ptr_Input_v4float %8 %int_0 %int_0
-%30 = OpLoad %v4float %28
-%33 = OpLoad %int %sk_InvocationID
-%34 = OpConvertSToF %float %33
-%35 = OpCompositeConstruct %v4float %float_0_5 %float_0 %float_0 %34
-%36 = OpFAdd %v4float %30 %35
-%37 = OpAccessChain %_ptr_Output_v4float %3 %int_0
-OpStore %37 %36
-OpEmitVertex
-%40 = OpAccessChain %_ptr_Input_v4float %8 %int_0 %int_0
-%41 = OpLoad %v4float %40
-%43 = OpLoad %int %sk_InvocationID
-%44 = OpConvertSToF %float %43
-%45 = OpCompositeConstruct %v4float %float_n0_5 %float_0 %float_0 %44
-%46 = OpFAdd %v4float %41 %45
-%47 = OpAccessChain %_ptr_Output_v4float %3 %int_0
-OpStore %47 %46
-OpEmitVertex
-OpEndPrimitive
-OpBranch %22
-%22 = OpLabel
-%51 = OpLoad %int %sk_InvocationID
-%52 = OpIAdd %int %51 %int_1
-OpStore %sk_InvocationID %52
-OpBranch %19
-%23 = OpLabel
-OpReturn
-OpFunctionEnd
diff --git a/tests/sksl/shared/GeometryNoGSInvocationsReorder.glsl b/tests/sksl/shared/GeometryNoGSInvocationsReorder.glsl
deleted file mode 100644
index c5729ec..0000000
--- a/tests/sksl/shared/GeometryNoGSInvocationsReorder.glsl
+++ /dev/null
@@ -1,14 +0,0 @@
-#version 400
-int sk_InvocationID;
-layout (points) in ;
-layout (line_strip, max_vertices = 2) out ;
-void main() {
-    for (sk_InvocationID = 0;sk_InvocationID < 2; sk_InvocationID++) {
-        gl_Position = gl_in[0].gl_Position + vec4(0.5, 0.0, 0.0, float(sk_InvocationID));
-        EmitVertex();
-        gl_Position = gl_in[0].gl_Position + vec4(-0.5, 0.0, 0.0, float(sk_InvocationID));
-        EmitVertex();
-        false;
-        EndPrimitive();
-    }
-}
diff --git a/tests/sksl/shared/GeometryNoGSInvocationsReorder.metal b/tests/sksl/shared/GeometryNoGSInvocationsReorder.metal
deleted file mode 100644
index a952f7d..0000000
--- a/tests/sksl/shared/GeometryNoGSInvocationsReorder.metal
+++ /dev/null
@@ -1,4 +0,0 @@
-### Compilation failed:
-
-error: unsupported kind of program
-1 error
diff --git a/tests/sksl/shared/NormalizationGeo.asm.geom b/tests/sksl/shared/NormalizationGeo.asm.geom
deleted file mode 100644
index 0d9aa45..0000000
--- a/tests/sksl/shared/NormalizationGeo.asm.geom
+++ /dev/null
@@ -1,117 +0,0 @@
-OpCapability Geometry
-%1 = OpExtInstImport "GLSL.std.450"
-OpMemoryModel Logical GLSL450
-OpEntryPoint Geometry %main "main" %3 %8 %sk_InvocationID
-OpExecutionMode %main InputPoints
-OpExecutionMode %main OutputLineStrip
-OpExecutionMode %main OutputVertices 2
-OpExecutionMode %main Invocations 2
-OpName %sk_PerVertex "sk_PerVertex"
-OpMemberName %sk_PerVertex 0 "sk_Position"
-OpMemberName %sk_PerVertex 1 "sk_PointSize"
-OpName %sk_InvocationID "sk_InvocationID"
-OpName %_UniformBuffer "_UniformBuffer"
-OpMemberName %_UniformBuffer 0 "sk_RTAdjust"
-OpName %main "main"
-OpMemberDecorate %sk_PerVertex 0 BuiltIn Position
-OpMemberDecorate %sk_PerVertex 1 BuiltIn PointSize
-OpDecorate %_arr_sk_PerVertex_int_1 ArrayStride 32
-OpDecorate %sk_InvocationID BuiltIn InvocationId
-OpMemberDecorate %_UniformBuffer 0 Offset 0
-OpDecorate %_UniformBuffer Block
-OpDecorate %15 Binding 0
-OpDecorate %15 DescriptorSet 0
-%float = OpTypeFloat 32
-%v4float = OpTypeVector %float 4
-%sk_PerVertex = OpTypeStruct %v4float %float
-%_ptr_Output_sk_PerVertex = OpTypePointer Output %sk_PerVertex
-%3 = OpVariable %_ptr_Output_sk_PerVertex Output
-%int = OpTypeInt 32 1
-%int_1 = OpConstant %int 1
-%_arr_sk_PerVertex_int_1 = OpTypeArray %sk_PerVertex %int_1
-%_ptr_Input__arr_sk_PerVertex_int_1 = OpTypePointer Input %_arr_sk_PerVertex_int_1
-%8 = OpVariable %_ptr_Input__arr_sk_PerVertex_int_1 Input
-%_ptr_Input_int = OpTypePointer Input %int
-%sk_InvocationID = OpVariable %_ptr_Input_int Input
-%_UniformBuffer = OpTypeStruct %v4float
-%_ptr_Uniform__UniformBuffer = OpTypePointer Uniform %_UniformBuffer
-%15 = OpVariable %_ptr_Uniform__UniformBuffer Uniform
-%void = OpTypeVoid
-%19 = OpTypeFunction %void
-%int_0 = OpConstant %int 0
-%_ptr_Input_v4float = OpTypePointer Input %v4float
-%float_n0_5 = OpConstant %float -0.5
-%float_0 = OpConstant %float 0
-%_ptr_Output_v4float = OpTypePointer Output %v4float
-%v2float = OpTypeVector %float 2
-%_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
-%float_0_5 = OpConstant %float 0.5
-%main = OpFunction %void None %19
-%20 = OpLabel
-%22 = OpAccessChain %_ptr_Input_v4float %8 %int_0 %int_0
-%24 = OpLoad %v4float %22
-%27 = OpLoad %int %sk_InvocationID
-%28 = OpConvertSToF %float %27
-%29 = OpCompositeConstruct %v4float %float_n0_5 %float_0 %float_0 %28
-%30 = OpFAdd %v4float %24 %29
-%31 = OpAccessChain %_ptr_Output_v4float %3 %int_0
-OpStore %31 %30
-%33 = OpAccessChain %_ptr_Output_v4float %3 %int_0
-%34 = OpLoad %v4float %33
-%35 = OpVectorShuffle %v2float %34 %34 0 1
-%37 = OpAccessChain %_ptr_Uniform_v4float %15 %int_0
-%39 = OpLoad %v4float %37
-%40 = OpVectorShuffle %v2float %39 %39 0 2
-%41 = OpFMul %v2float %35 %40
-%42 = OpAccessChain %_ptr_Output_v4float %3 %int_0
-%43 = OpLoad %v4float %42
-%44 = OpVectorShuffle %v2float %43 %43 3 3
-%45 = OpAccessChain %_ptr_Uniform_v4float %15 %int_0
-%46 = OpLoad %v4float %45
-%47 = OpVectorShuffle %v2float %46 %46 1 3
-%48 = OpFMul %v2float %44 %47
-%49 = OpFAdd %v2float %41 %48
-%50 = OpCompositeExtract %float %49 0
-%51 = OpCompositeExtract %float %49 1
-%52 = OpAccessChain %_ptr_Output_v4float %3 %int_0
-%53 = OpLoad %v4float %52
-%54 = OpCompositeExtract %float %53 3
-%55 = OpCompositeConstruct %v4float %50 %51 %float_0 %54
-%56 = OpAccessChain %_ptr_Output_v4float %3 %int_0
-OpStore %56 %55
-OpEmitVertex
-%58 = OpAccessChain %_ptr_Input_v4float %8 %int_0 %int_0
-%59 = OpLoad %v4float %58
-%61 = OpLoad %int %sk_InvocationID
-%62 = OpConvertSToF %float %61
-%63 = OpCompositeConstruct %v4float %float_0_5 %float_0 %float_0 %62
-%64 = OpFAdd %v4float %59 %63
-%65 = OpAccessChain %_ptr_Output_v4float %3 %int_0
-OpStore %65 %64
-%66 = OpAccessChain %_ptr_Output_v4float %3 %int_0
-%67 = OpLoad %v4float %66
-%68 = OpVectorShuffle %v2float %67 %67 0 1
-%69 = OpAccessChain %_ptr_Uniform_v4float %15 %int_0
-%70 = OpLoad %v4float %69
-%71 = OpVectorShuffle %v2float %70 %70 0 2
-%72 = OpFMul %v2float %68 %71
-%73 = OpAccessChain %_ptr_Output_v4float %3 %int_0
-%74 = OpLoad %v4float %73
-%75 = OpVectorShuffle %v2float %74 %74 3 3
-%76 = OpAccessChain %_ptr_Uniform_v4float %15 %int_0
-%77 = OpLoad %v4float %76
-%78 = OpVectorShuffle %v2float %77 %77 1 3
-%79 = OpFMul %v2float %75 %78
-%80 = OpFAdd %v2float %72 %79
-%81 = OpCompositeExtract %float %80 0
-%82 = OpCompositeExtract %float %80 1
-%83 = OpAccessChain %_ptr_Output_v4float %3 %int_0
-%84 = OpLoad %v4float %83
-%85 = OpCompositeExtract %float %84 3
-%86 = OpCompositeConstruct %v4float %81 %82 %float_0 %85
-%87 = OpAccessChain %_ptr_Output_v4float %3 %int_0
-OpStore %87 %86
-OpEmitVertex
-OpEndPrimitive
-OpReturn
-OpFunctionEnd
diff --git a/tests/sksl/shared/NormalizationGeo.glsl b/tests/sksl/shared/NormalizationGeo.glsl
deleted file mode 100644
index 0db8876..0000000
--- a/tests/sksl/shared/NormalizationGeo.glsl
+++ /dev/null
@@ -1,18 +0,0 @@
-#version 400
-uniform vec4 sk_RTAdjust;
-layout (points) in ;
-layout (invocations = 2) in ;
-layout (line_strip, max_vertices = 2) out ;
-void main() {
-    gl_Position = gl_in[0].gl_Position + vec4(-0.5, 0.0, 0.0, float(gl_InvocationID));
-    {
-        gl_Position = vec4(gl_Position.xy * sk_RTAdjust.xz + gl_Position.ww * sk_RTAdjust.yw, 0.0, gl_Position.w);
-        EmitVertex();
-    }
-    gl_Position = gl_in[0].gl_Position + vec4(0.5, 0.0, 0.0, float(gl_InvocationID));
-    {
-        gl_Position = vec4(gl_Position.xy * sk_RTAdjust.xz + gl_Position.ww * sk_RTAdjust.yw, 0.0, gl_Position.w);
-        EmitVertex();
-    }
-    EndPrimitive();
-}
diff --git a/tests/sksl/shared/NormalizationGeo.metal b/tests/sksl/shared/NormalizationGeo.metal
deleted file mode 100644
index a952f7d..0000000
--- a/tests/sksl/shared/NormalizationGeo.metal
+++ /dev/null
@@ -1,4 +0,0 @@
-### Compilation failed:
-
-error: unsupported kind of program
-1 error
diff --git a/tools/flags/CommonFlagsGpu.cpp b/tools/flags/CommonFlagsGpu.cpp
index 56b4f8b..a0ca4a5 100644
--- a/tools/flags/CommonFlagsGpu.cpp
+++ b/tools/flags/CommonFlagsGpu.cpp
@@ -19,7 +19,6 @@
 static DEFINE_bool(allPathsVolatile, false,
                    "Causes all GPU paths to be processed as if 'setIsVolatile' had been called.");
 
-static DEFINE_bool(gs, true, "Enables support for geometry shaders (if hw allows).");
 static DEFINE_bool(hwtess, false, "Enables support for tessellation shaders (if hw allows.).");
 
 static DEFINE_int(maxTessellationSegments, 0,
@@ -104,7 +103,6 @@
     ctxOptions->fExecutor                            = gGpuExecutor.get();
     ctxOptions->fAllowPathMaskCaching                = FLAGS_cachePathMasks;
     ctxOptions->fAllPathsVolatile                    = FLAGS_allPathsVolatile;
-    ctxOptions->fSuppressGeometryShaders             = !FLAGS_gs;
     ctxOptions->fEnableExperimentalHardwareTessellation = FLAGS_hwtess;
     ctxOptions->fMaxTessellationSegmentsOverride     = FLAGS_maxTessellationSegments;
     ctxOptions->fAlwaysPreferHardwareTessellation    = FLAGS_alwaysHwTess;