| // Copyright 2020 The Tint Authors. | 
 | // | 
 | // Licensed under the Apache License, Version 2.0 (the "License"); | 
 | // you may not use this file except in compliance with the License. | 
 | // You may obtain a copy of the License at | 
 | // | 
 | //     http://www.apache.org/licenses/LICENSE-2.0 | 
 | // | 
 | // Unless required by applicable law or agreed to in writing, software | 
 | // distributed under the License is distributed on an "AS IS" BASIS, | 
 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
 | // See the License for the specific language governing permissions and | 
 | // limitations under the License. | 
 |  | 
 | #include "src/ast/intrinsic_texture_helper_test.h" | 
 |  | 
 | #include "src/type/access_control_type.h" | 
 | #include "src/type/depth_texture_type.h" | 
 | #include "src/type/multisampled_texture_type.h" | 
 | #include "src/type/sampled_texture_type.h" | 
 |  | 
 | namespace tint { | 
 | namespace ast { | 
 | namespace intrinsic { | 
 | namespace test { | 
 |  | 
 | using u32 = ProgramBuilder::u32; | 
 | using i32 = ProgramBuilder::i32; | 
 | using f32 = ProgramBuilder::f32; | 
 |  | 
 | TextureOverloadCase::TextureOverloadCase( | 
 |     ValidTextureOverload o, | 
 |     const char* desc, | 
 |     TextureKind tk, | 
 |     type::SamplerKind sk, | 
 |     type::TextureDimension dims, | 
 |     TextureDataType datatype, | 
 |     const char* f, | 
 |     std::function<ExpressionList(ProgramBuilder*)> a) | 
 |     : overload(o), | 
 |       description(desc), | 
 |       texture_kind(tk), | 
 |       sampler_kind(sk), | 
 |       texture_dimension(dims), | 
 |       texture_data_type(datatype), | 
 |       function(f), | 
 |       args(std::move(a)) {} | 
 | TextureOverloadCase::TextureOverloadCase( | 
 |     ValidTextureOverload o, | 
 |     const char* desc, | 
 |     TextureKind tk, | 
 |     type::TextureDimension dims, | 
 |     TextureDataType datatype, | 
 |     const char* f, | 
 |     std::function<ExpressionList(ProgramBuilder*)> a) | 
 |     : overload(o), | 
 |       description(desc), | 
 |       texture_kind(tk), | 
 |       texture_dimension(dims), | 
 |       texture_data_type(datatype), | 
 |       function(f), | 
 |       args(std::move(a)) {} | 
 | TextureOverloadCase::TextureOverloadCase( | 
 |     ValidTextureOverload o, | 
 |     const char* d, | 
 |     AccessControl access, | 
 |     type::ImageFormat i, | 
 |     type::TextureDimension dims, | 
 |     TextureDataType datatype, | 
 |     const char* f, | 
 |     std::function<ExpressionList(ProgramBuilder*)> a) | 
 |     : overload(o), | 
 |       description(d), | 
 |       texture_kind(TextureKind::kStorage), | 
 |       access_control(access), | 
 |       image_format(i), | 
 |       texture_dimension(dims), | 
 |       texture_data_type(datatype), | 
 |       function(f), | 
 |       args(std::move(a)) {} | 
 | TextureOverloadCase::TextureOverloadCase(const TextureOverloadCase&) = default; | 
 | TextureOverloadCase::~TextureOverloadCase() = default; | 
 |  | 
 | std::ostream& operator<<(std::ostream& out, const TextureKind& kind) { | 
 |   switch (kind) { | 
 |     case TextureKind::kRegular: | 
 |       out << "regular"; | 
 |       break; | 
 |     case TextureKind::kDepth: | 
 |       out << "depth"; | 
 |       break; | 
 |     case TextureKind::kMultisampled: | 
 |       out << "multisampled"; | 
 |       break; | 
 |     case TextureKind::kStorage: | 
 |       out << "storage"; | 
 |       break; | 
 |   } | 
 |   return out; | 
 | } | 
 |  | 
 | std::ostream& operator<<(std::ostream& out, const TextureDataType& ty) { | 
 |   switch (ty) { | 
 |     case TextureDataType::kF32: | 
 |       out << "f32"; | 
 |       break; | 
 |     case TextureDataType::kU32: | 
 |       out << "u32"; | 
 |       break; | 
 |     case TextureDataType::kI32: | 
 |       out << "i32"; | 
 |       break; | 
 |   } | 
 |   return out; | 
 | } | 
 |  | 
 | std::ostream& operator<<(std::ostream& out, const TextureOverloadCase& data) { | 
 |   out << "TextureOverloadCase " << static_cast<int>(data.overload) << "\n"; | 
 |   out << data.description << "\n"; | 
 |   out << "texture_kind:      " << data.texture_kind << "\n"; | 
 |   out << "sampler_kind:      "; | 
 |   if (data.texture_kind != TextureKind::kStorage) { | 
 |     out << data.sampler_kind; | 
 |   } else { | 
 |     out << "<unused>"; | 
 |   } | 
 |   out << "\n"; | 
 |   out << "access_control:    " << data.access_control << "\n"; | 
 |   out << "image_format:      " << data.image_format << "\n"; | 
 |   out << "texture_dimension: " << data.texture_dimension << "\n"; | 
 |   out << "texture_data_type: " << data.texture_data_type << "\n"; | 
 |   return out; | 
 | } | 
 |  | 
 | type::Type* TextureOverloadCase::resultVectorComponentType( | 
 |     ProgramBuilder* b) const { | 
 |   switch (texture_data_type) { | 
 |     case ast::intrinsic::test::TextureDataType::kF32: | 
 |       return b->ty.f32(); | 
 |     case ast::intrinsic::test::TextureDataType::kU32: | 
 |       return b->ty.u32(); | 
 |     case ast::intrinsic::test::TextureDataType::kI32: | 
 |       return b->ty.i32(); | 
 |   } | 
 |  | 
 |   TINT_UNREACHABLE(b->Diagnostics()); | 
 |   return nullptr; | 
 | } | 
 |  | 
 | ast::Variable* TextureOverloadCase::buildTextureVariable( | 
 |     ProgramBuilder* b) const { | 
 |   auto* datatype = resultVectorComponentType(b); | 
 |  | 
 |   DecorationList decos = { | 
 |       b->create<ast::GroupDecoration>(0), | 
 |       b->create<ast::BindingDecoration>(0), | 
 |   }; | 
 |   switch (texture_kind) { | 
 |     case ast::intrinsic::test::TextureKind::kRegular: | 
 |       return b->Global( | 
 |           "texture", | 
 |           b->create<type::SampledTexture>(texture_dimension, datatype), | 
 |           ast::StorageClass::kUniformConstant, nullptr, decos); | 
 |  | 
 |     case ast::intrinsic::test::TextureKind::kDepth: | 
 |       return b->Global("texture", | 
 |                        b->create<type::DepthTexture>(texture_dimension), | 
 |                        ast::StorageClass::kUniformConstant, nullptr, decos); | 
 |  | 
 |     case ast::intrinsic::test::TextureKind::kMultisampled: | 
 |       return b->Global( | 
 |           "texture", | 
 |           b->create<type::MultisampledTexture>(texture_dimension, datatype), | 
 |           ast::StorageClass::kUniformConstant, nullptr, decos); | 
 |  | 
 |     case ast::intrinsic::test::TextureKind::kStorage: { | 
 |       auto* st = b->create<type::StorageTexture>(texture_dimension, | 
 |                                                  image_format, datatype); | 
 |  | 
 |       auto* ac = b->create<type::AccessControl>(access_control, st); | 
 |       return b->Global("texture", ac, ast::StorageClass::kUniformConstant, | 
 |                        nullptr, decos); | 
 |     } | 
 |   } | 
 |  | 
 |   TINT_UNREACHABLE(b->Diagnostics()); | 
 |   return nullptr; | 
 | } | 
 |  | 
 | ast::Variable* TextureOverloadCase::buildSamplerVariable( | 
 |     ProgramBuilder* b) const { | 
 |   DecorationList decos = { | 
 |       b->create<ast::GroupDecoration>(0), | 
 |       b->create<ast::BindingDecoration>(1), | 
 |   }; | 
 |   return b->Global("sampler", b->create<type::Sampler>(sampler_kind), | 
 |                    ast::StorageClass::kUniformConstant, nullptr, decos); | 
 | } | 
 |  | 
 | std::vector<TextureOverloadCase> TextureOverloadCase::ValidCases() { | 
 |   return { | 
 |       { | 
 |           ValidTextureOverload::kDimensions1d, | 
 |           "textureDimensions(t : texture_1d<f32>) -> i32", | 
 |           TextureKind::kRegular, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k1d, | 
 |           TextureDataType::kF32, | 
 |           "textureDimensions", | 
 |           [](ProgramBuilder* b) { return b->ExprList("texture"); }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kDimensions2d, | 
 |           "textureDimensions(t : texture_2d<f32>) -> vec2<i32>", | 
 |           TextureKind::kRegular, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k2d, | 
 |           TextureDataType::kF32, | 
 |           "textureDimensions", | 
 |           [](ProgramBuilder* b) { return b->ExprList("texture"); }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kDimensions2dLevel, | 
 |           "textureDimensions(t     : texture_2d<f32>,\n" | 
 |           "                  level : i32) -> vec2<i32>", | 
 |           TextureKind::kRegular, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k2d, | 
 |           TextureDataType::kF32, | 
 |           "textureDimensions", | 
 |           [](ProgramBuilder* b) { return b->ExprList("texture", 1); }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kDimensions2dArray, | 
 |           "textureDimensions(t : texture_2d_array<f32>) -> vec2<i32>", | 
 |           TextureKind::kRegular, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k2dArray, | 
 |           TextureDataType::kF32, | 
 |           "textureDimensions", | 
 |           [](ProgramBuilder* b) { return b->ExprList("texture"); }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kDimensions2dArrayLevel, | 
 |           "textureDimensions(t     : texture_2d_array<f32>,\n" | 
 |           "                  level : i32) -> vec2<i32>", | 
 |           TextureKind::kRegular, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k2dArray, | 
 |           TextureDataType::kF32, | 
 |           "textureDimensions", | 
 |           [](ProgramBuilder* b) { return b->ExprList("texture", 1); }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kDimensions3d, | 
 |           "textureDimensions(t : texture_3d<f32>) -> vec3<i32>", | 
 |           TextureKind::kRegular, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k3d, | 
 |           TextureDataType::kF32, | 
 |           "textureDimensions", | 
 |           [](ProgramBuilder* b) { return b->ExprList("texture"); }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kDimensions3dLevel, | 
 |           "textureDimensions(t     : texture_3d<f32>,\n" | 
 |           "                  level : i32) -> vec3<i32>", | 
 |           TextureKind::kRegular, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k3d, | 
 |           TextureDataType::kF32, | 
 |           "textureDimensions", | 
 |           [](ProgramBuilder* b) { return b->ExprList("texture", 1); }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kDimensionsCube, | 
 |           "textureDimensions(t : texture_cube<f32>) -> vec3<i32>", | 
 |           TextureKind::kRegular, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::kCube, | 
 |           TextureDataType::kF32, | 
 |           "textureDimensions", | 
 |           [](ProgramBuilder* b) { return b->ExprList("texture"); }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kDimensionsCubeLevel, | 
 |           "textureDimensions(t     : texture_cube<f32>,\n" | 
 |           "                  level : i32) -> vec3<i32>", | 
 |           TextureKind::kRegular, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::kCube, | 
 |           TextureDataType::kF32, | 
 |           "textureDimensions", | 
 |           [](ProgramBuilder* b) { return b->ExprList("texture", 1); }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kDimensionsCubeArray, | 
 |           "textureDimensions(t : texture_cube_array<f32>) -> vec3<i32>", | 
 |           TextureKind::kRegular, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::kCubeArray, | 
 |           TextureDataType::kF32, | 
 |           "textureDimensions", | 
 |           [](ProgramBuilder* b) { return b->ExprList("texture"); }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kDimensionsCubeArrayLevel, | 
 |           "textureDimensions(t     : texture_cube_array<f32>,\n" | 
 |           "                  level : i32) -> vec3<i32>", | 
 |           TextureKind::kRegular, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::kCubeArray, | 
 |           TextureDataType::kF32, | 
 |           "textureDimensions", | 
 |           [](ProgramBuilder* b) { return b->ExprList("texture", 1); }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kDimensionsMultisampled2d, | 
 |           "textureDimensions(t : texture_multisampled_2d<f32>)-> vec2<i32>", | 
 |           TextureKind::kMultisampled, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k2d, | 
 |           TextureDataType::kF32, | 
 |           "textureDimensions", | 
 |           [](ProgramBuilder* b) { return b->ExprList("texture"); }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kDimensionsMultisampled2dArray, | 
 |           "textureDimensions(t : texture_multisampled_2d_array<f32>)-> " | 
 |           "vec2<i32>", | 
 |           TextureKind::kMultisampled, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k2dArray, | 
 |           TextureDataType::kF32, | 
 |           "textureDimensions", | 
 |           [](ProgramBuilder* b) { return b->ExprList("texture"); }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kDimensionsDepth2d, | 
 |           "textureDimensions(t : texture_depth_2d) -> vec2<i32>", | 
 |           TextureKind::kDepth, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k2d, | 
 |           TextureDataType::kF32, | 
 |           "textureDimensions", | 
 |           [](ProgramBuilder* b) { return b->ExprList("texture"); }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kDimensionsDepth2dLevel, | 
 |           "textureDimensions(t     : texture_depth_2d,\n" | 
 |           "                  level : i32) -> vec2<i32>", | 
 |           TextureKind::kDepth, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k2d, | 
 |           TextureDataType::kF32, | 
 |           "textureDimensions", | 
 |           [](ProgramBuilder* b) { return b->ExprList("texture", 1); }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kDimensionsDepth2dArray, | 
 |           "textureDimensions(t : texture_depth_2d_array) -> vec2<i32>", | 
 |           TextureKind::kDepth, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k2dArray, | 
 |           TextureDataType::kF32, | 
 |           "textureDimensions", | 
 |           [](ProgramBuilder* b) { return b->ExprList("texture"); }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kDimensionsDepth2dArrayLevel, | 
 |           "textureDimensions(t     : texture_depth_2d_array,\n" | 
 |           "                  level : i32) -> vec2<i32>", | 
 |           TextureKind::kDepth, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k2dArray, | 
 |           TextureDataType::kF32, | 
 |           "textureDimensions", | 
 |           [](ProgramBuilder* b) { return b->ExprList("texture", 1); }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kDimensionsDepthCube, | 
 |           "textureDimensions(t : texture_depth_cube) -> vec3<i32>", | 
 |           TextureKind::kDepth, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::kCube, | 
 |           TextureDataType::kF32, | 
 |           "textureDimensions", | 
 |           [](ProgramBuilder* b) { return b->ExprList("texture"); }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kDimensionsDepthCubeLevel, | 
 |           "textureDimensions(t     : texture_depth_cube,\n" | 
 |           "                  level : i32) -> vec3<i32>", | 
 |           TextureKind::kDepth, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::kCube, | 
 |           TextureDataType::kF32, | 
 |           "textureDimensions", | 
 |           [](ProgramBuilder* b) { return b->ExprList("texture", 1); }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kDimensionsDepthCubeArray, | 
 |           "textureDimensions(t : texture_depth_cube_array) -> vec3<i32>", | 
 |           TextureKind::kDepth, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::kCubeArray, | 
 |           TextureDataType::kF32, | 
 |           "textureDimensions", | 
 |           [](ProgramBuilder* b) { return b->ExprList("texture"); }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kDimensionsDepthCubeArrayLevel, | 
 |           "textureDimensions(t     : texture_depth_cube_array,\n" | 
 |           "                  level : i32) -> vec3<i32>", | 
 |           TextureKind::kDepth, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::kCubeArray, | 
 |           TextureDataType::kF32, | 
 |           "textureDimensions", | 
 |           [](ProgramBuilder* b) { return b->ExprList("texture", 1); }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kDimensionsStorageRO1d, | 
 |           "textureDimensions(t : texture_storage_1d<rgba32float>) -> i32", | 
 |           ast::AccessControl::kReadOnly, | 
 |           type::ImageFormat::kRgba32Float, | 
 |           type::TextureDimension::k1d, | 
 |           TextureDataType::kF32, | 
 |           "textureDimensions", | 
 |           [](ProgramBuilder* b) { return b->ExprList("texture"); }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kDimensionsStorageRO2d, | 
 |           "textureDimensions(t : texture_storage_2d<rgba32float>) -> " | 
 |           "vec2<i32>", | 
 |           ast::AccessControl::kReadOnly, | 
 |           type::ImageFormat::kRgba32Float, | 
 |           type::TextureDimension::k2d, | 
 |           TextureDataType::kF32, | 
 |           "textureDimensions", | 
 |           [](ProgramBuilder* b) { return b->ExprList("texture"); }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kDimensionsStorageRO2dArray, | 
 |           "textureDimensions(t : texture_storage_2d_array<rgba32float>) -> " | 
 |           "vec2<i32>", | 
 |           ast::AccessControl::kReadOnly, | 
 |           type::ImageFormat::kRgba32Float, | 
 |           type::TextureDimension::k2dArray, | 
 |           TextureDataType::kF32, | 
 |           "textureDimensions", | 
 |           [](ProgramBuilder* b) { return b->ExprList("texture"); }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kDimensionsStorageRO3d, | 
 |           "textureDimensions(t : texture_storage_3d<rgba32float>) -> " | 
 |           "vec3<i32>", | 
 |           ast::AccessControl::kReadOnly, | 
 |           type::ImageFormat::kRgba32Float, | 
 |           type::TextureDimension::k3d, | 
 |           TextureDataType::kF32, | 
 |           "textureDimensions", | 
 |           [](ProgramBuilder* b) { return b->ExprList("texture"); }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kDimensionsStorageWO1d, | 
 |           "textureDimensions(t : texture_storage_1d<rgba32float>) -> i32", | 
 |           ast::AccessControl::kWriteOnly, | 
 |           type::ImageFormat::kRgba32Float, | 
 |           type::TextureDimension::k1d, | 
 |           TextureDataType::kF32, | 
 |           "textureDimensions", | 
 |           [](ProgramBuilder* b) { return b->ExprList("texture"); }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kDimensionsStorageWO2d, | 
 |           "textureDimensions(t : texture_storage_2d<rgba32float>) -> " | 
 |           "vec2<i32>", | 
 |           ast::AccessControl::kWriteOnly, | 
 |           type::ImageFormat::kRgba32Float, | 
 |           type::TextureDimension::k2d, | 
 |           TextureDataType::kF32, | 
 |           "textureDimensions", | 
 |           [](ProgramBuilder* b) { return b->ExprList("texture"); }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kDimensionsStorageWO2dArray, | 
 |           "textureDimensions(t : texture_storage_2d_array<rgba32float>) -> " | 
 |           "vec2<i32>", | 
 |           ast::AccessControl::kWriteOnly, | 
 |           type::ImageFormat::kRgba32Float, | 
 |           type::TextureDimension::k2dArray, | 
 |           TextureDataType::kF32, | 
 |           "textureDimensions", | 
 |           [](ProgramBuilder* b) { return b->ExprList("texture"); }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kDimensionsStorageWO3d, | 
 |           "textureDimensions(t : texture_storage_3d<rgba32float>) -> " | 
 |           "vec3<i32>", | 
 |           ast::AccessControl::kWriteOnly, | 
 |           type::ImageFormat::kRgba32Float, | 
 |           type::TextureDimension::k3d, | 
 |           TextureDataType::kF32, | 
 |           "textureDimensions", | 
 |           [](ProgramBuilder* b) { return b->ExprList("texture"); }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kNumLayers2dArray, | 
 |           "textureNumLayers(t : texture_2d_array<f32>) -> i32", | 
 |           TextureKind::kRegular, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k2dArray, | 
 |           TextureDataType::kF32, | 
 |           "textureNumLayers", | 
 |           [](ProgramBuilder* b) { return b->ExprList("texture"); }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kNumLayersCubeArray, | 
 |           "textureNumLayers(t : texture_cube_array<f32>) -> i32", | 
 |           TextureKind::kRegular, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::kCubeArray, | 
 |           TextureDataType::kF32, | 
 |           "textureNumLayers", | 
 |           [](ProgramBuilder* b) { return b->ExprList("texture"); }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kNumLayersMultisampled2dArray, | 
 |           "textureNumLayers(t : texture_multisampled_2d_array<f32>) -> i32", | 
 |           TextureKind::kMultisampled, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k2dArray, | 
 |           TextureDataType::kF32, | 
 |           "textureNumLayers", | 
 |           [](ProgramBuilder* b) { return b->ExprList("texture"); }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kNumLayersDepth2dArray, | 
 |           "textureNumLayers(t : texture_depth_2d_array) -> i32", | 
 |           TextureKind::kDepth, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k2dArray, | 
 |           TextureDataType::kF32, | 
 |           "textureNumLayers", | 
 |           [](ProgramBuilder* b) { return b->ExprList("texture"); }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kNumLayersDepthCubeArray, | 
 |           "textureNumLayers(t : texture_depth_cube_array) -> i32", | 
 |           TextureKind::kDepth, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::kCubeArray, | 
 |           TextureDataType::kF32, | 
 |           "textureNumLayers", | 
 |           [](ProgramBuilder* b) { return b->ExprList("texture"); }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kNumLayersStorageWO2dArray, | 
 |           "textureNumLayers(t : texture_storage_2d_array<rgba32float>) -> i32", | 
 |           ast::AccessControl::kWriteOnly, | 
 |           type::ImageFormat::kRgba32Float, | 
 |           type::TextureDimension::k2dArray, | 
 |           TextureDataType::kF32, | 
 |           "textureNumLayers", | 
 |           [](ProgramBuilder* b) { return b->ExprList("texture"); }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kNumLevels2d, | 
 |           "textureNumLevels(t : texture_2d<f32>) -> i32", | 
 |           TextureKind::kRegular, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k2d, | 
 |           TextureDataType::kF32, | 
 |           "textureNumLevels", | 
 |           [](ProgramBuilder* b) { return b->ExprList("texture"); }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kNumLevels2dArray, | 
 |           "textureNumLevels(t : texture_2d_array<f32>) -> i32", | 
 |           TextureKind::kRegular, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k2dArray, | 
 |           TextureDataType::kF32, | 
 |           "textureNumLevels", | 
 |           [](ProgramBuilder* b) { return b->ExprList("texture"); }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kNumLevels3d, | 
 |           "textureNumLevels(t : texture_3d<f32>) -> i32", | 
 |           TextureKind::kRegular, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k3d, | 
 |           TextureDataType::kF32, | 
 |           "textureNumLevels", | 
 |           [](ProgramBuilder* b) { return b->ExprList("texture"); }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kNumLevelsCube, | 
 |           "textureNumLevels(t : texture_cube<f32>) -> i32", | 
 |           TextureKind::kRegular, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::kCube, | 
 |           TextureDataType::kF32, | 
 |           "textureNumLevels", | 
 |           [](ProgramBuilder* b) { return b->ExprList("texture"); }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kNumLevelsCubeArray, | 
 |           "textureNumLevels(t : texture_cube_array<f32>) -> i32", | 
 |           TextureKind::kRegular, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::kCubeArray, | 
 |           TextureDataType::kF32, | 
 |           "textureNumLevels", | 
 |           [](ProgramBuilder* b) { return b->ExprList("texture"); }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kNumLevelsDepth2d, | 
 |           "textureNumLevels(t : texture_depth_2d) -> i32", | 
 |           TextureKind::kDepth, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k2d, | 
 |           TextureDataType::kF32, | 
 |           "textureNumLevels", | 
 |           [](ProgramBuilder* b) { return b->ExprList("texture"); }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kNumLevelsDepth2dArray, | 
 |           "textureNumLevels(t : texture_depth_2d_array) -> i32", | 
 |           TextureKind::kDepth, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k2dArray, | 
 |           TextureDataType::kF32, | 
 |           "textureNumLevels", | 
 |           [](ProgramBuilder* b) { return b->ExprList("texture"); }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kNumLevelsDepthCube, | 
 |           "textureNumLevels(t : texture_depth_cube) -> i32", | 
 |           TextureKind::kDepth, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::kCube, | 
 |           TextureDataType::kF32, | 
 |           "textureNumLevels", | 
 |           [](ProgramBuilder* b) { return b->ExprList("texture"); }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kNumLevelsDepthCubeArray, | 
 |           "textureNumLevels(t : texture_depth_cube_array) -> i32", | 
 |           TextureKind::kDepth, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::kCubeArray, | 
 |           TextureDataType::kF32, | 
 |           "textureNumLevels", | 
 |           [](ProgramBuilder* b) { return b->ExprList("texture"); }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kNumSamplesMultisampled2d, | 
 |           "textureNumSamples(t : texture_multisampled_2d<f32>) -> i32", | 
 |           TextureKind::kMultisampled, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k2d, | 
 |           TextureDataType::kF32, | 
 |           "textureNumSamples", | 
 |           [](ProgramBuilder* b) { return b->ExprList("texture"); }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kNumSamplesMultisampled2dArray, | 
 |           "textureNumSamples(t : texture_multisampled_2d_array<f32>) -> i32", | 
 |           TextureKind::kMultisampled, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k2dArray, | 
 |           TextureDataType::kF32, | 
 |           "textureNumSamples", | 
 |           [](ProgramBuilder* b) { return b->ExprList("texture"); }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kSample1dF32, | 
 |           "textureSample(t      : texture_1d<f32>,\n" | 
 |           "              s      : sampler,\n" | 
 |           "              coords : f32) -> vec4<f32>", | 
 |           TextureKind::kRegular, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k1d, | 
 |           TextureDataType::kF32, | 
 |           "textureSample", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",  // t | 
 |                                "sampler",  // s | 
 |                                1.0f);      // coords | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kSample2dF32, | 
 |           "textureSample(t      : texture_2d<f32>,\n" | 
 |           "              s      : sampler,\n" | 
 |           "              coords : vec2<f32>) -> vec4<f32>", | 
 |           TextureKind::kRegular, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k2d, | 
 |           TextureDataType::kF32, | 
 |           "textureSample", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",                // t | 
 |                                "sampler",                // s | 
 |                                b->vec2<f32>(1.f, 2.f));  // coords | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kSample2dOffsetF32, | 
 |           "textureSample(t      : texture_2d<f32>,\n" | 
 |           "              s      : sampler,\n" | 
 |           "              coords : vec2<f32>\n" | 
 |           "              offset : vec2<i32>) -> vec4<f32>", | 
 |           TextureKind::kRegular, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k2d, | 
 |           TextureDataType::kF32, | 
 |           "textureSample", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",               // t | 
 |                                "sampler",               // s | 
 |                                b->vec2<f32>(1.f, 2.f),  // coords | 
 |                                b->vec2<i32>(3, 4));     // offset | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kSample2dArrayF32, | 
 |           "textureSample(t           : texture_2d_array<f32>,\n" | 
 |           "              s           : sampler,\n" | 
 |           "              coords      : vec2<f32>,\n" | 
 |           "              array_index : i32) -> vec4<f32>", | 
 |           TextureKind::kRegular, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k2dArray, | 
 |           TextureDataType::kF32, | 
 |           "textureSample", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",               // t | 
 |                                "sampler",               // s | 
 |                                b->vec2<f32>(1.f, 2.f),  // coords | 
 |                                3);                      // array_index | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kSample2dArrayOffsetF32, | 
 |           "textureSample(t           : texture_2d_array<f32>,\n" | 
 |           "              s           : sampler,\n" | 
 |           "              coords      : vec2<f32>,\n" | 
 |           "              array_index : i32\n" | 
 |           "              offset      : vec2<i32>) -> vec4<f32>", | 
 |           TextureKind::kRegular, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k2dArray, | 
 |           TextureDataType::kF32, | 
 |           "textureSample", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",               // t | 
 |                                "sampler",               // s | 
 |                                b->vec2<f32>(1.f, 2.f),  // coords | 
 |                                3,                       // array_index | 
 |                                b->vec2<i32>(4, 5));     // offset | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kSample3dF32, | 
 |           "textureSample(t      : texture_3d<f32>,\n" | 
 |           "              s      : sampler,\n" | 
 |           "              coords : vec3<f32>) -> vec4<f32>", | 
 |           TextureKind::kRegular, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k3d, | 
 |           TextureDataType::kF32, | 
 |           "textureSample", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",                     // t | 
 |                                "sampler",                     // s | 
 |                                b->vec3<f32>(1.f, 2.f, 3.f));  // coords | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kSample3dOffsetF32, | 
 |           "textureSample(t      : texture_3d<f32>,\n" | 
 |           "              s      : sampler,\n" | 
 |           "              coords : vec3<f32>\n" | 
 |           "              offset : vec3<i32>) -> vec4<f32>", | 
 |           TextureKind::kRegular, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k3d, | 
 |           TextureDataType::kF32, | 
 |           "textureSample", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",                    // t | 
 |                                "sampler",                    // s | 
 |                                b->vec3<f32>(1.f, 2.f, 3.f),  // coords | 
 |                                b->vec3<i32>(4, 5, 6));       // offset | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kSampleCubeF32, | 
 |           "textureSample(t      : texture_cube<f32>,\n" | 
 |           "              s      : sampler,\n" | 
 |           "              coords : vec3<f32>) -> vec4<f32>", | 
 |           TextureKind::kRegular, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::kCube, | 
 |           TextureDataType::kF32, | 
 |           "textureSample", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",                     // t | 
 |                                "sampler",                     // s | 
 |                                b->vec3<f32>(1.f, 2.f, 3.f));  // coords | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kSampleCubeArrayF32, | 
 |           "textureSample(t           : texture_cube_array<f32>,\n" | 
 |           "              s           : sampler,\n" | 
 |           "              coords      : vec3<f32>,\n" | 
 |           "              array_index : i32) -> vec4<f32>", | 
 |           TextureKind::kRegular, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::kCubeArray, | 
 |           TextureDataType::kF32, | 
 |           "textureSample", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",                    // t | 
 |                                "sampler",                    // s | 
 |                                b->vec3<f32>(1.f, 2.f, 3.f),  // coords | 
 |                                4);                           // array_index | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kSampleDepth2dF32, | 
 |           "textureSample(t      : texture_depth_2d,\n" | 
 |           "              s      : sampler,\n" | 
 |           "              coords : vec2<f32>) -> f32", | 
 |           TextureKind::kDepth, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k2d, | 
 |           TextureDataType::kF32, | 
 |           "textureSample", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",                // t | 
 |                                "sampler",                // s | 
 |                                b->vec2<f32>(1.f, 2.f));  // coords | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kSampleDepth2dOffsetF32, | 
 |           "textureSample(t      : texture_depth_2d,\n" | 
 |           "              s      : sampler,\n" | 
 |           "              coords : vec2<f32>\n" | 
 |           "              offset : vec2<i32>) -> f32", | 
 |           TextureKind::kDepth, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k2d, | 
 |           TextureDataType::kF32, | 
 |           "textureSample", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",               // t | 
 |                                "sampler",               // s | 
 |                                b->vec2<f32>(1.f, 2.f),  // coords | 
 |                                b->vec2<i32>(3, 4));     // offset | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kSampleDepth2dArrayF32, | 
 |           "textureSample(t           : texture_depth_2d_array,\n" | 
 |           "              s           : sampler,\n" | 
 |           "              coords      : vec2<f32>,\n" | 
 |           "              array_index : i32) -> f32", | 
 |           TextureKind::kDepth, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k2dArray, | 
 |           TextureDataType::kF32, | 
 |           "textureSample", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",               // t | 
 |                                "sampler",               // s | 
 |                                b->vec2<f32>(1.f, 2.f),  // coords | 
 |                                3);                      // array_index | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kSampleDepth2dArrayOffsetF32, | 
 |           "textureSample(t           : texture_depth_2d_array,\n" | 
 |           "              s           : sampler,\n" | 
 |           "              coords      : vec2<f32>,\n" | 
 |           "              array_index : i32\n" | 
 |           "              offset      : vec2<i32>) -> f32", | 
 |           TextureKind::kDepth, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k2dArray, | 
 |           TextureDataType::kF32, | 
 |           "textureSample", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",               // t | 
 |                                "sampler",               // s | 
 |                                b->vec2<f32>(1.f, 2.f),  // coords | 
 |                                3,                       // array_index | 
 |                                b->vec2<i32>(4, 5));     // offset | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kSampleDepthCubeF32, | 
 |           "textureSample(t      : texture_depth_cube,\n" | 
 |           "              s      : sampler,\n" | 
 |           "              coords : vec3<f32>) -> f32", | 
 |           TextureKind::kDepth, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::kCube, | 
 |           TextureDataType::kF32, | 
 |           "textureSample", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",                     // t | 
 |                                "sampler",                     // s | 
 |                                b->vec3<f32>(1.f, 2.f, 3.f));  // coords | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kSampleDepthCubeArrayF32, | 
 |           "textureSample(t           : texture_depth_cube_array,\n" | 
 |           "              s           : sampler,\n" | 
 |           "              coords      : vec3<f32>,\n" | 
 |           "              array_index : i32) -> f32", | 
 |           TextureKind::kDepth, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::kCubeArray, | 
 |           TextureDataType::kF32, | 
 |           "textureSample", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",                    // t | 
 |                                "sampler",                    // s | 
 |                                b->vec3<f32>(1.f, 2.f, 3.f),  // coords | 
 |                                4);                           // array_index | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kSampleBias2dF32, | 
 |           "textureSampleBias(t      : texture_2d<f32>,\n" | 
 |           "                  s      : sampler,\n" | 
 |           "                  coords : vec2<f32>,\n" | 
 |           "                  bias   : f32) -> vec4<f32>", | 
 |           TextureKind::kRegular, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k2d, | 
 |           TextureDataType::kF32, | 
 |           "textureSampleBias", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",               // t | 
 |                                "sampler",               // s | 
 |                                b->vec2<f32>(1.f, 2.f),  // coords | 
 |                                3.f);                    // bias | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kSampleBias2dOffsetF32, | 
 |           "textureSampleBias(t      : texture_2d<f32>,\n" | 
 |           "                  s      : sampler,\n" | 
 |           "                  coords : vec2<f32>,\n" | 
 |           "                  bias   : f32,\n" | 
 |           "                  offset : vec2<i32>) -> vec4<f32>", | 
 |           TextureKind::kRegular, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k2d, | 
 |           TextureDataType::kF32, | 
 |           "textureSampleBias", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",               // t | 
 |                                "sampler",               // s | 
 |                                b->vec2<f32>(1.f, 2.f),  // coords | 
 |                                3.f,                     // bias | 
 |                                b->vec2<i32>(4, 5));     // offset | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kSampleBias2dArrayF32, | 
 |           "textureSampleBias(t           : texture_2d_array<f32>,\n" | 
 |           "                  s           : sampler,\n" | 
 |           "                  coords      : vec2<f32>,\n" | 
 |           "                  array_index : i32,\n" | 
 |           "                  bias        : f32) -> vec4<f32>", | 
 |           TextureKind::kRegular, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k2dArray, | 
 |           TextureDataType::kF32, | 
 |           "textureSampleBias", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",               // t | 
 |                                "sampler",               // s | 
 |                                b->vec2<f32>(1.f, 2.f),  // coords | 
 |                                4,                       // array_index | 
 |                                3.f);                    // bias | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kSampleBias2dArrayOffsetF32, | 
 |           "textureSampleBias(t           : texture_2d_array<f32>,\n" | 
 |           "                  s           : sampler,\n" | 
 |           "                  coords      : vec2<f32>,\n" | 
 |           "                  array_index : i32,\n" | 
 |           "                  bias        : f32,\n" | 
 |           "                  offset      : vec2<i32>) -> vec4<f32>", | 
 |           TextureKind::kRegular, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k2dArray, | 
 |           TextureDataType::kF32, | 
 |           "textureSampleBias", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",               // t | 
 |                                "sampler",               // s | 
 |                                b->vec2<f32>(1.f, 2.f),  // coords | 
 |                                3,                       // array_index | 
 |                                4.f,                     // bias | 
 |                                b->vec2<i32>(5, 6));     // offset | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kSampleBias3dF32, | 
 |           "textureSampleBias(t      : texture_3d<f32>,\n" | 
 |           "                  s      : sampler,\n" | 
 |           "                  coords : vec3<f32>,\n" | 
 |           "                  bias   : f32) -> vec4<f32>", | 
 |           TextureKind::kRegular, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k3d, | 
 |           TextureDataType::kF32, | 
 |           "textureSampleBias", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",                    // t | 
 |                                "sampler",                    // s | 
 |                                b->vec3<f32>(1.f, 2.f, 3.f),  // coords | 
 |                                4.f);                         // bias | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kSampleBias3dOffsetF32, | 
 |           "textureSampleBias(t      : texture_3d<f32>,\n" | 
 |           "                  s      : sampler,\n" | 
 |           "                  coords : vec3<f32>,\n" | 
 |           "                  bias   : f32,\n" | 
 |           "                  offset : vec3<i32>) -> vec4<f32>", | 
 |           TextureKind::kRegular, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k3d, | 
 |           TextureDataType::kF32, | 
 |           "textureSampleBias", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",                    // t | 
 |                                "sampler",                    // s | 
 |                                b->vec3<f32>(1.f, 2.f, 3.f),  // coords | 
 |                                4.f,                          // bias | 
 |                                b->vec3<i32>(5, 6, 7));       // offset | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kSampleBiasCubeF32, | 
 |           "textureSampleBias(t      : texture_cube<f32>,\n" | 
 |           "                  s      : sampler,\n" | 
 |           "                  coords : vec3<f32>,\n" | 
 |           "                  bias   : f32) -> vec4<f32>", | 
 |           TextureKind::kRegular, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::kCube, | 
 |           TextureDataType::kF32, | 
 |           "textureSampleBias", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",                    // t | 
 |                                "sampler",                    // s | 
 |                                b->vec3<f32>(1.f, 2.f, 3.f),  // coords | 
 |                                4.f);                         // bias | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kSampleBiasCubeArrayF32, | 
 |           "textureSampleBias(t           : texture_cube_array<f32>,\n" | 
 |           "                  s           : sampler,\n" | 
 |           "                  coords      : vec3<f32>,\n" | 
 |           "                  array_index : i32,\n" | 
 |           "                  bias        : f32) -> vec4<f32>", | 
 |           TextureKind::kRegular, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::kCubeArray, | 
 |           TextureDataType::kF32, | 
 |           "textureSampleBias", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",                    // t | 
 |                                "sampler",                    // s | 
 |                                b->vec3<f32>(1.f, 2.f, 3.f),  // coords | 
 |                                3,                            // array_index | 
 |                                4.f);                         // bias | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kSampleLevel2dF32, | 
 |           "textureSampleLevel(t      : texture_2d<f32>,\n" | 
 |           "                   s      : sampler,\n" | 
 |           "                   coords : vec2<f32>,\n" | 
 |           "                   level  : f32) -> vec4<f32>", | 
 |           TextureKind::kRegular, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k2d, | 
 |           TextureDataType::kF32, | 
 |           "textureSampleLevel", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",               // t | 
 |                                "sampler",               // s | 
 |                                b->vec2<f32>(1.f, 2.f),  // coords | 
 |                                3.f);                    // level | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kSampleLevel2dOffsetF32, | 
 |           "textureSampleLevel(t      : texture_2d<f32>,\n" | 
 |           "                   s      : sampler,\n" | 
 |           "                   coords : vec2<f32>,\n" | 
 |           "                   level  : f32,\n" | 
 |           "                   offset : vec2<i32>) -> vec4<f32>", | 
 |           TextureKind::kRegular, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k2d, | 
 |           TextureDataType::kF32, | 
 |           "textureSampleLevel", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",               // t | 
 |                                "sampler",               // s | 
 |                                b->vec2<f32>(1.f, 2.f),  // coords | 
 |                                3.f,                     // level | 
 |                                b->vec2<i32>(4, 5));     // offset | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kSampleLevel2dArrayF32, | 
 |           "textureSampleLevel(t           : texture_2d_array<f32>,\n" | 
 |           "                   s           : sampler,\n" | 
 |           "                   coords      : vec2<f32>,\n" | 
 |           "                   array_index : i32,\n" | 
 |           "                   level       : f32) -> vec4<f32>", | 
 |           TextureKind::kRegular, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k2dArray, | 
 |           TextureDataType::kF32, | 
 |           "textureSampleLevel", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",               // t | 
 |                                "sampler",               // s | 
 |                                b->vec2<f32>(1.f, 2.f),  // coords | 
 |                                3,                       // array_index | 
 |                                4.f);                    // level | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kSampleLevel2dArrayOffsetF32, | 
 |           "textureSampleLevel(t           : texture_2d_array<f32>,\n" | 
 |           "                   s           : sampler,\n" | 
 |           "                   coords      : vec2<f32>,\n" | 
 |           "                   array_index : i32,\n" | 
 |           "                   level       : f32,\n" | 
 |           "                   offset      : vec2<i32>) -> vec4<f32>", | 
 |           TextureKind::kRegular, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k2dArray, | 
 |           TextureDataType::kF32, | 
 |           "textureSampleLevel", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",               // t | 
 |                                "sampler",               // s | 
 |                                b->vec2<f32>(1.f, 2.f),  // coords | 
 |                                3,                       // array_index | 
 |                                4.f,                     // level | 
 |                                b->vec2<i32>(5, 6));     // offset | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kSampleLevel3dF32, | 
 |           "textureSampleLevel(t      : texture_3d<f32>,\n" | 
 |           "                   s      : sampler,\n" | 
 |           "                   coords : vec3<f32>,\n" | 
 |           "                   level  : f32) -> vec4<f32>", | 
 |           TextureKind::kRegular, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k3d, | 
 |           TextureDataType::kF32, | 
 |           "textureSampleLevel", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",                    // t | 
 |                                "sampler",                    // s | 
 |                                b->vec3<f32>(1.f, 2.f, 3.f),  // coords | 
 |                                4.f);                         // level | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kSampleLevel3dOffsetF32, | 
 |           "textureSampleLevel(t      : texture_3d<f32>,\n" | 
 |           "                   s      : sampler,\n" | 
 |           "                   coords : vec3<f32>,\n" | 
 |           "                   level  : f32,\n" | 
 |           "                   offset : vec3<i32>) -> vec4<f32>", | 
 |           TextureKind::kRegular, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k3d, | 
 |           TextureDataType::kF32, | 
 |           "textureSampleLevel", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",                    // t | 
 |                                "sampler",                    // s | 
 |                                b->vec3<f32>(1.f, 2.f, 3.f),  // coords | 
 |                                4.f,                          // level | 
 |                                b->vec3<i32>(5, 6, 7));       // offset | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kSampleLevelCubeF32, | 
 |           "textureSampleLevel(t      : texture_cube<f32>,\n" | 
 |           "                   s      : sampler,\n" | 
 |           "                   coords : vec3<f32>,\n" | 
 |           "                   level  : f32) -> vec4<f32>", | 
 |           TextureKind::kRegular, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::kCube, | 
 |           TextureDataType::kF32, | 
 |           "textureSampleLevel", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",                    // t | 
 |                                "sampler",                    // s | 
 |                                b->vec3<f32>(1.f, 2.f, 3.f),  // coords | 
 |                                4.f);                         // level | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kSampleLevelCubeArrayF32, | 
 |           "textureSampleLevel(t           : texture_cube_array<f32>,\n" | 
 |           "                   s           : sampler,\n" | 
 |           "                   coords      : vec3<f32>,\n" | 
 |           "                   array_index : i32,\n" | 
 |           "                   level       : f32) -> vec4<f32>", | 
 |           TextureKind::kRegular, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::kCubeArray, | 
 |           TextureDataType::kF32, | 
 |           "textureSampleLevel", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",                    // t | 
 |                                "sampler",                    // s | 
 |                                b->vec3<f32>(1.f, 2.f, 3.f),  // coords | 
 |                                4,                            // array_index | 
 |                                5.f);                         // level | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kSampleLevelDepth2dF32, | 
 |           "textureSampleLevel(t      : texture_depth_2d,\n" | 
 |           "                   s      : sampler,\n" | 
 |           "                   coords : vec2<f32>,\n" | 
 |           "                   level  : i32) -> f32", | 
 |           TextureKind::kDepth, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k2d, | 
 |           TextureDataType::kF32, | 
 |           "textureSampleLevel", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",               // t | 
 |                                "sampler",               // s | 
 |                                b->vec2<f32>(1.f, 2.f),  // coords | 
 |                                3);                      // level | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kSampleLevelDepth2dOffsetF32, | 
 |           "textureSampleLevel(t      : texture_depth_2d,\n" | 
 |           "                   s      : sampler,\n" | 
 |           "                   coords : vec2<f32>,\n" | 
 |           "                   level  : i32,\n" | 
 |           "                   offset : vec2<i32>) -> f32", | 
 |           TextureKind::kDepth, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k2d, | 
 |           TextureDataType::kF32, | 
 |           "textureSampleLevel", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",               // t | 
 |                                "sampler",               // s | 
 |                                b->vec2<f32>(1.f, 2.f),  // coords | 
 |                                3,                       // level | 
 |                                b->vec2<i32>(4, 5));     // offset | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kSampleLevelDepth2dArrayF32, | 
 |           "textureSampleLevel(t           : texture_depth_2d_array,\n" | 
 |           "                   s           : sampler,\n" | 
 |           "                   coords      : vec2<f32>,\n" | 
 |           "                   array_index : i32,\n" | 
 |           "                   level       : i32) -> f32", | 
 |           TextureKind::kDepth, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k2dArray, | 
 |           TextureDataType::kF32, | 
 |           "textureSampleLevel", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",               // t | 
 |                                "sampler",               // s | 
 |                                b->vec2<f32>(1.f, 2.f),  // coords | 
 |                                3,                       // array_index | 
 |                                4);                      // level | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kSampleLevelDepth2dArrayOffsetF32, | 
 |           "textureSampleLevel(t           : texture_depth_2d_array,\n" | 
 |           "                   s           : sampler,\n" | 
 |           "                   coords      : vec2<f32>,\n" | 
 |           "                   array_index : i32,\n" | 
 |           "                   level       : i32,\n" | 
 |           "                   offset      : vec2<i32>) -> f32", | 
 |           TextureKind::kDepth, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k2dArray, | 
 |           TextureDataType::kF32, | 
 |           "textureSampleLevel", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",               // t | 
 |                                "sampler",               // s | 
 |                                b->vec2<f32>(1.f, 2.f),  // coords | 
 |                                3,                       // array_index | 
 |                                4,                       // level | 
 |                                b->vec2<i32>(5, 6));     // offset | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kSampleLevelDepthCubeF32, | 
 |           "textureSampleLevel(t      : texture_depth_cube,\n" | 
 |           "                   s      : sampler,\n" | 
 |           "                   coords : vec3<f32>,\n" | 
 |           "                   level  : i32) -> f32", | 
 |           TextureKind::kDepth, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::kCube, | 
 |           TextureDataType::kF32, | 
 |           "textureSampleLevel", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",                    // t | 
 |                                "sampler",                    // s | 
 |                                b->vec3<f32>(1.f, 2.f, 3.f),  // coords | 
 |                                4);                           // level | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kSampleLevelDepthCubeArrayF32, | 
 |           "textureSampleLevel(t           : texture_depth_cube_array,\n" | 
 |           "                   s           : sampler,\n" | 
 |           "                   coords      : vec3<f32>,\n" | 
 |           "                   array_index : i32,\n" | 
 |           "                   level       : i32) -> f32", | 
 |           TextureKind::kDepth, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::kCubeArray, | 
 |           TextureDataType::kF32, | 
 |           "textureSampleLevel", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",                    // t | 
 |                                "sampler",                    // s | 
 |                                b->vec3<f32>(1.f, 2.f, 3.f),  // coords | 
 |                                4,                            // array_index | 
 |                                5);                           // level | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kSampleGrad2dF32, | 
 |           "textureSampleGrad(t      : texture_2d<f32>,\n" | 
 |           "                  s      : sampler,\n" | 
 |           "                  coords : vec2<f32>\n" | 
 |           "                  ddx    : vec2<f32>,\n" | 
 |           "                  ddy    : vec2<f32>) -> vec4<f32>", | 
 |           TextureKind::kRegular, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k2d, | 
 |           TextureDataType::kF32, | 
 |           "textureSampleGrad", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",                  // t | 
 |                                "sampler",                  // s | 
 |                                b->vec2<f32>(1.0f, 2.0f),   // coords | 
 |                                b->vec2<f32>(3.0f, 4.0f),   // ddx | 
 |                                b->vec2<f32>(5.0f, 6.0f));  // ddy | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kSampleGrad2dOffsetF32, | 
 |           "textureSampleGrad(t      : texture_2d<f32>,\n" | 
 |           "                  s      : sampler,\n" | 
 |           "                  coords : vec2<f32>,\n" | 
 |           "                  ddx    : vec2<f32>,\n" | 
 |           "                  ddy    : vec2<f32>,\n" | 
 |           "                  offset : vec2<i32>) -> vec4<f32>", | 
 |           TextureKind::kRegular, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k2d, | 
 |           TextureDataType::kF32, | 
 |           "textureSampleGrad", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",               // t | 
 |                                "sampler",               // s | 
 |                                b->vec2<f32>(1.f, 2.f),  // coords | 
 |                                b->vec2<f32>(3.f, 4.f),  // ddx | 
 |                                b->vec2<f32>(5.f, 6.f),  // ddy | 
 |                                b->vec2<i32>(7, 8));     // offset | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kSampleGrad2dArrayF32, | 
 |           "textureSampleGrad(t           : texture_2d_array<f32>,\n" | 
 |           "                  s           : sampler,\n" | 
 |           "                  coords      : vec2<f32>,\n" | 
 |           "                  array_index : i32,\n" | 
 |           "                  ddx         : vec2<f32>,\n" | 
 |           "                  ddy         : vec2<f32>) -> vec4<f32>", | 
 |           TextureKind::kRegular, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k2dArray, | 
 |           TextureDataType::kF32, | 
 |           "textureSampleGrad", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",                // t | 
 |                                "sampler",                // s | 
 |                                b->vec2<f32>(1.f, 2.f),   // coords | 
 |                                3,                        // array_index | 
 |                                b->vec2<f32>(4.f, 5.f),   // ddx | 
 |                                b->vec2<f32>(6.f, 7.f));  // ddy | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kSampleGrad2dArrayOffsetF32, | 
 |           "textureSampleGrad(t           : texture_2d_array<f32>,\n" | 
 |           "                  s           : sampler,\n" | 
 |           "                  coords      : vec2<f32>,\n" | 
 |           "                  array_index : i32,\n" | 
 |           "                  ddx         : vec2<f32>,\n" | 
 |           "                  ddy         : vec2<f32>,\n" | 
 |           "                  offset      : vec2<i32>) -> vec4<f32>", | 
 |           TextureKind::kRegular, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k2dArray, | 
 |           TextureDataType::kF32, | 
 |           "textureSampleGrad", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",               // t | 
 |                                "sampler",               // s | 
 |                                b->vec2<f32>(1.f, 2.f),  // coords | 
 |                                3,                       // array_index | 
 |                                b->vec2<f32>(4.f, 5.f),  // ddx | 
 |                                b->vec2<f32>(6.f, 7.f),  // ddy | 
 |                                b->vec2<i32>(8, 9));     // offset | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kSampleGrad3dF32, | 
 |           "textureSampleGrad(t      : texture_3d<f32>,\n" | 
 |           "                  s      : sampler,\n" | 
 |           "                  coords : vec3<f32>,\n" | 
 |           "                  ddx    : vec3<f32>,\n" | 
 |           "                  ddy    : vec3<f32>) -> vec4<f32>", | 
 |           TextureKind::kRegular, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k3d, | 
 |           TextureDataType::kF32, | 
 |           "textureSampleGrad", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",                     // t | 
 |                                "sampler",                     // s | 
 |                                b->vec3<f32>(1.f, 2.f, 3.f),   // coords | 
 |                                b->vec3<f32>(4.f, 5.f, 6.f),   // ddx | 
 |                                b->vec3<f32>(7.f, 8.f, 9.f));  // ddy | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kSampleGrad3dOffsetF32, | 
 |           "textureSampleGrad(t      : texture_3d<f32>,\n" | 
 |           "                  s      : sampler,\n" | 
 |           "                  coords : vec3<f32>,\n" | 
 |           "                  ddx    : vec3<f32>,\n" | 
 |           "                  ddy    : vec3<f32>,\n" | 
 |           "                  offset : vec3<i32>) -> vec4<f32>", | 
 |           TextureKind::kRegular, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::k3d, | 
 |           TextureDataType::kF32, | 
 |           "textureSampleGrad", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",                    // t | 
 |                                "sampler",                    // s | 
 |                                b->vec3<f32>(1.f, 2.f, 3.f),  // coords | 
 |                                b->vec3<f32>(4.f, 5.f, 6.f),  // ddx | 
 |                                b->vec3<f32>(7.f, 8.f, 9.f),  // ddy | 
 |                                b->vec3<i32>(10, 11, 12));    // offset | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kSampleGradCubeF32, | 
 |           "textureSampleGrad(t      : texture_cube<f32>,\n" | 
 |           "                  s      : sampler,\n" | 
 |           "                  coords : vec3<f32>,\n" | 
 |           "                  ddx    : vec3<f32>,\n" | 
 |           "                  ddy    : vec3<f32>) -> vec4<f32>", | 
 |           TextureKind::kRegular, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::kCube, | 
 |           TextureDataType::kF32, | 
 |           "textureSampleGrad", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",                     // t | 
 |                                "sampler",                     // s | 
 |                                b->vec3<f32>(1.f, 2.f, 3.f),   // coords | 
 |                                b->vec3<f32>(4.f, 5.f, 6.f),   // ddx | 
 |                                b->vec3<f32>(7.f, 8.f, 9.f));  // ddy | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kSampleGradCubeArrayF32, | 
 |           "textureSampleGrad(t           : texture_cube_array<f32>,\n" | 
 |           "                  s           : sampler,\n" | 
 |           "                  coords      : vec3<f32>,\n" | 
 |           "                  array_index : i32,\n" | 
 |           "                  ddx         : vec3<f32>,\n" | 
 |           "                  ddy         : vec3<f32>) -> vec4<f32>", | 
 |           TextureKind::kRegular, | 
 |           type::SamplerKind::kSampler, | 
 |           type::TextureDimension::kCubeArray, | 
 |           TextureDataType::kF32, | 
 |           "textureSampleGrad", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",                      // t | 
 |                                "sampler",                      // s | 
 |                                b->vec3<f32>(1.f, 2.f, 3.f),    // coords | 
 |                                4,                              // array_index | 
 |                                b->vec3<f32>(5.f, 6.f, 7.f),    // ddx | 
 |                                b->vec3<f32>(8.f, 9.f, 10.f));  // ddy | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kSampleCompareDepth2dF32, | 
 |           "textureSampleCompare(t         : texture_depth_2d,\n" | 
 |           "                     s         : sampler_comparison,\n" | 
 |           "                     coords    : vec2<f32>,\n" | 
 |           "                     depth_ref : f32) -> f32", | 
 |           TextureKind::kDepth, | 
 |           type::SamplerKind::kComparisonSampler, | 
 |           type::TextureDimension::k2d, | 
 |           TextureDataType::kF32, | 
 |           "textureSampleCompare", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",               // t | 
 |                                "sampler",               // s | 
 |                                b->vec2<f32>(1.f, 2.f),  // coords | 
 |                                3.f);                    // depth_ref | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kSampleCompareDepth2dOffsetF32, | 
 |           "textureSampleCompare(t         : texture_depth_2d,\n" | 
 |           "                     s         : sampler_comparison,\n" | 
 |           "                     coords    : vec2<f32>,\n" | 
 |           "                     depth_ref : f32,\n" | 
 |           "                     offset    : vec2<i32>) -> f32", | 
 |           TextureKind::kDepth, | 
 |           type::SamplerKind::kComparisonSampler, | 
 |           type::TextureDimension::k2d, | 
 |           TextureDataType::kF32, | 
 |           "textureSampleCompare", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",               // t | 
 |                                "sampler",               // s | 
 |                                b->vec2<f32>(1.f, 2.f),  // coords | 
 |                                3.f,                     // depth_ref | 
 |                                b->vec2<i32>(4, 5));     // offset | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kSampleCompareDepth2dArrayF32, | 
 |           "textureSampleCompare(t           : texture_depth_2d_array,\n" | 
 |           "                     s           : sampler_comparison,\n" | 
 |           "                     coords      : vec2<f32>,\n" | 
 |           "                     array_index : i32,\n" | 
 |           "                     depth_ref   : f32) -> f32", | 
 |           TextureKind::kDepth, | 
 |           type::SamplerKind::kComparisonSampler, | 
 |           type::TextureDimension::k2dArray, | 
 |           TextureDataType::kF32, | 
 |           "textureSampleCompare", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",               // t | 
 |                                "sampler",               // s | 
 |                                b->vec2<f32>(1.f, 2.f),  // coords | 
 |                                4,                       // array_index | 
 |                                3.f);                    // depth_ref | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kSampleCompareDepth2dArrayOffsetF32, | 
 |           "textureSampleCompare(t           : texture_depth_2d_array,\n" | 
 |           "                     s           : sampler_comparison,\n" | 
 |           "                     coords      : vec2<f32>,\n" | 
 |           "                     array_index : i32,\n" | 
 |           "                     depth_ref   : f32,\n" | 
 |           "                     offset      : vec2<i32>) -> f32", | 
 |           TextureKind::kDepth, | 
 |           type::SamplerKind::kComparisonSampler, | 
 |           type::TextureDimension::k2dArray, | 
 |           TextureDataType::kF32, | 
 |           "textureSampleCompare", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",               // t | 
 |                                "sampler",               // s | 
 |                                b->vec2<f32>(1.f, 2.f),  // coords | 
 |                                4,                       // array_index | 
 |                                3.f,                     // depth_ref | 
 |                                b->vec2<i32>(5, 6));     // offset | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kSampleCompareDepthCubeF32, | 
 |           "textureSampleCompare(t         : texture_depth_cube,\n" | 
 |           "                     s         : sampler_comparison,\n" | 
 |           "                     coords    : vec3<f32>,\n" | 
 |           "                     depth_ref : f32) -> f32", | 
 |           TextureKind::kDepth, | 
 |           type::SamplerKind::kComparisonSampler, | 
 |           type::TextureDimension::kCube, | 
 |           TextureDataType::kF32, | 
 |           "textureSampleCompare", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",                    // t | 
 |                                "sampler",                    // s | 
 |                                b->vec3<f32>(1.f, 2.f, 3.f),  // coords | 
 |                                4.f);                         // depth_ref | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kSampleCompareDepthCubeArrayF32, | 
 |           "textureSampleCompare(t           : texture_depth_cube_array,\n" | 
 |           "                     s           : sampler_comparison,\n" | 
 |           "                     coords      : vec3<f32>,\n" | 
 |           "                     array_index : i32,\n" | 
 |           "                     depth_ref   : f32) -> f32", | 
 |           TextureKind::kDepth, | 
 |           type::SamplerKind::kComparisonSampler, | 
 |           type::TextureDimension::kCubeArray, | 
 |           TextureDataType::kF32, | 
 |           "textureSampleCompare", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",                    // t | 
 |                                "sampler",                    // s | 
 |                                b->vec3<f32>(1.f, 2.f, 3.f),  // coords | 
 |                                4,                            // array_index | 
 |                                5.f);                         // depth_ref | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kLoad1dLevelF32, | 
 |           "textureLoad(t      : texture_1d<f32>,\n" | 
 |           "            coords : i32,\n" | 
 |           "            level  : i32) -> vec4<f32>", | 
 |           TextureKind::kRegular, | 
 |           type::TextureDimension::k1d, | 
 |           TextureDataType::kF32, | 
 |           "textureLoad", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",  // t | 
 |                                1,          // coords | 
 |                                3);         // level | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kLoad1dLevelU32, | 
 |           "textureLoad(t      : texture_1d<u32>,\n" | 
 |           "            coords : i32,\n" | 
 |           "            level  : i32) -> vec4<u32>", | 
 |           TextureKind::kRegular, | 
 |           type::TextureDimension::k1d, | 
 |           TextureDataType::kU32, | 
 |           "textureLoad", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",  // t | 
 |                                1,          // coords | 
 |                                3);         // level | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kLoad1dLevelI32, | 
 |           "textureLoad(t      : texture_1d<i32>,\n" | 
 |           "            coords : i32,\n" | 
 |           "            level  : i32) -> vec4<i32>", | 
 |           TextureKind::kRegular, | 
 |           type::TextureDimension::k1d, | 
 |           TextureDataType::kI32, | 
 |           "textureLoad", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",  // t | 
 |                                1,          // coords | 
 |                                3);         // level | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kLoad2dLevelF32, | 
 |           "textureLoad(t      : texture_2d<f32>,\n" | 
 |           "            coords : vec2<i32>,\n" | 
 |           "            level  : i32) -> vec4<f32>", | 
 |           TextureKind::kRegular, | 
 |           type::TextureDimension::k2d, | 
 |           TextureDataType::kF32, | 
 |           "textureLoad", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",           // t | 
 |                                b->vec2<i32>(1, 2),  // coords | 
 |                                3);                  // level | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kLoad2dLevelU32, | 
 |           "textureLoad(t      : texture_2d<u32>,\n" | 
 |           "            coords : vec2<i32>,\n" | 
 |           "            level  : i32) -> vec4<u32>", | 
 |           TextureKind::kRegular, | 
 |           type::TextureDimension::k2d, | 
 |           TextureDataType::kU32, | 
 |           "textureLoad", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",           // t | 
 |                                b->vec2<i32>(1, 2),  // coords | 
 |                                3);                  // level | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kLoad2dLevelI32, | 
 |           "textureLoad(t      : texture_2d<i32>,\n" | 
 |           "            coords : vec2<i32>,\n" | 
 |           "            level  : i32) -> vec4<i32>", | 
 |           TextureKind::kRegular, | 
 |           type::TextureDimension::k2d, | 
 |           TextureDataType::kI32, | 
 |           "textureLoad", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",           // t | 
 |                                b->vec2<i32>(1, 2),  // coords | 
 |                                3);                  // level | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kLoad2dArrayLevelF32, | 
 |           "textureLoad(t           : texture_2d_array<f32>,\n" | 
 |           "            coords      : vec2<i32>,\n" | 
 |           "            array_index : i32,\n" | 
 |           "            level       : i32) -> vec4<f32>", | 
 |           TextureKind::kRegular, | 
 |           type::TextureDimension::k2dArray, | 
 |           TextureDataType::kF32, | 
 |           "textureLoad", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",           // t | 
 |                                b->vec2<i32>(1, 2),  // coords | 
 |                                3,                   // array_index | 
 |                                4);                  // level | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kLoad2dArrayLevelU32, | 
 |           "textureLoad(t           : texture_2d_array<u32>,\n" | 
 |           "            coords      : vec2<i32>,\n" | 
 |           "            array_index : i32,\n" | 
 |           "            level       : i32) -> vec4<u32>", | 
 |           TextureKind::kRegular, | 
 |           type::TextureDimension::k2dArray, | 
 |           TextureDataType::kU32, | 
 |           "textureLoad", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",           // t | 
 |                                b->vec2<i32>(1, 2),  // coords | 
 |                                3,                   // array_index | 
 |                                4);                  // level | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kLoad2dArrayLevelI32, | 
 |           "textureLoad(t           : texture_2d_array<i32>,\n" | 
 |           "            coords      : vec2<i32>,\n" | 
 |           "            array_index : i32,\n" | 
 |           "            level       : i32) -> vec4<i32>", | 
 |           TextureKind::kRegular, | 
 |           type::TextureDimension::k2dArray, | 
 |           TextureDataType::kI32, | 
 |           "textureLoad", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",           // t | 
 |                                b->vec2<i32>(1, 2),  // coords | 
 |                                3,                   // array_index | 
 |                                4);                  // level | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kLoad3dLevelF32, | 
 |           "textureLoad(t      : texture_3d<f32>,\n" | 
 |           "            coords : vec3<i32>,\n" | 
 |           "            level  : i32) -> vec4<f32>", | 
 |           TextureKind::kRegular, | 
 |           type::TextureDimension::k3d, | 
 |           TextureDataType::kF32, | 
 |           "textureLoad", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",              // t | 
 |                                b->vec3<i32>(1, 2, 3),  // coords | 
 |                                4);                     // level | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kLoad3dLevelU32, | 
 |           "textureLoad(t      : texture_3d<u32>,\n" | 
 |           "            coords : vec3<i32>,\n" | 
 |           "            level  : i32) -> vec4<u32>", | 
 |           TextureKind::kRegular, | 
 |           type::TextureDimension::k3d, | 
 |           TextureDataType::kU32, | 
 |           "textureLoad", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",              // t | 
 |                                b->vec3<i32>(1, 2, 3),  // coords | 
 |                                4);                     // level | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kLoad3dLevelI32, | 
 |           "textureLoad(t      : texture_3d<i32>,\n" | 
 |           "            coords : vec3<i32>,\n" | 
 |           "            level  : i32) -> vec4<i32>", | 
 |           TextureKind::kRegular, | 
 |           type::TextureDimension::k3d, | 
 |           TextureDataType::kI32, | 
 |           "textureLoad", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",              // t | 
 |                                b->vec3<i32>(1, 2, 3),  // coords | 
 |                                4);                     // level | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kLoadMultisampled2dF32, | 
 |           "textureLoad(t            : texture_multisampled_2d<f32>,\n" | 
 |           "            coords       : vec2<i32>,\n" | 
 |           "            sample_index : i32) -> vec4<f32>", | 
 |           TextureKind::kMultisampled, | 
 |           type::TextureDimension::k2d, | 
 |           TextureDataType::kF32, | 
 |           "textureLoad", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",           // t | 
 |                                b->vec2<i32>(1, 2),  // coords | 
 |                                3);                  // sample_index | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kLoadMultisampled2dU32, | 
 |           "textureLoad(t            : texture_multisampled_2d<u32>,\n" | 
 |           "            coords       : vec2<i32>,\n" | 
 |           "            sample_index : i32) -> vec4<u32>", | 
 |           TextureKind::kMultisampled, | 
 |           type::TextureDimension::k2d, | 
 |           TextureDataType::kU32, | 
 |           "textureLoad", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",           // t | 
 |                                b->vec2<i32>(1, 2),  // coords | 
 |                                3);                  // sample_index | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kLoadMultisampled2dI32, | 
 |           "textureLoad(t            : texture_multisampled_2d<i32>,\n" | 
 |           "            coords       : vec2<i32>,\n" | 
 |           "            sample_index : i32) -> vec4<i32>", | 
 |           TextureKind::kMultisampled, | 
 |           type::TextureDimension::k2d, | 
 |           TextureDataType::kI32, | 
 |           "textureLoad", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",           // t | 
 |                                b->vec2<i32>(1, 2),  // coords | 
 |                                3);                  // sample_index | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kLoadMultisampled2dArrayF32, | 
 |           "textureLoad(t            : texture_multisampled_2d_array<f32>,\n" | 
 |           "            coords       : vec2<i32>,\n" | 
 |           "            array_index  : i32,\n" | 
 |           "            sample_index : i32) -> vec4<f32>", | 
 |           TextureKind::kMultisampled, | 
 |           type::TextureDimension::k2dArray, | 
 |           TextureDataType::kF32, | 
 |           "textureLoad", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",           // t | 
 |                                b->vec2<i32>(1, 2),  // coords | 
 |                                3,                   // array_index | 
 |                                4);                  // sample_index | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kLoadMultisampled2dArrayU32, | 
 |           "textureLoad(t            : texture_multisampled_2d_array<u32>,\n" | 
 |           "            coords       : vec2<i32>,\n" | 
 |           "            array_index  : i32,\n" | 
 |           "            sample_index : i32) -> vec4<u32>", | 
 |           TextureKind::kMultisampled, | 
 |           type::TextureDimension::k2dArray, | 
 |           TextureDataType::kU32, | 
 |           "textureLoad", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",           // t | 
 |                                b->vec2<i32>(1, 2),  // coords | 
 |                                3,                   // array_index | 
 |                                4);                  // sample_index | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kLoadMultisampled2dArrayI32, | 
 |           "textureLoad(t            : texture_multisampled_2d_array<i32>,\n" | 
 |           "            coords       : vec2<i32>,\n" | 
 |           "            array_index  : i32,\n" | 
 |           "            sample_index : i32) -> vec4<i32>", | 
 |           TextureKind::kMultisampled, | 
 |           type::TextureDimension::k2dArray, | 
 |           TextureDataType::kI32, | 
 |           "textureLoad", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",           // t | 
 |                                b->vec2<i32>(1, 2),  // coords | 
 |                                3,                   // array_index | 
 |                                4);                  // sample_index | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kLoadDepth2dLevelF32, | 
 |           "textureLoad(t      : texture_depth_2d,\n" | 
 |           "            coords : vec2<i32>,\n" | 
 |           "            level  : i32) -> f32", | 
 |           TextureKind::kDepth, | 
 |           type::TextureDimension::k2d, | 
 |           TextureDataType::kF32, | 
 |           "textureLoad", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",           // t | 
 |                                b->vec2<i32>(1, 2),  // coords | 
 |                                3);                  // level | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kLoadDepth2dArrayLevelF32, | 
 |           "textureLoad(t           : texture_depth_2d_array,\n" | 
 |           "            coords      : vec2<i32>,\n" | 
 |           "            array_index : i32,\n" | 
 |           "            level       : i32) -> f32", | 
 |           TextureKind::kDepth, | 
 |           type::TextureDimension::k2dArray, | 
 |           TextureDataType::kF32, | 
 |           "textureLoad", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",           // t | 
 |                                b->vec2<i32>(1, 2),  // coords | 
 |                                3,                   // array_index | 
 |                                4);                  // level | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kLoadStorageRO1dRgba32float, | 
 |           "textureLoad(t      : texture_storage_1d<rgba32float>,\n" | 
 |           "            coords : i32) -> vec4<f32>", | 
 |           ast::AccessControl::kReadOnly, | 
 |           type::ImageFormat::kRgba32Float, | 
 |           type::TextureDimension::k1d, | 
 |           TextureDataType::kF32, | 
 |           "textureLoad", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",  // t | 
 |                                1);         // coords | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kLoadStorageRO2dRgba8unorm, | 
 |           "textureLoad(t           : texture_storage_2d<rgba8unorm>,\n" | 
 |           "            coords      : vec2<i32>) -> vec4<f32>", | 
 |           ast::AccessControl::kReadOnly, | 
 |           type::ImageFormat::kRgba8Unorm, | 
 |           type::TextureDimension::k2d, | 
 |           TextureDataType::kF32, | 
 |           "textureLoad", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",            // t | 
 |                                b->vec2<i32>(1, 2));  // array_index | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kLoadStorageRO2dRgba8snorm, | 
 |           "textureLoad(t           : texture_storage_2d<rgba8snorm>,\n" | 
 |           "            coords      : vec2<i32>) -> vec4<f32>", | 
 |           ast::AccessControl::kReadOnly, | 
 |           type::ImageFormat::kRgba8Snorm, | 
 |           type::TextureDimension::k2d, | 
 |           TextureDataType::kF32, | 
 |           "textureLoad", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",            // t | 
 |                                b->vec2<i32>(1, 2));  // array_index | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kLoadStorageRO2dRgba8uint, | 
 |           "textureLoad(t           : texture_storage_2d<rgba8uint>,\n" | 
 |           "            coords      : vec2<i32>) -> vec4<u32>", | 
 |           ast::AccessControl::kReadOnly, | 
 |           type::ImageFormat::kRgba8Uint, | 
 |           type::TextureDimension::k2d, | 
 |           TextureDataType::kU32, | 
 |           "textureLoad", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",            // t | 
 |                                b->vec2<i32>(1, 2));  // array_index | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kLoadStorageRO2dRgba8sint, | 
 |           "textureLoad(t           : texture_storage_2d<rgba8sint>,\n" | 
 |           "            coords      : vec2<i32>) -> vec4<i32>", | 
 |           ast::AccessControl::kReadOnly, | 
 |           type::ImageFormat::kRgba8Sint, | 
 |           type::TextureDimension::k2d, | 
 |           TextureDataType::kI32, | 
 |           "textureLoad", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",            // t | 
 |                                b->vec2<i32>(1, 2));  // array_index | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kLoadStorageRO2dRgba16uint, | 
 |           "textureLoad(t           : texture_storage_2d<rgba16uint>,\n" | 
 |           "            coords      : vec2<i32>) -> vec4<u32>", | 
 |           ast::AccessControl::kReadOnly, | 
 |           type::ImageFormat::kRgba16Uint, | 
 |           type::TextureDimension::k2d, | 
 |           TextureDataType::kU32, | 
 |           "textureLoad", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",            // t | 
 |                                b->vec2<i32>(1, 2));  // array_index | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kLoadStorageRO2dRgba16sint, | 
 |           "textureLoad(t           : texture_storage_2d<rgba16sint>,\n" | 
 |           "            coords      : vec2<i32>) -> vec4<i32>", | 
 |           ast::AccessControl::kReadOnly, | 
 |           type::ImageFormat::kRgba16Sint, | 
 |           type::TextureDimension::k2d, | 
 |           TextureDataType::kI32, | 
 |           "textureLoad", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",            // t | 
 |                                b->vec2<i32>(1, 2));  // array_index | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kLoadStorageRO2dRgba16float, | 
 |           "textureLoad(t           : texture_storage_2d<rgba16float>,\n" | 
 |           "            coords      : vec2<i32>) -> vec4<f32>", | 
 |           ast::AccessControl::kReadOnly, | 
 |           type::ImageFormat::kRgba16Float, | 
 |           type::TextureDimension::k2d, | 
 |           TextureDataType::kF32, | 
 |           "textureLoad", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",            // t | 
 |                                b->vec2<i32>(1, 2));  // array_index | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kLoadStorageRO2dR32uint, | 
 |           "textureLoad(t           : texture_storage_2d<r32uint>,\n" | 
 |           "            coords      : vec2<i32>) -> vec4<u32>", | 
 |           ast::AccessControl::kReadOnly, | 
 |           type::ImageFormat::kR32Uint, | 
 |           type::TextureDimension::k2d, | 
 |           TextureDataType::kU32, | 
 |           "textureLoad", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",            // t | 
 |                                b->vec2<i32>(1, 2));  // array_index | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kLoadStorageRO2dR32sint, | 
 |           "textureLoad(t           : texture_storage_2d<r32sint>,\n" | 
 |           "            coords      : vec2<i32>) -> vec4<i32>", | 
 |           ast::AccessControl::kReadOnly, | 
 |           type::ImageFormat::kR32Sint, | 
 |           type::TextureDimension::k2d, | 
 |           TextureDataType::kI32, | 
 |           "textureLoad", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",            // t | 
 |                                b->vec2<i32>(1, 2));  // array_index | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kLoadStorageRO2dR32float, | 
 |           "textureLoad(t           : texture_storage_2d<r32float>,\n" | 
 |           "            coords      : vec2<i32>) -> vec4<f32>", | 
 |           ast::AccessControl::kReadOnly, | 
 |           type::ImageFormat::kR32Float, | 
 |           type::TextureDimension::k2d, | 
 |           TextureDataType::kF32, | 
 |           "textureLoad", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",            // t | 
 |                                b->vec2<i32>(1, 2));  // array_index | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kLoadStorageRO2dRg32uint, | 
 |           "textureLoad(t           : texture_storage_2d<rg32uint>,\n" | 
 |           "            coords      : vec2<i32>) -> vec4<u32>", | 
 |           ast::AccessControl::kReadOnly, | 
 |           type::ImageFormat::kRg32Uint, | 
 |           type::TextureDimension::k2d, | 
 |           TextureDataType::kU32, | 
 |           "textureLoad", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",            // t | 
 |                                b->vec2<i32>(1, 2));  // array_index | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kLoadStorageRO2dRg32sint, | 
 |           "textureLoad(t           : texture_storage_2d<rg32sint>,\n" | 
 |           "            coords      : vec2<i32>) -> vec4<i32>", | 
 |           ast::AccessControl::kReadOnly, | 
 |           type::ImageFormat::kRg32Sint, | 
 |           type::TextureDimension::k2d, | 
 |           TextureDataType::kI32, | 
 |           "textureLoad", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",            // t | 
 |                                b->vec2<i32>(1, 2));  // array_index | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kLoadStorageRO2dRg32float, | 
 |           "textureLoad(t           : texture_storage_2d<rg32float>,\n" | 
 |           "            coords      : vec2<i32>) -> vec4<f32>", | 
 |           ast::AccessControl::kReadOnly, | 
 |           type::ImageFormat::kRg32Float, | 
 |           type::TextureDimension::k2d, | 
 |           TextureDataType::kF32, | 
 |           "textureLoad", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",            // t | 
 |                                b->vec2<i32>(1, 2));  // array_index | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kLoadStorageRO2dRgba32uint, | 
 |           "textureLoad(t           : texture_storage_2d<rgba32uint>,\n" | 
 |           "            coords      : vec2<i32>) -> vec4<u32>", | 
 |           ast::AccessControl::kReadOnly, | 
 |           type::ImageFormat::kRgba32Uint, | 
 |           type::TextureDimension::k2d, | 
 |           TextureDataType::kU32, | 
 |           "textureLoad", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",            // t | 
 |                                b->vec2<i32>(1, 2));  // array_index | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kLoadStorageRO2dRgba32sint, | 
 |           "textureLoad(t           : texture_storage_2d<rgba32sint>,\n" | 
 |           "            coords      : vec2<i32>) -> vec4<i32>", | 
 |           ast::AccessControl::kReadOnly, | 
 |           type::ImageFormat::kRgba32Sint, | 
 |           type::TextureDimension::k2d, | 
 |           TextureDataType::kI32, | 
 |           "textureLoad", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",            // t | 
 |                                b->vec2<i32>(1, 2));  // array_index | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kLoadStorageRO2dRgba32float, | 
 |           "textureLoad(t           : texture_storage_2d<rgba32float>,\n" | 
 |           "            coords      : vec2<i32>) -> vec4<f32>", | 
 |           ast::AccessControl::kReadOnly, | 
 |           type::ImageFormat::kRgba32Float, | 
 |           type::TextureDimension::k2d, | 
 |           TextureDataType::kF32, | 
 |           "textureLoad", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",            // t | 
 |                                b->vec2<i32>(1, 2));  // array_index | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kLoadStorageRO2dArrayRgba32float, | 
 |           "textureLoad(t           : " | 
 |           "texture_storage_2d_array<rgba32float>,\n" | 
 |           "            coords      : vec2<i32>,\n" | 
 |           "            array_index : i32) -> vec4<f32>", | 
 |           ast::AccessControl::kReadOnly, | 
 |           type::ImageFormat::kRgba32Float, | 
 |           type::TextureDimension::k2dArray, | 
 |           TextureDataType::kF32, | 
 |           "textureLoad", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",           // t | 
 |                                b->vec2<i32>(1, 2),  // coords | 
 |                                3);                  // array_index | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kLoadStorageRO3dRgba32float, | 
 |           "textureLoad(t      : texture_storage_3d<rgba32float>,\n" | 
 |           "            coords : vec3<i32>) -> vec4<f32>", | 
 |           ast::AccessControl::kReadOnly, | 
 |           type::ImageFormat::kRgba32Float, | 
 |           type::TextureDimension::k3d, | 
 |           TextureDataType::kF32, | 
 |           "textureLoad", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",               // t | 
 |                                b->vec3<i32>(1, 2, 3));  // coords | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kStoreWO1dRgba32float, | 
 |           "textureStore(t      : texture_storage_1d<rgba32float>,\n" | 
 |           "             coords : i32,\n" | 
 |           "             value  : vec4<T>) -> void", | 
 |           ast::AccessControl::kWriteOnly, | 
 |           type::ImageFormat::kRgba32Float, | 
 |           type::TextureDimension::k1d, | 
 |           TextureDataType::kF32, | 
 |           "textureStore", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",                          // t | 
 |                                1,                                  // coords | 
 |                                b->vec4<f32>(2.f, 3.f, 4.f, 5.f));  // value | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kStoreWO2dRgba32float, | 
 |           "textureStore(t      : texture_storage_2d<rgba32float>,\n" | 
 |           "             coords : vec2<i32>,\n" | 
 |           "             value  : vec4<T>) -> void", | 
 |           ast::AccessControl::kWriteOnly, | 
 |           type::ImageFormat::kRgba32Float, | 
 |           type::TextureDimension::k2d, | 
 |           TextureDataType::kF32, | 
 |           "textureStore", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",                          // t | 
 |                                b->vec2<i32>(1, 2),                 // coords | 
 |                                b->vec4<f32>(3.f, 4.f, 5.f, 6.f));  // value | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kStoreWO2dArrayRgba32float, | 
 |           "textureStore(t           : texture_storage_2d_array<rgba32float>,\n" | 
 |           "             coords      : vec2<i32>,\n" | 
 |           "             array_index : i32,\n" | 
 |           "             value       : vec4<T>) -> void", | 
 |           ast::AccessControl::kWriteOnly, | 
 |           type::ImageFormat::kRgba32Float, | 
 |           type::TextureDimension::k2dArray, | 
 |           TextureDataType::kF32, | 
 |           "textureStore", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",           // t | 
 |                                b->vec2<i32>(1, 2),  // coords | 
 |                                3,                   // array_index | 
 |                                b->vec4<f32>(4.f, 5.f, 6.f, 7.f));  // value | 
 |           }, | 
 |       }, | 
 |       { | 
 |           ValidTextureOverload::kStoreWO3dRgba32float, | 
 |           "textureStore(t      : texture_storage_3d<rgba32float>,\n" | 
 |           "             coords : vec3<i32>,\n" | 
 |           "             value  : vec4<T>) -> void", | 
 |           ast::AccessControl::kWriteOnly, | 
 |           type::ImageFormat::kRgba32Float, | 
 |           type::TextureDimension::k3d, | 
 |           TextureDataType::kF32, | 
 |           "textureStore", | 
 |           [](ProgramBuilder* b) { | 
 |             return b->ExprList("texture",                          // t | 
 |                                b->vec3<i32>(1, 2, 3),              // coords | 
 |                                b->vec4<f32>(4.f, 5.f, 6.f, 7.f));  // value | 
 |           }, | 
 |       }, | 
 |   }; | 
 | } | 
 |  | 
 | }  // namespace test | 
 | }  // namespace intrinsic | 
 | }  // namespace ast | 
 | }  // namespace tint |