Metal: Optimize Render Pass Command Buffer Execution
Don't set redundant state.
Change-Id: Ie08c290386bc73fec6bc893d9b94846aaf8d55b1
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/135302
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Gregg Tavares <gman@chromium.org>
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Austin Eng <enga@chromium.org>
diff --git a/src/dawn/native/metal/CommandBufferMTL.mm b/src/dawn/native/metal/CommandBufferMTL.mm
index eba8012..c0994a5 100644
--- a/src/dawn/native/metal/CommandBufferMTL.mm
+++ b/src/dawn/native/metal/CommandBufferMTL.mm
@@ -589,8 +589,12 @@
: mLengthTracker(lengthTracker) {}
void OnSetVertexBuffer(VertexBufferSlot slot, Buffer* buffer, uint64_t offset) {
+ id<MTLBuffer> mtlBuffer = buffer->GetMTLBuffer();
+ if (mVertexBuffers[slot] == mtlBuffer && mVertexBufferOffsets[slot] == offset) {
+ return;
+ }
buffer->TrackUsage();
- mVertexBuffers[slot] = buffer->GetMTLBuffer();
+ mVertexBuffers[slot] = mtlBuffer;
mVertexBufferOffsets[slot] = offset;
DAWN_ASSERT(buffer->GetSize() < std::numeric_limits<uint32_t>::max());
@@ -1517,6 +1521,9 @@
case Command::SetRenderPipeline: {
SetRenderPipelineCmd* cmd = iter->NextCommand<SetRenderPipelineCmd>();
RenderPipeline* newPipeline = ToBackend(cmd->pipeline).Get();
+ if (newPipeline == lastPipeline) {
+ break;
+ }
vertexBuffers.OnSetPipeline(lastPipeline, newPipeline);
bindGroups.OnSetPipeline(newPipeline);