#ifdef USE_D3D9
D3D9PixelShader::D3D9PixelShader()
{
_shader = NULL;
_device = NULL;
_constantTable = NULL;
}
D3D9PixelShader::~D3D9PixelShader()
{
FreeMemory();
}
void D3D9PixelShader::FreeMemory()
{
if(_shader)
{
_shader->Release();
_shader = NULL;
}
if(_constantTable)
{
_constantTable->Release();
_constantTable = NULL;
}
}
void D3D9PixelShader::ReleaseMemory()
{
FreeMemory();
}
void D3D9PixelShader::Reset(GraphicsDevice &graphics)
{
FreeMemory();
HRESULT hr;
_device = graphics.CastD3D9().GetDevice();
Assert(_device != NULL, "_device == NULL");
DWORD dwShaderFlags = 0;
#ifdef DEBUG_PS
dwShaderFlags |= D3DXSHADER_SKIPOPTIMIZATION | D3DXSHADER_DEBUG;
#endif
LPD3DXBUFFER pCode = NULL;
LPD3DXBUFFER pErrors = NULL;
PersistentAssert(Utility::FileExists(_shaderFile), String("Shader file not found: ") + _shaderFile);
hr = D3DXCompileShaderFromFile( _shaderFile.CString(), NULL, NULL, "PShaderEntry",
"ps_3_0", dwShaderFlags, &pCode,
&pErrors, &_constantTable );
String ErrorString;
if(pErrors)
{
char *ErrorMessage = (char *)pErrors->GetBufferPointer();
DWORD ErrorLength = pErrors->GetBufferSize();
ofstream file("ShaderDebug.txt");
for(UINT i = 0; i < ErrorLength; i++)
{
file << ErrorMessage[i];
ErrorString += String(ErrorMessage[i]);
}
file.close();
}
PersistentAssert(!FAILED(hr), String("D3DXCompileShaderFromFile failed: ") + ErrorString);
hr = _device->CreatePixelShader( (DWORD*)pCode->GetBufferPointer(),
&_shader );
if(pErrors)
{
pErrors->Release();
}
if(pCode)
{
pCode->Release();
}
PersistentAssert(!FAILED(hr), "CreatePixelShader failed");
}
void D3D9PixelShader::Init(GraphicsDevice &graphics, const String &filename)
{
_shaderFile = filename;
Reset(graphics);
}
void D3D9PixelShader::Set()
{
D3DValidate( _device->SetPixelShader(_shader), "SetPixelShader");
}
#endif