2009-07-28 21:32:10 +00:00
|
|
|
// Copyright (C) 2003 Dolphin Project.
|
2008-12-08 05:25:12 +00:00
|
|
|
|
|
|
|
// This program is free software: you can redistribute it and/or modify
|
|
|
|
// it under the terms of the GNU General Public License as published by
|
|
|
|
// the Free Software Foundation, version 2.0.
|
|
|
|
|
|
|
|
// This program is distributed in the hope that it will be useful,
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
// GNU General Public License 2.0 for more details.
|
|
|
|
|
|
|
|
// A copy of the GPL 2.0 should have been included with the program.
|
|
|
|
// If not, see http://www.gnu.org/licenses/
|
|
|
|
|
|
|
|
// Official SVN repository and contact information can be found at
|
|
|
|
// http://code.google.com/p/dolphin-emu/
|
|
|
|
|
|
|
|
#include <d3dx9.h>
|
|
|
|
#include <string>
|
|
|
|
|
|
|
|
#include "Config.h"
|
|
|
|
#include "D3DShader.h"
|
|
|
|
|
|
|
|
namespace D3D
|
|
|
|
{
|
2009-09-02 04:10:40 +00:00
|
|
|
|
|
|
|
extern Shader Ps;
|
|
|
|
extern Shader Vs;
|
2008-12-26 17:02:46 +00:00
|
|
|
|
2009-09-02 04:10:40 +00:00
|
|
|
LPDIRECT3DVERTEXSHADER9 CompileVertexShader(const char *code, int len)
|
2008-12-26 17:02:46 +00:00
|
|
|
{
|
|
|
|
//try to compile
|
|
|
|
LPD3DXBUFFER shaderBuffer = 0;
|
|
|
|
LPD3DXBUFFER errorBuffer = 0;
|
|
|
|
LPDIRECT3DVERTEXSHADER9 vShader = 0;
|
2009-03-01 12:07:34 +00:00
|
|
|
HRESULT hr;
|
2009-09-02 04:10:40 +00:00
|
|
|
static char *versions[5] = {"ERROR", "vs_1_4", "vs_2_0", "vs_3_0", "vs_4_0"};
|
2009-03-01 12:07:34 +00:00
|
|
|
|
2009-09-02 04:10:40 +00:00
|
|
|
hr = D3DXCompileShader(code, len, 0, 0, "main", versions[Vs.Major], 0, &shaderBuffer, &errorBuffer, 0);
|
2008-12-08 05:25:12 +00:00
|
|
|
|
2008-12-26 17:02:46 +00:00
|
|
|
if (FAILED(hr))
|
|
|
|
{
|
|
|
|
//compilation error
|
2009-03-08 00:58:11 +00:00
|
|
|
if(g_Config.bShowShaderErrors) {
|
|
|
|
std::string hello = (char*)errorBuffer->GetBufferPointer();
|
|
|
|
hello += "\n\n";
|
|
|
|
hello += code;
|
2009-09-02 06:33:41 +00:00
|
|
|
MessageBoxA(0, hello.c_str(), "Error assembling vertex shader", MB_ICONERROR);
|
2009-03-08 00:58:11 +00:00
|
|
|
}
|
2008-12-26 17:02:46 +00:00
|
|
|
vShader = 0;
|
|
|
|
}
|
|
|
|
else if (SUCCEEDED(hr))
|
|
|
|
{
|
|
|
|
//create it
|
|
|
|
HRESULT hr = E_FAIL;
|
|
|
|
if (shaderBuffer)
|
|
|
|
hr = D3D::dev->CreateVertexShader((DWORD *)shaderBuffer->GetBufferPointer(), &vShader);
|
2009-03-07 23:58:04 +00:00
|
|
|
if ((FAILED(hr) || vShader == 0) && g_Config.bShowShaderErrors)
|
2008-12-08 05:25:12 +00:00
|
|
|
{
|
2009-09-02 06:33:41 +00:00
|
|
|
MessageBoxA(0, code, (char*)errorBuffer->GetBufferPointer(),MB_ICONERROR);
|
2008-12-08 05:25:12 +00:00
|
|
|
}
|
2008-12-26 17:02:46 +00:00
|
|
|
}
|
2008-12-08 05:25:12 +00:00
|
|
|
|
2008-12-26 17:02:46 +00:00
|
|
|
//cleanup
|
|
|
|
if (shaderBuffer)
|
|
|
|
shaderBuffer->Release();
|
|
|
|
if (errorBuffer)
|
|
|
|
errorBuffer->Release();
|
2008-12-08 05:25:12 +00:00
|
|
|
|
2008-12-26 17:02:46 +00:00
|
|
|
return vShader;
|
|
|
|
}
|
2008-12-08 05:25:12 +00:00
|
|
|
|
2009-09-02 04:10:40 +00:00
|
|
|
LPDIRECT3DPIXELSHADER9 CompilePixelShader(const char *code, int len)
|
2008-12-26 17:02:46 +00:00
|
|
|
{
|
|
|
|
LPD3DXBUFFER shaderBuffer = 0;
|
|
|
|
LPD3DXBUFFER errorBuffer = 0;
|
|
|
|
LPDIRECT3DPIXELSHADER9 pShader = 0;
|
2009-09-02 04:10:40 +00:00
|
|
|
static char *versions[5] = {"ERROR", "ps_1_4", "ps_2_0", "ps_3_0", "ps_4_0"};
|
2009-03-01 10:53:28 +00:00
|
|
|
|
2009-09-02 04:10:40 +00:00
|
|
|
HRESULT hr;
|
|
|
|
// For some reasons, i had this kind of errors : "Shader uses texture addressing operations
|
|
|
|
// in a dependency chain that is too complex for the target shader model (ps_2_0) to handle."
|
|
|
|
hr = D3DXCompileShader(code, len, 0, 0, "main", versions[Ps.Major],
|
2009-03-01 12:07:34 +00:00
|
|
|
0, &shaderBuffer, &errorBuffer, 0);
|
2008-12-08 05:25:12 +00:00
|
|
|
|
2008-12-26 17:02:46 +00:00
|
|
|
if (FAILED(hr))
|
|
|
|
{
|
2009-03-08 00:58:11 +00:00
|
|
|
if(g_Config.bShowShaderErrors) {
|
|
|
|
std::string hello = (char*)errorBuffer->GetBufferPointer();
|
|
|
|
hello += "\n\n";
|
|
|
|
hello += code;
|
2009-09-02 06:33:41 +00:00
|
|
|
MessageBoxA(0, hello.c_str(), "Error assembling pixel shader", MB_ICONERROR);
|
2009-03-08 00:58:11 +00:00
|
|
|
}
|
2008-12-26 17:02:46 +00:00
|
|
|
pShader = 0;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
//create it
|
|
|
|
HRESULT hr = D3D::dev->CreatePixelShader((DWORD *)shaderBuffer->GetBufferPointer(), &pShader);
|
2009-03-08 00:58:11 +00:00
|
|
|
if ((FAILED(hr) || pShader == 0) && g_Config.bShowShaderErrors)
|
2008-12-08 05:25:12 +00:00
|
|
|
{
|
2009-09-02 06:33:41 +00:00
|
|
|
MessageBoxA(0, "damn", "error creating pixelshader", MB_ICONERROR);
|
2008-12-08 05:25:12 +00:00
|
|
|
}
|
2008-12-26 17:02:46 +00:00
|
|
|
}
|
2008-12-08 05:25:12 +00:00
|
|
|
|
2008-12-26 17:02:46 +00:00
|
|
|
//cleanup
|
|
|
|
if (shaderBuffer)
|
|
|
|
shaderBuffer->Release();
|
|
|
|
if (errorBuffer)
|
|
|
|
errorBuffer->Release();
|
2008-12-08 05:25:12 +00:00
|
|
|
|
2008-12-26 17:02:46 +00:00
|
|
|
return pShader;
|
|
|
|
}
|
2009-02-28 22:10:38 +00:00
|
|
|
|
|
|
|
} // namespace
|