Fix scissor rect larger than render pass width/height in Metal backend

BUG=dawn:116
TEST=dawn_end2end_tests

Change-Id: I3e36e19d20b271ba58652bcaea973f3999e9e7ac
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/5560
Reviewed-by: Kai Ninomiya <kainino@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Hao Li <hao.x.li@intel.com>
diff --git a/src/dawn_native/metal/CommandBufferMTL.mm b/src/dawn_native/metal/CommandBufferMTL.mm
index bb76ca2..a15adcb 100644
--- a/src/dawn_native/metal/CommandBufferMTL.mm
+++ b/src/dawn_native/metal/CommandBufferMTL.mm
@@ -667,6 +667,15 @@
                     rect.width = cmd->width;
                     rect.height = cmd->height;
 
+                    // The scissor rect x + width must be <= render pass width
+                    if ((rect.x + rect.width) > renderPassCmd->width) {
+                        rect.width = renderPassCmd->width - rect.x;
+                    }
+                    // The scissor rect y + height must be <= render pass height
+                    if ((rect.y + rect.height > renderPassCmd->height)) {
+                        rect.height = renderPassCmd->height - rect.y;
+                    }
+
                     [encoder setScissorRect:rect];
                 } break;