[tint][core] Add `texel_buffer` language feature as a builtin type

Bug: 382544164
Change-Id: If0f3b71f0febc3e2c6416e784513f3a258ccbb7c
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/250314
Reviewed-by: dan sinclair <dsinclair@chromium.org>
Commit-Queue: Diego Rodrigues <diejorarr@gmail.com>
Reviewed-by: James Price <jrprice@google.com>
diff --git a/src/tint/cmd/bench/enums_core_bench.cc b/src/tint/cmd/bench/enums_core_bench.cc
index e9e0c59..ae0364a 100644
--- a/src/tint/cmd/bench/enums_core_bench.cc
+++ b/src/tint/cmd/bench/enums_core_bench.cc
@@ -736,244 +736,251 @@
         "subUoup_matrBBx_riBBht",
         "subgJJoup_mat110x_right",
         "subgroup_matrix_rfgttt",
-        "tttxtre_X",
-        "teLturew1d",
-        "textur1_1d",
+        "texelbufftt",
+        "texel_buLwer",
+        "texel_bu1fer",
+        "texel_buffer",
+        "tewwel_buffer",
+        "teelbuffer",
+        "texel_bffer",
+        "textNNre_1d",
+        "tex__uleRUU1d",
+        "texHure_1d",
         "texture_1d",
-        "tewwture_1d",
-        "texte_ee",
-        "txture_1d",
-        "textNNre_2d",
-        "tex__uleRUU2d",
-        "texHure_2d",
-        "texture_2d",
-        "teCCturr_2d",
+        "teCCturr_1d",
+        "textre_1d",
+        "textupd_1d",
         "textre_2d",
-        "textupd_2d",
-        "exture_2d_array",
-        "txtNr_Ld_array",
-        "extre_2dray",
+        "textLN_d",
+        "tet_d",
+        "texture_2d",
+        "teqqtuxRR_GGd",
+        "texturS_GGd",
+        "88tucce_2d",
+        "texture_2d_arra",
+        "texture_2dpparty",
+        "te55tureFF02d_aqqray",
         "texture_2d_array",
-        "tRRxturxx_2d_aqqray",
-        "textSGre_2d_array",
-        "text88rcc2d_arra",
-        "texture_3",
-        "textte_ppd",
-        "qqFF0xture553d",
+        "texure_2d_array",
+        "texture_2d_ary",
+        "texure_2dOarray",
+        "textuHHe_3",
+        "66extureSS3O",
+        "tTTturddY_3d",
         "texture_3d",
-        "txture_3d",
-        "textur3d",
-        "texOre_3d",
-        "teHHture_cTb",
-        "66extSSre_cubO",
-        "texddYure_cuTT",
+        "textursg3d",
+        "texture_3GG",
+        "tIxtllOQQ_3d",
+        "txture_cube",
+        "texture_crrbe",
+        "teyytue_cub7",
         "texture_cube",
-        "texureggsube",
-        "texGGure_cube",
-        "texllurQQIcube",
-        "texturecube_array",
-        "texture_cube_arrray",
-        "textureyyube_ar7ay",
+        "tBBxWur22_cube",
+        "yyexture_cubV",
+        "texturec4",
+        "texture_cudde_array",
+        "textu2e_cVVbz_rray",
+        "texture_cubeyyarray",
         "texture_cube_array",
-        "tBBxtur22_cube_arWay",
-        "textuVe_cubeyyarray",
-        "texture_ubeara4",
-        "texture_depth_ddd",
-        "text2re_depVVhzd",
-        "teyyture_depth_2d",
+        "texture_cAb___array",
+        "texture_cube_arhhay",
+        "teture_cube_arvvy",
+        "txture_dept_2d",
+        "texNNure_gesth_ood",
+        "emmtre_ZZepth_2d",
         "texture_depth_2d",
-        "texture_dApth__2d",
-        "texture_dhhpth_2d",
-        "teture_detvv_2d",
-        "textur_deph_2d_array",
-        "textureNNdepth_gdsoorray",
-        "textur_deptZZ2mm_array",
+        "texture_dkt_2d",
+        "teRtue_ffepth_2d",
+        "terrztuWdepth_2d",
+        "texture_dept_2d_Rrray",
+        "texture_dS88ptM_2d_array",
+        "bbexurR_depth_2d_PPrray",
         "texture_depth_2d_array",
-        "textur3kdeth_2d_rray",
-        "texture_ReptfA_2_array",
-        "zzexture_depth_d_rrWay",
-        "texture_epRRh_cbe",
-        "textMr88_depth_cubSS",
-        "txturRPPdeptbb_cube",
+        "texturexxWWeth_2d_array",
+        "texture_dAAvth_2d_array",
+        "textujje_de44th_2d_Xrray",
+        "textufe_depth_cube",
+        "textureAAUepth_cOOe",
+        "tuxtre_ssepth_cue",
         "texture_depth_cube",
-        "textWWre_deptxxcube",
-        "textvvrAAdepth_cube",
-        "texjjur44_dXpth_cube",
-        "textufe_depth_cube_array",
-        "texture_dOOpthUcube_AAray",
-        "texuure_depssh_cub_arry",
+        "bbexture_sFFpth_cube",
+        "texture_nnepth_cubYY",
+        "teture_depth_cubss",
+        "textre_dzzpthqcube_array",
+        "texuQedepth_cube_aNNray",
+        "textukke_eptpp_cubearray",
         "texture_depth_cube_array",
-        "texFFsre_depth_cbbbe_array",
-        "texture_depth_cubYY_arrann",
-        "texture_depth_ubss_array",
-        "tqxturezzdepth_mulisampled_2d",
-        "textuQQe_deptN_mutisapled_2d",
-        "texture_pppt_multisamplekk_2d",
+        "texturL_depth_cusse_arraJ",
+        "texture5ffepth_cubeJa77TTay",
+        "textur00_dpxh_cube_array",
+        "exture_depth_Aulti1ampled_2d",
+        "texturedepth_multisampled_2d",
+        "textQQre_depth_multisamled_2d",
         "texture_depth_multisampled_2d",
-        "t8xture_dJpth_multisaLpled_ssd",
-        "t5xTTJre_depffh_77ultisampled_2d",
-        "text00re_dxph_multisampled_2d",
-        "textureAexter1a",
-        "texture_extrnal",
-        "texturQQ_externl",
+        "iiexture_depthwultiampled_2d",
+        "texture_depth_mwwltisampled_2d",
+        "teYYturh_deptJJ_multisampled_2d",
+        "texture_RRxkEnal",
+        "texture_exteknauu",
+        "textrRtexternal",
         "texture_external",
-        "teiitreextewnal",
-        "texture_exterwwal",
-        "texJYYhre_external",
-        "textuREe_mkt7sampled_2d",
-        "textureuumulkisampled_2d",
-        "textuRemultisatpled_2d",
+        "IIeNtre_external",
+        "texture_exIernal",
+        "Eiixture_externl",
+        "texture_multsssample_2d",
+        "txture_mCCltXsa55pled_2d",
+        "9exture_multisampled_2d",
         "texture_multisampled_2d",
-        "texture_mltNsampleII_2d",
-        "textuIIe_multisapled_2d",
-        "texture_multisaiiEled_2",
-        "texturestoragess1d",
-        "texuCCe_st55Xage_1d",
-        "te9ture_storage_1d",
-        "texture_storage_1d",
-        "texur_storage_1X",
-        "txIIurestorage_1d",
-        "texture_storagz_1d",
-        "tAAxtur22_zztorae_2d",
-        "texture_storag_2d",
+        "exture_mltisampled_Xd",
+        "tetIIre_mltisampled_2d",
+        "texzure_multisampled_2d",
+        "tAAxtur22_zztorae_1d",
+        "texture_storag_1d",
         "texturbb_strageFd",
+        "texture_storage_1d",
+        "teVture_stMMrage_1d",
+        "textuwe_storacmzz_1d",
+        "textuQQOO_storag1d",
+        "texbure_storage_2d",
+        "nne5kture_torage_2C",
+        "textue_KKtorarreyy2d",
         "texture_storage_2d",
-        "teVture_stMMrage_2d",
-        "textuwe_storacmzz_2d",
-        "textuQQOO_storag2d",
-        "texture_storage_2d_arbay",
-        "teCturnn_skkora5e_2d_aray",
-        "teKtrrre_storage_2d_arryyy",
+        "tTxtue_ttorageAA2d",
+        "QQexture_sorage_2d",
+        "texture_t8rage_d",
+        "texture_storag_2d_aaray",
+        "exteccre_storage_bd_array",
+        "txture_storage_dLLaPPray",
         "texture_storage_2d_array",
-        "textureTstorageAA2dtaray",
-        "texure_storage_ZQQ_array",
-        "teture_storge82d_array",
-        "teture_stoaage_3d",
-        "eeextbr_stccrage_3d",
-        "texLLure_Porage_3d",
+        "texWWUr_storag_2d_array",
+        "texzzure_stoage_2d_array",
+        "textNre_stoage_2__rray",
+        "texture_storagea3d",
+        "texre_stoBage_3d",
+        "zzexture_torge_3d",
         "texture_storage_3d",
-        "tetuWW_sUorage_3d",
-        "texture_stzzrage_3",
-        "text__re_soNa_3d",
-        "a32",
-        "B",
-        "z2",
+        "textureUaatorbge_HHd",
+        "te4ture_sOorg_3d",
+        "texGGme_storage_3d",
+        "u3",
+        "8Gzz2",
+        "u3",
         "u32",
-        "uHbaa",
-        "4",
-        "GGm",
-        "8",
-        "N88G",
-        "8",
+        "uAAx",
+        "ubb32",
+        "u3jj",
+        "cqJx",
+        "",
+        "A",
         "u8",
-        "uAA",
-        "ubbu",
-        "jj8",
-        "Jccxc2",
-        "Fg",
-        "veA",
+        "cc8",
+        "BU",
+        "BAA",
+        "vxc2",
+        "Ue8",
+        "vUICB8",
         "vec2",
-        "ccec2",
-        "BcUU",
-        "BecAA",
-        "vex2f",
-        "veU8",
-        "vUCc8Bf",
+        "vec__",
+        "ecUU",
+        "vec",
+        "vrruc27",
+        "ve2kk",
+        "vel2f",
         "vec2f",
-        "vec2__",
-        "UUec2",
-        "ve2",
-        "ec2",
-        "vkk",
-        "EEJJe2h",
-        "vec2h",
-        "vec2oo",
-        "zeAXh",
-        "vTc88",
+        "vecf",
+        "YYc3f",
+        "44ec2f",
+        "Rc2h",
+        "88ePPr2h",
         "ec2J",
+        "vec2h",
         "cVt",
-        "veci",
-        "vec2i",
+        "vech",
         "ec2",
         "331i",
         "uuci",
-        "4e02u",
-        "v3ru",
+        "4e02i",
+        "vec2i",
+        "v3ri",
         "veYY2g",
-        "vec2u",
-        "ve2u",
+        "ve2i",
         "rCCcu",
         "lecu",
-        "vZZc3",
-        "t9qcMM",
-        "vec",
-        "vec3",
-        "veY7g",
+        "vec2ZZ",
+        "vec2u",
+        "tqm9MMu",
+        "veUu",
+        "vgc77n",
         "dddd",
         "aaecE",
-        "vecIIf",
-        "RReZ3ll",
-        "vecNNkrr",
-        "vec3f",
-        "vec",
+        "vIIc3",
+        "vec3",
+        "ZllRR3",
+        "kNNecrr",
+        "e3",
         "vc3f",
         "veca",
         "HHec3G",
-        "cc3h",
-        "vB22nllh",
-        "vec3h",
+        "vec3f",
+        "cc3f",
+        "vB22nllf",
         "vec35",
         "eR3h",
         "gec3h",
-        "ve3i",
-        "vecpi",
-        "vecK99i",
-        "vec3i",
-        "22Rci",
+        "ve3h",
+        "vec3h",
+        "vecph",
+        "vecK99h",
+        "22Rch",
         "vecnn",
         "veeENi",
-        "fHHec3u",
-        "ss226u",
-        "em0u",
-        "vec3u",
+        "fHHec3i",
+        "vec3i",
+        "ss226i",
+        "em0i",
         "vecNp",
         "ve63",
         "oZWWV3u",
-        "HHc",
-        "vcA",
-        "cT",
-        "vec4",
-        "veWW2",
-        "vWc4",
+        "vHHu",
+        "vec3u",
+        "vAcu",
+        "vTu",
+        "2ec3u",
+        "vec4W",
         "8eZ",
-        "FeR4",
-        "vebb4",
-        "ggce",
-        "vec4f",
-        "UeSh",
+        "FRc",
+        "vec4",
+        "bbc4",
+        "gce",
+        "ech",
         "vZqNN",
         "v9f",
-        "ccHMMh",
+        "ccHMMf",
+        "vec4f",
         "v4x",
         "veXX",
-        "vec4h",
-        "4h",
+        "4f",
         "veh",
         "vecgg4h",
-        "rfe4i",
-        "ve4i",
+        "rfe4h",
+        "vec4h",
+        "ve4h",
         "vggc4D",
-        "vec4i",
         "v994Q",
         "eeei",
         "veci",
         "vc4II",
-        "vequ",
-        "Ooc77u",
-        "vec4u",
+        "vec4i",
+        "veqi",
+        "Ooc77i",
         "vrrDD",
         "vecju",
         "11ciiFu",
+        "jBcRRu",
+        "vec4u",
+        "vdAc_7u",
+        "4jj",
+        "xxkeo",
     };
     for (auto _ : state) {
         for (auto* str : kStrings) {
@@ -986,118 +993,118 @@
 BENCHMARK(BuiltinTypeParser);
 void BuiltinValueParser(::benchmark::State& state) {
     const char* kStrings[] = {
-        "clip_BjstRRnces",
-        "AAlip_7ist__ncds",
-        "ljjp_disancs",
-        "clip_distances",
-        "cipoisxxkances",
         "clipWdistances",
         "clIp_disNQQnc1s",
-        "fraI_deth",
-        "fjag_dept",
-        "7ragep22h",
-        "frag_depth",
-        "fKggcdEEllth",
+        "clip_Iistance",
+        "clip_distances",
+        "clip_distjnce",
+        "li22_dstanc7s",
+        "clilc_diKtaEgces",
         "frag_dept",
         "5rag_dth",
-        "r66t_f88cing",
-        "foat_fcing",
-        "frot_facEng",
-        "front_facing",
-        "frontqacQg",
+        "rag66e88th",
+        "frag_depth",
+        "ag_depth",
+        "frag_dEth",
+        "fagheQqh",
         "front_fa_ig",
         "fNot_arng",
-        "global_inocation_id",
-        "global_invocation_eeBBd",
-        "nngb11l_invocatin_id",
-        "global_invocation_id",
-        "globaq_invocatinn_id",
+        "front_facng",
+        "front_facing",
+        "frTTeet_faBBing",
+        "11gont_acnnn",
+        "fqont_facinn",
         "global_invmmBaccion_iX",
         "gttbal_i77vocation_id",
-        "itstane_idx",
-        "istanceKindex",
-        "instanFFjn_inex",
-        "instance_index",
-        "stancEE_ndex",
+        "globalinvoatio_id",
+        "global_invocation_id",
+        "global_iKvocatin_id",
+        "globnl_injjcation_FFd",
+        "glb8l_invoaEEio_id",
         "inLDtvnc_index",
         "ih55stanco_Sndex",
-        "lcal_inuuZcation_id",
-        "local_in557caPPion_id",
-        "local_invocatonSikk",
-        "local_invocation_id",
-        "local_inEEocaSioF_id",
+        "instane_iZuuex",
+        "instance_index",
+        "instancePPi7de55",
+        "instSnce_ndkkx",
+        "iFStanceEEindex",
         "lcal_invyycbbtin_id",
         "ocal_iJvoationRid",
-        "o1al_invocation_inTex",
-        "local_inXoatioTindeX",
-        "local_invocat00on_idex",
-        "local_invocation_index",
-        "locaP_77nvocation_index",
+        "locaT_1nvoction_id",
+        "local_invocation_id",
+        "lcal_invocaXiTn_d",
+        "l00ca_invocation_id",
+        "local_invoc77tion_Pd",
         "locl_inpocation_Zndex",
         "PPocaw_invocatin_idbbx",
-        "num_ssbbH8kgrojjps",
-        "num_workgrouhs",
-        "numworkxxrop",
-        "num_workgroups",
-        "nurQwBrkgroeps",
+        "8ocass_inHbbocation_indejj",
+        "local_invocation_index",
+        "local_inhocation_index",
+        "lcal_invocaxxio_indx",
+        "lcal_invocationrrinQeB",
         "num_workJJroups",
         "nu_wurkgrwuv",
-        "psxxttion",
-        "povi99ion",
-        "tion",
-        "position",
-        "poffnntion",
+        "nutt_workgrupxx",
+        "num_workgroups",
+        "num_workvr99ups",
+        "num_rroups",
+        "numnnfforkgroups",
         "posi5ion",
         "uJUition",
-        "sample_ndex",
-        "sFmplt_index",
-        "sa1ple_index",
-        "sample_index",
-        "samAAle_iDDdex",
+        "positio",
+        "position",
+        "positton",
+        "po1ition",
+        "pDDsitioAA",
         "OPple_2nde",
         "sampl_index",
-        "sample77mask",
-        "samAA1Ue_mask",
-        "AAaXple_mafk",
-        "sample_mask",
-        "sampVvevmas",
+        "sampl77_index",
+        "sample_index",
+        "sUUmpl1_ndAAmm",
+        "sample_fndeAA",
+        "savple_VVdvx",
         "sppmple_mask",
         "sample_TTask",
-        "jjub0kroup_id",
-        "subgroup_i",
-        "ubgroyyp_id",
-        "subgroup_id",
-        "sYYgroup_izz",
+        "jjam0kle_mask",
+        "sample_mask",
+        "sample_mas",
+        "ampleyymask",
+        "sYYple_maszz",
         "subgiioup_iW",
         "UUu7grop_i6",
-        "subgrop_UUnvocationpi",
-        "subgrouh_nvocaiTTn_id",
-        "subg5oup_invocaion_id",
-        "subgroup_invocation_id",
-        "sugro1_nvocation_id",
+        "subgroUUpi",
+        "subgroup_id",
+        "hubgroTTpd",
+        "subgoup_id",
+        "su1gro_d",
         "subgroup_invocmmtIon44id",
         "subgRoYpinvoDDatiYYn_id",
-        "subjjroup_size",
-        "subgroup_sie",
-        "subgroupQQsdz",
-        "subgroup_size",
-        "subgr55up_sHe",
+        "subgroup_invocatiojj_id",
+        "subgroup_invocation_id",
+        "subgroup_invocatio_id",
+        "subgroup_invodQQion_id",
+        "subgHoup_i55vocationid",
         "sukgroxFF_size",
         "srroup_size",
-        "vertexKKi_Nex",
-        "vertex_aTdex",
-        "vertexvvindex",
-        "vertex_index",
-        "ertexjjindex",
+        "NubgKK_up_size",
+        "subgroup_size",
+        "suagroupxsize",
+        "subgroup_sivve",
+        "subgrjjup_siz",
         "vrtOOx_indenn",
         "OeOOex_indegg",
-        "wworkQQrup_id",
-        "workgroupJd",
-        "workgrouD_id",
-        "workgroup_id",
-        "workgouOO_id",
+        "wwertQQxindex",
+        "vertex_index",
+        "vertex_inJx",
+        "vertex_iDdex",
+        "verte_iOOdex",
         "workgoup_id",
         "wokgrou0_id",
+        "workgouqli",
+        "workgroup_id",
+        "workgroupuid",
+        "wor33group_id",
+        "orkgroNNp_id",
     };
     for (auto _ : state) {
         for (auto* str : kStrings) {
@@ -1110,11 +1117,11 @@
 BENCHMARK(BuiltinValueParser);
 void InterpolationSamplingParser(::benchmark::State& state) {
     const char* kStrings[] = {
-        "cqle",     "cenuer",  "cen33er", "center",   "cNNter",  "ntMr",     "cenR22b",
-        "ceiitoid", "cetroid", "ceCriou", "centroid", "JHHnrid", "cntrggyh", "cWWtroiB",
-        "itEcceEE", "eieehyy", "U44ter",  "either",   "eithe",   "eitheN",   "MMithess",
-        "fiDsC",    "YTgrst",  "firjjt",  "first",    "frDD",    "fEEM99t",  "Nrst",
-        "55ample",  "Qample",  "nnmple",  "sample",   "samWFe",  "sa66plw",  "svFple",
+        "ntMr",     "cenR22b",  "ciintr",     "center",   "ceter",     "uCoer",    "cenHH",
+        "cntrggyh", "cWWtroiB", "cEccEECoid", "centroid", "yyeenroid", "cU44roid", "centroi",
+        "eitheN",   "MMithess", "DithCr",     "either",   "gTiYher",   "eithjjr",  "eDDhe",
+        "fEEM99t",  "Nrst",     "fir55t",     "first",    "fQrst",     "nirst",    "WWirF",
+        "sa66plw",  "svFple",   "amWWe",      "sample",   "smpe",      "5pK",      "sam4le",
     };
     for (auto _ : state) {
         for (auto* str : kStrings) {
@@ -1127,11 +1134,10 @@
 BENCHMARK(InterpolationSamplingParser);
 void InterpolationTypeParser(::benchmark::State& state) {
     const char* kStrings[] = {
-        "fWt",         "at",           "5",           "flat",         "f4at",
-        "gnnP",        "USS",          "2inVar",      "lpnear",       "liXV9992",
-        "linear",      "nna",          "sar",         "8BBna",        "perspeyCCAive",
-        "pervveitBe",  "ers44QQAtive", "perspective", "perpecTiZ44e", "perspecXive",
-        "dderpective",
+        "gnnP",       "USS",        "fl2V",        "flat",        "fpat",      "92laXV",
+        "a",          "sar",        "8BBna",       "AyACCear",    "linear",    "lieBv",
+        "A4QQnar",    "ZZneaT4",    "perspecXive", "dderpective", "perddpeie", "perspective",
+        "pdkpecii1e", "perGGvtive", "espjjctive",
     };
     for (auto _ : state) {
         for (auto* str : kStrings) {
@@ -1144,86 +1150,66 @@
 BENCHMARK(InterpolationTypeParser);
 void TexelFormatParser(::benchmark::State& state) {
     const char* kStrings[] = {
-        "bga8uddr",      "gra8udir1",      "vgaGGunor",
-        "bgra8unorm",    "jjgraunrm",      "bgra8wnorm",
-        "bgXa8nnorm",    "r1jEflot",       "1zflot",
-        "r162loWWt",     "r16float",       "r6float",
-        "r1Vloat",       "l16f4znat",      "__1Yst",
-        "rMk6sint",      "D1zzsint",       "r16sint",
-        "r16dnq",        "r16sit",         "r1MMsinl",
-        "r16nt",         "r16n9",          "rn6uVVt",
-        "r16uint",       "K6uit",          "CC6uiBB",
-        "r1oint",        "EE3f88occww",    "r2fbboat",
-        "r326loat",      "r32float",       "K3ggoa",
-        "r32fE1at",      "r32floa",        "rpH2int",
-        "raa2sinqq",     "r32sn",          "r32sint",
-        "rxxxxXsi_",     "r32SSzznt",      "r32int",
-        "32ont",         "r32nt",          "rK2ut",
-        "r32uint",       "rczuint",        "3gg88ant",
-        "r3jjsint",      "1AAiint",        "r8sin66V",
-        "rsi",           "r8sint",         "mhGtint",
-        "rjiyynt",       "QQ_8sivt",       "rLnorm",
-        "r8nWccm",       "r8snFm",         "r8snorm",
-        "rzzsyyor",      "8snoo",          "r8snI_c",
-        "rddint",        "l8uMt",          "r8Oint",
-        "r8uint",        "rmTTK6nt",       "8RRi",
-        "8400",          "rnnoqq",         "r8BBnorm",
-        "rWB22aorm",     "r8unorm",        "rjjunorm",
-        "66torHH",       "r8JJnm",         "rtt1Sb10uflooot",
-        "r__11brulSSat", "rg1WWb10ufloat", "rg11b10ufloat",
-        "rg11b10uflokt", "r1A10uflotbbt",  "rg11b_0ufl1a",
-        "g16flffN",      "rg6iiloVk",      "rU16float",
-        "rg16float",     "Ig16fnat",       "rg144floLL8t",
-        "rgZZ6float",    "rg16sMMnt",      "rg16int",
-        "MMg166ASSt",    "rg16sint",       "TTx16sggGG",
-        "rg1Isint",      "rg16silt",       "rgOO6ui",
-        "516uina",       "rg__6uzzR",      "rg16uint",
-        "Pg16uLLnt",     "r16uihht",       "rg16unt",
-        "rj32oat",       "rgB2f0a",        "rLLgxxlat",
-        "rg32float",     "rg3MMfloIIt",    "rXg2FFoat",
-        "gp2zzssoat",    "rrg32ZZFnt",     "rg2si00jt",
-        "rgr2pwwnt",     "rg32sint",       "g3QQZnt",
-        "g3__nint",      "rg3sint",        "rg3uint",
-        "rg2inC",        "r33GGuint",      "rg32uint",
-        "iigll2u2nt",    "rg32uvvncc",     "rP32vinj",
-        "Ngisip",        "rg8s2t",         "rg8qJnD",
-        "rg8sint",       "g8siQm",         "r8sinJ",
-        "r8sinWW",       "rQQ8wnwgrm",     "rg8snorz",
-        "rgWWnorzz",     "rg8snorm",       "rg8om",
-        "rK99sqqUUr",    "RRgEEsnrm",      "rg8ut",
-        "rg8tint",       "rgMMqt",         "rg8uint",
-        "KKT8uiBaat",    "ll8uiII5",       "rgBBoowt",
-        "rg8__PPorm",    "rRR8unorm",      "rgSnm",
-        "rg8unorm",      "roQm",           "gunHH8rm",
-        "rg8YYnDrm",     "rgb10a2uOnt",    "JgbIIZa2ui8t",
-        "rgb1oa2Yint",   "rgb10a2uint",    "rgb100X2int",
-        "KcgbS02nnint",  "rg8810a2u33GR",  "r33b1XXa2unorqq",
-        "r4b102unozz",   "rgWt10a2uWhorm", "rgb10a2unorm",
-        "xgb10aurorm",   "eegC1Qa2unom",   "rgb10r2unYm",
-        "rgbmxS6float",  "rgb16float",     "rgb1yyfloat",
-        "rgba16float",   "r8a18floa",      "reba16float",
-        "rgbkk1fhhoat",  "rgBB16siOOt",    "gba99sint",
-        "gba16sgDnt",    "rgba16sint",     "rgba11niat",
-        "qIS16si6t",     "rgba16snYY",     "rbaL0uYYVVt",
-        "m6Ibss162int",  "rbajj6uint",     "rgba16uint",
-        "rgp7a1it",      "rgNa16ui6t",     "rgbagg6uinss",
-        "rgba32flat",    "qgbaJ2floaOO",   "rg00a32floaMM",
-        "rgba32float",   "rMMba32flommt",  "rgba2floHqt",
-        "r88ba32fGat",   "rgbww32siRR",    "qgba32sint",
-        "rUa2int",       "rgba32sint",     "MQgbaB2snt",
-        "rgba332sint",   "rg33a3Osint",    "ga32uiwt",
-        "rMbaAbuikkt",   "rgba32uit",      "rgba32uint",
-        "gd32uit",       "rgba3IuXXnw55",  "rgb32uint",
-        "rga8sit",       "rgda8JJn",       "rg_a81it",
-        "rgba8sint",     "rba8LLt",        "99gaGGsnt",
-        "rgaxxUsin",     "rgba8sor9",      "rgba8svorm",
-        "rgb228snoLLm",  "rgba8snorm",     "rgba81frb",
-        "rgba8sngAA",    "rbaUCom",        "rnbw8uizzt",
-        "rgba8niwVVMM",  "rga8uXNNt",      "rgba8uint",
-        "r77Wba8inee",   "rv33PRa8uint",   "rgbjj822int",
-        "cgAA8unorm",    "NgbakkuRRor",    "rgba8unorQQ",
-        "rgba8unorm",    "rgbuuunorm",     "rbaunuurm",
-        "gbaZnorm",
+        "bgra8wnorm",     "bgXa8nnorm",    "Egraju9orm",    "bgra8unorm",
+        "bgra8unz",       "bgra8uWW2rm",   "bgra8norm",     "r1Vloat",
+        "l16f4znat",      "r1__oaY",       "r16float",      "r1MHlkkat",
+        "r16flDzaI",      "r16dqoa",       "r16sit",        "r1MMsinl",
+        "r16nt",          "r16sint",       "r16n9",         "rn6sVVt",
+        "K6sit",          "CC6uiBB",       "r1oint",        "881uiEEwcc",
+        "r16uint",        "rbb6uin",       "r166int",       "ggint",
+        "r32fE1at",       "r32floa",       "rHpfloat",      "r32float",
+        "qqaa2flGat",     "r2loat",        "xxxx2_loat",    "r32SSzznt",
+        "r32int",         "32ont",         "r32sint",       "r32nt",
+        "rK2st",          "rczsint",       "3gg88ant",      "r3jjsint",
+        "riA2uin1",       "r32uint",       "rlVVu66nt",     "2uic",
+        "r32GGnht",       "rjiyynt",       "QQ_8sivt",      "rsiLL",
+        "r8sint",         "r8sWcc",        "F8ivt",         "r8zyynt",
+        "8snoo",          "r8snI_c",       "rddsorm",       "r8snorm",
+        "lMsno2",         "r8Onorm",       "rKK6mnoTT",     "8RRi",
+        "8400",           "qq8nt",         "r8uint",        "rBBuint",
+        "BBaW2int",       "r8uijjt",       "66torHH",       "r8JJnm",
+        "rttoonoSm",      "r8unorm",       "ur_SSrm",       "rWWunorm",
+        "r8unork",        "r1A10uflotbbt", "rg11b_0ufl1a",  "rgff1b10ufNt",
+        "rg11b10ufloat",  "rg1110uiiloVt", "rw11b10Ufloat", "rg11b0ufFoIt",
+        "rg144floLL8t",   "rgZZ6float",    "rMM16float",    "rg16float",
+        "rg1float",       "rSSM66Aloat",   "rxg6floaGGT",   "rg1Isint",
+        "rg16silt",       "rgOO6si",       "rg16sint",      "516sina",
+        "rg__6szzR",      "Pg16sLLnt",     "r16uihht",      "rg16unt",
+        "g6uijt",         "rg16uint",      "rg0iBB",        "rgLL6xxn",
+        "rMMII6uint",     "rXg2FFoat",     "gp2zzssoat",    "rgrF2flZZat",
+        "rg32float",      "rg002ljrat",    "rww32prrat",    "QQZ3foat",
+        "g3__nint",       "rg3sint",       "rg3sint",       "rg32sint",
+        "rg2inC",         "r33GGsint",     "iigll2u2nt",    "rg32uvvncc",
+        "rP32vinj",       "Nguupni",       "rg32uint",      "r23uint",
+        "qJg3uiDt",       "rg2miQt",       "r8sinJ",        "r8sinWW",
+        "wgggwiQQt",      "rg8sint",       "rg8zint",       "rzzWsint",
+        "r8si",           "rK99sqqUUr",    "RRgEEsnrm",     "r8norm",
+        "rg8snorm",       "rg8snttm",      "rg8MMor",       "raaKKTBBorm",
+        "ll8uiII5",       "rgBBoowt",      "PP__8uint",     "rg8uint",
+        "RRg8uint",       "rg8S",          "Qit",           "gunHH8rm",
+        "rg8YYnDrm",      "rg8Onorm",      "rg8unorm",      "Jg8IInorZ",
+        "ogYunorm",       "r0Xunorm",      "KcgbS02nnint",  "rg8810a2u33GR",
+        "rgq3310aXXuint", "rgb10a2uint",   "rgz14a2unt",    "rgb10a2WtKWhh",
+        "xb10aruint",     "eegC1Qa2unom",  "rgb10r2unYm",   "rgb1xxm2uSorm",
+        "rgb10a2unorm",   "rgb10arnorm",   "rg10a2uyyoFm",  "g10a28n8rm",
+        "reba16float",    "rgbkk1fhhoat",  "rgb1OOfBBoat",  "rgba16float",
+        "rgba6flo99",     "Dgbaggfloat",   "agba16f1nna",   "qIS16si6t",
+        "rgba16snYY",     "rbaL0sYYVVt",   "rgba16sint",    "m6Ibss162int",
+        "rbajj6sint",     "rgp7a1it",      "rgNa16ui6t",    "rgbagg6uinss",
+        "rgba16uit",      "rgba16uint",    "Jgba16uiOOt",   "rgba16uiM00t",
+        "rmmba16uiMMt",   "rgba2floHqt",   "r88ba32fGat",   "rgb3wwRRpoat",
+        "rgba32float",    "rgba3qfloat",   "rb32flaU",      "gBa32floaM5",
+        "rgba332sint",    "rg33a3Osint",   "ga32siwt",      "rgba32sint",
+        "rMbaAbsikkt",    "rgba32sit",     "gd32sit",       "rgba3IuXXnw55",
+        "rgb32uint",      "ra32uint",      "rgba32uint",    "rgbJ32din",
+        "_g132uint",      "ga32uLLn",      "99gaGGsnt",     "rgaxxUsin",
+        "rgbasi9t",       "rgba8sint",     "rgba8vint",     "rgba82LLint",
+        "f1ba8bit",       "rgba8sngAA",    "rbaUCom",       "zzgba8snwnm",
+        "rgba8snorm",     "nwwba8snoMMVV", "Xgba8sNNom",    "rgba8W77eerm",
+        "rv33PRa8uint",   "rgbjj822int",   "AAgca8int",     "rgba8uint",
+        "kRRgba8uNn",     "rgbaQQuint",    "ruuba8uin",     "rbaunuurm",
+        "gbaZnorm",       "rgHa8unrm",     "rgba8unorm",    "rgdSSS8unorm",
+        "rgba8unTTrm",    "rmb8uctrm",
     };
     for (auto _ : state) {
         for (auto* str : kStrings) {
diff --git a/src/tint/lang/core/core.def b/src/tint/lang/core/core.def
index d1ae3d8..46d6922 100644
--- a/src/tint/lang/core/core.def
+++ b/src/tint/lang/core/core.def
@@ -178,6 +178,8 @@
   subgroup_matrix_result
   // sized_binding_array
   binding_array
+  // texel_buffers
+  texel_buffer
 
   // Internal types.
   __atomic_compare_exchange_result_i32
diff --git a/src/tint/lang/core/enums.cc b/src/tint/lang/core/enums.cc
index 6174509..0b66c71 100644
--- a/src/tint/lang/core/enums.cc
+++ b/src/tint/lang/core/enums.cc
@@ -612,6 +612,9 @@
     if (str == "subgroup_matrix_right") {
         return BuiltinType::kSubgroupMatrixRight;
     }
+    if (str == "texel_buffer") {
+        return BuiltinType::kTexelBuffer;
+    }
     if (str == "texture_1d") {
         return BuiltinType::kTexture1D;
     }
@@ -856,6 +859,8 @@
             return "subgroup_matrix_result";
         case BuiltinType::kSubgroupMatrixRight:
             return "subgroup_matrix_right";
+        case BuiltinType::kTexelBuffer:
+            return "texel_buffer";
         case BuiltinType::kTexture1D:
             return "texture_1d";
         case BuiltinType::kTexture2D:
diff --git a/src/tint/lang/core/enums.h b/src/tint/lang/core/enums.h
index 9c68faa..eb0cb7c 100644
--- a/src/tint/lang/core/enums.h
+++ b/src/tint/lang/core/enums.h
@@ -355,6 +355,7 @@
     kSubgroupMatrixLeft,
     kSubgroupMatrixResult,
     kSubgroupMatrixRight,
+    kTexelBuffer,
     kTexture1D,
     kTexture2D,
     kTexture2DArray,
@@ -478,6 +479,7 @@
     "subgroup_matrix_left",
     "subgroup_matrix_result",
     "subgroup_matrix_right",
+    "texel_buffer",
     "texture_1d",
     "texture_2d",
     "texture_2d_array",
diff --git a/src/tint/lang/core/enums_test.cc b/src/tint/lang/core/enums_test.cc
index 98b75d5..4afb2ac 100644
--- a/src/tint/lang/core/enums_test.cc
+++ b/src/tint/lang/core/enums_test.cc
@@ -523,6 +523,7 @@
     {"subgroup_matrix_left", BuiltinType::kSubgroupMatrixLeft},
     {"subgroup_matrix_result", BuiltinType::kSubgroupMatrixResult},
     {"subgroup_matrix_right", BuiltinType::kSubgroupMatrixRight},
+    {"texel_buffer", BuiltinType::kTexelBuffer},
     {"texture_1d", BuiltinType::kTexture1D},
     {"texture_2d", BuiltinType::kTexture2D},
     {"texture_2d_array", BuiltinType::kTexture2DArray},
@@ -764,108 +765,111 @@
     {"subgrouKK_mtrix_right", BuiltinType::kUndefined},
     {"subgGoup_atrix_rgh", BuiltinType::kUndefined},
     {"sabgrop_matrix_right", BuiltinType::kUndefined},
-    {"txtuNOO1d", BuiltinType::kUndefined},
-    {"ttGre_1", BuiltinType::kUndefined},
-    {"textur5_1d", BuiltinType::kUndefined},
-    {"99jffture_2d", BuiltinType::kUndefined},
-    {"texRurevY2XX", BuiltinType::kUndefined},
-    {"exurc_2d", BuiltinType::kUndefined},
-    {"txu5e_288XXarray", BuiltinType::kUndefined},
-    {"texure_2_array", BuiltinType::kUndefined},
-    {"texture_2d_arppcy", BuiltinType::kUndefined},
-    {"texvure_3d", BuiltinType::kUndefined},
-    {"tEExtSSe_Jd", BuiltinType::kUndefined},
-    {"texture3", BuiltinType::kUndefined},
-    {"tex_ure_u", BuiltinType::kUndefined},
-    {"tewture__ube", BuiltinType::kUndefined},
-    {"textured99cube", BuiltinType::kUndefined},
-    {"exture_u99e_PPrray", BuiltinType::kUndefined},
-    {"tetureKKcube_array", BuiltinType::kUndefined},
-    {"teMture_oubDD_array", BuiltinType::kUndefined},
-    {"eiBture_ept_2d", BuiltinType::kUndefined},
-    {"txturedepthq2d", BuiltinType::kUndefined},
-    {"00extureLdeph_2d", BuiltinType::kUndefined},
-    {"texnuvve_d66pth_2d_array", BuiltinType::kUndefined},
-    {"texture_denh_2d_arrarr", BuiltinType::kUndefined},
-    {"texture_eeeph_2_arxxay", BuiltinType::kUndefined},
-    {"tONNture_depth_CCube", BuiltinType::kUndefined},
-    {"txture_depth_cube", BuiltinType::kUndefined},
-    {"t4xtureadepth_cube", BuiltinType::kUndefined},
-    {"texturNN_depth_cuNNe_arry", BuiltinType::kUndefined},
-    {"texture_depth_cbe_array", BuiltinType::kUndefined},
-    {"tuxturedeph_cube_array", BuiltinType::kUndefined},
-    {"teAture_depth_multisaSpEEedYYd", BuiltinType::kUndefined},
-    {"t0xture_depth_multisampled_2d", BuiltinType::kUndefined},
-    {"texture_depth_multisaampled_2d", BuiltinType::kUndefined},
-    {"texturmm_externa", BuiltinType::kUndefined},
-    {"texture_exteral", BuiltinType::kUndefined},
-    {"teEuUUe_exernal", BuiltinType::kUndefined},
-    {"texteDDKKultisampled_2d", BuiltinType::kUndefined},
-    {"0exture__multitampled_2d", BuiltinType::kUndefined},
-    {"txture_multisaAled_2d", BuiltinType::kUndefined},
-    {"texture_storageM1", BuiltinType::kUndefined},
-    {"texture_BBtorage_1d", BuiltinType::kUndefined},
-    {"textur99sobbagenn1d", BuiltinType::kUndefined},
-    {"texture_sEEoAAage12", BuiltinType::kUndefined},
-    {"teTture66stora5e_2d", BuiltinType::kUndefined},
-    {"textuHe_storage_2d", BuiltinType::kUndefined},
-    {"textreHHstoragexx2d_aray", BuiltinType::kUndefined},
-    {"texturyy_sznrage_2d_0rray", BuiltinType::kUndefined},
-    {"texture_strage_2d_array", BuiltinType::kUndefined},
-    {"texurH_ktorage_3d", BuiltinType::kUndefined},
-    {"exture_ctorage_3d", BuiltinType::kUndefined},
-    {"ooexrrre_sorage_3d", BuiltinType::kUndefined},
-    {"JJ", BuiltinType::kUndefined},
-    {"0CC", BuiltinType::kUndefined},
-    {"99xA", BuiltinType::kUndefined},
-    {"c8", BuiltinType::kUndefined},
-    {"S8", BuiltinType::kUndefined},
-    {"uB", BuiltinType::kUndefined},
-    {"ec2", BuiltinType::kUndefined},
-    {"vcme", BuiltinType::kUndefined},
-    {"voPPQQ", BuiltinType::kUndefined},
-    {"B", BuiltinType::kUndefined},
-    {"NKK2f", BuiltinType::kUndefined},
-    {"vrr2", BuiltinType::kUndefined},
-    {"ve2pr", BuiltinType::kUndefined},
-    {"PPecyh", BuiltinType::kUndefined},
-    {"vccZh", BuiltinType::kUndefined},
-    {"ec2", BuiltinType::kUndefined},
-    {"v00c2i", BuiltinType::kUndefined},
+    {"OOexN_buffr", BuiltinType::kUndefined},
+    {"txtl_bfGr", BuiltinType::kUndefined},
+    {"texel_5uffer", BuiltinType::kUndefined},
+    {"99jffture_1d", BuiltinType::kUndefined},
+    {"texRurevY1XX", BuiltinType::kUndefined},
+    {"exurc_1d", BuiltinType::kUndefined},
+    {"texXX5e88d", BuiltinType::kUndefined},
+    {"textur_2", BuiltinType::kUndefined},
+    {"textupp_ccd", BuiltinType::kUndefined},
+    {"tvxture_2d_array", BuiltinType::kUndefined},
+    {"tSSxtue_2EE_Jrray", BuiltinType::kUndefined},
+    {"texture_2daray", BuiltinType::kUndefined},
+    {"aex_red", BuiltinType::kUndefined},
+    {"textwwre_d", BuiltinType::kUndefined},
+    {"texddur99_3d", BuiltinType::kUndefined},
+    {"extPPre99ube", BuiltinType::kUndefined},
+    {"teture_KKube", BuiltinType::kUndefined},
+    {"teture_ooubDD", BuiltinType::kUndefined},
+    {"eBtiie_cubearray", BuiltinType::kUndefined},
+    {"texure_cube_aqay", BuiltinType::kUndefined},
+    {"texturecbe_arr0LLy", BuiltinType::kUndefined},
+    {"texture_dep66hvv2d", BuiltinType::kUndefined},
+    {"nrrture_depth_2d", BuiltinType::kUndefined},
+    {"teeetureepthxx2d", BuiltinType::kUndefined},
+    {"texture_dONNtCC_2d_array", BuiltinType::kUndefined},
+    {"texture_depth_2d_rray", BuiltinType::kUndefined},
+    {"texture_d4pth_2a_array", BuiltinType::kUndefined},
+    {"NNexNNure_deth_cube", BuiltinType::kUndefined},
+    {"texure_depth_cube", BuiltinType::kUndefined},
+    {"texture_dpthcuue", BuiltinType::kUndefined},
+    {"tSxtuAe_deYYth_cubEE_arry", BuiltinType::kUndefined},
+    {"texture_depth_cube_0rray", BuiltinType::kUndefined},
+    {"texaaure_depth_cube_array", BuiltinType::kUndefined},
+    {"teture_depth_mmultismpleqq_2d", BuiltinType::kUndefined},
+    {"textre_depth_multisampled_2d", BuiltinType::kUndefined},
+    {"texture_dEpth_UUltisampld_2d", BuiltinType::kUndefined},
+    {"txure_exKKeDDnal", BuiltinType::kUndefined},
+    {"0exture_exte__nat", BuiltinType::kUndefined},
+    {"tpturl_etArnal", BuiltinType::kUndefined},
+    {"textuMe_multisampled_2", BuiltinType::kUndefined},
+    {"texture_multisampledBB2d", BuiltinType::kUndefined},
+    {"textnne_m99lbbisamled_2d", BuiltinType::kUndefined},
+    {"texture_sEEoAAage11", BuiltinType::kUndefined},
+    {"teTture66stora5e_1d", BuiltinType::kUndefined},
+    {"textuHe_storage_1d", BuiltinType::kUndefined},
+    {"texture_sxoraHHe2d", BuiltinType::kUndefined},
+    {"zexture_storyy0e_2n", BuiltinType::kUndefined},
+    {"texture_storage_d", BuiltinType::kUndefined},
+    {"texture_storage_2dHkray", BuiltinType::kUndefined},
+    {"texture_storage_2darcay", BuiltinType::kUndefined},
+    {"ooexrrure_sorge_2d_array", BuiltinType::kUndefined},
+    {"textre_stoJJge_3d", BuiltinType::kUndefined},
+    {"tCCxtu0e_storage_d", BuiltinType::kUndefined},
+    {"texturAAsxor99gF_3d", BuiltinType::kUndefined},
+    {"uc2", BuiltinType::kUndefined},
+    {"S32", BuiltinType::kUndefined},
+    {"oBs", BuiltinType::kUndefined},
+    {"8", BuiltinType::kUndefined},
+    {"me", BuiltinType::kUndefined},
+    {"gQPP", BuiltinType::kUndefined},
+    {"9", BuiltinType::kUndefined},
+    {"xxec2", BuiltinType::kUndefined},
+    {"NKsc2", BuiltinType::kUndefined},
+    {"vcrp9", BuiltinType::kUndefined},
+    {"7yZZVVf", BuiltinType::kUndefined},
+    {"vec1pf", BuiltinType::kUndefined},
+    {"v00c2h", BuiltinType::kUndefined},
     {"ecJBPss", BuiltinType::kUndefined},
-    {"fcffJJu", BuiltinType::kUndefined},
-    {"XXI2u", BuiltinType::kUndefined},
+    {"fcffJJh", BuiltinType::kUndefined},
+    {"XXI2i", BuiltinType::kUndefined},
     {"", BuiltinType::kUndefined},
-    {"vc3", BuiltinType::kUndefined},
-    {"vKc3", BuiltinType::kUndefined},
-    {"me44", BuiltinType::kUndefined},
-    {"veo3f", BuiltinType::kUndefined},
-    {"jhHHc3f", BuiltinType::kUndefined},
-    {"UU33Ewwf", BuiltinType::kUndefined},
-    {"ve3u", BuiltinType::kUndefined},
-    {"rddcch", BuiltinType::kUndefined},
-    {"2Pttch", BuiltinType::kUndefined},
-    {"vwwcsi", BuiltinType::kUndefined},
-    {"11ennci", BuiltinType::kUndefined},
-    {"ve3i", BuiltinType::kUndefined},
-    {"vecu", BuiltinType::kUndefined},
-    {"ecaSSIu", BuiltinType::kUndefined},
-    {"vED3u", BuiltinType::kUndefined},
-    {"cceR4", BuiltinType::kUndefined},
-    {"v4", BuiltinType::kUndefined},
-    {"vaac", BuiltinType::kUndefined},
-    {"LSc4f", BuiltinType::kUndefined},
-    {"ecmm", BuiltinType::kUndefined},
-    {"4ecV", BuiltinType::kUndefined},
-    {"vc__", BuiltinType::kUndefined},
+    {"ve2i", BuiltinType::kUndefined},
+    {"uKKcu", BuiltinType::kUndefined},
+    {"m4d2u", BuiltinType::kUndefined},
+    {"veo2u", BuiltinType::kUndefined},
+    {"vhjHNN", BuiltinType::kUndefined},
+    {"vEw3Uc3", BuiltinType::kUndefined},
+    {"vuc", BuiltinType::kUndefined},
+    {"rddccf", BuiltinType::kUndefined},
+    {"2Pttcf", BuiltinType::kUndefined},
+    {"vwwcsf", BuiltinType::kUndefined},
+    {"11ennch", BuiltinType::kUndefined},
+    {"ve3h", BuiltinType::kUndefined},
+    {"vech", BuiltinType::kUndefined},
+    {"ecaSSIi", BuiltinType::kUndefined},
+    {"vED3i", BuiltinType::kUndefined},
+    {"veIccR", BuiltinType::kUndefined},
+    {"ec9", BuiltinType::kUndefined},
+    {"aec3u", BuiltinType::kUndefined},
+    {"LSc3u", BuiltinType::kUndefined},
+    {"mmc", BuiltinType::kUndefined},
+    {"4eV", BuiltinType::kUndefined},
+    {"ec_", BuiltinType::kUndefined},
     {"vQ4", BuiltinType::kUndefined},
     {"veERdd", BuiltinType::kUndefined},
     {"vec9", BuiltinType::kUndefined},
     {"e04", BuiltinType::kUndefined},
-    {"vzi", BuiltinType::kUndefined},
-    {"vecccu", BuiltinType::kUndefined},
-    {"v_Qcu", BuiltinType::kUndefined},
+    {"vzh", BuiltinType::kUndefined},
+    {"veccch", BuiltinType::kUndefined},
+    {"v_Qci", BuiltinType::kUndefined},
     {"vect", BuiltinType::kUndefined},
+    {"zz3ecECpp", BuiltinType::kUndefined},
+    {"veddhhu", BuiltinType::kUndefined},
+    {"e7766u", BuiltinType::kUndefined},
+    {"vec4P", BuiltinType::kUndefined},
 };
 
 using BuiltinTypeParseTest = testing::TestWithParam<BuiltinTypeCase>;
@@ -928,54 +932,54 @@
 };
 
 static constexpr BuiltinValueCase kInvalidBuiltinValueCases[] = {
-    {"clEpCCdist33zzppes", BuiltinValue::kUndefined},
-    {"cliphhdistaddces", BuiltinValue::kUndefined},
-    {"lip_d77s66ances", BuiltinValue::kUndefined},
-    {"frag_deptP", BuiltinValue::kUndefined},
-    {"fraw_depth", BuiltinValue::kUndefined},
-    {"fragupth", BuiltinValue::kUndefined},
-    {"fron6_fXXcing", BuiltinValue::kUndefined},
-    {"ront_fRRig", BuiltinValue::kUndefined},
-    {"fron_fciVV", BuiltinValue::kUndefined},
-    {"gloHHGGl_invocation_id", BuiltinValue::kUndefined},
-    {"Mlobal_invocationFFid", BuiltinValue::kUndefined},
-    {"global_invoction_id", BuiltinValue::kUndefined},
-    {"instan3_ggdex", BuiltinValue::kUndefined},
-    {"PnKKt1n_e_index", BuiltinValue::kUndefined},
-    {"iEstance_idex", BuiltinValue::kUndefined},
-    {"loca_invcatiMn_id", BuiltinValue::kUndefined},
-    {"loGGal_invcSSti77n_iX", BuiltinValue::kUndefined},
-    {"FFocal_invottation_d", BuiltinValue::kUndefined},
-    {"local_onUUocsstionZZindex", BuiltinValue::kUndefined},
-    {"localinvocation_index", BuiltinValue::kUndefined},
-    {"local_invocationlindex", BuiltinValue::kUndefined},
-    {"num_workhroups", BuiltinValue::kUndefined},
-    {"Kum_wokgrouTTs", BuiltinValue::kUndefined},
-    {"num_werkgrowws", BuiltinValue::kUndefined},
-    {"jjKsitivv", BuiltinValue::kUndefined},
-    {"posYYto", BuiltinValue::kUndefined},
-    {"EEsiIIon", BuiltinValue::kUndefined},
-    {"sample_indeQQ", BuiltinValue::kUndefined},
-    {"sampPe_iel", BuiltinValue::kUndefined},
-    {"saffHle_index", BuiltinValue::kUndefined},
-    {"sanple_mask", BuiltinValue::kUndefined},
-    {"sgmpleFas66", BuiltinValue::kUndefined},
-    {"samp8e_mshsk", BuiltinValue::kUndefined},
-    {"subgroupFlli", BuiltinValue::kUndefined},
-    {"jj2bg00up_i", BuiltinValue::kUndefined},
-    {"suggroup_id", BuiltinValue::kUndefined},
-    {"subgroupeinvocation_i", BuiltinValue::kUndefined},
-    {"subgroup_ffnvocatin_id", BuiltinValue::kUndefined},
-    {"subup_invocation_id", BuiltinValue::kUndefined},
-    {"subgroup_sze", BuiltinValue::kUndefined},
-    {"subgrop_sizqq", BuiltinValue::kUndefined},
-    {"subgAAo_sze", BuiltinValue::kUndefined},
-    {"vertex_ndex", BuiltinValue::kUndefined},
-    {"verte_injjex", BuiltinValue::kUndefined},
-    {"vertZZx_index", BuiltinValue::kUndefined},
-    {"Oor2grUPIIp_id", BuiltinValue::kUndefined},
-    {"woZZkgroup_id", BuiltinValue::kUndefined},
-    {"workgnnoup_id", BuiltinValue::kUndefined},
+    {"cliw_distances", BuiltinValue::kUndefined},
+    {"clp_disunces", BuiltinValue::kUndefined},
+    {"6lip_distanXXes", BuiltinValue::kUndefined},
+    {"rag_RRpt", BuiltinValue::kUndefined},
+    {"fVgde1th", BuiltinValue::kUndefined},
+    {"fragGGdepHHh", BuiltinValue::kUndefined},
+    {"MFFon7_facing", BuiltinValue::kUndefined},
+    {"fron_facing", BuiltinValue::kUndefined},
+    {"3roTgg_fcin", BuiltinValue::kUndefined},
+    {"globQl_i_vK1cation_Pd", BuiltinValue::kUndefined},
+    {"Elobal_invocaton_id", BuiltinValue::kUndefined},
+    {"lobal_invocatin_iM", BuiltinValue::kUndefined},
+    {"77nsSSane_XndeGG", BuiltinValue::kUndefined},
+    {"inFFtaKcettndex", BuiltinValue::kUndefined},
+    {"onstssUnce_indZZx", BuiltinValue::kUndefined},
+    {"local_invocaion_id", BuiltinValue::kUndefined},
+    {"local_invocltion_id", BuiltinValue::kUndefined},
+    {"lhcal_invocation_id", BuiltinValue::kUndefined},
+    {"locTTKknvocation_index", BuiltinValue::kUndefined},
+    {"local_ievowwationindex", BuiltinValue::kUndefined},
+    {"local_invocavioKjjindex", BuiltinValue::kUndefined},
+    {"num_worgrupYY", BuiltinValue::kUndefined},
+    {"nm_EEorkgroupI", BuiltinValue::kUndefined},
+    {"num_worQQgroups", BuiltinValue::kUndefined},
+    {"poPilo", BuiltinValue::kUndefined},
+    {"postioffH", BuiltinValue::kUndefined},
+    {"pnsition", BuiltinValue::kUndefined},
+    {"Fampg_i66dex", BuiltinValue::kUndefined},
+    {"hample_iss8ex", BuiltinValue::kUndefined},
+    {"samleFFilldex", BuiltinValue::kUndefined},
+    {"jj2mp00_mas", BuiltinValue::kUndefined},
+    {"sagple_mask", BuiltinValue::kUndefined},
+    {"sample_mas", BuiltinValue::kUndefined},
+    {"subgrop_ffd", BuiltinValue::kUndefined},
+    {"subgu_id", BuiltinValue::kUndefined},
+    {"subgroup_i", BuiltinValue::kUndefined},
+    {"subgroqqp_nvocation_id", BuiltinValue::kUndefined},
+    {"subgroup_nocatioAAid", BuiltinValue::kUndefined},
+    {"subgrup_invocation_vd", BuiltinValue::kUndefined},
+    {"subgjjoup_ize", BuiltinValue::kUndefined},
+    {"subgrouZZ_size", BuiltinValue::kUndefined},
+    {"subgroupUsizII2", BuiltinValue::kUndefined},
+    {"veZZtex_index", BuiltinValue::kUndefined},
+    {"vertenn_index", BuiltinValue::kUndefined},
+    {"vertHx_iZkkd22x", BuiltinValue::kUndefined},
+    {"workgrop_id", BuiltinValue::kUndefined},
+    {"workRoupid", BuiltinValue::kUndefined},
+    {"workg99ouqq_id", BuiltinValue::kUndefined},
 };
 
 using BuiltinValueParseTest = testing::TestWithParam<BuiltinValueCase>;
@@ -1040,60 +1044,60 @@
 };
 
 static constexpr AttributeCase kInvalidAttributeCases[] = {
-    {"HlkkZg22", Attribute::kUndefined},
-    {"alig", Attribute::kUndefined},
-    {"igR", Attribute::kUndefined},
-    {"bindiqq9g", Attribute::kUndefined},
-    {"bind77ng", Attribute::kUndefined},
-    {"bini3", Attribute::kUndefined},
-    {"bluuccd_sr", Attribute::kUndefined},
-    {"lend_RRrc", Attribute::kUndefined},
-    {"bllnd_sJJc", Attribute::kUndefined},
-    {"MMuiI", Attribute::kUndefined},
-    {"7T6ilxi", Attribute::kUndefined},
-    {"builtQQJ", Attribute::kUndefined},
-    {"Aulo", Attribute::kUndefined},
-    {"coo", Attribute::kUndefined},
-    {"yoq3", Attribute::kUndefined},
-    {"coxxpute", Attribute::kUndefined},
-    {"Nrrpe", Attribute::kUndefined},
-    {"o99pute", Attribute::kUndefined},
-    {"diagnostc", Attribute::kUndefined},
-    {"iaHnlstic", Attribute::kUndefined},
-    {"i_gnotic", Attribute::kUndefined},
-    {"fagment", Attribute::kUndefined},
-    {"fragmjt", Attribute::kUndefined},
-    {"fragEEmttnt", Attribute::kUndefined},
-    {"gro", Attribute::kUndefined},
-    {"rourr", Attribute::kUndefined},
-    {"xoup", Attribute::kUndefined},
-    {"Q", Attribute::kUndefined},
-    {"ppss", Attribute::kUndefined},
-    {"Wuu", Attribute::kUndefined},
-    {"itputTT00ttachmet_index", Attribute::kUndefined},
-    {"inut_atvvchment_inex", Attribute::kUndefined},
-    {"Qnput_attachment_index", Attribute::kUndefined},
-    {"in3RrpoCae", Attribute::kUndefined},
-    {"inerCat", Attribute::kUndefined},
-    {"ntrpPPrppate", Attribute::kUndefined},
-    {"xx8DDuvaiant", Attribute::kUndefined},
-    {"lldqqvarYYant", Attribute::kUndefined},
+    {"alig77", Attribute::kUndefined},
+    {"a3n", Attribute::kUndefined},
+    {"aligcu", Attribute::kUndefined},
+    {"b1nRRng", Attribute::kUndefined},
+    {"bindllJg", Attribute::kUndefined},
+    {"MMinI", Attribute::kUndefined},
+    {"ble7d6Txc", Attribute::kUndefined},
+    {"blenJ_QQrc", Attribute::kUndefined},
+    {"buuend_A", Attribute::kUndefined},
+    {"builn", Attribute::kUndefined},
+    {"bl33qn", Attribute::kUndefined},
+    {"buxxltin", Attribute::kUndefined},
+    {"lrr", Attribute::kUndefined},
+    {"c99lr", Attribute::kUndefined},
+    {"colr", Attribute::kUndefined},
+    {"olHute", Attribute::kUndefined},
+    {"_oute", Attribute::kUndefined},
+    {"compte", Attribute::kUndefined},
+    {"djgnostic", Attribute::kUndefined},
+    {"mmEEagttostic", Attribute::kUndefined},
+    {"iagnosti", Attribute::kUndefined},
+    {"frrrment", Attribute::kUndefined},
+    {"fagmext", Attribute::kUndefined},
+    {"frzzent", Attribute::kUndefined},
+    {"groue", Attribute::kUndefined},
+    {"uouZp", Attribute::kUndefined},
+    {"00uo7TT", Attribute::kUndefined},
+    {"F", Attribute::kUndefined},
+    {"UJ", Attribute::kUndefined},
+    {"i", Attribute::kUndefined},
+    {"input_attachment_OOndex", Attribute::kUndefined},
+    {"inputattaMMment_index", Attribute::kUndefined},
+    {"input_Cttachment_index", Attribute::kUndefined},
+    {"iPPterpolQQte", Attribute::kUndefined},
+    {"inDDxxuuola88e", Attribute::kUndefined},
+    {"inmeqqpddlYYlle", Attribute::kUndefined},
     {"iFF__arian", Attribute::kUndefined},
-    {"rocaGNNion", Attribute::kUndefined},
-    {"Mocltion", Attribute::kUndefined},
+    {"rrnvNNGrian", Attribute::kUndefined},
+    {"Mnvarialt", Attribute::kUndefined},
     {"caton", Attribute::kUndefined},
-    {"qxst_ule", Attribute::kUndefined},
-    {"must_ue", Attribute::kUndefined},
+    {"qxcatiln", Attribute::kUndefined},
+    {"locatin", Attribute::kUndefined},
     {"ma44t_ue", Attribute::kUndefined},
-    {"WWiGe", Attribute::kUndefined},
-    {"sjjz", Attribute::kUndefined},
+    {"WWuGt_use", Attribute::kUndefined},
+    {"mujjt_us", Attribute::kUndefined},
     {"sjjze", Attribute::kUndefined},
-    {"vrtjx", Attribute::kUndefined},
-    {"vetex", Attribute::kUndefined},
+    {"sje", Attribute::kUndefined},
+    {"sie", Attribute::kUndefined},
     {"vert99x", Attribute::kUndefined},
-    {"worVVgyoup_size", Attribute::kUndefined},
-    {"workZZxoup_sze", Attribute::kUndefined},
+    {"verVVex", Attribute::kUndefined},
+    {"ZZxrtx", Attribute::kUndefined},
     {"w33kgvvoup_size", Attribute::kUndefined},
+    {"workgsoup9size", Attribute::kUndefined},
+    {"worgrFup_size", Attribute::kUndefined},
 };
 
 using AttributeParseTest = testing::TestWithParam<AttributeCase>;
diff --git a/src/tint/lang/wgsl/ast/builder.h b/src/tint/lang/wgsl/ast/builder.h
index 384b350..06ee086 100644
--- a/src/tint/lang/wgsl/ast/builder.h
+++ b/src/tint/lang/wgsl/ast/builder.h
@@ -37,6 +37,7 @@
 #include "src/tint/lang/core/interpolation.h"
 #include "src/tint/lang/core/number.h"
 #include "src/tint/lang/core/type/sampler_kind.h"
+#include "src/tint/lang/core/type/texel_buffer.h"
 #include "src/tint/lang/core/type/texture_dimension.h"
 #include "src/tint/lang/wgsl/ast/alias.h"
 #include "src/tint/lang/wgsl/ast/assignment_statement.h"
@@ -1298,6 +1299,11 @@
         /// @returns the external texture
         ast::Type external_texture() const { return (*this)("texture_external"); }
 
+        /// @returns the texel buffer
+        ast::Type texel_buffer(core::TexelFormat format, core::Access access) const {
+            return (*this)("texel_buffer", format, access);
+        }
+
         /// @param subtype the texture subtype.
         /// @returns the input attachment
         ast::Type input_attachment(ast::Type subtype) const {
diff --git a/src/tint/lang/wgsl/resolver/BUILD.bazel b/src/tint/lang/wgsl/resolver/BUILD.bazel
index 8899f2d..9375054 100644
--- a/src/tint/lang/wgsl/resolver/BUILD.bazel
+++ b/src/tint/lang/wgsl/resolver/BUILD.bazel
@@ -152,6 +152,7 @@
     "struct_pipeline_stage_use_test.cc",
     "subgroup_matrix_test.cc",
     "subgroups_extension_test.cc",
+    "texel_buffer_test.cc",
     "type_validation_test.cc",
     "unresolved_identifier_test.cc",
     "validation_test.cc",
diff --git a/src/tint/lang/wgsl/resolver/BUILD.cmake b/src/tint/lang/wgsl/resolver/BUILD.cmake
index 863543b..bbef83c 100644
--- a/src/tint/lang/wgsl/resolver/BUILD.cmake
+++ b/src/tint/lang/wgsl/resolver/BUILD.cmake
@@ -153,6 +153,7 @@
   lang/wgsl/resolver/struct_pipeline_stage_use_test.cc
   lang/wgsl/resolver/subgroup_matrix_test.cc
   lang/wgsl/resolver/subgroups_extension_test.cc
+  lang/wgsl/resolver/texel_buffer_test.cc
   lang/wgsl/resolver/type_validation_test.cc
   lang/wgsl/resolver/unresolved_identifier_test.cc
   lang/wgsl/resolver/validation_test.cc
diff --git a/src/tint/lang/wgsl/resolver/BUILD.gn b/src/tint/lang/wgsl/resolver/BUILD.gn
index 592731e..4c61360 100644
--- a/src/tint/lang/wgsl/resolver/BUILD.gn
+++ b/src/tint/lang/wgsl/resolver/BUILD.gn
@@ -153,6 +153,7 @@
       "struct_pipeline_stage_use_test.cc",
       "subgroup_matrix_test.cc",
       "subgroups_extension_test.cc",
+      "texel_buffer_test.cc",
       "type_validation_test.cc",
       "unresolved_identifier_test.cc",
       "validation_test.cc",
diff --git a/src/tint/lang/wgsl/resolver/resolver.cc b/src/tint/lang/wgsl/resolver/resolver.cc
index b6ed906..f76d25a 100644
--- a/src/tint/lang/wgsl/resolver/resolver.cc
+++ b/src/tint/lang/wgsl/resolver/resolver.cc
@@ -2678,6 +2678,8 @@
             return StorageTexture(ident, core::type::TextureDimension::k2dArray);
         case core::BuiltinType::kTextureStorage3D:
             return StorageTexture(ident, core::type::TextureDimension::k3d);
+        case core::BuiltinType::kTexelBuffer:
+            return TexelBuffer(ident);
         case core::BuiltinType::kInputAttachment:
             return InputAttachment(ident);
         case core::BuiltinType::kAtomicCompareExchangeResultI32:
@@ -3089,6 +3091,31 @@
     return validator_.SubgroupMatrix(out, ident->source) ? out : nullptr;
 }
 
+const core::type::TexelBuffer* Resolver::TexelBuffer(const ast::Identifier* ident) {
+    auto* tmpl_ident = TemplatedIdentifier(ident, 2);
+    if (DAWN_UNLIKELY(!tmpl_ident)) {
+        return nullptr;
+    }
+
+    auto format = sem_.GetTexelFormat(tmpl_ident->arguments[0]);
+    if (DAWN_UNLIKELY(format == core::TexelFormat::kUndefined)) {
+        return nullptr;
+    }
+
+    auto access = sem_.GetAccess(tmpl_ident->arguments[1]);
+    if (DAWN_UNLIKELY(access == core::Access::kUndefined)) {
+        return nullptr;
+    }
+
+    auto* out = b.Types().texel_buffer(format, access);
+
+    if (DAWN_UNLIKELY(!validator_.TexelBuffer(out, ident->source))) {
+        return nullptr;
+    }
+
+    return out;
+}
+
 const ast::TemplatedIdentifier* Resolver::TemplatedIdentifier(const ast::Identifier* ident,
                                                               size_t min_args,
                                                               size_t max_args /* = use min 0 */) {
diff --git a/src/tint/lang/wgsl/resolver/resolver.h b/src/tint/lang/wgsl/resolver/resolver.h
index 6e65f66..6e09356 100644
--- a/src/tint/lang/wgsl/resolver/resolver.h
+++ b/src/tint/lang/wgsl/resolver/resolver.h
@@ -226,6 +226,10 @@
     const core::type::StorageTexture* StorageTexture(const ast::Identifier* ident,
                                                      core::type::TextureDimension dim);
 
+    /// @returns a texel buffer resolved from the templated identifier @p ident.
+    /// @param ident the identifier to resolve
+    const core::type::TexelBuffer* TexelBuffer(const ast::Identifier* ident);
+
     /// @returns an input attachment resolved from the templated identifier @p ident
     const core::type::InputAttachment* InputAttachment(const ast::Identifier* ident);
 
diff --git a/src/tint/lang/wgsl/resolver/texel_buffer_test.cc b/src/tint/lang/wgsl/resolver/texel_buffer_test.cc
new file mode 100644
index 0000000..23173a6
--- /dev/null
+++ b/src/tint/lang/wgsl/resolver/texel_buffer_test.cc
@@ -0,0 +1,219 @@
+// Copyright 2025 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "src/tint/lang/wgsl/resolver/resolver.h"
+#include "src/tint/lang/wgsl/resolver/resolver_helper_test.h"
+
+namespace tint::resolver {
+namespace {
+
+using namespace tint::core::fluent_types;     // NOLINT
+using namespace tint::core::number_suffixes;  // NOLINT
+
+using ResolverTexelBufferTest = ResolverTest;
+
+struct FormatParams {
+    core::TexelFormat format;
+    bool is_valid;
+};
+
+#define VALID_FORMAT_CASE(FMT)       \
+    FormatParams {                   \
+        core::TexelFormat::FMT, true \
+    }
+
+static constexpr FormatParams kFormatCases[] = {
+    VALID_FORMAT_CASE(kBgra8Unorm), VALID_FORMAT_CASE(kR32Float),   VALID_FORMAT_CASE(kR32Sint),
+    VALID_FORMAT_CASE(kR32Uint),    VALID_FORMAT_CASE(kR8Unorm),    VALID_FORMAT_CASE(kRg32Float),
+    VALID_FORMAT_CASE(kRg32Sint),   VALID_FORMAT_CASE(kRg32Uint),   VALID_FORMAT_CASE(kRgba16Float),
+    VALID_FORMAT_CASE(kRgba16Sint), VALID_FORMAT_CASE(kRgba16Uint), VALID_FORMAT_CASE(kRgba32Float),
+    VALID_FORMAT_CASE(kRgba32Sint), VALID_FORMAT_CASE(kRgba32Uint), VALID_FORMAT_CASE(kRgba8Sint),
+    VALID_FORMAT_CASE(kRgba8Snorm), VALID_FORMAT_CASE(kRgba8Uint),  VALID_FORMAT_CASE(kRgba8Unorm),
+};
+#undef VALID_FORMAT_CASE
+
+using TexelBufferFormatTest = ResolverTestWithParam<FormatParams>;
+
+// Tests that the texel_buffer format is valid or invalid based on the
+// format parameter.
+TEST_P(TexelBufferFormatTest, Usage) {
+    auto& params = GetParam();
+    Require(wgsl::LanguageFeature::kTexelBuffers);
+
+    auto tb = ty(Source{{12, 34}}, "texel_buffer", tint::ToString(params.format),
+                 tint::ToString(core::Access::kRead));
+    GlobalVar("a", tb, Group(0_a), Binding(0_a));
+
+    if (params.is_valid) {
+        EXPECT_TRUE(r()->Resolve()) << r()->error();
+    } else {
+        EXPECT_FALSE(r()->Resolve());
+        EXPECT_EQ(r()->error(),
+                  "12:34 error: image format must be one of the texel formats "
+                  "specified for texel buffers in https://gpuweb.github.io/"
+                  "gpuweb/wgsl/#texel-formats");
+    }
+}
+INSTANTIATE_TEST_SUITE_P(ResolverTexelBufferTest,
+                         TexelBufferFormatTest,
+                         testing::ValuesIn(kFormatCases));
+
+// Requires 2 template arguments: format and access
+TEST_F(ResolverTexelBufferTest, MissingAccess) {
+    Require(wgsl::LanguageFeature::kTexelBuffers);
+    auto tb = ty(Source{{12, 34}}, "texel_buffer", "rgba32float");
+    GlobalVar("a", tb, Group(0_a), Binding(0_a));
+
+    EXPECT_FALSE(r()->Resolve());
+    EXPECT_EQ(r()->error(), R"(12:34 error: 'texel_buffer' requires 2 template arguments)");
+}
+
+// Access must be read or read_write
+TEST_F(ResolverTexelBufferTest, InvalidAccess) {
+    Require(wgsl::LanguageFeature::kTexelBuffers);
+    auto tb =
+        ty(Source{{12, 34}}, "texel_buffer", "rgba32float", Expr(Source{{12, 34}}, "read_only"));
+    GlobalVar("a", tb, Group(0_a), Binding(0_a));
+
+    EXPECT_FALSE(r()->Resolve());
+    EXPECT_EQ(r()->error(),
+              R"(12:34 error: unresolved access 'read_only'
+12:34 note: Possible values: 'read', 'read_write', 'write')");
+}
+
+// Access must be read or read_write, not write
+TEST_F(ResolverTexelBufferTest, WriteOnlyAccess) {
+    Require(wgsl::LanguageFeature::kTexelBuffers);
+    auto tb = ty(Source{{12, 34}}, "texel_buffer", "rgba32float", "write");
+    GlobalVar("a", tb, Group(0_a), Binding(0_a));
+
+    EXPECT_FALSE(r()->Resolve());
+    EXPECT_EQ(r()->error(), R"(12:34 error: texel_buffer access must be read or read_write)");
+}
+
+// Requires the texel_buffer language feature to be enabled
+TEST_F(ResolverTexelBufferTest, FeatureRequired) {
+    auto tb = ty(Source{{12, 34}}, "texel_buffer", "rgba32float", "read");
+    GlobalVar("a", tb, Group(0_a), Binding(0_a));
+
+    Resolver resolver{this, wgsl::AllowedFeatures{}};
+    EXPECT_FALSE(resolver.Resolve());
+    EXPECT_EQ(resolver.error(),
+              "12:34 error: use of 'texel_buffer' requires the texel_buffer language "
+              "feature, which is not allowed in the current environment");
+}
+
+enum class SubtypeKind {
+    kF16,
+    kI8,
+    kU8,
+};
+
+struct SubtypeParams {
+    SubtypeKind kind;
+};
+
+static constexpr SubtypeParams kInvalidSubtypeCases[] = {
+    {SubtypeKind::kF16},
+    {SubtypeKind::kI8},
+    {SubtypeKind::kU8},
+};
+
+using TexelBufferSubtypeTest = ResolverTestWithParam<SubtypeParams>;
+
+// Storage subtype must be f32, i32 or u32
+TEST_P(TexelBufferSubtypeTest, InvalidSubtype) {
+    auto& params = GetParam();
+    Require(wgsl::LanguageFeature::kTexelBuffers);
+
+    const core::type::Type* subtype = nullptr;
+    switch (params.kind) {
+        case SubtypeKind::kF16:
+            subtype = create<core::type::F16>();
+            break;
+        case SubtypeKind::kI8:
+            subtype = create<core::type::I8>();
+            break;
+        case SubtypeKind::kU8:
+            subtype = create<core::type::U8>();
+            break;
+    }
+
+    auto* tb_ty = create<core::type::TexelBuffer>(core::TexelFormat::kRgba32Float,
+                                                  core::Access::kRead, subtype);
+
+    EXPECT_FALSE(v()->TexelBuffer(tb_ty, Source{{12, 34}}));
+    EXPECT_EQ(r()->error(),
+              "12:34 error: texel_buffer<format, access>: storage subtype must "
+              "be f32, i32 or u32");
+}
+
+INSTANTIATE_TEST_SUITE_P(ResolverTexelBufferTest,
+                         TexelBufferSubtypeTest,
+                         testing::ValuesIn(kInvalidSubtypeCases));
+
+// texel_buffer used as struct member
+TEST_F(ResolverTexelBufferTest, StructMember) {
+    Require(wgsl::LanguageFeature::kTexelBuffers);
+
+    auto* s = Structure(
+        "S", Vector{
+                 Member("buf", ty(Source{{12, 34}}, "texel_buffer", "rgba32float", "read")),
+             });
+
+    GlobalVar("g", ty.Of(s), core::AddressSpace::kStorage, core::Access::kRead, Binding(0_a),
+              Group(0_a));
+
+    EXPECT_FALSE(r()->Resolve());
+    EXPECT_EQ(r()->error(),
+              "error: texel_buffer<rgba32float, read> cannot be used as the "
+              "type of a structure member");
+}
+
+// texel_buffer used as function parameter
+TEST_F(ResolverTexelBufferTest, FunctionParameter) {
+    Require(wgsl::LanguageFeature::kTexelBuffers);
+
+    Func("f", Vector{Param("p", ty(Source{{12, 34}}, "texel_buffer", "rgba32float", "read_write"))},
+         ty.void_(), Empty);
+
+    EXPECT_TRUE(r()->Resolve()) << r()->error();
+}
+
+// Global variable missing binding or group attributes
+TEST_F(ResolverTexelBufferTest, MissingBinding) {
+    Require(wgsl::LanguageFeature::kTexelBuffers);
+    GlobalVar(Source{{12, 34}}, "G", ty("texel_buffer", "rgba32float", "read"));
+
+    EXPECT_FALSE(r()->Resolve());
+    EXPECT_EQ(r()->error(),
+              "12:34 error: resource variables require '@group' and "
+              "'@binding' attributes");
+}
+
+}  // namespace
+}  // namespace tint::resolver
diff --git a/src/tint/lang/wgsl/resolver/validator.cc b/src/tint/lang/wgsl/resolver/validator.cc
index bf9e4cd..dd395ec 100644
--- a/src/tint/lang/wgsl/resolver/validator.cc
+++ b/src/tint/lang/wgsl/resolver/validator.cc
@@ -502,6 +502,38 @@
     return true;
 }
 
+bool Validator::TexelBuffer(const core::type::TexelBuffer* t, const Source& source) const {
+    if (!allowed_features_.features.count(wgsl::LanguageFeature::kTexelBuffers)) {
+        AddError(source) << "use of " << style::Type("texel_buffer")
+                         << " requires the texel_buffer language feature, which is not allowed "
+                            "in the current environment";
+        return false;
+    }
+
+    if (!IsValidStorageTextureTexelFormat(t->TexelFormat())) {
+        AddError(source) << "texel_buffer format must be one of the texel formats specified for "
+                            "texel buffers in https://gpuweb.github.io/gpuweb/wgsl/#texel-formats";
+        return false;
+    }
+
+    if (!t->Type()->IsAnyOf<core::type::F32, core::type::I32, core::type::U32>()) {
+        AddError(source) << "texel_buffer<format, access>: storage subtype must be f32, i32 or u32";
+        return false;
+    }
+
+    if (t->Dim() != core::type::TextureDimension::k1d) {
+        AddError(source) << "texel_buffer must be a 1d texture";
+        return false;
+    }
+
+    if (t->Access() != core::Access::kRead && t->Access() != core::Access::kReadWrite) {
+        AddError(source) << "texel_buffer access must be read or read_write";
+        return false;
+    }
+
+    return true;
+}
+
 bool Validator::Materialize(const core::type::Type* to,
                             const core::type::Type* from,
                             const Source& source) const {
diff --git a/src/tint/lang/wgsl/resolver/validator.h b/src/tint/lang/wgsl/resolver/validator.h
index 6dfa0ac..3a76e85 100644
--- a/src/tint/lang/wgsl/resolver/validator.h
+++ b/src/tint/lang/wgsl/resolver/validator.h
@@ -430,6 +430,12 @@
     /// @returns true on success, false otherwise
     bool StorageTexture(const core::type::StorageTexture* t, const Source& source) const;
 
+    /// Validates a texel buffer
+    /// @param t the texel buffer to validate
+    /// @param source the source of the texel buffer
+    /// @returns true on success, false otherwise
+    bool TexelBuffer(const core::type::TexelBuffer* t, const Source& source) const;
+
     /// Validates a sampled texture
     /// @param t the texture to validate
     /// @param source the source of the texture