// =============================================================================
//  palette.hlsl  —  M88 用パレット展開（Pass 1）
//
//  エミュレーションコアが出力する 8bpp パレットインデックスバッファを
//  RGBA テクスチャに展開する。CRT エフェクト (crt.hlsl) の入力を作るためのパス。
//
//  ★このパスは色空間を一切変換しない。
//    PC-88 のパレット値（0..255）をそのまま 0..1 に正規化して出力する。
//    crt.hlsl 側が「sRGB エンコード済みの値がそのまま入っている」前提で
//    手動ガンマ変換を行うため、ここで sRGB デコードを掛けてはいけない。
//
//    出力 RT は必ず DXGI_FORMAT_R8G8B8A8_UNORM（_SRGB 禁止）。
// =============================================================================

struct VSOut
{
	float4 pos : SV_POSITION;
	float2 uv  : TEXCOORD0;
};

VSOut VSMain(uint id : SV_VertexID)
{
	VSOut o;
	o.uv  = float2((id << 1) & 2, id & 2);
	o.pos = float4(o.uv * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0);
	return o;
}

Texture2D<float>  IndexTex   : register(t0);   // R8_UNORM   640x400（インデックス）
Texture2D<float4> PaletteTex : register(t1);   // R8G8B8A8_UNORM 256x1（パレット）
SamplerState      PointSamp  : register(s0);   // Point / Clamp

float4 PSPalette(VSOut i) : SV_Target
{
	// ★インデックスのサンプリングは必ず Point。
	//   Linear で補間すると存在しないパレット番号が生成され色が破綻する。
	float idx = IndexTex.Sample(PointSamp, i.uv).r;

	// idx は 0..255 を 255 で割った 0..1 の値。
	// 256 幅のパレットテクスチャのテクセル中心を指すよう変換する。
	float2 puv = float2(idx * (255.0 / 256.0) + (0.5 / 256.0), 0.5);

	float4 c = PaletteTex.Sample(PointSamp, puv);
	return float4(c.rgb, 1.0);
}
