15
15
16
16
RSManager RSManager::instance;
17
17
18
- #define PIXEL_SHADER_DUMP_DIR " dsfix/pixelshader_dump"
19
- #define PIXEL_SHADER_OVERRIDE_DIR " dsfix/pixelshader_override"
18
+ static const char *PIXEL_SHADER_DUMP_DIR = " dsfix/pixelshader_dump" ;
19
+ static const char *PIXEL_SHADER_OVERRIDE_DIR = " dsfix/pixelshader_override" ;
20
+ static const char *VERTEX_SHADER_DUMP_DIR = " dsfix/vertexshader_dump" ;
21
+ static const char *VERTEX_SHADER_OVERRIDE_DIR = " dsfix/vertexshader_override" ;
20
22
21
23
void RSManager::initResources () {
22
24
SDLOG (0 , " RenderstateManager resource initialization started\n " );
@@ -40,12 +42,9 @@ void RSManager::initResources() {
40
42
if (Settings::get ().getEnableTextureOverride () && Settings::get ().getEnableTexturePrefetch ())
41
43
prefetchTextures ();
42
44
43
- if (Settings::get ().getEnablePixelShaderDumping ()) {
44
- CreateDirectory (GetDirectoryFile (PIXEL_SHADER_DUMP_DIR), nullptr );
45
- DWORD error = GetLastError ();
46
- if (error && error != ERROR_ALREADY_EXISTS) {
47
- SDLOG (0 , " Failed to create %s: %s\n " , PIXEL_SHADER_DUMP_DIR, formatMessage (error));
48
- }
45
+ if (Settings::get ().getEnableShaderDumping ()) {
46
+ createDirectory (PIXEL_SHADER_DUMP_DIR);
47
+ createDirectory (VERTEX_SHADER_DUMP_DIR);
49
48
}
50
49
51
50
SDLOG (0 , " RenderstateManager resource initialization completed\n " );
@@ -869,14 +868,14 @@ HRESULT RSManager::redirectSetRenderState(D3DRENDERSTATETYPE State, DWORD Value)
869
868
870
869
HRESULT RSManager::redirectCreatePixelShader (CONST DWORD* pFunction, IDirect3DPixelShader9** ppShader)
871
870
{
872
- bool shouldDump = Settings::get ().getEnablePixelShaderDumping ();
873
- bool shouldOverride = Settings::get ().getEnablePixelShaderOverride ();
871
+ bool shouldDump = Settings::get ().getEnableShaderDumping ();
872
+ bool shouldOverride = Settings::get ().getEnableShaderOverride ();
874
873
LPD3DXBUFFER pAssemblerBuffer = nullptr ;
875
874
LPD3DXBUFFER pFunctionBuffer = nullptr ;
876
875
UINT32 hash;
877
876
878
877
if (shouldDump || shouldOverride) {
879
- if (disassemblePixelShader (pFunction, &pAssemblerBuffer)) {
878
+ if (disassembleShader (pFunction, &pAssemblerBuffer)) {
880
879
hash = SuperFastHash (static_cast <char *>(pAssemblerBuffer->GetBufferPointer ()), pAssemblerBuffer->GetBufferSize ());
881
880
}
882
881
else {
@@ -886,11 +885,11 @@ HRESULT RSManager::redirectCreatePixelShader(CONST DWORD* pFunction, IDirect3DPi
886
885
}
887
886
888
887
if (shouldDump) {
889
- dumpPixelShader (hash, pAssemblerBuffer);
888
+ dumpShader (hash, PIXEL_SHADER_DUMP_DIR , pAssemblerBuffer);
890
889
}
891
890
892
891
if (shouldOverride) {
893
- if (getOverridePixelShader (hash, &pFunctionBuffer)) {
892
+ if (getOverrideShader (hash, PIXEL_SHADER_OVERRIDE_DIR , &pFunctionBuffer)) {
894
893
pFunction = static_cast <DWORD *>(pFunctionBuffer->GetBufferPointer ());
895
894
}
896
895
}
@@ -904,33 +903,70 @@ HRESULT RSManager::redirectCreatePixelShader(CONST DWORD* pFunction, IDirect3DPi
904
903
return result;
905
904
}
906
905
907
- bool RSManager::disassemblePixelShader (CONST DWORD *pFunction, LPD3DXBUFFER *ppBuffer) {
906
+ HRESULT RSManager::redirectCreateVertexShader (CONST DWORD* pFunction, IDirect3DVertexShader9** ppShader)
907
+ {
908
+ bool shouldDump = Settings::get ().getEnableShaderDumping ();
909
+ bool shouldOverride = Settings::get ().getEnableShaderOverride ();
910
+ LPD3DXBUFFER pAssemblerBuffer = nullptr ;
911
+ LPD3DXBUFFER pFunctionBuffer = nullptr ;
912
+ UINT32 hash;
913
+
914
+ if (shouldDump || shouldOverride) {
915
+ if (disassembleShader (pFunction, &pAssemblerBuffer)) {
916
+ hash = SuperFastHash (static_cast <char *>(pAssemblerBuffer->GetBufferPointer ()), pAssemblerBuffer->GetBufferSize ());
917
+ }
918
+ else {
919
+ shouldDump = false ;
920
+ shouldOverride = false ;
921
+ }
922
+ }
923
+
924
+ if (shouldDump) {
925
+ dumpShader (hash, VERTEX_SHADER_DUMP_DIR, pAssemblerBuffer);
926
+ }
927
+
928
+ if (shouldOverride) {
929
+ if (getOverrideShader (hash, VERTEX_SHADER_OVERRIDE_DIR, &pFunctionBuffer)) {
930
+ pFunction = static_cast <DWORD *>(pFunctionBuffer->GetBufferPointer ());
931
+ }
932
+ }
933
+
934
+ HRESULT result = d3ddev->CreateVertexShader (pFunction, ppShader);
935
+ if (shouldDump || shouldOverride) {
936
+ SDLOG (1 , " Created vertex shader for hash %08x: 0x%p\n " , hash, *ppShader);
937
+ }
938
+ SAFERELEASE (pAssemblerBuffer);
939
+ SAFERELEASE (pFunctionBuffer);
940
+ return result;
941
+ }
942
+
943
+ bool RSManager::disassembleShader (CONST DWORD *pFunction, LPD3DXBUFFER *ppBuffer) {
908
944
LPD3DXBUFFER buffer = nullptr ;
909
945
HRESULT result = D3DXDisassembleShader (pFunction, false , NULL , ppBuffer);
910
946
if (result != D3D_OK) {
911
- SDLOG (0 , " Failed to disassemble pixel shader\n " );
947
+ SDLOG (0 , " Failed to disassemble shader\n " );
912
948
}
913
949
return result == D3D_OK;
914
950
}
915
951
916
- void RSManager::dumpPixelShader (UINT32 hash, LPD3DXBUFFER pBuffer) {
952
+ void RSManager::dumpShader (UINT32 hash, const char *directory , LPD3DXBUFFER pBuffer) {
917
953
char fileNameBuffer[64 ];
918
- sprintf_s (fileNameBuffer, PIXEL_SHADER_DUMP_DIR " /%08x.asm" , hash);
954
+ sprintf_s (fileNameBuffer, " %s /%08x.asm" , directory , hash);
919
955
const char *fileName = GetDirectoryFile (fileNameBuffer);
920
- if (writeFile (fileName, static_cast <char *>(pBuffer->GetBufferPointer ()), pBuffer->GetBufferSize ())) {
921
- SDLOG (0 , " Wrote disassembled pixel shader to %s\n " , fileNameBuffer);
956
+ if (writeFile (fileName, static_cast <char *>(pBuffer->GetBufferPointer ()), pBuffer->GetBufferSize () - 1 )) {
957
+ SDLOG (0 , " Wrote disassembled shader to %s\n " , fileNameBuffer);
922
958
}
923
959
else {
924
- SDLOG (0 , " Failed to write disassembled pixel shader to %s\n " , fileNameBuffer);
960
+ SDLOG (0 , " Failed to write disassembled shader to %s\n " , fileNameBuffer);
925
961
}
926
962
}
927
963
928
- bool RSManager::getOverridePixelShader (UINT32 hash, LPD3DXBUFFER *ppBuffer) {
964
+ bool RSManager::getOverrideShader (UINT32 hash, const char *directory , LPD3DXBUFFER *ppBuffer) {
929
965
char fileNameBuffer[64 ];
930
- sprintf_s (fileNameBuffer, PIXEL_SHADER_OVERRIDE_DIR " /%08x.asm" , hash);
966
+ sprintf_s (fileNameBuffer, " %s /%08x.asm" , directory , hash);
931
967
const char * fileName = GetDirectoryFile (fileNameBuffer);
932
968
if (fileExists (fileName)) {
933
- SDLOG (1 , " Pixel shader override: %08x \n " , hash );
969
+ SDLOG (1 , " Shader override: %s \n " , fileName );
934
970
LPD3DXBUFFER errors = nullptr ;
935
971
HRESULT assembleResult = D3DXAssembleShaderFromFile (fileName, nullptr , nullptr , 0 , ppBuffer, &errors);
936
972
if (assembleResult != D3D_OK) {
0 commit comments