Dawn: implement staging buffer manager.
Use managed staging buffers for texture uploads, uniforms and buffers.
Change-Id: I063707c160236725d27a1d1bfb197d3096a07b34
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/238120
Commit-Queue: Stephen White <senorblanco@chromium.org>
Reviewed-by: Greg Daniel <egdaniel@google.com>
diff --git a/src/gpu/dawn/GrDawnProgramDataManager.cpp b/src/gpu/dawn/GrDawnProgramDataManager.cpp
index b2bb013..573cb98 100644
--- a/src/gpu/dawn/GrDawnProgramDataManager.cpp
+++ b/src/gpu/dawn/GrDawnProgramDataManager.cpp
@@ -263,17 +263,26 @@
}
};
-void GrDawnProgramDataManager::uploadUniformBuffers(GrDawnRingBuffer::Slice geometryBuffer,
+void GrDawnProgramDataManager::uploadUniformBuffers(GrDawnGpu* gpu,
+ GrDawnRingBuffer::Slice geometryBuffer,
GrDawnRingBuffer::Slice fragmentBuffer) const {
-
dawn::Buffer geom = geometryBuffer.fBuffer;
+ uint32_t geomOffset = geometryBuffer.fOffset;
dawn::Buffer frag = fragmentBuffer.fBuffer;
+ uint32_t fragOffset = fragmentBuffer.fOffset;
+ auto copyEncoder = gpu->getCopyEncoder();
if (geom && fGeometryUniformsDirty) {
- geom.SetSubData(geometryBuffer.fOffset, fGeometryUniformSize,
- static_cast<const uint8_t*>(fGeometryUniformData.get()));
+ GrDawnStagingBuffer* stagingBuffer = gpu->getStagingBuffer(fGeometryUniformSize);
+ memcpy(stagingBuffer->fData, fGeometryUniformData.get(), fGeometryUniformSize);
+ stagingBuffer->fBuffer.Unmap();
+ copyEncoder
+ .CopyBufferToBuffer(stagingBuffer->fBuffer, 0, geom, geomOffset, fGeometryUniformSize);
}
if (frag && fFragmentUniformsDirty) {
- frag.SetSubData(fragmentBuffer.fOffset, fFragmentUniformSize,
- static_cast<const uint8_t*>(fFragmentUniformData.get()));
+ GrDawnStagingBuffer* stagingBuffer = gpu->getStagingBuffer(fFragmentUniformSize);
+ memcpy(stagingBuffer->fData, fFragmentUniformData.get(), fFragmentUniformSize);
+ stagingBuffer->fBuffer.Unmap();
+ copyEncoder
+ .CopyBufferToBuffer(stagingBuffer->fBuffer, 0, frag, fragOffset, fFragmentUniformSize);
}
}