# バッチ設計書 1-generate_spv.sh

## 概要

本ドキュメントは、ImGuiプロジェクトにおけるVulkanシェーダーのSPIR-Vバイナリ変換スクリプト `generate_spv.sh` の設計書である。

### 本バッチの処理概要

このバッチは、GLSL形式で記述されたVulkanシェーダーソースコードをSPIR-Vバイナリ形式に変換する処理を行う。

**業務上の目的・背景**：Vulkan APIを使用するImGuiのバックエンド実装において、シェーダーはGLSL形式で記述されているが、Vulkanランタイムで使用するためにはSPIR-V中間表現にコンパイルする必要がある。本バッチは開発者がシェーダーを修正した際に、実行可能なSPIR-Vバイナリを生成するために使用される。

**バッチの実行タイミング**：Vulkanバックエンドのシェーダーソースコード（glsl_shader.frag、glsl_shader.vert）を修正した際に手動で実行する。通常の開発フローでは、シェーダー変更時のみ実行が必要となる。

**主要な処理内容**：
1. glslangValidatorツールを使用してフラグメントシェーダー（glsl_shader.frag）をSPIR-Vバイナリに変換
2. glslangValidatorツールを使用して頂点シェーダー（glsl_shader.vert）をSPIR-Vバイナリに変換
3. 変換結果を32ビット16進数のテキスト形式（.u32拡張子）で出力

**前後の処理との関連**：本バッチの実行前に、GLSLシェーダーソースファイルが適切に記述されている必要がある。生成されたSPIR-Vバイナリは、Vulkanバックエンド（imgui_impl_vulkan.cpp）からインクルードされ、ImGuiのVulkanレンダリングに使用される。

**影響範囲**：Vulkanバックエンドを使用するすべてのImGuiアプリケーションに影響する。出力ファイル（glsl_shader.frag.u32、glsl_shader.vert.u32）はVulkan初期化時に読み込まれる。

## バッチ種別

シェーダーコンパイル / ビルドプリプロセス

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時（シェーダー変更時） |
| 実行時刻 | 任意 |
| 実行曜日 | - |
| 実行日 | - |
| トリガー | 手動 |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| glslangValidator | Vulkan SDKに含まれるglslangValidatorコマンドがパスに通っていること |
| 入力ファイル存在 | backends/vulkan/glsl_shader.frag および glsl_shader.vert が存在すること |
| 実行ディレクトリ | backends/vulkan ディレクトリで実行すること |

### 実行可否判定

スクリプトは特に実行可否の判定を行わず、glslangValidatorコマンドが存在し、入力ファイルが存在すればコンパイルを実行する。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| なし | - | - | - | コマンドライン引数は受け付けない |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| glsl_shader.frag | GLSLテキストファイル | フラグメントシェーダーのソースコード |
| glsl_shader.vert | GLSLテキストファイル | 頂点シェーダーのソースコード |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| glsl_shader.frag.u32 | テキスト（16進数） | コンパイル済みフラグメントシェーダーSPIR-Vバイナリ |
| glsl_shader.vert.u32 | テキスト（16進数） | コンパイル済み頂点シェーダーSPIR-Vバイナリ |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | glsl_shader.{frag\|vert}.u32 |
| 出力先 | backends/vulkan/ |
| 文字コード | ASCII |
| 形式 | 32ビット16進数のテキスト表現 |

## 処理フロー

### 処理シーケンス

```
1. フラグメントシェーダーのコンパイル
   └─ glslangValidator -V -x -o glsl_shader.frag.u32 glsl_shader.frag
2. 頂点シェーダーのコンパイル
   └─ glslangValidator -V -x -o glsl_shader.vert.u32 glsl_shader.vert
```

### フローチャート

```mermaid
flowchart TD
    A[バッチ開始] --> B[フラグメントシェーダーコンパイル]
    B --> C[glsl_shader.frag.u32 出力]
    C --> D[頂点シェーダーコンパイル]
    D --> E[glsl_shader.vert.u32 出力]
    E --> F[バッチ終了]
```

## データベース操作仕様

### 操作別データベース影響一覧

本バッチはデータベース操作を行わない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 1 | コマンド未検出 | glslangValidatorがパスにない | Vulkan SDKをインストールしパスを設定 |
| 1 | ファイル未検出 | 入力シェーダーファイルが存在しない | 入力ファイルの存在を確認 |
| 1 | シェーダーエラー | GLSLシェーダーに構文エラーがある | シェーダーソースを修正 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | なし |
| リトライ間隔 | - |
| リトライ対象エラー | - |

### 障害時対応

エラー発生時はglslangValidatorの出力メッセージを確認し、シェーダーの構文エラーを修正後、再度スクリプトを実行する。

## トランザクション仕様

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | - |
| コミットタイミング | - |
| ロールバック条件 | - |

本バッチはファイル変換処理のみでトランザクション管理は行わない。

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 2ファイル |
| 目標処理時間 | 数秒以内 |
| メモリ使用量上限 | 特に制限なし |

## 排他制御

同時実行の制御は行わない。同じファイルに対して複数のスクリプト実行が行われた場合、後から完了した処理の結果が反映される。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 標準出力 | コンパイル成功時 | glslangValidatorの成功メッセージ |
| 標準エラー | エラー発生時 | シェーダーコンパイルエラーの詳細 |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| - | - | - |

開発時のローカル実行を想定しており、監視・アラート設定はない。

## 備考

- glslangValidatorのオプション説明：
  - `-V`: SPIR-Vバイナリを生成
  - `-x`: テキストベースの32ビット16進数形式で出力
  - `-o`: 出力ファイルを指定
- Vulkan SDKがインストールされていれば、glslangValidatorは自動的にパスに含まれる
