Handle Device Lost for Command Encoder Finish

Bug: dawn:68
Change-Id: I3449cdd9e69f3ae44a30f113fd88bd2fce2c94d7
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/15602
Commit-Queue: Kai Ninomiya <kainino@chromium.org>
Reviewed-by: Austin Eng <enga@chromium.org>
Reviewed-by: Rafael Cintron <rafael.cintron@microsoft.com>
Reviewed-by: Kai Ninomiya <kainino@chromium.org>
diff --git a/src/dawn_native/CommandEncoder.cpp b/src/dawn_native/CommandEncoder.cpp
index 9a84237..5185d1b 100644
--- a/src/dawn_native/CommandEncoder.cpp
+++ b/src/dawn_native/CommandEncoder.cpp
@@ -763,6 +763,7 @@
         // state of the encoding context. The internal state is set to finished, and subsequent
         // calls to encode commands will generate errors.
         if (device->ConsumedError(mEncodingContext.Finish()) ||
+            device->ConsumedError(device->ValidateIsAlive()) ||
             (device->IsValidationEnabled() &&
              device->ConsumedError(ValidateFinish(mEncodingContext.GetIterator(),
                                                   mEncodingContext.GetPassUsages())))) {
diff --git a/src/tests/end2end/DeviceLostTests.cpp b/src/tests/end2end/DeviceLostTests.cpp
index c5471f1..103d6f4 100644
--- a/src/tests/end2end/DeviceLostTests.cpp
+++ b/src/tests/end2end/DeviceLostTests.cpp
@@ -357,4 +357,13 @@
     ASSERT_DEVICE_ERROR(buffer.SetSubData(0, sizeof(float), data.data()));
 }
 
+// Test that Command Encoder Finish fails when device lost
+TEST_P(DeviceLostTest, CommandEncoderFinishFails) {
+    wgpu::CommandBuffer commands;
+    wgpu::CommandEncoder encoder = device.CreateCommandEncoder();
+
+    SetCallbackAndLoseForTesting();
+    ASSERT_DEVICE_ERROR(encoder.Finish());
+}
+
 DAWN_INSTANTIATE_TEST(DeviceLostTest, D3D12Backend, VulkanBackend);
\ No newline at end of file