runtime shaders

This extends the runStriped to all for return data.
GPU impl not done yet, will be done in a follow-on CL.

Change-Id: Ib107d2945f6fdb34ce1b5405a6c88a5ae7e9f7ac
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/221539
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: Mike Reed <reed@google.com>
diff --git a/src/shaders/SkRTShader.h b/src/shaders/SkRTShader.h
new file mode 100644
index 0000000..6bd4447
--- /dev/null
+++ b/src/shaders/SkRTShader.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef SkRTShader_DEFINED
+#define SkRTShader_DEFINED
+
+#include "include/core/SkString.h"
+#include "include/private/SkMutex.h"
+#include "src/shaders/SkShaderBase.h"
+#include "src/sksl/SkSLByteCode.h"
+
+#if SK_SUPPORT_GPU
+#include "src/gpu/GrFragmentProcessor.h"
+#endif
+
+class SkData;
+class SkMatrix;
+
+class SkRTShader : public SkShaderBase {
+public:
+    SkRTShader(SkString sksl, sk_sp<SkData> inputs, const SkMatrix* localMatrix, bool isOpaque);
+
+#if SK_SUPPORT_GPU
+    std::unique_ptr<GrFragmentProcessor> asFragmentProcessor(const GrFPArgs&) const override {
+        // TODO
+        return nullptr;
+    }
+#endif
+
+    bool isOpaque() const override { return fIsOpaque; }
+
+protected:
+    void flatten(SkWriteBuffer&) const override;
+    bool onAppendStages(const SkStageRec& rec) const override;
+
+private:
+    SK_FLATTENABLE_HOOKS(SkRTShader)
+
+    SkString fSkSL;
+    sk_sp<SkData> fInputs;
+    const bool fIsOpaque;
+
+    mutable SkMutex fByteCodeMutex;
+    mutable std::unique_ptr<SkSL::ByteCode> fByteCode;
+
+    typedef SkShaderBase INHERITED;
+};
+
+#endif