Dawn: implement a ring buffer for uniform uploads.

GrDawnGpu vends ring buffer slices out of a persistent (larger) buffer.

GrDawnProgramDataManager::setData() now returns a BindGroup containing
the (possibly new) UBO bindings, as well as the texture and sampler
bindings.
Change-Id: Id6694d6f44a815cfbffe4293779bf9bf558a2365
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/235866
Reviewed-by: Greg Daniel <egdaniel@google.com>
Commit-Queue: Stephen White <senorblanco@chromium.org>
diff --git a/src/gpu/dawn/GrDawnProgramDataManager.cpp b/src/gpu/dawn/GrDawnProgramDataManager.cpp
index 45371f4..b2bb013 100644
--- a/src/gpu/dawn/GrDawnProgramDataManager.cpp
+++ b/src/gpu/dawn/GrDawnProgramDataManager.cpp
@@ -263,16 +263,17 @@
     }
 };
 
-void GrDawnProgramDataManager::uploadUniformBuffers(dawn::Buffer geometryBuffer,
-                                                    dawn::Buffer fragmentBuffer) const {
-    if (geometryBuffer && fGeometryUniformsDirty) {
-        geometryBuffer.SetSubData(0, fGeometryUniformSize,
-                                  static_cast<const uint8_t*>(fGeometryUniformData.get()));
-        fGeometryUniformsDirty = false;
+void GrDawnProgramDataManager::uploadUniformBuffers(GrDawnRingBuffer::Slice geometryBuffer,
+                                                    GrDawnRingBuffer::Slice fragmentBuffer) const {
+
+    dawn::Buffer geom = geometryBuffer.fBuffer;
+    dawn::Buffer frag = fragmentBuffer.fBuffer;
+    if (geom && fGeometryUniformsDirty) {
+        geom.SetSubData(geometryBuffer.fOffset, fGeometryUniformSize,
+                        static_cast<const uint8_t*>(fGeometryUniformData.get()));
     }
-    if (fragmentBuffer && fFragmentUniformsDirty) {
-        fragmentBuffer.SetSubData(0, fFragmentUniformSize,
-                                  static_cast<const uint8_t*>(fFragmentUniformData.get()));
-        fFragmentUniformsDirty = false;
+    if (frag && fFragmentUniformsDirty) {
+        frag.SetSubData(fragmentBuffer.fOffset, fFragmentUniformSize,
+                        static_cast<const uint8_t*>(fFragmentUniformData.get()));
     }
 }