Add missing WebGPU enums and defaulted members.

These additions to dawn.json don't require changes to users of the C++
API so they are done now to prepare for webgpu.h. Validation is added
that forbids using the new enum values and non-default values for
members until they are implemented.

BUG=dawn:22

Change-Id: Ie6f3384243d6874e7aca4b94733409755a066c93
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/8862
Reviewed-by: Austin Eng <enga@chromium.org>
Reviewed-by: Kai Ninomiya <kainino@chromium.org>
Commit-Queue: Kai Ninomiya <kainino@chromium.org>
diff --git a/dawn.json b/dawn.json
index cd2ef5f..e46d656 100644
--- a/dawn.json
+++ b/dawn.json
@@ -56,7 +56,8 @@
             {"name": "binding", "type": "uint32_t"},
             {"name": "visibility", "type": "shader stage bit"},
             {"name": "type", "type": "binding type"},
-            {"name": "dynamic", "type": "bool", "default": "false" }
+            {"name": "dynamic", "type": "bool", "default": "false" },
+            {"name": "multisampled", "type": "bool", "default": "false" }
         ]
     },
     "bind group layout descriptor": {
@@ -72,8 +73,10 @@
         "values": [
             {"value": 0, "name": "uniform buffer"},
             {"value": 1, "name": "storage buffer"},
-            {"value": 2, "name": "sampler"},
-            {"value": 3, "name": "sampled texture"}
+            {"value": 2, "name": "readonly storage buffer"},
+            {"value": 3, "name": "sampler"},
+            {"value": 4, "name": "sampled texture"},
+            {"value": 5, "name": "storage texture"}
         ]
     },
     "blend descriptor": {
@@ -906,7 +909,9 @@
             {"name": "sample count", "type": "uint32_t", "default": "1"},
             {"name": "depth stencil state", "type": "depth stencil state descriptor", "annotation": "const*", "optional": true},
             {"name": "color state count", "type": "uint32_t"},
-            {"name": "color states", "type": "color state descriptor", "annotation": "const*const*", "length": "color state count"}
+            {"name": "color states", "type": "color state descriptor", "annotation": "const*const*", "length": "color state count"},
+            {"name": "sample mask", "type": "uint32_t", "default": "0xFFFFFFFF"},
+            {"name": "alpha to coverage enabled", "type": "bool", "default": "false"}
         ]
     },
     "sampler": {
@@ -1054,7 +1059,9 @@
     "texture dimension": {
         "category": "enum",
         "values": [
-            {"value": 0, "name": "2D"}
+            {"value": 0, "name": "1D"},
+            {"value": 1, "name": "2D"},
+            {"value": 2, "name": "3D"}
         ]
     },
     "texture format": {
@@ -1162,10 +1169,12 @@
     "texture view dimension": {
         "category": "enum",
         "values": [
-            {"value": 0, "name": "2D"},
-            {"value": 1, "name": "2D array"},
-            {"value": 2, "name": "cube"},
-            {"value": 3, "name": "cube array"}
+            {"value": 0, "name": "1D"},
+            {"value": 1, "name": "2D"},
+            {"value": 2, "name": "2D array"},
+            {"value": 3, "name": "cube"},
+            {"value": 4, "name": "cube array"},
+            {"value": 5, "name": "3D"}
         ],
         "TODO": [
             "jiawei.shao@intel.com: support 1D and 3D texture views"
diff --git a/examples/CHelloTriangle.cpp b/examples/CHelloTriangle.cpp
index 184ed63..7df528c 100644
--- a/examples/CHelloTriangle.cpp
+++ b/examples/CHelloTriangle.cpp
@@ -112,6 +112,8 @@
         descriptor.rasterizationState = &rasterizationState;
 
         descriptor.primitiveTopology = DAWN_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
+        descriptor.sampleMask = 0xFFFFFFFF;
+        descriptor.alphaToCoverageEnabled = false;
 
         descriptor.depthStencilState = nullptr;
 
diff --git a/src/dawn_native/BindGroup.cpp b/src/dawn_native/BindGroup.cpp
index 205a158..e94baf2 100644
--- a/src/dawn_native/BindGroup.cpp
+++ b/src/dawn_native/BindGroup.cpp
@@ -138,6 +138,10 @@
                 case dawn::BindingType::Sampler:
                     DAWN_TRY(ValidateSamplerBinding(device, binding));
                     break;
+                case dawn::BindingType::StorageTexture:
+                case dawn::BindingType::ReadonlyStorageBuffer:
+                    UNREACHABLE();
+                    break;
             }
         }
 
diff --git a/src/dawn_native/BindGroupLayout.cpp b/src/dawn_native/BindGroupLayout.cpp
index e646359..90cdb06 100644
--- a/src/dawn_native/BindGroupLayout.cpp
+++ b/src/dawn_native/BindGroupLayout.cpp
@@ -52,6 +52,15 @@
                         return DAWN_VALIDATION_ERROR("Samplers and textures cannot be dynamic");
                     }
                     break;
+                case dawn::BindingType::ReadonlyStorageBuffer:
+                    return DAWN_VALIDATION_ERROR("readonly storage buffers aren't supported (yet)");
+                case dawn::BindingType::StorageTexture:
+                    return DAWN_VALIDATION_ERROR("storage textures aren't supported (yet)");
+            }
+
+            if (binding.multisampled) {
+                return DAWN_VALIDATION_ERROR(
+                    "BindGroupLayoutBinding::multisampled must be false (for now)");
             }
 
             bindingsSet.set(binding.binding);
@@ -62,6 +71,7 @@
     namespace {
         size_t HashBindingInfo(const BindGroupLayoutBase::LayoutBindingInfo& info) {
             size_t hash = Hash(info.mask);
+            HashCombine(&hash, info.dynamic, info.multisampled);
 
             for (uint32_t binding : IterateBitSet(info.mask)) {
                 HashCombine(&hash, info.visibilities[binding], info.types[binding]);
@@ -72,7 +82,7 @@
 
         bool operator==(const BindGroupLayoutBase::LayoutBindingInfo& a,
                         const BindGroupLayoutBase::LayoutBindingInfo& b) {
-            if (a.mask != b.mask) {
+            if (a.mask != b.mask || a.dynamic != b.dynamic || a.multisampled != b.multisampled) {
                 return false;
             }
 
@@ -105,6 +115,8 @@
                 mDynamicBufferCount++;
             }
 
+            mBindingInfo.multisampled.set(index, binding.multisampled);
+
             ASSERT(!mBindingInfo.mask[index]);
             mBindingInfo.mask.set(index);
         }
diff --git a/src/dawn_native/BindGroupLayout.h b/src/dawn_native/BindGroupLayout.h
index c2b5d8c..4607c37 100644
--- a/src/dawn_native/BindGroupLayout.h
+++ b/src/dawn_native/BindGroupLayout.h
@@ -43,6 +43,7 @@
             std::array<dawn::ShaderStageBit, kMaxBindingsPerGroup> visibilities;
             std::array<dawn::BindingType, kMaxBindingsPerGroup> types;
             std::bitset<kMaxBindingsPerGroup> dynamic;
+            std::bitset<kMaxBindingsPerGroup> multisampled;
             std::bitset<kMaxBindingsPerGroup> mask;
         };
         const LayoutBindingInfo& GetBindingInfo() const;
diff --git a/src/dawn_native/CommandEncoder.cpp b/src/dawn_native/CommandEncoder.cpp
index 66129ca..93c0fe5 100644
--- a/src/dawn_native/CommandEncoder.cpp
+++ b/src/dawn_native/CommandEncoder.cpp
@@ -610,6 +610,11 @@
 
                     case dawn::BindingType::Sampler:
                         break;
+
+                    case dawn::BindingType::StorageTexture:
+                    case dawn::BindingType::ReadonlyStorageBuffer:
+                        UNREACHABLE();
+                        break;
                 }
             }
         }
diff --git a/src/dawn_native/RenderPipeline.cpp b/src/dawn_native/RenderPipeline.cpp
index 404e2ae..27973fe 100644
--- a/src/dawn_native/RenderPipeline.cpp
+++ b/src/dawn_native/RenderPipeline.cpp
@@ -305,6 +305,14 @@
             DAWN_TRY(ValidateDepthStencilStateDescriptor(descriptor->depthStencilState));
         }
 
+        if (descriptor->sampleMask != 0xFFFFFFFF) {
+            return DAWN_VALIDATION_ERROR("sampleMask must be 0xFFFFFFFF (for now)");
+        }
+
+        if (descriptor->alphaToCoverageEnabled) {
+            return DAWN_VALIDATION_ERROR("alphaToCoverageEnabled isn't supported (yet)");
+        }
+
         return {};
     }
 
@@ -341,6 +349,8 @@
           mPrimitiveTopology(descriptor->primitiveTopology),
           mRasterizationState(*descriptor->rasterizationState),
           mSampleCount(descriptor->sampleCount),
+          mSampleMask(descriptor->sampleMask),
+          mAlphaToCoverageEnabled(descriptor->alphaToCoverageEnabled),
           mVertexModule(descriptor->vertexStage->module),
           mVertexEntryPoint(descriptor->vertexStage->entryPoint),
           mFragmentModule(descriptor->fragmentStage->module),
@@ -589,7 +599,8 @@
         }
 
         // Hash other state
-        HashCombine(&hash, pipeline->mSampleCount, pipeline->mPrimitiveTopology);
+        HashCombine(&hash, pipeline->mSampleCount, pipeline->mPrimitiveTopology,
+                    pipeline->mSampleMask, pipeline->mAlphaToCoverageEnabled);
 
         return hash;
     }
@@ -700,7 +711,9 @@
         }
 
         // Check other state
-        if (a->mSampleCount != b->mSampleCount || a->mPrimitiveTopology != b->mPrimitiveTopology) {
+        if (a->mSampleCount != b->mSampleCount || a->mPrimitiveTopology != b->mPrimitiveTopology ||
+            a->mSampleMask != b->mSampleMask ||
+            a->mAlphaToCoverageEnabled != b->mAlphaToCoverageEnabled) {
             return false;
         }
 
diff --git a/src/dawn_native/RenderPipeline.h b/src/dawn_native/RenderPipeline.h
index fd951e4..aedf699 100644
--- a/src/dawn_native/RenderPipeline.h
+++ b/src/dawn_native/RenderPipeline.h
@@ -111,6 +111,8 @@
         dawn::PrimitiveTopology mPrimitiveTopology;
         RasterizationStateDescriptor mRasterizationState;
         uint32_t mSampleCount;
+        uint32_t mSampleMask;
+        bool mAlphaToCoverageEnabled;
 
         // Stage information
         // TODO(cwallez@chromium.org): Store a crypto hash of the modules instead.
diff --git a/src/dawn_native/Texture.cpp b/src/dawn_native/Texture.cpp
index a216fb7..8a83a89 100644
--- a/src/dawn_native/Texture.cpp
+++ b/src/dawn_native/Texture.cpp
@@ -323,6 +323,10 @@
                     "Non-renderable format used with OutputAttachment usage");
             }
 
+            if (descriptor->usage & dawn::TextureUsageBit::Storage) {
+                return DAWN_VALIDATION_ERROR("storage textures aren't supported (yet)");
+            }
+
             return {};
         }
 
@@ -347,6 +351,10 @@
             return DAWN_VALIDATION_ERROR("Cannot create an empty texture");
         }
 
+        if (descriptor->dimension != dawn::TextureDimension::e2D) {
+            return DAWN_VALIDATION_ERROR("Texture dimension must be 2D (for now)");
+        }
+
         DAWN_TRY(ValidateTextureSize(descriptor, format));
 
         return {};
diff --git a/src/dawn_native/d3d12/BindGroupD3D12.cpp b/src/dawn_native/d3d12/BindGroupD3D12.cpp
index 4c1dbae..bfd0cd0 100644
--- a/src/dawn_native/d3d12/BindGroupD3D12.cpp
+++ b/src/dawn_native/d3d12/BindGroupD3D12.cpp
@@ -96,7 +96,12 @@
                                                                     bindingOffsets[bindingIndex]));
                 } break;
 
-                // TODO(shaobo.yan@intel.com): Implement dynamic buffer offset.
+                case dawn::BindingType::StorageTexture:
+                case dawn::BindingType::ReadonlyStorageBuffer:
+                    UNREACHABLE();
+                    break;
+
+                    // TODO(shaobo.yan@intel.com): Implement dynamic buffer offset.
             }
         }
 
diff --git a/src/dawn_native/d3d12/BindGroupLayoutD3D12.cpp b/src/dawn_native/d3d12/BindGroupLayoutD3D12.cpp
index ac419ce..2634464 100644
--- a/src/dawn_native/d3d12/BindGroupLayoutD3D12.cpp
+++ b/src/dawn_native/d3d12/BindGroupLayoutD3D12.cpp
@@ -37,7 +37,13 @@
                 case dawn::BindingType::Sampler:
                     mBindingOffsets[binding] = mDescriptorCounts[Sampler]++;
                     break;
-                // TODO(shaobo.yan@intel.com): Implement dynamic buffer offset.
+
+                case dawn::BindingType::StorageTexture:
+                case dawn::BindingType::ReadonlyStorageBuffer:
+                    UNREACHABLE();
+                    break;
+
+                    // TODO(shaobo.yan@intel.com): Implement dynamic buffer offset.
             }
         }
 
@@ -96,7 +102,13 @@
                 case dawn::BindingType::Sampler:
                     mBindingOffsets[binding] += descriptorOffsets[Sampler];
                     break;
-                // TODO(shaobo.yan@intel.com): Implement dynamic buffer offset.
+
+                case dawn::BindingType::StorageTexture:
+                case dawn::BindingType::ReadonlyStorageBuffer:
+                    UNREACHABLE();
+                    break;
+
+                    // TODO(shaobo.yan@intel.com): Implement dynamic buffer offset.
             }
         }
     }
diff --git a/src/dawn_native/metal/CommandBufferMTL.mm b/src/dawn_native/metal/CommandBufferMTL.mm
index 4187e3f..f960d94 100644
--- a/src/dawn_native/metal/CommandBufferMTL.mm
+++ b/src/dawn_native/metal/CommandBufferMTL.mm
@@ -292,6 +292,11 @@
                             [compute setTexture:textureView->GetMTLTexture() atIndex:computeIndex];
                         }
                     } break;
+
+                    case dawn::BindingType::StorageTexture:
+                    case dawn::BindingType::ReadonlyStorageBuffer:
+                        UNREACHABLE();
+                        break;
                 }
             }
         }
diff --git a/src/dawn_native/metal/PipelineLayoutMTL.mm b/src/dawn_native/metal/PipelineLayoutMTL.mm
index dadd571..282559f 100644
--- a/src/dawn_native/metal/PipelineLayoutMTL.mm
+++ b/src/dawn_native/metal/PipelineLayoutMTL.mm
@@ -53,6 +53,10 @@
                             mIndexInfo[stage][group][binding] = textureIndex;
                             textureIndex++;
                             break;
+                        case dawn::BindingType::StorageTexture:
+                        case dawn::BindingType::ReadonlyStorageBuffer:
+                            UNREACHABLE();
+                            break;
                     }
                 }
             }
diff --git a/src/dawn_native/metal/TextureMTL.mm b/src/dawn_native/metal/TextureMTL.mm
index 900d762..9b7bb52 100644
--- a/src/dawn_native/metal/TextureMTL.mm
+++ b/src/dawn_native/metal/TextureMTL.mm
@@ -60,6 +60,8 @@
                     } else {
                         return (arrayLayers > 1) ? MTLTextureType2DArray : MTLTextureType2D;
                     }
+                default:
+                    UNREACHABLE();
             }
         }
 
diff --git a/src/dawn_native/opengl/CommandBufferGL.cpp b/src/dawn_native/opengl/CommandBufferGL.cpp
index 4922d7c..df6f112 100644
--- a/src/dawn_native/opengl/CommandBufferGL.cpp
+++ b/src/dawn_native/opengl/CommandBufferGL.cpp
@@ -266,6 +266,11 @@
                                            binding.offset, binding.size);
                     } break;
 
+                    case dawn::BindingType::StorageTexture:
+                    case dawn::BindingType::ReadonlyStorageBuffer:
+                        UNREACHABLE();
+                        break;
+
                         // TODO(shaobo.yan@intel.com): Implement dynamic buffer offset.
                 }
             }
diff --git a/src/dawn_native/opengl/PipelineGL.cpp b/src/dawn_native/opengl/PipelineGL.cpp
index 0b3ca2e..2debae8 100644
--- a/src/dawn_native/opengl/PipelineGL.cpp
+++ b/src/dawn_native/opengl/PipelineGL.cpp
@@ -135,7 +135,12 @@
                         // emulation
                         break;
 
-                    // TODO(shaobo.yan@intel.com): Implement dynamic buffer offset.
+                    case dawn::BindingType::StorageTexture:
+                    case dawn::BindingType::ReadonlyStorageBuffer:
+                        UNREACHABLE();
+                        break;
+
+                        // TODO(shaobo.yan@intel.com): Implement dynamic buffer offset.
                 }
             }
         }
diff --git a/src/dawn_native/opengl/PipelineLayoutGL.cpp b/src/dawn_native/opengl/PipelineLayoutGL.cpp
index d8278a6..713c2bc 100644
--- a/src/dawn_native/opengl/PipelineLayoutGL.cpp
+++ b/src/dawn_native/opengl/PipelineLayoutGL.cpp
@@ -54,7 +54,12 @@
                         ssboIndex++;
                         break;
 
-                    // TODO(shaobo.yan@intel.com): Implement dynamic buffer offset
+                    case dawn::BindingType::StorageTexture:
+                    case dawn::BindingType::ReadonlyStorageBuffer:
+                        UNREACHABLE();
+                        break;
+
+                        // TODO(shaobo.yan@intel.com): Implement dynamic buffer offset
                 }
             }
         }
diff --git a/src/tests/unittests/wire/WireArgumentTests.cpp b/src/tests/unittests/wire/WireArgumentTests.cpp
index b9b8edd..c0cce5c 100644
--- a/src/tests/unittests/wire/WireArgumentTests.cpp
+++ b/src/tests/unittests/wire/WireArgumentTests.cpp
@@ -179,6 +179,8 @@
     pipelineDescriptor.colorStates = colorStatesPtr;
 
     pipelineDescriptor.sampleCount = 1;
+    pipelineDescriptor.sampleMask = 0xFFFFFFFF;
+    pipelineDescriptor.alphaToCoverageEnabled = false;
     pipelineDescriptor.layout = layout;
     pipelineDescriptor.vertexInput = &vertexInput;
     pipelineDescriptor.primitiveTopology = DAWN_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
@@ -330,12 +332,12 @@
 TEST_F(WireArgumentTests, StructureOfStructureArrayArgument) {
     static constexpr int NUM_BINDINGS = 3;
     DawnBindGroupLayoutBinding bindings[NUM_BINDINGS]{
-        {0, DAWN_SHADER_STAGE_BIT_VERTEX, DAWN_BINDING_TYPE_SAMPLER},
-        {1, DAWN_SHADER_STAGE_BIT_VERTEX, DAWN_BINDING_TYPE_SAMPLED_TEXTURE},
+        {0, DAWN_SHADER_STAGE_BIT_VERTEX, DAWN_BINDING_TYPE_SAMPLER, false, false},
+        {1, DAWN_SHADER_STAGE_BIT_VERTEX, DAWN_BINDING_TYPE_SAMPLED_TEXTURE, false, false},
         {2,
          static_cast<DawnShaderStageBit>(DAWN_SHADER_STAGE_BIT_VERTEX |
                                          DAWN_SHADER_STAGE_BIT_FRAGMENT),
-         DAWN_BINDING_TYPE_UNIFORM_BUFFER},
+         DAWN_BINDING_TYPE_UNIFORM_BUFFER, false, false},
     };
     DawnBindGroupLayoutDescriptor bglDescriptor;
     bglDescriptor.bindingCount = NUM_BINDINGS;
diff --git a/src/tests/unittests/wire/WireOptionalTests.cpp b/src/tests/unittests/wire/WireOptionalTests.cpp
index 6e92415..84ebd84 100644
--- a/src/tests/unittests/wire/WireOptionalTests.cpp
+++ b/src/tests/unittests/wire/WireOptionalTests.cpp
@@ -149,6 +149,8 @@
     pipelineDescriptor.colorStates = colorStatesPtr;
 
     pipelineDescriptor.sampleCount = 1;
+    pipelineDescriptor.sampleMask = 0xFFFFFFFF;
+    pipelineDescriptor.alphaToCoverageEnabled = false;
     pipelineDescriptor.layout = layout;
     pipelineDescriptor.vertexInput = &vertexInput;
     pipelineDescriptor.primitiveTopology = DAWN_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;