name: Shaders

on:
  push:
    branches-ignore: [
        # We don't need to run on dependabot PRs.
        "dependabot/**",
        # This is the branch the merge queue creates.
        "gh-readonly-queue/**",
      ]
    tags: [v0.*]
  pull_request:
  merge_group:

env:
  # Sourced from https://vulkan.lunarg.com/sdk/home#linux
  #
  # We don't include the 4th version number, as it's not used in any URL.
  VULKAN_SDK_VERSION: "1.4.304"

  # Sourced from https://github.com/microsoft/DirectXShaderCompiler/releases
  #
  # Must also be changed in ci.yaml
  DXC_RELEASE: "v1.8.2407"
  DXC_FILENAME: "dxc_2024_07_31_clang_cl.zip"

jobs:
  naga-validate-windows:
    name: "Validate: HLSL"
    runs-on: windows-latest
    steps:
      - uses: actions/checkout@v4

      - name: Debug symbols to `line-tables-only`
        shell: bash
        run: |
          mkdir -p .cargo

          cat <<EOF >> .cargo/config.toml
            [profile.dev]
            debug = "line-tables-only"
          EOF

      - uses: Swatinem/rust-cache@v2
        with:
          workspaces: |
            naga/xtask -> naga/xtask/target

      # We must have the FXC job before the DXC job, so the DXC PATH has priority
      # over the FXC PATH. This is because the windows kits also include an older
      # version of DXC, which we don't want to use.
      - name: Setup FXC
        run: |
          Get-Childitem -Path "C:\Program Files (x86)\Windows Kits\10\bin\**\x64\fxc.exe" `
          | Sort-Object -Property LastWriteTime -Descending `
          | Select-Object -First 1 `
          | Split-Path -Parent `
          | Out-File -FilePath $Env:GITHUB_PATH -Encoding utf8 -Append
        shell: powershell

      - name: Setup DXC
        shell: bash
        run: |
          set -e

          curl.exe -L --retry 5 https://github.com/microsoft/DirectXShaderCompiler/releases/download/$DXC_RELEASE/$DXC_FILENAME -o dxc.zip
          7z.exe e dxc.zip -odxc bin/x64/{dxc.exe,dxcompiler.dll,dxil.dll}

          # We need to use cygpath to convert PWD to a windows path as we're using bash.
          cygpath --windows "$PWD/dxc" >> "$GITHUB_PATH"

      - name: Validate
        shell: bash
        run: |
          set -e

          dxc --version

          cd naga
          cargo xtask validate hlsl dxc
          cargo xtask validate hlsl fxc

  naga-validate-macos:
    name: "Validate: MSL"
    runs-on: macos-14
    steps:
      - uses: actions/checkout@v4

      - name: Debug symbols to line-tables-only
        shell: bash
        run: |
          mkdir -p .cargo

          cat <<EOF >> .cargo/config.toml
            [profile.dev]
            debug = "line-tables-only"
          EOF

      - uses: Swatinem/rust-cache@v2
        with:
          workspaces: |
            naga/xtask -> naga/xtask/target

      - run: |
          cd naga
          cargo xtask validate msl

  naga-validate-linux:
    name: "Validate: SPIR-V/GLSL/DOT/WGSL"
    runs-on: ubuntu-24.04
    steps:
      - uses: actions/checkout@v4

      - name: Install Vulkan SDK
        shell: bash
        run: |
          set -e

          sudo apt-get update -y -qq

          # vulkan sdk
          wget -qO - https://packages.lunarg.com/lunarg-signing-key-pub.asc | sudo apt-key add -
          sudo wget -qO /etc/apt/sources.list.d/lunarg-vulkan-$VULKAN_SDK_VERSION-noble.list https://packages.lunarg.com/vulkan/$VULKAN_SDK_VERSION/lunarg-vulkan-$VULKAN_SDK_VERSION-noble.list

          sudo apt-get update
          sudo apt install -y vulkan-sdk

      - name: Install Graphviz
        run: sudo apt-get install graphviz

      - name: Debug symbols to `line-tables-only`
        shell: bash
        run: |
          mkdir -p .cargo

          cat <<EOF >> .cargo/config.toml
            [profile.dev]
            debug = "line-tables-only"
          EOF

      - uses: Swatinem/rust-cache@v2
        with:
          workspaces: |
            naga/xtask -> naga/xtask/target

      - run: cd naga; cargo xtask validate spv

      - run: cd naga; cargo xtask validate glsl

      - run: cd naga; cargo xtask validate dot

      - run: cd naga; cargo xtask validate wgsl
