name: backends

on:
  workflow_dispatch:
    inputs:
      version:
        description: 'version'
        required: true
        type: string
      commit:
        description: 'sd.cpp commit'
        required: true
        type: string

jobs:
  windows:
    runs-on: windows-latest
          
    strategy:
      matrix:
        include:
          - build: 'noavx'
            defines: '-DGGML_AVX=OFF -DGGML_AVX2=OFF -DGGML_FMA=OFF -DSD_BUILD_SHARED_LIBS=ON'
          - build: 'avx'
            defines: '-DGGML_AVX2=OFF -DSD_BUILD_SHARED_LIBS=ON'
          - build: 'avx2'
            defines: '-DGGML_AVX2=ON -DSD_BUILD_SHARED_LIBS=ON'
          - build: 'avx512'
            defines: '-DGGML_AVX512=ON -DSD_BUILD_SHARED_LIBS=ON'
          - build: 'cuda11'
            defines: '-DSD_CUBLAS=ON -DSD_BUILD_SHARED_LIBS=ON'
          - build: 'cuda12'
            defines: '-DSD_CUBLAS=ON -DSD_BUILD_SHARED_LIBS=ON'
          - build: 'rocm5'
            defines: '-G Ninja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DSD_HIPBLAS=ON -DCMAKE_BUILD_TYPE=Release -DAMDGPU_TARGETS="gfx1100;gfx1102;gfx1030" -DSD_BUILD_SHARED_LIBS=ON'

    steps:
      - name: Checkout
        id: checkout
        uses: actions/checkout@v4.1.2
        with:
          repository: 'leejet/stable-diffusion.cpp'
          ref: '${{ github.event.inputs.commit }}'
          submodules: recursive

      - name: Install cuda-toolkit
        id: cuda-toolkit-11
        if: ${{ matrix.build == 'cuda11' }}
        uses: Jimver/cuda-toolkit@v0.2.14
        with:
          cuda: '11.7.1'
          method: network
          sub-packages: '["nvcc", "cudart", "cublas", "cublas_dev", "thrust", "visual_studio_integration"]'
          use-github-cache: false
          use-local-cache: false

      - name: Install cuda-toolkit
        id: cuda-toolkit-12
        if: ${{ matrix.build == 'cuda12' }}
        uses: Jimver/cuda-toolkit@v0.2.14
        with:
          cuda: '12.2.0'
          method: network
          sub-packages: '["nvcc", "cudart", "cublas", "cublas_dev", "thrust", "visual_studio_integration"]'
          use-github-cache: false
          use-local-cache: false

      - name: Install rocm-toolkit
        id: rocm-toolkit
        if: ${{ matrix.build == 'rocm5' }}
        uses: Cyberhan123/rocm-toolkit@v0.1.0
        with:
          rocm: '5.5.0'

      - name: Install Ninja
        id: install-ninja
        if: ${{ matrix.build == 'rocm5' }}
        uses: urkle/action-get-ninja@v1
        with:
          version: 1.11.1

      - name: Build
        id: cmake_build
        run: |
          mkdir build
          cd build
          cmake .. ${{ matrix.defines }}
          cmake --build . --config Release
      
      - name: Upload artifact
        id: upload_artifact
        if: ${{ matrix.build != 'rocm5' }}
        uses: actions/upload-artifact@v4.3.1
        with:
          name: windows-${{ matrix.build }}
          path: .\build\bin\Release\stable-diffusion.dll

      - name: Upload artifact Rocm
        id: upload_artifact_rocm
        if: ${{ matrix.build == 'rocm5' }}
        uses: actions/upload-artifact@v4.3.1
        with:
          name: windows-${{ matrix.build }}
          path: .\build\bin\stable-diffusion.dll

  linux:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        include:
          - build: 'noavx'
            defines: '-DGGML_AVX=OFF -DGGML_AVX2=OFF -DGGML_FMA=OFF -DSD_BUILD_SHARED_LIBS=ON'
          - build: 'avx'
            defines: '-DGGML_AVX2=OFF -DSD_BUILD_SHARED_LIBS=ON'
          - build: 'avx2'
            defines: '-DGGML_AVX2=ON -DSD_BUILD_SHARED_LIBS=ON'
          - build: 'avx512'
            defines: '-DGGML_AVX512=ON -DSD_BUILD_SHARED_LIBS=ON'
          - build: 'cuda11'
            defines: '-DSD_CUBLAS=ON -DSD_BUILD_SHARED_LIBS=ON'
          - build: 'cuda12'
            defines: '-DSD_CUBLAS=ON -DSD_BUILD_SHARED_LIBS=ON'
            
    steps:
      - name: Checkout
        id: checkout
        uses: actions/checkout@v4.1.2
        with:
          repository: 'leejet/stable-diffusion.cpp'
          ref: '${{ github.event.inputs.commit }}'
          submodules: recursive
   
      - name: Install cuda-toolkit
        id: cuda-toolkit-11
        if: ${{ matrix.build == 'cuda11' }}
        uses: Jimver/cuda-toolkit@v0.2.14
        with:
          cuda: '11.7.1'
          method: network
          use-github-cache: false
          use-local-cache: false
   
      - name: Install cuda-toolkit
        id: cuda-toolkit-12
        if: ${{ matrix.build == 'cuda12' }}
        uses: Jimver/cuda-toolkit@v0.2.14
        with:
          cuda: '12.2.0'
          method: network
          use-github-cache: false
          use-local-cache: false
   
      - name: Build
        id: cmake_build
        run: |
          mkdir build
          cd build
          cmake .. ${{ matrix.defines }}
          cmake --build . --config Release
                  
      - name: Upload artifact
        id: upload_artifact
        uses: actions/upload-artifact@v4.3.1
        with:
          name: linux-${{ matrix.build }}
          path: ./build/bin/libstable-diffusion.so

  linux-hip:
    runs-on: ubuntu-22.04
    container: rocm/dev-ubuntu-22.04:6.0.2
   
    steps:
      - name: Dependencies
        id: depends
        run: |
          sudo apt-get update
          sudo apt-get install -y build-essential git cmake rocblas-dev hipblas-dev
          hipconfig
          
      - name: Clone
        id: checkout
        uses: actions/checkout@v3
        with:
          repository: 'leejet/stable-diffusion.cpp'
          ref: '${{ github.event.inputs.commit }}'
          submodules: recursive
                    
      - name: Build
        id: cmake_build
        run: |
          mkdir build
          cd build
          cmake .. -DCMAKE_C_COMPILER=hipcc -DCMAKE_CXX_COMPILER=hipcc -DSD_HIPBLAS=ON -DCMAKE_BUILD_TYPE=Release -DAMDGPU_TARGETS="gfx1100;gfx1102;gfx1030" -DSD_BUILD_SHARED_LIBS=ON
          cmake --build . --config Release
               
      - name: Upload artifact Rocm
        id: upload_artifact_rocm
        uses: actions/upload-artifact@v4.3.1
        with:
          name: linux-rocm6
          path: ./build/bin/libstable-diffusion.so
          
  osx:
    runs-on: macos-latest
          
    strategy:
      matrix:
        include:
          - build: 'noavx'
            defines: '-DCMAKE_OSX_ARCHITECTURES="x86_64" -DGGML_AVX=OFF -DGGML_AVX2=OFF -DGGML_FMA=OFF -DSD_BUILD_SHARED_LIBS=ON'
          - build: 'avx'
            defines: '-DCMAKE_OSX_ARCHITECTURES="x86_64" -DGGML_AVX2=OFF -DSD_BUILD_SHARED_LIBS=ON'
          - build: 'avx2'
            defines: '-DCMAKE_OSX_ARCHITECTURES="x86_64" -DGGML_AVX2=ON -DSD_BUILD_SHARED_LIBS=ON'
          - build: 'avx512'
            defines: '-DCMAKE_OSX_ARCHITECTURES="x86_64" -DGGML_AVX512=ON -DSD_BUILD_SHARED_LIBS=ON'
   
    steps:          
      - name: Checkout
        id: checkout
        uses: actions/checkout@v4.1.2
        with:
          repository: 'leejet/stable-diffusion.cpp'
          ref: '${{ github.event.inputs.commit }}'
          submodules: recursive
   
      - name: Build
        id: cmake_build
        run: |
          mkdir build
          cd build
          cmake .. ${{ matrix.defines }}
          cmake --build . --config Release
                  
      - name: Upload artifact
        id: upload_artifact
        uses: actions/upload-artifact@v4.3.1
        with:
          name: osx-${{ matrix.build }}
          path: ./build/bin/libstable-diffusion.dylib

  release:
    runs-on: ubuntu-latest

    needs:
      - windows
      - linux
      - linux-hip
      - osx

    steps:
      - name: Checkout
        id: checkout
        uses: actions/checkout@v4.1.2
      
      - name: Download artifacts
        id: download_artifacts
        uses: actions/download-artifact@v4
        with:
            path: Backends
      
      - name: Display structure of downloaded files
        run: ls -R

      - name: Setup nuget
        id: setup_nuget
        uses: NuGet/setup-nuget@v2.0.0

      - name: Pack
        id: pack
        run: |
          nuget pack ./Backends/StableDiffusion.NET.Backend.Cpu.nuspec -version ${{ github.event.inputs.version }}
          nuget pack ./Backends/StableDiffusion.NET.Backend.Cuda.nuspec -version ${{ github.event.inputs.version }}
          nuget pack ./Backends/StableDiffusion.NET.Backend.Rocm.nuspec -version ${{ github.event.inputs.version }}
          
      - name: Upload artifacts
        id: upload_artifacts
        uses: actions/upload-artifact@v4.3.1
        with:
          name: StableDiffusion.NET.Backend-Nugets
          path: ./*.nupkg
          
      - name: Nuget Push
        id: nuget_push
        run: dotnet nuget push **\*.nupkg --skip-duplicate --api-key ${{ secrets.NUGET_TOKEN }} --source https://api.nuget.org/v3/index.json
