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/GrDawnRingBuffer.cpp b/src/gpu/dawn/GrDawnRingBuffer.cpp
new file mode 100644
index 0000000..0e26369
--- /dev/null
+++ b/src/gpu/dawn/GrDawnRingBuffer.cpp
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2019 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "src/gpu/dawn/GrDawnRingBuffer.h"
+
+#include "src/gpu/dawn/GrDawnGpu.h"
+#include "src/gpu/dawn/GrDawnUtil.h"
+
+namespace {
+    const int kDefaultSize = 512 * 1024;
+}
+
+GrDawnRingBuffer::GrDawnRingBuffer(GrDawnGpu* gpu, dawn::BufferUsageBit usage)
+    : fGpu(gpu) , fUsage(usage) {
+}
+
+GrDawnRingBuffer::~GrDawnRingBuffer() {
+}
+
+GrDawnRingBuffer::Slice GrDawnRingBuffer::allocate(int size) {
+    if (!fBuffer || fOffset + size > kDefaultSize) {
+        dawn::BufferDescriptor desc;
+        desc.usage = fUsage | dawn::BufferUsageBit::CopyDst;
+        desc.size = kDefaultSize;
+        fBuffer = fGpu->device().CreateBuffer(&desc);
+        fOffset = 0;
+    }
+    int offset = fOffset;
+    fOffset += size;
+    fOffset = GrDawnRoundRowBytes(fOffset);
+    return Slice(fBuffer, offset);
+}