mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-07-25 08:14:45 +02:00
133 lines
2.6 KiB
C++
133 lines
2.6 KiB
C++
#ifdef _WIN32
|
|
|
|
#include "ppsspp_config.h"
|
|
#include "d3d9_shader.h"
|
|
#include "Common/CommonFuncs.h"
|
|
|
|
#if PPSSPP_API(D3DX9)
|
|
#include "thin3d/d3dx9_loader.h"
|
|
|
|
// They are the same types, just different names.
|
|
#define LPD3D_SHADER_MACRO LPD3DXMACRO
|
|
#define LPD3DINCLUDE LPD3DXINCLUDE
|
|
#define LPD3DBLOB LPD3DXBUFFER
|
|
#elif PPSSPP_API(D3D9_D3DCOMPILER)
|
|
#include "thin3d/d3d9_d3dcompiler_loader.h"
|
|
#endif
|
|
|
|
struct ID3DXConstantTable;
|
|
|
|
namespace DX9 {
|
|
|
|
bool CompilePixelShader(LPDIRECT3DDEVICE9 device, const char *code, LPDIRECT3DPIXELSHADER9 *pShader, ID3DXConstantTable **pShaderTable, std::string &errorMessage) {
|
|
LPD3DBLOB pShaderCode = nullptr;
|
|
LPD3DBLOB pErrorMsg = nullptr;
|
|
|
|
// Compile pixel shader.
|
|
#if PPSSPP_API(D3DX9)
|
|
HRESULT hr = dyn_D3DXCompileShader(code,
|
|
(UINT)strlen(code),
|
|
nullptr,
|
|
nullptr,
|
|
"main",
|
|
"ps_2_0",
|
|
0,
|
|
&pShaderCode,
|
|
&pErrorMsg,
|
|
pShaderTable);
|
|
#elif PPSSPP_API(D3D9_D3DCOMPILER)
|
|
HRESULT hr = dyn_D3DCompile(code,
|
|
(UINT)strlen(code),
|
|
nullptr,
|
|
nullptr,
|
|
nullptr,
|
|
"main",
|
|
"ps_2_0",
|
|
0,
|
|
0,
|
|
&pShaderCode,
|
|
&pErrorMsg);
|
|
#endif
|
|
|
|
if (pErrorMsg) {
|
|
errorMessage = (CHAR *)pErrorMsg->GetBufferPointer();
|
|
pErrorMsg->Release();
|
|
} else if (FAILED(hr)) {
|
|
errorMessage = GetStringErrorMsg(hr);
|
|
} else {
|
|
errorMessage = "";
|
|
}
|
|
|
|
if (FAILED(hr) || !pShaderCode) {
|
|
if (pShaderCode)
|
|
pShaderCode->Release();
|
|
return false;
|
|
}
|
|
|
|
// Create pixel shader.
|
|
device->CreatePixelShader( (DWORD*)pShaderCode->GetBufferPointer(),
|
|
pShader );
|
|
|
|
pShaderCode->Release();
|
|
|
|
return true;
|
|
}
|
|
|
|
bool CompileVertexShader(LPDIRECT3DDEVICE9 device, const char *code, LPDIRECT3DVERTEXSHADER9 *pShader, ID3DXConstantTable **pShaderTable, std::string &errorMessage) {
|
|
LPD3DBLOB pShaderCode = nullptr;
|
|
LPD3DBLOB pErrorMsg = nullptr;
|
|
|
|
// Compile pixel shader.
|
|
#if PPSSPP_API(D3DX9)
|
|
HRESULT hr = dyn_D3DXCompileShader(code,
|
|
(UINT)strlen(code),
|
|
nullptr,
|
|
nullptr,
|
|
"main",
|
|
"vs_2_0",
|
|
0,
|
|
&pShaderCode,
|
|
&pErrorMsg,
|
|
pShaderTable);
|
|
#elif PPSSPP_API(D3D9_D3DCOMPILER)
|
|
HRESULT hr = dyn_D3DCompile(code,
|
|
(UINT)strlen(code),
|
|
nullptr,
|
|
nullptr,
|
|
nullptr,
|
|
"main",
|
|
"vs_2_0",
|
|
0,
|
|
0,
|
|
&pShaderCode,
|
|
&pErrorMsg);
|
|
#endif
|
|
|
|
if (pErrorMsg) {
|
|
errorMessage = (CHAR *)pErrorMsg->GetBufferPointer();
|
|
pErrorMsg->Release();
|
|
} else if (FAILED(hr)) {
|
|
errorMessage = GetStringErrorMsg(hr);
|
|
} else {
|
|
errorMessage = "";
|
|
}
|
|
|
|
if (FAILED(hr) || !pShaderCode) {
|
|
if (pShaderCode)
|
|
pShaderCode->Release();
|
|
return false;
|
|
}
|
|
|
|
// Create pixel shader.
|
|
device->CreateVertexShader( (DWORD*)pShaderCode->GetBufferPointer(),
|
|
pShader );
|
|
|
|
pShaderCode->Release();
|
|
|
|
return true;
|
|
}
|
|
|
|
} // namespace
|
|
|
|
#endif
|