Merge pull request #930 from tambry/StatFixesAndFragment

Fragment program improvements and stat fixes
This commit is contained in:
B1ackDaemon 2014-12-26 22:57:29 +02:00
commit c8ba041a38
7 changed files with 31 additions and 77 deletions

View file

@ -491,10 +491,10 @@ void GLFragmentDecompilerThread::Task()
case RSX_FP_OPCODE_DDY: SetDst("dFdy($0)"); break; case RSX_FP_OPCODE_DDY: SetDst("dFdy($0)"); break;
case RSX_FP_OPCODE_NRM: SetDst("normalize($0)"); break; case RSX_FP_OPCODE_NRM: SetDst("normalize($0)"); break;
case RSX_FP_OPCODE_TEX: SetDst("texture($t, $0.xy)"); break; case RSX_FP_OPCODE_TEX: SetDst("texture($t, $0.xy)"); break;
case RSX_FP_OPCODE_TXP: LOG_ERROR(RSX, "Unimplemented TEX_SRB instruction: TXP"); break; case RSX_FP_OPCODE_TXP: LOG_ERROR(RSX, "TEX_SRB texture projection used. Please report this to a RPCS3 developer!"); SetDst("textureProj($t, $0.xy, $1)"); break; //TODO: Test this
case RSX_FP_OPCODE_TXD: LOG_ERROR(RSX, "Unimplemented TEX_SRB instruction: TXD"); break; case RSX_FP_OPCODE_TXD: LOG_ERROR(RSX, "Unimplemented TEX_SRB instruction: TXD"); break;
case RSX_FP_OPCODE_TXB: LOG_ERROR(RSX, "Unimplemented TEX_SRB instruction: TXB"); break; case RSX_FP_OPCODE_TXB: SetDst("texture($t, $0.xy, $1)"); break;
case RSX_FP_OPCODE_TXL: LOG_ERROR(RSX, "Unimplemented TEX_SRB instruction: TXL"); break; case RSX_FP_OPCODE_TXL: SetDst("textureLod($t, $0.xy, $1.x)"); break;
case RSX_FP_OPCODE_UP2: LOG_ERROR(RSX, "Unimplemented TEX_SRB instruction: UP2"); break; case RSX_FP_OPCODE_UP2: LOG_ERROR(RSX, "Unimplemented TEX_SRB instruction: UP2"); break;
case RSX_FP_OPCODE_UP4: LOG_ERROR(RSX, "Unimplemented TEX_SRB instruction: UP4"); break; case RSX_FP_OPCODE_UP4: LOG_ERROR(RSX, "Unimplemented TEX_SRB instruction: UP4"); break;
case RSX_FP_OPCODE_UP16: LOG_ERROR(RSX, "Unimplemented TEX_SRB instruction: UP16"); break; case RSX_FP_OPCODE_UP16: LOG_ERROR(RSX, "Unimplemented TEX_SRB instruction: UP16"); break;

View file

@ -49,7 +49,7 @@ enum
RSX_FP_OPCODE_PKG = 0x2C, // Pack with sRGB transformation RSX_FP_OPCODE_PKG = 0x2C, // Pack with sRGB transformation
RSX_FP_OPCODE_UPG = 0x2D, // Unpack gamma RSX_FP_OPCODE_UPG = 0x2D, // Unpack gamma
RSX_FP_OPCODE_DP2A = 0x2E, // 2-component dot product with scalar addition RSX_FP_OPCODE_DP2A = 0x2E, // 2-component dot product with scalar addition
RSX_FP_OPCODE_TXL = 0x2F, // Texture sample with LOD RSX_FP_OPCODE_TXL = 0x2F, // Texture sample with explicit LOD
RSX_FP_OPCODE_TXB = 0x31, // Texture sample with bias RSX_FP_OPCODE_TXB = 0x31, // Texture sample with bias
RSX_FP_OPCODE_TEXBEM = 0x33, RSX_FP_OPCODE_TEXBEM = 0x33,
RSX_FP_OPCODE_TXPBEM = 0x34, RSX_FP_OPCODE_TXPBEM = 0x34,

View file

@ -82,15 +82,13 @@ void addSaveDataEntry(std::vector<SaveDataEntry>& saveEntries, const std::string
cellSysutil->Error("Running _stat in cellSaveData. Please report this to a RPCS3 developer!"); cellSysutil->Error("Running _stat in cellSaveData. Please report this to a RPCS3 developer!");
std::string pathy; std::string real_path;
Emu.GetVFS().GetDevice("dev_hdd0", pathy);
struct stat buf; struct stat buf;
int result = stat((pathy.substr(0, pathy.length() - 9) + f.GetPath()).c_str(), &buf);
if (result != 0) Emu.GetVFS().GetDevice(f.GetPath(), real_path);
cellSysutil->Error("_stat failed! (%s)", (pathy.substr(0, pathy.length() - 9) + f.GetPath()).c_str());
if (stat(real_path.c_str(), &buf) != 0)
cellSysutil->Error("stat failed! (%s)", real_path.c_str());
else else
{ {
atime = buf.st_atime; atime = buf.st_atime;

View file

@ -251,34 +251,13 @@ s32 cellFsStat(vm::ptr<const char> path, vm::ptr<CellFsStat> sb)
u64 ctime = 0; u64 ctime = 0;
u64 size = 0; u64 size = 0;
int device = -1; std::string real_path;
if (_path.substr(1, 8) == "dev_hdd0")
device = 0;
else if (_path.substr(1, 8) == "dev_hdd1")
device = 1;
else if (_path.substr(1, 8) == "dev_bdvd")
device = 2;
std::string pathy;
if (device == 0)
Emu.GetVFS().GetDevice("dev_hdd0", pathy);
else if (device == 1)
Emu.GetVFS().GetDevice("dev_hdd1", pathy);
else if (device == 2)
Emu.GetVFS().GetDevice("dev_bdvd", pathy);
struct stat buf; struct stat buf;
int result = 1;
if (device == 2) Emu.GetVFS().GetDevice(_path, real_path);
result = stat((pathy + _path.substr(9, _path.length())).c_str(), &buf);
else
result = stat((pathy.substr(0, pathy.length() - 9) + _path).c_str(), &buf);
if (result != 0) if (stat(real_path.c_str(), &buf) != 0)
sys_fs->Error("_stat failed! (%s)", (pathy.substr(0, pathy.length() - 9) + _path).c_str()); sys_fs->Error("stat failed! (%s)", real_path.c_str());
else else
{ {
mode = buf.st_mode; mode = buf.st_mode;

View file

@ -1,4 +1,5 @@
#include "stdafx.h" #include "stdafx.h"
#include "Emu/FS/VFS.h"
#include "Emu/Memory/Memory.h" #include "Emu/Memory/Memory.h"
#include "Emu/System.h" #include "Emu/System.h"
#include "Emu/SysCalls/SysCalls.h" #include "Emu/SysCalls/SysCalls.h"
@ -103,17 +104,11 @@ void sys_game_process_exitspawn(vm::ptr<const char> path, u32 argv_addr, u32 env
Emu.Stop(); Emu.Stop();
}); });
int device = -1; std::string real_path;
if (_path.substr(1, 8) == "dev_hdd0") Emu.GetVFS().GetDevice(_path.c_str(), real_path);
device = 0;
else if (_path.substr(1, 8) == "dev_hdd1")
device = 1;
else if (_path.substr(1, 8) == "dev_bdvd")
device = 2;
if (device != 0) Emu.BootGame(real_path, true);
Emu.BootGame(_path.c_str(), true, device);
return; return;
} }
@ -185,16 +180,11 @@ void sys_game_process_exitspawn2(vm::ptr<const char> path, u32 argv_addr, u32 en
Emu.Stop(); Emu.Stop();
}); });
int device = -1; std::string real_path;
if (_path.substr(1, 8) == "dev_hdd0") Emu.GetVFS().GetDevice(_path.c_str(), real_path);
device = 0;
else if (_path.substr(1, 8) == "dev_hdd1")
device = 1;
else if (_path.substr(1, 8) == "dev_bdvd")
device = 2;
Emu.BootGame(_path.c_str(), true, device); Emu.BootGame(real_path, true);
return; return;
} }

View file

@ -145,7 +145,7 @@ void Emulator::CheckStatus()
} }
} }
bool Emulator::BootGame(const std::string& path, bool direct, int device) bool Emulator::BootGame(const std::string& path, bool direct)
{ {
static const char* elf_path[6] = static const char* elf_path[6] =
{ {
@ -158,33 +158,20 @@ bool Emulator::BootGame(const std::string& path, bool direct, int device)
}; };
auto curpath = path; auto curpath = path;
if (!direct) if (direct)
{ {
for (int i = 0; i < sizeof(elf_path) / sizeof(*elf_path); i++) if (rFile::Access(curpath, rFile::read))
{ {
curpath = path + elf_path[i]; SetPath(curpath);
Load();
if (rFile::Access(curpath, rFile::read)) return true;
{
SetPath(curpath);
Load();
return true;
}
} }
} }
else
for (int i = 0; i < sizeof(elf_path) / sizeof(*elf_path); i++)
{ {
std::string pathy; curpath = path + elf_path[i];
if (device == 0)
Emu.GetVFS().GetDevice("dev_hdd0", pathy);
else if (device == 1)
Emu.GetVFS().GetDevice("dev_hdd1", pathy);
else if (device == 2)
Emu.GetVFS().GetDevice("dev_bdvd", pathy);
curpath = pathy.substr(0, pathy.length() - 9) + path;
if (rFile::Access(curpath, rFile::read)) if (rFile::Access(curpath, rFile::read))
{ {

View file

@ -207,7 +207,7 @@ public:
u32 GetCPUThreadStop() const { return m_cpu_thr_stop; } u32 GetCPUThreadStop() const { return m_cpu_thr_stop; }
void CheckStatus(); void CheckStatus();
bool BootGame(const std::string& path, bool direct = false, int device = 0); bool BootGame(const std::string& path, bool direct = false);
void Load(); void Load();
void Run(); void Run();