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()));
}
}