<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE language [
    <!ENTITY dec_int "(?:[0-9][0-9]*)">
    <!ENTITY hex_int "(?:[0-9a-fA-F][0-9a-fA-F]*)">
]>
<!--
    WGSL (WebGPU Shading Language) syntax highlighting
    Reference: https://www.w3.org/TR/WGSL/
-->
<language name="WGSL" section="3D" extensions="*.wgsl" mimetype="text/x-wgsl" version="1" kateversion="5.62" indenter="cstyle" author="" license="MIT">
    <highlighting>
        <list name="keywords">
            <item>alias</item>
            <item>break</item>
            <item>case</item>
            <item>const</item>
            <item>const_assert</item>
            <item>continue</item>
            <item>continuing</item>
            <item>default</item>
            <item>diagnostic</item>
            <item>discard</item>
            <item>else</item>
            <item>enable</item>
            <item>fn</item>
            <item>for</item>
            <item>if</item>
            <item>let</item>
            <item>loop</item>
            <item>override</item>
            <item>requires</item>
            <item>return</item>
            <item>struct</item>
            <item>switch</item>
            <item>var</item>
            <item>while</item>
        </list>
        <list name="literals">
            <item>true</item>
            <item>false</item>
        </list>
        <list name="types">
            <item>bool</item>
            <item>f16</item>
            <item>f32</item>
            <item>i32</item>
            <item>u32</item>

            <item>vec2</item>
            <item>vec3</item>
            <item>vec4</item>

            <item>vec2i</item>
            <item>vec3i</item>
            <item>vec4i</item>
            <item>vec2u</item>
            <item>vec3u</item>
            <item>vec4u</item>
            <item>vec2f</item>
            <item>vec3f</item>
            <item>vec4f</item>
            <item>vec2h</item>
            <item>vec3h</item>
            <item>vec4h</item>
            <item>vec2b</item>
            <item>vec3b</item>
            <item>vec4b</item>

            <item>mat2x2</item>
            <item>mat2x3</item>
            <item>mat2x4</item>
            <item>mat3x2</item>
            <item>mat3x3</item>
            <item>mat3x4</item>
            <item>mat4x2</item>
            <item>mat4x3</item>
            <item>mat4x4</item>

            <item>mat2x2f</item>
            <item>mat2x3f</item>
            <item>mat2x4f</item>
            <item>mat3x2f</item>
            <item>mat3x3f</item>
            <item>mat3x4f</item>
            <item>mat4x2f</item>
            <item>mat4x3f</item>
            <item>mat4x4f</item>
            <item>mat2x2h</item>
            <item>mat2x3h</item>
            <item>mat2x4h</item>
            <item>mat3x2h</item>
            <item>mat3x3h</item>
            <item>mat3x4h</item>
            <item>mat4x2h</item>
            <item>mat4x3h</item>
            <item>mat4x4h</item>

            <item>array</item>
            <item>atomic</item>
            <item>ptr</item>

            <item>sampler</item>
            <item>sampler_comparison</item>

            <item>texture_1d</item>
            <item>texture_2d</item>
            <item>texture_2d_array</item>
            <item>texture_3d</item>
            <item>texture_cube</item>
            <item>texture_cube_array</item>
            <item>texture_multisampled_2d</item>
            <item>texture_storage_1d</item>
            <item>texture_storage_2d</item>
            <item>texture_storage_2d_array</item>
            <item>texture_storage_3d</item>
            <item>texture_depth_2d</item>
            <item>texture_depth_2d_array</item>
            <item>texture_depth_cube</item>
            <item>texture_depth_cube_array</item>
            <item>texture_depth_multisampled_2d</item>
            <item>texture_external</item>
        </list>
        <list name="address_space">
            <item>function</item>
            <item>private</item>
            <item>workgroup</item>
            <item>uniform</item>
            <item>storage</item>
        </list>
        <list name="access_mode">
            <item>read</item>
            <item>write</item>
            <item>read_write</item>
        </list>
        <list name="texel_format">
            <item>rgba8unorm</item>
            <item>rgba8snorm</item>
            <item>rgba8uint</item>
            <item>rgba8sint</item>
            <item>rgba16uint</item>
            <item>rgba16sint</item>
            <item>rgba16float</item>
            <item>r32uint</item>
            <item>r32sint</item>
            <item>r32float</item>
            <item>rg32uint</item>
            <item>rg32sint</item>
            <item>rg32float</item>
            <item>rgba32uint</item>
            <item>rgba32sint</item>
            <item>rgba32float</item>
            <item>bgra8unorm</item>
            <item>r8unorm</item>
            <item>r8snorm</item>
            <item>r8uint</item>
            <item>r8sint</item>
            <item>rg8unorm</item>
            <item>rg8snorm</item>
            <item>rg8uint</item>
            <item>rg8sint</item>
            <item>r16uint</item>
            <item>r16sint</item>
            <item>r16float</item>
            <item>r16unorm</item>
            <item>r16snorm</item>
            <item>rg16uint</item>
            <item>rg16sint</item>
            <item>rg16float</item>
            <item>rg16unorm</item>
            <item>rg16snorm</item>
            <item>rgba16unorm</item>
            <item>rgba16snorm</item>
            <item>rgb10a2unorm</item>
            <item>rgb10a2uint</item>
            <item>rg11b10ufloat</item>
        </list>
        <list name="builtin_functions">
            <!-- Value built-in functions -->
            <item>abs</item>
            <item>acos</item>
            <item>acosh</item>
            <item>all</item>
            <item>any</item>
            <item>arrayLength</item>
            <item>asin</item>
            <item>asinh</item>
            <item>atan</item>
            <item>atan2</item>
            <item>atanh</item>
            <item>ceil</item>
            <item>clamp</item>
            <item>cos</item>
            <item>cosh</item>
            <item>countLeadingZeros</item>
            <item>countOneBits</item>
            <item>countTrailingZeros</item>
            <item>cross</item>
            <item>degrees</item>
            <item>determinant</item>
            <item>distance</item>
            <item>dot</item>
            <item>dot4I8Packed</item>
            <item>dot4U8Packed</item>
            <item>dpdx</item>
            <item>dpdxCoarse</item>
            <item>dpdxFine</item>
            <item>dpdy</item>
            <item>dpdyCoarse</item>
            <item>dpdyFine</item>
            <item>exp</item>
            <item>exp2</item>
            <item>extractBits</item>
            <item>faceForward</item>
            <item>firstLeadingBit</item>
            <item>firstTrailingBit</item>
            <item>floor</item>
            <item>fma</item>
            <item>fract</item>
            <item>frexp</item>
            <item>fwidth</item>
            <item>fwidthCoarse</item>
            <item>fwidthFine</item>
            <item>insertBits</item>
            <item>inverseSqrt</item>
            <item>ldexp</item>
            <item>length</item>
            <item>log</item>
            <item>log2</item>
            <item>max</item>
            <item>min</item>
            <item>mix</item>
            <item>modf</item>
            <item>normalize</item>
            <item>pack2x16float</item>
            <item>pack2x16snorm</item>
            <item>pack2x16unorm</item>
            <item>pack4x8snorm</item>
            <item>pack4x8unorm</item>
            <item>pack4xI8</item>
            <item>pack4xU8</item>
            <item>pack4xI8Clamp</item>
            <item>pack4xU8Clamp</item>
            <item>pow</item>
            <item>quantizeToF16</item>
            <item>radians</item>
            <item>reflect</item>
            <item>refract</item>
            <item>reverseBits</item>
            <item>round</item>
            <item>saturate</item>
            <item>select</item>
            <item>sign</item>
            <item>sin</item>
            <item>sinh</item>
            <item>smoothstep</item>
            <item>sqrt</item>
            <item>step</item>
            <item>storageBarrier</item>
            <item>tan</item>
            <item>tanh</item>
            <item>transpose</item>
            <item>trunc</item>
            <item>unpack2x16float</item>
            <item>unpack2x16snorm</item>
            <item>unpack2x16unorm</item>
            <item>unpack4x8snorm</item>
            <item>unpack4x8unorm</item>
            <item>unpack4xI8</item>
            <item>unpack4xU8</item>
            <item>workgroupBarrier</item>
            <item>workgroupUniformLoad</item>
            <item>textureBarrier</item>
            <!-- Texture built-in functions -->
            <item>textureDimensions</item>
            <item>textureGather</item>
            <item>textureGatherCompare</item>
            <item>textureLoad</item>
            <item>textureNumLayers</item>
            <item>textureNumLevels</item>
            <item>textureNumSamples</item>
            <item>textureSample</item>
            <item>textureSampleBias</item>
            <item>textureSampleCompare</item>
            <item>textureSampleCompareLevel</item>
            <item>textureSampleGrad</item>
            <item>textureSampleLevel</item>
            <item>textureSampleBaseClampToEdge</item>
            <item>textureStore</item>
            <!-- Atomic built-in functions -->
            <item>atomicLoad</item>
            <item>atomicStore</item>
            <item>atomicAdd</item>
            <item>atomicSub</item>
            <item>atomicMax</item>
            <item>atomicMin</item>
            <item>atomicAnd</item>
            <item>atomicOr</item>
            <item>atomicXor</item>
            <item>atomicExchange</item>
            <item>atomicCompareExchangeWeak</item>
            <!-- Subgroup built-in functions -->
            <item>subgroupBallot</item>
            <item>subgroupBroadcast</item>
            <item>subgroupBroadcastFirst</item>
            <item>subgroupAdd</item>
            <item>subgroupExclusiveAdd</item>
            <item>subgroupInclusiveAdd</item>
            <item>subgroupMul</item>
            <item>subgroupExclusiveMul</item>
            <item>subgroupInclusiveMul</item>
            <item>subgroupAnd</item>
            <item>subgroupOr</item>
            <item>subgroupXor</item>
            <item>subgroupExclusiveAnd</item>
            <item>subgroupExclusiveOr</item>
            <item>subgroupExclusiveXor</item>
            <item>subgroupInclusiveAnd</item>
            <item>subgroupInclusiveOr</item>
            <item>subgroupInclusiveXor</item>
            <item>subgroupShuffle</item>
            <item>subgroupShuffleDown</item>
            <item>subgroupShuffleUp</item>
            <item>subgroupShuffleXor</item>
            <item>subgroupAll</item>
            <item>subgroupAny</item>
            <item>subgroupElect</item>
            <item>subgroupMin</item>
            <item>subgroupMax</item>
            <item>subgroupExclusiveMin</item>
            <item>subgroupExclusiveMax</item>
            <item>subgroupInclusiveMin</item>
            <item>subgroupInclusiveMax</item>
            <!-- Quad built-in functions -->
            <item>quadBroadcast</item>
            <item>quadSwapX</item>
            <item>quadSwapY</item>
            <item>quadSwapDiagonal</item>
            <!-- Other -->
            <item>bitcast</item>
        </list>
        <list name="builtin_values">
            <item>position</item>
            <item>vertex_index</item>
            <item>instance_index</item>
            <item>front_facing</item>
            <item>frag_depth</item>
            <item>local_invocation_id</item>
            <item>local_invocation_index</item>
            <item>global_invocation_id</item>
            <item>workgroup_id</item>
            <item>num_workgroups</item>
            <item>sample_index</item>
            <item>sample_mask</item>
            <item>subgroup_invocation_id</item>
            <item>subgroup_size</item>
        </list>
        <list name="attributes">
            <item>align</item>
            <item>binding</item>
            <item>builtin</item>
            <item>compute</item>
            <item>const</item>
            <item>diagnostic</item>
            <item>fragment</item>
            <item>group</item>
            <item>id</item>
            <item>interpolate</item>
            <item>invariant</item>
            <item>location</item>
            <item>must_use</item>
            <item>size</item>
            <item>vertex</item>
            <item>workgroup_size</item>
            <item>blend_src</item>
        </list>
        <contexts>
            <context attribute="Normal Text" lineEndContext="#stay" name="Normal">
                <DetectSpaces/>
                <Detect2Chars char="/" char1="/" attribute="Comment" context="SingleLineComment"/>
                <Detect2Chars char="/" char1="*" attribute="Comment" context="MultiLineComment" beginRegion="Comment"/>

                <DetectChar attribute="Attribute" context="Attribute" char="@"/>

                <keyword String="keywords" attribute="Keyword" context="#stay"/>
                <keyword String="literals" attribute="Constant" context="#stay"/>
                <keyword String="types" attribute="Data Type" context="#stay"/>
                <keyword String="builtin_functions" attribute="Built-in" context="#stay"/>
                <keyword String="builtin_values" attribute="Built-in" context="#stay"/>
                <keyword String="texel_format" attribute="Data Type" context="#stay"/>
                <keyword String="address_space" attribute="Data Type" context="#stay"/>
                <keyword String="access_mode" attribute="Data Type" context="#stay"/>

                <!-- Hex float -->
                <RegExpr attribute="Hex Float" context="#stay" String="\b0[xX](&hex_int;\.&hex_int;([pP][+-]?&dec_int;)?|&hex_int;[pP][+-]?&dec_int;|\.&hex_int;([pP][+-]?&dec_int;)?)[fh]?\b"/>
                <!-- Decimal float -->
                <RegExpr attribute="Float" context="#stay" String="\b&dec_int;(\.(&dec_int;([eE][+-]?&dec_int;)?|[eE][+-]?&dec_int;)?[fh]?|[eE][+-]?&dec_int;[fh]?|[fh])\b|\.&dec_int;([eE][+-]?&dec_int;)?[fh]?\b"/>
                <!-- Hex integer -->
                <RegExpr attribute="Hex" context="#stay" String="\b0[xX]&hex_int;[iu]?\b"/>
                <!-- Decimal integer -->
                <RegExpr attribute="Decimal" context="#stay" String="\b(0|[1-9][0-9]*)[iu]?\b"/>

                <RegExpr attribute="Function" context="#stay" String="\b[a-zA-Z_][a-zA-Z0-9_]*(?=\s*\()"/>

                <DetectChar attribute="Symbol" context="#stay" char="{" beginRegion="Brace1"/>
                <DetectChar attribute="Symbol" context="#stay" char="}" endRegion="Brace1"/>
                <DetectChar attribute="Symbol" context="Member" char="."/>
                <AnyChar attribute="Symbol" context="#stay" String="+-/*%&lt;&gt;[]()^|&amp;~=!:;,?"/>

                <DetectIdentifier/>
            </context>
            <context name="Member" attribute="Normal Text" lineEndContext="#pop" fallthroughContext="#pop">
                <RegExpr attribute="Function" context="#pop" String="\b[a-zA-Z_][a-zA-Z0-9_]*\b"/>
            </context>
            <context name="Attribute" attribute="Attribute" lineEndContext="#pop" fallthroughContext="#pop">
                <keyword String="attributes" attribute="Attribute" context="#pop"/>
                <RegExpr attribute="Attribute" context="#pop" String="\b[a-zA-Z_][a-zA-Z0-9_]*\b"/>
            </context>
            <context name="SingleLineComment" attribute="Comment" lineEndContext="#pop">
                <DetectSpaces/>
                <IncludeRules context="##Comments"/>
            </context>
            <context name="MultiLineComment" attribute="Comment" lineEndContext="#stay">
                <Detect2Chars attribute="Comment" context="MultiLineComment" char="/" char1="*" beginRegion="Comment"/>
                <Detect2Chars attribute="Comment" context="#pop" char="*" char1="/" endRegion="Comment"/>
                <DetectSpaces/>
                <IncludeRules context="##Comments"/>
            </context>
        </contexts>
        <itemDatas>
            <itemData name="Normal Text"  defStyleNum="dsNormal" spellChecking="false"/>
            <itemData name="Keyword"      defStyleNum="dsKeyword" spellChecking="false"/>
            <itemData name="Data Type"    defStyleNum="dsDataType" spellChecking="false"/>
            <itemData name="Constant"     defStyleNum="dsConstant" spellChecking="false"/>
            <itemData name="Built-in"     defStyleNum="dsBuiltIn" bold="1" spellChecking="false"/>
            <itemData name="Function"     defStyleNum="dsFunction" spellChecking="false"/>
            <itemData name="Attribute"    defStyleNum="dsAttribute" spellChecking="false"/>
            <itemData name="Decimal"      defStyleNum="dsDecVal" spellChecking="false"/>
            <itemData name="Hex"          defStyleNum="dsBaseN" spellChecking="false"/>
            <itemData name="Float"        defStyleNum="dsFloat" spellChecking="false"/>
            <itemData name="Hex Float"    defStyleNum="dsFloat" spellChecking="false"/>
            <itemData name="Symbol"       defStyleNum="dsOperator" spellChecking="false"/>
            <itemData name="Comment"      defStyleNum="dsComment"/>
        </itemDatas>
    </highlighting>
    <general>
        <comments>
            <comment name="singleLine" start="//"/>
            <comment name="multiLine" start="/*" end="*/" region="Comment"/>
        </comments>
        <keywords casesensitive="true" additionalDeliminator="@"/>
    </general>
</language>
<!-- kate: replace-tabs on; tab-width 4; indent-width 4; -->
