- removed Shader Model 1.4 support.

The only hardware ever to support this is ATI's R200 which has been deprecated by ATI before Vista got released, and is no longer a relevant target.
This commit is contained in:
Christoph Oelckers 2018-03-16 18:51:43 +01:00
parent 40bbe5cd8a
commit d9f6546c16
27 changed files with 23 additions and 316 deletions

View File

@ -2312,7 +2312,6 @@ OpenGLSWFrameBuffer::OpenGLPal::OpenGLPal(FRemapTable *remap, OpenGLSWFrameBuffe
{ {
} }
count = pow2count; count = pow2count;
DoColorSkip = false;
BorderColor = 0; BorderColor = 0;
RoundedPaletteSize = count; RoundedPaletteSize = count;
@ -2392,7 +2391,7 @@ bool OpenGLSWFrameBuffer::OpenGLPal::Update()
pal = Remap->Palette; pal = Remap->Palette;
// See explanation in UploadPalette() for skipat rationale. // See explanation in UploadPalette() for skipat rationale.
skipat = MIN(numEntries, DoColorSkip ? 256 - 8 : 256); skipat = MIN(numEntries, 256);
#ifndef NO_SSE #ifndef NO_SSE
// Manual SSE vectorized version here to workaround a bug in GCC's auto-vectorizer // Manual SSE vectorized version here to workaround a bug in GCC's auto-vectorizer

View File

@ -293,7 +293,6 @@ private:
std::unique_ptr<HWTexture> Tex; std::unique_ptr<HWTexture> Tex;
uint32_t BorderColor; uint32_t BorderColor;
bool DoColorSkip;
bool Update(); bool Update();

View File

@ -155,7 +155,6 @@ public:
IDirect3DTexture9 *Tex; IDirect3DTexture9 *Tex;
D3DCOLOR BorderColor; D3DCOLOR BorderColor;
bool DoColorSkip;
bool Update(); bool Update();
@ -416,8 +415,8 @@ void D3DFB::SetInitialState()
for (unsigned i = 0; i < countof(Texture); ++i) for (unsigned i = 0; i < countof(Texture); ++i)
{ {
Texture[i] = NULL; Texture[i] = NULL;
D3DDevice->SetSamplerState(i, D3DSAMP_ADDRESSU, (i == 1 && SM14) ? D3DTADDRESS_BORDER : D3DTADDRESS_CLAMP); D3DDevice->SetSamplerState(i, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);
D3DDevice->SetSamplerState(i, D3DSAMP_ADDRESSV, (i == 1 && SM14) ? D3DTADDRESS_BORDER : D3DTADDRESS_CLAMP); D3DDevice->SetSamplerState(i, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);
if (i > 1) if (i > 1)
{ {
// Set linear filtering for the SM14 gamma texture. // Set linear filtering for the SM14 gamma texture.
@ -429,24 +428,6 @@ void D3DFB::SetInitialState()
NeedPalUpdate = true; NeedPalUpdate = true;
OldRenderTarget = NULL; OldRenderTarget = NULL;
if (!Windowed && SM14)
{
// Fix for Radeon 9000, possibly other R200s: When the device is
// reset, it resets the gamma ramp, but the driver apparently keeps a
// cached copy of the ramp that it doesn't update, so when
// SetGammaRamp is called later to handle the NeedGammaUpdate flag,
// it doesn't do anything, because the gamma ramp is the same as the
// one passed in the last call, even though the visible gamma ramp
// actually has changed.
//
// So here we force the gamma ramp to something absolutely horrible and
// trust that we will be able to properly set the gamma later when
// NeedGammaUpdate is handled.
D3DGAMMARAMP ramp;
memset(&ramp, 0, sizeof(ramp));
D3DDevice->SetGammaRamp(0, 0, &ramp);
}
// This constant is used for grayscaling weights (.xyz) and color inversion (.w) // This constant is used for grayscaling weights (.xyz) and color inversion (.w)
float weights[4] = { 77/256.f, 143/256.f, 37/256.f, 1 }; float weights[4] = { 77/256.f, 143/256.f, 37/256.f, 1 };
D3DDevice->SetPixelShaderConstantF(PSCONST_Weights, weights, 1); D3DDevice->SetPixelShaderConstantF(PSCONST_Weights, weights, 1);
@ -540,7 +521,6 @@ bool D3DFB::CreateResources()
{ {
return false; return false;
} }
CreateGammaTexture();
CreateBlockSurfaces(); CreateBlockSurfaces();
return true; return true;
} }
@ -556,7 +536,7 @@ bool D3DFB::CreateResources()
bool D3DFB::LoadShaders() bool D3DFB::LoadShaders()
{ {
static const char models[][4] = { "30/", "20/", "14/" }; static const char models[][4] = { "30/", "20/" };
FString shaderdir, shaderpath; FString shaderdir, shaderpath;
unsigned model, i; unsigned model, i;
int lump; int lump;
@ -584,7 +564,6 @@ bool D3DFB::LoadShaders()
} }
if (i == NUM_SHADERS) if (i == NUM_SHADERS)
{ // Success! { // Success!
SM14 = (model == countof(models) - 1);
return true; return true;
} }
// Failure. Release whatever managed to load (which is probably nothing.) // Failure. Release whatever managed to load (which is probably nothing.)
@ -839,25 +818,6 @@ bool D3DFB::CreatePaletteTexture ()
return true; return true;
} }
//==========================================================================
//
// D3DFB :: CreateGammaTexture
//
//==========================================================================
bool D3DFB::CreateGammaTexture ()
{
// If this fails, you just won't get gamma correction in a window
// on SM14 cards.
assert(GammaTexture == NULL);
if (SM14)
{
return SUCCEEDED(D3DDevice->CreateTexture(256, 1, 1, 0, D3DFMT_A8R8G8B8,
D3DPOOL_MANAGED, &GammaTexture, NULL));
}
return false;
}
//========================================================================== //==========================================================================
// //
// D3DFB :: CreateVertexes // D3DFB :: CreateVertexes
@ -1466,23 +1426,11 @@ void D3DFB::DoWindowedGamma()
D3DDevice->SetFVF(D3DFVF_FBVERTEX); D3DDevice->SetFVF(D3DFVF_FBVERTEX);
SetTexture(0, TempRenderTexture); SetTexture(0, TempRenderTexture);
SetPixelShader(Windowed && GammaShader ? GammaShader : Shaders[SHADER_NormalColor]); SetPixelShader(Windowed && GammaShader ? GammaShader : Shaders[SHADER_NormalColor]);
if (SM14 && Windowed && GammaShader)
{
SetTexture(2, GammaTexture);
SetTexture(3, GammaTexture);
SetTexture(4, GammaTexture);
}
SetAlphaBlend(D3DBLENDOP(0)); SetAlphaBlend(D3DBLENDOP(0));
EnableAlphaTest(FALSE); EnableAlphaTest(FALSE);
D3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, verts, sizeof(FBVERTEX)); D3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, verts, sizeof(FBVERTEX));
OldRenderTarget->Release(); OldRenderTarget->Release();
OldRenderTarget = NULL; OldRenderTarget = NULL;
if (SM14 && Windowed && GammaShader)
{
// SetTexture(0, GammaTexture);
// SetPixelShader(Shaders[SHADER_NormalColor]);
// D3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, verts, sizeof(FBVERTEX));
}
} }
} }
@ -1512,138 +1460,10 @@ void D3DFB::UpdateGammaTexture(float igamma)
} }
} }
//==========================================================================
//
// D3DFB :: DoOffByOneCheck
//
// Pixel Shader 1.x does not have enough precision to properly map a "color"
// from the source texture to an index in the palette texture. The best we
// can do is use 255 pixels of the palette and get the 256th from the
// texture border color. This routine determines which pixel of the texture
// is skipped so that we don't use it for palette data.
//
//==========================================================================
void D3DFB::DoOffByOneCheck ()
{
IDirect3DSurface9 *savedrendertarget;
IDirect3DSurface9 *testsurf, *readsurf;
D3DLOCKED_RECT lockrect;
RECT testrect = { 0, 0, 256, 1 };
float texright = 256.f / float(FBWidth);
float texbot = 1.f / float(FBHeight);
FBVERTEX verts[4] =
{
{ -0.5f, -0.5f, 0.5f, 1.f, D3DCOLOR_RGBA(0,0,0,0), D3DCOLOR_RGBA(255,255,255,255), 0.f, 0.f },
{ 255.5f, -0.5f, 0.5f, 1.f, D3DCOLOR_RGBA(0,0,0,0), D3DCOLOR_RGBA(255,255,255,255), texright, 0.f },
{ 255.5f, 0.5f, 0.5f, 1.f, D3DCOLOR_RGBA(0,0,0,0), D3DCOLOR_RGBA(255,255,255,255), texright, texbot },
{ -0.5f, 0.5f, 0.5f, 1.f, D3DCOLOR_RGBA(0,0,0,0), D3DCOLOR_RGBA(255,255,255,255), 0.f, texbot }
};
int i, c;
if (SkipAt >= 0)
{
return;
}
// Create an easily recognizable R3G3B2 palette.
if (SUCCEEDED(PaletteTexture->LockRect(0, &lockrect, NULL, 0)))
{
uint8_t *pal = (uint8_t *)(lockrect.pBits);
for (i = 0; i < 256; ++i)
{
pal[i*4+0] = (i & 0x03) << 6; // blue
pal[i*4+1] = (i & 0x1C) << 3; // green
pal[i*4+2] = (i & 0xE0); // red;
pal[i*4+3] = 255;
}
PaletteTexture->UnlockRect (0);
}
else
{
return;
}
// Prepare a texture with values 0-256.
if (SUCCEEDED(FBTexture->LockRect(0, &lockrect, &testrect, 0)))
{
for (i = 0; i < 256; ++i)
{
((uint8_t *)lockrect.pBits)[i] = i;
}
FBTexture->UnlockRect(0);
}
else
{
return;
}
// Create a render target that we can draw it to.
if (FAILED(D3DDevice->GetRenderTarget(0, &savedrendertarget)))
{
return;
}
if (FAILED(D3DDevice->CreateRenderTarget(256, 1, D3DFMT_A8R8G8B8, D3DMULTISAMPLE_NONE, 0, FALSE, &testsurf, NULL)))
{
return;
}
if (FAILED(D3DDevice->CreateOffscreenPlainSurface(256, 1, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &readsurf, NULL)))
{
testsurf->Release();
return;
}
if (FAILED(D3DDevice->SetRenderTarget(0, testsurf)))
{
testsurf->Release();
readsurf->Release();
return;
}
// Write it to the render target using the pixel shader.
D3DDevice->BeginScene();
D3DDevice->SetTexture(0, FBTexture);
D3DDevice->SetTexture(1, PaletteTexture);
D3DDevice->SetFVF(D3DFVF_FBVERTEX);
D3DDevice->SetPixelShader(Shaders[SHADER_NormalColorPal]);
SetConstant(PSCONST_PaletteMod, 1.f, 0.5f / 256.f, 0, 0);
D3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, verts, sizeof(FBVERTEX));
D3DDevice->EndScene();
D3DDevice->SetRenderTarget(0, savedrendertarget);
savedrendertarget->Release();
// Now read it back and see where it skips an entry
if (SUCCEEDED(D3DDevice->GetRenderTargetData(testsurf, readsurf)) &&
SUCCEEDED(readsurf->LockRect(&lockrect, &testrect, D3DLOCK_READONLY)))
{
const uint8_t *pix = (const uint8_t *)lockrect.pBits;
for (i = 0; i < 256; ++i, pix += 4)
{
c = (pix[0] >> 6) | // blue
((pix[1] >> 5) << 2) | // green
((pix[2] >> 5) << 5); // red
if (c != i)
{
break;
}
}
}
readsurf->UnlockRect();
readsurf->Release();
testsurf->Release();
SkipAt = i;
}
void D3DFB::UploadPalette () void D3DFB::UploadPalette ()
{ {
D3DLOCKED_RECT lockrect; D3DLOCKED_RECT lockrect;
if (SkipAt < 0)
{
if (SM14)
{
DoOffByOneCheck();
}
else
{
SkipAt = 256;
}
}
if (SUCCEEDED(PaletteTexture->LockRect(0, &lockrect, NULL, 0))) if (SUCCEEDED(PaletteTexture->LockRect(0, &lockrect, NULL, 0)))
{ {
uint8_t *pix = (uint8_t *)lockrect.pBits; uint8_t *pix = (uint8_t *)lockrect.pBits;
@ -1657,14 +1477,6 @@ void D3DFB::UploadPalette ()
pix[3] = (i == 0 ? 0 : 255); pix[3] = (i == 0 ? 0 : 255);
// To let masked textures work, the first palette entry's alpha is 0. // To let masked textures work, the first palette entry's alpha is 0.
} }
pix += 4;
for (; i < 255; ++i, pix += 4)
{
pix[0] = SourcePalette[i].b;
pix[1] = SourcePalette[i].g;
pix[2] = SourcePalette[i].r;
pix[3] = 255;
}
PaletteTexture->UnlockRect(0); PaletteTexture->UnlockRect(0);
BorderColor = D3DCOLOR_XRGB(SourcePalette[255].r, SourcePalette[255].g, SourcePalette[255].b); BorderColor = D3DCOLOR_XRGB(SourcePalette[255].r, SourcePalette[255].g, SourcePalette[255].b);
} }
@ -2418,24 +2230,12 @@ D3DPal::D3DPal(FRemapTable *remap, D3DFB *fb)
Prev = &fb->Palettes; Prev = &fb->Palettes;
fb->Palettes = this; fb->Palettes = this;
// Palette textures must be 256 entries for Shader Model 1.4 int pow2count;
if (fb->SM14)
{
count = 256;
// If the palette isn't big enough, then we don't need to
// worry about setting the gamma ramp.
DoColorSkip = (remap->NumEntries >= 256 - 8);
}
else
{
int pow2count;
// Round up to the nearest power of 2. // Round up to the nearest power of 2.
for (pow2count = 1; pow2count < remap->NumEntries; pow2count <<= 1) for (pow2count = 1; pow2count < remap->NumEntries; pow2count <<= 1)
{ } { }
count = pow2count; count = pow2count;
DoColorSkip = false;
}
BorderColor = 0; BorderColor = 0;
RoundedPaletteSize = count; RoundedPaletteSize = count;
if (SUCCEEDED(fb->D3DDevice->CreateTexture(count, 1, 1, 0, if (SUCCEEDED(fb->D3DDevice->CreateTexture(count, 1, 1, 0,
@ -2496,7 +2296,7 @@ bool D3DPal::Update()
pal = Remap->Palette; pal = Remap->Palette;
// See explanation in UploadPalette() for skipat rationale. // See explanation in UploadPalette() for skipat rationale.
skipat = MIN(Remap->NumEntries, DoColorSkip ? 256 - 8 : 256); skipat = MIN(Remap->NumEntries, 256);
for (i = 0; i < skipat; ++i) for (i = 0; i < skipat; ++i)
{ {
@ -3848,55 +3648,22 @@ void D3DFB::SetTexture(int tnum, IDirect3DTexture9 *texture)
void D3DFB::SetPaletteTexture(IDirect3DTexture9 *texture, int count, D3DCOLOR border_color) void D3DFB::SetPaletteTexture(IDirect3DTexture9 *texture, int count, D3DCOLOR border_color)
{ {
if (SM14) // The pixel shader receives color indexes in the range [0.0,1.0].
{ // The palette texture is also addressed in the range [0.0,1.0],
// Shader Model 1.4 only uses 256-color palettes. // HOWEVER the coordinate 1.0 is the right edge of the texture and
SetConstant(PSCONST_PaletteMod, 1.f, 0.5f / 256.f, 0, 0); // not actually the texture itself. We need to scale and shift
if (border_color != 0 && CurBorderColor != border_color) // the palette indexes so they lie exactly in the center of each
{ // texel. For a normal palette with 256 entries, that means the
CurBorderColor = border_color; // range we use should be [0.5,255.5], adjusted so the coordinate
D3DDevice->SetSamplerState(1, D3DSAMP_BORDERCOLOR, border_color); // is still within [0.0,1.0].
} //
} // The constant register c2 is used to hold the multiplier in the
else // x part and the adder in the y part.
{ float fcount = 1 / float(count);
// The pixel shader receives color indexes in the range [0.0,1.0]. SetConstant(PSCONST_PaletteMod, 255 * fcount, 0.5f * fcount, 0, 0);
// The palette texture is also addressed in the range [0.0,1.0],
// HOWEVER the coordinate 1.0 is the right edge of the texture and
// not actually the texture itself. We need to scale and shift
// the palette indexes so they lie exactly in the center of each
// texel. For a normal palette with 256 entries, that means the
// range we use should be [0.5,255.5], adjusted so the coordinate
// is still within [0.0,1.0].
//
// The constant register c2 is used to hold the multiplier in the
// x part and the adder in the y part.
float fcount = 1 / float(count);
SetConstant(PSCONST_PaletteMod, 255 * fcount, 0.5f * fcount, 0, 0);
}
SetTexture(1, texture); SetTexture(1, texture);
} }
void D3DFB::SetPalTexBilinearConstants(Atlas *tex) void D3DFB::SetPalTexBilinearConstants(Atlas *tex)
{ {
#if 0
float con[8];
// Don't bother doing anything if the constants won't be used.
if (PalTexShader == PalTexBilinearShader)
{
return;
}
con[0] = float(tex->Width);
con[1] = float(tex->Height);
con[2] = 0;
con[3] = 1 / con[0];
con[4] = 0;
con[5] = 1 / con[1];
con[6] = con[5];
con[7] = con[3];
D3DDevice->SetPixelShaderConstantF(3, con, 2);
#endif
} }

View File

@ -638,18 +638,8 @@ bool D3DFB::Wiper_Burn::Run(int ticks, D3DFB *fb)
fb->SetAlphaBlend(D3DBLENDOP_ADD, D3DBLEND_SRCALPHA, D3DBLEND_INVSRCALPHA); fb->SetAlphaBlend(D3DBLENDOP_ADD, D3DBLEND_SRCALPHA, D3DBLEND_INVSRCALPHA);
fb->SetPixelShader(fb->Shaders[SHADER_BurnWipe]); fb->SetPixelShader(fb->Shaders[SHADER_BurnWipe]);
fb->D3DDevice->SetSamplerState(1, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); fb->D3DDevice->SetSamplerState(1, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
if (fb->SM14)
{
fb->D3DDevice->SetSamplerState(1, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);
fb->D3DDevice->SetSamplerState(1, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);
}
fb->D3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, verts, sizeof(BURNVERTEX)); fb->D3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, verts, sizeof(BURNVERTEX));
fb->D3DDevice->SetSamplerState(1, D3DSAMP_MAGFILTER, D3DTEXF_POINT); fb->D3DDevice->SetSamplerState(1, D3DSAMP_MAGFILTER, D3DTEXF_POINT);
if (fb->SM14)
{
fb->D3DDevice->SetSamplerState(1, D3DSAMP_ADDRESSU, D3DTADDRESS_BORDER);
fb->D3DDevice->SetSamplerState(1, D3DSAMP_ADDRESSV, D3DTADDRESS_BORDER);
}
fb->D3DDevice->SetFVF(D3DFVF_FBVERTEX); fb->D3DDevice->SetFVF(D3DFVF_FBVERTEX);
// The fire may not always stabilize, so the wipe is forced to end // The fire may not always stabilize, so the wipe is forced to end

View File

@ -66,7 +66,6 @@ public:
HRESULT GetHR (); HRESULT GetHR ();
bool Is8BitMode() { return false; } bool Is8BitMode() { return false; }
virtual int GetTrueHeight() { return TrueHeight; } virtual int GetTrueHeight() { return TrueHeight; }
virtual bool LegacyHardware() const { return SM14; }
private: private:
friend class D3DTex; friend class D3DTex;
@ -150,7 +149,6 @@ private:
bool CreatePaletteTexture(); bool CreatePaletteTexture();
bool CreateGammaTexture(); bool CreateGammaTexture();
bool CreateVertexes(); bool CreateVertexes();
void DoOffByOneCheck();
void UploadPalette(); void UploadPalette();
void UpdateGammaTexture(float igamma); void UpdateGammaTexture(float igamma);
void FillPresentParameters (D3DPRESENT_PARAMETERS *pp, bool fullscreen, bool vsync); void FillPresentParameters (D3DPRESENT_PARAMETERS *pp, bool fullscreen, bool vsync);
@ -221,7 +219,6 @@ private:
RECT BlendingRect; RECT BlendingRect;
int In2D; int In2D;
bool InScene; bool InScene;
bool SM14;
bool GatheringWipeScreen; bool GatheringWipeScreen;
bool AALines; bool AALines;
uint8_t BlockNum; uint8_t BlockNum;

View File

@ -1,6 +1,3 @@
cd sm14
call build.bat
cd ..\sm20 cd ..\sm20
call build.bat call build.bat

View File

@ -1,10 +1,5 @@
sampler2D Image : register(s0); sampler2D Image : register(s0);
sampler1D Palette : register(s1); sampler1D Palette : register(s1);
#if PS14
sampler1D Gamma1 : register(s2);
sampler1D Gamma2 : register(s3);
sampler1D Gamma3 : register(s4);
#endif
float4 Desaturation : register(c1); // { Desat, 1 - Desat } float4 Desaturation : register(c1); // { Desat, 1 - Desat }
float4 PaletteMod : register(c2); float4 PaletteMod : register(c2);
@ -106,19 +101,7 @@ float4 InGameColormap(float2 tex_coord : TEXCOORD0, float4 color : COLOR0, float
float4 GammaCorrection(float2 tex_coord : TEXCOORD0) : COLOR float4 GammaCorrection(float2 tex_coord : TEXCOORD0) : COLOR
{ {
float4 color = tex2D(Image, tex_coord); float4 color = tex2D(Image, tex_coord);
#if !PS14
color.rgb = pow(color.rgb, Gamma.rgb); color.rgb = pow(color.rgb, Gamma.rgb);
#else
// On PS14 targets, we can only sample once from each sampler
// per stage. Fortunately, we have 16 samplers to play with,
// so we can just set three of them to the gamma texture and
// use one for each component. Unfortunately, all these
// texture lookups are probably not as efficient as the pow()
// solution that later targets make possible.
color.r = tex1D(Gamma1, color.r * Gamma.w).r;
color.g = tex1D(Gamma2, color.g * Gamma.w).g;
color.b = tex1D(Gamma3, color.b * Gamma.w).b;
#endif
return color; return color;
} }

View File

@ -1,25 +0,0 @@
fxc ..\shaders.ps /Tps_1_4 /LD -DPS14=1 /ENormalColor -DPALTEX=0 -DINVERT=0 /FoNormalColor.pso
fxc ..\shaders.ps /Tps_1_4 /LD -DPS14=1 /ENormalColor -DPALTEX=0 -DINVERT=1 /FoNormalColorInv.pso
fxc ..\shaders.ps /Tps_1_4 /LD -DPS14=1 /ENormalColor -DPALTEX=1 -DINVERT=0 /FoNormalColorPal.pso
fxc ..\shaders.ps /Tps_1_4 /LD -DPS14=1 /ENormalColor -DPALTEX=1 -DINVERT=1 /FoNormalColorPalInv.pso
fxc ..\shaders.ps /Tps_1_4 /LD -DPS14=1 /ERedToAlpha -DINVERT=0 /FoRedToAlpha.pso
fxc ..\shaders.ps /Tps_1_4 /LD -DPS14=1 /ERedToAlpha -DINVERT=1 /FoRedToAlphaInv.pso
fxc ..\shaders.ps /Tps_1_4 /LD -DPS14=1 /EVertexColor /FoVertexColor.pso
fxc ..\shaders.ps /Tps_1_4 /LD -DPS14=1 /ESpecialColormap -DPALTEX=0 -DINVERT=0 /FoSpecialColormap.pso
fxc ..\shaders.ps /Tps_1_4 /LD -DPS14=1 /ESpecialColormap -DPALTEX=1 -DINVERT=0 /FoSpecialColormapPal.pso
fxc ..\shaders.ps /Tps_1_4 /LD -DPS14=1 /EInGameColormap -DPALTEX=0 -DINVERT=0 -DDESAT=0 /FoInGameColormap.pso
fxc ..\shaders.ps /Tps_1_4 /LD -DPS14=1 /EInGameColormap -DPALTEX=0 -DINVERT=0 -DDESAT=1 /FoInGameColormapDesat.pso
fxc ..\shaders.ps /Tps_1_4 /LD -DPS14=1 /EInGameColormap -DPALTEX=0 -DINVERT=1 -DDESAT=0 /FoInGameColormapInv.pso
fxc ..\shaders.ps /Tps_1_4 /LD -DPS14=1 /EInGameColormap -DPALTEX=0 -DINVERT=1 -DDESAT=1 /FoInGameColormapInvDesat.pso
fxc ..\shaders.ps /Tps_1_4 /LD -DPS14=1 /EInGameColormap -DPALTEX=1 -DINVERT=0 -DDESAT=0 /FoInGameColormapPal.pso
fxc ..\shaders.ps /Tps_1_4 /LD -DPS14=1 /EInGameColormap -DPALTEX=1 -DINVERT=0 -DDESAT=1 /FoInGameColormapPalDesat.pso
fxc ..\shaders.ps /Tps_1_4 /LD -DPS14=1 /EInGameColormap -DPALTEX=1 -DINVERT=1 -DDESAT=0 /FoInGameColormapPalInv.pso
fxc ..\shaders.ps /Tps_1_4 /LD -DPS14=1 /EInGameColormap -DPALTEX=1 -DINVERT=1 -DDESAT=1 /FoInGameColormapPalInvDesat.pso
fxc ..\shaders.ps /Tps_1_4 /LD -DPS14=1 /EBurnWipe /FoBurnWipe.pso
fxc ..\shaders.ps /Tps_1_4 /LD -DPS14=1 /EGammaCorrection /FoGammaCorrection.pso