This commit is contained in:
Simone
2024-01-19 16:28:57 +01:00
parent b955907e3e
commit 7d54887d63
9 changed files with 95 additions and 188 deletions

View File

@@ -66,62 +66,6 @@ void SetFramerateUnlocked(bool unlocked) {
} }
} }
class SDLWSIPlatform final : public Vulkan::WSIPlatform {
public:
SDLWSIPlatform(SDL_Window* window) : window(window) {}
std::vector<const char *> get_instance_extensions() override {
const char* extensions[64];
unsigned int num_extensions = 64;
if (!SDL_Vulkan_GetInstanceExtensions(window, &num_extensions, extensions)) {
Util::panic("SDL_Vulkan_GetInstanceExtensions failed: {}", SDL_GetError());
}
auto vec = std::vector<const char*>();
for (unsigned int i = 0; i < num_extensions; i++) {
vec.push_back(extensions[i]);
}
return vec;
}
VkSurfaceKHR create_surface(VkInstance instance, VkPhysicalDevice gpu) override {
VkSurfaceKHR vk_surface;
if (!SDL_Vulkan_CreateSurface(window, instance, &vk_surface)) {
Util::panic("Failed to create Vulkan window surface: {}", SDL_GetError());
}
return vk_surface;
}
uint32_t get_surface_width() override {
return 640;
}
uint32_t get_surface_height() override {
return 480;
}
bool alive(Vulkan::WSI &wsi_) override {
return true;
}
void poll_input() override { }
void event_frame_tick(double frame, double elapsed) override { }
const VkApplicationInfo *get_application_info() override {
return &appInfo;
}
VkApplicationInfo appInfo {
.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO,
.apiVersion = VK_API_VERSION_1_1
};
private:
SDL_Window* window;
};
Program* fullscreen_quad_program; Program* fullscreen_quad_program;
WSI* LoadWSIPlatform(Vulkan::InstanceFactory* instanceFactory, std::unique_ptr<Vulkan::WSIPlatform>&& wsi_platform, std::unique_ptr<ParallelRdpWindowInfo>&& newWindowInfo) { WSI* LoadWSIPlatform(Vulkan::InstanceFactory* instanceFactory, std::unique_ptr<Vulkan::WSIPlatform>&& wsi_platform, std::unique_ptr<ParallelRdpWindowInfo>&& newWindowInfo) {

View File

@@ -12,17 +12,6 @@ public:
virtual ~ParallelRdpWindowInfo() = default; virtual ~ParallelRdpWindowInfo() = default;
}; };
class SDLParallelRdpWindowInfo : public ParallelRdpWindowInfo {
SDL_Window* window;
public:
SDLParallelRdpWindowInfo(SDL_Window* window) : window(window) {}
CoordinatePair get_window_size() {
int width, height;
SDL_GetWindowSize(window, &width, &height);
return CoordinatePair{ static_cast<float>(width), static_cast<float>(height) };
}
};
static Vulkan::WSI* wsi; static Vulkan::WSI* wsi;
VkRenderPass GetVkRenderPass(); VkRenderPass GetVkRenderPass();

View File

@@ -17,7 +17,6 @@ u32 PopStalledCycles() {
} }
Core::Core() { Core::Core() {
SDL_Init(SDL_INIT_EVERYTHING);
if(SDL_GameControllerAddMappingsFromFile("resources/gamecontrollerdb.txt") < 0) { if(SDL_GameControllerAddMappingsFromFile("resources/gamecontrollerdb.txt") < 0) {
Util::warn("Failed to load game controller DB"); Util::warn("Failed to load game controller DB");
} }

View File

@@ -186,7 +186,6 @@ void PIF::ProcessCommands(Mem &mem) {
channel++; channel++;
break; break;
case 1: case 1:
UpdateController();
if(!ReadButtons(res)) { if(!ReadButtons(res)) {
cmd[1] |= 0x80; cmd[1] |= 0x80;
} }
@@ -334,12 +333,47 @@ void PIF::EepromWrite(const u8* cmd, u8* res, const Mem& mem) {
} }
} }
void PIF::UpdateController() { void PIF::UpdateController(u32 value) {
//if(Netplay::connected) { bool A = (value >> 31) & 1;
// Util::panic("Netplay!!!"); bool B = (value >> 30) & 1;
//} else { bool Z = (value >> 29) & 1;
PollController(); bool START = (value >> 28) & 1;
//} bool DUP = (value >> 27) & 1;
bool DDOWN = (value >> 26) & 1;
bool DLEFT = (value >> 25) & 1;
bool DRIGHT = (value >> 24) & 1;
bool L = (value >> 21) & 1;
bool R = (value >> 20) & 1;
bool CUP = (value >> 19) & 1;
bool CDOWN = (value >> 18) & 1;
bool CLEFT = (value >> 17) & 1;
bool CRIGHT = (value >> 16) & 1;
s8 x = (s8(value >> 8)) & 0xFF;
s8 y = (s8(value)) & 0xFF;
joybusDevices[channel].controller.a = A;
joybusDevices[channel].controller.b = B;
joybusDevices[channel].controller.z = Z;
joybusDevices[channel].controller.start = START;
joybusDevices[channel].controller.dp_up = DUP;
joybusDevices[channel].controller.dp_down = DDOWN;
joybusDevices[channel].controller.dp_left = DLEFT;
joybusDevices[channel].controller.dp_right = DRIGHT;
joybusDevices[channel].controller.joy_reset = L && R && START;
joybusDevices[channel].controller.l = L;
joybusDevices[channel].controller.r = R;
joybusDevices[channel].controller.c_up = CUP;
joybusDevices[channel].controller.c_down = CDOWN;
joybusDevices[channel].controller.c_left = CLEFT;
joybusDevices[channel].controller.c_right = CRIGHT;
joybusDevices[channel].controller.joy_x = x;
joybusDevices[channel].controller.joy_y = -y;
if (joybusDevices[channel].controller.joy_reset) {
joybusDevices[channel].controller.start = false;
joybusDevices[channel].controller.joy_x = 0;
joybusDevices[channel].controller.joy_y = 0;
}
} }
void PIF::DoPIFHLE(Mem& mem, Registers& regs, bool pal, CICType cicType) { void PIF::DoPIFHLE(Mem& mem, Registers& regs, bool pal, CICType cicType) {

View File

@@ -115,8 +115,7 @@ struct PIF {
void CICChallenge(); void CICChallenge();
static void ExecutePIF(Mem& mem, Registers& regs); static void ExecutePIF(Mem& mem, Registers& regs);
static void DoPIFHLE(Mem& mem, Registers& regs, bool pal, CICType cicType); static void DoPIFHLE(Mem& mem, Registers& regs, bool pal, CICType cicType);
void PollController(); void UpdateController(u32);
void UpdateController();
bool ReadButtons(u8*) const; bool ReadButtons(u8*) const;
void ControllerID(u8*) const; void ControllerID(u8*) const;
void MempakRead(const u8*, u8*); void MempakRead(const u8*, u8*);

View File

@@ -23,110 +23,6 @@ void PIF::InitDevices(SaveType saveType) {
joybusDevices[5].type = JOYBUS_NONE; joybusDevices[5].type = JOYBUS_NONE;
} }
#define GET_BUTTON(gamecontroller, i) SDL_GameControllerGetButton(gamecontroller, i)
#define GET_AXIS(gamecontroller, axis) SDL_GameControllerGetAxis(gamecontroller, axis)
void PIF::PollController() {
if(gamepadConnected) {
bool A = GET_BUTTON(gamepad, SDL_CONTROLLER_BUTTON_A);
bool B = GET_BUTTON(gamepad, SDL_CONTROLLER_BUTTON_X);
bool Z = GET_AXIS(gamepad, SDL_CONTROLLER_AXIS_TRIGGERLEFT) == SDL_JOYSTICK_AXIS_MAX;
bool START = GET_BUTTON(gamepad, SDL_CONTROLLER_BUTTON_START);
bool DUP = GET_BUTTON(gamepad, SDL_CONTROLLER_BUTTON_DPAD_UP);
bool DDOWN = GET_BUTTON(gamepad, SDL_CONTROLLER_BUTTON_DPAD_DOWN);
bool DLEFT = GET_BUTTON(gamepad, SDL_CONTROLLER_BUTTON_DPAD_LEFT);
bool DRIGHT = GET_BUTTON(gamepad, SDL_CONTROLLER_BUTTON_DPAD_RIGHT);
bool L = GET_BUTTON(gamepad, SDL_CONTROLLER_BUTTON_LEFTSHOULDER);
bool R = GET_BUTTON(gamepad, SDL_CONTROLLER_BUTTON_RIGHTSHOULDER);
bool CUP = GET_AXIS(gamepad, SDL_CONTROLLER_AXIS_RIGHTY) <= -127;
bool CDOWN = GET_AXIS(gamepad, SDL_CONTROLLER_AXIS_RIGHTY) >= 127;
bool CLEFT = GET_AXIS(gamepad, SDL_CONTROLLER_AXIS_RIGHTX) <= -127;
bool CRIGHT = GET_AXIS(gamepad, SDL_CONTROLLER_AXIS_RIGHTX) >= 127;
joybusDevices[channel].controller.a = A;
joybusDevices[channel].controller.b = B;
joybusDevices[channel].controller.z = Z;
joybusDevices[channel].controller.start = START;
joybusDevices[channel].controller.dp_up = DUP;
joybusDevices[channel].controller.dp_down = DDOWN;
joybusDevices[channel].controller.dp_left = DLEFT;
joybusDevices[channel].controller.dp_right = DRIGHT;
joybusDevices[channel].controller.joy_reset = L && R && START;
joybusDevices[channel].controller.l = L;
joybusDevices[channel].controller.r = R;
joybusDevices[channel].controller.c_up = CUP;
joybusDevices[channel].controller.c_down = CDOWN;
joybusDevices[channel].controller.c_left = CLEFT;
joybusDevices[channel].controller.c_right = CRIGHT;
float xclamped = GET_AXIS(gamepad, SDL_CONTROLLER_AXIS_LEFTX);
if(xclamped < 0) {
xclamped /= float(std::abs(SDL_JOYSTICK_AXIS_MIN));
} else {
xclamped /= SDL_JOYSTICK_AXIS_MAX;
}
xclamped *= 86;
float yclamped = GET_AXIS(gamepad, SDL_CONTROLLER_AXIS_LEFTY);
if(yclamped < 0) {
yclamped /= float(std::abs(SDL_JOYSTICK_AXIS_MIN));
} else {
yclamped /= SDL_JOYSTICK_AXIS_MAX;
}
yclamped *= 86;
joybusDevices[channel].controller.joy_x = xclamped;
joybusDevices[channel].controller.joy_y = -yclamped;
if (joybusDevices[channel].controller.joy_reset) {
joybusDevices[channel].controller.start = false;
joybusDevices[channel].controller.joy_x = 0;
joybusDevices[channel].controller.joy_y = 0;
}
} else {
const uint8_t* state = SDL_GetKeyboardState(nullptr);
joybusDevices[channel].controller.a = state[SDL_SCANCODE_X];
joybusDevices[channel].controller.b = state[SDL_SCANCODE_C];
joybusDevices[channel].controller.z = state[SDL_SCANCODE_Z];
joybusDevices[channel].controller.start = state[SDL_SCANCODE_RETURN];
joybusDevices[channel].controller.dp_up = state[SDL_SCANCODE_PAGEUP];
joybusDevices[channel].controller.dp_down = state[SDL_SCANCODE_PAGEDOWN];
joybusDevices[channel].controller.dp_left = state[SDL_SCANCODE_HOME];
joybusDevices[channel].controller.dp_right = state[SDL_SCANCODE_END];
joybusDevices[channel].controller.joy_reset = state[SDL_SCANCODE_RETURN] && state[SDL_SCANCODE_A] && state[SDL_SCANCODE_S];
joybusDevices[channel].controller.l = state[SDL_SCANCODE_A];
joybusDevices[channel].controller.r = state[SDL_SCANCODE_S];
joybusDevices[channel].controller.c_up = state[SDL_SCANCODE_I];
joybusDevices[channel].controller.c_down = state[SDL_SCANCODE_K];
joybusDevices[channel].controller.c_left = state[SDL_SCANCODE_J];
joybusDevices[channel].controller.c_right = state[SDL_SCANCODE_L];
s8 xaxis = 0, yaxis = 0;
if (state[SDL_SCANCODE_LEFT]) {
xaxis = -86;
} else if (state[SDL_SCANCODE_RIGHT]) {
xaxis = 86;
}
if (state[SDL_SCANCODE_DOWN]) {
yaxis = -86;
} else if (state[SDL_SCANCODE_UP]) {
yaxis = 86;
}
joybusDevices[channel].controller.joy_x = xaxis;
joybusDevices[channel].controller.joy_y = yaxis;
if (joybusDevices[channel].controller.joy_reset) {
joybusDevices[channel].controller.start = false;
joybusDevices[channel].controller.joy_x = 0;
joybusDevices[channel].controller.joy_y = 0;
}
}
}
void PIF::ControllerID(u8 *res) const { void PIF::ControllerID(u8 *res) const {
if (channel < 6) { if (channel < 6) {
switch (joybusDevices[channel].type) { switch (joybusDevices[channel].type) {
@@ -197,6 +93,8 @@ bool PIF::ReadButtons(u8* res) const {
res[2] = 0x00; res[2] = 0x00;
res[3] = 0x00; res[3] = 0x00;
return false; // Device not present return false; // Device not present
case JOYBUS_4KB_EEPROM:
case JOYBUS_16KB_EEPROM:
case JOYBUS_CONTROLLER: case JOYBUS_CONTROLLER:
if (TasMovieLoaded()) { if (TasMovieLoaded()) {
Controller controller = TasNextInputs(); Controller controller = TasNextInputs();
@@ -216,8 +114,6 @@ bool PIF::ReadButtons(u8* res) const {
case JOYBUS_MOUSE: case JOYBUS_MOUSE:
case JOYBUS_RANDNET_KEYBOARD: case JOYBUS_RANDNET_KEYBOARD:
case JOYBUS_DENSHA_DE_GO: case JOYBUS_DENSHA_DE_GO:
case JOYBUS_4KB_EEPROM:
case JOYBUS_16KB_EEPROM:
return false; return false;
} }

View File

@@ -1,9 +1,11 @@
#include <KaizenQt.hpp> #include <KaizenQt.hpp>
#include <QMessageBox> #include <QMessageBox>
#include <QApplication> #include <QApplication>
#include <QDropEvent>
#include <QMimeData>
#include <SDL2/SDL.h> #include <SDL2/SDL.h>
KaizenQt::KaizenQt() noexcept { KaizenQt::KaizenQt() noexcept : QWidget(nullptr) {
mainWindow = new MainWindowController(); mainWindow = new MainWindowController();
emuThread = new EmuThread( emuThread = new EmuThread(
std::move(mainWindow->view.vulkanWidget->instance), std::move(mainWindow->view.vulkanWidget->instance),
@@ -13,6 +15,11 @@ KaizenQt::KaizenQt() noexcept {
ConnectMainWindowSignalsToSlots(); ConnectMainWindowSignalsToSlots();
grabKeyboard();
setAcceptDrops(true);
setFocusPolicy(Qt::FocusPolicy::StrongFocus);
setFocus();
mainWindow->show(); mainWindow->show();
} }
@@ -26,7 +33,43 @@ void KaizenQt::ConnectMainWindowSignalsToSlots() noexcept {
connect(mainWindow, &MainWindowController::Pause, emuThread, &EmuThread::TogglePause); connect(mainWindow, &MainWindowController::Pause, emuThread, &EmuThread::TogglePause);
} }
void KaizenQt::dragEnterEvent(QDragEnterEvent* event) {
if (event->mimeData()->hasUrls()) {
event->acceptProposedAction();
}
}
void KaizenQt::dropEvent(QDropEvent* event) {
auto path = event->mimeData()->urls()[0].toLocalFile();
LoadROM(path);
}
void KaizenQt::LoadROM(const QString& file_name) noexcept { void KaizenQt::LoadROM(const QString& file_name) noexcept {
emuThread->start(); emuThread->start();
emuThread->core.LoadROM(file_name.toStdString()); emuThread->core.LoadROM(file_name.toStdString());
} }
void KaizenQt::keyPressEvent(QKeyEvent* e) {
u32 data = 0;
emuThread->core.cpu->mem.mmio.si.pif.UpdateController(data);
if (e->key() == Qt::Key::Key_X) data |= (1 << 31);
if (e->key() == Qt::Key::Key_C) data |= (1 << 30);
if (e->key() == Qt::Key::Key_Z) data |= (1 << 29);
if (e->key() == Qt::Key::Key_Enter
|| e->key() == Qt::Key::Key_Return) data |= (1 << 28);
if (e->key() == Qt::Key::Key_I) data |= (1 << 27);
if (e->key() == Qt::Key::Key_K) data |= (1 << 26);
if (e->key() == Qt::Key::Key_J) data |= (1 << 25);
if (e->key() == Qt::Key::Key_L) data |= (1 << 24);
if (e->key() == Qt::Key::Key_A) data |= (1 << 21);
if (e->key() == Qt::Key::Key_S) data |= (1 << 20);
if (e->key() == Qt::Key::Key_8) data |= (1 << 19);
if (e->key() == Qt::Key::Key_2) data |= (1 << 18);
if (e->key() == Qt::Key::Key_4) data |= (1 << 17);
if (e->key() == Qt::Key::Key_6) data |= (1 << 16);
if (e->key() == Qt::Key::Key_Up) data |= 127;
if (e->key() == Qt::Key::Key_Down) data |= -127;
if (e->key() == Qt::Key::Key_Left) data |= u32(-127) << 8;
if (e->key() == Qt::Key::Key_Right) data |= u32(127) << 8;
emuThread->core.cpu->mem.mmio.si.pif.UpdateController(data);
}

View File

@@ -22,11 +22,15 @@ static inline CompositorCategory GetOSCompositorCategory() {
return CompositorCategory::Windows; return CompositorCategory::Windows;
} }
class KaizenQt : public QObject { class KaizenQt : public QWidget {
Q_OBJECT Q_OBJECT
public: public:
KaizenQt() noexcept; KaizenQt() noexcept;
void LoadROM(const QString& path) noexcept; void LoadROM(const QString& path) noexcept;
void dropEvent(QDropEvent*) override;
void dragEnterEvent(QDragEnterEvent*) override;
protected:
void keyPressEvent(QKeyEvent* event) override;
private: private:
void ConnectMainWindowSignalsToSlots() noexcept; void ConnectMainWindowSignalsToSlots() noexcept;
MainWindowController* mainWindow; MainWindowController* mainWindow;

View File

@@ -5,6 +5,7 @@
#include <QWindow> #include <QWindow>
#include <QVulkanInstance> #include <QVulkanInstance>
#include <QVulkanWindow> #include <QVulkanWindow>
#include <EmuThread.hpp>
struct QtInstanceFactory : Vulkan::InstanceFactory { struct QtInstanceFactory : Vulkan::InstanceFactory {
VkInstance create_instance(const VkInstanceCreateInfo *info) override { VkInstance create_instance(const VkInstanceCreateInfo *info) override {
@@ -71,9 +72,7 @@ public:
return true; return true;
} }
void poll_input() override { void poll_input() override {}
SDL_PumpEvents();
}
void event_frame_tick(double frame, double elapsed) override { } void event_frame_tick(double frame, double elapsed) override { }