Conflicts:
	rpcs3/Emu/GS/GL/GLGSRender.cpp
	rpcs3/Emu/GS/GL/GLGSRender.h
	rpcs3/Emu/GS/RSXTexture.cpp
	rpcs3/Emu/GS/RSXThread.cpp
	rpcs3/Emu/GS/RSXThread.h
	rpcs3/Gui/RSXDebugger.cpp
	rpcs3/rpcs3.vcxproj.filters
This commit is contained in:
elisha464 2014-02-17 19:27:17 +02:00
commit 07c9fbee7f
51 changed files with 977 additions and 464 deletions

3
.gitignore vendored
View File

@ -52,3 +52,6 @@ rpcs3/git-version.h
!/bin/dev_hdd0/game/ !/bin/dev_hdd0/game/
/bin/dev_hdd0/game/* /bin/dev_hdd0/game/*
!/bin/dev_hdd0/game/TEST12345/ !/bin/dev_hdd0/game/TEST12345/
# Ignore other system generated files
bin/dev_hdd0/home/00000001/trophy

View File

@ -1,38 +1,52 @@
#pragma once #pragma once
#include <chrono> #include <chrono>
using namespace std::chrono;
class Timer class Timer
{ {
private: private:
bool stopped; bool m_stopped;
high_resolution_clock::time_point start; std::chrono::high_resolution_clock::time_point m_start;
high_resolution_clock::time_point end; std::chrono::high_resolution_clock::time_point m_end;
public: public:
Timer() : stopped(false) Timer() : m_stopped(false)
{ {
} }
void Start() void Start()
{ {
stopped = false; m_stopped = false;
start = high_resolution_clock::now(); m_start = std::chrono::high_resolution_clock::now();
} }
void Stop() void Stop()
{ {
stopped = true; m_stopped = true;
end = high_resolution_clock::now(); m_end = std::chrono::high_resolution_clock::now();
} }
double GetElapsedTimeInSec(){return GetElapsedTimeInMicroSec() / 1000000.0;} double GetElapsedTimeInSec() const
double GetElapsedTimeInMilliSec(){return GetElapsedTimeInMicroSec() / 1000.0;}
double GetElapsedTimeInMicroSec()
{ {
if (!stopped) return GetElapsedTimeInMicroSec() / 1000000.0;
end = high_resolution_clock::now(); }
return duration_cast<microseconds>(end - start).count();
double GetElapsedTimeInMilliSec() const
{
return GetElapsedTimeInMicroSec() / 1000.0;
}
double GetElapsedTimeInMicroSec() const
{
std::chrono::high_resolution_clock::time_point now = m_stopped ? m_end : std::chrono::high_resolution_clock::now();
return std::chrono::duration_cast<std::chrono::microseconds>(now - m_start).count();
}
double GetElapsedTimeInNanoSec() const
{
std::chrono::high_resolution_clock::time_point now = m_stopped ? m_end : std::chrono::high_resolution_clock::now();
return std::chrono::duration_cast<std::chrono::nanoseconds>(now - m_start).count();
} }
}; };

192
rpcs3.sln
View File

@ -1,7 +1,5 @@
Microsoft Visual Studio Solution File, Format Version 12.00 Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2013 # Visual Studio 2012
VisualStudioVersion = 12.0.30110.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rpcs3", "rpcs3\rpcs3.vcxproj", "{70CD65B0-91D6-4FAE-9A7B-4AF55D0D1B12}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rpcs3", "rpcs3\rpcs3.vcxproj", "{70CD65B0-91D6-4FAE-9A7B-4AF55D0D1B12}"
ProjectSection(ProjectDependencies) = postProject ProjectSection(ProjectDependencies) = postProject
{CD478F02-7550-58A5-E085-CE4BC0C0AD23} = {CD478F02-7550-58A5-E085-CE4BC0C0AD23} {CD478F02-7550-58A5-E085-CE4BC0C0AD23} = {CD478F02-7550-58A5-E085-CE4BC0C0AD23}
@ -124,10 +122,6 @@ Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32 Debug|Win32 = Debug|Win32
Debug|x64 = Debug|x64 Debug|x64 = Debug|x64
DLL Debug|Win32 = DLL Debug|Win32
DLL Debug|x64 = DLL Debug|x64
DLL Release|Win32 = DLL Release|Win32
DLL Release|x64 = DLL Release|x64
Release|Win32 = Release|Win32 Release|Win32 = Release|Win32
Release|x64 = Release|x64 Release|x64 = Release|x64
EndGlobalSection EndGlobalSection
@ -136,14 +130,6 @@ Global
{70CD65B0-91D6-4FAE-9A7B-4AF55D0D1B12}.Debug|Win32.Build.0 = Debug|Win32 {70CD65B0-91D6-4FAE-9A7B-4AF55D0D1B12}.Debug|Win32.Build.0 = Debug|Win32
{70CD65B0-91D6-4FAE-9A7B-4AF55D0D1B12}.Debug|x64.ActiveCfg = Debug|x64 {70CD65B0-91D6-4FAE-9A7B-4AF55D0D1B12}.Debug|x64.ActiveCfg = Debug|x64
{70CD65B0-91D6-4FAE-9A7B-4AF55D0D1B12}.Debug|x64.Build.0 = Debug|x64 {70CD65B0-91D6-4FAE-9A7B-4AF55D0D1B12}.Debug|x64.Build.0 = Debug|x64
{70CD65B0-91D6-4FAE-9A7B-4AF55D0D1B12}.DLL Debug|Win32.ActiveCfg = Debug|Win32
{70CD65B0-91D6-4FAE-9A7B-4AF55D0D1B12}.DLL Debug|Win32.Build.0 = Debug|Win32
{70CD65B0-91D6-4FAE-9A7B-4AF55D0D1B12}.DLL Debug|x64.ActiveCfg = Debug|x64
{70CD65B0-91D6-4FAE-9A7B-4AF55D0D1B12}.DLL Debug|x64.Build.0 = Debug|x64
{70CD65B0-91D6-4FAE-9A7B-4AF55D0D1B12}.DLL Release|Win32.ActiveCfg = Release|Win32
{70CD65B0-91D6-4FAE-9A7B-4AF55D0D1B12}.DLL Release|Win32.Build.0 = Release|Win32
{70CD65B0-91D6-4FAE-9A7B-4AF55D0D1B12}.DLL Release|x64.ActiveCfg = Release|x64
{70CD65B0-91D6-4FAE-9A7B-4AF55D0D1B12}.DLL Release|x64.Build.0 = Release|x64
{70CD65B0-91D6-4FAE-9A7B-4AF55D0D1B12}.Release|Win32.ActiveCfg = Release|Win32 {70CD65B0-91D6-4FAE-9A7B-4AF55D0D1B12}.Release|Win32.ActiveCfg = Release|Win32
{70CD65B0-91D6-4FAE-9A7B-4AF55D0D1B12}.Release|Win32.Build.0 = Release|Win32 {70CD65B0-91D6-4FAE-9A7B-4AF55D0D1B12}.Release|Win32.Build.0 = Release|Win32
{70CD65B0-91D6-4FAE-9A7B-4AF55D0D1B12}.Release|x64.ActiveCfg = Release|x64 {70CD65B0-91D6-4FAE-9A7B-4AF55D0D1B12}.Release|x64.ActiveCfg = Release|x64
@ -152,14 +138,6 @@ Global
{6FCB55A5-563F-4039-1D79-1EB6ED8AAB82}.Debug|Win32.Build.0 = Debug|Win32 {6FCB55A5-563F-4039-1D79-1EB6ED8AAB82}.Debug|Win32.Build.0 = Debug|Win32
{6FCB55A5-563F-4039-1D79-1EB6ED8AAB82}.Debug|x64.ActiveCfg = Debug|x64 {6FCB55A5-563F-4039-1D79-1EB6ED8AAB82}.Debug|x64.ActiveCfg = Debug|x64
{6FCB55A5-563F-4039-1D79-1EB6ED8AAB82}.Debug|x64.Build.0 = Debug|x64 {6FCB55A5-563F-4039-1D79-1EB6ED8AAB82}.Debug|x64.Build.0 = Debug|x64
{6FCB55A5-563F-4039-1D79-1EB6ED8AAB82}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
{6FCB55A5-563F-4039-1D79-1EB6ED8AAB82}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
{6FCB55A5-563F-4039-1D79-1EB6ED8AAB82}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
{6FCB55A5-563F-4039-1D79-1EB6ED8AAB82}.DLL Debug|x64.Build.0 = DLL Debug|x64
{6FCB55A5-563F-4039-1D79-1EB6ED8AAB82}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
{6FCB55A5-563F-4039-1D79-1EB6ED8AAB82}.DLL Release|Win32.Build.0 = DLL Release|Win32
{6FCB55A5-563F-4039-1D79-1EB6ED8AAB82}.DLL Release|x64.ActiveCfg = DLL Release|x64
{6FCB55A5-563F-4039-1D79-1EB6ED8AAB82}.DLL Release|x64.Build.0 = DLL Release|x64
{6FCB55A5-563F-4039-1D79-1EB6ED8AAB82}.Release|Win32.ActiveCfg = Release|Win32 {6FCB55A5-563F-4039-1D79-1EB6ED8AAB82}.Release|Win32.ActiveCfg = Release|Win32
{6FCB55A5-563F-4039-1D79-1EB6ED8AAB82}.Release|Win32.Build.0 = Release|Win32 {6FCB55A5-563F-4039-1D79-1EB6ED8AAB82}.Release|Win32.Build.0 = Release|Win32
{6FCB55A5-563F-4039-1D79-1EB6ED8AAB82}.Release|x64.ActiveCfg = Release|x64 {6FCB55A5-563F-4039-1D79-1EB6ED8AAB82}.Release|x64.ActiveCfg = Release|x64
@ -168,14 +146,6 @@ Global
{7047EE97-7F80-A70D-6147-BC11102DB6F4}.Debug|Win32.Build.0 = Debug|Win32 {7047EE97-7F80-A70D-6147-BC11102DB6F4}.Debug|Win32.Build.0 = Debug|Win32
{7047EE97-7F80-A70D-6147-BC11102DB6F4}.Debug|x64.ActiveCfg = Debug|x64 {7047EE97-7F80-A70D-6147-BC11102DB6F4}.Debug|x64.ActiveCfg = Debug|x64
{7047EE97-7F80-A70D-6147-BC11102DB6F4}.Debug|x64.Build.0 = Debug|x64 {7047EE97-7F80-A70D-6147-BC11102DB6F4}.Debug|x64.Build.0 = Debug|x64
{7047EE97-7F80-A70D-6147-BC11102DB6F4}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
{7047EE97-7F80-A70D-6147-BC11102DB6F4}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
{7047EE97-7F80-A70D-6147-BC11102DB6F4}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
{7047EE97-7F80-A70D-6147-BC11102DB6F4}.DLL Debug|x64.Build.0 = DLL Debug|x64
{7047EE97-7F80-A70D-6147-BC11102DB6F4}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
{7047EE97-7F80-A70D-6147-BC11102DB6F4}.DLL Release|Win32.Build.0 = DLL Release|Win32
{7047EE97-7F80-A70D-6147-BC11102DB6F4}.DLL Release|x64.ActiveCfg = DLL Release|x64
{7047EE97-7F80-A70D-6147-BC11102DB6F4}.DLL Release|x64.Build.0 = DLL Release|x64
{7047EE97-7F80-A70D-6147-BC11102DB6F4}.Release|Win32.ActiveCfg = Release|Win32 {7047EE97-7F80-A70D-6147-BC11102DB6F4}.Release|Win32.ActiveCfg = Release|Win32
{7047EE97-7F80-A70D-6147-BC11102DB6F4}.Release|Win32.Build.0 = Release|Win32 {7047EE97-7F80-A70D-6147-BC11102DB6F4}.Release|Win32.Build.0 = Release|Win32
{7047EE97-7F80-A70D-6147-BC11102DB6F4}.Release|x64.ActiveCfg = Release|x64 {7047EE97-7F80-A70D-6147-BC11102DB6F4}.Release|x64.ActiveCfg = Release|x64
@ -184,14 +154,6 @@ Global
{3111D679-7796-23C4-BA0C-271F1145DA24}.Debug|Win32.Build.0 = Debug|Win32 {3111D679-7796-23C4-BA0C-271F1145DA24}.Debug|Win32.Build.0 = Debug|Win32
{3111D679-7796-23C4-BA0C-271F1145DA24}.Debug|x64.ActiveCfg = Debug|x64 {3111D679-7796-23C4-BA0C-271F1145DA24}.Debug|x64.ActiveCfg = Debug|x64
{3111D679-7796-23C4-BA0C-271F1145DA24}.Debug|x64.Build.0 = Debug|x64 {3111D679-7796-23C4-BA0C-271F1145DA24}.Debug|x64.Build.0 = Debug|x64
{3111D679-7796-23C4-BA0C-271F1145DA24}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
{3111D679-7796-23C4-BA0C-271F1145DA24}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
{3111D679-7796-23C4-BA0C-271F1145DA24}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
{3111D679-7796-23C4-BA0C-271F1145DA24}.DLL Debug|x64.Build.0 = DLL Debug|x64
{3111D679-7796-23C4-BA0C-271F1145DA24}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
{3111D679-7796-23C4-BA0C-271F1145DA24}.DLL Release|Win32.Build.0 = DLL Release|Win32
{3111D679-7796-23C4-BA0C-271F1145DA24}.DLL Release|x64.ActiveCfg = DLL Release|x64
{3111D679-7796-23C4-BA0C-271F1145DA24}.DLL Release|x64.Build.0 = DLL Release|x64
{3111D679-7796-23C4-BA0C-271F1145DA24}.Release|Win32.ActiveCfg = Release|Win32 {3111D679-7796-23C4-BA0C-271F1145DA24}.Release|Win32.ActiveCfg = Release|Win32
{3111D679-7796-23C4-BA0C-271F1145DA24}.Release|Win32.Build.0 = Release|Win32 {3111D679-7796-23C4-BA0C-271F1145DA24}.Release|Win32.Build.0 = Release|Win32
{3111D679-7796-23C4-BA0C-271F1145DA24}.Release|x64.ActiveCfg = Release|x64 {3111D679-7796-23C4-BA0C-271F1145DA24}.Release|x64.ActiveCfg = Release|x64
@ -200,14 +162,6 @@ Global
{067D9406-2A93-DACA-9449-93A2D356357D}.Debug|Win32.Build.0 = Debug|Win32 {067D9406-2A93-DACA-9449-93A2D356357D}.Debug|Win32.Build.0 = Debug|Win32
{067D9406-2A93-DACA-9449-93A2D356357D}.Debug|x64.ActiveCfg = Debug|x64 {067D9406-2A93-DACA-9449-93A2D356357D}.Debug|x64.ActiveCfg = Debug|x64
{067D9406-2A93-DACA-9449-93A2D356357D}.Debug|x64.Build.0 = Debug|x64 {067D9406-2A93-DACA-9449-93A2D356357D}.Debug|x64.Build.0 = Debug|x64
{067D9406-2A93-DACA-9449-93A2D356357D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
{067D9406-2A93-DACA-9449-93A2D356357D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
{067D9406-2A93-DACA-9449-93A2D356357D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
{067D9406-2A93-DACA-9449-93A2D356357D}.DLL Debug|x64.Build.0 = DLL Debug|x64
{067D9406-2A93-DACA-9449-93A2D356357D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
{067D9406-2A93-DACA-9449-93A2D356357D}.DLL Release|Win32.Build.0 = DLL Release|Win32
{067D9406-2A93-DACA-9449-93A2D356357D}.DLL Release|x64.ActiveCfg = DLL Release|x64
{067D9406-2A93-DACA-9449-93A2D356357D}.DLL Release|x64.Build.0 = DLL Release|x64
{067D9406-2A93-DACA-9449-93A2D356357D}.Release|Win32.ActiveCfg = Release|Win32 {067D9406-2A93-DACA-9449-93A2D356357D}.Release|Win32.ActiveCfg = Release|Win32
{067D9406-2A93-DACA-9449-93A2D356357D}.Release|Win32.Build.0 = Release|Win32 {067D9406-2A93-DACA-9449-93A2D356357D}.Release|Win32.Build.0 = Release|Win32
{067D9406-2A93-DACA-9449-93A2D356357D}.Release|x64.ActiveCfg = Release|x64 {067D9406-2A93-DACA-9449-93A2D356357D}.Release|x64.ActiveCfg = Release|x64
@ -216,14 +170,6 @@ Global
{9ED1866B-D4AE-3440-24E4-7A9475B163B2}.Debug|Win32.Build.0 = Debug|Win32 {9ED1866B-D4AE-3440-24E4-7A9475B163B2}.Debug|Win32.Build.0 = Debug|Win32
{9ED1866B-D4AE-3440-24E4-7A9475B163B2}.Debug|x64.ActiveCfg = Debug|x64 {9ED1866B-D4AE-3440-24E4-7A9475B163B2}.Debug|x64.ActiveCfg = Debug|x64
{9ED1866B-D4AE-3440-24E4-7A9475B163B2}.Debug|x64.Build.0 = Debug|x64 {9ED1866B-D4AE-3440-24E4-7A9475B163B2}.Debug|x64.Build.0 = Debug|x64
{9ED1866B-D4AE-3440-24E4-7A9475B163B2}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
{9ED1866B-D4AE-3440-24E4-7A9475B163B2}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
{9ED1866B-D4AE-3440-24E4-7A9475B163B2}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
{9ED1866B-D4AE-3440-24E4-7A9475B163B2}.DLL Debug|x64.Build.0 = DLL Debug|x64
{9ED1866B-D4AE-3440-24E4-7A9475B163B2}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
{9ED1866B-D4AE-3440-24E4-7A9475B163B2}.DLL Release|Win32.Build.0 = DLL Release|Win32
{9ED1866B-D4AE-3440-24E4-7A9475B163B2}.DLL Release|x64.ActiveCfg = DLL Release|x64
{9ED1866B-D4AE-3440-24E4-7A9475B163B2}.DLL Release|x64.Build.0 = DLL Release|x64
{9ED1866B-D4AE-3440-24E4-7A9475B163B2}.Release|Win32.ActiveCfg = Release|Win32 {9ED1866B-D4AE-3440-24E4-7A9475B163B2}.Release|Win32.ActiveCfg = Release|Win32
{9ED1866B-D4AE-3440-24E4-7A9475B163B2}.Release|Win32.Build.0 = Release|Win32 {9ED1866B-D4AE-3440-24E4-7A9475B163B2}.Release|Win32.Build.0 = Release|Win32
{9ED1866B-D4AE-3440-24E4-7A9475B163B2}.Release|x64.ActiveCfg = Release|x64 {9ED1866B-D4AE-3440-24E4-7A9475B163B2}.Release|x64.ActiveCfg = Release|x64
@ -232,14 +178,6 @@ Global
{99C9EB95-DB4C-1996-490E-5212EFBF07C3}.Debug|Win32.Build.0 = Debug|Win32 {99C9EB95-DB4C-1996-490E-5212EFBF07C3}.Debug|Win32.Build.0 = Debug|Win32
{99C9EB95-DB4C-1996-490E-5212EFBF07C3}.Debug|x64.ActiveCfg = Debug|x64 {99C9EB95-DB4C-1996-490E-5212EFBF07C3}.Debug|x64.ActiveCfg = Debug|x64
{99C9EB95-DB4C-1996-490E-5212EFBF07C3}.Debug|x64.Build.0 = Debug|x64 {99C9EB95-DB4C-1996-490E-5212EFBF07C3}.Debug|x64.Build.0 = Debug|x64
{99C9EB95-DB4C-1996-490E-5212EFBF07C3}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
{99C9EB95-DB4C-1996-490E-5212EFBF07C3}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
{99C9EB95-DB4C-1996-490E-5212EFBF07C3}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
{99C9EB95-DB4C-1996-490E-5212EFBF07C3}.DLL Debug|x64.Build.0 = DLL Debug|x64
{99C9EB95-DB4C-1996-490E-5212EFBF07C3}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
{99C9EB95-DB4C-1996-490E-5212EFBF07C3}.DLL Release|Win32.Build.0 = DLL Release|Win32
{99C9EB95-DB4C-1996-490E-5212EFBF07C3}.DLL Release|x64.ActiveCfg = DLL Release|x64
{99C9EB95-DB4C-1996-490E-5212EFBF07C3}.DLL Release|x64.Build.0 = DLL Release|x64
{99C9EB95-DB4C-1996-490E-5212EFBF07C3}.Release|Win32.ActiveCfg = Release|Win32 {99C9EB95-DB4C-1996-490E-5212EFBF07C3}.Release|Win32.ActiveCfg = Release|Win32
{99C9EB95-DB4C-1996-490E-5212EFBF07C3}.Release|Win32.Build.0 = Release|Win32 {99C9EB95-DB4C-1996-490E-5212EFBF07C3}.Release|Win32.Build.0 = Release|Win32
{99C9EB95-DB4C-1996-490E-5212EFBF07C3}.Release|x64.ActiveCfg = Release|x64 {99C9EB95-DB4C-1996-490E-5212EFBF07C3}.Release|x64.ActiveCfg = Release|x64
@ -248,14 +186,6 @@ Global
{6EDC3B79-D217-F11A-406F-F11D856493F9}.Debug|Win32.Build.0 = Debug|Win32 {6EDC3B79-D217-F11A-406F-F11D856493F9}.Debug|Win32.Build.0 = Debug|Win32
{6EDC3B79-D217-F11A-406F-F11D856493F9}.Debug|x64.ActiveCfg = Debug|x64 {6EDC3B79-D217-F11A-406F-F11D856493F9}.Debug|x64.ActiveCfg = Debug|x64
{6EDC3B79-D217-F11A-406F-F11D856493F9}.Debug|x64.Build.0 = Debug|x64 {6EDC3B79-D217-F11A-406F-F11D856493F9}.Debug|x64.Build.0 = Debug|x64
{6EDC3B79-D217-F11A-406F-F11D856493F9}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
{6EDC3B79-D217-F11A-406F-F11D856493F9}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
{6EDC3B79-D217-F11A-406F-F11D856493F9}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
{6EDC3B79-D217-F11A-406F-F11D856493F9}.DLL Debug|x64.Build.0 = DLL Debug|x64
{6EDC3B79-D217-F11A-406F-F11D856493F9}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
{6EDC3B79-D217-F11A-406F-F11D856493F9}.DLL Release|Win32.Build.0 = DLL Release|Win32
{6EDC3B79-D217-F11A-406F-F11D856493F9}.DLL Release|x64.ActiveCfg = DLL Release|x64
{6EDC3B79-D217-F11A-406F-F11D856493F9}.DLL Release|x64.Build.0 = DLL Release|x64
{6EDC3B79-D217-F11A-406F-F11D856493F9}.Release|Win32.ActiveCfg = Release|Win32 {6EDC3B79-D217-F11A-406F-F11D856493F9}.Release|Win32.ActiveCfg = Release|Win32
{6EDC3B79-D217-F11A-406F-F11D856493F9}.Release|Win32.Build.0 = Release|Win32 {6EDC3B79-D217-F11A-406F-F11D856493F9}.Release|Win32.Build.0 = Release|Win32
{6EDC3B79-D217-F11A-406F-F11D856493F9}.Release|x64.ActiveCfg = Release|x64 {6EDC3B79-D217-F11A-406F-F11D856493F9}.Release|x64.ActiveCfg = Release|x64
@ -264,14 +194,6 @@ Global
{A9AC9CF5-8E6C-0BA2-0769-6E42EDB88E25}.Debug|Win32.Build.0 = Debug|Win32 {A9AC9CF5-8E6C-0BA2-0769-6E42EDB88E25}.Debug|Win32.Build.0 = Debug|Win32
{A9AC9CF5-8E6C-0BA2-0769-6E42EDB88E25}.Debug|x64.ActiveCfg = Debug|x64 {A9AC9CF5-8E6C-0BA2-0769-6E42EDB88E25}.Debug|x64.ActiveCfg = Debug|x64
{A9AC9CF5-8E6C-0BA2-0769-6E42EDB88E25}.Debug|x64.Build.0 = Debug|x64 {A9AC9CF5-8E6C-0BA2-0769-6E42EDB88E25}.Debug|x64.Build.0 = Debug|x64
{A9AC9CF5-8E6C-0BA2-0769-6E42EDB88E25}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
{A9AC9CF5-8E6C-0BA2-0769-6E42EDB88E25}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
{A9AC9CF5-8E6C-0BA2-0769-6E42EDB88E25}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
{A9AC9CF5-8E6C-0BA2-0769-6E42EDB88E25}.DLL Debug|x64.Build.0 = DLL Debug|x64
{A9AC9CF5-8E6C-0BA2-0769-6E42EDB88E25}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
{A9AC9CF5-8E6C-0BA2-0769-6E42EDB88E25}.DLL Release|Win32.Build.0 = DLL Release|Win32
{A9AC9CF5-8E6C-0BA2-0769-6E42EDB88E25}.DLL Release|x64.ActiveCfg = DLL Release|x64
{A9AC9CF5-8E6C-0BA2-0769-6E42EDB88E25}.DLL Release|x64.Build.0 = DLL Release|x64
{A9AC9CF5-8E6C-0BA2-0769-6E42EDB88E25}.Release|Win32.ActiveCfg = Release|Win32 {A9AC9CF5-8E6C-0BA2-0769-6E42EDB88E25}.Release|Win32.ActiveCfg = Release|Win32
{A9AC9CF5-8E6C-0BA2-0769-6E42EDB88E25}.Release|Win32.Build.0 = Release|Win32 {A9AC9CF5-8E6C-0BA2-0769-6E42EDB88E25}.Release|Win32.Build.0 = Release|Win32
{A9AC9CF5-8E6C-0BA2-0769-6E42EDB88E25}.Release|x64.ActiveCfg = Release|x64 {A9AC9CF5-8E6C-0BA2-0769-6E42EDB88E25}.Release|x64.ActiveCfg = Release|x64
@ -280,14 +202,6 @@ Global
{CD478F02-7550-58A5-E085-CE4BC0C0AD23}.Debug|Win32.Build.0 = Debug|Win32 {CD478F02-7550-58A5-E085-CE4BC0C0AD23}.Debug|Win32.Build.0 = Debug|Win32
{CD478F02-7550-58A5-E085-CE4BC0C0AD23}.Debug|x64.ActiveCfg = Debug|x64 {CD478F02-7550-58A5-E085-CE4BC0C0AD23}.Debug|x64.ActiveCfg = Debug|x64
{CD478F02-7550-58A5-E085-CE4BC0C0AD23}.Debug|x64.Build.0 = Debug|x64 {CD478F02-7550-58A5-E085-CE4BC0C0AD23}.Debug|x64.Build.0 = Debug|x64
{CD478F02-7550-58A5-E085-CE4BC0C0AD23}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
{CD478F02-7550-58A5-E085-CE4BC0C0AD23}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
{CD478F02-7550-58A5-E085-CE4BC0C0AD23}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
{CD478F02-7550-58A5-E085-CE4BC0C0AD23}.DLL Debug|x64.Build.0 = DLL Debug|x64
{CD478F02-7550-58A5-E085-CE4BC0C0AD23}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
{CD478F02-7550-58A5-E085-CE4BC0C0AD23}.DLL Release|Win32.Build.0 = DLL Release|Win32
{CD478F02-7550-58A5-E085-CE4BC0C0AD23}.DLL Release|x64.ActiveCfg = DLL Release|x64
{CD478F02-7550-58A5-E085-CE4BC0C0AD23}.DLL Release|x64.Build.0 = DLL Release|x64
{CD478F02-7550-58A5-E085-CE4BC0C0AD23}.Release|Win32.ActiveCfg = Release|Win32 {CD478F02-7550-58A5-E085-CE4BC0C0AD23}.Release|Win32.ActiveCfg = Release|Win32
{CD478F02-7550-58A5-E085-CE4BC0C0AD23}.Release|Win32.Build.0 = Release|Win32 {CD478F02-7550-58A5-E085-CE4BC0C0AD23}.Release|Win32.Build.0 = Release|Win32
{CD478F02-7550-58A5-E085-CE4BC0C0AD23}.Release|x64.ActiveCfg = Release|x64 {CD478F02-7550-58A5-E085-CE4BC0C0AD23}.Release|x64.ActiveCfg = Release|x64
@ -296,14 +210,6 @@ Global
{22B14659-C5B6-B775-868D-A49198FEAD4A}.Debug|Win32.Build.0 = Debug|Win32 {22B14659-C5B6-B775-868D-A49198FEAD4A}.Debug|Win32.Build.0 = Debug|Win32
{22B14659-C5B6-B775-868D-A49198FEAD4A}.Debug|x64.ActiveCfg = Debug|x64 {22B14659-C5B6-B775-868D-A49198FEAD4A}.Debug|x64.ActiveCfg = Debug|x64
{22B14659-C5B6-B775-868D-A49198FEAD4A}.Debug|x64.Build.0 = Debug|x64 {22B14659-C5B6-B775-868D-A49198FEAD4A}.Debug|x64.Build.0 = Debug|x64
{22B14659-C5B6-B775-868D-A49198FEAD4A}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
{22B14659-C5B6-B775-868D-A49198FEAD4A}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
{22B14659-C5B6-B775-868D-A49198FEAD4A}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
{22B14659-C5B6-B775-868D-A49198FEAD4A}.DLL Debug|x64.Build.0 = DLL Debug|x64
{22B14659-C5B6-B775-868D-A49198FEAD4A}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
{22B14659-C5B6-B775-868D-A49198FEAD4A}.DLL Release|Win32.Build.0 = DLL Release|Win32
{22B14659-C5B6-B775-868D-A49198FEAD4A}.DLL Release|x64.ActiveCfg = DLL Release|x64
{22B14659-C5B6-B775-868D-A49198FEAD4A}.DLL Release|x64.Build.0 = DLL Release|x64
{22B14659-C5B6-B775-868D-A49198FEAD4A}.Release|Win32.ActiveCfg = Release|Win32 {22B14659-C5B6-B775-868D-A49198FEAD4A}.Release|Win32.ActiveCfg = Release|Win32
{22B14659-C5B6-B775-868D-A49198FEAD4A}.Release|Win32.Build.0 = Release|Win32 {22B14659-C5B6-B775-868D-A49198FEAD4A}.Release|Win32.Build.0 = Release|Win32
{22B14659-C5B6-B775-868D-A49198FEAD4A}.Release|x64.ActiveCfg = Release|x64 {22B14659-C5B6-B775-868D-A49198FEAD4A}.Release|x64.ActiveCfg = Release|x64
@ -312,14 +218,6 @@ Global
{FAF0CB93-F7CE-A6B8-8342-19CE99BAF774}.Debug|Win32.Build.0 = Debug|Win32 {FAF0CB93-F7CE-A6B8-8342-19CE99BAF774}.Debug|Win32.Build.0 = Debug|Win32
{FAF0CB93-F7CE-A6B8-8342-19CE99BAF774}.Debug|x64.ActiveCfg = Debug|x64 {FAF0CB93-F7CE-A6B8-8342-19CE99BAF774}.Debug|x64.ActiveCfg = Debug|x64
{FAF0CB93-F7CE-A6B8-8342-19CE99BAF774}.Debug|x64.Build.0 = Debug|x64 {FAF0CB93-F7CE-A6B8-8342-19CE99BAF774}.Debug|x64.Build.0 = Debug|x64
{FAF0CB93-F7CE-A6B8-8342-19CE99BAF774}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
{FAF0CB93-F7CE-A6B8-8342-19CE99BAF774}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
{FAF0CB93-F7CE-A6B8-8342-19CE99BAF774}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
{FAF0CB93-F7CE-A6B8-8342-19CE99BAF774}.DLL Debug|x64.Build.0 = DLL Debug|x64
{FAF0CB93-F7CE-A6B8-8342-19CE99BAF774}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
{FAF0CB93-F7CE-A6B8-8342-19CE99BAF774}.DLL Release|Win32.Build.0 = DLL Release|Win32
{FAF0CB93-F7CE-A6B8-8342-19CE99BAF774}.DLL Release|x64.ActiveCfg = DLL Release|x64
{FAF0CB93-F7CE-A6B8-8342-19CE99BAF774}.DLL Release|x64.Build.0 = DLL Release|x64
{FAF0CB93-F7CE-A6B8-8342-19CE99BAF774}.Release|Win32.ActiveCfg = Release|Win32 {FAF0CB93-F7CE-A6B8-8342-19CE99BAF774}.Release|Win32.ActiveCfg = Release|Win32
{FAF0CB93-F7CE-A6B8-8342-19CE99BAF774}.Release|Win32.Build.0 = Release|Win32 {FAF0CB93-F7CE-A6B8-8342-19CE99BAF774}.Release|Win32.Build.0 = Release|Win32
{FAF0CB93-F7CE-A6B8-8342-19CE99BAF774}.Release|x64.ActiveCfg = Release|x64 {FAF0CB93-F7CE-A6B8-8342-19CE99BAF774}.Release|x64.ActiveCfg = Release|x64
@ -328,14 +226,6 @@ Global
{46333DC3-B4A5-3DCC-E8BF-A3F20ADC56D2}.Debug|Win32.Build.0 = Debug|Win32 {46333DC3-B4A5-3DCC-E8BF-A3F20ADC56D2}.Debug|Win32.Build.0 = Debug|Win32
{46333DC3-B4A5-3DCC-E8BF-A3F20ADC56D2}.Debug|x64.ActiveCfg = Debug|x64 {46333DC3-B4A5-3DCC-E8BF-A3F20ADC56D2}.Debug|x64.ActiveCfg = Debug|x64
{46333DC3-B4A5-3DCC-E8BF-A3F20ADC56D2}.Debug|x64.Build.0 = Debug|x64 {46333DC3-B4A5-3DCC-E8BF-A3F20ADC56D2}.Debug|x64.Build.0 = Debug|x64
{46333DC3-B4A5-3DCC-E8BF-A3F20ADC56D2}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
{46333DC3-B4A5-3DCC-E8BF-A3F20ADC56D2}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
{46333DC3-B4A5-3DCC-E8BF-A3F20ADC56D2}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
{46333DC3-B4A5-3DCC-E8BF-A3F20ADC56D2}.DLL Debug|x64.Build.0 = DLL Debug|x64
{46333DC3-B4A5-3DCC-E8BF-A3F20ADC56D2}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
{46333DC3-B4A5-3DCC-E8BF-A3F20ADC56D2}.DLL Release|Win32.Build.0 = DLL Release|Win32
{46333DC3-B4A5-3DCC-E8BF-A3F20ADC56D2}.DLL Release|x64.ActiveCfg = DLL Release|x64
{46333DC3-B4A5-3DCC-E8BF-A3F20ADC56D2}.DLL Release|x64.Build.0 = DLL Release|x64
{46333DC3-B4A5-3DCC-E8BF-A3F20ADC56D2}.Release|Win32.ActiveCfg = Release|Win32 {46333DC3-B4A5-3DCC-E8BF-A3F20ADC56D2}.Release|Win32.ActiveCfg = Release|Win32
{46333DC3-B4A5-3DCC-E8BF-A3F20ADC56D2}.Release|Win32.Build.0 = Release|Win32 {46333DC3-B4A5-3DCC-E8BF-A3F20ADC56D2}.Release|Win32.Build.0 = Release|Win32
{46333DC3-B4A5-3DCC-E8BF-A3F20ADC56D2}.Release|x64.ActiveCfg = Release|x64 {46333DC3-B4A5-3DCC-E8BF-A3F20ADC56D2}.Release|x64.ActiveCfg = Release|x64
@ -344,14 +234,6 @@ Global
{5C363C34-4741-7036-861C-2E2279CF552E}.Debug|Win32.Build.0 = Debug|Win32 {5C363C34-4741-7036-861C-2E2279CF552E}.Debug|Win32.Build.0 = Debug|Win32
{5C363C34-4741-7036-861C-2E2279CF552E}.Debug|x64.ActiveCfg = Debug|x64 {5C363C34-4741-7036-861C-2E2279CF552E}.Debug|x64.ActiveCfg = Debug|x64
{5C363C34-4741-7036-861C-2E2279CF552E}.Debug|x64.Build.0 = Debug|x64 {5C363C34-4741-7036-861C-2E2279CF552E}.Debug|x64.Build.0 = Debug|x64
{5C363C34-4741-7036-861C-2E2279CF552E}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
{5C363C34-4741-7036-861C-2E2279CF552E}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
{5C363C34-4741-7036-861C-2E2279CF552E}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
{5C363C34-4741-7036-861C-2E2279CF552E}.DLL Debug|x64.Build.0 = DLL Debug|x64
{5C363C34-4741-7036-861C-2E2279CF552E}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
{5C363C34-4741-7036-861C-2E2279CF552E}.DLL Release|Win32.Build.0 = DLL Release|Win32
{5C363C34-4741-7036-861C-2E2279CF552E}.DLL Release|x64.ActiveCfg = DLL Release|x64
{5C363C34-4741-7036-861C-2E2279CF552E}.DLL Release|x64.Build.0 = DLL Release|x64
{5C363C34-4741-7036-861C-2E2279CF552E}.Release|Win32.ActiveCfg = Release|Win32 {5C363C34-4741-7036-861C-2E2279CF552E}.Release|Win32.ActiveCfg = Release|Win32
{5C363C34-4741-7036-861C-2E2279CF552E}.Release|Win32.Build.0 = Release|Win32 {5C363C34-4741-7036-861C-2E2279CF552E}.Release|Win32.Build.0 = Release|Win32
{5C363C34-4741-7036-861C-2E2279CF552E}.Release|x64.ActiveCfg = Release|x64 {5C363C34-4741-7036-861C-2E2279CF552E}.Release|x64.ActiveCfg = Release|x64
@ -360,14 +242,6 @@ Global
{76169FE8-0814-4F36-6409-699EF1A23001}.Debug|Win32.Build.0 = Debug|Win32 {76169FE8-0814-4F36-6409-699EF1A23001}.Debug|Win32.Build.0 = Debug|Win32
{76169FE8-0814-4F36-6409-699EF1A23001}.Debug|x64.ActiveCfg = Debug|x64 {76169FE8-0814-4F36-6409-699EF1A23001}.Debug|x64.ActiveCfg = Debug|x64
{76169FE8-0814-4F36-6409-699EF1A23001}.Debug|x64.Build.0 = Debug|x64 {76169FE8-0814-4F36-6409-699EF1A23001}.Debug|x64.Build.0 = Debug|x64
{76169FE8-0814-4F36-6409-699EF1A23001}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
{76169FE8-0814-4F36-6409-699EF1A23001}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
{76169FE8-0814-4F36-6409-699EF1A23001}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
{76169FE8-0814-4F36-6409-699EF1A23001}.DLL Debug|x64.Build.0 = DLL Debug|x64
{76169FE8-0814-4F36-6409-699EF1A23001}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
{76169FE8-0814-4F36-6409-699EF1A23001}.DLL Release|Win32.Build.0 = DLL Release|Win32
{76169FE8-0814-4F36-6409-699EF1A23001}.DLL Release|x64.ActiveCfg = DLL Release|x64
{76169FE8-0814-4F36-6409-699EF1A23001}.DLL Release|x64.Build.0 = DLL Release|x64
{76169FE8-0814-4F36-6409-699EF1A23001}.Release|Win32.ActiveCfg = Release|Win32 {76169FE8-0814-4F36-6409-699EF1A23001}.Release|Win32.ActiveCfg = Release|Win32
{76169FE8-0814-4F36-6409-699EF1A23001}.Release|Win32.Build.0 = Release|Win32 {76169FE8-0814-4F36-6409-699EF1A23001}.Release|Win32.Build.0 = Release|Win32
{76169FE8-0814-4F36-6409-699EF1A23001}.Release|x64.ActiveCfg = Release|x64 {76169FE8-0814-4F36-6409-699EF1A23001}.Release|x64.ActiveCfg = Release|x64
@ -376,14 +250,6 @@ Global
{949C6DB8-E638-6EC6-AB31-BCCFD1379E01}.Debug|Win32.Build.0 = Debug|Win32 {949C6DB8-E638-6EC6-AB31-BCCFD1379E01}.Debug|Win32.Build.0 = Debug|Win32
{949C6DB8-E638-6EC6-AB31-BCCFD1379E01}.Debug|x64.ActiveCfg = Debug|x64 {949C6DB8-E638-6EC6-AB31-BCCFD1379E01}.Debug|x64.ActiveCfg = Debug|x64
{949C6DB8-E638-6EC6-AB31-BCCFD1379E01}.Debug|x64.Build.0 = Debug|x64 {949C6DB8-E638-6EC6-AB31-BCCFD1379E01}.Debug|x64.Build.0 = Debug|x64
{949C6DB8-E638-6EC6-AB31-BCCFD1379E01}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
{949C6DB8-E638-6EC6-AB31-BCCFD1379E01}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
{949C6DB8-E638-6EC6-AB31-BCCFD1379E01}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
{949C6DB8-E638-6EC6-AB31-BCCFD1379E01}.DLL Debug|x64.Build.0 = DLL Debug|x64
{949C6DB8-E638-6EC6-AB31-BCCFD1379E01}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
{949C6DB8-E638-6EC6-AB31-BCCFD1379E01}.DLL Release|Win32.Build.0 = DLL Release|Win32
{949C6DB8-E638-6EC6-AB31-BCCFD1379E01}.DLL Release|x64.ActiveCfg = DLL Release|x64
{949C6DB8-E638-6EC6-AB31-BCCFD1379E01}.DLL Release|x64.Build.0 = DLL Release|x64
{949C6DB8-E638-6EC6-AB31-BCCFD1379E01}.Release|Win32.ActiveCfg = Release|Win32 {949C6DB8-E638-6EC6-AB31-BCCFD1379E01}.Release|Win32.ActiveCfg = Release|Win32
{949C6DB8-E638-6EC6-AB31-BCCFD1379E01}.Release|Win32.Build.0 = Release|Win32 {949C6DB8-E638-6EC6-AB31-BCCFD1379E01}.Release|Win32.Build.0 = Release|Win32
{949C6DB8-E638-6EC6-AB31-BCCFD1379E01}.Release|x64.ActiveCfg = Release|x64 {949C6DB8-E638-6EC6-AB31-BCCFD1379E01}.Release|x64.ActiveCfg = Release|x64
@ -392,14 +258,6 @@ Global
{B87216CD-6C64-1DB0-D900-BC6E745C1DF9}.Debug|Win32.Build.0 = Debug|Win32 {B87216CD-6C64-1DB0-D900-BC6E745C1DF9}.Debug|Win32.Build.0 = Debug|Win32
{B87216CD-6C64-1DB0-D900-BC6E745C1DF9}.Debug|x64.ActiveCfg = Debug|x64 {B87216CD-6C64-1DB0-D900-BC6E745C1DF9}.Debug|x64.ActiveCfg = Debug|x64
{B87216CD-6C64-1DB0-D900-BC6E745C1DF9}.Debug|x64.Build.0 = Debug|x64 {B87216CD-6C64-1DB0-D900-BC6E745C1DF9}.Debug|x64.Build.0 = Debug|x64
{B87216CD-6C64-1DB0-D900-BC6E745C1DF9}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
{B87216CD-6C64-1DB0-D900-BC6E745C1DF9}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
{B87216CD-6C64-1DB0-D900-BC6E745C1DF9}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
{B87216CD-6C64-1DB0-D900-BC6E745C1DF9}.DLL Debug|x64.Build.0 = DLL Debug|x64
{B87216CD-6C64-1DB0-D900-BC6E745C1DF9}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
{B87216CD-6C64-1DB0-D900-BC6E745C1DF9}.DLL Release|Win32.Build.0 = DLL Release|Win32
{B87216CD-6C64-1DB0-D900-BC6E745C1DF9}.DLL Release|x64.ActiveCfg = DLL Release|x64
{B87216CD-6C64-1DB0-D900-BC6E745C1DF9}.DLL Release|x64.Build.0 = DLL Release|x64
{B87216CD-6C64-1DB0-D900-BC6E745C1DF9}.Release|Win32.ActiveCfg = Release|Win32 {B87216CD-6C64-1DB0-D900-BC6E745C1DF9}.Release|Win32.ActiveCfg = Release|Win32
{B87216CD-6C64-1DB0-D900-BC6E745C1DF9}.Release|Win32.Build.0 = Release|Win32 {B87216CD-6C64-1DB0-D900-BC6E745C1DF9}.Release|Win32.Build.0 = Release|Win32
{B87216CD-6C64-1DB0-D900-BC6E745C1DF9}.Release|x64.ActiveCfg = Release|x64 {B87216CD-6C64-1DB0-D900-BC6E745C1DF9}.Release|x64.ActiveCfg = Release|x64
@ -408,14 +266,6 @@ Global
{AFF2C68B-B867-DD50-6AC5-74B09D41F8EA}.Debug|Win32.Build.0 = Debug|Win32 {AFF2C68B-B867-DD50-6AC5-74B09D41F8EA}.Debug|Win32.Build.0 = Debug|Win32
{AFF2C68B-B867-DD50-6AC5-74B09D41F8EA}.Debug|x64.ActiveCfg = Debug|x64 {AFF2C68B-B867-DD50-6AC5-74B09D41F8EA}.Debug|x64.ActiveCfg = Debug|x64
{AFF2C68B-B867-DD50-6AC5-74B09D41F8EA}.Debug|x64.Build.0 = Debug|x64 {AFF2C68B-B867-DD50-6AC5-74B09D41F8EA}.Debug|x64.Build.0 = Debug|x64
{AFF2C68B-B867-DD50-6AC5-74B09D41F8EA}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
{AFF2C68B-B867-DD50-6AC5-74B09D41F8EA}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
{AFF2C68B-B867-DD50-6AC5-74B09D41F8EA}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
{AFF2C68B-B867-DD50-6AC5-74B09D41F8EA}.DLL Debug|x64.Build.0 = DLL Debug|x64
{AFF2C68B-B867-DD50-6AC5-74B09D41F8EA}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
{AFF2C68B-B867-DD50-6AC5-74B09D41F8EA}.DLL Release|Win32.Build.0 = DLL Release|Win32
{AFF2C68B-B867-DD50-6AC5-74B09D41F8EA}.DLL Release|x64.ActiveCfg = DLL Release|x64
{AFF2C68B-B867-DD50-6AC5-74B09D41F8EA}.DLL Release|x64.Build.0 = DLL Release|x64
{AFF2C68B-B867-DD50-6AC5-74B09D41F8EA}.Release|Win32.ActiveCfg = Release|Win32 {AFF2C68B-B867-DD50-6AC5-74B09D41F8EA}.Release|Win32.ActiveCfg = Release|Win32
{AFF2C68B-B867-DD50-6AC5-74B09D41F8EA}.Release|Win32.Build.0 = Release|Win32 {AFF2C68B-B867-DD50-6AC5-74B09D41F8EA}.Release|Win32.Build.0 = Release|Win32
{AFF2C68B-B867-DD50-6AC5-74B09D41F8EA}.Release|x64.ActiveCfg = Release|x64 {AFF2C68B-B867-DD50-6AC5-74B09D41F8EA}.Release|x64.ActiveCfg = Release|x64
@ -424,14 +274,6 @@ Global
{6FDC76D5-CB44-B9F8-5EF6-C59B020719DF}.Debug|Win32.Build.0 = Debug|Win32 {6FDC76D5-CB44-B9F8-5EF6-C59B020719DF}.Debug|Win32.Build.0 = Debug|Win32
{6FDC76D5-CB44-B9F8-5EF6-C59B020719DF}.Debug|x64.ActiveCfg = Debug|x64 {6FDC76D5-CB44-B9F8-5EF6-C59B020719DF}.Debug|x64.ActiveCfg = Debug|x64
{6FDC76D5-CB44-B9F8-5EF6-C59B020719DF}.Debug|x64.Build.0 = Debug|x64 {6FDC76D5-CB44-B9F8-5EF6-C59B020719DF}.Debug|x64.Build.0 = Debug|x64
{6FDC76D5-CB44-B9F8-5EF6-C59B020719DF}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
{6FDC76D5-CB44-B9F8-5EF6-C59B020719DF}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
{6FDC76D5-CB44-B9F8-5EF6-C59B020719DF}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
{6FDC76D5-CB44-B9F8-5EF6-C59B020719DF}.DLL Debug|x64.Build.0 = DLL Debug|x64
{6FDC76D5-CB44-B9F8-5EF6-C59B020719DF}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
{6FDC76D5-CB44-B9F8-5EF6-C59B020719DF}.DLL Release|Win32.Build.0 = DLL Release|Win32
{6FDC76D5-CB44-B9F8-5EF6-C59B020719DF}.DLL Release|x64.ActiveCfg = DLL Release|x64
{6FDC76D5-CB44-B9F8-5EF6-C59B020719DF}.DLL Release|x64.Build.0 = DLL Release|x64
{6FDC76D5-CB44-B9F8-5EF6-C59B020719DF}.Release|Win32.ActiveCfg = Release|Win32 {6FDC76D5-CB44-B9F8-5EF6-C59B020719DF}.Release|Win32.ActiveCfg = Release|Win32
{6FDC76D5-CB44-B9F8-5EF6-C59B020719DF}.Release|Win32.Build.0 = Release|Win32 {6FDC76D5-CB44-B9F8-5EF6-C59B020719DF}.Release|Win32.Build.0 = Release|Win32
{6FDC76D5-CB44-B9F8-5EF6-C59B020719DF}.Release|x64.ActiveCfg = Release|x64 {6FDC76D5-CB44-B9F8-5EF6-C59B020719DF}.Release|x64.ActiveCfg = Release|x64
@ -440,14 +282,6 @@ Global
{8BECCA95-C7D7-CFF8-FDB1-4950E9F8E8E6}.Debug|Win32.Build.0 = Debug|Win32 {8BECCA95-C7D7-CFF8-FDB1-4950E9F8E8E6}.Debug|Win32.Build.0 = Debug|Win32
{8BECCA95-C7D7-CFF8-FDB1-4950E9F8E8E6}.Debug|x64.ActiveCfg = Debug|x64 {8BECCA95-C7D7-CFF8-FDB1-4950E9F8E8E6}.Debug|x64.ActiveCfg = Debug|x64
{8BECCA95-C7D7-CFF8-FDB1-4950E9F8E8E6}.Debug|x64.Build.0 = Debug|x64 {8BECCA95-C7D7-CFF8-FDB1-4950E9F8E8E6}.Debug|x64.Build.0 = Debug|x64
{8BECCA95-C7D7-CFF8-FDB1-4950E9F8E8E6}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
{8BECCA95-C7D7-CFF8-FDB1-4950E9F8E8E6}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
{8BECCA95-C7D7-CFF8-FDB1-4950E9F8E8E6}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
{8BECCA95-C7D7-CFF8-FDB1-4950E9F8E8E6}.DLL Debug|x64.Build.0 = DLL Debug|x64
{8BECCA95-C7D7-CFF8-FDB1-4950E9F8E8E6}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
{8BECCA95-C7D7-CFF8-FDB1-4950E9F8E8E6}.DLL Release|Win32.Build.0 = DLL Release|Win32
{8BECCA95-C7D7-CFF8-FDB1-4950E9F8E8E6}.DLL Release|x64.ActiveCfg = DLL Release|x64
{8BECCA95-C7D7-CFF8-FDB1-4950E9F8E8E6}.DLL Release|x64.Build.0 = DLL Release|x64
{8BECCA95-C7D7-CFF8-FDB1-4950E9F8E8E6}.Release|Win32.ActiveCfg = Release|Win32 {8BECCA95-C7D7-CFF8-FDB1-4950E9F8E8E6}.Release|Win32.ActiveCfg = Release|Win32
{8BECCA95-C7D7-CFF8-FDB1-4950E9F8E8E6}.Release|Win32.Build.0 = Release|Win32 {8BECCA95-C7D7-CFF8-FDB1-4950E9F8E8E6}.Release|Win32.Build.0 = Release|Win32
{8BECCA95-C7D7-CFF8-FDB1-4950E9F8E8E6}.Release|x64.ActiveCfg = Release|x64 {8BECCA95-C7D7-CFF8-FDB1-4950E9F8E8E6}.Release|x64.ActiveCfg = Release|x64
@ -456,14 +290,6 @@ Global
{87B42A9C-3F5C-53D7-9017-2B1CAE39457D}.Debug|Win32.Build.0 = Debug|Win32 {87B42A9C-3F5C-53D7-9017-2B1CAE39457D}.Debug|Win32.Build.0 = Debug|Win32
{87B42A9C-3F5C-53D7-9017-2B1CAE39457D}.Debug|x64.ActiveCfg = Debug|x64 {87B42A9C-3F5C-53D7-9017-2B1CAE39457D}.Debug|x64.ActiveCfg = Debug|x64
{87B42A9C-3F5C-53D7-9017-2B1CAE39457D}.Debug|x64.Build.0 = Debug|x64 {87B42A9C-3F5C-53D7-9017-2B1CAE39457D}.Debug|x64.Build.0 = Debug|x64
{87B42A9C-3F5C-53D7-9017-2B1CAE39457D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
{87B42A9C-3F5C-53D7-9017-2B1CAE39457D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
{87B42A9C-3F5C-53D7-9017-2B1CAE39457D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
{87B42A9C-3F5C-53D7-9017-2B1CAE39457D}.DLL Debug|x64.Build.0 = DLL Debug|x64
{87B42A9C-3F5C-53D7-9017-2B1CAE39457D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
{87B42A9C-3F5C-53D7-9017-2B1CAE39457D}.DLL Release|Win32.Build.0 = DLL Release|Win32
{87B42A9C-3F5C-53D7-9017-2B1CAE39457D}.DLL Release|x64.ActiveCfg = DLL Release|x64
{87B42A9C-3F5C-53D7-9017-2B1CAE39457D}.DLL Release|x64.Build.0 = DLL Release|x64
{87B42A9C-3F5C-53D7-9017-2B1CAE39457D}.Release|Win32.ActiveCfg = Release|Win32 {87B42A9C-3F5C-53D7-9017-2B1CAE39457D}.Release|Win32.ActiveCfg = Release|Win32
{87B42A9C-3F5C-53D7-9017-2B1CAE39457D}.Release|Win32.Build.0 = Release|Win32 {87B42A9C-3F5C-53D7-9017-2B1CAE39457D}.Release|Win32.Build.0 = Release|Win32
{87B42A9C-3F5C-53D7-9017-2B1CAE39457D}.Release|x64.ActiveCfg = Release|x64 {87B42A9C-3F5C-53D7-9017-2B1CAE39457D}.Release|x64.ActiveCfg = Release|x64
@ -472,14 +298,6 @@ Global
{23E1C437-A951-5943-8639-A17F3CF2E606}.Debug|Win32.Build.0 = Debug|Win32 {23E1C437-A951-5943-8639-A17F3CF2E606}.Debug|Win32.Build.0 = Debug|Win32
{23E1C437-A951-5943-8639-A17F3CF2E606}.Debug|x64.ActiveCfg = Debug|x64 {23E1C437-A951-5943-8639-A17F3CF2E606}.Debug|x64.ActiveCfg = Debug|x64
{23E1C437-A951-5943-8639-A17F3CF2E606}.Debug|x64.Build.0 = Debug|x64 {23E1C437-A951-5943-8639-A17F3CF2E606}.Debug|x64.Build.0 = Debug|x64
{23E1C437-A951-5943-8639-A17F3CF2E606}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
{23E1C437-A951-5943-8639-A17F3CF2E606}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
{23E1C437-A951-5943-8639-A17F3CF2E606}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
{23E1C437-A951-5943-8639-A17F3CF2E606}.DLL Debug|x64.Build.0 = DLL Debug|x64
{23E1C437-A951-5943-8639-A17F3CF2E606}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
{23E1C437-A951-5943-8639-A17F3CF2E606}.DLL Release|Win32.Build.0 = DLL Release|Win32
{23E1C437-A951-5943-8639-A17F3CF2E606}.DLL Release|x64.ActiveCfg = DLL Release|x64
{23E1C437-A951-5943-8639-A17F3CF2E606}.DLL Release|x64.Build.0 = DLL Release|x64
{23E1C437-A951-5943-8639-A17F3CF2E606}.Release|Win32.ActiveCfg = Release|Win32 {23E1C437-A951-5943-8639-A17F3CF2E606}.Release|Win32.ActiveCfg = Release|Win32
{23E1C437-A951-5943-8639-A17F3CF2E606}.Release|Win32.Build.0 = Release|Win32 {23E1C437-A951-5943-8639-A17F3CF2E606}.Release|Win32.Build.0 = Release|Win32
{23E1C437-A951-5943-8639-A17F3CF2E606}.Release|x64.ActiveCfg = Release|x64 {23E1C437-A951-5943-8639-A17F3CF2E606}.Release|x64.ActiveCfg = Release|x64
@ -488,14 +306,6 @@ Global
{74827EBD-93DC-5110-BA95-3F2AB029B6B0}.Debug|Win32.Build.0 = Debug|Win32 {74827EBD-93DC-5110-BA95-3F2AB029B6B0}.Debug|Win32.Build.0 = Debug|Win32
{74827EBD-93DC-5110-BA95-3F2AB029B6B0}.Debug|x64.ActiveCfg = Debug|x64 {74827EBD-93DC-5110-BA95-3F2AB029B6B0}.Debug|x64.ActiveCfg = Debug|x64
{74827EBD-93DC-5110-BA95-3F2AB029B6B0}.Debug|x64.Build.0 = Debug|x64 {74827EBD-93DC-5110-BA95-3F2AB029B6B0}.Debug|x64.Build.0 = Debug|x64
{74827EBD-93DC-5110-BA95-3F2AB029B6B0}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
{74827EBD-93DC-5110-BA95-3F2AB029B6B0}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
{74827EBD-93DC-5110-BA95-3F2AB029B6B0}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
{74827EBD-93DC-5110-BA95-3F2AB029B6B0}.DLL Debug|x64.Build.0 = DLL Debug|x64
{74827EBD-93DC-5110-BA95-3F2AB029B6B0}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
{74827EBD-93DC-5110-BA95-3F2AB029B6B0}.DLL Release|Win32.Build.0 = DLL Release|Win32
{74827EBD-93DC-5110-BA95-3F2AB029B6B0}.DLL Release|x64.ActiveCfg = DLL Release|x64
{74827EBD-93DC-5110-BA95-3F2AB029B6B0}.DLL Release|x64.Build.0 = DLL Release|x64
{74827EBD-93DC-5110-BA95-3F2AB029B6B0}.Release|Win32.ActiveCfg = Release|Win32 {74827EBD-93DC-5110-BA95-3F2AB029B6B0}.Release|Win32.ActiveCfg = Release|Win32
{74827EBD-93DC-5110-BA95-3F2AB029B6B0}.Release|Win32.Build.0 = Release|Win32 {74827EBD-93DC-5110-BA95-3F2AB029B6B0}.Release|Win32.Build.0 = Release|Win32
{74827EBD-93DC-5110-BA95-3F2AB029B6B0}.Release|x64.ActiveCfg = Release|x64 {74827EBD-93DC-5110-BA95-3F2AB029B6B0}.Release|x64.ActiveCfg = Release|x64

View File

@ -1,6 +1,7 @@
#include "stdafx.h" #include "stdafx.h"
#include "VFS.h" #include "VFS.h"
#include "Emu/HDD/HDD.h" #include "Emu/HDD/HDD.h"
#include "vfsDeviceLocalFile.h"
int sort_devices(const void* _a, const void* _b) int sort_devices(const void* _a, const void* _b)
{ {
@ -22,7 +23,7 @@ void VFS::Mount(const wxString& ps3_path, const wxString& local_path, vfsDevice*
if(m_devices.GetCount() > 1) if(m_devices.GetCount() > 1)
{ {
std::qsort(m_devices.GetPtr(), m_devices.GetCount(), sizeof(vfsDevice*), sort_devices); //std::qsort(m_devices.GetPtr(), m_devices.GetCount(), sizeof(vfsDevice*), sort_devices);
} }
} }
@ -49,37 +50,166 @@ void VFS::UnMountAll()
} }
} }
vfsStream* VFS::Open(const wxString& ps3_path, vfsOpenMode mode) vfsFileBase* VFS::OpenFile(const wxString& ps3_path, vfsOpenMode mode) const
{ {
vfsDevice* stream = nullptr;
wxString path; wxString path;
if(vfsDevice* dev = GetDevice(ps3_path, path)) if(vfsDevice* dev = GetDevice(ps3_path, path))
{ {
stream = dev->GetNew(); if(vfsFileBase* res = dev->GetNewFileStream())
stream->Open(path, mode); {
res->Open(path, mode);
return res;
}
} }
return stream; return nullptr;
} }
void VFS::Create(const wxString& ps3_path) vfsDirBase* VFS::OpenDir(const wxString& ps3_path) const
{ {
wxString path; wxString path;
if(vfsDevice* dev = GetDevice(ps3_path, path)) if(vfsDevice* dev = GetDevice(ps3_path, path))
{ {
dev->Create(path); if(vfsDirBase* res = dev->GetNewDirStream())
{
res->Open(path);
return res;
}
} }
return nullptr;
} }
void VFS::Close(vfsStream*& device) bool VFS::CreateFile(const wxString& ps3_path) const
{ {
delete device; wxString path;
device = nullptr; if(vfsDevice* dev = GetDevice(ps3_path, path))
{
std::shared_ptr<vfsFileBase> res(dev->GetNewFileStream());
if(res)
{
return res->Create(path);
}
}
return false;
} }
vfsDevice* VFS::GetDevice(const wxString& ps3_path, wxString& path) bool VFS::CreateDir(const wxString& ps3_path) const
{
wxString path;
if(vfsDevice* dev = GetDevice(ps3_path, path))
{
std::shared_ptr<vfsDirBase> res(dev->GetNewDirStream());
if(res)
{
return res->Create(path);
}
}
return false;
}
bool VFS::RemoveFile(const wxString& ps3_path) const
{
wxString path;
if(vfsDevice* dev = GetDevice(ps3_path, path))
{
std::shared_ptr<vfsFileBase> res(dev->GetNewFileStream());
if(res)
{
return res->Remove(path);
}
}
return false;
}
bool VFS::RemoveDir(const wxString& ps3_path) const
{
wxString path;
if(vfsDevice* dev = GetDevice(ps3_path, path))
{
std::shared_ptr<vfsDirBase> res(dev->GetNewDirStream());
if(res)
{
return res->Remove(path);
}
}
return false;
}
bool VFS::ExistsFile(const wxString& ps3_path) const
{
wxString path;
if(vfsDevice* dev = GetDevice(ps3_path, path))
{
std::shared_ptr<vfsFileBase> res(dev->GetNewFileStream());
if(res)
{
return res->Exists(path);
}
}
return false;
}
bool VFS::ExistsDir(const wxString& ps3_path) const
{
wxString path;
if(vfsDevice* dev = GetDevice(ps3_path, path))
{
std::shared_ptr<vfsDirBase> res(dev->GetNewDirStream());
if(res)
{
return res->IsExists(path);
}
}
return false;
}
bool VFS::RenameFile(const wxString& ps3_path_from, const wxString& ps3_path_to) const
{
wxString path;
if(vfsDevice* dev = GetDevice(ps3_path_from, path))
{
std::shared_ptr<vfsFileBase> res(dev->GetNewFileStream());
if(res)
{
return res->Rename(path, ps3_path_to);
}
}
return false;
}
bool VFS::RenameDir(const wxString& ps3_path_from, const wxString& ps3_path_to) const
{
wxString path;
if(vfsDevice* dev = GetDevice(ps3_path_from, path))
{
std::shared_ptr<vfsDirBase> res(dev->GetNewDirStream());
if(res)
{
return res->Rename(path, ps3_path_to);
}
}
return false;
}
vfsDevice* VFS::GetDevice(const wxString& ps3_path, wxString& path) const
{ {
u32 max_eq; u32 max_eq;
s32 max_i=-1; s32 max_i=-1;
@ -101,14 +231,18 @@ vfsDevice* VFS::GetDevice(const wxString& ps3_path, wxString& path)
return &m_devices[max_i]; return &m_devices[max_i];
} }
vfsDevice* VFS::GetDeviceLocal(const wxString& local_path, wxString& path) vfsDevice* VFS::GetDeviceLocal(const wxString& local_path, wxString& path) const
{ {
u32 max_eq; u32 max_eq;
s32 max_i=-1; s32 max_i=-1;
wxFileName file_path(local_path);
file_path.Normalize();
wxString mormalized_path = file_path.GetFullPath();
for(u32 i=0; i<m_devices.GetCount(); ++i) for(u32 i=0; i<m_devices.GetCount(); ++i)
{ {
const u32 eq = m_devices[i].CmpLocalPath(local_path); const u32 eq = m_devices[i].CmpLocalPath(mormalized_path);
if(max_i < 0 || eq > max_eq) if(max_i < 0 || eq > max_eq)
{ {
@ -135,11 +269,11 @@ void VFS::Init(const wxString& path)
switch(entries[i].device) switch(entries[i].device)
{ {
case vfsDevice_LocalFile: case vfsDevice_LocalFile:
dev = new vfsLocalFile(); dev = new vfsDeviceLocalFile();
break; break;
case vfsDevice_HDD: case vfsDevice_HDD:
dev = new vfsHDD(entries[i].device_path); dev = new vfsDeviceHDD(entries[i].device_path);
break; break;
default: default:

View File

@ -36,11 +36,19 @@ struct VFS
void UnMount(const wxString& ps3_path); void UnMount(const wxString& ps3_path);
void UnMountAll(); void UnMountAll();
vfsStream* Open(const wxString& ps3_path, vfsOpenMode mode); vfsFileBase* OpenFile(const wxString& ps3_path, vfsOpenMode mode) const;
void Create(const wxString& ps3_path); vfsDirBase* OpenDir(const wxString& ps3_path) const;
void Close(vfsStream*& device); bool CreateFile(const wxString& ps3_path) const;
vfsDevice* GetDevice(const wxString& ps3_path, wxString& path); bool CreateDir(const wxString& ps3_path) const;
vfsDevice* GetDeviceLocal(const wxString& local_path, wxString& path); bool RemoveFile(const wxString& ps3_path) const;
bool RemoveDir(const wxString& ps3_path) const;
bool ExistsFile(const wxString& ps3_path) const;
bool ExistsDir(const wxString& ps3_path) const;
bool RenameFile(const wxString& ps3_path_from, const wxString& ps3_path_to) const;
bool RenameDir(const wxString& ps3_path_from, const wxString& ps3_path_to) const;
vfsDevice* GetDevice(const wxString& ps3_path, wxString& path) const;
vfsDevice* GetDeviceLocal(const wxString& local_path, wxString& path) const;
void Init(const wxString& path); void Init(const wxString& path);
void SaveLoadDevices(Array<VFSManagerEntry>& res, bool is_load); void SaveLoadDevices(Array<VFSManagerEntry>& res, bool is_load);

View File

@ -45,14 +45,20 @@ u32 vfsDevice::CmpLocalPath(const wxString& local_path)
if(local_path.Len() < m_local_path.Len()) if(local_path.Len() < m_local_path.Len())
return 0; return 0;
const u32 lim = min(m_local_path.Len(), local_path.Len()); wxFileName path0(m_local_path);
path0.Normalize();
wxArrayString arr0 = wxSplit(path0.GetFullPath(), '\\');
wxArrayString arr1 = wxSplit(local_path, '\\');
const u32 lim = min(arr0.GetCount(), arr1.GetCount());
u32 ret = 0; u32 ret = 0;
for(u32 i=0; i<lim; ++i, ++ret) for(u32 i=0; i<lim; ret += arr0[i++].Len() + 1)
{ {
if(m_local_path[i] != local_path[i]) if(arr0[i].CmpNoCase(arr1[i]) != 0)
{ {
return 0; break;
} }
} }
@ -175,7 +181,9 @@ wxString vfsDevice::GetWinPath(const wxString& p, bool is_dir)
if(is_dir && ret[ret.Len() - 1] != '\\') ret += '\\'; if(is_dir && ret[ret.Len() - 1] != '\\') ret += '\\';
return ret; wxFileName res(ret);
res.Normalize();
return res.GetFullPath();
} }
wxString vfsDevice::GetWinPath(const wxString& l, const wxString& r) wxString vfsDevice::GetWinPath(const wxString& l, const wxString& r)
@ -195,7 +203,7 @@ wxString vfsDevice::GetPs3Path(const wxString& p, bool is_dir)
for(u32 i=0; i<p.Len(); ++i) for(u32 i=0; i<p.Len(); ++i)
{ {
if(p[i] == '/' || p[i] == '\\') if(p[i] == L'/' || p[i] == L'\\')
{ {
if(!is_ls) if(!is_ls)
{ {

View File

@ -1,19 +1,8 @@
#pragma once #pragma once
#include "vfsStream.h" #include "vfsFileBase.h"
#include <mutex> #include "vfsDirBase.h"
enum vfsOpenMode class vfsDevice
{
vfsRead = 0x1,
vfsWrite = 0x2,
vfsExcl = 0x4,
vfsAppend = 0x8,
vfsReadWrite = vfsRead | vfsWrite,
vfsWriteExcl = vfsWrite | vfsExcl,
vfsWriteAppend = vfsWrite | vfsAppend,
};
class vfsDevice : public vfsStream
{ {
wxString m_ps3_path; wxString m_ps3_path;
wxString m_local_path; wxString m_local_path;
@ -23,9 +12,9 @@ public:
vfsDevice(const wxString& ps3_path, const wxString& local_path); vfsDevice(const wxString& ps3_path, const wxString& local_path);
vfsDevice() {} vfsDevice() {}
virtual vfsDevice* GetNew()=0; virtual vfsFileBase* GetNewFileStream()=0;
virtual bool Open(const wxString& path, vfsOpenMode mode = vfsRead)=0; virtual vfsDirBase* GetNewDirStream()=0;
virtual bool Create(const wxString& path)=0;
wxString GetLocalPath() const; wxString GetLocalPath() const;
wxString GetPs3Path() const; wxString GetPs3Path() const;

View File

@ -0,0 +1,14 @@
#include "stdafx.h"
#include "vfsDeviceLocalFile.h"
#include "vfsLocalFile.h"
#include "vfsLocalDir.h"
vfsFileBase* vfsDeviceLocalFile::GetNewFileStream()
{
return new vfsLocalFile(this);
}
vfsDirBase* vfsDeviceLocalFile::GetNewDirStream()
{
return new vfsLocalDir(this);
}

View File

@ -0,0 +1,9 @@
#pragma once
#include "vfsDevice.h"
class vfsDeviceLocalFile : public vfsDevice
{
public:
virtual vfsFileBase* GetNewFileStream() override;
virtual vfsDirBase* GetNewDirStream() override;
};

70
rpcs3/Emu/FS/vfsDir.cpp Normal file
View File

@ -0,0 +1,70 @@
#include "stdafx.h"
#include "vfsDir.h"
vfsDir::vfsDir()
: vfsDirBase(nullptr)
, m_stream(nullptr)
{
}
vfsDir::vfsDir(const wxString path)
: vfsDirBase(nullptr)
, m_stream(nullptr)
{
Open(path);
}
bool vfsDir::Open(const wxString& path)
{
Close();
m_stream.reset(Emu.GetVFS().OpenDir(path));
return m_stream && m_stream->IsOpened();
}
bool vfsDir::Create(const wxString& path)
{
return m_stream->Create(path);
}
bool vfsDir::IsExists(const wxString& path) const
{
return m_stream->IsExists(path);
}
const Array<DirEntryInfo>& vfsDir::GetEntries() const
{
return m_stream->GetEntries();
}
bool vfsDir::Rename(const wxString& from, const wxString& to)
{
return m_stream->Rename(from, to);
}
bool vfsDir::Remove(const wxString& path)
{
return m_stream->Remove(path);
}
const DirEntryInfo* vfsDir::Read()
{
return m_stream->Read();
}
void vfsDir::Close()
{
m_stream.reset();
return vfsDirBase::Close();
}
wxString vfsDir::GetPath() const
{
return m_stream->GetPath();
}
bool vfsDir::IsOpened() const
{
return m_stream && m_stream->IsOpened() && vfsDirBase::IsOpened();
}

25
rpcs3/Emu/FS/vfsDir.h Normal file
View File

@ -0,0 +1,25 @@
#pragma once
#include "vfsDirBase.h"
class vfsDir : public vfsDirBase
{
private:
std::shared_ptr<vfsDirBase> m_stream;
public:
vfsDir();
vfsDir(const wxString path);
virtual bool Open(const wxString& path) override;
virtual bool IsOpened() const override;
virtual bool IsExists(const wxString& path) const override;
virtual const Array<DirEntryInfo>& GetEntries() const override;
virtual void Close() override;
virtual wxString GetPath() const override;
virtual bool Create(const wxString& path) override;
//virtual bool Create(const DirEntryInfo& info) override;
virtual bool Rename(const wxString& from, const wxString& to) override;
virtual bool Remove(const wxString& path) override;
virtual const DirEntryInfo* Read() override;
};

View File

@ -1,9 +1,10 @@
#include "stdafx.h" #include "stdafx.h"
#include "vfsDirBase.h" #include "vfsDirBase.h"
vfsDirBase::vfsDirBase(const wxString& path) vfsDirBase::vfsDirBase(vfsDevice* device)
: m_pos(0)
, m_device(device)
{ {
Open(path);
} }
vfsDirBase::~vfsDirBase() vfsDirBase::~vfsDirBase()
@ -18,6 +19,7 @@ bool vfsDirBase::Open(const wxString& path)
if(!IsExists(path)) if(!IsExists(path))
return false; return false;
m_pos = 0;
m_cwd += '/' + path; m_cwd += '/' + path;
return true; return true;
} }
@ -46,4 +48,12 @@ void vfsDirBase::Close()
wxString vfsDirBase::GetPath() const wxString vfsDirBase::GetPath() const
{ {
return m_cwd; return m_cwd;
}
const DirEntryInfo* vfsDirBase::Read()
{
if (m_pos >= m_entries.GetCount())
return nullptr;
return &m_entries[m_pos++];
} }

View File

@ -32,9 +32,11 @@ class vfsDirBase
protected: protected:
wxString m_cwd; wxString m_cwd;
Array<DirEntryInfo> m_entries; Array<DirEntryInfo> m_entries;
uint m_pos;
vfsDevice* m_device;
public: public:
vfsDirBase(const wxString& path); vfsDirBase(vfsDevice* device);
virtual ~vfsDirBase(); virtual ~vfsDirBase();
virtual bool Open(const wxString& path); virtual bool Open(const wxString& path);
@ -48,4 +50,5 @@ public:
//virtual bool Create(const DirEntryInfo& info)=0; //virtual bool Create(const DirEntryInfo& info)=0;
virtual bool Rename(const wxString& from, const wxString& to)=0; virtual bool Rename(const wxString& from, const wxString& to)=0;
virtual bool Remove(const wxString& path)=0; virtual bool Remove(const wxString& path)=0;
virtual const DirEntryInfo* Read();
}; };

View File

@ -2,55 +2,51 @@
#include "vfsFile.h" #include "vfsFile.h"
vfsFile::vfsFile() vfsFile::vfsFile()
: vfsFileBase() : vfsFileBase(nullptr)
, m_stream(nullptr) , m_stream(nullptr)
{ {
} }
vfsFile::vfsFile(const wxString path, vfsOpenMode mode) vfsFile::vfsFile(const wxString path, vfsOpenMode mode)
: vfsFileBase() : vfsFileBase(nullptr)
, m_stream(nullptr) , m_stream(nullptr)
{ {
Open(path, mode); Open(path, mode);
} }
vfsFile::~vfsFile()
{
Close();
}
vfsDevice* vfsFile::GetNew()
{
return new vfsFile();
}
bool vfsFile::Open(const wxString& path, vfsOpenMode mode) bool vfsFile::Open(const wxString& path, vfsOpenMode mode)
{ {
Close(); Close();
m_stream = Emu.GetVFS().Open(path, mode); m_stream.reset(Emu.GetVFS().OpenFile(path, mode));
return m_stream && m_stream->IsOpened(); return m_stream && m_stream->IsOpened();
} }
bool vfsFile::Create(const wxString& path) bool vfsFile::Create(const wxString& path)
{ {
if(wxFileExists(path)) return false; return m_stream->Create(path);
}
wxFile f; bool vfsFile::Exists(const wxString& path)
return f.Create(path); {
return m_stream->Exists(path);
}
bool vfsFile::Rename(const wxString& from, const wxString& to)
{
return m_stream->Rename(from, to);
}
bool vfsFile::Remove(const wxString& path)
{
return m_stream->Remove(path);
} }
bool vfsFile::Close() bool vfsFile::Close()
{ {
if(m_stream) m_stream.reset();
{ return vfsFileBase::Close();
delete m_stream;
m_stream = nullptr;
return vfsFileBase::Close();
}
return false;
} }
u64 vfsFile::GetSize() u64 vfsFile::GetSize()

View File

@ -4,17 +4,17 @@
class vfsFile : public vfsFileBase class vfsFile : public vfsFileBase
{ {
private: private:
vfsStream* m_stream; std::shared_ptr<vfsFileBase> m_stream;
public: public:
vfsFile(); vfsFile();
vfsFile(const wxString path, vfsOpenMode mode = vfsRead); vfsFile(const wxString path, vfsOpenMode mode = vfsRead);
~vfsFile();
virtual vfsDevice* GetNew() override;
virtual bool Open(const wxString& path, vfsOpenMode mode = vfsRead) override; virtual bool Open(const wxString& path, vfsOpenMode mode = vfsRead) override;
virtual bool Create(const wxString& path) override; virtual bool Create(const wxString& path) override;
virtual bool Exists(const wxString& path) override;
virtual bool Rename(const wxString& from, const wxString& to) override;
virtual bool Remove(const wxString& path) override;
virtual bool Close() override; virtual bool Close() override;
virtual u64 GetSize() override; virtual u64 GetSize() override;

View File

@ -1,7 +1,9 @@
#include "stdafx.h" #include "stdafx.h"
#include "vfsFileBase.h" #include "vfsFileBase.h"
vfsFileBase::vfsFileBase() : vfsDevice() vfsFileBase::vfsFileBase(vfsDevice* device)
: vfsStream()
, m_device(device)
{ {
} }

View File

@ -1,24 +1,37 @@
#pragma once #pragma once
#include "vfsDevice.h" #include "vfsStream.h"
struct vfsFileBase : public vfsDevice enum vfsOpenMode
{
vfsRead = 0x1,
vfsWrite = 0x2,
vfsExcl = 0x4,
vfsAppend = 0x8,
vfsReadWrite = vfsRead | vfsWrite,
vfsWriteExcl = vfsWrite | vfsExcl,
vfsWriteAppend = vfsWrite | vfsAppend,
};
class vfsDevice;
struct vfsFileBase : public vfsStream
{ {
protected: protected:
wxString m_path; wxString m_path;
vfsOpenMode m_mode; vfsOpenMode m_mode;
vfsDevice* m_device;
public: public:
vfsFileBase(); vfsFileBase(vfsDevice* device);
virtual ~vfsFileBase(); virtual ~vfsFileBase();
virtual bool Open(const wxString& path, vfsOpenMode mode) override; virtual bool Open(const wxString& path, vfsOpenMode mode);
virtual bool Close() override; virtual bool Close() override;
/* virtual bool Create(const wxString& path) { return false; }
virtual bool Create(const wxString& path)=0; virtual bool Exists(const wxString& path) { return false; }
virtual bool Exists(const wxString& path)=0; virtual bool Rename(const wxString& from, const wxString& to) { return false; }
virtual bool Rename(const wxString& from, const wxString& to)=0; virtual bool Remove(const wxString& path) { return false; }
virtual bool Remove(const wxString& path)=0;
*/
wxString GetPath() const; wxString GetPath() const;
vfsOpenMode GetOpenMode() const; vfsOpenMode GetOpenMode() const;
}; };

View File

@ -2,9 +2,7 @@
#include "vfsLocalDir.h" #include "vfsLocalDir.h"
#include <direct.h> #include <direct.h>
vfsLocalDir::vfsLocalDir(const wxString& path) vfsLocalDir::vfsLocalDir(vfsDevice* device) : vfsDirBase(device)
: vfsDirBase(path)
, m_pos(0)
{ {
} }
@ -39,14 +37,6 @@ bool vfsLocalDir::Open(const wxString& path)
return true; return true;
} }
const DirEntryInfo* vfsLocalDir::Read()
{
if (m_pos >= m_entries.GetCount())
return 0;
return &m_entries[m_pos++];
}
bool vfsLocalDir::Create(const wxString& path) bool vfsLocalDir::Create(const wxString& path)
{ {
return wxFileName::Mkdir(path, 0777, wxPATH_MKDIR_FULL); return wxFileName::Mkdir(path, 0777, wxPATH_MKDIR_FULL);

View File

@ -7,11 +7,10 @@ private:
u32 m_pos; u32 m_pos;
public: public:
vfsLocalDir(const wxString& path = wxEmptyString); vfsLocalDir(vfsDevice* device);
virtual ~vfsLocalDir(); virtual ~vfsLocalDir();
virtual bool Open(const wxString& path) override; virtual bool Open(const wxString& path) override;
const DirEntryInfo* Read();
virtual bool Create(const wxString& path) override; virtual bool Create(const wxString& path) override;
virtual bool Rename(const wxString& from, const wxString& to) override; virtual bool Rename(const wxString& from, const wxString& to) override;

View File

@ -27,28 +27,27 @@ static const wxSeekMode vfs2wx_seek(vfsSeekMode mode)
return wxFromStart; return wxFromStart;
} }
vfsLocalFile::vfsLocalFile() : vfsFileBase() vfsLocalFile::vfsLocalFile(vfsDevice* device) : vfsFileBase(device)
{ {
} }
vfsLocalFile::vfsLocalFile(const wxString path, vfsOpenMode mode) : vfsFileBase()
{
Open(path, mode);
}
vfsDevice* vfsLocalFile::GetNew()
{
return new vfsLocalFile();
}
bool vfsLocalFile::Open(const wxString& path, vfsOpenMode mode) bool vfsLocalFile::Open(const wxString& path, vfsOpenMode mode)
{ {
Close(); Close();
if(!m_file.Access(vfsDevice::GetWinPath(GetLocalPath(), path), vfs2wx_mode(mode))) return false; if(m_device)
{
if(!m_file.Access(vfsDevice::GetWinPath(m_device->GetLocalPath(), path), vfs2wx_mode(mode))) return false;
return m_file.Open(vfsDevice::GetWinPath(GetLocalPath(), path), vfs2wx_mode(mode)) && return m_file.Open(vfsDevice::GetWinPath(m_device->GetLocalPath(), path), vfs2wx_mode(mode)) &&
vfsFileBase::Open(vfsDevice::GetPs3Path(GetPs3Path(), path), mode); vfsFileBase::Open(vfsDevice::GetPs3Path(m_device->GetPs3Path(), path), mode);
}
else
{
if(!m_file.Access(path, vfs2wx_mode(mode))) return false;
return m_file.Open(path, vfs2wx_mode(mode)) && vfsFileBase::Open(path, mode);
}
} }
bool vfsLocalFile::Create(const wxString& path) bool vfsLocalFile::Create(const wxString& path)

View File

@ -7,9 +7,7 @@ private:
wxFile m_file; wxFile m_file;
public: public:
vfsLocalFile(); vfsLocalFile(vfsDevice* device);
vfsLocalFile(const wxString path, vfsOpenMode mode = vfsRead);
vfsDevice* GetNew();
virtual bool Open(const wxString& path, vfsOpenMode mode = vfsRead) override; virtual bool Open(const wxString& path, vfsOpenMode mode = vfsRead) override;
virtual bool Create(const wxString& path) override; virtual bool Create(const wxString& path) override;

View File

@ -22,6 +22,57 @@ enum
CELL_GCM_DISPLAY_FREQUENCY_DISABLE = 3, CELL_GCM_DISPLAY_FREQUENCY_DISABLE = 3,
}; };
// GCM Texture
enum
{
// Format
CELL_GCM_TEXTURE_B8 = 0x81,
CELL_GCM_TEXTURE_A1R5G5B5 = 0x82,
CELL_GCM_TEXTURE_A4R4G4B4 = 0x83,
CELL_GCM_TEXTURE_R5G6B5 = 0x84,
CELL_GCM_TEXTURE_A8R8G8B8 = 0x85,
CELL_GCM_TEXTURE_COMPRESSED_DXT1 = 0x86,
CELL_GCM_TEXTURE_COMPRESSED_DXT23 = 0x87,
CELL_GCM_TEXTURE_COMPRESSED_DXT45 = 0x88,
CELL_GCM_TEXTURE_G8B8 = 0x8B,
CELL_GCM_TEXTURE_R6G5B5 = 0x8F,
CELL_GCM_TEXTURE_DEPTH24_D8 = 0x90,
CELL_GCM_TEXTURE_DEPTH24_D8_FLOAT = 0x91,
CELL_GCM_TEXTURE_DEPTH16 = 0x92,
CELL_GCM_TEXTURE_DEPTH16_FLOAT = 0x93,
CELL_GCM_TEXTURE_X16 = 0x94,
CELL_GCM_TEXTURE_Y16_X16 = 0x95,
CELL_GCM_TEXTURE_R5G5B5A1 = 0x97,
CELL_GCM_TEXTURE_COMPRESSED_HILO8 = 0x98,
CELL_GCM_TEXTURE_COMPRESSED_HILO_S8 = 0x99,
CELL_GCM_TEXTURE_W16_Z16_Y16_X16_FLOAT = 0x9A,
CELL_GCM_TEXTURE_W32_Z32_Y32_X32_FLOAT = 0x9B,
CELL_GCM_TEXTURE_X32_FLOAT = 0x9C,
CELL_GCM_TEXTURE_D1R5G5B5 = 0x9D,
CELL_GCM_TEXTURE_D8R8G8B8 = 0x9E,
CELL_GCM_TEXTURE_Y16_X16_FLOAT = 0x9F,
CELL_GCM_TEXTURE_COMPRESSED_B8R8_G8R8 = 0xAD,
CELL_GCM_TEXTURE_COMPRESSED_R8B8_R8G8 = 0xAE,
// Format flags
CELL_GCM_TEXTURE_SZ = 0x00,
CELL_GCM_TEXTURE_LN = 0x20,
CELL_GCM_TEXTURE_NR = 0x00,
CELL_GCM_TEXTURE_UN = 0x40,
};
// GCM Surface
enum
{
// Target
CELL_GCM_SURFACE_TARGET_NONE = 0,
CELL_GCM_SURFACE_TARGET_0 = 1,
CELL_GCM_SURFACE_TARGET_1 = 2,
CELL_GCM_SURFACE_TARGET_MRT1 = 0x13,
CELL_GCM_SURFACE_TARGET_MRT2 = 0x17,
CELL_GCM_SURFACE_TARGET_MRT3 = 0x1f,
};
struct CellGcmControl struct CellGcmControl
{ {
u32 put; u32 put;

View File

@ -556,29 +556,29 @@ void GLGSRender::WriteBuffers()
switch(m_surface_colour_target) switch(m_surface_colour_target)
{ {
case 0x0: case CELL_GCM_SURFACE_TARGET_NONE:
return; return;
case 0x1: case CELL_GCM_SURFACE_TARGET_0:
WriteColourBufferA(); WriteColourBufferA();
break; break;
case 0x2: case CELL_GCM_SURFACE_TARGET_1:
WriteColourBufferB(); WriteColourBufferB();
break; break;
case 0x13: case CELL_GCM_SURFACE_TARGET_MRT1:
WriteColourBufferA(); WriteColourBufferA();
WriteColourBufferB(); WriteColourBufferB();
break; break;
case 0x17: case CELL_GCM_SURFACE_TARGET_MRT2:
WriteColourBufferA(); WriteColourBufferA();
WriteColourBufferB(); WriteColourBufferB();
WriteColourBufferC(); WriteColourBufferC();
break; break;
case 0x1f: case CELL_GCM_SURFACE_TARGET_MRT3:
WriteColourBufferA(); WriteColourBufferA();
WriteColourBufferB(); WriteColourBufferB();
WriteColourBufferC(); WriteColourBufferC();
@ -726,26 +726,26 @@ void GLGSRender::ExecCMD()
switch(m_surface_colour_target) switch(m_surface_colour_target)
{ {
case 0x0: case CELL_GCM_SURFACE_TARGET_NONE:
break; break;
case 0x1: case CELL_GCM_SURFACE_TARGET_0:
glDrawBuffer(draw_buffers[0]); glDrawBuffer(draw_buffers[0]);
break; break;
case 0x2: case CELL_GCM_SURFACE_TARGET_1:
glDrawBuffer(draw_buffers[1]); glDrawBuffer(draw_buffers[1]);
break; break;
case 0x13: case CELL_GCM_SURFACE_TARGET_MRT1:
glDrawBuffers(2, draw_buffers); glDrawBuffers(2, draw_buffers);
break; break;
case 0x17: case CELL_GCM_SURFACE_TARGET_MRT2:
glDrawBuffers(3, draw_buffers); glDrawBuffers(3, draw_buffers);
break; break;
case 0x1f: case CELL_GCM_SURFACE_TARGET_MRT3:
glDrawBuffers(4, draw_buffers); glDrawBuffers(4, draw_buffers);
break; break;
@ -1147,12 +1147,10 @@ void GLGSRender::Flip()
} }
} }
uint32_t LinearToSwizzleAddress( u32 LinearToSwizzleAddress(u32 x, u32 y, u32 z, u32 log2_width, u32 log2_height, u32 log2_depth)
uint32_t x, uint32_t y, uint32_t z,
uint32_t log2_width, uint32_t log2_height, uint32_t log2_depth)
{ {
uint32_t offset = 0; u32 offset = 0;
uint32_t shift_count = 0; u32 shift_count = 0;
while(log2_width | log2_height | log2_depth){ while(log2_width | log2_height | log2_depth){
if(log2_width){ if(log2_width){
offset |= (x & 0x01) << shift_count; offset |= (x & 0x01) << shift_count;

View File

@ -13,9 +13,7 @@
extern GLenum g_last_gl_error; extern GLenum g_last_gl_error;
void printGlError(GLenum err, const char* situation); void printGlError(GLenum err, const char* situation);
uint32_t LinearToSwizzleAddress( u32 LinearToSwizzleAddress(u32 x, u32 y, u32 z, u32 log2_width, u32 log2_height, u32 log2_depth);
uint32_t x, uint32_t y, uint32_t z,
uint32_t log2_width, uint32_t log2_height, uint32_t log2_depth);
#if RSX_DEBUG #if RSX_DEBUG
#define checkForGlError(sit) if((g_last_gl_error = glGetError()) != GL_NO_ERROR) printGlError(g_last_gl_error, sit) #define checkForGlError(sit) if((g_last_gl_error = glGetError()) != GL_NO_ERROR) printGlError(g_last_gl_error, sit)
@ -79,7 +77,7 @@ public:
checkForGlError("GLTexture::Init() -> glBindTexture"); checkForGlError("GLTexture::Init() -> glBindTexture");
int format = tex.GetFormat() & ~(0x20 | 0x40); int format = tex.GetFormat() & ~(0x20 | 0x40);
bool is_swizzled = (tex.GetFormat() & 0x20) == 0; bool is_swizzled = !(tex.GetFormat() & CELL_GCM_TEXTURE_LN);
glPixelStorei(GL_PACK_ALIGNMENT, tex.m_pitch); glPixelStorei(GL_PACK_ALIGNMENT, tex.m_pitch);
char* pixels = (char*)Memory.GetMemFromAddr(GetAddress(tex.GetOffset(), tex.GetLocation())); char* pixels = (char*)Memory.GetMemFromAddr(GetAddress(tex.GetOffset(), tex.GetLocation()));
@ -87,7 +85,7 @@ public:
switch(format) switch(format)
{ {
case 0x81: case CELL_GCM_TEXTURE_B8:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex.GetWidth(), tex.GetHeight(), 0, GL_BLUE, GL_UNSIGNED_BYTE, pixels); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex.GetWidth(), tex.GetHeight(), 0, GL_BLUE, GL_UNSIGNED_BYTE, pixels);
checkForGlError("GLTexture::Init() -> glTexImage2D"); checkForGlError("GLTexture::Init() -> glTexImage2D");
@ -99,15 +97,15 @@ public:
checkForGlError("GLTexture::Init() -> glTexParameteri"); checkForGlError("GLTexture::Init() -> glTexParameteri");
break; break;
case 0x85: case CELL_GCM_TEXTURE_A8R8G8B8:
if(is_swizzled) if(is_swizzled)
{ {
uint32_t *src, *dst; u32 *src, *dst;
uint32_t log2width, log2height; u32 log2width, log2height;
unswizzledPixels = (char*)malloc(tex.GetWidth() * tex.GetHeight() * 4); unswizzledPixels = (char*)malloc(tex.GetWidth() * tex.GetHeight() * 4);
src = (uint32_t*)pixels; src = (u32*)pixels;
dst = (uint32_t*)unswizzledPixels; dst = (u32*)unswizzledPixels;
log2width = log(tex.GetWidth())/log(2); log2width = log(tex.GetWidth())/log(2);
log2height = log(tex.GetHeight())/log(2); log2height = log(tex.GetHeight())/log(2);
@ -125,7 +123,7 @@ public:
checkForGlError("GLTexture::Init() -> glTexImage2D"); checkForGlError("GLTexture::Init() -> glTexImage2D");
break; break;
case 0x86: case CELL_GCM_TEXTURE_COMPRESSED_DXT1:
{ {
u32 size = ((tex.GetWidth() + 3) / 4) * ((tex.GetHeight() + 3) / 4) * 8; u32 size = ((tex.GetWidth() + 3) / 4) * ((tex.GetHeight() + 3) / 4) * 8;
@ -134,7 +132,7 @@ public:
} }
break; break;
case 0x87: case CELL_GCM_TEXTURE_COMPRESSED_DXT23:
{ {
u32 size = ((tex.GetWidth() + 3) / 4) * ((tex.GetHeight() + 3) / 4) * 16; u32 size = ((tex.GetWidth() + 3) / 4) * ((tex.GetHeight() + 3) / 4) * 16;
@ -143,7 +141,7 @@ public:
} }
break; break;
case 0x88: case CELL_GCM_TEXTURE_COMPRESSED_DXT45:
{ {
u32 size = ((tex.GetWidth() + 3) / 4) * ((tex.GetHeight() + 3) / 4) * 16; u32 size = ((tex.GetWidth() + 3) / 4) * ((tex.GetHeight() + 3) / 4) * 16;
@ -152,7 +150,7 @@ public:
} }
break; break;
case 0x94: case CELL_GCM_TEXTURE_X16:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex.GetWidth(), tex.GetHeight(), 0, GL_RED, GL_SHORT, pixels); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex.GetWidth(), tex.GetHeight(), 0, GL_RED, GL_SHORT, pixels);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_ONE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_ONE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G, GL_ONE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G, GL_ONE);
@ -161,12 +159,12 @@ public:
checkForGlError("GLTexture::Init() -> glTexImage2D"); checkForGlError("GLTexture::Init() -> glTexImage2D");
break; break;
case 0x9a: case CELL_GCM_TEXTURE_W16_Z16_Y16_X16_FLOAT:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex.GetWidth(), tex.GetHeight(), 0, GL_BGRA, GL_HALF_FLOAT, pixels); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex.GetWidth(), tex.GetHeight(), 0, GL_BGRA, GL_HALF_FLOAT, pixels);
checkForGlError("GLTexture::Init() -> glTexImage2D"); checkForGlError("GLTexture::Init() -> glTexImage2D");
break; break;
case 0x9e: case CELL_GCM_TEXTURE_D8R8G8B8:
{ {
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex.GetWidth(), tex.GetHeight(), 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, pixels); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex.GetWidth(), tex.GetHeight(), 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, pixels);
checkForGlError("GLTexture::Init() -> glTexImage2D"); checkForGlError("GLTexture::Init() -> glTexImage2D");
@ -255,7 +253,7 @@ public:
void Save(RSXTexture& tex, const wxString& name) void Save(RSXTexture& tex, const wxString& name)
{ {
if(!m_id || !tex.GetOffset() || !tex.GetWidth() || !tex.GetHeight()) return; if(!m_id || !tex.GetOffset() || !tex.GetWidth() || !tex.GetHeight()) return;
u32* alldata = new u32[tex.GetWidth() * tex.GetHeight()]; u32* alldata = new u32[tex.GetWidth() * tex.GetHeight()];
@ -263,11 +261,11 @@ public:
switch(tex.GetFormat() & ~(0x20 | 0x40)) switch(tex.GetFormat() & ~(0x20 | 0x40))
{ {
case 0x81: case CELL_GCM_TEXTURE_B8:
glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, alldata); glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, alldata);
break; break;
case 0x85: case CELL_GCM_TEXTURE_A8R8G8B8:
glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, alldata); glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, alldata);
break; break;

View File

@ -42,37 +42,37 @@ void RSXTexture::Init()
u32 RSXTexture::GetOffset() const u32 RSXTexture::GetOffset() const
{ {
return methodRegisters[NV4097_SET_TEXTURE_OFFSET + (m_index*32)]; return methodRegisters[NV4097_SET_TEXTURE_OFFSET + (m_index*32)];
} }
u8 RSXTexture::GetLocation() const u8 RSXTexture::GetLocation() const
{ {
return (methodRegisters[NV4097_SET_TEXTURE_FORMAT + (m_index*32)] & 0x3) - 1; return (methodRegisters[NV4097_SET_TEXTURE_FORMAT + (m_index*32)] & 0x3) - 1;
} }
bool RSXTexture::isCubemap() const bool RSXTexture::isCubemap() const
{ {
return ((methodRegisters[NV4097_SET_TEXTURE_FORMAT + (m_index*32)] >> 2) & 0x1); return ((methodRegisters[NV4097_SET_TEXTURE_FORMAT + (m_index*32)] >> 2) & 0x1);
} }
u8 RSXTexture::GetBorderType() const u8 RSXTexture::GetBorderType() const
{ {
return ((methodRegisters[NV4097_SET_TEXTURE_FORMAT + (m_index*32)] >> 3) & 0x1); return ((methodRegisters[NV4097_SET_TEXTURE_FORMAT + (m_index*32)] >> 3) & 0x1);
} }
u8 RSXTexture::GetDimension() const u8 RSXTexture::GetDimension() const
{ {
return ((methodRegisters[NV4097_SET_TEXTURE_FORMAT + (m_index*32)] >> 4) & 0xf); return ((methodRegisters[NV4097_SET_TEXTURE_FORMAT + (m_index*32)] >> 4) & 0xf);
} }
u8 RSXTexture::GetFormat() const u8 RSXTexture::GetFormat() const
{ {
return ((methodRegisters[NV4097_SET_TEXTURE_FORMAT + (m_index*32)] >> 8) & 0xff); return ((methodRegisters[NV4097_SET_TEXTURE_FORMAT + (m_index*32)] >> 8) & 0xff);
} }
u16 RSXTexture::Getmipmap() const u16 RSXTexture::Getmipmap() const
{ {
return ((methodRegisters[NV4097_SET_TEXTURE_FORMAT + (m_index*32)] >> 16) & 0xffff); return ((methodRegisters[NV4097_SET_TEXTURE_FORMAT + (m_index*32)] >> 16) & 0xffff);
} }
u8 RSXTexture::GetWrapS() const u8 RSXTexture::GetWrapS() const
@ -197,6 +197,6 @@ u16 RSXTexture::GetHeight() const
void RSXTexture::SetControl3(u16 depth, u32 pitch) void RSXTexture::SetControl3(u16 depth, u32 pitch)
{ {
m_depth = depth; m_depth = depth;
m_pitch = pitch; m_pitch = pitch;
} }

View File

@ -1378,7 +1378,7 @@ void RSXThread::End()
void RSXThread::Task() void RSXThread::Task()
{ {
u8 inc; u8 inc;
ConLog.Write("RSX thread entry"); ConLog.Write("RSX thread entry");
OnInitThread(); OnInitThread();
@ -1387,7 +1387,7 @@ void RSXThread::Task()
{ {
wxCriticalSectionLocker lock(m_cs_main); wxCriticalSectionLocker lock(m_cs_main);
inc=1; inc=1;
u32 put, get; u32 put, get;
se_t<u32>::func(put, std::atomic_load((volatile std::atomic<u32>*)((u8*)m_ctrl + offsetof(CellGcmControl, put)))); se_t<u32>::func(put, std::atomic_load((volatile std::atomic<u32>*)((u8*)m_ctrl + offsetof(CellGcmControl, put))));
@ -1439,7 +1439,7 @@ void RSXThread::Task()
if(cmd & CELL_GCM_METHOD_FLAG_NON_INCREMENT) if(cmd & CELL_GCM_METHOD_FLAG_NON_INCREMENT)
{ {
//ConLog.Warning("non increment cmd! 0x%x", cmd); //ConLog.Warning("non increment cmd! 0x%x", cmd);
inc=0; inc=0;
} }
if(cmd == 0) if(cmd == 0)
@ -1449,10 +1449,10 @@ void RSXThread::Task()
continue; continue;
} }
for(int i=0; i<count; i++) for(int i=0; i<count; i++)
{ {
methodRegisters[(cmd & 0xffff) + (i*4*inc)] = ARGS(i); methodRegisters[(cmd & 0xffff) + (i*4*inc)] = ARGS(i);
} }
mem32_ptr_t args(Memory.RSXIOMem.GetStartAddr() + get + 4); mem32_ptr_t args(Memory.RSXIOMem.GetStartAddr() + get + 4);
DoCmd(cmd, cmd & 0x3ffff, args, count); DoCmd(cmd, cmd & 0x3ffff, args, count);

View File

@ -17,7 +17,8 @@ u32 GetAddress(u32 offset, u8 location);
class RSXTexture class RSXTexture
{ {
u8 m_index; u8 m_index;
public: public:
u32 m_pitch; u32 m_pitch;
u16 m_depth; u16 m_depth;
@ -484,11 +485,11 @@ protected:
m_point_x = 0; m_point_x = 0;
m_point_y = 0; m_point_y = 0;
// Construct Textures // Construct Textures
for(int i=0; i<16; i++) for(int i=0; i<16; i++)
{ {
m_textures[i] = RSXTexture(i); m_textures[i] = RSXTexture(i);
} }
Reset(); Reset();
} }
@ -549,10 +550,10 @@ protected:
m_clear_surface_mask = 0; m_clear_surface_mask = 0;
m_begin_end = 0; m_begin_end = 0;
for(uint i=0; i<m_textures_count; ++i) for(uint i=0; i<m_textures_count; ++i)
{ {
m_textures[i].Init(); m_textures[i].Init();
} }
} }
void Begin(u32 draw_mode); void Begin(u32 draw_mode);

View File

@ -1,3 +1,16 @@
#include "stdafx.h" #include "stdafx.h"
#include "HDD.h" #include "HDD.h"
vfsDeviceHDD::vfsDeviceHDD(const std::string& hdd_path) : m_hdd_path(hdd_path)
{
}
vfsFileBase* vfsDeviceHDD::GetNewFileStream()
{
return new vfsHDD(this, m_hdd_path);
}
vfsDirBase* vfsDeviceHDD::GetNewDirStream()
{
return nullptr;
}

View File

@ -262,7 +262,7 @@ public:
if(!size) if(!size)
return 0; return 0;
vfsDeviceLocker lock(m_hdd); //vfsDeviceLocker lock(m_hdd);
const u32 block_size = m_hdd_info.block_size - sizeof(vfsHDD_Block); const u32 block_size = m_hdd_info.block_size - sizeof(vfsHDD_Block);
u64 rsize = min<u64>(block_size - m_position, size); u64 rsize = min<u64>(block_size - m_position, size);
@ -310,7 +310,7 @@ public:
if(!size) if(!size)
return 0; return 0;
vfsDeviceLocker lock(m_hdd); //vfsDeviceLocker lock(m_hdd);
const u32 block_size = m_hdd_info.block_size - sizeof(vfsHDD_Block); const u32 block_size = m_hdd_info.block_size - sizeof(vfsHDD_Block);
@ -409,6 +409,17 @@ public:
} }
}; };
class vfsDeviceHDD : public vfsDevice
{
std::string m_hdd_path;
public:
vfsDeviceHDD(const std::string& hdd_path);
virtual vfsFileBase* GetNewFileStream() override;
virtual vfsDirBase* GetNewDirStream() override;
};
class vfsHDD : public vfsFileBase class vfsHDD : public vfsFileBase
{ {
vfsHDD_Hdr m_hdd_info; vfsHDD_Hdr m_hdd_info;
@ -419,11 +430,13 @@ class vfsHDD : public vfsFileBase
const wxString& m_hdd_path; const wxString& m_hdd_path;
public: public:
vfsHDD(const wxString& hdd_path) vfsHDD(vfsDevice* device, const wxString& hdd_path)
: m_hdd_file(hdd_path, vfsReadWrite) : m_hdd_file(device)
, m_file(m_hdd_file, m_hdd_info) , m_file(m_hdd_file, m_hdd_info)
, m_hdd_path(hdd_path) , m_hdd_path(hdd_path)
, vfsFileBase(device)
{ {
m_hdd_file.Open(hdd_path, vfsReadWrite);
m_hdd_file.Read(&m_hdd_info, sizeof(vfsHDD_Hdr)); m_hdd_file.Read(&m_hdd_info, sizeof(vfsHDD_Hdr));
m_cur_dir_block = m_hdd_info.next_block; m_cur_dir_block = m_hdd_info.next_block;
if(!m_hdd_info.block_size) if(!m_hdd_info.block_size)
@ -435,11 +448,6 @@ public:
m_hdd_file.Read(&m_cur_dir, sizeof(vfsHDD_Entry)); m_hdd_file.Read(&m_cur_dir, sizeof(vfsHDD_Entry));
} }
virtual vfsDevice* GetNew()
{
return new vfsHDD(m_hdd_path);
}
__forceinline u32 GetMaxNameLen() const __forceinline u32 GetMaxNameLen() const
{ {
return m_hdd_info.block_size - sizeof(vfsHDD_Entry); return m_hdd_info.block_size - sizeof(vfsHDD_Entry);
@ -861,4 +869,4 @@ public:
{ {
return m_file.GetSize(); return m_file.GetSize();
} }
}; };

View File

@ -1592,6 +1592,7 @@ s64 SysCalls::DoFunc(const u32 id)
case 0x1d99c3ee: FUNC_LOG_ERROR("TODO: cellOskDialogGetInputText"); case 0x1d99c3ee: FUNC_LOG_ERROR("TODO: cellOskDialogGetInputText");
case 0x1dfbfdd6: FUNC_LOG_ERROR("TODO: cellSaveDataListLoad2"); case 0x1dfbfdd6: FUNC_LOG_ERROR("TODO: cellSaveDataListLoad2");
case 0x1dfcce99: FUNC_LOG_ERROR("TODO: cellSysutilGameDataExit"); case 0x1dfcce99: FUNC_LOG_ERROR("TODO: cellSysutilGameDataExit");
case 0x1e7bff94: FUNC_LOG_ERROR("TODO: cellSysCacheMount");
case 0x1e930eef: FUNC_LOG_ERROR("TODO: cellVideoOutGetDeviceInfo"); case 0x1e930eef: FUNC_LOG_ERROR("TODO: cellVideoOutGetDeviceInfo");
case 0x1f6629e4: FUNC_LOG_ERROR("TODO: cellWebBrowserConfigSetErrorHook2"); case 0x1f6629e4: FUNC_LOG_ERROR("TODO: cellWebBrowserConfigSetErrorHook2");
case 0x20543730: FUNC_LOG_ERROR("TODO: cellMsgDialogClose"); case 0x20543730: FUNC_LOG_ERROR("TODO: cellMsgDialogClose");
@ -1646,6 +1647,7 @@ s64 SysCalls::DoFunc(const u32 id)
case 0x6dfff31d: FUNC_LOG_ERROR("TODO: cellWebBrowserSetSystemCallbackUsrdata"); case 0x6dfff31d: FUNC_LOG_ERROR("TODO: cellWebBrowserSetSystemCallbackUsrdata");
case 0x6e7264ed: FUNC_LOG_ERROR("TODO: cellSaveDataUserFixedLoad"); case 0x6e7264ed: FUNC_LOG_ERROR("TODO: cellSaveDataUserFixedLoad");
case 0x71acb8d3: FUNC_LOG_ERROR("TODO: cellSysutilAvcSetVideoMuting"); case 0x71acb8d3: FUNC_LOG_ERROR("TODO: cellSysutilAvcSetVideoMuting");
case 0x744c1544: FUNC_LOG_ERROR("TODO: cellSysCacheClear");
case 0x749c9b5f: FUNC_LOG_ERROR("TODO: cellWebBrowserInitialize"); case 0x749c9b5f: FUNC_LOG_ERROR("TODO: cellWebBrowserInitialize");
case 0x75bbb672: FUNC_LOG_ERROR("TODO: cellVideoOutGetNumberOfDevice"); case 0x75bbb672: FUNC_LOG_ERROR("TODO: cellVideoOutGetNumberOfDevice");
case 0x7603d3db: FUNC_LOG_ERROR("TODO: cellMsgDialogOpen2"); case 0x7603d3db: FUNC_LOG_ERROR("TODO: cellMsgDialogOpen2");
@ -2456,6 +2458,7 @@ s64 SysCalls::DoFunc(const u32 id)
case 0x0e2939e5: FUNC_LOG_ERROR("TODO: cellFsFtruncate"); case 0x0e2939e5: FUNC_LOG_ERROR("TODO: cellFsFtruncate");
case 0x103b8632: FUNC_LOG_ERROR("TODO: cellFsAllocateFileAreaWithInitialData"); case 0x103b8632: FUNC_LOG_ERROR("TODO: cellFsAllocateFileAreaWithInitialData");
case 0x190912f6: FUNC_LOG_ERROR("TODO: cellFsStReadGetCurrentAddr"); case 0x190912f6: FUNC_LOG_ERROR("TODO: cellFsStReadGetCurrentAddr");
case 0x1a108ab7: FUNC_LOG_ERROR("TODO: cellFsGetBlockSize");
case 0x1ea02e2f: FUNC_LOG_ERROR("TODO: cellFsArcadeHddSerialNumber"); case 0x1ea02e2f: FUNC_LOG_ERROR("TODO: cellFsArcadeHddSerialNumber");
case 0x2664c8ae: FUNC_LOG_ERROR("TODO: cellFsStReadInit"); case 0x2664c8ae: FUNC_LOG_ERROR("TODO: cellFsStReadInit");
case 0x27800c6b: FUNC_LOG_ERROR("TODO: cellFsStRead"); case 0x27800c6b: FUNC_LOG_ERROR("TODO: cellFsStRead");
@ -3759,6 +3762,7 @@ s64 SysCalls::DoFunc(const u32 id)
case 0x5fdfb2fe: FUNC_LOG_ERROR("TODO: _sys_spu_printf_detach_group"); case 0x5fdfb2fe: FUNC_LOG_ERROR("TODO: _sys_spu_printf_detach_group");
case 0x608212fc: FUNC_LOG_ERROR("TODO: sys_mempool_free_block"); case 0x608212fc: FUNC_LOG_ERROR("TODO: sys_mempool_free_block");
case 0x620e35a7: FUNC_LOG_ERROR("TODO: sys_game_get_system_sw_version"); case 0x620e35a7: FUNC_LOG_ERROR("TODO: sys_game_get_system_sw_version");
case 0x67f9fedb: FUNC_LOG_ERROR("TODO: sys_game_process_exitspawn2");
case 0x68b9b011: FUNC_LOG_ERROR("TODO: _sys_memset"); case 0x68b9b011: FUNC_LOG_ERROR("TODO: _sys_memset");
case 0x6bf66ea7: FUNC_LOG_ERROR("TODO: _sys_memcpy"); case 0x6bf66ea7: FUNC_LOG_ERROR("TODO: _sys_memcpy");
case 0x6e05231d: FUNC_LOG_ERROR("TODO: sys_game_watchdog_stop"); case 0x6e05231d: FUNC_LOG_ERROR("TODO: sys_game_watchdog_stop");
@ -3834,6 +3838,7 @@ s64 SysCalls::DoFunc(const u32 id)
case 0xf7f7fb20: FUNC_LOG_ERROR("TODO: _sys_free"); case 0xf7f7fb20: FUNC_LOG_ERROR("TODO: _sys_free");
case 0xfa7f693d: FUNC_LOG_ERROR("TODO: _sys_vprintf"); case 0xfa7f693d: FUNC_LOG_ERROR("TODO: _sys_vprintf");
case 0xfb5db080: FUNC_LOG_ERROR("TODO: _sys_memcmp"); case 0xfb5db080: FUNC_LOG_ERROR("TODO: _sys_memcmp");
case 0xfc52a7a9: FUNC_LOG_ERROR("TODO: sys_game_process_exitspawn");
} }
ConLog.Error("Unknown func id: 0x%08x", id); ConLog.Error("Unknown func id: 0x%08x", id);

View File

@ -941,7 +941,7 @@ int cellSysCacheClear(void)
Emu.GetVFS().GetDevice(wxString("/dev_hdd1/cache/"), localPath); Emu.GetVFS().GetDevice(wxString("/dev_hdd1/cache/"), localPath);
if (wxDirExists(localPath)){ if (wxDirExists(localPath)){
WxDirDeleteTraverser deleter; WxDirDeleteTraverser deleter;
wxString f = wxFindFirstFile(localPath+"\*",wxDIR); wxString f = wxFindFirstFile(localPath+"\\*",wxDIR);
while (!f.empty()) while (!f.empty())
{ {
wxDir dir(f); wxDir dir(f);
@ -961,7 +961,7 @@ int cellSysCacheMount(mem_ptr_t<CellSysCacheParam> param)
char id[CELL_SYSCACHE_ID_SIZE]; char id[CELL_SYSCACHE_ID_SIZE];
strncpy(id, param->cacheId, CELL_SYSCACHE_ID_SIZE); strncpy(id, param->cacheId, CELL_SYSCACHE_ID_SIZE);
strncpy(param->getCachePath, ("/dev_hdd1/cache/" + std::string(id) + "/").c_str(), CELL_SYSCACHE_PATH_MAX); strncpy(param->getCachePath, ("/dev_hdd1/cache/" + std::string(id) + "/").c_str(), CELL_SYSCACHE_PATH_MAX);
Emu.GetVFS().Create(wxString(param->getCachePath)); Emu.GetVFS().CreateFile(wxString(param->getCachePath));
return CELL_SYSCACHE_RET_OK_RELAYED; return CELL_SYSCACHE_RET_OK_RELAYED;
} }

View File

@ -0,0 +1,12 @@
#include "stdafx.h"
#include "Emu/SysCalls/SysCalls.h"
#include "Emu/SysCalls/SC_FUNC.h"
#include "sceNp.h"
void sceNp_init();
Module sceNp(0x0016, sceNpTrophy_init);
void sceNpTrophy_init()
{
}

View File

@ -0,0 +1,26 @@
#pragma once
// Return Codes
enum
{
};
enum
{
SCE_NP_COMMUNICATION_SIGNATURE_SIZE = 160,
SCE_NET_NP_COMMUNICATION_PASSPHRASE_SIZE = 128,
};
// Structs
struct SceNpCommunicationId
{
char data[9];
char term;
u8 num;
char dummy;
};
struct SceNpCommunicationSignature
{
uint8_t data[SCE_NP_COMMUNICATION_SIGNATURE_SIZE];
};

View File

@ -0,0 +1,281 @@
#include "stdafx.h"
#include "Emu/SysCalls/SysCalls.h"
#include "Emu/SysCalls/SC_FUNC.h"
#include "sceNp.h"
#include "Loader/TRP.h"
void sceNpTrophy_unload();
void sceNpTrophy_init();
Module sceNpTrophy(0xf035, sceNpTrophy_init, nullptr, sceNpTrophy_unload);
enum
{
SCE_NP_TROPHY_ERROR_ALREADY_INITIALIZED = 0x80022901,
SCE_NP_TROPHY_ERROR_NOT_INITIALIZED = 0x80022902,
SCE_NP_TROPHY_ERROR_NOT_SUPPORTED = 0x80022903,
SCE_NP_TROPHY_ERROR_CONTEXT_NOT_REGISTERED = 0x80022904,
SCE_NP_TROPHY_ERROR_OUT_OF_MEMORY = 0x80022905,
SCE_NP_TROPHY_ERROR_INVALID_ARGUMENT = 0x80022906,
SCE_NP_TROPHY_ERROR_EXCEEDS_MAX = 0x80022907,
SCE_NP_TROPHY_ERROR_INSUFFICIENT = 0x80022909,
SCE_NP_TROPHY_ERROR_UNKNOWN_CONTEXT = 0x8002290a,
SCE_NP_TROPHY_ERROR_INVALID_FORMAT = 0x8002290b,
SCE_NP_TROPHY_ERROR_BAD_RESPONSE = 0x8002290c,
SCE_NP_TROPHY_ERROR_INVALID_GRADE = 0x8002290d,
SCE_NP_TROPHY_ERROR_INVALID_CONTEXT = 0x8002290e,
SCE_NP_TROPHY_ERROR_PROCESSING_ABORTED = 0x8002290f,
SCE_NP_TROPHY_ERROR_ABORT = 0x80022910,
SCE_NP_TROPHY_ERROR_UNKNOWN_HANDLE = 0x80022911,
SCE_NP_TROPHY_ERROR_LOCKED = 0x80022912,
SCE_NP_TROPHY_ERROR_HIDDEN = 0x80022913,
SCE_NP_TROPHY_ERROR_CANNOT_UNLOCK_PLATINUM = 0x80022914,
SCE_NP_TROPHY_ERROR_ALREADY_UNLOCKED = 0x80022915,
SCE_NP_TROPHY_ERROR_INVALID_TYPE = 0x80022916,
SCE_NP_TROPHY_ERROR_INVALID_HANDLE = 0x80022917,
SCE_NP_TROPHY_ERROR_INVALID_NP_COMM_ID = 0x80022918,
SCE_NP_TROPHY_ERROR_UNKNOWN_NP_COMM_ID = 0x80022919,
SCE_NP_TROPHY_ERROR_DISC_IO = 0x8002291a,
SCE_NP_TROPHY_ERROR_CONF_DOES_NOT_EXIST = 0x8002291b,
SCE_NP_TROPHY_ERROR_UNSUPPORTED_FORMAT = 0x8002291c,
SCE_NP_TROPHY_ERROR_ALREADY_INSTALLED = 0x8002291d,
SCE_NP_TROPHY_ERROR_BROKEN_DATA = 0x8002291e,
SCE_NP_TROPHY_ERROR_VERIFICATION_FAILURE = 0x8002291f,
SCE_NP_TROPHY_ERROR_INVALID_TROPHY_ID = 0x80022920,
SCE_NP_TROPHY_ERROR_UNKNOWN_TROPHY_ID = 0x80022921,
SCE_NP_TROPHY_ERROR_UNKNOWN_TITLE = 0x80022922,
SCE_NP_TROPHY_ERROR_UNKNOWN_FILE = 0x80022923,
SCE_NP_TROPHY_ERROR_DISC_NOT_MOUNTED = 0x80022924,
SCE_NP_TROPHY_ERROR_SHUTDOWN = 0x80022925,
SCE_NP_TROPHY_ERROR_TITLE_ICON_NOT_FOUND = 0x80022926,
SCE_NP_TROPHY_ERROR_TROPHY_ICON_NOT_FOUND = 0x80022927,
SCE_NP_TROPHY_ERROR_INSUFFICIENT_DISK_SPACE = 0x80022928,
SCE_NP_TROPHY_ERROR_ILLEGAL_UPDATE = 0x8002292a,
SCE_NP_TROPHY_ERROR_SAVEDATA_USER_DOES_NOT_MATCH = 0x8002292b,
SCE_NP_TROPHY_ERROR_TROPHY_ID_DOES_NOT_EXIST = 0x8002292c,
SCE_NP_TROPHY_ERROR_SERVICE_UNAVAILABLE = 0x8002292d,
SCE_NP_TROPHY_ERROR_UNKNOWN = 0x800229ff,
};
struct sceNpTrophyInternalContext
{
// TODO
std::string trp_name;
vfsStream* trp_stream;
};
struct sceNpTrophyInternal
{
bool m_bInitialized;
std::vector<sceNpTrophyInternalContext> contexts;
sceNpTrophyInternal()
: m_bInitialized(false)
{
}
};
sceNpTrophyInternal s_npTrophyInstance;
// Functions
int sceNpTrophyInit(u32 pool_addr, u32 poolSize, u32 containerId, u64 options)
{
sceNpTrophy.Log("sceNpTrophyInit(pool_addr=0x%x, poolSize=%d, containerId=%d, options=0x%llx)", pool_addr, poolSize, containerId, options);
if (s_npTrophyInstance.m_bInitialized)
return SCE_NP_TROPHY_ERROR_ALREADY_INITIALIZED;
if (options)
return SCE_NP_TROPHY_ERROR_NOT_SUPPORTED;
s_npTrophyInstance.m_bInitialized = true;
return CELL_OK;
}
int sceNpTrophyCreateContext(mem32_t context, mem_ptr_t<SceNpCommunicationId> commID, mem_ptr_t<SceNpCommunicationSignature> commSign, u64 options)
{
sceNpTrophy.Warning("sceNpTrophyCreateContext(context_addr=0x%x, commID_addr=0x%x, commSign_addr=0x%x, options=0x%llx)",
context.GetAddr(), commID.GetAddr(), commSign.GetAddr(), options);
if (!s_npTrophyInstance.m_bInitialized)
return SCE_NP_TROPHY_ERROR_NOT_INITIALIZED;
if (!context.IsGood())
return SCE_NP_TROPHY_ERROR_INVALID_ARGUMENT;
if (options & (~(u64)1))
SCE_NP_TROPHY_ERROR_NOT_SUPPORTED;
// TODO: There are other possible errors
// TODO: Is the TROPHY.TRP file necessarily located in this path?
vfsDir dir("/app_home/TROPDIR/");
if(!dir.IsOpened())
return SCE_NP_TROPHY_ERROR_CONF_DOES_NOT_EXIST;
// TODO: Following method will retrieve the TROPHY.TRP of the first folder that contains such file
for(const DirEntryInfo* entry = dir.Read(); entry; entry = dir.Read())
{
if (entry->flags & DirEntry_TypeDir)
{
std::shared_ptr<vfsFileBase> f(Emu.GetVFS().OpenFile("/app_home/TROPDIR/" + entry->name + "/TROPHY.TRP", vfsRead));
if (f && f->IsOpened())
{
sceNpTrophyInternalContext ctxt;
ctxt.trp_stream = f.get();
ctxt.trp_name = entry->name;
s_npTrophyInstance.contexts.push_back(ctxt);
f = nullptr;
return CELL_OK;
}
}
}
return SCE_NP_TROPHY_ERROR_CONF_DOES_NOT_EXIST;
}
int sceNpTrophyCreateHandle(mem32_t handle)
{
sceNpTrophy.Warning("sceNpTrophyCreateHandle(handle_addr=0x%x)", handle.GetAddr());
if (!s_npTrophyInstance.m_bInitialized)
return SCE_NP_TROPHY_ERROR_NOT_INITIALIZED;
if (!handle.IsGood())
return SCE_NP_TROPHY_ERROR_INVALID_ARGUMENT;
// TODO: There are other possible errors
// TODO: ?
return CELL_OK;
}
int sceNpTrophyRegisterContext(u32 context, u32 handle, u32 statusCb_addr, u32 arg_addr, u64 options)
{
sceNpTrophy.Warning("sceNpTrophyRegisterContext(context=%d, handle=%d, statusCb_addr=0x%x, arg_addr=0x%x, options=0x%llx)",
context, handle, statusCb_addr, arg_addr, options);
if (!(s_npTrophyInstance.m_bInitialized))
return SCE_NP_TROPHY_ERROR_NOT_INITIALIZED;
if (!Memory.IsGoodAddr(statusCb_addr))
return SCE_NP_TROPHY_ERROR_INVALID_ARGUMENT;
if (options & (~(u64)1))
SCE_NP_TROPHY_ERROR_NOT_SUPPORTED;
// TODO: There are other possible errors
int ret;
sceNpTrophyInternalContext& ctxt = s_npTrophyInstance.contexts[context];
TRPLoader trp(*(ctxt.trp_stream));
// TODO: Get the path of the current user
if (trp.Install("/dev_hdd0/home/00000001/trophy/" + ctxt.trp_name))
ret = CELL_OK;
else
ret = SCE_NP_TROPHY_ERROR_ILLEGAL_UPDATE;
// TODO: Callbacks
trp.Close();
return ret;
}
int sceNpTrophyGetGameProgress()
{
UNIMPLEMENTED_FUNC(sceNpTrophy);
return CELL_OK;
}
int sceNpTrophySetSoundLevel()
{
UNIMPLEMENTED_FUNC(sceNpTrophy);
return CELL_OK;
}
int sceNpTrophyGetRequiredDiskSpace()
{
UNIMPLEMENTED_FUNC(sceNpTrophy);
return CELL_OK;
}
int sceNpTrophyDestroyContext()
{
UNIMPLEMENTED_FUNC(sceNpTrophy);
return CELL_OK;
}
int sceNpTrophyAbortHandle()
{
UNIMPLEMENTED_FUNC(sceNpTrophy);
return CELL_OK;
}
int sceNpTrophyGetGameInfo()
{
UNIMPLEMENTED_FUNC(sceNpTrophy);
return CELL_OK;
}
int sceNpTrophyDestroyHandle()
{
UNIMPLEMENTED_FUNC(sceNpTrophy);
return CELL_OK;
}
int sceNpTrophyUnlockTrophy()
{
UNIMPLEMENTED_FUNC(sceNpTrophy);
return CELL_OK;
}
int sceNpTrophyTerm()
{
UNIMPLEMENTED_FUNC(sceNpTrophy);
return CELL_OK;
}
int sceNpTrophyGetTrophyUnlockState()
{
UNIMPLEMENTED_FUNC(sceNpTrophy);
return CELL_OK;
}
int sceNpTrophyGetTrophyIcon()
{
UNIMPLEMENTED_FUNC(sceNpTrophy);
return CELL_OK;
}
int sceNpTrophyGetTrophyInfo()
{
UNIMPLEMENTED_FUNC(sceNpTrophy);
return CELL_OK;
}
int sceNpTrophyGetGameIcon()
{
UNIMPLEMENTED_FUNC(sceNpTrophy);
return CELL_OK;
}
void sceNpTrophy_unload()
{
s_npTrophyInstance.m_bInitialized = false;
}
void sceNpTrophy_init()
{
sceNpTrophy.AddFunc(0x079f0e87, sceNpTrophyGetGameProgress);
sceNpTrophy.AddFunc(0x1197b52c, sceNpTrophyRegisterContext);
sceNpTrophy.AddFunc(0x1c25470d, sceNpTrophyCreateHandle);
sceNpTrophy.AddFunc(0x27deda93, sceNpTrophySetSoundLevel);
sceNpTrophy.AddFunc(0x370136fe, sceNpTrophyGetRequiredDiskSpace);
sceNpTrophy.AddFunc(0x3741ecc7, sceNpTrophyDestroyContext);
sceNpTrophy.AddFunc(0x39567781, sceNpTrophyInit);
sceNpTrophy.AddFunc(0x48bd97c7, sceNpTrophyAbortHandle);
sceNpTrophy.AddFunc(0x49d18217, sceNpTrophyGetGameInfo);
sceNpTrophy.AddFunc(0x623cd2dc, sceNpTrophyDestroyHandle);
sceNpTrophy.AddFunc(0x8ceedd21, sceNpTrophyUnlockTrophy);
sceNpTrophy.AddFunc(0xa7fabf4d, sceNpTrophyTerm);
sceNpTrophy.AddFunc(0xb3ac3478, sceNpTrophyGetTrophyUnlockState);
sceNpTrophy.AddFunc(0xbaedf689, sceNpTrophyGetTrophyIcon);
sceNpTrophy.AddFunc(0xe3bf9a28, sceNpTrophyCreateContext);
sceNpTrophy.AddFunc(0xfce6d30a, sceNpTrophyGetTrophyInfo);
sceNpTrophy.AddFunc(0xff299e03, sceNpTrophyGetGameIcon);
}

View File

@ -35,20 +35,18 @@ bool sdata_check(u32 version, u32 flags, u64 filesizeInput, u64 filesizeTmp)
int sdata_unpack(wxString packed_file, wxString unpacked_file) int sdata_unpack(wxString packed_file, wxString unpacked_file)
{ {
vfsStream* packed_stream = Emu.GetVFS().Open(packed_file, vfsRead); std::shared_ptr<vfsFileBase> packed_stream(Emu.GetVFS().OpenFile(packed_file, vfsRead));
vfsStream* unpacked_stream = Emu.GetVFS().Open(unpacked_file, vfsWrite); std::shared_ptr<vfsFileBase> unpacked_stream(Emu.GetVFS().OpenFile(unpacked_file, vfsWrite));
if(!packed_stream || !packed_stream->IsOpened()) if(!packed_stream || !packed_stream->IsOpened())
{ {
sys_fs.Error("'%s' not found! flags: 0x%08x", packed_file.wx_str(), vfsRead); sys_fs.Error("'%s' not found! flags: 0x%08x", packed_file.wx_str(), vfsRead);
delete packed_stream;
return CELL_ENOENT; return CELL_ENOENT;
} }
if(!unpacked_stream || !unpacked_stream->IsOpened()) if(!unpacked_stream || !unpacked_stream->IsOpened())
{ {
sys_fs.Error("'%s' couldn't be created! flags: 0x%08x", unpacked_file.wx_str(), vfsWrite); sys_fs.Error("'%s' couldn't be created! flags: 0x%08x", unpacked_file.wx_str(), vfsWrite);
delete unpacked_stream;
return CELL_ENOENT; return CELL_ENOENT;
} }
@ -105,9 +103,6 @@ int sdata_unpack(wxString packed_file, wxString unpacked_file)
} }
} }
packed_stream->Close();
unpacked_stream->Close();
return CELL_OK; return CELL_OK;
} }
@ -131,8 +126,7 @@ int cellFsSdataOpen(u32 path_addr, int flags, mem32_t fd, mem32_t arg, u64 size)
int ret = sdata_unpack(path, unpacked_path); int ret = sdata_unpack(path, unpacked_path);
if (ret) return ret; if (ret) return ret;
vfsStream* stream = Emu.GetVFS().Open(unpacked_path, vfsRead); fd = sys_fs.GetNewId(Emu.GetVFS().OpenFile(unpacked_path, vfsRead), flags);
fd = sys_fs.GetNewId(stream, flags);
return CELL_OK; return CELL_OK;
} }

View File

@ -307,8 +307,8 @@ extern int cellMouseGetRawData(u32 port_no, mem_class_t data);
extern int cellGcmCallback(u32 context_addr, u32 count); extern int cellGcmCallback(u32 context_addr, u32 count);
//sys_tty //sys_tty
extern int sys_tty_read(s32 ch, u64 buf_addr, u32 len, u64 preadlen_addr); extern int sys_tty_read(u32 ch, u64 buf_addr, u32 len, u64 preadlen_addr);
extern int sys_tty_write(s32 ch, u64 buf_addr, u32 len, u64 pwritelen_addr); extern int sys_tty_write(u32 ch, u64 buf_addr, u32 len, u64 pwritelen_addr);
//sys_heap //sys_heap
extern int sys_heap_create_heap(const u32 heap_addr, const u32 start_addr, const u32 size); extern int sys_heap_create_heap(const u32 heap_addr, const u32 start_addr, const u32 size);

View File

@ -17,7 +17,7 @@ int cellFsOpen(u32 path_addr, int flags, mem32_t fd, mem32_t arg, u64 size)
if(flags & CELL_O_CREAT) if(flags & CELL_O_CREAT)
{ {
_oflags &= ~CELL_O_CREAT; _oflags &= ~CELL_O_CREAT;
Emu.GetVFS().Create(ppath); Emu.GetVFS().CreateFile(ppath);
} }
vfsOpenMode o_mode; vfsOpenMode o_mode;
@ -55,9 +55,7 @@ int cellFsOpen(u32 path_addr, int flags, mem32_t fd, mem32_t arg, u64 size)
{ {
_oflags &= ~CELL_O_TRUNC; _oflags &= ~CELL_O_TRUNC;
//truncate file before opening it as read/write //truncate file before opening it as read/write
vfsStream* stream = Emu.GetVFS().Open(ppath, vfsWrite); Emu.GetVFS().OpenFile(ppath, vfsWrite);
stream->Close();
delete stream;
} }
o_mode = vfsReadWrite; o_mode = vfsReadWrite;
break; break;
@ -69,13 +67,11 @@ int cellFsOpen(u32 path_addr, int flags, mem32_t fd, mem32_t arg, u64 size)
return CELL_EINVAL; return CELL_EINVAL;
} }
vfsStream* stream = Emu.GetVFS().Open(ppath, o_mode); vfsFileBase* stream = Emu.GetVFS().OpenFile(ppath, o_mode);
if(!stream || !stream->IsOpened()) if(!stream || !stream->IsOpened())
{ {
sys_fs.Error("\"%s\" not found! flags: 0x%08x", ppath.wx_str(), flags); sys_fs.Error("\"%s\" not found! flags: 0x%08x", ppath.wx_str(), flags);
delete stream;
return CELL_ENOENT; return CELL_ENOENT;
} }
@ -145,11 +141,12 @@ int cellFsOpendir(u32 path_addr, mem32_t fd)
if(!Memory.IsGoodAddr(path_addr) || !fd.IsGood()) if(!Memory.IsGoodAddr(path_addr) || !fd.IsGood())
return CELL_EFAULT; return CELL_EFAULT;
wxString localPath; vfsDirBase* dir = Emu.GetVFS().OpenDir(path);
Emu.GetVFS().GetDevice(path, localPath); if(!dir || !dir->IsOpened())
vfsLocalDir* dir = new vfsLocalDir(localPath); {
if(!dir->Open(localPath)) delete dir;
return CELL_ENOENT; return CELL_ENOENT;
}
fd = sys_fs.GetNewId(dir); fd = sys_fs.GetNewId(dir);
return CELL_OK; return CELL_OK;
@ -171,7 +168,7 @@ int cellFsReaddir(u32 fd, mem_ptr_t<CellFsDirent> dir, mem64_t nread)
nread = 1; nread = 1;
Memory.WriteString(dir.GetAddr()+2, info->name.wx_str()); Memory.WriteString(dir.GetAddr()+2, info->name.wx_str());
dir->d_namlen = info->name.Length(); dir->d_namlen = info->name.Length();
dir->d_type = (info->flags & 0x1) ? CELL_FS_TYPE_REGULAR : CELL_FS_TYPE_DIRECTORY; dir->d_type = (info->flags & DirEntry_TypeFile) ? CELL_FS_TYPE_REGULAR : CELL_FS_TYPE_DIRECTORY;
} }
else else
{ {

View File

@ -1,17 +1,18 @@
#include "stdafx.h" #include "stdafx.h"
#include "Emu/SysCalls/SysCalls.h" #include "Emu/SysCalls/SysCalls.h"
int sys_tty_read(s32 ch, u64 buf_addr, u32 len, u64 preadlen_addr) int sys_tty_read(u32 ch, u64 buf_addr, u32 len, u64 preadlen_addr)
{ {
ConLog.Warning("sys_tty_read: ch: %d, buf addr: %llx, len: %d", ch, buf_addr, len); ConLog.Warning("sys_tty_read: ch: %d, buf addr: %llx, len: %d", ch, buf_addr, len);
Memory.Write32NN(preadlen_addr, len); Memory.Write32NN(preadlen_addr, len);
Emu.Pause();
return CELL_OK; return CELL_OK;
} }
int sys_tty_write(s32 ch, u64 buf_addr, u32 len, u64 pwritelen_addr) int sys_tty_write(u32 ch, u64 buf_addr, u32 len, u64 pwritelen_addr)
{ {
if(ch < 0 || ch > 15 || (s32)len <= 0) return CELL_EINVAL; if(ch > 15 || (s32)len <= 0) return CELL_EINVAL;
if(!Memory.IsGoodAddr(buf_addr)) return CELL_EFAULT; if(!Memory.IsGoodAddr(buf_addr)) return CELL_EFAULT;
Emu.GetDbgCon().Write(ch, Memory.ReadString(buf_addr, len)); Emu.GetDbgCon().Write(ch, Memory.ReadString(buf_addr, len));

View File

@ -92,9 +92,9 @@ void Emulator::CheckStatus()
bool Emulator::IsSelf(const std::string& path) bool Emulator::IsSelf(const std::string& path)
{ {
vfsLocalFile f(path); vfsLocalFile f(nullptr);
if(!f.IsOpened()) if(!f.Open(path))
return false; return false;
SceHeader hdr; SceHeader hdr;
@ -238,7 +238,7 @@ void Emulator::Load()
try try
{ {
if(!(is_error = !l.Analyze() || l.GetMachine() == MACHINE_Unknown)) if(!(is_error = !l.Analyze()) && l.GetMachine() != MACHINE_Unknown)
{ {
switch(l.GetMachine()) switch(l.GetMachine())
{ {

View File

@ -107,16 +107,6 @@ public:
void SetPath(const wxString& path, const wxString& elf_path = wxEmptyString); void SetPath(const wxString& path, const wxString& elf_path = wxEmptyString);
void SetTitleID(const wxString& id); void SetTitleID(const wxString& id);
std::shared_ptr<vfsFileBase> OpenFile(const wxString& path, vfsOpenMode mode = vfsRead)
{
return std::shared_ptr<vfsFileBase>((vfsFileBase*)m_vfs.Open(path, mode));
}
std::shared_ptr<vfsStream> OpenStream(const wxString& path, vfsOpenMode mode = vfsRead)
{
return std::shared_ptr<vfsStream>(m_vfs.Open(path, mode));
}
CPUThreadManager& GetCPU() { return m_thread_manager; } CPUThreadManager& GetCPU() { return m_thread_manager; }
PadManager& GetPadManager() { return m_pad_manager; } PadManager& GetPadManager() { return m_pad_manager; }
KeyboardManager& GetKeyboardManager() { return m_keyboard_manager; } KeyboardManager& GetKeyboardManager() { return m_keyboard_manager; }

View File

@ -12,7 +12,7 @@ enum CompilerIDs
wxFont GetFont(int size) wxFont GetFont(int size)
{ {
return wxFont(size, wxMODERN, wxNORMAL, wxNORMAL); return wxFont(size, wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL);
} }
CompilerELF::CompilerELF(wxWindow* parent) CompilerELF::CompilerELF(wxWindow* parent)

View File

@ -294,7 +294,9 @@ void DisAsmFrame::Dump(wxCommandEvent& WXUNUSED(event))
if(ctrl.ShowModal() == wxID_CANCEL) return; if(ctrl.ShowModal() == wxID_CANCEL) return;
vfsStream& f_elf = *new vfsLocalFile(Emu.m_path); vfsLocalFile& f_elf = *new vfsLocalFile(nullptr);
f_elf.Open(Emu.m_path);
ConLog.Write("path: %s", Emu.m_path.wx_str()); ConLog.Write("path: %s", Emu.m_path.wx_str());
Elf_Ehdr ehdr; Elf_Ehdr ehdr;
ehdr.Load(f_elf); ehdr.Load(f_elf);

View File

@ -50,8 +50,10 @@ void GameViewer::LoadPSF()
for(uint i=0; i<m_games.GetCount(); ++i) for(uint i=0; i<m_games.GetCount(); ++i)
{ {
const wxString& path = m_path + m_games[i] + "\\PARAM.SFO"; const wxString& path = m_path + m_games[i] + "\\PARAM.SFO";
if(!wxFileExists(path)) continue; vfsLocalFile f(nullptr);
vfsLocalFile f(path); if(!f.Open(path))
continue;
PSFLoader psf(f); PSFLoader psf(f);
if(!psf.Load(false)) continue; if(!psf.Load(false)) continue;
psf.m_info.root = m_games[i]; psf.m_info.root = m_games[i];

View File

@ -293,9 +293,11 @@ void RSXDebugger::OnClickBuffer(wxMouseEvent& event)
if (event.GetId() == p_buffer_colorD->GetId()) SHOW_BUFFER(3); if (event.GetId() == p_buffer_colorD->GetId()) SHOW_BUFFER(3);
if (event.GetId() == p_buffer_tex->GetId()) if (event.GetId() == p_buffer_tex->GetId())
{ {
if(Memory.IsGoodAddr(GetAddress(render.m_textures[m_cur_texture].GetOffset(), render.m_textures[m_cur_texture].GetLocation())) && render.m_textures[m_cur_texture].GetWidth() && render.m_textures[m_cur_texture].GetHeight()) u8 location = render.m_textures[m_cur_texture].GetLocation();
if(location <= 1 && Memory.IsGoodAddr(GetAddress(render.m_textures[m_cur_texture].GetOffset(), location))
&& render.m_textures[m_cur_texture].GetWidth() && render.m_textures[m_cur_texture].GetHeight())
MemoryViewerPanel::ShowImage(this, MemoryViewerPanel::ShowImage(this,
GetAddress(render.m_textures[m_cur_texture].GetOffset(), render.m_textures[m_cur_texture].GetLocation()), 1, GetAddress(render.m_textures[m_cur_texture].GetOffset(), location), 1,
render.m_textures[m_cur_texture].GetWidth(), render.m_textures[m_cur_texture].GetWidth(),
render.m_textures[m_cur_texture].GetHeight(), false); render.m_textures[m_cur_texture].GetHeight(), false);
} }
@ -417,7 +419,20 @@ void RSXDebugger::GetBuffers()
} }
// Draw Texture // Draw Texture
u32 TexBuffer_addr = GetAddress(render.m_textures[m_cur_texture].GetOffset(), render.m_textures[m_cur_texture].GetLocation()); if(!render.m_textures[m_cur_texture].IsEnabled())
return;
u32 offset = render.m_textures[m_cur_texture].GetOffset();
if(!offset)
return;
u8 location = render.m_textures[m_cur_texture].GetLocation();
if(location > 1)
return;
u32 TexBuffer_addr = GetAddress(offset, location);
if(!Memory.IsGoodAddr(TexBuffer_addr)) if(!Memory.IsGoodAddr(TexBuffer_addr))
return; return;
@ -487,7 +502,17 @@ void RSXDebugger::GetTexture()
if(render.m_textures[i].IsEnabled()) if(render.m_textures[i].IsEnabled())
{ {
m_list_texture->InsertItem(i, wxString::Format("%d", i)); m_list_texture->InsertItem(i, wxString::Format("%d", i));
m_list_texture->SetItem(i, 1, wxString::Format("0x%x", GetAddress(render.m_textures[i].GetOffset(), render.m_textures[i].GetLocation()))); u8 location = render.m_textures[i].GetLocation();
if(location > 1)
{
m_list_texture->SetItem(i, 1,
wxString::Format("Bad address (offset=0x%x, location=%d)", render.m_textures[i].GetOffset(), location));
}
else
{
m_list_texture->SetItem(i, 1, wxString::Format("0x%x", GetAddress(render.m_textures[i].GetOffset(), location)));
}
m_list_texture->SetItem(i, 2, render.m_textures[i].isCubemap() ? "True" : "False"); m_list_texture->SetItem(i, 2, render.m_textures[i].isCubemap() ? "True" : "False");
m_list_texture->SetItem(i, 3, wxString::Format("%dD", render.m_textures[i].GetDimension())); m_list_texture->SetItem(i, 3, wxString::Format("%dD", render.m_textures[i].GetDimension()));
m_list_texture->SetItem(i, 4, render.m_textures[i].IsEnabled() ? "True" : "False"); m_list_texture->SetItem(i, 4, render.m_textures[i].IsEnabled() ? "True" : "False");

View File

@ -67,7 +67,7 @@ VHDDExplorer::VHDDExplorer(wxWindow* parent, const wxString& hdd_path) : wxDialo
m_list->InsertColumn(2, "Size"); m_list->InsertColumn(2, "Size");
m_list->InsertColumn(3, "Creation time"); m_list->InsertColumn(3, "Creation time");
m_hdd = new vfsHDD(hdd_path); m_hdd = new vfsHDD(nullptr, hdd_path);
UpdateList(); UpdateList();
Connect(m_list->GetId(), wxEVT_COMMAND_LIST_BEGIN_DRAG, wxListEventHandler(VHDDExplorer::OnListDrag)); Connect(m_list->GetId(), wxEVT_COMMAND_LIST_BEGIN_DRAG, wxListEventHandler(VHDDExplorer::OnListDrag));
Connect(m_list->GetId(), wxEVT_COMMAND_LIST_ITEM_ACTIVATED, wxListEventHandler(VHDDExplorer::DClick)); Connect(m_list->GetId(), wxEVT_COMMAND_LIST_ITEM_ACTIVATED, wxListEventHandler(VHDDExplorer::DClick));

View File

@ -162,11 +162,13 @@ bool Loader::Load()
return false; return false;
} }
/*
const wxString& root = wxFileName(wxFileName(m_stream->GetPath()).GetPath()).GetPath(); const wxString& root = wxFileName(wxFileName(m_stream->GetPath()).GetPath()).GetPath();
wxString ps3_path;
const wxString& psf_path = root + "\\" + "PARAM.SFO"; const wxString& psf_path = root + "\\" + "PARAM.SFO";
if(wxFileExists(psf_path)) vfsFile f(psf_path);
if(f.IsOpened())
{ {
vfsLocalFile f(psf_path);
PSFLoader psf_l(f); PSFLoader psf_l(f);
if(psf_l.Load()) if(psf_l.Load())
{ {
@ -175,6 +177,6 @@ bool Loader::Load()
psf_l.Close(); psf_l.Close();
} }
} }
*/
return true; return true;
} }

View File

@ -9,10 +9,14 @@ bool TRPLoader::Install(std::string dest, bool show)
{ {
if(!trp_f.IsOpened()) return false; if(!trp_f.IsOpened()) return false;
if(!LoadHeader(show)) return false; if(!LoadHeader(show)) return false;
if (!dest.empty() && dest.back() != '/')
dest += '/';
for (const TRPEntry& entry : m_entries) for (const TRPEntry& entry : m_entries)
{ {
char* buffer = new char [entry.size]; char* buffer = new char [entry.size];
Emu.GetVFS().CreateFile(dest+entry.name);
vfsFile file(dest+entry.name, vfsWrite); vfsFile file(dest+entry.name, vfsWrite);
trp_f.Seek(entry.offset); trp_f.Seek(entry.offset);
trp_f.Read(buffer, entry.size); trp_f.Read(buffer, entry.size);
@ -35,7 +39,7 @@ bool TRPLoader::LoadHeader(bool show)
if (trp_f.Read(&m_header, sizeof(TRPHeader)) != sizeof(TRPHeader)) if (trp_f.Read(&m_header, sizeof(TRPHeader)) != sizeof(TRPHeader))
return false; return false;
if (!m_header.CheckMagic()) if (m_header.trp_magic != 0xDCA24D00)
return false; return false;
if (show) if (show)

View File

@ -3,26 +3,22 @@
struct TRPHeader struct TRPHeader
{ {
u32 trp_magic; be_t<u32> trp_magic;
u32 trp_version; be_t<u32> trp_version;
u64 trp_file_size; be_t<u64> trp_file_size;
u32 trp_files_count; be_t<u32> trp_files_count;
u32 trp_element_size; be_t<u32> trp_element_size;
u32 trp_unknown; be_t<u32> trp_unknown;
unsigned char sha1[20]; unsigned char sha1[20];
unsigned char padding[16]; unsigned char padding[16];
bool CheckMagic() const {
return trp_magic == 0xDCA23D00;
}
}; };
struct TRPEntry struct TRPEntry
{ {
char name[20]; char name[32];
u64 offset; be_t<u64> offset;
u64 size; be_t<u64> size;
u32 unknown; be_t<u32> unknown;
char padding[12]; char padding[12];
}; };

View File

@ -227,6 +227,8 @@
<ClCompile Include="Emu\Event.cpp" /> <ClCompile Include="Emu\Event.cpp" />
<ClCompile Include="Emu\FS\VFS.cpp" /> <ClCompile Include="Emu\FS\VFS.cpp" />
<ClCompile Include="Emu\FS\vfsDevice.cpp" /> <ClCompile Include="Emu\FS\vfsDevice.cpp" />
<ClCompile Include="Emu\FS\vfsDeviceLocalFile.cpp" />
<ClCompile Include="Emu\FS\vfsDir.cpp" />
<ClCompile Include="Emu\FS\vfsDirBase.cpp" /> <ClCompile Include="Emu\FS\vfsDirBase.cpp" />
<ClCompile Include="Emu\FS\vfsFile.cpp" /> <ClCompile Include="Emu\FS\vfsFile.cpp" />
<ClCompile Include="Emu\FS\vfsFileBase.cpp" /> <ClCompile Include="Emu\FS\vfsFileBase.cpp" />
@ -293,6 +295,7 @@
<ClCompile Include="Emu\SysCalls\Modules\cellSysmodule.cpp" /> <ClCompile Include="Emu\SysCalls\Modules\cellSysmodule.cpp" />
<ClCompile Include="Emu\SysCalls\Modules\cellSysutil.cpp" /> <ClCompile Include="Emu\SysCalls\Modules\cellSysutil.cpp" />
<ClCompile Include="Emu\SysCalls\Modules\cellSysutilAp.cpp" /> <ClCompile Include="Emu\SysCalls\Modules\cellSysutilAp.cpp" />
<ClCompile Include="Emu\SysCalls\Modules\sceNpTrophy.cpp" />
<ClCompile Include="Emu\SysCalls\Modules\sysPrxForUser.cpp" /> <ClCompile Include="Emu\SysCalls\Modules\sysPrxForUser.cpp" />
<ClCompile Include="Emu\SysCalls\Modules\sys_fs.cpp" /> <ClCompile Include="Emu\SysCalls\Modules\sys_fs.cpp" />
<ClCompile Include="Emu\SysCalls\Modules\sys_io.cpp" /> <ClCompile Include="Emu\SysCalls\Modules\sys_io.cpp" />

View File

@ -397,6 +397,15 @@
<ClCompile Include="Emu\GS\RSXTexture.cpp"> <ClCompile Include="Emu\GS\RSXTexture.cpp">
<Filter>Emu\GS</Filter> <Filter>Emu\GS</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="Emu\SysCalls\Modules\sceNpTrophy.cpp">
<Filter>Emu\SysCalls\Modules</Filter>
</ClCompile>
<ClCompile Include="Emu\FS\vfsDeviceLocalFile.cpp">
<Filter>Emu\FS</Filter>
</ClCompile>
<ClCompile Include="Emu\FS\vfsDir.cpp">
<Filter>Emu\FS</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ResourceCompile Include="rpcs3.rc" /> <ResourceCompile Include="rpcs3.rc" />

View File

@ -210,9 +210,10 @@ enum Status
#include "Emu/FS/vfsFileBase.h" #include "Emu/FS/vfsFileBase.h"
#include "Emu/FS/vfsLocalDir.h" #include "Emu/FS/vfsLocalDir.h"
#include "Emu/FS/vfsLocalFile.h" #include "Emu/FS/vfsLocalFile.h"
#include "Emu/FS/vfsFile.h"
#include "Emu/FS/vfsStream.h" #include "Emu/FS/vfsStream.h"
#include "Emu/FS/vfsStreamMemory.h" #include "Emu/FS/vfsStreamMemory.h"
#include "Emu/FS/vfsFile.h"
#include "Emu/FS/vfsDir.h"
#include "rpcs3.h" #include "rpcs3.h"
#define _PRGNAME_ "RPCS3" #define _PRGNAME_ "RPCS3"