Revert "Revert "New approach to GrProcessor uniforms.""

This reverts commit ae59426ea6e9b351d9d52f2a9c12d05023351994.

Bug: skia:12182
Change-Id: I591a0a89ffad1a3d5d867dd247ceeec71b6041a4
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/449516
Reviewed-by: Michael Ludwig <michaelludwig@google.com>
Commit-Queue: Brian Salomon <bsalomon@google.com>
diff --git a/src/gpu/GrUniformDataManager.h b/src/gpu/GrUniformDataManager.h
index b418960..9bb3539 100644
--- a/src/gpu/GrUniformDataManager.h
+++ b/src/gpu/GrUniformDataManager.h
@@ -8,20 +8,41 @@
 #ifndef GrUniformDataManager_DEFINED
 #define GrUniformDataManager_DEFINED
 
-#include "src/gpu/glsl/GrGLSLProgramDataManager.h"
-
 #include "include/private/GrTypesPriv.h"
 #include "include/private/SkTArray.h"
 #include "src/core/SkAutoMalloc.h"
+#include "src/gpu/glsl/GrGLSLProgramDataManager.h"
+
+#include <vector>
+
+class GrProgramInfo;
 
 /**
  * Subclass of GrGLSLProgramDataManager used to store uniforms for a program in a CPU buffer that
- * can be uploaded to a UBO. This currently assumes uniform layouts that are compatible with
- * Vulkan, Dawn, and D3D12. It could be used more broadly if this aspect was made configurable.
+ * can be uploaded to a UBO.
  */
 class GrUniformDataManager : public GrGLSLProgramDataManager {
 public:
-    GrUniformDataManager(uint32_t uniformCount, uint32_t uniformSize);
+    enum class Layout {
+        kStd140,
+        kStd430,
+        kMetal, /** This is our own self-imposed layout we use for Metal. */
+    };
+
+    struct NewUniform {
+        size_t   indexInProcessor = ~0;
+        GrSLType type             = kVoid_GrSLType;
+        int      count            = 0;
+        uint32_t offset           = 0;
+    };
+
+    using ProcessorUniforms = std::vector<NewUniform>;
+    using ProgramUniforms   = std::vector<ProcessorUniforms>;
+
+    GrUniformDataManager(ProgramUniforms,
+                         Layout layout,
+                         uint32_t uniformCount,
+                         uint32_t uniformSize);
 
     void set1i(UniformHandle, int32_t) const override;
     void set1iv(UniformHandle, int arrayCount, const int32_t v[]) const override;
@@ -51,6 +72,8 @@
     // For the uniform data to be dirty so that we will reupload on the next use.
     void markDirty() { fUniformsDirty = true; }
 
+    void setUniforms(const GrProgramInfo& info);
+
 protected:
     struct Uniform {
         uint32_t fOffset;
@@ -71,6 +94,19 @@
 
     mutable SkAutoMalloc fUniformData;
     mutable bool         fUniformsDirty;
+
+private:
+    class UniformManager {
+    public:
+        UniformManager(ProgramUniforms, Layout layout);
+        bool writeUniforms(const GrProgramInfo& info, void* buffer);
+
+    private:
+        ProgramUniforms fUniforms;
+        Layout          fLayout;
+    };
+
+    UniformManager fUniformManager;
 };
 
 #endif