webgpu.h: Reserve 0 for "undefined" in enums, and match spec enum order

Also add some TODOs and fix some formatting.

There is some risk of breakage in other projects if they assumed
certain values would be used when they zero-initialized. In particular:
- AddressMode_Repeat
- BlendFactor_Zero
- BlendOperation_Add
- AlphaMode_Premultiplied
- CullMode_None
- VertexStepMode_Vertex
- MipmapFilterMode_Nearest
- StencilOperation_Keep
- TextureAspect_All

Not done yet:
- DeviceLostReason, because it also needs renaming work (bug 2139)
- Possibly removing any 0 values that aren't needed
- Adding new Undefined values that will need more code changes

Bug: dawn:2224
Change-Id: I115be149fd84a816c8b8e746b5dffbb34b1ca6f4
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/155984
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Loko Kung <lokokung@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
Commit-Queue: Kai Ninomiya <kainino@chromium.org>
diff --git a/dawn.json b/dawn.json
index 53693d2..7d62747 100644
--- a/dawn.json
+++ b/dawn.json
@@ -173,10 +173,10 @@
         "category": "enum",
         "emscripten_no_enum_table": true,
         "values": [
-            {"value": 0, "name": "discrete GPU"},
-            {"value": 1, "name": "integrated GPU"},
-            {"value": 2, "name": "CPU"},
-            {"value": 3, "name": "unknown"}
+            {"value": 1, "name": "discrete GPU"},
+            {"value": 2, "name": "integrated GPU"},
+            {"value": 3, "name": "CPU"},
+            {"value": 4, "name": "unknown"}
         ]
     },
     "device descriptor": {
@@ -225,10 +225,11 @@
     },
     "address mode": {
         "category": "enum",
+        "_comment": "TODO(crbug.com/dawn/2224): Add undefined value here",
         "values": [
-            {"value": 0, "name": "repeat"},
-            {"value": 1, "name": "mirror repeat"},
-            {"value": 2, "name": "clamp to edge"}
+            {"value": 1, "name": "clamp to edge"},
+            {"value": 2, "name": "repeat"},
+            {"value": 3, "name": "mirror repeat"}
         ]
     },
     "backend type": {
@@ -454,34 +455,37 @@
     },
     "blend factor": {
         "category": "enum",
+        "_comment1": "TODO(crbug.com/dawn/2224): Add undefined value here",
+        "_comment2": "TODO(github.com/gpuweb/gpuweb/issues/4283): make sure the dual source blending names match the spec when it lands, and remove the tags.",
         "values": [
-            {"value": 0, "name": "zero"},
-            {"value": 1, "name": "one"},
-            {"value": 2, "name": "src"},
-            {"value": 3, "name": "one minus src"},
-            {"value": 4, "name": "src alpha"},
-            {"value": 5, "name": "one minus src alpha"},
-            {"value": 6, "name": "dst"},
-            {"value": 7, "name": "one minus dst"},
-            {"value": 8, "name": "dst alpha"},
-            {"value": 9, "name": "one minus dst alpha"},
-            {"value": 10, "name": "src alpha saturated"},
-            {"value": 11, "name": "constant"},
-            {"value": 12, "name": "one minus constant"},
-            {"value": 13, "name": "src1", "tags": ["dawn"]},
-            {"value": 14, "name": "one minus src1", "tags": ["dawn"]},
-            {"value": 15, "name": "src1 alpha", "tags": ["dawn"]},
-            {"value": 16, "name": "one minus src1 alpha", "tags": ["dawn"]}
+            {"value": 1, "name": "zero"},
+            {"value": 2, "name": "one"},
+            {"value": 3, "name": "src"},
+            {"value": 4, "name": "one minus src"},
+            {"value": 5, "name": "src alpha"},
+            {"value": 6, "name": "one minus src alpha"},
+            {"value": 7, "name": "dst"},
+            {"value": 8, "name": "one minus dst"},
+            {"value": 9, "name": "dst alpha"},
+            {"value": 10, "name": "one minus dst alpha"},
+            {"value": 11, "name": "src alpha saturated"},
+            {"value": 12, "name": "constant"},
+            {"value": 13, "name": "one minus constant"},
+            {"value": 14, "name": "src1", "tags": ["dawn"]},
+            {"value": 15, "name": "one minus src1", "tags": ["dawn"]},
+            {"value": 16, "name": "src1 alpha", "tags": ["dawn"]},
+            {"value": 17, "name": "one minus src1 alpha", "tags": ["dawn"]}
         ]
     },
     "blend operation": {
         "category": "enum",
+        "_comment": "TODO(crbug.com/dawn/2224): Add undefined value here",
         "values": [
-            {"value": 0, "name": "add"},
-            {"value": 1, "name": "subtract"},
-            {"value": 2, "name": "reverse subtract"},
-            {"value": 3, "name": "min"},
-            {"value": 4, "name": "max"}
+            {"value": 1, "name": "add"},
+            {"value": 2, "name": "subtract"},
+            {"value": 3, "name": "reverse subtract"},
+            {"value": 4, "name": "min"},
+            {"value": 5, "name": "max"}
         ]
     },
     "bool": {
@@ -617,9 +621,9 @@
     "buffer map state": {
         "category": "enum",
         "values": [
-            {"value": 0, "name": "unmapped"},
-            {"value": 1, "name": "pending"},
-            {"value": 2, "name": "mapped"}
+            {"value": 1, "name": "unmapped"},
+            {"value": 2, "name": "pending"},
+            {"value": 3, "name": "mapped"}
         ]
     },
     "buffer usage": {
@@ -827,11 +831,11 @@
             {"value": 0, "name": "undefined", "jsrepr": "undefined", "valid": false},
             {"value": 1, "name": "never"},
             {"value": 2, "name": "less"},
-            {"value": 3, "name": "less equal"},
-            {"value": 4, "name": "greater"},
-            {"value": 5, "name": "greater equal"},
-            {"value": 6, "name": "equal"},
-            {"value": 7, "name": "not equal"},
+            {"value": 3, "name": "equal"},
+            {"value": 4, "name": "less equal"},
+            {"value": 5, "name": "greater"},
+            {"value": 6, "name": "not equal"},
+            {"value": 7, "name": "greater equal"},
             {"value": 8, "name": "always"}
         ]
     },
@@ -879,9 +883,9 @@
         "category": "enum",
         "emscripten_no_enum_table": true,
         "values": [
-            {"value": 0, "name": "error"},
-            {"value": 1, "name": "warning"},
-            {"value": 2, "name": "info"}
+            {"value": 1, "name": "error"},
+            {"value": 2, "name": "warning"},
+            {"value": 3, "name": "info"}
         ]
     },
     "compute pass descriptor": {
@@ -1021,9 +1025,9 @@
         "category": "enum",
         "tags": ["dawn"],
         "values": [
-            {"value": 0, "name": "premultiplied"},
-            {"value": 1, "name": "unpremultiplied"},
-            {"value": 2, "name": "opaque"}
+            {"value": 1, "name": "opaque"},
+            {"value": 2, "name": "premultiplied"},
+            {"value": 3, "name": "unpremultiplied"}
         ]
     },
     "copy texture for browser options": {
@@ -1076,10 +1080,11 @@
     },
     "cull mode": {
         "category": "enum",
+        "_comment": "TODO(crbug.com/dawn/2224): Add undefined value here",
         "values": [
-            {"value": 0, "name": "none"},
-            {"value": 1, "name": "front"},
-            {"value": 2, "name": "back"}
+            {"value": 1, "name": "none"},
+            {"value": 2, "name": "front"},
+            {"value": 3, "name": "back"}
         ]
     },
     "device": {
@@ -1466,9 +1471,9 @@
     "error filter": {
         "category": "enum",
         "values": [
-            {"value": 0, "name": "validation"},
-            {"value": 1, "name": "out of memory"},
-            {"value": 2, "name": "internal"}
+            {"value": 1, "name": "validation"},
+            {"value": 2, "name": "out of memory"},
+            {"value": 3, "name": "internal"}
         ]
     },
     "error type": {
@@ -1487,10 +1492,10 @@
         "category": "enum",
         "tags": ["dawn"],
         "values": [
-            {"value": 0, "name": "verbose"},
-            {"value": 1, "name": "info"},
-            {"value": 2, "name": "warning"},
-            {"value": 3, "name": "error"}
+            {"value": 1, "name": "verbose"},
+            {"value": 2, "name": "info"},
+            {"value": 3, "name": "warning"},
+            {"value": 4, "name": "error"}
         ]
     },
     "extent 2D": {
@@ -1971,9 +1976,10 @@
     },
     "filter mode": {
         "category": "enum",
+        "_comment": "TODO(crbug.com/dawn/2224): Add undefined value here",
         "values": [
-            {"value": 0, "name": "nearest"},
-            {"value": 1, "name": "linear"}
+            {"value": 1, "name": "nearest"},
+            {"value": 2, "name": "linear"}
         ]
     },
     "float": {
@@ -1981,9 +1987,10 @@
     },
     "front face": {
         "category": "enum",
+        "_comment": "TODO(crbug.com/dawn/2224): Add undefined value here",
         "values": [
-            {"value": 0, "name": "CCW"},
-            {"value": 1, "name": "CW"}
+            {"value": 1, "name": "CCW"},
+            {"value": 2, "name": "CW"}
         ]
     },
     "image copy buffer": {
@@ -2082,9 +2089,9 @@
     "callback mode": {
         "category": "enum",
         "values": [
-            {"name": "wait any only", "value": 0},
-            {"name": "allow process events", "value": 1},
-            {"name": "allow spontaneous", "value": 2}
+            {"value": 1, "name": "wait any only"},
+            {"value": 2, "name": "allow process events"},
+            {"value": 3, "name": "allow spontaneous"}
         ]
     },
     "future": {
@@ -2098,12 +2105,12 @@
         "_comment": "TODO(crbug.com/dawn/2053): This could possibly be [[nodiscard]].",
         "emscripten_no_enum_table": true,
         "values": [
-            {"name": "success", "value": 0},
-            {"name": "timed out", "value": 1},
-            {"name": "unsupported timeout", "value": 2},
-            {"name": "unsupported count", "value": 3},
-            {"name": "unsupported mixed sources", "value": 4},
-            {"name": "unknown", "value": 5}
+            {"value": 0, "name": "success"},
+            {"value": 1, "name": "timed out"},
+            {"value": 2, "name": "unsupported timeout"},
+            {"value": 3, "name": "unsupported count"},
+            {"value": 4, "name": "unsupported mixed sources"},
+            {"value": 5, "name": "unknown"}
         ]
     },
     "future wait info": {
@@ -2168,10 +2175,11 @@
     },
     "vertex step mode": {
         "category": "enum",
+        "_comment": "TODO(crbug.com/dawn/2224): Add undefined value here",
         "values": [
-            {"value": 0, "name": "vertex"},
-            {"value": 1, "name": "instance"},
-            {"value": 2, "name": "vertex buffer not used", "jsrepr": "undefined", "valid": true}
+            {"value": 1, "name": "vertex buffer not used"},
+            {"value": 2, "name": "vertex"},
+            {"value": 3, "name": "instance"}
         ]
     },
     "load op": {
@@ -2192,9 +2200,10 @@
     },
     "mipmap filter mode": {
         "category": "enum",
+        "_comment": "TODO(crbug.com/dawn/2224): Add undefined value here",
         "values": [
-            {"value": 0, "name": "nearest"},
-            {"value": 1, "name": "linear"}
+            {"value": 1, "name": "nearest"},
+            {"value": 2, "name": "linear"}
         ]
     },
     "store op": {
@@ -2274,10 +2283,10 @@
         "category": "enum",
         "emscripten_no_enum_table": true,
         "values": [
-            {"value": 0, "name": "fifo"},
-            {"value": 1, "name": "fifo relaxed", "tags": ["upstream"]},
-            {"value": 2, "name": "immediate"},
-            {"value": 3, "name": "mailbox"}
+            {"value": 1, "name": "fifo"},
+            {"value": 2, "name": "fifo relaxed", "tags": ["upstream"]},
+            {"value": 3, "name": "immediate"},
+            {"value": 4, "name": "mailbox"}
         ]
     },
     "programmable stage descriptor": {
@@ -2292,12 +2301,13 @@
     },
     "primitive topology": {
         "category": "enum",
+        "_comment": "TODO(crbug.com/dawn/2224): Add undefined value here",
         "values": [
-            {"value": 0, "name": "point list"},
-            {"value": 1, "name": "line list"},
-            {"value": 2, "name": "line strip"},
-            {"value": 3, "name": "triangle list"},
-            {"value": 4, "name": "triangle strip"}
+            {"value": 1, "name": "point list"},
+            {"value": 2, "name": "line list"},
+            {"value": 3, "name": "line strip"},
+            {"value": 4, "name": "triangle list"},
+            {"value": 5, "name": "triangle strip"}
         ]
     },
     "query set": {
@@ -2335,8 +2345,8 @@
     "query type": {
         "category": "enum",
         "values": [
-            {"value": 0, "name": "occlusion"},
-            {"value": 1, "name": "timestamp"}
+            {"value": 1, "name": "occlusion"},
+            {"value": 2, "name": "timestamp"}
         ]
     },
     "queue": {
@@ -3111,15 +3121,16 @@
     },
     "stencil operation": {
         "category": "enum",
+        "_comment": "TODO(crbug.com/dawn/2224): Add undefined value here",
         "values": [
-            {"value": 0, "name": "keep"},
-            {"value": 1, "name": "zero"},
-            {"value": 2, "name": "replace"},
-            {"value": 3, "name": "invert"},
-            {"value": 4, "name": "increment clamp"},
-            {"value": 5, "name": "decrement clamp"},
-            {"value": 6, "name": "increment wrap"},
-            {"value": 7, "name": "decrement wrap"}
+            {"value": 1, "name": "keep"},
+            {"value": 2, "name": "zero"},
+            {"value": 3, "name": "replace"},
+            {"value": 4, "name": "invert"},
+            {"value": 5, "name": "increment clamp"},
+            {"value": 6, "name": "decrement clamp"},
+            {"value": 7, "name": "increment wrap"},
+            {"value": 8, "name": "decrement wrap"}
         ]
     },
     "stencil face state": {
@@ -3443,13 +3454,14 @@
     },
     "texture aspect": {
         "category": "enum",
+        "_comment": "TODO(crbug.com/dawn/2224): Add undefined value here",
         "values": [
-            {"value": 0, "name": "all"},
-            {"value": 1, "name": "stencil only"},
-            {"value": 2, "name": "depth only"},
-            {"value": 3, "name": "plane 0 only", "tags": ["dawn"]},
-            {"value": 4, "name": "plane 1 only", "tags": ["dawn"]},
-            {"value": 5, "name": "plane 2 only", "tags": ["dawn"]}
+            {"value": 1, "name": "all"},
+            {"value": 2, "name": "stencil only"},
+            {"value": 3, "name": "depth only"},
+            {"value": 4, "name": "plane 0 only", "tags": ["dawn"]},
+            {"value": 5, "name": "plane 1 only", "tags": ["dawn"]},
+            {"value": 6, "name": "plane 2 only", "tags": ["dawn"]}
         ]
     },
     "texture data layout": {
@@ -3486,16 +3498,17 @@
     },
     "texture dimension": {
         "category": "enum",
+        "_comment": "TODO(crbug.com/dawn/2224): Add undefined value here",
         "values": [
-            {"value": 0, "name": "1D"},
-            {"value": 1, "name": "2D"},
-            {"value": 2, "name": "3D"}
+            {"value": 1, "name": "1D"},
+            {"value": 2, "name": "2D"},
+            {"value": 3, "name": "3D"}
         ]
     },
     "texture format": {
         "category": "enum",
         "values": [
-            {"value": 0, "name": "undefined", "valid": false, "jsrepr": "undefined"},
+            {"value": 0, "name": "undefined", "jsrepr": "undefined", "valid": false},
 
             {"value": 1, "name": "R8 unorm"},
             {"value": 2, "name": "R8 snorm"},
@@ -3655,7 +3668,7 @@
     "texture view dimension": {
         "category": "enum",
         "values": [
-            {"value": 0, "name": "undefined", "valid": false, "jsrepr": "undefined"},
+            {"value": 0, "name": "undefined", "jsrepr": "undefined", "valid": false},
             {"value": 1, "name": "1D"},
             {"value": 2, "name": "2D"},
             {"value": 3, "name": "2D array"},
@@ -3667,7 +3680,7 @@
     "vertex format": {
         "category": "enum",
         "values": [
-            {"value": 0,  "name": "undefined", "valid": false, "jsrepr": "undefined"},
+            {"value": 0,  "name": "undefined", "jsrepr": "undefined", "valid": false},
             {"value": 1,  "name": "uint8x2"},
             {"value": 2,  "name": "uint8x4"},
             {"value": 3,  "name": "sint8x2"},
diff --git a/src/dawn/tests/end2end/CopyTextureForBrowserTests.cpp b/src/dawn/tests/end2end/CopyTextureForBrowserTests.cpp
index 7319827..cac8c7e 100644
--- a/src/dawn/tests/end2end/CopyTextureForBrowserTests.cpp
+++ b/src/dawn/tests/end2end/CopyTextureForBrowserTests.cpp
@@ -25,6 +25,7 @@
 // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+#include <string>
 #include <vector>
 
 #include "dawn/common/Constants.h"
@@ -245,9 +246,9 @@
             0,
             0,  // uvec2, subrect copy dst origin
             0,
-            0,  // uvec2, subrect copy size
-            0,  // srcAlphaMode, wgpu::AlphaMode::Premultiplied
-            0   // dstAlphaMode, wgpu::AlphaMode::Premultiplied
+            0,                                                      // uvec2, subrect copy size
+            static_cast<uint32_t>(wgpu::AlphaMode::Premultiplied),  // srcAlphaMode
+            static_cast<uint32_t>(wgpu::AlphaMode::Premultiplied),  // dstAlphaMode
         };
 
         wgpu::BufferDescriptor uniformBufferDesc = {};
@@ -260,7 +261,8 @@
     // shader) instead of CPU after executing CopyTextureForBrowser() to avoid the errors caused by
     // comparing a value generated on CPU to the one generated on GPU.
     wgpu::ComputePipeline MakeTestPipeline() {
-        wgpu::ShaderModule csModule = utils::CreateShaderModule(this->device, R"(
+        std::string shader =
+            R"(
             struct Uniforms {
                 dstTextureFlipY : u32,
                 channelCount    : u32,
@@ -311,9 +313,12 @@
 
                     // Expect the dst texture channels should be all equal to alpha value
                     // after premultiply.
-                    let premultiplied = 0u;
-                    let unpremultiplied = 1u;
-                    let opaque = 2u;
+                    let premultiplied = )" +
+            std::to_string(static_cast<uint32_t>(wgpu::AlphaMode::Premultiplied)) + R"(u;
+                    let unpremultiplied = )" +
+            std::to_string(static_cast<uint32_t>(wgpu::AlphaMode::Unpremultiplied)) + R"(u;
+                    let opaque = )" +
+            std::to_string(static_cast<uint32_t>(wgpu::AlphaMode::Opaque)) + R"(u;
                     if (uniforms.srcAlphaMode == opaque) {
                         srcColor.a = 1.0;
                     }
@@ -361,7 +366,8 @@
                     output.result[outputIndex] = 0u;
                 }
             }
-         )");
+         )";
+        wgpu::ShaderModule csModule = utils::CreateShaderModule(this->device, shader.c_str());
 
         wgpu::ComputePipelineDescriptor csDesc;
         csDesc.compute.module = csModule;