Skip to content

Instantly share code, notes, and snippets.

@Subv
Created January 14, 2015 05:03
Show Gist options
  • Save Subv/0451d24cd54241493c82 to your computer and use it in GitHub Desktop.
Save Subv/0451d24cd54241493c82 to your computer and use it in GitHub Desktop.
diff --git a/externals/boost b/externals/boost
--- a/externals/boost
+++ b/externals/boost
@@ -1 +1 @@
-Subproject commit a1afc91d3aaa3da06bdbc13c78613e1466653405
+Subproject commit a1afc91d3aaa3da06bdbc13c78613e1466653405-dirty
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt
index 9aabd7e..c06cfd0 100644
--- a/src/core/CMakeLists.txt
+++ b/src/core/CMakeLists.txt
@@ -37,10 +37,13 @@ set(SRCS
hle/service/act_u.cpp
hle/service/am_app.cpp
hle/service/am_net.cpp
+ hle/service/am_sys.cpp
hle/service/apt_a.cpp
hle/service/apt_s.cpp
hle/service/apt_u.cpp
+ hle/service/boss_p.cpp
hle/service/boss_u.cpp
+ hle/service/cecd_s.cpp
hle/service/cecd_u.cpp
hle/service/cfg/cfg.cpp
hle/service/cfg/cfg_i.cpp
@@ -49,19 +52,24 @@ set(SRCS
hle/service/csnd_snd.cpp
hle/service/dsp_dsp.cpp
hle/service/err_f.cpp
+ hle/service/frd_a.cpp
hle/service/frd_u.cpp
hle/service/fs/archive.cpp
hle/service/fs/fs_user.cpp
hle/service/gsp_gpu.cpp
+ hle/service/gsp_lcd.cpp
hle/service/hid_user.cpp
+ hle/service/hid_spvr.cpp
hle/service/http_c.cpp
hle/service/ir_rst.cpp
hle/service/ir_u.cpp
hle/service/ldr_ro.cpp
hle/service/mic_u.cpp
hle/service/ndm_u.cpp
+ hle/service/news_s.cpp
hle/service/news_u.cpp
hle/service/nim_aoc.cpp
+ hle/service/ns_s.cpp
hle/service/nwm_uds.cpp
hle/service/pm_app.cpp
hle/service/ptm_u.cpp
@@ -133,10 +141,13 @@ set(HEADERS
hle/service/act_u.h
hle/service/am_app.h
hle/service/am_net.h
+ hle/service/am_sys.h
hle/service/apt_a.h
hle/service/apt_s.h
hle/service/apt_u.h
+ hle/service/boss_p.h
hle/service/boss_u.h
+ hle/service/cecd_s.h
hle/service/cecd_u.h
hle/service/cfg/cfg.h
hle/service/cfg/cfg_i.h
@@ -145,19 +156,24 @@ set(HEADERS
hle/service/csnd_snd.h
hle/service/dsp_dsp.h
hle/service/err_f.h
+ hle/service/frd_a.h
hle/service/frd_u.h
hle/service/fs/archive.h
hle/service/fs/fs_user.h
hle/service/gsp_gpu.h
+ hle/service/gsp_lcd.h
hle/service/hid_user.h
+ hle/service/hid_spvr.h
hle/service/http_c.h
hle/service/ir_rst.h
hle/service/ir_u.h
hle/service/ldr_ro.h
hle/service/mic_u.h
hle/service/ndm_u.h
+ hle/service/news_s.h
hle/service/news_u.h
hle/service/nim_aoc.h
+ hle/service/ns_s.h
hle/service/nwm_uds.h
hle/service/pm_app.h
hle/service/ptm_u.h
diff --git a/src/core/hle/kernel/event.cpp b/src/core/hle/kernel/event.cpp
index 271190d..da2ecb1 100644
--- a/src/core/hle/kernel/event.cpp
+++ b/src/core/hle/kernel/event.cpp
@@ -90,7 +90,7 @@ ResultCode SignalEvent(const Handle handle) {
for (size_t i = 0; i < evt->waiting_threads.size(); ++i) {
Thread* thread = Kernel::g_handle_table.Get<Thread>(evt->waiting_threads[i]).get();
if (thread != nullptr)
- thread->ResumeFromWait();
+ thread->ResumeFromWait(evt);
// If any thread is signalled awake by this event, assume the event was "caught" and reset
// the event. This will result in the next thread waiting on the event to block. Otherwise,
diff --git a/src/core/hle/kernel/mutex.cpp b/src/core/hle/kernel/mutex.cpp
index 853a5dd..e0e77e3 100644
--- a/src/core/hle/kernel/mutex.cpp
+++ b/src/core/hle/kernel/mutex.cpp
@@ -54,7 +54,7 @@ bool ReleaseMutexForThread(Mutex* mutex, Handle thread_handle) {
return false;
}
- thread->ResumeFromWait();
+ thread->ResumeFromWait(mutex);
return true;
}
diff --git a/src/core/hle/kernel/semaphore.cpp b/src/core/hle/kernel/semaphore.cpp
index 88ec9a1..762ad97 100644
--- a/src/core/hle/kernel/semaphore.cpp
+++ b/src/core/hle/kernel/semaphore.cpp
@@ -86,7 +86,7 @@ ResultCode ReleaseSemaphore(s32* count, Handle handle, s32 release_count) {
while (!semaphore->waiting_threads.empty() && semaphore->IsAvailable()) {
Thread* thread = Kernel::g_handle_table.Get<Thread>(semaphore->waiting_threads.front()).get();
if (thread != nullptr)
- thread->ResumeFromWait();
+ thread->ResumeFromWait(semaphore);
semaphore->waiting_threads.pop();
--semaphore->available_count;
}
diff --git a/src/core/hle/kernel/thread.cpp b/src/core/hle/kernel/thread.cpp
index bc86a7c..f6ecc2a 100644
--- a/src/core/hle/kernel/thread.cpp
+++ b/src/core/hle/kernel/thread.cpp
@@ -68,7 +68,8 @@ static void ResetThread(Thread* t, u32 arg, s32 lowest_priority) {
t->current_priority = t->initial_priority;
}
t->wait_type = WAITTYPE_NONE;
- t->wait_object = nullptr;
+ t->wait_object.clear();
+ t->object_wait_pos.clear();
t->wait_address = 0;
}
@@ -95,7 +96,7 @@ static bool CheckWaitType(const Thread* thread, WaitType type) {
/// Check if a thread is blocking on a specified wait type with a specified handle
static bool CheckWaitType(const Thread* thread, WaitType type, Object* wait_object) {
- return CheckWaitType(thread, type) && wait_object == thread->wait_object;
+ return CheckWaitType(thread, type) && thread->wait_object.find(wait_object) != thread->wait_object.end();
}
/// Check if a thread is blocking on a specified wait type with a specified handle and address
@@ -112,13 +113,14 @@ void Thread::Stop(const char* reason) {
status = THREADSTATUS_DORMANT;
for (auto& waiting_thread : waiting_threads) {
if (CheckWaitType(waiting_thread.get(), WAITTYPE_THREADEND, this))
- waiting_thread->ResumeFromWait();
+ waiting_thread->ResumeFromWait(this);
}
waiting_threads.clear();
// Stopped threads are never waiting.
wait_type = WAITTYPE_NONE;
- wait_object = nullptr;
+ wait_object.clear();
+ object_wait_pos.clear();
wait_address = 0;
}
@@ -158,7 +160,7 @@ Thread* ArbitrateHighestPriorityThread(Object* arbiter, u32 address) {
// If a thread was arbitrated, resume it
if (nullptr != highest_priority_thread) {
- highest_priority_thread->ResumeFromWait();
+ highest_priority_thread->ResumeFromWait(arbiter);
}
return highest_priority_thread;
@@ -170,7 +172,7 @@ void ArbitrateAllThreads(Object* arbiter, u32 address) {
// Iterate through threads, find highest priority thread that is waiting to be arbitrated...
for (auto& thread : thread_list) {
if (CheckWaitType(thread.get(), WAITTYPE_ARB, arbiter, address))
- thread->ResumeFromWait();
+ thread->ResumeFromWait(arbiter);
}
}
@@ -226,7 +228,7 @@ static Thread* NextThread() {
void WaitCurrentThread(WaitType wait_type, Object* wait_object) {
Thread* thread = GetCurrentThread();
thread->wait_type = wait_type;
- thread->wait_object = wait_object;
+ thread->wait_object.insert(wait_object);
ChangeThreadState(thread, ThreadStatus(THREADSTATUS_WAIT | (thread->status & THREADSTATUS_SUSPEND)));
}
@@ -247,7 +249,7 @@ static void ThreadWakeupCallback(u64 parameter, int cycles_late) {
return;
}
- thread->ResumeFromWait();
+ thread->ResumeFromWait(nullptr);
}
@@ -262,13 +264,23 @@ void WakeThreadAfterDelay(Thread* thread, s64 nanoseconds) {
}
/// Resumes a thread from waiting by marking it as "ready"
-void Thread::ResumeFromWait() {
+void Thread::ResumeFromWait(Kernel::Object* object) {
+
+ if (wait_type == WAITTYPE_SYNCHN_ALL && !wait_object.empty())
+ return;
+
// Cancel any outstanding wakeup events
CoreTiming::UnscheduleEvent(ThreadWakeupEventType, GetHandle());
+ if (wait_type == WAITTYPE_SYNCHN)
+ context.cpu_registers[1] = object_wait_pos[object];
+ else if (wait_type == WAITTYPE_SYNCHN_ALL)
+ context.cpu_registers[1] = object_wait_pos.size();
+
status &= ~THREADSTATUS_WAIT;
- wait_object = nullptr;
wait_type = WAITTYPE_NONE;
+ wait_object.clear();
+ object_wait_pos.clear();
if (!(status & (THREADSTATUS_WAITSUSPEND | THREADSTATUS_DORMANT | THREADSTATUS_DEAD))) {
ChangeReadyState(this, true);
}
@@ -335,7 +347,7 @@ ResultVal<SharedPtr<Thread>> Thread::Create(std::string name, VAddr entry_point,
thread->initial_priority = thread->current_priority = priority;
thread->processor_id = processor_id;
thread->wait_type = WAITTYPE_NONE;
- thread->wait_object = nullptr;
+ thread->wait_object.clear();
thread->wait_address = 0;
thread->name = std::move(name);
@@ -418,11 +430,11 @@ void Reschedule() {
} else {
LOG_TRACE(Kernel, "cannot context switch from 0x%08X, no higher priority thread!", prev->GetHandle());
- for (auto& thread : thread_list) {
+ /*for (auto& thread : thread_list) {
LOG_TRACE(Kernel, "\thandle=0x%08X prio=0x%02X, status=0x%08X wait_type=0x%08X wait_handle=0x%08X",
thread->GetHandle(), thread->current_priority, thread->status, thread->wait_type,
(thread->wait_object ? thread->wait_object->GetHandle() : INVALID_HANDLE));
- }
+ }*/
}
}
diff --git a/src/core/hle/kernel/thread.h b/src/core/hle/kernel/thread.h
index 284dec4..0c689e8 100644
--- a/src/core/hle/kernel/thread.h
+++ b/src/core/hle/kernel/thread.h
@@ -6,6 +6,8 @@
#include <string>
#include <vector>
+#include <set>
+#include <unordered_map>
#include "common/common_types.h"
@@ -46,6 +48,8 @@ enum WaitType {
WAITTYPE_THREADEND,
WAITTYPE_MUTEX,
WAITTYPE_SYNCH,
+ WAITTYPE_SYNCHN,
+ WAITTYPE_SYNCHN_ALL,
WAITTYPE_ARB,
WAITTYPE_TIMER,
};
@@ -79,7 +83,7 @@ public:
void Stop(const char* reason);
/// Resumes a thread from waiting by marking it as "ready".
- void ResumeFromWait();
+ void ResumeFromWait(Kernel::Object* object);
Core::ThreadContext context;
@@ -96,7 +100,8 @@ public:
s32 processor_id;
WaitType wait_type;
- Object* wait_object;
+ std::set<Object*> wait_object;
+ std::unordered_map<Object*, int> object_wait_pos;
VAddr wait_address;
std::vector<SharedPtr<Thread>> waiting_threads;
diff --git a/src/core/hle/kernel/timer.cpp b/src/core/hle/kernel/timer.cpp
index 3b0452d..d184795 100644
--- a/src/core/hle/kernel/timer.cpp
+++ b/src/core/hle/kernel/timer.cpp
@@ -94,7 +94,7 @@ static void TimerCallback(u64 timer_handle, int cycles_late) {
// Resume all waiting threads
for (Handle thread_handle : timer->waiting_threads) {
if (SharedPtr<Thread> thread = Kernel::g_handle_table.Get<Thread>(thread_handle))
- thread->ResumeFromWait();
+ thread->ResumeFromWait(timer.get());
}
timer->waiting_threads.clear();
diff --git a/src/core/hle/service/apt_s.cpp b/src/core/hle/service/apt_s.cpp
index f4599e1..0f2395b 100644
--- a/src/core/hle/service/apt_s.cpp
+++ b/src/core/hle/service/apt_s.cpp
@@ -24,10 +24,17 @@ namespace APT_U {
extern void AppletUtility(Service::Interface* self);
extern void GlanceParameter(Service::Interface* self);
extern void ReceiveParameter(Service::Interface* self);
+ extern void NotifyToWait(Service::Interface* self);
+ extern void IsRegistered(Service::Interface* self);
}
namespace APT_S {
+void ReplySleepQuery(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+ cmd_buff[1] = 0;
+}
+
const Interface::FunctionInfo FunctionTable[] = {
{0x00010040, APT_U::GetLockHandle, "GetLockHandle"},
{0x00020080, APT_U::Initialize, "Initialize"},
@@ -37,7 +44,7 @@ const Interface::FunctionInfo FunctionTable[] = {
{0x00060040, nullptr, "GetAppletInfo"},
{0x00070000, nullptr, "GetLastSignaledAppletId"},
{0x00080000, nullptr, "CountRegisteredApplet"},
- {0x00090040, nullptr, "IsRegistered"},
+ {0x00090040, APT_U::IsRegistered, "IsRegistered"},
{0x000A0040, nullptr, "GetAttribute"},
{0x000B0040, APT_U::InquireNotification, "InquireNotification"},
{0x000C0104, nullptr, "SendParameter"},
@@ -90,12 +97,12 @@ const Interface::FunctionInfo FunctionTable[] = {
{0x003B0040, nullptr, "CancelLibraryApplet"},
{0x003C0042, nullptr, "SendDspSleep"},
{0x003D0042, nullptr, "SendDspWakeUp"},
- {0x003E0080, nullptr, "ReplySleepQuery"},
+ {0x003E0080, ReplySleepQuery, "ReplySleepQuery"},
{0x003F0040, nullptr, "ReplySleepNotificationComplete"},
{0x00400042, nullptr, "SendCaptureBufferInfo"},
{0x00410040, nullptr, "ReceiveCaptureBufferInfo"},
{0x00420080, nullptr, "SleepSystem"},
- {0x00430040, nullptr, "NotifyToWait"},
+ {0x00430040, APT_U::NotifyToWait, "NotifyToWait"},
{0x00440000, APT_U::GetSharedFont, "GetSharedFont"},
{0x00450040, nullptr, "GetWirelessRebootInfo"},
{0x00460104, nullptr, "Wrap"},
diff --git a/src/core/hle/service/apt_u.cpp b/src/core/hle/service/apt_u.cpp
index 9729b10..199b795 100644
--- a/src/core/hle/service/apt_u.cpp
+++ b/src/core/hle/service/apt_u.cpp
@@ -224,6 +224,12 @@ void GetSharedFont(Service::Interface* self) {
}
}
+void IsRegistered(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+ cmd_buff[1] = 0;
+ cmd_buff[2] = 1;
+}
+
const Interface::FunctionInfo FunctionTable[] = {
{0x00010040, GetLockHandle, "GetLockHandle"},
{0x00020080, Initialize, "Initialize"},
@@ -233,7 +239,7 @@ const Interface::FunctionInfo FunctionTable[] = {
{0x00060040, nullptr, "GetAppletInfo"},
{0x00070000, nullptr, "GetLastSignaledAppletId"},
{0x00080000, nullptr, "CountRegisteredApplet"},
- {0x00090040, nullptr, "IsRegistered"},
+ {0x00090040, IsRegistered, "IsRegistered"},
{0x000A0040, nullptr, "GetAttribute"},
{0x000B0040, InquireNotification, "InquireNotification"},
{0x000C0104, nullptr, "SendParameter"},
diff --git a/src/core/hle/service/cfg/cfg_s.cpp b/src/core/hle/service/cfg/cfg_s.cpp
index cf4e821..d38e524 100644
--- a/src/core/hle/service/cfg/cfg_s.cpp
+++ b/src/core/hle/service/cfg/cfg_s.cpp
@@ -74,9 +74,15 @@ static void UpdateConfigNANDSavegame(Service::Interface* self) {
cmd_buffer[1] = Service::CFG::UpdateConfigNANDSavegame().raw;
}
+static void SecureInfoGetRegion(Service::Interface* self) {
+ u32* cmd_buffer = Kernel::GetCommandBuffer();
+ cmd_buffer[1] = 0;
+ cmd_buffer[2] = 1;
+}
+
const Interface::FunctionInfo FunctionTable[] = {
{0x00010082, GetConfigInfoBlk2, "GetConfigInfoBlk2"},
- {0x00020000, nullptr, "SecureInfoGetRegion"},
+ {0x00020000, SecureInfoGetRegion, "SecureInfoGetRegion"},
{0x04010082, GetConfigInfoBlk8, "GetConfigInfoBlk8"},
{0x04020082, nullptr, "SetConfigInfoBlk4"},
{0x04030000, UpdateConfigNANDSavegame, "UpdateConfigNANDSavegame"},
diff --git a/src/core/hle/service/ptm_sysm.cpp b/src/core/hle/service/ptm_sysm.cpp
index 4b5f86a..5abde9b 100644
--- a/src/core/hle/service/ptm_sysm.cpp
+++ b/src/core/hle/service/ptm_sysm.cpp
@@ -13,6 +13,11 @@
namespace PTM_SYSM {
+void GetShellStatus(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+ cmd_buff[1] = 0;
+}
+
const Interface::FunctionInfo FunctionTable[] = {
{0x040100C0, nullptr, "SetRtcAlarmEx"},
{0x04020042, nullptr, "ReplySleepQuery"},
@@ -40,7 +45,7 @@ const Interface::FunctionInfo FunctionTable[] = {
{0x080E0140, nullptr, "NotifyPlayEvent"},
{0x080F0000, nullptr, "IsLegacyPowerOff"},
{0x08100000, nullptr, "ClearLegacyPowerOff"},
- {0x08110000, nullptr, "GetShellStatus"},
+ {0x08110000, GetShellStatus, "GetShellStatus"},
{0x08120000, nullptr, "IsShutdownByBatteryEmpty"},
{0x08130000, nullptr, "FormatSavedata"},
{0x08140000, nullptr, "GetLegacyJumpProhibitedFlag"}
diff --git a/src/core/hle/svc.cpp b/src/core/hle/svc.cpp
index 5c6a3be..9e2651b 100644
--- a/src/core/hle/svc.cpp
+++ b/src/core/hle/svc.cpp
@@ -164,18 +164,27 @@ static Result WaitSynchronizationN(s32* out, Handle* handles, s32 handle_count,
bool wait = wait_result.Succeeded() && *wait_result;
if (!wait && !wait_all) {
+ Kernel::GetCurrentThread()->wait_object.clear();
+ Kernel::GetCurrentThread()->object_wait_pos.clear();
+ Kernel::GetCurrentThread()->wait_type = WAITTYPE_NONE;
*out = i;
return RESULT_SUCCESS.raw;
} else {
+ Kernel::GetCurrentThread()->object_wait_pos[object.get()] = i;
unlock_all = false;
}
}
if (wait_all && unlock_all) {
*out = handle_count;
+ Kernel::GetCurrentThread()->wait_object.clear();
+ Kernel::GetCurrentThread()->object_wait_pos.clear();
+ Kernel::GetCurrentThread()->wait_type = WAITTYPE_NONE;
return RESULT_SUCCESS.raw;
}
+ Kernel::GetCurrentThread()->wait_type = wait_all ? WAITTYPE_SYNCHN_ALL : WAITTYPE_SYNCHN;
+
// Check for next thread to schedule
HLE::Reschedule(__func__);
diff --git a/src/core/hw/gpu.cpp b/src/core/hw/gpu.cpp
index 3b730a0..e176b02 100644
--- a/src/core/hw/gpu.cpp
+++ b/src/core/hw/gpu.cpp
@@ -114,7 +114,7 @@ inline void Write(u32 addr, const T data) {
}
default:
- LOG_ERROR(HW_GPU, "Unknown source framebuffer format %x", config.input_format.Value());
+ //LOG_ERROR(HW_GPU, "Unknown source framebuffer format %x", config.input_format.Value());
break;
}
@@ -141,7 +141,7 @@ inline void Write(u32 addr, const T data) {
}
default:
- LOG_ERROR(HW_GPU, "Unknown destination framebuffer format %x", config.output_format.Value());
+ //LOG_ERROR(HW_GPU, "Unknown destination framebuffer format %x", config.output_format.Value());
break;
}
}
diff --git a/src/video_core/rasterizer.cpp b/src/video_core/rasterizer.cpp
index 025d4e4..440d9c2 100644
--- a/src/video_core/rasterizer.cpp
+++ b/src/video_core/rasterizer.cpp
@@ -231,8 +231,8 @@ void ProcessTriangle(const VertexShader::OutputVertex& v0,
return (int)(((unsigned)val) % size);
default:
- LOG_ERROR(HW_GPU, "Unknown texture coordinate wrapping mode %x\n", (int)mode);
- _dbg_assert_(HW_GPU, 0);
+ //LOG_ERROR(HW_GPU, "Unknown texture coordinate wrapping mode %x\n", (int)mode);
+ //_dbg_assert_(HW_GPU, 0);
return 0;
}
};
@@ -281,8 +281,8 @@ void ProcessTriangle(const VertexShader::OutputVertex& v0,
return combiner_output;
default:
- LOG_ERROR(HW_GPU, "Unknown color combiner source %d\n", (int)source);
- _dbg_assert_(HW_GPU, 0);
+ //LOG_ERROR(HW_GPU, "Unknown color combiner source %d\n", (int)source);
+ //_dbg_assert_(HW_GPU, 0);
return {};
}
};
@@ -308,8 +308,8 @@ void ProcessTriangle(const VertexShader::OutputVertex& v0,
return combiner_output.a();
default:
- LOG_ERROR(HW_GPU, "Unknown alpha combiner source %d\n", (int)source);
- _dbg_assert_(HW_GPU, 0);
+ //LOG_ERROR(HW_GPU, "Unknown alpha combiner source %d\n", (int)source);
+ //_dbg_assert_(HW_GPU, 0);
return 0;
}
};
@@ -327,8 +327,8 @@ void ProcessTriangle(const VertexShader::OutputVertex& v0,
return { values.a(), values.a(), values.a() };
default:
- LOG_ERROR(HW_GPU, "Unknown color factor %d\n", (int)factor);
- _dbg_assert_(HW_GPU, 0);
+ //LOG_ERROR(HW_GPU, "Unknown color factor %d\n", (int)factor);
+ //_dbg_assert_(HW_GPU, 0);
return {};
}
};
@@ -342,8 +342,8 @@ void ProcessTriangle(const VertexShader::OutputVertex& v0,
return 255 - value;
default:
- LOG_ERROR(HW_GPU, "Unknown alpha factor %d\n", (int)factor);
- _dbg_assert_(HW_GPU, 0);
+ //LOG_ERROR(HW_GPU, "Unknown alpha factor %d\n", (int)factor);
+ //_dbg_assert_(HW_GPU, 0);
return 0;
}
};
@@ -378,8 +378,8 @@ void ProcessTriangle(const VertexShader::OutputVertex& v0,
}
default:
- LOG_ERROR(HW_GPU, "Unknown color combiner operation %d\n", (int)op);
- _dbg_assert_(HW_GPU, 0);
+ //LOG_ERROR(HW_GPU, "Unknown color combiner operation %d\n", (int)op);
+ //_dbg_assert_(HW_GPU, 0);
return {};
}
};
@@ -402,8 +402,8 @@ void ProcessTriangle(const VertexShader::OutputVertex& v0,
return std::max(0, (int)input[0] - (int)input[1]);
default:
- LOG_ERROR(HW_GPU, "Unknown alpha combiner operation %d\n", (int)op);
- _dbg_assert_(HW_GPU, 0);
+ //LOG_ERROR(HW_GPU, "Unknown alpha combiner operation %d\n", (int)op);
+ //_dbg_assert_(HW_GPU, 0);
return 0;
}
};
diff --git a/src/video_core/renderer_opengl/renderer_opengl.cpp b/src/video_core/renderer_opengl/renderer_opengl.cpp
index 29d220e..a30871e 100644
--- a/src/video_core/renderer_opengl/renderer_opengl.cpp
+++ b/src/video_core/renderer_opengl/renderer_opengl.cpp
@@ -214,6 +214,7 @@ void RendererOpenGL::DrawScreens() {
DrawSingleScreenRotated(textures[0], top_x, 0,
(float)VideoCore::kScreenTopWidth, (float)VideoCore::kScreenTopHeight);
+ glFlush();
DrawSingleScreenRotated(textures[1], bottom_x, (float)VideoCore::kScreenTopHeight,
(float)VideoCore::kScreenBottomWidth, (float)VideoCore::kScreenBottomHeight);
diff --git a/src/video_core/vertex_shader.cpp b/src/video_core/vertex_shader.cpp
index 4897738..603d2d4 100644
--- a/src/video_core/vertex_shader.cpp
+++ b/src/video_core/vertex_shader.cpp
@@ -340,9 +340,9 @@ static void ProcessShaderCode(VertexShaderState& state) {
break;
default:
- LOG_ERROR(HW_GPU, "Unhandled arithmetic instruction: 0x%02x (%s): 0x%08x",
+ /*LOG_ERROR(HW_GPU, "Unhandled arithmetic instruction: 0x%02x (%s): 0x%08x",
(int)instr.opcode.Value(), instr.opcode.GetInfo().name, instr.hex);
- _dbg_assert_(HW_GPU, 0);
+ _dbg_assert_(HW_GPU, 0);*/
break;
}
@@ -519,8 +519,8 @@ static void ProcessShaderCode(VertexShaderState& state) {
}
default:
- LOG_ERROR(HW_GPU, "Unhandled instruction: 0x%02x (%s): 0x%08x",
- (int)instr.opcode.Value(), instr.opcode.GetInfo().name, instr.hex);
+ /*LOG_ERROR(HW_GPU, "Unhandled instruction: 0x%02x (%s): 0x%08x",
+ (int)instr.opcode.Value(), instr.opcode.GetInfo().name, instr.hex);*/
break;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment