commit
6e43562496
|
@ -100,89 +100,34 @@ void XEmitter::ABI_CallFunction(const void *func)
|
||||||
void XEmitter::ABI_CallFunctionC16(const void *func, u16 param1)
|
void XEmitter::ABI_CallFunctionC16(const void *func, u16 param1)
|
||||||
{
|
{
|
||||||
MOV(32, R(ABI_PARAM1), Imm32((u32)param1));
|
MOV(32, R(ABI_PARAM1), Imm32((u32)param1));
|
||||||
u64 distance = u64(func) - (u64(code) + 5);
|
ABI_CallFunction(func);
|
||||||
if (distance >= 0x0000000080000000ULL &&
|
|
||||||
distance < 0xFFFFFFFF80000000ULL)
|
|
||||||
{
|
|
||||||
// Far call
|
|
||||||
MOV(64, R(RAX), Imm64((u64)func));
|
|
||||||
CALLptr(R(RAX));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
CALL(func);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void XEmitter::ABI_CallFunctionCC16(const void *func, u32 param1, u16 param2)
|
void XEmitter::ABI_CallFunctionCC16(const void *func, u32 param1, u16 param2)
|
||||||
{
|
{
|
||||||
MOV(32, R(ABI_PARAM1), Imm32(param1));
|
MOV(32, R(ABI_PARAM1), Imm32(param1));
|
||||||
MOV(32, R(ABI_PARAM2), Imm32((u32)param2));
|
MOV(32, R(ABI_PARAM2), Imm32((u32)param2));
|
||||||
u64 distance = u64(func) - (u64(code) + 5);
|
ABI_CallFunction(func);
|
||||||
if (distance >= 0x0000000080000000ULL &&
|
|
||||||
distance < 0xFFFFFFFF80000000ULL)
|
|
||||||
{
|
|
||||||
// Far call
|
|
||||||
MOV(64, R(RAX), Imm64((u64)func));
|
|
||||||
CALLptr(R(RAX));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
CALL(func);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void XEmitter::ABI_CallFunctionC(const void *func, u32 param1)
|
void XEmitter::ABI_CallFunctionC(const void *func, u32 param1)
|
||||||
{
|
{
|
||||||
MOV(32, R(ABI_PARAM1), Imm32(param1));
|
MOV(32, R(ABI_PARAM1), Imm32(param1));
|
||||||
u64 distance = u64(func) - (u64(code) + 5);
|
ABI_CallFunction(func);
|
||||||
if (distance >= 0x0000000080000000ULL &&
|
|
||||||
distance < 0xFFFFFFFF80000000ULL)
|
|
||||||
{
|
|
||||||
// Far call
|
|
||||||
MOV(64, R(RAX), Imm64((u64)func));
|
|
||||||
CALLptr(R(RAX));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
CALL(func);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void XEmitter::ABI_CallFunctionCC(const void *func, u32 param1, u32 param2)
|
void XEmitter::ABI_CallFunctionCC(const void *func, u32 param1, u32 param2)
|
||||||
{
|
{
|
||||||
MOV(32, R(ABI_PARAM1), Imm32(param1));
|
MOV(32, R(ABI_PARAM1), Imm32(param1));
|
||||||
MOV(32, R(ABI_PARAM2), Imm32(param2));
|
MOV(32, R(ABI_PARAM2), Imm32(param2));
|
||||||
u64 distance = u64(func) - (u64(code) + 5);
|
ABI_CallFunction(func);
|
||||||
if (distance >= 0x0000000080000000ULL &&
|
|
||||||
distance < 0xFFFFFFFF80000000ULL)
|
|
||||||
{
|
|
||||||
// Far call
|
|
||||||
MOV(64, R(RAX), Imm64((u64)func));
|
|
||||||
CALLptr(R(RAX));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
CALL(func);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void XEmitter::ABI_CallFunctionCP(const void *func, u32 param1, void *param2)
|
void XEmitter::ABI_CallFunctionCP(const void *func, u32 param1, void *param2)
|
||||||
{
|
{
|
||||||
MOV(32, R(ABI_PARAM1), Imm32(param1));
|
MOV(32, R(ABI_PARAM1), Imm32(param1));
|
||||||
MOV(64, R(ABI_PARAM2), Imm64((u64)param2));
|
MOV(64, R(ABI_PARAM2), Imm64((u64)param2));
|
||||||
u64 distance = u64(func) - (u64(code) + 5);
|
ABI_CallFunction(func);
|
||||||
if (distance >= 0x0000000080000000ULL &&
|
|
||||||
distance < 0xFFFFFFFF80000000ULL)
|
|
||||||
{
|
|
||||||
// Far call
|
|
||||||
MOV(64, R(RAX), Imm64((u64)func));
|
|
||||||
CALLptr(R(RAX));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
CALL(func);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void XEmitter::ABI_CallFunctionCCC(const void *func, u32 param1, u32 param2, u32 param3)
|
void XEmitter::ABI_CallFunctionCCC(const void *func, u32 param1, u32 param2, u32 param3)
|
||||||
|
@ -190,18 +135,7 @@ void XEmitter::ABI_CallFunctionCCC(const void *func, u32 param1, u32 param2, u32
|
||||||
MOV(32, R(ABI_PARAM1), Imm32(param1));
|
MOV(32, R(ABI_PARAM1), Imm32(param1));
|
||||||
MOV(32, R(ABI_PARAM2), Imm32(param2));
|
MOV(32, R(ABI_PARAM2), Imm32(param2));
|
||||||
MOV(32, R(ABI_PARAM3), Imm32(param3));
|
MOV(32, R(ABI_PARAM3), Imm32(param3));
|
||||||
u64 distance = u64(func) - (u64(code) + 5);
|
ABI_CallFunction(func);
|
||||||
if (distance >= 0x0000000080000000ULL &&
|
|
||||||
distance < 0xFFFFFFFF80000000ULL)
|
|
||||||
{
|
|
||||||
// Far call
|
|
||||||
MOV(64, R(RAX), Imm64((u64)func));
|
|
||||||
CALLptr(R(RAX));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
CALL(func);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void XEmitter::ABI_CallFunctionCCP(const void *func, u32 param1, u32 param2, void *param3)
|
void XEmitter::ABI_CallFunctionCCP(const void *func, u32 param1, u32 param2, void *param3)
|
||||||
|
@ -209,18 +143,7 @@ void XEmitter::ABI_CallFunctionCCP(const void *func, u32 param1, u32 param2, voi
|
||||||
MOV(32, R(ABI_PARAM1), Imm32(param1));
|
MOV(32, R(ABI_PARAM1), Imm32(param1));
|
||||||
MOV(32, R(ABI_PARAM2), Imm32(param2));
|
MOV(32, R(ABI_PARAM2), Imm32(param2));
|
||||||
MOV(64, R(ABI_PARAM3), Imm64((u64)param3));
|
MOV(64, R(ABI_PARAM3), Imm64((u64)param3));
|
||||||
u64 distance = u64(func) - (u64(code) + 5);
|
ABI_CallFunction(func);
|
||||||
if (distance >= 0x0000000080000000ULL &&
|
|
||||||
distance < 0xFFFFFFFF80000000ULL)
|
|
||||||
{
|
|
||||||
// Far call
|
|
||||||
MOV(64, R(RAX), Imm64((u64)func));
|
|
||||||
CALLptr(R(RAX));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
CALL(func);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void XEmitter::ABI_CallFunctionCCCP(const void *func, u32 param1, u32 param2, u32 param3, void *param4)
|
void XEmitter::ABI_CallFunctionCCCP(const void *func, u32 param1, u32 param2, u32 param3, void *param4)
|
||||||
|
@ -229,36 +152,14 @@ void XEmitter::ABI_CallFunctionCCCP(const void *func, u32 param1, u32 param2, u3
|
||||||
MOV(32, R(ABI_PARAM2), Imm32(param2));
|
MOV(32, R(ABI_PARAM2), Imm32(param2));
|
||||||
MOV(32, R(ABI_PARAM3), Imm32(param3));
|
MOV(32, R(ABI_PARAM3), Imm32(param3));
|
||||||
MOV(64, R(ABI_PARAM4), Imm64((u64)param4));
|
MOV(64, R(ABI_PARAM4), Imm64((u64)param4));
|
||||||
u64 distance = u64(func) - (u64(code) + 5);
|
ABI_CallFunction(func);
|
||||||
if (distance >= 0x0000000080000000ULL &&
|
|
||||||
distance < 0xFFFFFFFF80000000ULL)
|
|
||||||
{
|
|
||||||
// Far call
|
|
||||||
MOV(64, R(RAX), Imm64((u64)func));
|
|
||||||
CALLptr(R(RAX));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
CALL(func);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void XEmitter::ABI_CallFunctionPC(const void *func, void *param1, u32 param2)
|
void XEmitter::ABI_CallFunctionPC(const void *func, void *param1, u32 param2)
|
||||||
{
|
{
|
||||||
MOV(64, R(ABI_PARAM1), Imm64((u64)param1));
|
MOV(64, R(ABI_PARAM1), Imm64((u64)param1));
|
||||||
MOV(32, R(ABI_PARAM2), Imm32(param2));
|
MOV(32, R(ABI_PARAM2), Imm32(param2));
|
||||||
u64 distance = u64(func) - (u64(code) + 5);
|
ABI_CallFunction(func);
|
||||||
if (distance >= 0x0000000080000000ULL &&
|
|
||||||
distance < 0xFFFFFFFF80000000ULL)
|
|
||||||
{
|
|
||||||
// Far call
|
|
||||||
MOV(64, R(RAX), Imm64((u64)func));
|
|
||||||
CALLptr(R(RAX));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
CALL(func);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void XEmitter::ABI_CallFunctionPPC(const void *func, void *param1, void *param2, u32 param3)
|
void XEmitter::ABI_CallFunctionPPC(const void *func, void *param1, void *param2, u32 param3)
|
||||||
|
@ -266,18 +167,7 @@ void XEmitter::ABI_CallFunctionPPC(const void *func, void *param1, void *param2,
|
||||||
MOV(64, R(ABI_PARAM1), Imm64((u64)param1));
|
MOV(64, R(ABI_PARAM1), Imm64((u64)param1));
|
||||||
MOV(64, R(ABI_PARAM2), Imm64((u64)param2));
|
MOV(64, R(ABI_PARAM2), Imm64((u64)param2));
|
||||||
MOV(32, R(ABI_PARAM3), Imm32(param3));
|
MOV(32, R(ABI_PARAM3), Imm32(param3));
|
||||||
u64 distance = u64(func) - (u64(code) + 5);
|
ABI_CallFunction(func);
|
||||||
if (distance >= 0x0000000080000000ULL &&
|
|
||||||
distance < 0xFFFFFFFF80000000ULL)
|
|
||||||
{
|
|
||||||
// Far call
|
|
||||||
MOV(64, R(RAX), Imm64((u64)func));
|
|
||||||
CALLptr(R(RAX));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
CALL(func);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pass a register as a parameter.
|
// Pass a register as a parameter.
|
||||||
|
@ -285,36 +175,14 @@ void XEmitter::ABI_CallFunctionR(const void *func, X64Reg reg1)
|
||||||
{
|
{
|
||||||
if (reg1 != ABI_PARAM1)
|
if (reg1 != ABI_PARAM1)
|
||||||
MOV(32, R(ABI_PARAM1), R(reg1));
|
MOV(32, R(ABI_PARAM1), R(reg1));
|
||||||
u64 distance = u64(func) - (u64(code) + 5);
|
ABI_CallFunction(func);
|
||||||
if (distance >= 0x0000000080000000ULL &&
|
|
||||||
distance < 0xFFFFFFFF80000000ULL)
|
|
||||||
{
|
|
||||||
// Far call
|
|
||||||
MOV(64, R(RAX), Imm64((u64)func));
|
|
||||||
CALLptr(R(RAX));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
CALL(func);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pass two registers as parameters.
|
// Pass two registers as parameters.
|
||||||
void XEmitter::ABI_CallFunctionRR(const void *func, X64Reg reg1, X64Reg reg2)
|
void XEmitter::ABI_CallFunctionRR(const void *func, X64Reg reg1, X64Reg reg2)
|
||||||
{
|
{
|
||||||
MOVTwo(64, ABI_PARAM1, reg1, ABI_PARAM2, reg2);
|
MOVTwo(64, ABI_PARAM1, reg1, ABI_PARAM2, reg2);
|
||||||
u64 distance = u64(func) - (u64(code) + 5);
|
ABI_CallFunction(func);
|
||||||
if (distance >= 0x0000000080000000ULL &&
|
|
||||||
distance < 0xFFFFFFFF80000000ULL)
|
|
||||||
{
|
|
||||||
// Far call
|
|
||||||
MOV(64, R(RAX), Imm64((u64)func));
|
|
||||||
CALLptr(R(RAX));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
CALL(func);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void XEmitter::MOVTwo(int bits, Gen::X64Reg dst1, Gen::X64Reg src1, Gen::X64Reg dst2, Gen::X64Reg src2)
|
void XEmitter::MOVTwo(int bits, Gen::X64Reg dst1, Gen::X64Reg src1, Gen::X64Reg dst2, Gen::X64Reg src2)
|
||||||
|
@ -344,35 +212,13 @@ void XEmitter::ABI_CallFunctionAC(const void *func, const Gen::OpArg &arg1, u32
|
||||||
if (!arg1.IsSimpleReg(ABI_PARAM1))
|
if (!arg1.IsSimpleReg(ABI_PARAM1))
|
||||||
MOV(32, R(ABI_PARAM1), arg1);
|
MOV(32, R(ABI_PARAM1), arg1);
|
||||||
MOV(32, R(ABI_PARAM2), Imm32(param2));
|
MOV(32, R(ABI_PARAM2), Imm32(param2));
|
||||||
u64 distance = u64(func) - (u64(code) + 5);
|
ABI_CallFunction(func);
|
||||||
if (distance >= 0x0000000080000000ULL &&
|
|
||||||
distance < 0xFFFFFFFF80000000ULL)
|
|
||||||
{
|
|
||||||
// Far call
|
|
||||||
MOV(64, R(RAX), Imm64((u64)func));
|
|
||||||
CALLptr(R(RAX));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
CALL(func);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void XEmitter::ABI_CallFunctionA(const void *func, const Gen::OpArg &arg1)
|
void XEmitter::ABI_CallFunctionA(const void *func, const Gen::OpArg &arg1)
|
||||||
{
|
{
|
||||||
if (!arg1.IsSimpleReg(ABI_PARAM1))
|
if (!arg1.IsSimpleReg(ABI_PARAM1))
|
||||||
MOV(32, R(ABI_PARAM1), arg1);
|
MOV(32, R(ABI_PARAM1), arg1);
|
||||||
u64 distance = u64(func) - (u64(code) + 5);
|
ABI_CallFunction(func);
|
||||||
if (distance >= 0x0000000080000000ULL &&
|
|
||||||
distance < 0xFFFFFFFF80000000ULL)
|
|
||||||
{
|
|
||||||
// Far call
|
|
||||||
MOV(64, R(RAX), Imm64((u64)func));
|
|
||||||
CALLptr(R(RAX));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
CALL(func);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -83,7 +83,6 @@ void Jit64AsmRoutineManager::Generate()
|
||||||
|
|
||||||
dispatcherNoCheck = GetCodePtr();
|
dispatcherNoCheck = GetCodePtr();
|
||||||
MOV(32, R(RSCRATCH), PPCSTATE(pc));
|
MOV(32, R(RSCRATCH), PPCSTATE(pc));
|
||||||
dispatcherPcInRSCRATCH = GetCodePtr();
|
|
||||||
|
|
||||||
u32 mask = 0;
|
u32 mask = 0;
|
||||||
FixupBranch no_mem;
|
FixupBranch no_mem;
|
||||||
|
|
|
@ -20,9 +20,7 @@ public:
|
||||||
const u8 *dispatcherMispredictedBLR;
|
const u8 *dispatcherMispredictedBLR;
|
||||||
const u8 *dispatcher;
|
const u8 *dispatcher;
|
||||||
const u8 *dispatcherNoCheck;
|
const u8 *dispatcherNoCheck;
|
||||||
const u8 *dispatcherPcInRSCRATCH;
|
|
||||||
|
|
||||||
const u8 *dispatchPcInRSCRATCH;
|
|
||||||
const u8 *doTiming;
|
const u8 *doTiming;
|
||||||
|
|
||||||
const u8 *frsqrte;
|
const u8 *frsqrte;
|
||||||
|
|
|
@ -55,10 +55,10 @@ void Host_Message(int Id)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void* windowHandle;
|
static void* s_window_handle;
|
||||||
void* Host_GetRenderHandle()
|
void* Host_GetRenderHandle()
|
||||||
{
|
{
|
||||||
return windowHandle;
|
return s_window_handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Host_UpdateTitle(const std::string& title)
|
void Host_UpdateTitle(const std::string& title)
|
||||||
|
@ -157,7 +157,7 @@ class PlatformX11 : public Platform
|
||||||
XSetWMProtocols(dpy, win, wmProtocols, 1);
|
XSetWMProtocols(dpy, win, wmProtocols, 1);
|
||||||
XMapRaised(dpy, win);
|
XMapRaised(dpy, win);
|
||||||
XFlush(dpy);
|
XFlush(dpy);
|
||||||
windowHandle = (void *) win;
|
s_window_handle = (void*) win;
|
||||||
|
|
||||||
if (SConfig::GetInstance().m_LocalCoreStartupParameter.bDisableScreenSaver)
|
if (SConfig::GetInstance().m_LocalCoreStartupParameter.bDisableScreenSaver)
|
||||||
X11Utils::InhibitScreensaver(dpy, win, true);
|
X11Utils::InhibitScreensaver(dpy, win, true);
|
||||||
|
|
|
@ -51,7 +51,7 @@ static BITMAPINFOHEADER s_bitmap;
|
||||||
// so we have to save a frame and always be behind
|
// so we have to save a frame and always be behind
|
||||||
static void* s_stored_frame = nullptr;
|
static void* s_stored_frame = nullptr;
|
||||||
static u64 s_stored_frame_size = 0;
|
static u64 s_stored_frame_size = 0;
|
||||||
bool b_start_dumping = false;
|
static bool s_start_dumping = false;
|
||||||
|
|
||||||
bool AVIDump::Start(HWND hWnd, int w, int h)
|
bool AVIDump::Start(HWND hWnd, int w, int h)
|
||||||
{
|
{
|
||||||
|
@ -171,7 +171,7 @@ void AVIDump::Stop()
|
||||||
// store one copy of the last video frame, CFR case
|
// store one copy of the last video frame, CFR case
|
||||||
if (s_stream_compressed)
|
if (s_stream_compressed)
|
||||||
AVIStreamWrite(s_stream_compressed, s_frame_count++, 1, GetFrame(), s_bitmap.biSizeImage, AVIIF_KEYFRAME, nullptr, &s_byte_buffer);
|
AVIStreamWrite(s_stream_compressed, s_frame_count++, 1, GetFrame(), s_bitmap.biSizeImage, AVIIF_KEYFRAME, nullptr, &s_byte_buffer);
|
||||||
b_start_dumping = false;
|
s_start_dumping = false;
|
||||||
CloseFile();
|
CloseFile();
|
||||||
s_file_count = 0;
|
s_file_count = 0;
|
||||||
NOTICE_LOG(VIDEO, "Stop");
|
NOTICE_LOG(VIDEO, "Stop");
|
||||||
|
@ -228,10 +228,10 @@ void AVIDump::AddFrame(const u8* data, int w, int h)
|
||||||
u64 one_cfr = SystemTimers::GetTicksPerSecond() / VideoInterface::TargetRefreshRate;
|
u64 one_cfr = SystemTimers::GetTicksPerSecond() / VideoInterface::TargetRefreshRate;
|
||||||
int nplay = 0;
|
int nplay = 0;
|
||||||
s64 delta;
|
s64 delta;
|
||||||
if (!b_start_dumping && s_last_frame <= SystemTimers::GetTicksPerSecond())
|
if (!s_start_dumping && s_last_frame <= SystemTimers::GetTicksPerSecond())
|
||||||
{
|
{
|
||||||
delta = CoreTiming::GetTicks();
|
delta = CoreTiming::GetTicks();
|
||||||
b_start_dumping = true;
|
s_start_dumping = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -334,7 +334,7 @@ static int s_width;
|
||||||
static int s_height;
|
static int s_height;
|
||||||
static int s_size;
|
static int s_size;
|
||||||
static u64 s_last_frame;
|
static u64 s_last_frame;
|
||||||
bool b_start_dumping = false;
|
static bool s_start_dumping = false;
|
||||||
static u64 s_last_pts;
|
static u64 s_last_pts;
|
||||||
|
|
||||||
static void InitAVCodec()
|
static void InitAVCodec()
|
||||||
|
@ -446,11 +446,11 @@ void AVIDump::AddFrame(const u8* data, int width, int height)
|
||||||
int error = 0;
|
int error = 0;
|
||||||
u64 delta;
|
u64 delta;
|
||||||
s64 last_pts;
|
s64 last_pts;
|
||||||
if (!b_start_dumping && s_last_frame <= SystemTimers::GetTicksPerSecond())
|
if (!s_start_dumping && s_last_frame <= SystemTimers::GetTicksPerSecond())
|
||||||
{
|
{
|
||||||
delta = CoreTiming::GetTicks();
|
delta = CoreTiming::GetTicks();
|
||||||
last_pts = AV_NOPTS_VALUE;
|
last_pts = AV_NOPTS_VALUE;
|
||||||
b_start_dumping = true;
|
s_start_dumping = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue