Update majority of tests to use new BindGroupLayoutEntry format

Converts most of the tests to use the new layout, with the exception
of a few that are dependent on additional Dawn changes before the
conversion can happen. The deprecation warning is not enabled yet
due to these remaining changes.

Bug: dawn:527
Change-Id: Idcfd9fc873756f5a9f88de2ce9ab65c66b79bf39
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/35582
Commit-Queue: Brandon Jones <bajones@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
diff --git a/src/tests/end2end/BindGroupTests.cpp b/src/tests/end2end/BindGroupTests.cpp
index fa7a68b..eb31624 100644
--- a/src/tests/end2end/BindGroupTests.cpp
+++ b/src/tests/end2end/BindGroupTests.cpp
@@ -53,7 +53,7 @@
         })");
     }
 
-    wgpu::ShaderModule MakeFSModule(std::vector<wgpu::BindingType> bindingTypes) const {
+    wgpu::ShaderModule MakeFSModule(std::vector<wgpu::BufferBindingType> bindingTypes) const {
         ASSERT(bindingTypes.size() <= kMaxBindGroups);
 
         std::ostringstream fs;
@@ -64,14 +64,14 @@
 
         for (size_t i = 0; i < bindingTypes.size(); ++i) {
             switch (bindingTypes[i]) {
-                case wgpu::BindingType::UniformBuffer:
+                case wgpu::BufferBindingType::Uniform:
                     fs << "layout (std140, set = " << i << ", binding = 0) uniform UniformBuffer"
                        << i << R"( {
                         vec4 color;
                     } buffer)"
                        << i << ";\n";
                     break;
-                case wgpu::BindingType::StorageBuffer:
+                case wgpu::BufferBindingType::Storage:
                     fs << "layout (std430, set = " << i << ", binding = 0) buffer StorageBuffer"
                        << i << R"( {
                         vec4 color;
@@ -97,7 +97,7 @@
     }
 
     wgpu::RenderPipeline MakeTestPipeline(const utils::BasicRenderPass& renderPass,
-                                          std::vector<wgpu::BindingType> bindingTypes,
+                                          std::vector<wgpu::BufferBindingType> bindingTypes,
                                           std::vector<wgpu::BindGroupLayout> bindGroupLayouts) {
         wgpu::ShaderModule vsModule = MakeSimpleVSModule();
         wgpu::ShaderModule fsModule = MakeFSModule(bindingTypes);
@@ -430,12 +430,12 @@
     utils::BasicRenderPass renderPass = utils::CreateBasicRenderPass(device, kRTSize, kRTSize);
 
     wgpu::BindGroupLayout layout = utils::MakeBindGroupLayout(
-        device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::UniformBuffer}});
+        device, {{0, wgpu::ShaderStage::Fragment, wgpu::BufferBindingType::Uniform}});
 
     wgpu::RenderPipeline pipeline =
         MakeTestPipeline(renderPass,
-                         {wgpu::BindingType::UniformBuffer, wgpu::BindingType::UniformBuffer,
-                          wgpu::BindingType::UniformBuffer, wgpu::BindingType::UniformBuffer},
+                         {wgpu::BufferBindingType::Uniform, wgpu::BufferBindingType::Uniform,
+                          wgpu::BufferBindingType::Uniform, wgpu::BufferBindingType::Uniform},
                          {layout, layout, layout, layout});
 
     wgpu::CommandEncoder encoder = device.CreateCommandEncoder();
@@ -479,11 +479,11 @@
 
     // Create a bind group layout which uses a single uniform buffer.
     wgpu::BindGroupLayout layout = utils::MakeBindGroupLayout(
-        device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::UniformBuffer}});
+        device, {{0, wgpu::ShaderStage::Fragment, wgpu::BufferBindingType::Uniform}});
 
     // Create a pipeline that uses the uniform bind group layout.
     wgpu::RenderPipeline pipeline =
-        MakeTestPipeline(renderPass, {wgpu::BindingType::UniformBuffer}, {layout});
+        MakeTestPipeline(renderPass, {wgpu::BufferBindingType::Uniform}, {layout});
 
     wgpu::CommandEncoder encoder = device.CreateCommandEncoder();
     wgpu::RenderPassEncoder pass = encoder.BeginRenderPass(&renderPass.renderPassInfo);
@@ -521,11 +521,11 @@
 
     // Create a bind group layout which uses a single dynamic uniform buffer.
     wgpu::BindGroupLayout layout = utils::MakeBindGroupLayout(
-        device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::UniformBuffer, true}});
+        device, {{0, wgpu::ShaderStage::Fragment, wgpu::BufferBindingType::Uniform, true}});
 
     // Create a pipeline that uses the dynamic uniform bind group layout for two bind groups.
     wgpu::RenderPipeline pipeline = MakeTestPipeline(
-        renderPass, {wgpu::BindingType::UniformBuffer, wgpu::BindingType::UniformBuffer},
+        renderPass, {wgpu::BufferBindingType::Uniform, wgpu::BufferBindingType::Uniform},
         {layout, layout});
 
     // Prepare data RGBAunorm(1, 0, 0, 0.5) and RGBAunorm(0, 1, 0, 0.5). They will be added in the
@@ -582,20 +582,20 @@
 
     // Create a bind group layout which uses a single dynamic uniform buffer.
     wgpu::BindGroupLayout uniformLayout = utils::MakeBindGroupLayout(
-        device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::UniformBuffer, true}});
+        device, {{0, wgpu::ShaderStage::Fragment, wgpu::BufferBindingType::Uniform, true}});
 
     // Create a bind group layout which uses a single dynamic storage buffer.
     wgpu::BindGroupLayout storageLayout = utils::MakeBindGroupLayout(
-        device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::StorageBuffer, true}});
+        device, {{0, wgpu::ShaderStage::Fragment, wgpu::BufferBindingType::Storage, true}});
 
     // Create a pipeline which uses the uniform buffer and storage buffer bind groups.
     wgpu::RenderPipeline pipeline0 = MakeTestPipeline(
-        renderPass, {wgpu::BindingType::UniformBuffer, wgpu::BindingType::StorageBuffer},
+        renderPass, {wgpu::BufferBindingType::Uniform, wgpu::BufferBindingType::Storage},
         {uniformLayout, storageLayout});
 
     // Create a pipeline which uses the uniform buffer bind group twice.
     wgpu::RenderPipeline pipeline1 = MakeTestPipeline(
-        renderPass, {wgpu::BindingType::UniformBuffer, wgpu::BindingType::UniformBuffer},
+        renderPass, {wgpu::BufferBindingType::Uniform, wgpu::BufferBindingType::Uniform},
         {uniformLayout, uniformLayout});
 
     // Prepare data RGBAunorm(1, 0, 0, 0.5) and RGBAunorm(0, 1, 0, 0.5). They will be added in the
@@ -660,24 +660,24 @@
 
     // Create a bind group layout which uses a single dynamic uniform buffer.
     wgpu::BindGroupLayout uniformLayout = utils::MakeBindGroupLayout(
-        device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::UniformBuffer, true}});
+        device, {{0, wgpu::ShaderStage::Fragment, wgpu::BufferBindingType::Uniform, true}});
 
     // Create a bind group layout which uses a single dynamic storage buffer.
     wgpu::BindGroupLayout storageLayout = utils::MakeBindGroupLayout(
-        device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::StorageBuffer, true}});
+        device, {{0, wgpu::ShaderStage::Fragment, wgpu::BufferBindingType::Storage, true}});
 
     // Create a pipeline with pipeline layout (uniform, uniform, storage).
     wgpu::RenderPipeline pipeline0 =
         MakeTestPipeline(renderPass,
-                         {wgpu::BindingType::UniformBuffer, wgpu::BindingType::UniformBuffer,
-                          wgpu::BindingType::StorageBuffer},
+                         {wgpu::BufferBindingType::Uniform, wgpu::BufferBindingType::Uniform,
+                          wgpu::BufferBindingType::Storage},
                          {uniformLayout, uniformLayout, storageLayout});
 
     // Create a pipeline with pipeline layout (uniform, storage, storage).
     wgpu::RenderPipeline pipeline1 =
         MakeTestPipeline(renderPass,
-                         {wgpu::BindingType::UniformBuffer, wgpu::BindingType::StorageBuffer,
-                          wgpu::BindingType::StorageBuffer},
+                         {wgpu::BufferBindingType::Uniform, wgpu::BufferBindingType::Storage,
+                          wgpu::BufferBindingType::Storage},
                          {uniformLayout, storageLayout, storageLayout});
 
     // Prepare color data.
@@ -795,10 +795,10 @@
     // order.
     wgpu::BindGroupLayout bgl = utils::MakeBindGroupLayout(
         device, {
-                    {3, wgpu::ShaderStage::Compute, wgpu::BindingType::ReadonlyStorageBuffer, true},
-                    {0, wgpu::ShaderStage::Compute, wgpu::BindingType::ReadonlyStorageBuffer, true},
-                    {2, wgpu::ShaderStage::Compute, wgpu::BindingType::UniformBuffer, true},
-                    {4, wgpu::ShaderStage::Compute, wgpu::BindingType::StorageBuffer},
+                    {3, wgpu::ShaderStage::Compute, wgpu::BufferBindingType::ReadOnlyStorage, true},
+                    {0, wgpu::ShaderStage::Compute, wgpu::BufferBindingType::ReadOnlyStorage, true},
+                    {2, wgpu::ShaderStage::Compute, wgpu::BufferBindingType::Uniform, true},
+                    {4, wgpu::ShaderStage::Compute, wgpu::BufferBindingType::Storage},
                 });
     wgpu::BindGroup bindGroup = utils::MakeBindGroup(device, bgl,
                                                      {
@@ -1024,7 +1024,7 @@
     wgpu::BindGroup bg;
     {
         wgpu::BindGroupLayout bgl = utils::MakeBindGroupLayout(
-            device, {{0, wgpu::ShaderStage::Vertex, wgpu::BindingType::UniformBuffer}});
+            device, {{0, wgpu::ShaderStage::Vertex, wgpu::BufferBindingType::Uniform}});
         bg = utils::MakeBindGroup(device, bgl, {{0, buffer, 0, sizeof(float)}});
     }
 }
@@ -1086,7 +1086,7 @@
     pipelineDescriptor.cColorStates[0].format = renderPass.colorFormat;
 
     wgpu::BindGroupLayout bgl = utils::MakeBindGroupLayout(
-        device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::StorageBuffer}});
+        device, {{0, wgpu::ShaderStage::Fragment, wgpu::BufferBindingType::Storage}});
 
     pipelineDescriptor.layout = utils::MakeBasicPipelineLayout(device, &bgl);
 
diff --git a/src/tests/end2end/DepthStencilSamplingTests.cpp b/src/tests/end2end/DepthStencilSamplingTests.cpp
index 37c1f37..79e0137 100644
--- a/src/tests/end2end/DepthStencilSamplingTests.cpp
+++ b/src/tests/end2end/DepthStencilSamplingTests.cpp
@@ -211,10 +211,9 @@
         // TODO(dawn:367): Cannot use GetBindGroupLayout for comparison samplers without shader
         // reflection data.
         wgpu::BindGroupLayout bgl = utils::MakeBindGroupLayout(
-            device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::ComparisonSampler},
-                     {1, wgpu::ShaderStage::Fragment, wgpu::BindingType::SampledTexture, false, 0,
-                      wgpu::TextureViewDimension::e2D, wgpu::TextureComponentType::DepthComparison},
-                     {2, wgpu::ShaderStage::Fragment, wgpu::BindingType::UniformBuffer}});
+            device, {{0, wgpu::ShaderStage::Fragment, wgpu::SamplerBindingType::Comparison},
+                     {1, wgpu::ShaderStage::Fragment, wgpu::TextureSampleType::Depth},
+                     {2, wgpu::ShaderStage::Fragment, wgpu::BufferBindingType::Uniform}});
 
         utils::ComboRenderPipelineDescriptor pipelineDescriptor(device);
         pipelineDescriptor.vertexStage.module = vsModule;
@@ -246,11 +245,10 @@
 
         // TODO(dawn:367): Cannot use GetBindGroupLayout without shader reflection data.
         wgpu::BindGroupLayout bgl = utils::MakeBindGroupLayout(
-            device, {{0, wgpu::ShaderStage::Compute, wgpu::BindingType::ComparisonSampler},
-                     {1, wgpu::ShaderStage::Compute, wgpu::BindingType::SampledTexture, false, 0,
-                      wgpu::TextureViewDimension::e2D, wgpu::TextureComponentType::DepthComparison},
-                     {2, wgpu::ShaderStage::Compute, wgpu::BindingType::UniformBuffer},
-                     {3, wgpu::ShaderStage::Compute, wgpu::BindingType::StorageBuffer}});
+            device, {{0, wgpu::ShaderStage::Compute, wgpu::SamplerBindingType::Comparison},
+                     {1, wgpu::ShaderStage::Compute, wgpu::TextureSampleType::Depth},
+                     {2, wgpu::ShaderStage::Compute, wgpu::BufferBindingType::Uniform},
+                     {3, wgpu::ShaderStage::Compute, wgpu::BufferBindingType::Storage}});
 
         wgpu::ComputePipelineDescriptor pipelineDescriptor;
         pipelineDescriptor.layout = utils::MakeBasicPipelineLayout(device, &bgl);
diff --git a/src/tests/end2end/DynamicBufferOffsetTests.cpp b/src/tests/end2end/DynamicBufferOffsetTests.cpp
index a050d3b..7984c4f 100644
--- a/src/tests/end2end/DynamicBufferOffsetTests.cpp
+++ b/src/tests/end2end/DynamicBufferOffsetTests.cpp
@@ -56,13 +56,13 @@
         // Default bind group layout
         mBindGroupLayouts[0] = utils::MakeBindGroupLayout(
             device, {{0, wgpu::ShaderStage::Compute | wgpu::ShaderStage::Fragment,
-                      wgpu::BindingType::UniformBuffer},
+                      wgpu::BufferBindingType::Uniform},
                      {1, wgpu::ShaderStage::Compute | wgpu::ShaderStage::Fragment,
-                      wgpu::BindingType::StorageBuffer},
+                      wgpu::BufferBindingType::Storage},
                      {3, wgpu::ShaderStage::Compute | wgpu::ShaderStage::Fragment,
-                      wgpu::BindingType::UniformBuffer, true},
+                      wgpu::BufferBindingType::Uniform, true},
                      {4, wgpu::ShaderStage::Compute | wgpu::ShaderStage::Fragment,
-                      wgpu::BindingType::StorageBuffer, true}});
+                      wgpu::BufferBindingType::Storage, true}});
 
         // Default bind group
         mBindGroups[0] = utils::MakeBindGroup(device, mBindGroupLayouts[0],
@@ -78,7 +78,7 @@
         // Bind group layout for inheriting test
         mBindGroupLayouts[1] = utils::MakeBindGroupLayout(
             device, {{0, wgpu::ShaderStage::Compute | wgpu::ShaderStage::Fragment,
-                      wgpu::BindingType::UniformBuffer}});
+                      wgpu::BufferBindingType::Uniform}});
 
         // Bind group for inheriting test
         mBindGroups[1] = utils::MakeBindGroup(device, mBindGroupLayouts[1],
diff --git a/src/tests/end2end/ObjectCachingTests.cpp b/src/tests/end2end/ObjectCachingTests.cpp
index d74b80c..1847bbd 100644
--- a/src/tests/end2end/ObjectCachingTests.cpp
+++ b/src/tests/end2end/ObjectCachingTests.cpp
@@ -22,11 +22,11 @@
 // Test that BindGroupLayouts are correctly deduplicated.
 TEST_P(ObjectCachingTest, BindGroupLayoutDeduplication) {
     wgpu::BindGroupLayout bgl = utils::MakeBindGroupLayout(
-        device, {{1, wgpu::ShaderStage::Fragment, wgpu::BindingType::UniformBuffer}});
+        device, {{1, wgpu::ShaderStage::Fragment, wgpu::BufferBindingType::Uniform}});
     wgpu::BindGroupLayout sameBgl = utils::MakeBindGroupLayout(
-        device, {{1, wgpu::ShaderStage::Fragment, wgpu::BindingType::UniformBuffer}});
+        device, {{1, wgpu::ShaderStage::Fragment, wgpu::BufferBindingType::Uniform}});
     wgpu::BindGroupLayout otherBgl = utils::MakeBindGroupLayout(
-        device, {{1, wgpu::ShaderStage::Vertex, wgpu::BindingType::UniformBuffer}});
+        device, {{1, wgpu::ShaderStage::Vertex, wgpu::BufferBindingType::Uniform}});
 
     EXPECT_NE(bgl.Get(), otherBgl.Get());
     EXPECT_EQ(bgl.Get() == sameBgl.Get(), !UsesWire());
@@ -35,11 +35,11 @@
 // Test that two similar bind group layouts won't refer to the same one if they differ by dynamic.
 TEST_P(ObjectCachingTest, BindGroupLayoutDynamic) {
     wgpu::BindGroupLayout bgl = utils::MakeBindGroupLayout(
-        device, {{1, wgpu::ShaderStage::Fragment, wgpu::BindingType::UniformBuffer, true}});
+        device, {{1, wgpu::ShaderStage::Fragment, wgpu::BufferBindingType::Uniform, true}});
     wgpu::BindGroupLayout sameBgl = utils::MakeBindGroupLayout(
-        device, {{1, wgpu::ShaderStage::Fragment, wgpu::BindingType::UniformBuffer, true}});
+        device, {{1, wgpu::ShaderStage::Fragment, wgpu::BufferBindingType::Uniform, true}});
     wgpu::BindGroupLayout otherBgl = utils::MakeBindGroupLayout(
-        device, {{1, wgpu::ShaderStage::Fragment, wgpu::BindingType::UniformBuffer, false}});
+        device, {{1, wgpu::ShaderStage::Fragment, wgpu::BufferBindingType::Uniform, false}});
 
     EXPECT_NE(bgl.Get(), otherBgl.Get());
     EXPECT_EQ(bgl.Get() == sameBgl.Get(), !UsesWire());
@@ -49,14 +49,11 @@
 // textureComponentType
 TEST_P(ObjectCachingTest, BindGroupLayoutTextureComponentType) {
     wgpu::BindGroupLayout bgl = utils::MakeBindGroupLayout(
-        device, {{1, wgpu::ShaderStage::Fragment, wgpu::BindingType::SampledTexture, false, 0,
-                  wgpu::TextureViewDimension::e2D, wgpu::TextureComponentType::Float}});
+        device, {{1, wgpu::ShaderStage::Fragment, wgpu::TextureSampleType::Float}});
     wgpu::BindGroupLayout sameBgl = utils::MakeBindGroupLayout(
-        device, {{1, wgpu::ShaderStage::Fragment, wgpu::BindingType::SampledTexture, false, 0,
-                  wgpu::TextureViewDimension::e2D, wgpu::TextureComponentType::Float}});
+        device, {{1, wgpu::ShaderStage::Fragment, wgpu::TextureSampleType::Float}});
     wgpu::BindGroupLayout otherBgl = utils::MakeBindGroupLayout(
-        device, {{1, wgpu::ShaderStage::Fragment, wgpu::BindingType::SampledTexture, false, 0,
-                  wgpu::TextureViewDimension::e2D, wgpu::TextureComponentType::Uint}});
+        device, {{1, wgpu::ShaderStage::Fragment, wgpu::TextureSampleType::Uint}});
 
     EXPECT_NE(bgl.Get(), otherBgl.Get());
     EXPECT_EQ(bgl.Get() == sameBgl.Get(), !UsesWire());
@@ -66,14 +63,12 @@
 // viewDimension
 TEST_P(ObjectCachingTest, BindGroupLayoutViewDimension) {
     wgpu::BindGroupLayout bgl = utils::MakeBindGroupLayout(
-        device, {{1, wgpu::ShaderStage::Fragment, wgpu::BindingType::SampledTexture, false, 0,
-                  wgpu::TextureViewDimension::e2D, wgpu::TextureComponentType::Float}});
+        device, {{1, wgpu::ShaderStage::Fragment, wgpu::TextureSampleType::Float}});
     wgpu::BindGroupLayout sameBgl = utils::MakeBindGroupLayout(
-        device, {{1, wgpu::ShaderStage::Fragment, wgpu::BindingType::SampledTexture, false, 0,
-                  wgpu::TextureViewDimension::e2D, wgpu::TextureComponentType::Float}});
+        device, {{1, wgpu::ShaderStage::Fragment, wgpu::TextureSampleType::Float}});
     wgpu::BindGroupLayout otherBgl = utils::MakeBindGroupLayout(
-        device, {{1, wgpu::ShaderStage::Fragment, wgpu::BindingType::SampledTexture, false, 0,
-                  wgpu::TextureViewDimension::e2DArray, wgpu::TextureComponentType::Float}});
+        device, {{1, wgpu::ShaderStage::Fragment, wgpu::TextureSampleType::Float,
+                  wgpu::TextureViewDimension::e2DArray}});
 
     EXPECT_NE(bgl.Get(), otherBgl.Get());
     EXPECT_EQ(bgl.Get() == sameBgl.Get(), !UsesWire());
@@ -85,16 +80,16 @@
 
     ASSERT_DEVICE_ERROR(
         wgpu::BindGroupLayout bgl = utils::MakeBindGroupLayout(
-            device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::UniformBuffer},
-                     {0, wgpu::ShaderStage::Fragment, wgpu::BindingType::UniformBuffer}}));
+            device, {{0, wgpu::ShaderStage::Fragment, wgpu::BufferBindingType::Uniform},
+                     {0, wgpu::ShaderStage::Fragment, wgpu::BufferBindingType::Uniform}}));
 }
 
 // Test that PipelineLayouts are correctly deduplicated.
 TEST_P(ObjectCachingTest, PipelineLayoutDeduplication) {
     wgpu::BindGroupLayout bgl = utils::MakeBindGroupLayout(
-        device, {{1, wgpu::ShaderStage::Fragment, wgpu::BindingType::UniformBuffer}});
+        device, {{1, wgpu::ShaderStage::Fragment, wgpu::BufferBindingType::Uniform}});
     wgpu::BindGroupLayout otherBgl = utils::MakeBindGroupLayout(
-        device, {{1, wgpu::ShaderStage::Vertex, wgpu::BindingType::UniformBuffer}});
+        device, {{1, wgpu::ShaderStage::Vertex, wgpu::BufferBindingType::Uniform}});
 
     wgpu::PipelineLayout pl = utils::MakeBasicPipelineLayout(device, &bgl);
     wgpu::PipelineLayout samePl = utils::MakeBasicPipelineLayout(device, &bgl);
@@ -169,9 +164,9 @@
 // Test that ComputePipeline are correctly deduplicated wrt. their layout
 TEST_P(ObjectCachingTest, ComputePipelineDeduplicationOnLayout) {
     wgpu::BindGroupLayout bgl = utils::MakeBindGroupLayout(
-        device, {{1, wgpu::ShaderStage::Fragment, wgpu::BindingType::UniformBuffer}});
+        device, {{1, wgpu::ShaderStage::Fragment, wgpu::BufferBindingType::Uniform}});
     wgpu::BindGroupLayout otherBgl = utils::MakeBindGroupLayout(
-        device, {{1, wgpu::ShaderStage::Vertex, wgpu::BindingType::UniformBuffer}});
+        device, {{1, wgpu::ShaderStage::Vertex, wgpu::BufferBindingType::Uniform}});
 
     wgpu::PipelineLayout pl = utils::MakeBasicPipelineLayout(device, &bgl);
     wgpu::PipelineLayout samePl = utils::MakeBasicPipelineLayout(device, &bgl);
@@ -204,9 +199,9 @@
 // Test that RenderPipelines are correctly deduplicated wrt. their layout
 TEST_P(ObjectCachingTest, RenderPipelineDeduplicationOnLayout) {
     wgpu::BindGroupLayout bgl = utils::MakeBindGroupLayout(
-        device, {{1, wgpu::ShaderStage::Fragment, wgpu::BindingType::UniformBuffer}});
+        device, {{1, wgpu::ShaderStage::Fragment, wgpu::BufferBindingType::Uniform}});
     wgpu::BindGroupLayout otherBgl = utils::MakeBindGroupLayout(
-        device, {{1, wgpu::ShaderStage::Vertex, wgpu::BindingType::UniformBuffer}});
+        device, {{1, wgpu::ShaderStage::Vertex, wgpu::BufferBindingType::Uniform}});
 
     wgpu::PipelineLayout pl = utils::MakeBasicPipelineLayout(device, &bgl);
     wgpu::PipelineLayout samePl = utils::MakeBasicPipelineLayout(device, &bgl);
diff --git a/src/tests/end2end/OpArrayLengthTests.cpp b/src/tests/end2end/OpArrayLengthTests.cpp
index ee28a4f..884378c 100644
--- a/src/tests/end2end/OpArrayLengthTests.cpp
+++ b/src/tests/end2end/OpArrayLengthTests.cpp
@@ -42,9 +42,9 @@
         wgpu::ShaderStage kAllStages =
             wgpu::ShaderStage::Fragment | wgpu::ShaderStage::Vertex | wgpu::ShaderStage::Compute;
         mBindGroupLayout = utils::MakeBindGroupLayout(
-            device, {{0, kAllStages, wgpu::BindingType::ReadonlyStorageBuffer},
-                     {1, kAllStages, wgpu::BindingType::ReadonlyStorageBuffer},
-                     {2, kAllStages, wgpu::BindingType::ReadonlyStorageBuffer}});
+            device, {{0, kAllStages, wgpu::BufferBindingType::ReadOnlyStorage},
+                     {1, kAllStages, wgpu::BufferBindingType::ReadOnlyStorage},
+                     {2, kAllStages, wgpu::BufferBindingType::ReadOnlyStorage}});
 
         mBindGroup = utils::MakeBindGroup(device, mBindGroupLayout,
                                           {
@@ -103,7 +103,7 @@
     wgpu::Buffer resultBuffer = device.CreateBuffer(&bufferDesc);
 
     wgpu::BindGroupLayout resultLayout = utils::MakeBindGroupLayout(
-        device, {{0, wgpu::ShaderStage::Compute, wgpu::BindingType::StorageBuffer}});
+        device, {{0, wgpu::ShaderStage::Compute, wgpu::BufferBindingType::Storage}});
 
     wgpu::BindGroup resultBindGroup =
         utils::MakeBindGroup(device, resultLayout, {{0, resultBuffer, 0, wgpu::kWholeSize}});
diff --git a/src/tests/end2end/StorageTextureTests.cpp b/src/tests/end2end/StorageTextureTests.cpp
index b64d1ff..f7a3816 100644
--- a/src/tests/end2end/StorageTextureTests.cpp
+++ b/src/tests/end2end/StorageTextureTests.cpp
@@ -684,7 +684,7 @@
 // valid on all backends. This test is a regression test for chromium:1061156 and passes by not
 // asserting or crashing.
 TEST_P(StorageTextureTests, BindGroupLayoutWithStorageTextureBindingType) {
-    // wgpu::BindingType::ReadonlyStorageTexture is a valid binding type to create a bind group
+    // ReadOnly is a valid storage texture binding type to create a bind group
     // layout.
     {
         wgpu::BindGroupLayoutEntry entry;
@@ -698,7 +698,7 @@
         device.CreateBindGroupLayout(&descriptor);
     }
 
-    // wgpu::BindingType::WriteonlyStorageTexture is a valid binding type to create a bind group
+    // WriteOnly is a valid storage texture binding type to create a bind group
     // layout.
     {
         wgpu::BindGroupLayoutEntry entry;
diff --git a/src/tests/end2end/SwapChainValidationTests.cpp b/src/tests/end2end/SwapChainValidationTests.cpp
index 24a13da..bc68d96 100644
--- a/src/tests/end2end/SwapChainValidationTests.cpp
+++ b/src/tests/end2end/SwapChainValidationTests.cpp
@@ -266,7 +266,7 @@
     // Check that view doesn't have extra formats like Sampled.
     // TODO(cwallez@chromium.org): also check for [Readonly]Storage once that's implemented.
     wgpu::BindGroupLayout bgl = utils::MakeBindGroupLayout(
-        device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::SampledTexture}});
+        device, {{0, wgpu::ShaderStage::Fragment, wgpu::TextureSampleType::Float}});
     ASSERT_DEVICE_ERROR(utils::MakeBindGroup(device, bgl, {{0, view}}));
 }
 
diff --git a/src/tests/perf_tests/DrawCallPerf.cpp b/src/tests/perf_tests/DrawCallPerf.cpp
index bc7927b..bad2b64 100644
--- a/src/tests/perf_tests/DrawCallPerf.cpp
+++ b/src/tests/perf_tests/DrawCallPerf.cpp
@@ -330,7 +330,7 @@
             mUniformBindGroupLayout = utils::MakeBindGroupLayout(
                 device,
                 {
-                    {0, wgpu::ShaderStage::Fragment, wgpu::BindingType::UniformBuffer, false},
+                    {0, wgpu::ShaderStage::Fragment, wgpu::BufferBindingType::Uniform, false},
                 });
             break;
 
@@ -338,7 +338,7 @@
             mUniformBindGroupLayout = utils::MakeBindGroupLayout(
                 device,
                 {
-                    {0, wgpu::ShaderStage::Fragment, wgpu::BindingType::UniformBuffer, true},
+                    {0, wgpu::ShaderStage::Fragment, wgpu::BufferBindingType::Uniform, true},
                 });
             break;
 
@@ -381,7 +381,7 @@
         // all draws.
         mConstantBindGroupLayout = utils::MakeBindGroupLayout(
             device, {
-                        {0, wgpu::ShaderStage::Fragment, wgpu::BindingType::UniformBuffer, false},
+                        {0, wgpu::ShaderStage::Fragment, wgpu::BufferBindingType::Uniform, false},
                     });
 
         // Create the pipeline layout.
diff --git a/src/tests/unittests/validation/BindGroupValidationTests.cpp b/src/tests/unittests/validation/BindGroupValidationTests.cpp
index 97826db..8d34ead 100644
--- a/src/tests/unittests/validation/BindGroupValidationTests.cpp
+++ b/src/tests/unittests/validation/BindGroupValidationTests.cpp
@@ -92,7 +92,7 @@
 // Check constraints on entryCount
 TEST_F(BindGroupValidationTest, EntryCountMismatch) {
     wgpu::BindGroupLayout layout = utils::MakeBindGroupLayout(
-        device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::Sampler}});
+        device, {{0, wgpu::ShaderStage::Fragment, wgpu::SamplerBindingType::Filtering}});
 
     // Control case: check that a descriptor with one binding is ok
     utils::MakeBindGroup(device, layout, {{0, mSampler}});
@@ -104,7 +104,7 @@
 // Check constraints on BindGroupEntry::binding
 TEST_F(BindGroupValidationTest, WrongBindings) {
     wgpu::BindGroupLayout layout = utils::MakeBindGroupLayout(
-        device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::Sampler}});
+        device, {{0, wgpu::ShaderStage::Fragment, wgpu::SamplerBindingType::Filtering}});
 
     // Control case: check that a descriptor with a binding matching the layout's is ok
     utils::MakeBindGroup(device, layout, {{0, mSampler}});
@@ -116,8 +116,8 @@
 // Check that the same binding cannot be set twice
 TEST_F(BindGroupValidationTest, BindingSetTwice) {
     wgpu::BindGroupLayout layout = utils::MakeBindGroupLayout(
-        device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::Sampler},
-                 {1, wgpu::ShaderStage::Fragment, wgpu::BindingType::Sampler}});
+        device, {{0, wgpu::ShaderStage::Fragment, wgpu::SamplerBindingType::Filtering},
+                 {1, wgpu::ShaderStage::Fragment, wgpu::SamplerBindingType::Filtering}});
 
     // Control case: check that different bindings work
     utils::MakeBindGroup(device, layout, {{0, mSampler}, {1, mSampler}});
@@ -129,7 +129,7 @@
 // Check that a sampler binding must contain exactly one sampler
 TEST_F(BindGroupValidationTest, SamplerBindingType) {
     wgpu::BindGroupLayout layout = utils::MakeBindGroupLayout(
-        device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::Sampler}});
+        device, {{0, wgpu::ShaderStage::Fragment, wgpu::SamplerBindingType::Filtering}});
 
     wgpu::BindGroupEntry binding;
     binding.binding = 0;
@@ -178,7 +178,7 @@
 // Check that a texture binding must contain exactly a texture view
 TEST_F(BindGroupValidationTest, TextureBindingType) {
     wgpu::BindGroupLayout layout = utils::MakeBindGroupLayout(
-        device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::SampledTexture}});
+        device, {{0, wgpu::ShaderStage::Fragment, wgpu::TextureSampleType::Float}});
 
     wgpu::BindGroupEntry binding;
     binding.binding = 0;
@@ -232,7 +232,7 @@
 // Check that a buffer binding must contain exactly a buffer
 TEST_F(BindGroupValidationTest, BufferBindingType) {
     wgpu::BindGroupLayout layout = utils::MakeBindGroupLayout(
-        device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::UniformBuffer}});
+        device, {{0, wgpu::ShaderStage::Fragment, wgpu::BufferBindingType::Uniform}});
 
     wgpu::BindGroupEntry binding;
     binding.binding = 0;
@@ -282,7 +282,7 @@
 // Check that a texture must have the correct usage
 TEST_F(BindGroupValidationTest, TextureUsage) {
     wgpu::BindGroupLayout layout = utils::MakeBindGroupLayout(
-        device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::SampledTexture}});
+        device, {{0, wgpu::ShaderStage::Fragment, wgpu::TextureSampleType::Float}});
 
     // Control case: setting a sampleable texture view works.
     utils::MakeBindGroup(device, layout, {{0, mSampledTextureView}});
@@ -297,8 +297,7 @@
 // Check that a texture must have the correct component type
 TEST_F(BindGroupValidationTest, TextureComponentType) {
     wgpu::BindGroupLayout layout = utils::MakeBindGroupLayout(
-        device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::SampledTexture, false, 0,
-                  wgpu::TextureViewDimension::e2D, wgpu::TextureComponentType::Float}});
+        device, {{0, wgpu::ShaderStage::Fragment, wgpu::TextureSampleType::Float}});
 
     // Control case: setting a Float typed texture view works.
     utils::MakeBindGroup(device, layout, {{0, mSampledTextureView}});
@@ -314,7 +313,7 @@
 // Test which depth-stencil formats are allowed to be sampled (all).
 TEST_F(BindGroupValidationTest, SamplingDepthStencilTexture) {
     wgpu::BindGroupLayout layout = utils::MakeBindGroupLayout(
-        device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::SampledTexture}});
+        device, {{0, wgpu::ShaderStage::Fragment, wgpu::TextureSampleType::Float}});
 
     wgpu::TextureDescriptor desc;
     desc.size = {1, 1, 1};
@@ -356,8 +355,7 @@
 // Check that a texture must have a correct format for DepthComparison
 TEST_F(BindGroupValidationTest, TextureComponentTypeDepthComparison) {
     wgpu::BindGroupLayout depthLayout = utils::MakeBindGroupLayout(
-        device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::SampledTexture, false, 0,
-                  wgpu::TextureViewDimension::e2D, wgpu::TextureComponentType::DepthComparison}});
+        device, {{0, wgpu::ShaderStage::Fragment, wgpu::TextureSampleType::Depth}});
 
     // Control case: setting a depth texture works.
     wgpu::Texture depthTexture =
@@ -372,12 +370,10 @@
 // ::DepthComparison
 TEST_F(BindGroupValidationTest, TextureComponentTypeForDepthTexture) {
     wgpu::BindGroupLayout depthLayout = utils::MakeBindGroupLayout(
-        device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::SampledTexture, false, 0,
-                  wgpu::TextureViewDimension::e2D, wgpu::TextureComponentType::DepthComparison}});
+        device, {{0, wgpu::ShaderStage::Fragment, wgpu::TextureSampleType::Depth}});
 
     wgpu::BindGroupLayout floatLayout = utils::MakeBindGroupLayout(
-        device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::SampledTexture, false, 0,
-                  wgpu::TextureViewDimension::e2D, wgpu::TextureComponentType::Float}});
+        device, {{0, wgpu::ShaderStage::Fragment, wgpu::TextureSampleType::Float}});
 
     wgpu::Texture depthTexture =
         CreateTexture(wgpu::TextureUsage::Sampled, wgpu::TextureFormat::Depth32Float, 1);
@@ -389,8 +385,7 @@
 // Check that a texture must have the correct dimension
 TEST_F(BindGroupValidationTest, TextureDimension) {
     wgpu::BindGroupLayout layout = utils::MakeBindGroupLayout(
-        device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::SampledTexture, false, 0,
-                  wgpu::TextureViewDimension::e2D, wgpu::TextureComponentType::Float}});
+        device, {{0, wgpu::ShaderStage::Fragment, wgpu::TextureSampleType::Float}});
 
     // Control case: setting a 2D texture view works.
     utils::MakeBindGroup(device, layout, {{0, mSampledTextureView}});
@@ -406,7 +401,7 @@
 // Check that a UBO must have the correct usage
 TEST_F(BindGroupValidationTest, BufferUsageUBO) {
     wgpu::BindGroupLayout layout = utils::MakeBindGroupLayout(
-        device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::UniformBuffer}});
+        device, {{0, wgpu::ShaderStage::Fragment, wgpu::BufferBindingType::Uniform}});
 
     // Control case: using a buffer with the uniform usage works
     utils::MakeBindGroup(device, layout, {{0, mUBO, 0, 256}});
@@ -418,7 +413,7 @@
 // Check that a SSBO must have the correct usage
 TEST_F(BindGroupValidationTest, BufferUsageSSBO) {
     wgpu::BindGroupLayout layout = utils::MakeBindGroupLayout(
-        device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::StorageBuffer}});
+        device, {{0, wgpu::ShaderStage::Fragment, wgpu::BufferBindingType::Storage}});
 
     // Control case: using a buffer with the storage usage works
     utils::MakeBindGroup(device, layout, {{0, mSSBO, 0, 256}});
@@ -430,7 +425,7 @@
 // Check that a readonly SSBO must have the correct usage
 TEST_F(BindGroupValidationTest, BufferUsageReadonlySSBO) {
     wgpu::BindGroupLayout layout = utils::MakeBindGroupLayout(
-        device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::ReadonlyStorageBuffer}});
+        device, {{0, wgpu::ShaderStage::Fragment, wgpu::BufferBindingType::ReadOnlyStorage}});
 
     // Control case: using a buffer with the storage usage works
     utils::MakeBindGroup(device, layout, {{0, mSSBO, 0, 256}});
@@ -443,7 +438,7 @@
 TEST_F(BindGroupValidationTest, BufferOffsetAlignment) {
     wgpu::BindGroupLayout layout = utils::MakeBindGroupLayout(
         device, {
-                    {0, wgpu::ShaderStage::Vertex, wgpu::BindingType::UniformBuffer},
+                    {0, wgpu::ShaderStage::Vertex, wgpu::BufferBindingType::Uniform},
                 });
 
     // Check that offset 0 is valid
@@ -461,8 +456,8 @@
 // Tests constraints on the texture for MultisampledTexture bindings
 TEST_F(BindGroupValidationTest, MultisampledTexture) {
     wgpu::BindGroupLayout layout = utils::MakeBindGroupLayout(
-        device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::MultisampledTexture, false, 0,
-                  wgpu::TextureViewDimension::e2D, wgpu::TextureComponentType::Float}});
+        device, {{0, wgpu::ShaderStage::Fragment, wgpu::TextureSampleType::Float,
+                  wgpu::TextureViewDimension::e2D, true}});
 
     wgpu::BindGroupEntry binding;
     binding.binding = 0;
@@ -503,7 +498,7 @@
 TEST_F(BindGroupValidationTest, BufferBindingOOB) {
     wgpu::BindGroupLayout layout = utils::MakeBindGroupLayout(
         device, {
-                    {0, wgpu::ShaderStage::Vertex, wgpu::BindingType::UniformBuffer},
+                    {0, wgpu::ShaderStage::Vertex, wgpu::BufferBindingType::Uniform},
                 });
 
     wgpu::BufferDescriptor descriptor;
@@ -549,14 +544,14 @@
     wgpu::Buffer buffer = device.CreateBuffer(&descriptor);
 
     wgpu::BindGroupLayout uniformLayout = utils::MakeBindGroupLayout(
-        device, {{0, wgpu::ShaderStage::Vertex, wgpu::BindingType::UniformBuffer}});
+        device, {{0, wgpu::ShaderStage::Vertex, wgpu::BufferBindingType::Uniform}});
 
     // Success case, this is exactly the limit
     utils::MakeBindGroup(device, uniformLayout, {{0, buffer, 0, kMaxUniformBufferBindingSize}});
 
     wgpu::BindGroupLayout doubleUniformLayout = utils::MakeBindGroupLayout(
-        device, {{0, wgpu::ShaderStage::Vertex, wgpu::BindingType::UniformBuffer},
-                 {1, wgpu::ShaderStage::Vertex, wgpu::BindingType::UniformBuffer}});
+        device, {{0, wgpu::ShaderStage::Vertex, wgpu::BufferBindingType::Uniform},
+                 {1, wgpu::ShaderStage::Vertex, wgpu::BufferBindingType::Uniform}});
 
     // Success case, individual bindings don't exceed the limit
     utils::MakeBindGroup(device, doubleUniformLayout,
@@ -569,9 +564,9 @@
 
     // Making sure the constraint doesn't apply to storage buffers
     wgpu::BindGroupLayout readonlyStorageLayout = utils::MakeBindGroupLayout(
-        device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::ReadonlyStorageBuffer}});
+        device, {{0, wgpu::ShaderStage::Fragment, wgpu::BufferBindingType::ReadOnlyStorage}});
     wgpu::BindGroupLayout storageLayout = utils::MakeBindGroupLayout(
-        device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::StorageBuffer}});
+        device, {{0, wgpu::ShaderStage::Fragment, wgpu::BufferBindingType::Storage}});
 
     // Success case, storage buffer can still be created.
     utils::MakeBindGroup(device, readonlyStorageLayout,
@@ -583,15 +578,15 @@
 TEST_F(BindGroupValidationTest, ErrorLayout) {
     wgpu::BindGroupLayout goodLayout = utils::MakeBindGroupLayout(
         device, {
-                    {0, wgpu::ShaderStage::Vertex, wgpu::BindingType::UniformBuffer},
+                    {0, wgpu::ShaderStage::Vertex, wgpu::BufferBindingType::Uniform},
                 });
 
     wgpu::BindGroupLayout errorLayout;
     ASSERT_DEVICE_ERROR(
         errorLayout = utils::MakeBindGroupLayout(
             device, {
-                        {0, wgpu::ShaderStage::Vertex, wgpu::BindingType::UniformBuffer},
-                        {0, wgpu::ShaderStage::Vertex, wgpu::BindingType::UniformBuffer},
+                        {0, wgpu::ShaderStage::Vertex, wgpu::BufferBindingType::Uniform},
+                        {0, wgpu::ShaderStage::Vertex, wgpu::BufferBindingType::Uniform},
                     }));
 
     // Control case, creating with the good layout works
@@ -660,7 +655,7 @@
     // Checks that uint32_t max is valid.
     utils::MakeBindGroupLayout(device,
                                {{std::numeric_limits<uint32_t>::max(), wgpu::ShaderStage::Vertex,
-                                 wgpu::BindingType::UniformBuffer}});
+                                 wgpu::BufferBindingType::Uniform}});
 }
 
 // This test verifies that the BindGroupLayout bindings are correctly validated, even if the
@@ -668,44 +663,34 @@
 TEST_F(BindGroupLayoutValidationTest, BindGroupEntry) {
     utils::MakeBindGroupLayout(device,
                                {
-                                   {1, wgpu::ShaderStage::Vertex, wgpu::BindingType::UniformBuffer},
-                                   {0, wgpu::ShaderStage::Vertex, wgpu::BindingType::UniformBuffer},
+                                   {1, wgpu::ShaderStage::Vertex, wgpu::BufferBindingType::Uniform},
+                                   {0, wgpu::ShaderStage::Vertex, wgpu::BufferBindingType::Uniform},
                                });
 }
 
-// Check that dynamic = true is only allowed with buffer bindings.
+// Check that dynamic = true is only allowed buffer bindings.
 TEST_F(BindGroupLayoutValidationTest, DynamicAndTypeCompatibility) {
     utils::MakeBindGroupLayout(
         device, {
-                    {0, wgpu::ShaderStage::Compute, wgpu::BindingType::UniformBuffer, true},
+                    {0, wgpu::ShaderStage::Compute, wgpu::BufferBindingType::Uniform, true},
                 });
 
     utils::MakeBindGroupLayout(
         device, {
-                    {0, wgpu::ShaderStage::Compute, wgpu::BindingType::StorageBuffer, true},
+                    {0, wgpu::ShaderStage::Compute, wgpu::BufferBindingType::Storage, true},
                 });
 
     utils::MakeBindGroupLayout(
         device, {
-                    {0, wgpu::ShaderStage::Compute, wgpu::BindingType::ReadonlyStorageBuffer, true},
+                    {0, wgpu::ShaderStage::Compute, wgpu::BufferBindingType::ReadOnlyStorage, true},
                 });
-
-    ASSERT_DEVICE_ERROR(utils::MakeBindGroupLayout(
-        device, {
-                    {0, wgpu::ShaderStage::Compute, wgpu::BindingType::SampledTexture, true},
-                }));
-
-    ASSERT_DEVICE_ERROR(utils::MakeBindGroupLayout(
-        device, {
-                    {0, wgpu::ShaderStage::Compute, wgpu::BindingType::Sampler, true},
-                }));
 }
 
 // This test verifies that visibility of bindings in BindGroupLayout can be none
 TEST_F(BindGroupLayoutValidationTest, BindGroupLayoutVisibilityNone) {
     utils::MakeBindGroupLayout(device,
                                {
-                                   {0, wgpu::ShaderStage::Vertex, wgpu::BindingType::UniformBuffer},
+                                   {0, wgpu::ShaderStage::Vertex, wgpu::BufferBindingType::Uniform},
                                });
 
     wgpu::BindGroupLayoutEntry entry;
@@ -723,8 +708,8 @@
 TEST_F(BindGroupLayoutValidationTest, BindGroupLayoutVisibilityNoneExpectsBindGroupEntry) {
     wgpu::BindGroupLayout bgl = utils::MakeBindGroupLayout(
         device, {
-                    {0, wgpu::ShaderStage::Vertex, wgpu::BindingType::UniformBuffer},
-                    {1, wgpu::ShaderStage::None, wgpu::BindingType::UniformBuffer},
+                    {0, wgpu::ShaderStage::Vertex, wgpu::BufferBindingType::Uniform},
+                    {1, wgpu::ShaderStage::None, wgpu::BufferBindingType::Uniform},
                 });
     wgpu::BufferDescriptor descriptor;
     descriptor.size = 4;
@@ -765,14 +750,41 @@
 
         auto PopulateEntry = [](utils::BindingLayoutEntryInitializationHelper entry) {
             switch (entry.type) {
+                case wgpu::BindingType::UniformBuffer:
+                    entry.buffer.type = wgpu::BufferBindingType::Uniform;
+                    break;
+                case wgpu::BindingType::StorageBuffer:
+                    entry.buffer.type = wgpu::BufferBindingType::Storage;
+                    break;
+                case wgpu::BindingType::ReadonlyStorageBuffer:
+                    entry.buffer.type = wgpu::BufferBindingType::ReadOnlyStorage;
+                    break;
+
+                case wgpu::BindingType::Sampler:
+                    entry.sampler.type = wgpu::SamplerBindingType::Filtering;
+                    break;
+                case wgpu::BindingType::ComparisonSampler:
+                    entry.sampler.type = wgpu::SamplerBindingType::Comparison;
+                    break;
+
+                case wgpu::BindingType::SampledTexture:
+                    entry.texture.sampleType = wgpu::TextureSampleType::Float;
+                    break;
+
                 case wgpu::BindingType::ReadonlyStorageTexture:
+                    entry.storageTexture.access = wgpu::StorageTextureAccess::ReadOnly;
+                    entry.storageTexture.format = wgpu::TextureFormat::RGBA8Unorm;
+                    break;
                 case wgpu::BindingType::WriteonlyStorageTexture:
-                    entry.storageTextureFormat = wgpu::TextureFormat::RGBA8Unorm;
+                    entry.storageTexture.access = wgpu::StorageTextureAccess::WriteOnly;
+                    entry.storageTexture.format = wgpu::TextureFormat::RGBA8Unorm;
                     break;
                 default:
-                    break;
+                    return entry;
             }
 
+            entry.type = wgpu::BindingType::Undefined;
+
             return entry;
         };
 
@@ -843,17 +855,17 @@
 
     for (uint32_t i = 0; i < kMaxDynamicUniformBuffersPerPipelineLayout; ++i) {
         maxUniformDB.push_back(utils::BindingLayoutEntryInitializationHelper(
-            i, wgpu::ShaderStage::Compute, wgpu::BindingType::UniformBuffer, true));
+            i, wgpu::ShaderStage::Compute, wgpu::BufferBindingType::Uniform, true));
     }
 
     for (uint32_t i = 0; i < kMaxDynamicStorageBuffersPerPipelineLayout; ++i) {
         maxStorageDB.push_back(utils::BindingLayoutEntryInitializationHelper(
-            i, wgpu::ShaderStage::Compute, wgpu::BindingType::StorageBuffer, true));
+            i, wgpu::ShaderStage::Compute, wgpu::BufferBindingType::Storage, true));
     }
 
     for (uint32_t i = 0; i < kMaxDynamicStorageBuffersPerPipelineLayout; ++i) {
         maxReadonlyStorageDB.push_back(utils::BindingLayoutEntryInitializationHelper(
-            i, wgpu::ShaderStage::Compute, wgpu::BindingType::ReadonlyStorageBuffer, true));
+            i, wgpu::ShaderStage::Compute, wgpu::BufferBindingType::ReadOnlyStorage, true));
     }
 
     // Test creating with the maxes works
@@ -876,7 +888,7 @@
         bgl[0] = MakeBindGroupLayout(maxUniformDB.data(), maxUniformDB.size());
         bgl[1] = utils::MakeBindGroupLayout(
             device, {
-                        {0, wgpu::ShaderStage::Fragment, wgpu::BindingType::UniformBuffer, true},
+                        {0, wgpu::ShaderStage::Fragment, wgpu::BufferBindingType::Uniform, true},
                     });
 
         TestCreatePipelineLayout(bgl, 2, false);
@@ -887,7 +899,7 @@
         bgl[0] = MakeBindGroupLayout(maxStorageDB.data(), maxStorageDB.size());
         bgl[1] = utils::MakeBindGroupLayout(
             device, {
-                        {0, wgpu::ShaderStage::Fragment, wgpu::BindingType::StorageBuffer, true},
+                        {0, wgpu::ShaderStage::Fragment, wgpu::BufferBindingType::Storage, true},
                     });
 
         TestCreatePipelineLayout(bgl, 2, false);
@@ -899,7 +911,7 @@
         bgl[1] = utils::MakeBindGroupLayout(
             device,
             {
-                {0, wgpu::ShaderStage::Fragment, wgpu::BindingType::ReadonlyStorageBuffer, true},
+                {0, wgpu::ShaderStage::Fragment, wgpu::BufferBindingType::ReadOnlyStorage, true},
             });
 
         TestCreatePipelineLayout(bgl, 2, false);
@@ -912,7 +924,7 @@
         bgl[1] = utils::MakeBindGroupLayout(
             device,
             {
-                {0, wgpu::ShaderStage::Fragment, wgpu::BindingType::ReadonlyStorageBuffer, true},
+                {0, wgpu::ShaderStage::Fragment, wgpu::BufferBindingType::ReadOnlyStorage, true},
             });
 
         TestCreatePipelineLayout(bgl, 2, false);
@@ -922,7 +934,7 @@
     {
         maxUniformDB.push_back(utils::BindingLayoutEntryInitializationHelper(
             kMaxDynamicUniformBuffersPerPipelineLayout, wgpu::ShaderStage::Fragment,
-            wgpu::BindingType::UniformBuffer, true));
+            wgpu::BufferBindingType::Uniform, true));
         TestCreateBindGroupLayout(maxUniformDB.data(), maxUniformDB.size(), false);
     }
 
@@ -930,7 +942,7 @@
     {
         maxStorageDB.push_back(utils::BindingLayoutEntryInitializationHelper(
             kMaxDynamicStorageBuffersPerPipelineLayout, wgpu::ShaderStage::Fragment,
-            wgpu::BindingType::StorageBuffer, true));
+            wgpu::BufferBindingType::Storage, true));
         TestCreateBindGroupLayout(maxStorageDB.data(), maxStorageDB.size(), false);
     }
 
@@ -938,7 +950,7 @@
     {
         maxReadonlyStorageDB.push_back(utils::BindingLayoutEntryInitializationHelper(
             kMaxDynamicStorageBuffersPerPipelineLayout, wgpu::ShaderStage::Fragment,
-            wgpu::BindingType::ReadonlyStorageBuffer, true));
+            wgpu::BufferBindingType::ReadOnlyStorage, true));
         TestCreateBindGroupLayout(maxReadonlyStorageDB.data(), maxReadonlyStorageDB.size(), false);
     }
 }
@@ -946,92 +958,84 @@
 // Test that multisampled textures must be 2D sampled textures
 TEST_F(BindGroupLayoutValidationTest, MultisampledTextureViewDimension) {
     // Multisampled 2D texture works.
-    utils::MakeBindGroupLayout(
-        device, {
-                    {0, wgpu::ShaderStage::Compute, wgpu::BindingType::MultisampledTexture, false,
-                     0, wgpu::TextureViewDimension::e2D},
-                });
+    utils::MakeBindGroupLayout(device,
+                               {
+                                   {0, wgpu::ShaderStage::Compute, wgpu::TextureSampleType::Float,
+                                    wgpu::TextureViewDimension::e2D, true},
+                               });
 
     // Multisampled 2D (defaulted) texture works.
-    utils::MakeBindGroupLayout(
-        device, {
-                    {0, wgpu::ShaderStage::Compute, wgpu::BindingType::MultisampledTexture, false,
-                     0, wgpu::TextureViewDimension::Undefined},
-                });
+    utils::MakeBindGroupLayout(device,
+                               {
+                                   {0, wgpu::ShaderStage::Compute, wgpu::TextureSampleType::Float,
+                                    wgpu::TextureViewDimension::Undefined, true},
+                               });
 
     // Multisampled 2D array texture is invalid.
     ASSERT_DEVICE_ERROR(utils::MakeBindGroupLayout(
         device, {
-                    {0, wgpu::ShaderStage::Compute, wgpu::BindingType::MultisampledTexture, false,
-                     0, wgpu::TextureViewDimension::e2DArray},
+                    {0, wgpu::ShaderStage::Compute, wgpu::TextureSampleType::Float,
+                     wgpu::TextureViewDimension::e2DArray, true},
                 }));
 
     // Multisampled cube texture is invalid.
     ASSERT_DEVICE_ERROR(utils::MakeBindGroupLayout(
         device, {
-                    {0, wgpu::ShaderStage::Compute, wgpu::BindingType::MultisampledTexture, false,
-                     0, wgpu::TextureViewDimension::Cube},
+                    {0, wgpu::ShaderStage::Compute, wgpu::TextureSampleType::Float,
+                     wgpu::TextureViewDimension::Cube, true},
                 }));
 
     // Multisampled cube array texture is invalid.
     ASSERT_DEVICE_ERROR(utils::MakeBindGroupLayout(
         device, {
-                    {0, wgpu::ShaderStage::Compute, wgpu::BindingType::MultisampledTexture, false,
-                     0, wgpu::TextureViewDimension::CubeArray},
+                    {0, wgpu::ShaderStage::Compute, wgpu::TextureSampleType::Float,
+                     wgpu::TextureViewDimension::CubeArray, true},
                 }));
 
     // Multisampled 3D texture is invalid.
     ASSERT_DEVICE_ERROR(utils::MakeBindGroupLayout(
         device, {
-                    {0, wgpu::ShaderStage::Compute, wgpu::BindingType::MultisampledTexture, false,
-                     0, wgpu::TextureViewDimension::e3D},
+                    {0, wgpu::ShaderStage::Compute, wgpu::TextureSampleType::Float,
+                     wgpu::TextureViewDimension::e3D, true},
                 }));
 
     // Multisampled 1D texture is invalid.
     ASSERT_DEVICE_ERROR(utils::MakeBindGroupLayout(
         device, {
-                    {0, wgpu::ShaderStage::Compute, wgpu::BindingType::MultisampledTexture, false,
-                     0, wgpu::TextureViewDimension::e1D},
+                    {0, wgpu::ShaderStage::Compute, wgpu::TextureSampleType::Float,
+                     wgpu::TextureViewDimension::e1D, true},
                 }));
 }
 
 // Test that multisampled textures cannot be DepthComparison
 TEST_F(BindGroupLayoutValidationTest, MultisampledTextureComponentType) {
     // Multisampled float component type works.
-    utils::MakeBindGroupLayout(
-        device, {
-                    {0, wgpu::ShaderStage::Compute, wgpu::BindingType::MultisampledTexture, false,
-                     0, wgpu::TextureViewDimension::e2D, wgpu::TextureComponentType::Float},
-                });
-
-    // Multisampled float (defaulted) component type works.
-    utils::MakeBindGroupLayout(
-        device, {
-                    {0, wgpu::ShaderStage::Compute, wgpu::BindingType::MultisampledTexture, false,
-                     0, wgpu::TextureViewDimension::e2D},
-                });
+    utils::MakeBindGroupLayout(device,
+                               {
+                                   {0, wgpu::ShaderStage::Compute, wgpu::TextureSampleType::Float,
+                                    wgpu::TextureViewDimension::e2D, true},
+                               });
 
     // Multisampled uint component type works.
-    utils::MakeBindGroupLayout(
-        device, {
-                    {0, wgpu::ShaderStage::Compute, wgpu::BindingType::MultisampledTexture, false,
-                     0, wgpu::TextureViewDimension::e2D, wgpu::TextureComponentType::Uint},
-                });
+    utils::MakeBindGroupLayout(device,
+                               {
+                                   {0, wgpu::ShaderStage::Compute, wgpu::TextureSampleType::Uint,
+                                    wgpu::TextureViewDimension::e2D, true},
+                               });
 
     // Multisampled sint component type works.
-    utils::MakeBindGroupLayout(
-        device, {
-                    {0, wgpu::ShaderStage::Compute, wgpu::BindingType::MultisampledTexture, false,
-                     0, wgpu::TextureViewDimension::e2D, wgpu::TextureComponentType::Sint},
-                });
+    utils::MakeBindGroupLayout(device,
+                               {
+                                   {0, wgpu::ShaderStage::Compute, wgpu::TextureSampleType::Sint,
+                                    wgpu::TextureViewDimension::e2D, true},
+                               });
 
     // Multisampled depth comparison component typeworks.
     ASSERT_DEVICE_ERROR(utils::MakeBindGroupLayout(
-        device,
-        {
-            {0, wgpu::ShaderStage::Compute, wgpu::BindingType::MultisampledTexture, false, 0,
-             wgpu::TextureViewDimension::e2D, wgpu::TextureComponentType::DepthComparison},
-        }));
+        device, {
+                    {0, wgpu::ShaderStage::Compute, wgpu::TextureSampleType::Depth,
+                     wgpu::TextureViewDimension::e2D, true},
+                }));
 }
 
 constexpr uint64_t kBufferSize = 3 * kMinDynamicBufferOffsetAlignment + 8;
@@ -1044,13 +1048,13 @@
 
         mBindGroupLayout = utils::MakeBindGroupLayout(
             device, {{0, wgpu::ShaderStage::Compute | wgpu::ShaderStage::Fragment,
-                      wgpu::BindingType::UniformBuffer, true},
+                      wgpu::BufferBindingType::Uniform, true},
                      {1, wgpu::ShaderStage::Compute | wgpu::ShaderStage::Fragment,
-                      wgpu::BindingType::UniformBuffer, false},
+                      wgpu::BufferBindingType::Uniform, false},
                      {2, wgpu::ShaderStage::Compute | wgpu::ShaderStage::Fragment,
-                      wgpu::BindingType::StorageBuffer, true},
+                      wgpu::BufferBindingType::Storage, true},
                      {3, wgpu::ShaderStage::Compute | wgpu::ShaderStage::Fragment,
-                      wgpu::BindingType::ReadonlyStorageBuffer, true}});
+                      wgpu::BufferBindingType::ReadOnlyStorage, true}});
     }
 
     wgpu::Buffer CreateBuffer(uint64_t bufferSize, wgpu::BufferUsage usage) {
@@ -1201,7 +1205,7 @@
     // Set up bind group that is incompatible
     wgpu::BindGroupLayout invalidLayout = utils::MakeBindGroupLayout(
         device, {{0, wgpu::ShaderStage::Compute | wgpu::ShaderStage::Fragment,
-                  wgpu::BindingType::StorageBuffer}});
+                  wgpu::BufferBindingType::Storage}});
     wgpu::BindGroup invalidGroup =
         utils::MakeBindGroup(device, invalidLayout, {{0, storageBuffer, 0, kBindingSize}});
 
@@ -1366,9 +1370,9 @@
     // binding number before type.
     wgpu::BindGroupLayout bgl = utils::MakeBindGroupLayout(
         device, {
-                    {3, wgpu::ShaderStage::Compute, wgpu::BindingType::ReadonlyStorageBuffer, true},
-                    {0, wgpu::ShaderStage::Compute, wgpu::BindingType::ReadonlyStorageBuffer, true},
-                    {2, wgpu::ShaderStage::Compute, wgpu::BindingType::UniformBuffer, true},
+                    {3, wgpu::ShaderStage::Compute, wgpu::BufferBindingType::ReadOnlyStorage, true},
+                    {0, wgpu::ShaderStage::Compute, wgpu::BufferBindingType::ReadOnlyStorage, true},
+                    {2, wgpu::ShaderStage::Compute, wgpu::BufferBindingType::Uniform, true},
                 });
 
     // Create buffers which are 3x, 2x, and 1x the size of the minimum buffer offset, plus 4 bytes
@@ -1482,7 +1486,7 @@
 
     // Generates bind group layouts and a pipeline from a 2D list of binding types.
     std::tuple<std::vector<wgpu::BindGroupLayout>, wgpu::RenderPipeline> SetUpLayoutsAndPipeline(
-        std::vector<std::vector<wgpu::BindingType>> layouts) {
+        std::vector<std::vector<wgpu::BufferBindingType>> layouts) {
         std::vector<wgpu::BindGroupLayout> bindGroupLayouts(layouts.size());
 
         // Iterate through the desired bind group layouts.
@@ -1493,7 +1497,7 @@
             // Iterate through binding types and populate a list of BindGroupLayoutEntrys.
             for (uint32_t b = 0; b < layout.size(); ++b) {
                 bindings[b] = utils::BindingLayoutEntryInitializationHelper(
-                    b, wgpu::ShaderStage::Fragment, layout[b], false);
+                    b, wgpu::ShaderStage::Fragment, layout[b]);
             }
 
             // Create the bind group layout.
@@ -1520,14 +1524,14 @@
             const auto& layout = layouts[l];
 
             for (uint32_t b = 0; b < layout.size(); ++b) {
-                wgpu::BindingType binding = layout[b];
+                wgpu::BufferBindingType binding = layout[b];
                 ss << "[[set(" << l << "), binding(" << b << ")]] ";
                 switch (binding) {
-                    case wgpu::BindingType::StorageBuffer:
+                    case wgpu::BufferBindingType::Storage:
                         ss << "var<storage_buffer> set" << l << "_binding" << b
                            << " : [[access(read_write)]] S;";
                         break;
-                    case wgpu::BindingType::UniformBuffer:
+                    case wgpu::BufferBindingType::Uniform:
                         ss << "var<uniform> set" << l << "_binding" << b << " : S;";
                         break;
                     default:
@@ -1559,12 +1563,12 @@
     wgpu::RenderPipeline pipeline;
     std::tie(bindGroupLayouts, pipeline) = SetUpLayoutsAndPipeline({{
         {{
-            wgpu::BindingType::UniformBuffer,
-            wgpu::BindingType::UniformBuffer,
+            wgpu::BufferBindingType::Uniform,
+            wgpu::BufferBindingType::Uniform,
         }},
         {{
-            wgpu::BindingType::StorageBuffer,
-            wgpu::BindingType::UniformBuffer,
+            wgpu::BufferBindingType::Storage,
+            wgpu::BufferBindingType::Uniform,
         }},
     }});
 
@@ -1600,12 +1604,12 @@
     wgpu::RenderPipeline pipelineA;
     std::tie(bindGroupLayoutsA, pipelineA) = SetUpLayoutsAndPipeline({{
         {{
-            wgpu::BindingType::UniformBuffer,
-            wgpu::BindingType::StorageBuffer,
+            wgpu::BufferBindingType::Uniform,
+            wgpu::BufferBindingType::Storage,
         }},
         {{
-            wgpu::BindingType::UniformBuffer,
-            wgpu::BindingType::UniformBuffer,
+            wgpu::BufferBindingType::Uniform,
+            wgpu::BufferBindingType::Uniform,
         }},
     }});
 
@@ -1613,12 +1617,12 @@
     wgpu::RenderPipeline pipelineB;
     std::tie(bindGroupLayoutsB, pipelineB) = SetUpLayoutsAndPipeline({{
         {{
-            wgpu::BindingType::StorageBuffer,
-            wgpu::BindingType::UniformBuffer,
+            wgpu::BufferBindingType::Storage,
+            wgpu::BufferBindingType::Uniform,
         }},
         {{
-            wgpu::BindingType::UniformBuffer,
-            wgpu::BindingType::UniformBuffer,
+            wgpu::BufferBindingType::Uniform,
+            wgpu::BufferBindingType::Uniform,
         }},
     }});
 
@@ -1740,10 +1744,10 @@
     // Set up the bind group layout.
     wgpu::BindGroupLayout bgl0 = utils::MakeBindGroupLayout(
         device, {{0, wgpu::ShaderStage::Compute | wgpu::ShaderStage::Fragment,
-                  wgpu::BindingType::StorageBuffer}});
+                  wgpu::BufferBindingType::Storage}});
     wgpu::BindGroupLayout bgl1 = utils::MakeBindGroupLayout(
         device, {{0, wgpu::ShaderStage::Compute | wgpu::ShaderStage::Fragment,
-                  wgpu::BindingType::StorageBuffer}});
+                  wgpu::BufferBindingType::Storage}});
 
     CreateRenderPipeline({bgl0, bgl1});
 
@@ -1756,10 +1760,10 @@
     // Set up the bind group layout.
     wgpu::BindGroupLayout bgl0 = utils::MakeBindGroupLayout(
         device, {{0, wgpu::ShaderStage::Compute | wgpu::ShaderStage::Fragment,
-                  wgpu::BindingType::ReadonlyStorageBuffer}});
+                  wgpu::BufferBindingType::ReadOnlyStorage}});
     wgpu::BindGroupLayout bgl1 = utils::MakeBindGroupLayout(
         device, {{0, wgpu::ShaderStage::Compute | wgpu::ShaderStage::Fragment,
-                  wgpu::BindingType::ReadonlyStorageBuffer}});
+                  wgpu::BufferBindingType::ReadOnlyStorage}});
 
     ASSERT_DEVICE_ERROR(CreateRenderPipeline({bgl0, bgl1}));
 
@@ -1780,29 +1784,29 @@
     CreateFSRenderPipeline(
         kTexture2DShaderFS,
         {utils::MakeBindGroupLayout(
-            device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::SampledTexture, false, 0,
+            device, {{0, wgpu::ShaderStage::Fragment, wgpu::TextureSampleType::Float,
                       wgpu::TextureViewDimension::e2D}})});
 
     // Render: Test that 2D texture with 2D array view dimension is invalid
     ASSERT_DEVICE_ERROR(CreateFSRenderPipeline(
         kTexture2DShaderFS,
         {utils::MakeBindGroupLayout(
-            device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::SampledTexture, false, 0,
+            device, {{0, wgpu::ShaderStage::Fragment, wgpu::TextureSampleType::Float,
                       wgpu::TextureViewDimension::e2DArray}})}));
 
     // Compute: Test that 2D texture with 2D view dimension works
     CreateComputePipeline(
         kTexture2DShaderCS,
-        {utils::MakeBindGroupLayout(
-            device, {{0, wgpu::ShaderStage::Compute, wgpu::BindingType::SampledTexture, false, 0,
-                      wgpu::TextureViewDimension::e2D}})});
+        {utils::MakeBindGroupLayout(device,
+                                    {{0, wgpu::ShaderStage::Compute, wgpu::TextureSampleType::Float,
+                                      wgpu::TextureViewDimension::e2D}})});
 
     // Compute: Test that 2D texture with 2D array view dimension is invalid
     ASSERT_DEVICE_ERROR(CreateComputePipeline(
         kTexture2DShaderCS,
-        {utils::MakeBindGroupLayout(
-            device, {{0, wgpu::ShaderStage::Compute, wgpu::BindingType::SampledTexture, false, 0,
-                      wgpu::TextureViewDimension::e2DArray}})}));
+        {utils::MakeBindGroupLayout(device,
+                                    {{0, wgpu::ShaderStage::Compute, wgpu::TextureSampleType::Float,
+                                      wgpu::TextureViewDimension::e2DArray}})}));
 
     constexpr char kTexture2DArrayShaderFS[] = R"(
         [[set(0), binding(0)]] var<uniform_constant> myTexture : texture_sampled_2d_array<f32>;
@@ -1817,29 +1821,29 @@
     CreateFSRenderPipeline(
         kTexture2DArrayShaderFS,
         {utils::MakeBindGroupLayout(
-            device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::SampledTexture, false, 0,
+            device, {{0, wgpu::ShaderStage::Fragment, wgpu::TextureSampleType::Float,
                       wgpu::TextureViewDimension::e2DArray}})});
 
     // Render: Test that 2D texture array with 2D view dimension is invalid
     ASSERT_DEVICE_ERROR(CreateFSRenderPipeline(
         kTexture2DArrayShaderFS,
         {utils::MakeBindGroupLayout(
-            device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::SampledTexture, false, 0,
+            device, {{0, wgpu::ShaderStage::Fragment, wgpu::TextureSampleType::Float,
                       wgpu::TextureViewDimension::e2D}})}));
 
     // Compute: Test that 2D texture array with 2D array view dimension works
     CreateComputePipeline(
         kTexture2DArrayShaderCS,
-        {utils::MakeBindGroupLayout(
-            device, {{0, wgpu::ShaderStage::Compute, wgpu::BindingType::SampledTexture, false, 0,
-                      wgpu::TextureViewDimension::e2DArray}})});
+        {utils::MakeBindGroupLayout(device,
+                                    {{0, wgpu::ShaderStage::Compute, wgpu::TextureSampleType::Float,
+                                      wgpu::TextureViewDimension::e2DArray}})});
 
     // Compute: Test that 2D texture array with 2D view dimension is invalid
     ASSERT_DEVICE_ERROR(CreateComputePipeline(
         kTexture2DArrayShaderCS,
-        {utils::MakeBindGroupLayout(
-            device, {{0, wgpu::ShaderStage::Compute, wgpu::BindingType::SampledTexture, false, 0,
-                      wgpu::TextureViewDimension::e2D}})}));
+        {utils::MakeBindGroupLayout(device,
+                                    {{0, wgpu::ShaderStage::Compute, wgpu::TextureSampleType::Float,
+                                      wgpu::TextureViewDimension::e2D}})}));
 }
 
 class BindingsValidationTest : public BindGroupLayoutCompatibilityTest {
@@ -1891,15 +1895,15 @@
     // Set up bind group layouts.
     wgpu::BindGroupLayout bgl0 = utils::MakeBindGroupLayout(
         device, {{0, wgpu::ShaderStage::Compute | wgpu::ShaderStage::Fragment,
-                  wgpu::BindingType::StorageBuffer},
+                  wgpu::BufferBindingType::Storage},
                  {1, wgpu::ShaderStage::Compute | wgpu::ShaderStage::Fragment,
-                  wgpu::BindingType::UniformBuffer}});
+                  wgpu::BufferBindingType::Uniform}});
     wgpu::BindGroupLayout bgl1 = utils::MakeBindGroupLayout(
         device, {{0, wgpu::ShaderStage::Compute | wgpu::ShaderStage::Fragment,
-                  wgpu::BindingType::ReadonlyStorageBuffer}});
+                  wgpu::BufferBindingType::ReadOnlyStorage}});
     wgpu::BindGroupLayout bgl2 = utils::MakeBindGroupLayout(
         device, {{0, wgpu::ShaderStage::Compute | wgpu::ShaderStage::Fragment,
-                  wgpu::BindingType::StorageBuffer}});
+                  wgpu::BufferBindingType::Storage}});
 
     // pipelineLayout has unused binding set (bgl2) and unused entry in a binding set (bgl0).
     CreateRenderPipeline({bgl0, bgl1, bgl2});
@@ -1913,7 +1917,7 @@
     // Set up bind group layout.
     wgpu::BindGroupLayout bgl0 = utils::MakeBindGroupLayout(
         device, {{0, wgpu::ShaderStage::Compute | wgpu::ShaderStage::Fragment,
-                  wgpu::BindingType::StorageBuffer}});
+                  wgpu::BufferBindingType::Storage}});
 
     // missing a binding set (bgl1) in pipeline layout
     {
@@ -1935,7 +1939,7 @@
     {
         wgpu::BindGroupLayout bgl1 = utils::MakeBindGroupLayout(
             device, {{1, wgpu::ShaderStage::Compute | wgpu::ShaderStage::Fragment,
-                      wgpu::BindingType::UniformBuffer}});
+                      wgpu::BufferBindingType::Uniform}});
 
         ASSERT_DEVICE_ERROR(CreateRenderPipeline({bgl0, bgl1}));
 
@@ -1954,7 +1958,7 @@
     for (uint32_t i = 0; i < kBindingNum + 1; ++i) {
         bgl[i] = utils::MakeBindGroupLayout(
             device, {{0, wgpu::ShaderStage::Compute | wgpu::ShaderStage::Fragment,
-                      wgpu::BindingType::StorageBuffer}});
+                      wgpu::BufferBindingType::Storage}});
         buffer[i] = CreateBuffer(kBufferSize, wgpu::BufferUsage::Storage);
         bg[i] = utils::MakeBindGroup(device, bgl[i], {{0, buffer[i]}});
     }
@@ -1973,9 +1977,9 @@
     // set in pipeline layout.
     bgl[1] = utils::MakeBindGroupLayout(
         device, {{0, wgpu::ShaderStage::Compute | wgpu::ShaderStage::Fragment,
-                  wgpu::BindingType::ReadonlyStorageBuffer},
+                  wgpu::BufferBindingType::ReadOnlyStorage},
                  {1, wgpu::ShaderStage::Compute | wgpu::ShaderStage::Fragment,
-                  wgpu::BindingType::UniformBuffer}});
+                  wgpu::BufferBindingType::Uniform}});
     buffer[1] = CreateBuffer(kBufferSize, wgpu::BufferUsage::Storage | wgpu::BufferUsage::Uniform);
     bg[1] = utils::MakeBindGroup(device, bgl[1], {{0, buffer[1]}, {1, buffer[1]}});
 
@@ -1995,7 +1999,7 @@
     for (uint32_t i = 0; i < kBindingNum; ++i) {
         bgl[i] = utils::MakeBindGroupLayout(
             device, {{0, wgpu::ShaderStage::Compute | wgpu::ShaderStage::Fragment,
-                      wgpu::BindingType::StorageBuffer}});
+                      wgpu::BufferBindingType::Storage}});
         buffer[i] = CreateBuffer(kBufferSize, wgpu::BufferUsage::Storage);
         bg[i] = utils::MakeBindGroup(device, bgl[i], {{0, buffer[i]}});
     }
@@ -2020,7 +2024,7 @@
     // binding
     bgl[2] = utils::MakeBindGroupLayout(
         device, {{1, wgpu::ShaderStage::Compute | wgpu::ShaderStage::Fragment,
-                  wgpu::BindingType::UniformBuffer}});
+                  wgpu::BufferBindingType::Uniform}});
     buffer[2] = CreateBuffer(kBufferSize, wgpu::BufferUsage::Uniform);
     bg[2] = utils::MakeBindGroup(device, bgl[2], {{1, buffer[2]}});
 
@@ -2055,7 +2059,7 @@
     // Test that sampler binding works with normal sampler in the shader.
     {
         wgpu::BindGroupLayout bindGroupLayout = utils::MakeBindGroupLayout(
-            device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::Sampler}});
+            device, {{0, wgpu::ShaderStage::Fragment, wgpu::SamplerBindingType::Filtering}});
 
         CreateFragmentPipeline(&bindGroupLayout, R"(
             [[set(0), binding(0)]] var<uniform_constant> mySampler: sampler;
@@ -2066,7 +2070,7 @@
     // Test that comparison sampler binding works with shadow sampler in the shader.
     {
         wgpu::BindGroupLayout bindGroupLayout = utils::MakeBindGroupLayout(
-            device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::ComparisonSampler}});
+            device, {{0, wgpu::ShaderStage::Fragment, wgpu::SamplerBindingType::Comparison}});
 
         CreateFragmentPipeline(&bindGroupLayout, R"(
             [[set(0), binding(0)]] var<uniform_constant> mySampler: sampler_comparison;
@@ -2077,7 +2081,7 @@
     // Test that sampler binding does not work with comparison sampler in the shader.
     {
         wgpu::BindGroupLayout bindGroupLayout = utils::MakeBindGroupLayout(
-            device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::Sampler}});
+            device, {{0, wgpu::ShaderStage::Fragment, wgpu::SamplerBindingType::Filtering}});
 
         ASSERT_DEVICE_ERROR(CreateFragmentPipeline(&bindGroupLayout, R"(
             [[set(0), binding(0)]] var<uniform_constant> mySampler: sampler_comparison;
@@ -2088,7 +2092,7 @@
     // Test that comparison sampler binding does not work with normal sampler in the shader.
     {
         wgpu::BindGroupLayout bindGroupLayout = utils::MakeBindGroupLayout(
-            device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::ComparisonSampler}});
+            device, {{0, wgpu::ShaderStage::Fragment, wgpu::SamplerBindingType::Comparison}});
 
         ASSERT_DEVICE_ERROR(CreateFragmentPipeline(&bindGroupLayout, R"(
             [[set(0), binding(0)]] var<uniform_constant> mySampler: sampler;
@@ -2101,7 +2105,7 @@
     // Test that sampler binding works with normal sampler.
     {
         wgpu::BindGroupLayout bindGroupLayout = utils::MakeBindGroupLayout(
-            device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::Sampler}});
+            device, {{0, wgpu::ShaderStage::Fragment, wgpu::SamplerBindingType::Filtering}});
 
         wgpu::SamplerDescriptor desc = {};
         utils::MakeBindGroup(device, bindGroupLayout, {{0, device.CreateSampler(&desc)}});
@@ -2110,7 +2114,7 @@
     // Test that comparison sampler binding works with sampler w/ compare function.
     {
         wgpu::BindGroupLayout bindGroupLayout = utils::MakeBindGroupLayout(
-            device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::ComparisonSampler}});
+            device, {{0, wgpu::ShaderStage::Fragment, wgpu::SamplerBindingType::Comparison}});
 
         wgpu::SamplerDescriptor desc = {};
         desc.compare = wgpu::CompareFunction::Never;
@@ -2120,7 +2124,7 @@
     // Test that sampler binding does not work with sampler w/ compare function.
     {
         wgpu::BindGroupLayout bindGroupLayout = utils::MakeBindGroupLayout(
-            device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::Sampler}});
+            device, {{0, wgpu::ShaderStage::Fragment, wgpu::SamplerBindingType::Filtering}});
 
         wgpu::SamplerDescriptor desc;
         desc.compare = wgpu::CompareFunction::Never;
@@ -2131,7 +2135,7 @@
     // Test that comparison sampler binding does not work with normal sampler.
     {
         wgpu::BindGroupLayout bindGroupLayout = utils::MakeBindGroupLayout(
-            device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::ComparisonSampler}});
+            device, {{0, wgpu::ShaderStage::Fragment, wgpu::SamplerBindingType::Comparison}});
 
         wgpu::SamplerDescriptor desc = {};
         ASSERT_DEVICE_ERROR(
diff --git a/src/tests/unittests/validation/GetBindGroupLayoutValidationTests.cpp b/src/tests/unittests/validation/GetBindGroupLayoutValidationTests.cpp
index c037f59..49376d6 100644
--- a/src/tests/unittests/validation/GetBindGroupLayoutValidationTests.cpp
+++ b/src/tests/unittests/validation/GetBindGroupLayoutValidationTests.cpp
@@ -242,16 +242,15 @@
 TEST_F(GetBindGroupLayoutTests, ViewDimension) {
     wgpu::BindGroupLayoutEntry binding = {};
     binding.binding = 0;
-    binding.type = wgpu::BindingType::SampledTexture;
     binding.visibility = wgpu::ShaderStage::Fragment;
-    binding.hasDynamicOffset = false;
+    binding.texture.sampleType = wgpu::TextureSampleType::Float;
 
     wgpu::BindGroupLayoutDescriptor desc = {};
     desc.entryCount = 1;
     desc.entries = &binding;
 
     {
-        binding.viewDimension = wgpu::TextureViewDimension::e1D;
+        binding.texture.viewDimension = wgpu::TextureViewDimension::e1D;
         wgpu::RenderPipeline pipeline = RenderPipelineFromFragmentShader(R"(
             [[set(0), binding(0)]] var<uniform_constant> myTexture : texture_sampled_1d<f32>;
 
@@ -261,7 +260,7 @@
     }
 
     {
-        binding.viewDimension = wgpu::TextureViewDimension::e2D;
+        binding.texture.viewDimension = wgpu::TextureViewDimension::e2D;
         wgpu::RenderPipeline pipeline = RenderPipelineFromFragmentShader(R"(
             [[set(0), binding(0)]] var<uniform_constant> myTexture : texture_sampled_2d<f32>;
 
@@ -271,7 +270,7 @@
     }
 
     {
-        binding.viewDimension = wgpu::TextureViewDimension::e2DArray;
+        binding.texture.viewDimension = wgpu::TextureViewDimension::e2DArray;
         wgpu::RenderPipeline pipeline = RenderPipelineFromFragmentShader(R"(
             [[set(0), binding(0)]] var<uniform_constant> myTexture : texture_sampled_2d_array<f32>;
 
@@ -281,7 +280,7 @@
     }
 
     {
-        binding.viewDimension = wgpu::TextureViewDimension::e3D;
+        binding.texture.viewDimension = wgpu::TextureViewDimension::e3D;
         wgpu::RenderPipeline pipeline = RenderPipelineFromFragmentShader(R"(
             [[set(0), binding(0)]] var<uniform_constant> myTexture : texture_sampled_3d<f32>;
 
@@ -291,7 +290,7 @@
     }
 
     {
-        binding.viewDimension = wgpu::TextureViewDimension::Cube;
+        binding.texture.viewDimension = wgpu::TextureViewDimension::Cube;
         wgpu::RenderPipeline pipeline = RenderPipelineFromFragmentShader(R"(
             [[set(0), binding(0)]] var<uniform_constant> myTexture : texture_sampled_cube<f32>;
 
@@ -301,7 +300,7 @@
     }
 
     {
-        binding.viewDimension = wgpu::TextureViewDimension::CubeArray;
+        binding.texture.viewDimension = wgpu::TextureViewDimension::CubeArray;
         wgpu::RenderPipeline pipeline = RenderPipelineFromFragmentShader(R"(
             [[set(0), binding(0)]] var<uniform_constant> myTexture : texture_sampled_cube_array<f32>;
 
@@ -315,16 +314,14 @@
 TEST_F(GetBindGroupLayoutTests, TextureComponentType) {
     wgpu::BindGroupLayoutEntry binding = {};
     binding.binding = 0;
-    binding.type = wgpu::BindingType::SampledTexture;
     binding.visibility = wgpu::ShaderStage::Fragment;
-    binding.hasDynamicOffset = false;
 
     wgpu::BindGroupLayoutDescriptor desc = {};
     desc.entryCount = 1;
     desc.entries = &binding;
 
     {
-        binding.textureComponentType = wgpu::TextureComponentType::Float;
+        binding.texture.sampleType = wgpu::TextureSampleType::Float;
         wgpu::RenderPipeline pipeline = RenderPipelineFromFragmentShader(R"(
             [[set(0), binding(0)]] var<uniform_constant> myTexture : texture_sampled_2d<f32>;
 
@@ -334,7 +331,7 @@
     }
 
     {
-        binding.textureComponentType = wgpu::TextureComponentType::Sint;
+        binding.texture.sampleType = wgpu::TextureSampleType::Sint;
         wgpu::RenderPipeline pipeline = RenderPipelineFromFragmentShader(R"(
             [[set(0), binding(0)]] var<uniform_constant> myTexture : texture_sampled_2d<i32>;
 
@@ -344,7 +341,7 @@
     }
 
     {
-        binding.textureComponentType = wgpu::TextureComponentType::Uint;
+        binding.texture.sampleType = wgpu::TextureSampleType::Uint;
         wgpu::RenderPipeline pipeline = RenderPipelineFromFragmentShader(R"(
             [[set(0), binding(0)]] var<uniform_constant> myTexture : texture_sampled_2d<u32>;
 
@@ -715,7 +712,7 @@
 TEST_F(GetBindGroupLayoutTests, Reflection) {
     wgpu::BindGroupLayoutEntry binding = {};
     binding.binding = 0;
-    binding.type = wgpu::BindingType::UniformBuffer;
+    binding.buffer.type = wgpu::BufferBindingType::Uniform;
     binding.visibility = wgpu::ShaderStage::Vertex;
 
     wgpu::BindGroupLayoutDescriptor bglDesc = {};
diff --git a/src/tests/unittests/validation/MinimumBufferSizeValidationTests.cpp b/src/tests/unittests/validation/MinimumBufferSizeValidationTests.cpp
index 4e31002..b69893c 100644
--- a/src/tests/unittests/validation/MinimumBufferSizeValidationTests.cpp
+++ b/src/tests/unittests/validation/MinimumBufferSizeValidationTests.cpp
@@ -26,7 +26,7 @@
         uint32_t binding;
         std::string text;
         uint64_t size;
-        wgpu::BindingType type = wgpu::BindingType::StorageBuffer;
+        wgpu::BufferBindingType type = wgpu::BufferBindingType::Storage;
         wgpu::ShaderStage visibility = wgpu::ShaderStage::Compute | wgpu::ShaderStage::Fragment;
     };
 
@@ -67,13 +67,13 @@
     }
 
     // Convert binding type to a glsl string
-    std::string BindingTypeToStr(wgpu::BindingType type) {
+    std::string BufferBindingTypeToStr(wgpu::BufferBindingType type) {
         switch (type) {
-            case wgpu::BindingType::UniformBuffer:
+            case wgpu::BufferBindingType::Uniform:
                 return "uniform";
-            case wgpu::BindingType::StorageBuffer:
+            case wgpu::BufferBindingType::Storage:
                 return "buffer";
-            case wgpu::BindingType::ReadonlyStorageBuffer:
+            case wgpu::BufferBindingType::ReadOnlyStorage:
                 return "readonly buffer";
             default:
                 UNREACHABLE();
@@ -88,7 +88,7 @@
         size_t ctr = 0;
         for (const BindingDescriptor& b : bindings) {
             ostream << "layout(" << layout << ", set = " << b.set << ", binding = " << b.binding
-                    << ") " << BindingTypeToStr(b.type) << " b" << ctr++ << "{\n"
+                    << ") " << BufferBindingTypeToStr(b.type) << " b" << ctr++ << "{\n"
                     << b.text << ";\n};\n";
         }
         return ostream.str();
@@ -214,9 +214,9 @@
             const BindingDescriptor& b = bindings[i];
             wgpu::BindGroupLayoutEntry e = {};
             e.binding = b.binding;
-            e.type = b.type;
             e.visibility = b.visibility;
-            e.minBufferBindingSize = minimumSizes[i];
+            e.buffer.type = b.type;
+            e.buffer.minBindingSize = minimumSizes[i];
             entries.push_back(e);
         }
 
@@ -393,9 +393,8 @@
 TEST_F(MinBufferSizeBindGroupCreationTests, LayoutEquality) {
     auto MakeLayout = [&](uint64_t size) {
         return utils::MakeBindGroupLayout(
-            device, {{0, wgpu::ShaderStage::Compute, wgpu::BindingType::UniformBuffer, false, size,
-                      wgpu::TextureViewDimension::Undefined, wgpu::TextureComponentType::Float,
-                      wgpu::TextureFormat::Undefined}});
+            device,
+            {{0, wgpu::ShaderStage::Compute, wgpu::BufferBindingType::Uniform, false, size}});
     };
 
     EXPECT_EQ(MakeLayout(0).Get(), MakeLayout(0).Get());
@@ -540,16 +539,16 @@
 // Sizes are inferred for all binding types with std140 layout
 TEST_F(MinBufferSizeDefaultLayoutTests, std140BindingTypes) {
     CheckShaderBindingSizeReflection(
-        "std140", {{{0, 0, "int d; float e[]", 32, wgpu::BindingType::UniformBuffer},
-                    {0, 1, "ThreeFloats f", 12, wgpu::BindingType::StorageBuffer},
-                    {0, 2, "ThreeFloats g[]", 16, wgpu::BindingType::ReadonlyStorageBuffer}}});
+        "std140", {{{0, 0, "int d; float e[]", 32, wgpu::BufferBindingType::Uniform},
+                    {0, 1, "ThreeFloats f", 12, wgpu::BufferBindingType::Storage},
+                    {0, 2, "ThreeFloats g[]", 16, wgpu::BufferBindingType::ReadOnlyStorage}}});
 }
 
 // Sizes are inferred for all binding types with std430 layout
 TEST_F(MinBufferSizeDefaultLayoutTests, std430BindingTypes) {
     CheckShaderBindingSizeReflection(
-        "std430", {{{0, 0, "float a", 4, wgpu::BindingType::StorageBuffer},
-                    {0, 1, "ThreeFloats b[]", 12, wgpu::BindingType::ReadonlyStorageBuffer}}});
+        "std430", {{{0, 0, "float a", 4, wgpu::BufferBindingType::Storage},
+                    {0, 1, "ThreeFloats b[]", 12, wgpu::BufferBindingType::ReadOnlyStorage}}});
 }
 
 // Various bindings have correct size across multiple groups
@@ -575,11 +574,11 @@
 // Minimum size should be the max requirement of both vertex and fragment stages
 TEST_F(MinBufferSizeDefaultLayoutTests, RenderPassConsidersBothStages) {
     std::string vertexShader = CreateVertexShaderWithBindings(
-        "std140", {{0, 0, "float a", 4, wgpu::BindingType::UniformBuffer},
-                   {0, 1, "float b[]", 16, wgpu::BindingType::UniformBuffer}});
+        "std140", {{0, 0, "float a", 4, wgpu::BufferBindingType::Uniform},
+                   {0, 1, "float b[]", 16, wgpu::BufferBindingType::Uniform}});
     std::string fragShader = CreateFragmentShaderWithBindings(
-        "std140", {{0, 0, "float a; float b", 8, wgpu::BindingType::UniformBuffer},
-                   {0, 1, "float c; float d", 8, wgpu::BindingType::UniformBuffer}});
+        "std140", {{0, 0, "float a; float b", 8, wgpu::BufferBindingType::Uniform},
+                   {0, 1, "float c; float d", 8, wgpu::BufferBindingType::Uniform}});
 
     wgpu::BindGroupLayout renderLayout = GetBGLFromRenderShaders(vertexShader, fragShader, 0);
 
diff --git a/src/tests/unittests/validation/RenderBundleValidationTests.cpp b/src/tests/unittests/validation/RenderBundleValidationTests.cpp
index f62d76f..54a60e8 100644
--- a/src/tests/unittests/validation/RenderBundleValidationTests.cpp
+++ b/src/tests/unittests/validation/RenderBundleValidationTests.cpp
@@ -54,11 +54,11 @@
 
             wgpu::BindGroupLayout bgls[] = {
                 utils::MakeBindGroupLayout(
-                    device, {{0, wgpu::ShaderStage::Vertex, wgpu::BindingType::UniformBuffer}}),
+                    device, {{0, wgpu::ShaderStage::Vertex, wgpu::BufferBindingType::Uniform}}),
                 utils::MakeBindGroupLayout(
                     device, {
-                                {0, wgpu::ShaderStage::Fragment, wgpu::BindingType::UniformBuffer},
-                                {1, wgpu::ShaderStage::Fragment, wgpu::BindingType::StorageBuffer},
+                                {0, wgpu::ShaderStage::Fragment, wgpu::BufferBindingType::Uniform},
+                                {1, wgpu::ShaderStage::Fragment, wgpu::BufferBindingType::Storage},
                             })};
 
             wgpu::PipelineLayoutDescriptor pipelineLayoutDesc = {};
diff --git a/src/tests/unittests/validation/RenderPipelineValidationTests.cpp b/src/tests/unittests/validation/RenderPipelineValidationTests.cpp
index 7aee3c3..f8dce08 100644
--- a/src/tests/unittests/validation/RenderPipelineValidationTests.cpp
+++ b/src/tests/unittests/validation/RenderPipelineValidationTests.cpp
@@ -393,10 +393,10 @@
 TEST_F(RenderPipelineValidationTest, TextureComponentTypeCompatibility) {
     constexpr uint32_t kNumTextureComponentType = 3u;
     std::array<const char*, kNumTextureComponentType> kScalarTypes = {{"f32", "i32", "u32"}};
-    std::array<wgpu::TextureComponentType, kNumTextureComponentType> kTextureComponentTypes = {{
-        wgpu::TextureComponentType::Float,
-        wgpu::TextureComponentType::Sint,
-        wgpu::TextureComponentType::Uint,
+    std::array<wgpu::TextureSampleType, kNumTextureComponentType> kTextureComponentTypes = {{
+        wgpu::TextureSampleType::Float,
+        wgpu::TextureSampleType::Sint,
+        wgpu::TextureSampleType::Uint,
     }};
 
     for (size_t i = 0; i < kNumTextureComponentType; ++i) {
@@ -415,8 +415,7 @@
                 utils::CreateShaderModuleFromWGSL(device, stream.str().c_str());
 
             wgpu::BindGroupLayout bgl = utils::MakeBindGroupLayout(
-                device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::SampledTexture, false,
-                          0, wgpu::TextureViewDimension::e2D, kTextureComponentTypes[j]}});
+                device, {{0, wgpu::ShaderStage::Fragment, kTextureComponentTypes[j]}});
             descriptor.layout = utils::MakeBasicPipelineLayout(device, &bgl);
 
             if (i == j) {
@@ -464,8 +463,8 @@
                 utils::CreateShaderModuleFromWGSL(device, stream.str().c_str());
 
             wgpu::BindGroupLayout bgl = utils::MakeBindGroupLayout(
-                device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::SampledTexture, false,
-                          0, kTextureViewDimensions[j], wgpu::TextureComponentType::Float}});
+                device, {{0, wgpu::ShaderStage::Fragment, wgpu::TextureSampleType::Float,
+                          kTextureViewDimensions[j]}});
             descriptor.layout = utils::MakeBasicPipelineLayout(device, &bgl);
 
             if (i == j) {
@@ -753,11 +752,11 @@
     )");
 
     wgpu::BindGroupLayout bgl0 = utils::MakeBindGroupLayout(
-        device, {{0, wgpu::ShaderStage::Vertex, wgpu::BindingType::UniformBuffer}});
+        device, {{0, wgpu::ShaderStage::Vertex, wgpu::BufferBindingType::Uniform}});
     wgpu::PipelineLayout layout0 = utils::MakeBasicPipelineLayout(device, &bgl0);
 
     wgpu::BindGroupLayout bgl1 = utils::MakeBindGroupLayout(
-        device, {{1, wgpu::ShaderStage::Vertex, wgpu::BindingType::UniformBuffer}});
+        device, {{1, wgpu::ShaderStage::Vertex, wgpu::BufferBindingType::Uniform}});
     wgpu::PipelineLayout layout1 = utils::MakeBasicPipelineLayout(device, &bgl1);
 
     utils::ComboRenderPipelineDescriptor descriptor(device);
diff --git a/src/tests/unittests/validation/ResourceUsageTrackingTests.cpp b/src/tests/unittests/validation/ResourceUsageTrackingTests.cpp
index 3622146..2b8950f 100644
--- a/src/tests/unittests/validation/ResourceUsageTrackingTests.cpp
+++ b/src/tests/unittests/validation/ResourceUsageTrackingTests.cpp
@@ -99,8 +99,8 @@
 
             wgpu::BindGroupLayout bgl = utils::MakeBindGroupLayout(
                 device,
-                {{0, wgpu::ShaderStage::Compute, wgpu::BindingType::UniformBuffer},
-                 {1, wgpu::ShaderStage::Compute, wgpu::BindingType::ReadonlyStorageBuffer}});
+                {{0, wgpu::ShaderStage::Compute, wgpu::BufferBindingType::Uniform},
+                 {1, wgpu::ShaderStage::Compute, wgpu::BufferBindingType::ReadOnlyStorage}});
             wgpu::BindGroup bg = utils::MakeBindGroup(device, bgl, {{0, buffer}, {1, buffer}});
 
             // Use the buffer as both uniform and readonly storage buffer in compute pass.
@@ -122,7 +122,7 @@
                 CreateBuffer(4, wgpu::BufferUsage::Storage | wgpu::BufferUsage::Index);
 
             wgpu::BindGroupLayout bgl = utils::MakeBindGroupLayout(
-                device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::StorageBuffer}});
+                device, {{0, wgpu::ShaderStage::Fragment, wgpu::BufferBindingType::Storage}});
             wgpu::BindGroup bg = utils::MakeBindGroup(device, bgl, {{0, buffer}});
 
             // It is invalid to use the buffer as both index and storage in render pass
@@ -142,8 +142,8 @@
 
             wgpu::BindGroupLayout bgl = utils::MakeBindGroupLayout(
                 device,
-                {{0, wgpu::ShaderStage::Compute, wgpu::BindingType::StorageBuffer},
-                 {1, wgpu::ShaderStage::Compute, wgpu::BindingType::ReadonlyStorageBuffer}});
+                {{0, wgpu::ShaderStage::Compute, wgpu::BufferBindingType::Storage},
+                 {1, wgpu::ShaderStage::Compute, wgpu::BufferBindingType::ReadOnlyStorage}});
             wgpu::BindGroup bg =
                 utils::MakeBindGroup(device, bgl, {{0, buffer, 0, 4}, {1, buffer, 256, 4}});
 
@@ -183,9 +183,9 @@
 
         wgpu::BindGroupLayout bgl = utils::MakeBindGroupLayout(
             device, {{0, wgpu::ShaderStage::Fragment | wgpu::ShaderStage::Compute,
-                      wgpu::BindingType::StorageBuffer},
+                      wgpu::BufferBindingType::Storage},
                      {1, wgpu::ShaderStage::Fragment | wgpu::ShaderStage::Compute,
-                      wgpu::BindingType::StorageBuffer}});
+                      wgpu::BufferBindingType::Storage}});
         wgpu::BindGroup bg =
             utils::MakeBindGroup(device, bgl, {{0, buffer, 0, 4}, {1, buffer, 256, 4}});
 
@@ -243,7 +243,7 @@
 
             // Create bind groups to use the buffer as storage
             wgpu::BindGroupLayout bgl = utils::MakeBindGroupLayout(
-                device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::StorageBuffer}});
+                device, {{0, wgpu::ShaderStage::Fragment, wgpu::BufferBindingType::Storage}});
             wgpu::BindGroup bg0 = utils::MakeBindGroup(device, bgl, {{0, buffer0}});
             wgpu::BindGroup bg1 = utils::MakeBindGroup(device, bgl, {{0, buffer1}});
 
@@ -271,9 +271,9 @@
                 CreateBuffer(4, wgpu::BufferUsage::Storage | wgpu::BufferUsage::Uniform);
 
             wgpu::BindGroupLayout bgl0 = utils::MakeBindGroupLayout(
-                device, {{0, wgpu::ShaderStage::Compute, wgpu::BindingType::StorageBuffer}});
+                device, {{0, wgpu::ShaderStage::Compute, wgpu::BufferBindingType::Storage}});
             wgpu::BindGroupLayout bgl1 = utils::MakeBindGroupLayout(
-                device, {{0, wgpu::ShaderStage::Compute, wgpu::BindingType::UniformBuffer}});
+                device, {{0, wgpu::ShaderStage::Compute, wgpu::BufferBindingType::Uniform}});
             wgpu::BindGroup bg0 = utils::MakeBindGroup(device, bgl0, {{0, buffer}});
             wgpu::BindGroup bg1 = utils::MakeBindGroup(device, bgl1, {{0, buffer}});
 
@@ -297,10 +297,10 @@
             wgpu::Buffer buffer = CreateBuffer(4, wgpu::BufferUsage::Storage);
 
             wgpu::BindGroupLayout bgl0 = utils::MakeBindGroupLayout(
-                device, {{0, wgpu::ShaderStage::Compute, wgpu::BindingType::StorageBuffer}});
+                device, {{0, wgpu::ShaderStage::Compute, wgpu::BufferBindingType::Storage}});
             wgpu::BindGroupLayout bgl1 = utils::MakeBindGroupLayout(
                 device,
-                {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::ReadonlyStorageBuffer}});
+                {{0, wgpu::ShaderStage::Fragment, wgpu::BufferBindingType::ReadOnlyStorage}});
             wgpu::BindGroup bg0 = utils::MakeBindGroup(device, bgl0, {{0, buffer}});
             wgpu::BindGroup bg1 = utils::MakeBindGroup(device, bgl1, {{0, buffer}});
 
@@ -330,7 +330,7 @@
             wgpu::Buffer buffer =
                 CreateBuffer(4, wgpu::BufferUsage::Storage | wgpu::BufferUsage::Index);
             wgpu::BindGroupLayout bgl = utils::MakeBindGroupLayout(
-                device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::StorageBuffer}});
+                device, {{0, wgpu::ShaderStage::Fragment, wgpu::BufferBindingType::Storage}});
             wgpu::BindGroup bg = utils::MakeBindGroup(device, bgl, {{0, buffer}});
 
             // Create a no-op render pipeline.
@@ -360,9 +360,9 @@
 
             wgpu::BindGroupLayout bgl0 = utils::MakeBindGroupLayout(
                 device,
-                {{0, wgpu::ShaderStage::Compute, wgpu::BindingType::ReadonlyStorageBuffer}});
+                {{0, wgpu::ShaderStage::Compute, wgpu::BufferBindingType::ReadOnlyStorage}});
             wgpu::BindGroupLayout bgl1 = utils::MakeBindGroupLayout(
-                device, {{0, wgpu::ShaderStage::Compute, wgpu::BindingType::StorageBuffer}});
+                device, {{0, wgpu::ShaderStage::Compute, wgpu::BufferBindingType::Storage}});
             wgpu::BindGroup bg0 = utils::MakeBindGroup(device, bgl0, {{0, buffer}});
             wgpu::BindGroup bg1 = utils::MakeBindGroup(device, bgl1, {{0, buffer}});
 
@@ -395,7 +395,7 @@
             wgpu::Buffer buffer =
                 CreateBuffer(4, wgpu::BufferUsage::Storage | wgpu::BufferUsage::Index);
             wgpu::BindGroupLayout writeBGL = utils::MakeBindGroupLayout(
-                device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::StorageBuffer}});
+                device, {{0, wgpu::ShaderStage::Fragment, wgpu::BufferBindingType::Storage}});
             wgpu::BindGroup writeBG = utils::MakeBindGroup(device, writeBGL, {{0, buffer}});
 
             // Create a no-op render pipeline.
@@ -423,9 +423,9 @@
 
             wgpu::BindGroupLayout readBGL = utils::MakeBindGroupLayout(
                 device,
-                {{0, wgpu::ShaderStage::Compute, wgpu::BindingType::ReadonlyStorageBuffer}});
+                {{0, wgpu::ShaderStage::Compute, wgpu::BufferBindingType::ReadOnlyStorage}});
             wgpu::BindGroupLayout writeBGL = utils::MakeBindGroupLayout(
-                device, {{0, wgpu::ShaderStage::Compute, wgpu::BindingType::StorageBuffer}});
+                device, {{0, wgpu::ShaderStage::Compute, wgpu::BufferBindingType::Storage}});
             wgpu::BindGroup readBG = utils::MakeBindGroup(device, readBGL, {{0, buffer}});
             wgpu::BindGroup writeBG = utils::MakeBindGroup(device, writeBGL, {{0, buffer}});
 
@@ -459,10 +459,10 @@
 
         // Create the bind group to use the buffer as storage
         wgpu::BindGroupLayout bgl0 = utils::MakeBindGroupLayout(
-            device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::StorageBuffer}});
+            device, {{0, wgpu::ShaderStage::Fragment, wgpu::BufferBindingType::Storage}});
         wgpu::BindGroup bg0 = utils::MakeBindGroup(device, bgl0, {{0, bufferSrc}});
         wgpu::BindGroupLayout bgl1 = utils::MakeBindGroupLayout(
-            device, {{0, wgpu::ShaderStage::Compute, wgpu::BindingType::ReadonlyStorageBuffer}});
+            device, {{0, wgpu::ShaderStage::Compute, wgpu::BufferBindingType::ReadOnlyStorage}});
         wgpu::BindGroup bg1 = utils::MakeBindGroup(device, bgl1, {{0, bufferDst}});
 
         // Use the buffer as both copy src and storage in render pass
@@ -497,7 +497,7 @@
             CreateBuffer(4, wgpu::BufferUsage::Vertex | wgpu::BufferUsage::Index);
 
         wgpu::BindGroupLayout bgl = utils::MakeBindGroupLayout(
-            device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::StorageBuffer}});
+            device, {{0, wgpu::ShaderStage::Fragment, wgpu::BufferBindingType::Storage}});
         wgpu::BindGroup bg = utils::MakeBindGroup(device, bgl, {{0, buffer0}});
 
         DummyRenderPass dummyRenderPass(device);
@@ -566,7 +566,7 @@
 
             // Create the bind group to use the buffer as storage
             wgpu::BindGroupLayout bgl = utils::MakeBindGroupLayout(
-                device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::StorageBuffer}});
+                device, {{0, wgpu::ShaderStage::Fragment, wgpu::BufferBindingType::Storage}});
             wgpu::BindGroup bg0 = utils::MakeBindGroup(device, bgl, {{0, buffer0}});
             wgpu::BindGroup bg1 = utils::MakeBindGroup(device, bgl, {{0, buffer1}});
 
@@ -606,10 +606,10 @@
 
             // Create the bind group to use the buffer as storage
             wgpu::BindGroupLayout writeBGL = utils::MakeBindGroupLayout(
-                device, {{0, wgpu::ShaderStage::Compute, wgpu::BindingType::StorageBuffer}});
+                device, {{0, wgpu::ShaderStage::Compute, wgpu::BufferBindingType::Storage}});
             wgpu::BindGroupLayout readBGL = utils::MakeBindGroupLayout(
                 device,
-                {{0, wgpu::ShaderStage::Compute, wgpu::BindingType::ReadonlyStorageBuffer}});
+                {{0, wgpu::ShaderStage::Compute, wgpu::BufferBindingType::ReadOnlyStorage}});
             wgpu::BindGroup writeBG0 = utils::MakeBindGroup(device, writeBGL, {{0, buffer0, 0, 4}});
             wgpu::BindGroup readBG0 = utils::MakeBindGroup(device, readBGL, {{0, buffer0, 256, 4}});
             wgpu::BindGroup readBG1 = utils::MakeBindGroup(device, readBGL, {{0, buffer1, 0, 4}});
@@ -662,8 +662,8 @@
         {
             // Create a bind group whose bindings are not visible in render pass
             wgpu::BindGroupLayout bgl = utils::MakeBindGroupLayout(
-                device, {{0, wgpu::ShaderStage::Compute, wgpu::BindingType::StorageBuffer},
-                         {1, wgpu::ShaderStage::None, wgpu::BindingType::ReadonlyStorageBuffer}});
+                device, {{0, wgpu::ShaderStage::Compute, wgpu::BufferBindingType::Storage},
+                         {1, wgpu::ShaderStage::None, wgpu::BufferBindingType::ReadOnlyStorage}});
             wgpu::BindGroup bg = utils::MakeBindGroup(device, bgl, {{0, buffer}, {1, buffer}});
 
             // These two bindings are invisible in render pass. But we still track these bindings.
@@ -680,8 +680,8 @@
         {
             // Create a bind group whose bindings are not visible in compute pass
             wgpu::BindGroupLayout bgl = utils::MakeBindGroupLayout(
-                device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::ReadonlyStorageBuffer},
-                         {1, wgpu::ShaderStage::None, wgpu::BindingType::StorageBuffer}});
+                device, {{0, wgpu::ShaderStage::Fragment, wgpu::BufferBindingType::ReadOnlyStorage},
+                         {1, wgpu::ShaderStage::None, wgpu::BufferBindingType::Storage}});
             wgpu::BindGroup bg = utils::MakeBindGroup(device, bgl, {{0, buffer}, {1, buffer}});
 
             // Create a no-op compute pipeline.
@@ -710,7 +710,7 @@
             wgpu::Buffer buffer =
                 CreateBuffer(4, wgpu::BufferUsage::Storage | wgpu::BufferUsage::Index);
             wgpu::BindGroupLayout bgl = utils::MakeBindGroupLayout(
-                device, {{0, wgpu::ShaderStage::Compute, wgpu::BindingType::StorageBuffer}});
+                device, {{0, wgpu::ShaderStage::Compute, wgpu::BufferBindingType::Storage}});
             wgpu::BindGroup bg = utils::MakeBindGroup(device, bgl, {{0, buffer}});
 
             // Buffer usage in compute stage in bind group conflicts with index buffer. And binding
@@ -730,8 +730,8 @@
         {
             wgpu::Buffer buffer = CreateBuffer(4, wgpu::BufferUsage::Storage);
             wgpu::BindGroupLayout bgl = utils::MakeBindGroupLayout(
-                device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::ReadonlyStorageBuffer},
-                         {1, wgpu::ShaderStage::Compute, wgpu::BindingType::StorageBuffer}});
+                device, {{0, wgpu::ShaderStage::Fragment, wgpu::BufferBindingType::ReadOnlyStorage},
+                         {1, wgpu::ShaderStage::Compute, wgpu::BufferBindingType::Storage}});
             wgpu::BindGroup bg = utils::MakeBindGroup(device, bgl, {{0, buffer}, {1, buffer}});
 
             // Create a no-op compute pipeline.
@@ -764,9 +764,9 @@
             // Create bind groups. The bindings are visible for render pass.
             wgpu::BindGroupLayout bgl0 = utils::MakeBindGroupLayout(
                 device,
-                {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::ReadonlyStorageBuffer}});
+                {{0, wgpu::ShaderStage::Fragment, wgpu::BufferBindingType::ReadOnlyStorage}});
             wgpu::BindGroupLayout bgl1 = utils::MakeBindGroupLayout(
-                device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::StorageBuffer}});
+                device, {{0, wgpu::ShaderStage::Fragment, wgpu::BufferBindingType::Storage}});
             wgpu::BindGroup bg0 = utils::MakeBindGroup(device, bgl0, {{0, buffer}});
             wgpu::BindGroup bg1 = utils::MakeBindGroup(device, bgl1, {{0, buffer}});
 
@@ -808,9 +808,9 @@
             // Create bind groups. The bindings are visible for compute pass.
             wgpu::BindGroupLayout bgl0 = utils::MakeBindGroupLayout(
                 device,
-                {{0, wgpu::ShaderStage::Compute, wgpu::BindingType::ReadonlyStorageBuffer}});
+                {{0, wgpu::ShaderStage::Compute, wgpu::BufferBindingType::ReadOnlyStorage}});
             wgpu::BindGroupLayout bgl1 = utils::MakeBindGroupLayout(
-                device, {{0, wgpu::ShaderStage::Compute, wgpu::BindingType::StorageBuffer}});
+                device, {{0, wgpu::ShaderStage::Compute, wgpu::BufferBindingType::Storage}});
             wgpu::BindGroup bg0 = utils::MakeBindGroup(device, bgl0, {{0, buffer}});
             wgpu::BindGroup bg1 = utils::MakeBindGroup(device, bgl1, {{0, buffer}});
 
@@ -853,12 +853,10 @@
 
         // Create a bind group to use the texture as sampled and readonly storage bindings
         wgpu::BindGroupLayout bgl = utils::MakeBindGroupLayout(
-            device,
-            {{0, wgpu::ShaderStage::Fragment | wgpu::ShaderStage::Compute,
-              wgpu::BindingType::SampledTexture},
-             {1, wgpu::ShaderStage::Fragment | wgpu::ShaderStage::Compute,
-              wgpu::BindingType::ReadonlyStorageTexture, false, 0,
-              wgpu::TextureViewDimension::Undefined, wgpu::TextureComponentType::Float, kFormat}});
+            device, {{0, wgpu::ShaderStage::Fragment | wgpu::ShaderStage::Compute,
+                      wgpu::TextureSampleType::Float},
+                     {1, wgpu::ShaderStage::Fragment | wgpu::ShaderStage::Compute,
+                      wgpu::StorageTextureAccess::ReadOnly, kFormat}});
         wgpu::BindGroup bg = utils::MakeBindGroup(device, bgl, {{0, view}, {1, view}});
 
         // Test render pass
@@ -895,7 +893,7 @@
 
             // Create a bind group to use the texture as sampled binding
             wgpu::BindGroupLayout bgl = utils::MakeBindGroupLayout(
-                device, {{0, wgpu::ShaderStage::Vertex, wgpu::BindingType::SampledTexture}});
+                device, {{0, wgpu::ShaderStage::Vertex, wgpu::TextureSampleType::Float}});
             wgpu::BindGroup bg = utils::MakeBindGroup(device, bgl, {{0, view}});
 
             // Create a render pass to use the texture as a render target
@@ -918,10 +916,9 @@
 
             // Create a bind group to use the texture as sampled and writeonly bindings
             wgpu::BindGroupLayout bgl = utils::MakeBindGroupLayout(
-                device, {{0, wgpu::ShaderStage::Compute, wgpu::BindingType::SampledTexture},
-                         {1, wgpu::ShaderStage::Compute, wgpu::BindingType::WriteonlyStorageTexture,
-                          false, 0, wgpu::TextureViewDimension::Undefined,
-                          wgpu::TextureComponentType::Float, kFormat}});
+                device,
+                {{0, wgpu::ShaderStage::Compute, wgpu::TextureSampleType::Float},
+                 {1, wgpu::ShaderStage::Compute, wgpu::StorageTextureAccess::WriteOnly, kFormat}});
             wgpu::BindGroup bg = utils::MakeBindGroup(device, bgl, {{0, view}, {1, view}});
 
             // Create a no-op compute pipeline
@@ -965,9 +962,7 @@
             // Create a bind group to use the texture as writeonly storage binding
             wgpu::BindGroupLayout bgl = utils::MakeBindGroupLayout(
                 device,
-                {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::WriteonlyStorageTexture, false,
-                  0, wgpu::TextureViewDimension::Undefined, wgpu::TextureComponentType::Float,
-                  kFormat}});
+                {{0, wgpu::ShaderStage::Fragment, wgpu::StorageTextureAccess::WriteOnly, kFormat}});
             wgpu::BindGroup bg = utils::MakeBindGroup(device, bgl, {{0, view}});
 
             // It is invalid to use the texture as both writeonly storage and render target in
@@ -1005,12 +1000,9 @@
 
             // Create a bind group to use the texture as sampled and writeonly bindings
             wgpu::BindGroupLayout bgl = utils::MakeBindGroupLayout(
-                device, {{0, wgpu::ShaderStage::Compute, wgpu::BindingType::WriteonlyStorageTexture,
-                          false, 0, wgpu::TextureViewDimension::Undefined,
-                          wgpu::TextureComponentType::Float, kFormat},
-                         {1, wgpu::ShaderStage::Compute, wgpu::BindingType::WriteonlyStorageTexture,
-                          false, 0, wgpu::TextureViewDimension::Undefined,
-                          wgpu::TextureComponentType::Float, kFormat}});
+                device,
+                {{0, wgpu::ShaderStage::Compute, wgpu::StorageTextureAccess::WriteOnly, kFormat},
+                 {1, wgpu::ShaderStage::Compute, wgpu::StorageTextureAccess::WriteOnly, kFormat}});
             wgpu::BindGroup bg = utils::MakeBindGroup(device, bgl, {{0, view}, {1, view}});
 
             // Create a no-op compute pipeline
@@ -1057,7 +1049,7 @@
 
             // Create bind groups to use the texture as sampled
             wgpu::BindGroupLayout bgl = utils::MakeBindGroupLayout(
-                device, {{0, wgpu::ShaderStage::Vertex, wgpu::BindingType::SampledTexture}});
+                device, {{0, wgpu::ShaderStage::Vertex, wgpu::TextureSampleType::Float}});
             wgpu::BindGroup bg0 = utils::MakeBindGroup(device, bgl, {{0, v0}});
             wgpu::BindGroup bg1 = utils::MakeBindGroup(device, bgl, {{0, v1}});
 
@@ -1087,13 +1079,11 @@
 
             // Create bind groups to use the texture as readonly and writeonly bindings
             wgpu::BindGroupLayout readBGL = utils::MakeBindGroupLayout(
-                device, {{0, wgpu::ShaderStage::Compute, wgpu::BindingType::ReadonlyStorageTexture,
-                          false, 0, wgpu::TextureViewDimension::Undefined,
-                          wgpu::TextureComponentType::Float, kFormat}});
+                device,
+                {{0, wgpu::ShaderStage::Compute, wgpu::StorageTextureAccess::ReadOnly, kFormat}});
             wgpu::BindGroupLayout writeBGL = utils::MakeBindGroupLayout(
-                device, {{0, wgpu::ShaderStage::Compute, wgpu::BindingType::WriteonlyStorageTexture,
-                          false, 0, wgpu::TextureViewDimension::Undefined,
-                          wgpu::TextureComponentType::Float, kFormat}});
+                device,
+                {{0, wgpu::ShaderStage::Compute, wgpu::StorageTextureAccess::WriteOnly, kFormat}});
             wgpu::BindGroup readBG = utils::MakeBindGroup(device, readBGL, {{0, view}});
             wgpu::BindGroup writeBG = utils::MakeBindGroup(device, writeBGL, {{0, view}});
 
@@ -1119,13 +1109,11 @@
 
             // Create bind groups to use the texture as readonly and writeonly bindings
             wgpu::BindGroupLayout writeBGL = utils::MakeBindGroupLayout(
-                device, {{0, wgpu::ShaderStage::Compute, wgpu::BindingType::WriteonlyStorageTexture,
-                          false, 0, wgpu::TextureViewDimension::Undefined,
-                          wgpu::TextureComponentType::Float, kFormat}});
+                device,
+                {{0, wgpu::ShaderStage::Compute, wgpu::StorageTextureAccess::WriteOnly, kFormat}});
             wgpu::BindGroupLayout readBGL = utils::MakeBindGroupLayout(
-                device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::ReadonlyStorageTexture,
-                          false, 0, wgpu::TextureViewDimension::Undefined,
-                          wgpu::TextureComponentType::Float, kFormat}});
+                device,
+                {{0, wgpu::ShaderStage::Fragment, wgpu::StorageTextureAccess::ReadOnly, kFormat}});
             wgpu::BindGroup writeBG = utils::MakeBindGroup(device, writeBGL, {{0, view}});
             wgpu::BindGroup readBG = utils::MakeBindGroup(device, readBGL, {{0, view}});
 
@@ -1159,12 +1147,10 @@
         {
             // Create bind groups to use the texture as sampled and writeonly storage bindings
             wgpu::BindGroupLayout sampledBGL = utils::MakeBindGroupLayout(
-                device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::SampledTexture}});
+                device, {{0, wgpu::ShaderStage::Fragment, wgpu::TextureSampleType::Float}});
             wgpu::BindGroupLayout writeBGL = utils::MakeBindGroupLayout(
                 device,
-                {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::WriteonlyStorageTexture, false,
-                  0, wgpu::TextureViewDimension::Undefined, wgpu::TextureComponentType::Float,
-                  kFormat}});
+                {{0, wgpu::ShaderStage::Fragment, wgpu::StorageTextureAccess::WriteOnly, kFormat}});
             wgpu::BindGroup sampledBG = utils::MakeBindGroup(device, sampledBGL, {{0, view}});
             wgpu::BindGroup writeBG = utils::MakeBindGroup(device, writeBGL, {{0, view}});
 
@@ -1192,13 +1178,11 @@
         {
             // Create bind groups to use the texture as readonly and writeonly storage bindings
             wgpu::BindGroupLayout readBGL = utils::MakeBindGroupLayout(
-                device, {{0, wgpu::ShaderStage::Compute, wgpu::BindingType::ReadonlyStorageTexture,
-                          false, 0, wgpu::TextureViewDimension::Undefined,
-                          wgpu::TextureComponentType::Float, kFormat}});
+                device,
+                {{0, wgpu::ShaderStage::Compute, wgpu::StorageTextureAccess::ReadOnly, kFormat}});
             wgpu::BindGroupLayout writeBGL = utils::MakeBindGroupLayout(
-                device, {{0, wgpu::ShaderStage::Compute, wgpu::BindingType::WriteonlyStorageTexture,
-                          false, 0, wgpu::TextureViewDimension::Undefined,
-                          wgpu::TextureComponentType::Float, kFormat}});
+                device,
+                {{0, wgpu::ShaderStage::Compute, wgpu::StorageTextureAccess::WriteOnly, kFormat}});
             wgpu::BindGroup readBG = utils::MakeBindGroup(device, readBGL, {{0, view}});
             wgpu::BindGroup writeBG = utils::MakeBindGroup(device, writeBGL, {{0, view}});
 
@@ -1234,12 +1218,10 @@
         {
             // Create the bind group to use the texture as sampled and writeonly storage bindings
             wgpu::BindGroupLayout sampledBGL = utils::MakeBindGroupLayout(
-                device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::SampledTexture}});
+                device, {{0, wgpu::ShaderStage::Fragment, wgpu::TextureSampleType::Float}});
             wgpu::BindGroupLayout writeBGL = utils::MakeBindGroupLayout(
                 device,
-                {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::WriteonlyStorageTexture, false,
-                  0, wgpu::TextureViewDimension::Undefined, wgpu::TextureComponentType::Float,
-                  kFormat}});
+                {{0, wgpu::ShaderStage::Fragment, wgpu::StorageTextureAccess::WriteOnly, kFormat}});
             wgpu::BindGroup sampledBG = utils::MakeBindGroup(device, sampledBGL, {{0, view}});
             wgpu::BindGroup writeBG = utils::MakeBindGroup(device, writeBGL, {{0, view}});
 
@@ -1265,13 +1247,11 @@
         {
             // Create the bind group to use the texture as readonly and writeonly storage bindings
             wgpu::BindGroupLayout readBGL = utils::MakeBindGroupLayout(
-                device, {{0, wgpu::ShaderStage::Compute, wgpu::BindingType::ReadonlyStorageTexture,
-                          false, 0, wgpu::TextureViewDimension::Undefined,
-                          wgpu::TextureComponentType::Float, kFormat}});
+                device,
+                {{0, wgpu::ShaderStage::Compute, wgpu::StorageTextureAccess::ReadOnly, kFormat}});
             wgpu::BindGroupLayout writeBGL = utils::MakeBindGroupLayout(
-                device, {{0, wgpu::ShaderStage::Compute, wgpu::BindingType::WriteonlyStorageTexture,
-                          false, 0, wgpu::TextureViewDimension::Undefined,
-                          wgpu::TextureComponentType::Float, kFormat}});
+                device,
+                {{0, wgpu::ShaderStage::Compute, wgpu::StorageTextureAccess::WriteOnly, kFormat}});
             wgpu::BindGroup readBG = utils::MakeBindGroup(device, readBGL, {{0, view}});
             wgpu::BindGroup writeBG = utils::MakeBindGroup(device, writeBGL, {{0, view}});
 
@@ -1324,7 +1304,7 @@
         {
             // Create the bind group to use the texture as sampled
             wgpu::BindGroupLayout bgl = utils::MakeBindGroupLayout(
-                device, {{0, wgpu::ShaderStage::Compute, wgpu::BindingType::SampledTexture}});
+                device, {{0, wgpu::ShaderStage::Compute, wgpu::TextureSampleType::Float}});
             wgpu::BindGroup bg = utils::MakeBindGroup(device, bgl, {{0, view1}});
 
             wgpu::CommandEncoder encoder = device.CreateCommandEncoder();
@@ -1351,7 +1331,7 @@
 
             // Create the bind group to use the texture as sampled
             wgpu::BindGroupLayout bgl = utils::MakeBindGroupLayout(
-                device, {{0, wgpu::ShaderStage::Vertex, wgpu::BindingType::SampledTexture}});
+                device, {{0, wgpu::ShaderStage::Vertex, wgpu::TextureSampleType::Float}});
             wgpu::BindGroup bg0 = utils::MakeBindGroup(device, bgl, {{0, view0}});
             wgpu::BindGroup bg1 = utils::MakeBindGroup(device, bgl, {{0, view1}});
 
@@ -1392,14 +1372,12 @@
 
             // Create the bind group to use the texture as readonly and writeonly bindings
             wgpu::BindGroupLayout writeBGL = utils::MakeBindGroupLayout(
-                device, {{0, wgpu::ShaderStage::Compute, wgpu::BindingType::WriteonlyStorageTexture,
-                          false, 0, wgpu::TextureViewDimension::Undefined,
-                          wgpu::TextureComponentType::Float, kFormat}});
+                device,
+                {{0, wgpu::ShaderStage::Compute, wgpu::StorageTextureAccess::WriteOnly, kFormat}});
 
             wgpu::BindGroupLayout readBGL = utils::MakeBindGroupLayout(
-                device, {{0, wgpu::ShaderStage::Compute, wgpu::BindingType::ReadonlyStorageTexture,
-                          false, 0, wgpu::TextureViewDimension::Undefined,
-                          wgpu::TextureComponentType::Float, kFormat}});
+                device,
+                {{0, wgpu::ShaderStage::Compute, wgpu::StorageTextureAccess::ReadOnly, kFormat}});
 
             wgpu::BindGroup writeBG0 = utils::MakeBindGroup(device, writeBGL, {{0, view0}});
             wgpu::BindGroup readBG0 = utils::MakeBindGroup(device, readBGL, {{0, view0}});
@@ -1455,12 +1433,9 @@
         {
             // Create a bind group whose bindings are not visible in render pass
             wgpu::BindGroupLayout bgl = utils::MakeBindGroupLayout(
-                device, {{0, wgpu::ShaderStage::Compute, wgpu::BindingType::ReadonlyStorageTexture,
-                          false, 0, wgpu::TextureViewDimension::Undefined,
-                          wgpu::TextureComponentType::Float, kFormat},
-                         {1, wgpu::ShaderStage::None, wgpu::BindingType::WriteonlyStorageTexture,
-                          false, 0, wgpu::TextureViewDimension::Undefined,
-                          wgpu::TextureComponentType::Float, kFormat}});
+                device,
+                {{0, wgpu::ShaderStage::Compute, wgpu::StorageTextureAccess::ReadOnly, kFormat},
+                 {1, wgpu::ShaderStage::None, wgpu::StorageTextureAccess::WriteOnly, kFormat}});
             wgpu::BindGroup bg = utils::MakeBindGroup(device, bgl, {{0, view}, {1, view}});
 
             // These two bindings are invisible in render pass. But we still track these bindings.
@@ -1477,12 +1452,9 @@
         {
             // Create a bind group whose bindings are not visible in compute pass
             wgpu::BindGroupLayout bgl = utils::MakeBindGroupLayout(
-                device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::ReadonlyStorageTexture,
-                          false, 0, wgpu::TextureViewDimension::Undefined,
-                          wgpu::TextureComponentType::Float, kFormat},
-                         {1, wgpu::ShaderStage::None, wgpu::BindingType::WriteonlyStorageTexture,
-                          false, 0, wgpu::TextureViewDimension::Undefined,
-                          wgpu::TextureComponentType::Float, kFormat}});
+                device,
+                {{0, wgpu::ShaderStage::Fragment, wgpu::StorageTextureAccess::ReadOnly, kFormat},
+                 {1, wgpu::ShaderStage::None, wgpu::StorageTextureAccess::WriteOnly, kFormat}});
             wgpu::BindGroup bg = utils::MakeBindGroup(device, bgl, {{0, view}, {1, view}});
 
             // Create a no-op compute pipeline.
@@ -1516,9 +1488,8 @@
 
             // Create a bind group which use the texture as readonly storage in compute stage
             wgpu::BindGroupLayout bgl = utils::MakeBindGroupLayout(
-                device, {{0, wgpu::ShaderStage::Compute, wgpu::BindingType::ReadonlyStorageTexture,
-                          false, 0, wgpu::TextureViewDimension::Undefined,
-                          wgpu::TextureComponentType::Float, kFormat}});
+                device,
+                {{0, wgpu::ShaderStage::Compute, wgpu::StorageTextureAccess::ReadOnly, kFormat}});
             wgpu::BindGroup bg = utils::MakeBindGroup(device, bgl, {{0, view}});
 
             // Texture usage in compute stage in bind group conflicts with render target. And
@@ -1535,12 +1506,9 @@
         {
             // Create a bind group which contains both fragment and compute stages
             wgpu::BindGroupLayout bgl = utils::MakeBindGroupLayout(
-                device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::ReadonlyStorageTexture,
-                          false, 0, wgpu::TextureViewDimension::Undefined,
-                          wgpu::TextureComponentType::Float, kFormat},
-                         {1, wgpu::ShaderStage::Compute, wgpu::BindingType::WriteonlyStorageTexture,
-                          false, 0, wgpu::TextureViewDimension::Undefined,
-                          wgpu::TextureComponentType::Float, kFormat}});
+                device,
+                {{0, wgpu::ShaderStage::Fragment, wgpu::StorageTextureAccess::ReadOnly, kFormat},
+                 {1, wgpu::ShaderStage::Compute, wgpu::StorageTextureAccess::WriteOnly, kFormat}});
             wgpu::BindGroup bg = utils::MakeBindGroup(device, bgl, {{0, view}, {1, view}});
 
             // Create a no-op compute pipeline.
@@ -1570,15 +1538,11 @@
 
         // Create bind groups.
         wgpu::BindGroupLayout readBGL = utils::MakeBindGroupLayout(
-            device,
-            {{0, wgpu::ShaderStage::Fragment | wgpu::ShaderStage::Compute,
-              wgpu::BindingType::ReadonlyStorageTexture, false, 0,
-              wgpu::TextureViewDimension::Undefined, wgpu::TextureComponentType::Float, kFormat}});
+            device, {{0, wgpu::ShaderStage::Fragment | wgpu::ShaderStage::Compute,
+                      wgpu::StorageTextureAccess::ReadOnly, kFormat}});
         wgpu::BindGroupLayout writeBGL = utils::MakeBindGroupLayout(
-            device,
-            {{0, wgpu::ShaderStage::Fragment | wgpu::ShaderStage::Compute,
-              wgpu::BindingType::WriteonlyStorageTexture, false, 0,
-              wgpu::TextureViewDimension::Undefined, wgpu::TextureComponentType::Float, kFormat}});
+            device, {{0, wgpu::ShaderStage::Fragment | wgpu::ShaderStage::Compute,
+                      wgpu::StorageTextureAccess::WriteOnly, kFormat}});
         wgpu::BindGroup readBG = utils::MakeBindGroup(device, readBGL, {{0, view}});
         wgpu::BindGroup writeBG = utils::MakeBindGroup(device, writeBGL, {{0, view}});
 
diff --git a/src/tests/unittests/validation/StorageTextureValidationTests.cpp b/src/tests/unittests/validation/StorageTextureValidationTests.cpp
index 12a3f81..38897d4 100644
--- a/src/tests/unittests/validation/StorageTextureValidationTests.cpp
+++ b/src/tests/unittests/validation/StorageTextureValidationTests.cpp
@@ -57,7 +57,7 @@
     }
 
     static std::string CreateComputeShaderWithStorageTexture(
-        wgpu::BindingType storageTextureBindingType,
+        wgpu::StorageTextureAccess storageTextureBindingType,
         wgpu::TextureFormat textureFormat,
         wgpu::TextureViewDimension textureViewDimension = wgpu::TextureViewDimension::e2D) {
         const char* glslImageFormatQualifier = utils::GetGLSLImageFormatQualifier(textureFormat);
@@ -69,16 +69,16 @@
     }
 
     static std::string CreateComputeShaderWithStorageTexture(
-        wgpu::BindingType storageTextureBindingType,
+        wgpu::StorageTextureAccess storageTextureBindingType,
         const char* glslImageFormatQualifier,
         const char* textureComponentTypePrefix,
         const char* glslImageTypeDeclaration = "image2D") {
         const char* memoryQualifier = "";
         switch (storageTextureBindingType) {
-            case wgpu::BindingType::ReadonlyStorageTexture:
+            case wgpu::StorageTextureAccess::ReadOnly:
                 memoryQualifier = "readonly";
                 break;
-            case wgpu::BindingType::WriteonlyStorageTexture:
+            case wgpu::StorageTextureAccess::WriteOnly:
                 memoryQualifier = "writeonly";
                 break;
             default:
@@ -115,8 +115,8 @@
     wgpu::ShaderModule mDefaultVSModule;
     wgpu::ShaderModule mDefaultFSModule;
 
-    const std::array<wgpu::BindingType, 2> kSupportedStorageTextureBindingTypes = {
-        wgpu::BindingType::ReadonlyStorageTexture, wgpu::BindingType::WriteonlyStorageTexture};
+    const std::array<wgpu::StorageTextureAccess, 2> kSupportedStorageTextureAccess = {
+        wgpu::StorageTextureAccess::ReadOnly, wgpu::StorageTextureAccess::WriteOnly};
 };
 
 // Validate read-only storage textures can be declared in vertex and fragment shaders, while
@@ -279,21 +279,20 @@
 TEST_F(StorageTextureValidationTests, BindGroupLayoutWithStorageTextureBindingType) {
     struct TestSpec {
         wgpu::ShaderStage stage;
-        wgpu::BindingType type;
+        wgpu::StorageTextureAccess type;
         bool valid;
     };
     constexpr std::array<TestSpec, 6> kTestSpecs = {
-        {{wgpu::ShaderStage::Vertex, wgpu::BindingType::ReadonlyStorageTexture, true},
-         {wgpu::ShaderStage::Vertex, wgpu::BindingType::WriteonlyStorageTexture, false},
-         {wgpu::ShaderStage::Fragment, wgpu::BindingType::ReadonlyStorageTexture, true},
-         {wgpu::ShaderStage::Fragment, wgpu::BindingType::WriteonlyStorageTexture, true},
-         {wgpu::ShaderStage::Compute, wgpu::BindingType::ReadonlyStorageTexture, true},
-         {wgpu::ShaderStage::Compute, wgpu::BindingType::WriteonlyStorageTexture, true}}};
+        {{wgpu::ShaderStage::Vertex, wgpu::StorageTextureAccess::ReadOnly, true},
+         {wgpu::ShaderStage::Vertex, wgpu::StorageTextureAccess::WriteOnly, false},
+         {wgpu::ShaderStage::Fragment, wgpu::StorageTextureAccess::ReadOnly, true},
+         {wgpu::ShaderStage::Fragment, wgpu::StorageTextureAccess::WriteOnly, true},
+         {wgpu::ShaderStage::Compute, wgpu::StorageTextureAccess::ReadOnly, true},
+         {wgpu::ShaderStage::Compute, wgpu::StorageTextureAccess::WriteOnly, true}}};
 
     for (const auto& testSpec : kTestSpecs) {
-        wgpu::BindGroupLayoutEntry entry =
-            utils::BindingLayoutEntryInitializationHelper(0, testSpec.stage, testSpec.type);
-        entry.storageTextureFormat = wgpu::TextureFormat::R32Uint;
+        wgpu::BindGroupLayoutEntry entry = utils::BindingLayoutEntryInitializationHelper(
+            0, testSpec.stage, testSpec.type, wgpu::TextureFormat::R32Uint);
 
         wgpu::BindGroupLayoutDescriptor descriptor;
         descriptor.entryCount = 1;
@@ -330,7 +329,7 @@
         wgpu::TextureFormat::RG16Sint,     wgpu::TextureFormat::RG16Float,
         wgpu::TextureFormat::RGB10A2Unorm, wgpu::TextureFormat::RG11B10Ufloat};
 
-    for (wgpu::BindingType storageTextureBindingType : kSupportedStorageTextureBindingTypes) {
+    for (wgpu::StorageTextureAccess storageTextureBindingType : kSupportedStorageTextureAccess) {
         for (wgpu::TextureFormat format : kWGPUTextureFormatSupportedAsSPIRVImageFormats) {
             std::string computeShader =
                 CreateComputeShaderWithStorageTexture(storageTextureBindingType, format);
@@ -361,7 +360,7 @@
                                                                               {"r16_snorm", ""},
                                                                               {"rgb10_a2ui", "u"}}};
 
-    for (wgpu::BindingType bindingType : kSupportedStorageTextureBindingTypes) {
+    for (wgpu::StorageTextureAccess bindingType : kSupportedStorageTextureAccess) {
         for (const TextureFormatInfo& formatInfo : kUnsupportedTextureFormats) {
             std::string computeShader = CreateComputeShaderWithStorageTexture(
                 bindingType, formatInfo.name, formatInfo.componentTypePrefix);
@@ -379,7 +378,7 @@
         wgpu::TextureViewDimension::Cube, wgpu::TextureViewDimension::CubeArray};
     constexpr wgpu::TextureFormat kFormat = wgpu::TextureFormat::R32Float;
 
-    for (wgpu::BindingType bindingType : kSupportedStorageTextureBindingTypes) {
+    for (wgpu::StorageTextureAccess bindingType : kSupportedStorageTextureAccess) {
         for (wgpu::TextureViewDimension dimension : kUnsupportedTextureViewDimensions) {
             std::string computeShader =
                 CreateComputeShaderWithStorageTexture(bindingType, kFormat, dimension);
@@ -403,11 +402,10 @@
         wgpu::TextureViewDimension::Cube, wgpu::TextureViewDimension::CubeArray};
     constexpr wgpu::TextureFormat kFormat = wgpu::TextureFormat::R32Float;
 
-    for (wgpu::BindingType bindingType : kSupportedStorageTextureBindingTypes) {
+    for (wgpu::StorageTextureAccess bindingType : kSupportedStorageTextureAccess) {
         for (wgpu::TextureViewDimension dimension : kUnsupportedTextureViewDimensions) {
             ASSERT_DEVICE_ERROR(utils::MakeBindGroupLayout(
-                device, {{0, wgpu::ShaderStage::Compute, bindingType, false, 0, dimension,
-                          wgpu::TextureComponentType::Float, kFormat}}));
+                device, {{0, wgpu::ShaderStage::Compute, bindingType, kFormat, dimension}}));
         }
     }
 }
@@ -423,7 +421,7 @@
         wgpu::BindingType::WriteonlyStorageTexture};
     constexpr wgpu::TextureFormat kStorageTextureFormat = wgpu::TextureFormat::R32Float;
 
-    for (wgpu::BindingType bindingTypeInShader : kSupportedStorageTextureBindingTypes) {
+    for (wgpu::StorageTextureAccess bindingTypeInShader : kSupportedStorageTextureAccess) {
         // Create the compute shader with the given binding type.
         std::string computeShader =
             CreateComputeShaderWithStorageTexture(bindingTypeInShader, kStorageTextureFormat);
@@ -455,7 +453,10 @@
 
             // The binding type in the bind group layout must the same as the related image object
             // declared in shader.
-            if (bindingTypeInBindgroupLayout == bindingTypeInShader) {
+            if ((bindingTypeInBindgroupLayout == wgpu::BindingType::ReadonlyStorageTexture &&
+                 bindingTypeInShader == wgpu::StorageTextureAccess::ReadOnly) ||
+                (bindingTypeInBindgroupLayout == wgpu::BindingType::WriteonlyStorageTexture &&
+                 bindingTypeInShader == wgpu::StorageTextureAccess::WriteOnly)) {
                 device.CreateComputePipeline(&computePipelineDescriptor);
             } else {
                 ASSERT_DEVICE_ERROR(device.CreateComputePipeline(&computePipelineDescriptor));
@@ -470,10 +471,10 @@
     wgpu::BindGroupLayoutEntry errorBindGroupLayoutEntry;
     errorBindGroupLayoutEntry.binding = 0;
     errorBindGroupLayoutEntry.visibility = wgpu::ShaderStage::Compute;
-    errorBindGroupLayoutEntry.storageTextureFormat = wgpu::TextureFormat::Undefined;
+    errorBindGroupLayoutEntry.storageTexture.format = wgpu::TextureFormat::Undefined;
 
-    for (wgpu::BindingType bindingType : kSupportedStorageTextureBindingTypes) {
-        errorBindGroupLayoutEntry.type = bindingType;
+    for (wgpu::StorageTextureAccess bindingType : kSupportedStorageTextureAccess) {
+        errorBindGroupLayoutEntry.storageTexture.access = bindingType;
         ASSERT_DEVICE_ERROR(utils::MakeBindGroupLayout(device, {errorBindGroupLayoutEntry}));
     }
 }
@@ -485,11 +486,11 @@
     defaultBindGroupLayoutEntry.binding = 0;
     defaultBindGroupLayoutEntry.visibility = wgpu::ShaderStage::Compute;
 
-    for (wgpu::BindingType bindingType : kSupportedStorageTextureBindingTypes) {
+    for (wgpu::StorageTextureAccess bindingType : kSupportedStorageTextureAccess) {
         for (wgpu::TextureFormat textureFormat : utils::kAllTextureFormats) {
             wgpu::BindGroupLayoutEntry bindGroupLayoutBinding = defaultBindGroupLayoutEntry;
-            bindGroupLayoutBinding.type = bindingType;
-            bindGroupLayoutBinding.storageTextureFormat = textureFormat;
+            bindGroupLayoutBinding.storageTexture.access = bindingType;
+            bindGroupLayoutBinding.storageTexture.format = textureFormat;
             if (utils::TextureFormatSupportsStorageTexture(textureFormat)) {
                 utils::MakeBindGroupLayout(device, {bindGroupLayoutBinding});
             } else {
@@ -501,7 +502,7 @@
 
 // Verify the storage texture format in the bind group layout must match the declaration in shader.
 TEST_F(StorageTextureValidationTests, BindGroupLayoutStorageTextureFormatMatchesShaderDeclaration) {
-    for (wgpu::BindingType bindingType : kSupportedStorageTextureBindingTypes) {
+    for (wgpu::StorageTextureAccess bindingType : kSupportedStorageTextureAccess) {
         for (wgpu::TextureFormat storageTextureFormatInShader : utils::kAllTextureFormats) {
             if (!utils::TextureFormatSupportsStorageTexture(storageTextureFormatInShader)) {
                 continue;
@@ -521,7 +522,7 @@
 
             // Set common fileds of bind group layout binding.
             utils::BindingLayoutEntryInitializationHelper defaultBindGroupLayoutEntry = {
-                0, wgpu::ShaderStage::Compute, bindingType};
+                0, wgpu::ShaderStage::Compute, bindingType, utils::kAllTextureFormats[0]};
 
             for (wgpu::TextureFormat storageTextureFormatInBindGroupLayout :
                  utils::kAllTextureFormats) {
@@ -532,7 +533,8 @@
 
                 // Create the bind group layout with the given storage texture format.
                 wgpu::BindGroupLayoutEntry bindGroupLayoutBinding = defaultBindGroupLayoutEntry;
-                bindGroupLayoutBinding.storageTextureFormat = storageTextureFormatInBindGroupLayout;
+                bindGroupLayoutBinding.storageTexture.format =
+                    storageTextureFormatInBindGroupLayout;
                 wgpu::BindGroupLayout bindGroupLayout =
                     utils::MakeBindGroupLayout(device, {bindGroupLayoutBinding});
 
@@ -562,7 +564,7 @@
         wgpu::TextureViewDimension::e2DArray, wgpu::TextureViewDimension::e3D};
     constexpr wgpu::TextureFormat kStorageTextureFormat = wgpu::TextureFormat::R32Float;
 
-    for (wgpu::BindingType bindingType : kSupportedStorageTextureBindingTypes) {
+    for (wgpu::StorageTextureAccess bindingType : kSupportedStorageTextureAccess) {
         for (wgpu::TextureViewDimension dimensionInShader : kSupportedDimensions) {
             // Create the compute shader with the given texture view dimension.
             std::string computeShader = CreateComputeShaderWithStorageTexture(
@@ -575,15 +577,14 @@
             defaultComputePipelineDescriptor.computeStage.module = csModule;
             defaultComputePipelineDescriptor.computeStage.entryPoint = "main";
 
-            // Set common fileds of bind group layout binding.
+            // Set common fields of bind group layout binding.
             utils::BindingLayoutEntryInitializationHelper defaultBindGroupLayoutEntry = {
-                0, wgpu::ShaderStage::Compute, bindingType};
-            defaultBindGroupLayoutEntry.storageTextureFormat = kStorageTextureFormat;
+                0, wgpu::ShaderStage::Compute, bindingType, kStorageTextureFormat};
 
             for (wgpu::TextureViewDimension dimensionInBindGroupLayout : kSupportedDimensions) {
                 // Create the bind group layout with the given texture view dimension.
                 wgpu::BindGroupLayoutEntry bindGroupLayoutBinding = defaultBindGroupLayoutEntry;
-                bindGroupLayoutBinding.viewDimension = dimensionInBindGroupLayout;
+                bindGroupLayoutBinding.storageTexture.viewDimension = dimensionInBindGroupLayout;
                 wgpu::BindGroupLayout bindGroupLayout =
                     utils::MakeBindGroupLayout(device, {bindGroupLayoutBinding});
 
@@ -607,7 +608,10 @@
 
 // Verify that in a bind group layout binding neither read-only nor write-only storage textures
 // are allowed to have dynamic offsets.
+// TODO(dawn:527): No longer be applicable after changes to BindGroupLayoutEntry are complete.
 TEST_F(StorageTextureValidationTests, StorageTextureCannotHaveDynamicOffsets) {
+    const std::array<wgpu::BindingType, 2> kSupportedStorageTextureBindingTypes = {
+        wgpu::BindingType::ReadonlyStorageTexture, wgpu::BindingType::WriteonlyStorageTexture};
     for (wgpu::BindingType storageBindingType : kSupportedStorageTextureBindingTypes) {
         wgpu::BindGroupLayoutEntry bindGroupLayoutBinding;
         bindGroupLayoutBinding.binding = 0;
@@ -624,13 +628,13 @@
 // bind group.
 TEST_F(StorageTextureValidationTests, StorageTextureBindingTypeInBindGroup) {
     constexpr wgpu::TextureFormat kStorageTextureFormat = wgpu::TextureFormat::R32Float;
-    for (wgpu::BindingType storageBindingType : kSupportedStorageTextureBindingTypes) {
+    for (wgpu::StorageTextureAccess storageBindingType : kSupportedStorageTextureAccess) {
         // Create a bind group layout.
         wgpu::BindGroupLayoutEntry bindGroupLayoutBinding;
         bindGroupLayoutBinding.binding = 0;
         bindGroupLayoutBinding.visibility = wgpu::ShaderStage::Compute;
-        bindGroupLayoutBinding.type = storageBindingType;
-        bindGroupLayoutBinding.storageTextureFormat = kStorageTextureFormat;
+        bindGroupLayoutBinding.storageTexture.access = storageBindingType;
+        bindGroupLayoutBinding.storageTexture.format = kStorageTextureFormat;
         wgpu::BindGroupLayout bindGroupLayout =
             utils::MakeBindGroupLayout(device, {bindGroupLayoutBinding});
 
@@ -668,13 +672,13 @@
         wgpu::TextureUsage::Sampled,          wgpu::TextureUsage::Storage,
         wgpu::TextureUsage::RenderAttachment, wgpu::TextureUsage::Present};
 
-    for (wgpu::BindingType storageBindingType : kSupportedStorageTextureBindingTypes) {
+    for (wgpu::StorageTextureAccess storageBindingType : kSupportedStorageTextureAccess) {
         // Create a bind group layout.
         wgpu::BindGroupLayoutEntry bindGroupLayoutBinding;
         bindGroupLayoutBinding.binding = 0;
         bindGroupLayoutBinding.visibility = wgpu::ShaderStage::Compute;
-        bindGroupLayoutBinding.type = storageBindingType;
-        bindGroupLayoutBinding.storageTextureFormat = wgpu::TextureFormat::R32Float;
+        bindGroupLayoutBinding.storageTexture.access = storageBindingType;
+        bindGroupLayoutBinding.storageTexture.format = wgpu::TextureFormat::R32Float;
         wgpu::BindGroupLayout bindGroupLayout =
             utils::MakeBindGroupLayout(device, {bindGroupLayoutBinding});
 
@@ -698,11 +702,11 @@
 // Verify that the format of a texture used as read-only or write-only storage texture in a bind
 // group must match the corresponding bind group binding.
 TEST_F(StorageTextureValidationTests, StorageTextureFormatInBindGroup) {
-    for (wgpu::BindingType storageBindingType : kSupportedStorageTextureBindingTypes) {
+    for (wgpu::StorageTextureAccess storageBindingType : kSupportedStorageTextureAccess) {
         wgpu::BindGroupLayoutEntry defaultBindGroupLayoutEntry;
         defaultBindGroupLayoutEntry.binding = 0;
         defaultBindGroupLayoutEntry.visibility = wgpu::ShaderStage::Compute;
-        defaultBindGroupLayoutEntry.type = storageBindingType;
+        defaultBindGroupLayoutEntry.storageTexture.access = storageBindingType;
 
         for (wgpu::TextureFormat formatInBindGroupLayout : utils::kAllTextureFormats) {
             if (!utils::TextureFormatSupportsStorageTexture(formatInBindGroupLayout)) {
@@ -711,7 +715,7 @@
 
             // Create a bind group layout with given storage texture format.
             wgpu::BindGroupLayoutEntry bindGroupLayoutBinding = defaultBindGroupLayoutEntry;
-            bindGroupLayoutBinding.storageTextureFormat = formatInBindGroupLayout;
+            bindGroupLayoutBinding.storageTexture.format = formatInBindGroupLayout;
             wgpu::BindGroupLayout bindGroupLayout =
                 utils::MakeBindGroupLayout(device, {bindGroupLayoutBinding});
 
@@ -759,17 +763,17 @@
     kDefaultTextureViewDescriptor.baseArrayLayer = 0;
     kDefaultTextureViewDescriptor.arrayLayerCount = 1u;
 
-    for (wgpu::BindingType storageBindingType : kSupportedStorageTextureBindingTypes) {
+    for (wgpu::StorageTextureAccess storageBindingType : kSupportedStorageTextureAccess) {
         wgpu::BindGroupLayoutEntry defaultBindGroupLayoutEntry;
         defaultBindGroupLayoutEntry.binding = 0;
         defaultBindGroupLayoutEntry.visibility = wgpu::ShaderStage::Compute;
-        defaultBindGroupLayoutEntry.type = storageBindingType;
-        defaultBindGroupLayoutEntry.storageTextureFormat = kStorageTextureFormat;
+        defaultBindGroupLayoutEntry.storageTexture.access = storageBindingType;
+        defaultBindGroupLayoutEntry.storageTexture.format = kStorageTextureFormat;
 
         for (wgpu::TextureViewDimension dimensionInBindGroupLayout : kSupportedDimensions) {
             // Create a bind group layout with given texture view dimension.
             wgpu::BindGroupLayoutEntry bindGroupLayoutBinding = defaultBindGroupLayoutEntry;
-            bindGroupLayoutBinding.viewDimension = dimensionInBindGroupLayout;
+            bindGroupLayoutBinding.storageTexture.viewDimension = dimensionInBindGroupLayout;
             wgpu::BindGroupLayout bindGroupLayout =
                 utils::MakeBindGroupLayout(device, {bindGroupLayoutBinding});
 
@@ -794,7 +798,7 @@
 
 // Verify multisampled storage textures cannot be supported now.
 TEST_F(StorageTextureValidationTests, MultisampledStorageTexture) {
-    for (wgpu::BindingType bindingType : kSupportedStorageTextureBindingTypes) {
+    for (wgpu::StorageTextureAccess bindingType : kSupportedStorageTextureAccess) {
         std::string computeShader =
             CreateComputeShaderWithStorageTexture(bindingType, "rgba8", "", "image2DMS");
         ASSERT_DEVICE_ERROR(utils::CreateShaderModule(device, utils::SingleShaderStage::Compute,
@@ -811,12 +815,10 @@
     wgpu::Texture outputAttachment = CreateTexture(wgpu::TextureUsage::RenderAttachment, kFormat);
     utils::ComboRenderPassDescriptor renderPassDescriptor({outputAttachment.CreateView()});
 
-    for (wgpu::BindingType storageTextureType : kSupportedStorageTextureBindingTypes) {
+    for (wgpu::StorageTextureAccess storageTextureType : kSupportedStorageTextureAccess) {
         // Create a bind group that contains a storage texture.
         wgpu::BindGroupLayout bindGroupLayout = utils::MakeBindGroupLayout(
-            device,
-            {{0, wgpu::ShaderStage::Fragment, storageTextureType, false, 0,
-              wgpu::TextureViewDimension::Undefined, wgpu::TextureComponentType::Float, kFormat}});
+            device, {{0, wgpu::ShaderStage::Fragment, storageTextureType, kFormat}});
 
         wgpu::BindGroup bindGroupWithStorageTexture =
             utils::MakeBindGroup(device, bindGroupLayout, {{0, storageTexture.CreateView()}});
@@ -843,15 +845,12 @@
     utils::ComboRenderPassDescriptor renderPassDescriptor({outputAttachment.CreateView()});
 
     // Create a bind group that contains a storage texture and a sampled texture.
-    for (wgpu::BindingType storageTextureType : kSupportedStorageTextureBindingTypes) {
+    for (wgpu::StorageTextureAccess storageTextureType : kSupportedStorageTextureAccess) {
         // Create a bind group that binds the same texture as both storage texture and sampled
         // texture.
         wgpu::BindGroupLayout bindGroupLayout = utils::MakeBindGroupLayout(
-            device,
-            {{0, wgpu::ShaderStage::Fragment, storageTextureType, false, 0,
-              wgpu::TextureViewDimension::Undefined, wgpu::TextureComponentType::Float, kFormat},
-             {1, wgpu::ShaderStage::Fragment, wgpu::BindingType::SampledTexture, false, 0,
-              wgpu::TextureViewDimension::Undefined, wgpu::TextureComponentType::Float, kFormat}});
+            device, {{0, wgpu::ShaderStage::Fragment, storageTextureType, kFormat},
+                     {1, wgpu::ShaderStage::Fragment, wgpu::TextureSampleType::Float}});
         wgpu::BindGroup bindGroup = utils::MakeBindGroup(
             device, bindGroupLayout,
             {{0, storageTexture.CreateView()}, {1, storageTexture.CreateView()}});
@@ -864,10 +863,10 @@
         renderPassEncoder.SetBindGroup(0, bindGroup);
         renderPassEncoder.EndPass();
         switch (storageTextureType) {
-            case wgpu::BindingType::ReadonlyStorageTexture:
+            case wgpu::StorageTextureAccess::ReadOnly:
                 encoder.Finish();
                 break;
-            case wgpu::BindingType::WriteonlyStorageTexture:
+            case wgpu::StorageTextureAccess::WriteOnly:
                 ASSERT_DEVICE_ERROR(encoder.Finish());
                 break;
             default:
@@ -885,12 +884,10 @@
         CreateTexture(wgpu::TextureUsage::Storage | wgpu::TextureUsage::RenderAttachment, kFormat);
     utils::ComboRenderPassDescriptor renderPassDescriptor({storageTexture.CreateView()});
 
-    for (wgpu::BindingType storageTextureType : kSupportedStorageTextureBindingTypes) {
+    for (wgpu::StorageTextureAccess storageTextureType : kSupportedStorageTextureAccess) {
         // Create a bind group that contains a storage texture.
         wgpu::BindGroupLayout bindGroupLayout = utils::MakeBindGroupLayout(
-            device,
-            {{0, wgpu::ShaderStage::Fragment, storageTextureType, false, 0,
-              wgpu::TextureViewDimension::Undefined, wgpu::TextureComponentType::Float, kFormat}});
+            device, {{0, wgpu::ShaderStage::Fragment, storageTextureType, kFormat}});
         wgpu::BindGroup bindGroupWithStorageTexture =
             utils::MakeBindGroup(device, bindGroupLayout, {{0, storageTexture.CreateView()}});
 
@@ -913,11 +910,8 @@
     // Create a bind group that uses the same texture as both read-only and write-only storage
     // texture.
     wgpu::BindGroupLayout bindGroupLayout = utils::MakeBindGroupLayout(
-        device,
-        {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::ReadonlyStorageTexture, false, 0,
-          wgpu::TextureViewDimension::Undefined, wgpu::TextureComponentType::Float, kFormat},
-         {1, wgpu::ShaderStage::Fragment, wgpu::BindingType::WriteonlyStorageTexture, false, 0,
-          wgpu::TextureViewDimension::Undefined, wgpu::TextureComponentType::Float, kFormat}});
+        device, {{0, wgpu::ShaderStage::Fragment, wgpu::StorageTextureAccess::ReadOnly, kFormat},
+                 {1, wgpu::ShaderStage::Fragment, wgpu::StorageTextureAccess::WriteOnly, kFormat}});
     wgpu::BindGroup bindGroup =
         utils::MakeBindGroup(device, bindGroupLayout,
                              {{0, storageTexture.CreateView()}, {1, storageTexture.CreateView()}});
@@ -940,15 +934,12 @@
     wgpu::Texture storageTexture =
         CreateTexture(wgpu::TextureUsage::Storage | wgpu::TextureUsage::Sampled, kFormat);
 
-    for (wgpu::BindingType storageTextureType : kSupportedStorageTextureBindingTypes) {
+    for (wgpu::StorageTextureAccess storageTextureType : kSupportedStorageTextureAccess) {
         // Create a bind group that binds the same texture as both storage texture and sampled
         // texture.
         wgpu::BindGroupLayout bindGroupLayout = utils::MakeBindGroupLayout(
-            device,
-            {{0, wgpu::ShaderStage::Compute, storageTextureType, false, 0,
-              wgpu::TextureViewDimension::Undefined, wgpu::TextureComponentType::Float, kFormat},
-             {1, wgpu::ShaderStage::Compute, wgpu::BindingType::SampledTexture, false, 0,
-              wgpu::TextureViewDimension::Undefined, wgpu::TextureComponentType::Float, kFormat}});
+            device, {{0, wgpu::ShaderStage::Compute, storageTextureType, kFormat},
+                     {1, wgpu::ShaderStage::Compute, wgpu::TextureSampleType::Float}});
         wgpu::BindGroup bindGroup = utils::MakeBindGroup(
             device, bindGroupLayout,
             {{0, storageTexture.CreateView()}, {1, storageTexture.CreateView()}});
@@ -972,11 +963,8 @@
     // Create a bind group that uses the same texture as both read-only and write-only storage
     // texture.
     wgpu::BindGroupLayout bindGroupLayout = utils::MakeBindGroupLayout(
-        device,
-        {{0, wgpu::ShaderStage::Compute, wgpu::BindingType::ReadonlyStorageTexture, false, 0,
-          wgpu::TextureViewDimension::Undefined, wgpu::TextureComponentType::Float, kFormat},
-         {1, wgpu::ShaderStage::Compute, wgpu::BindingType::WriteonlyStorageTexture, false, 0,
-          wgpu::TextureViewDimension::Undefined, wgpu::TextureComponentType::Float, kFormat}});
+        device, {{0, wgpu::ShaderStage::Compute, wgpu::StorageTextureAccess::ReadOnly, kFormat},
+                 {1, wgpu::ShaderStage::Compute, wgpu::StorageTextureAccess::WriteOnly, kFormat}});
     wgpu::BindGroup bindGroup =
         utils::MakeBindGroup(device, bindGroupLayout,
                              {{0, storageTexture.CreateView()}, {1, storageTexture.CreateView()}});
diff --git a/src/tests/unittests/validation/TextureSubresourceTests.cpp b/src/tests/unittests/validation/TextureSubresourceTests.cpp
index 570b6a0..4e07e22 100644
--- a/src/tests/unittests/validation/TextureSubresourceTests.cpp
+++ b/src/tests/unittests/validation/TextureSubresourceTests.cpp
@@ -53,7 +53,7 @@
                             const wgpu::TextureView& samplerView) {
             // Create bind group
             wgpu::BindGroupLayout bgl = utils::MakeBindGroupLayout(
-                device, {{0, wgpu::ShaderStage::Vertex, wgpu::BindingType::SampledTexture}});
+                device, {{0, wgpu::ShaderStage::Vertex, wgpu::TextureSampleType::Float}});
 
             utils::ComboRenderPassDescriptor renderPassDesc({renderView});
 
@@ -73,10 +73,8 @@
                 wgpu::BindGroup bindGroup = utils::MakeBindGroup(device, bgl, {{0, samplerView}});
 
                 wgpu::BindGroupLayout bgl1 = utils::MakeBindGroupLayout(
-                    device,
-                    {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::ReadonlyStorageTexture,
-                      false, 0, wgpu::TextureViewDimension::Undefined,
-                      wgpu::TextureComponentType::Float, kFormat}});
+                    device, {{0, wgpu::ShaderStage::Fragment, wgpu::StorageTextureAccess::ReadOnly,
+                              kFormat}});
 
                 wgpu::BindGroup bindGroup1 = utils::MakeBindGroup(device, bgl1, {{0, samplerView}});
 
@@ -104,10 +102,8 @@
                 wgpu::BindGroup bindGroup = utils::MakeBindGroup(device, bgl, {{0, samplerView}});
 
                 wgpu::BindGroupLayout bgl1 = utils::MakeBindGroupLayout(
-                    device,
-                    {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::WriteonlyStorageTexture,
-                      false, 0, wgpu::TextureViewDimension::Undefined,
-                      wgpu::TextureComponentType::Float, kFormat}});
+                    device, {{0, wgpu::ShaderStage::Fragment, wgpu::StorageTextureAccess::WriteOnly,
+                              kFormat}});
                 wgpu::BindGroup bindGroup1 = utils::MakeBindGroup(device, bgl1, {{0, samplerView}});
 
                 wgpu::CommandEncoder encoder = device.CreateCommandEncoder();
diff --git a/src/tests/unittests/validation/UnsafeAPIValidationTests.cpp b/src/tests/unittests/validation/UnsafeAPIValidationTests.cpp
index 87b2602..3346722 100644
--- a/src/tests/unittests/validation/UnsafeAPIValidationTests.cpp
+++ b/src/tests/unittests/validation/UnsafeAPIValidationTests.cpp
@@ -156,29 +156,29 @@
 
     // Control case: storage buffer without a dynamic offset is allowed.
     {
-        entry.type = wgpu::BindingType::StorageBuffer;
-        entry.hasDynamicOffset = false;
+        entry.buffer.type = wgpu::BufferBindingType::Storage;
+        entry.buffer.hasDynamicOffset = false;
         device.CreateBindGroupLayout(&desc);
     }
 
     // Control case: readonly storage buffer without a dynamic offset is allowed.
     {
-        entry.type = wgpu::BindingType::ReadonlyStorageBuffer;
-        entry.hasDynamicOffset = false;
+        entry.buffer.type = wgpu::BufferBindingType::ReadOnlyStorage;
+        entry.buffer.hasDynamicOffset = false;
         device.CreateBindGroupLayout(&desc);
     }
 
     // Storage buffer with a dynamic offset is disallowed.
     {
-        entry.type = wgpu::BindingType::StorageBuffer;
-        entry.hasDynamicOffset = true;
+        entry.buffer.type = wgpu::BufferBindingType::Storage;
+        entry.buffer.hasDynamicOffset = true;
         ASSERT_DEVICE_ERROR(device.CreateBindGroupLayout(&desc));
     }
 
     // Readonly storage buffer with a dynamic offset is disallowed.
     {
-        entry.type = wgpu::BindingType::ReadonlyStorageBuffer;
-        entry.hasDynamicOffset = true;
+        entry.buffer.type = wgpu::BufferBindingType::ReadOnlyStorage;
+        entry.buffer.hasDynamicOffset = true;
         ASSERT_DEVICE_ERROR(device.CreateBindGroupLayout(&desc));
     }
 }