mirror of https://github.com/snes9xgit/snes9x.git
Fix context resizing and joystick detection.
This commit is contained in:
parent
e42dd27cd1
commit
3f0f246028
|
@ -106,16 +106,11 @@ bool S9xCubebSoundDriver::open_device(int playback_rate, int buffer_size)
|
||||||
uint32_t suggested_latency = playback_rate * buffer_size / 1000;
|
uint32_t suggested_latency = playback_rate * buffer_size / 1000;
|
||||||
uint32_t min_latency;
|
uint32_t min_latency;
|
||||||
cubeb_get_min_latency(context, ¶ms, &min_latency);
|
cubeb_get_min_latency(context, ¶ms, &min_latency);
|
||||||
if (min_latency > suggested_latency)
|
|
||||||
{
|
|
||||||
suggested_latency = min_latency;
|
|
||||||
printf("Requires a minimum latency: %d\n", min_latency);
|
|
||||||
}
|
|
||||||
|
|
||||||
auto retval = cubeb_stream_init(context, &stream, "Snes9x",
|
auto retval = cubeb_stream_init(context, &stream, "Snes9x",
|
||||||
nullptr, nullptr,
|
nullptr, nullptr,
|
||||||
nullptr, ¶ms,
|
nullptr, ¶ms,
|
||||||
suggested_latency,
|
min_latency,
|
||||||
&::data_callback,
|
&::data_callback,
|
||||||
&state_callback,
|
&state_callback,
|
||||||
this);
|
this);
|
||||||
|
@ -127,7 +122,7 @@ bool S9xCubebSoundDriver::open_device(int playback_rate, int buffer_size)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
buffer.resize(suggested_latency * 4);
|
buffer.resize(suggested_latency * 2);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit 197a273fd494321157f40a962c51b5fa8c9c3581
|
Subproject commit 4e2fdb25671c742a9fbe93a6034eb1542244c7e1
|
|
@ -1 +1 @@
|
||||||
Subproject commit 3ebb72cc7429f0ab8218104dc3687c659c0f364d
|
Subproject commit 9c7fd1a33e5cecbe465e1cd70170167d5e40d398
|
|
@ -38,6 +38,12 @@ BindingPanel::~BindingPanel()
|
||||||
|
|
||||||
void BindingPanel::showEvent(QShowEvent *event)
|
void BindingPanel::showEvent(QShowEvent *event)
|
||||||
{
|
{
|
||||||
|
app->joypads_changed_callback = [&]
|
||||||
|
{
|
||||||
|
if (joypads_changed)
|
||||||
|
joypads_changed();
|
||||||
|
};
|
||||||
|
|
||||||
QWidget::showEvent(event);
|
QWidget::showEvent(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -45,6 +51,8 @@ void BindingPanel::hideEvent(QHideEvent *event)
|
||||||
{
|
{
|
||||||
awaiting_binding = false;
|
awaiting_binding = false;
|
||||||
setRedirectInput(false);
|
setRedirectInput(false);
|
||||||
|
app->joypads_changed_callback = nullptr;
|
||||||
|
|
||||||
QWidget::hideEvent(event);
|
QWidget::hideEvent(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -56,16 +64,10 @@ void BindingPanel::setRedirectInput(bool redirect)
|
||||||
{
|
{
|
||||||
finalizeCurrentBinding(b);
|
finalizeCurrentBinding(b);
|
||||||
};
|
};
|
||||||
|
|
||||||
app->joypads_changed_callback = [&] {
|
|
||||||
if (joypads_changed)
|
|
||||||
joypads_changed();
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
app->binding_callback = nullptr;
|
app->binding_callback = nullptr;
|
||||||
app->joypads_changed_callback = nullptr;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -147,6 +147,12 @@ void ControllerPanel::clearAllControllers()
|
||||||
fillTable();
|
fillTable();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ControllerPanel::showEvent(QShowEvent *event)
|
||||||
|
{
|
||||||
|
BindingPanel::showEvent(event);
|
||||||
|
recreateAutoAssignMenu();
|
||||||
|
}
|
||||||
|
|
||||||
ControllerPanel::~ControllerPanel()
|
ControllerPanel::~ControllerPanel()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,6 +11,7 @@ class ControllerPanel :
|
||||||
public:
|
public:
|
||||||
ControllerPanel(EmuApplication *app);
|
ControllerPanel(EmuApplication *app);
|
||||||
~ControllerPanel();
|
~ControllerPanel();
|
||||||
|
void showEvent(QShowEvent *event) override;
|
||||||
void clearAllControllers();
|
void clearAllControllers();
|
||||||
void clearCurrentController();
|
void clearCurrentController();
|
||||||
void autoPopulateWithKeyboard(int slot);
|
void autoPopulateWithKeyboard(int slot);
|
||||||
|
|
|
@ -141,7 +141,7 @@ EmuBinding EmuBinding::from_config_string(std::string string)
|
||||||
{
|
{
|
||||||
return joystick_button(device, button);
|
return joystick_button(device, button);
|
||||||
}
|
}
|
||||||
else if (sscanf(substr.c_str(), "%u hat %u %5s", &device, &axis, direction_string))
|
else if (sscanf(substr.c_str(), "%u hat %u %5s", &device, &axis, direction_string) == 3)
|
||||||
{
|
{
|
||||||
uint8_t direction;
|
uint8_t direction;
|
||||||
if (!strcmp(direction_string, "up"))
|
if (!strcmp(direction_string, "up"))
|
||||||
|
@ -188,7 +188,7 @@ std::string EmuBinding::to_string(bool config)
|
||||||
else if (type == Joystick)
|
else if (type == Joystick)
|
||||||
{
|
{
|
||||||
if (config)
|
if (config)
|
||||||
rep += "joystick " + std::to_string(guid) + " ";
|
rep += "Joystick " + std::to_string(guid) + " ";
|
||||||
else
|
else
|
||||||
rep += "J" + std::to_string(guid) + " ";
|
rep += "J" + std::to_string(guid) + " ";
|
||||||
|
|
||||||
|
@ -201,7 +201,12 @@ std::string EmuBinding::to_string(bool config)
|
||||||
{
|
{
|
||||||
rep += "Axis ";
|
rep += "Axis ";
|
||||||
rep += std::to_string(axis) + " ";
|
rep += std::to_string(axis) + " ";
|
||||||
rep += std::to_string(threshold) + "%";
|
if (threshold >= 0)
|
||||||
|
rep += "+";
|
||||||
|
else if (!config)
|
||||||
|
rep += "-";
|
||||||
|
if (config)
|
||||||
|
rep += std::to_string(threshold) + "%";
|
||||||
}
|
}
|
||||||
if (input_type == Hat)
|
if (input_type == Hat)
|
||||||
{
|
{
|
||||||
|
|
|
@ -323,9 +323,8 @@ void EmuCanvasOpenGL::paintEvent(QPaintEvent *event)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef _WIN32
|
context->resize();
|
||||||
((WGLContext *)context.get())->resize();
|
|
||||||
#endif
|
|
||||||
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
|
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
|
||||||
glClear(GL_COLOR_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
context->swap_buffers();
|
context->swap_buffers();
|
||||||
|
|
|
@ -208,12 +208,12 @@ void EmuCanvasVulkan::resizeEvent(QResizeEvent *event)
|
||||||
std::tie(width, height) = wayland_surface->get_size();
|
std::tie(width, height) = wayland_surface->get_size();
|
||||||
// On Wayland, Vulkan WSI provides the buffer for the subsurface,
|
// On Wayland, Vulkan WSI provides the buffer for the subsurface,
|
||||||
// so we have to specify a width and height instead of polling the parent.
|
// so we have to specify a width and height instead of polling the parent.
|
||||||
context->recreate_swapchain(width, height);
|
context->swapchain->check_and_resize(width, height);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
context->recreate_swapchain(-1, -1);
|
context->swapchain->check_and_resize(event->size().width() * devicePixelRatio(), event->size().height() * devicePixelRatio());
|
||||||
}
|
}
|
||||||
|
|
||||||
void EmuCanvasVulkan::paintEvent(QPaintEvent *event)
|
void EmuCanvasVulkan::paintEvent(QPaintEvent *event)
|
||||||
|
@ -226,7 +226,9 @@ void EmuCanvasVulkan::paintEvent(QPaintEvent *event)
|
||||||
if (output_data.ready)
|
if (output_data.ready)
|
||||||
{
|
{
|
||||||
if (!window->isActivelyDrawing())
|
if (!window->isActivelyDrawing())
|
||||||
|
{
|
||||||
draw();
|
draw();
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -553,10 +553,10 @@ bool EmuMainWindow::eventFilter(QObject *watched, QEvent *event)
|
||||||
{
|
{
|
||||||
if (event->type() == QEvent::Resize)
|
if (event->type() == QEvent::Resize)
|
||||||
{
|
{
|
||||||
app->suspendThread();
|
app->emu_thread->runOnThread([&] {
|
||||||
canvas->resizeEvent((QResizeEvent *)event);
|
canvas->resizeEvent((QResizeEvent *)event);
|
||||||
|
}, true);
|
||||||
event->accept();
|
event->accept();
|
||||||
app->unsuspendThread();
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else if (event->type() == QEvent::Paint)
|
else if (event->type() == QEvent::Paint)
|
||||||
|
|
|
@ -90,6 +90,29 @@ vk::Image Swapchain::get_image()
|
||||||
return imageviewfbs[current_swapchain_image].image;
|
return imageviewfbs[current_swapchain_image].image;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Swapchain::check_and_resize(int width, int height)
|
||||||
|
{
|
||||||
|
vk::SurfaceCapabilitiesKHR surface_capabilities;
|
||||||
|
|
||||||
|
if (width == -1 && height == -1)
|
||||||
|
{
|
||||||
|
surface_capabilities = physical_device.getSurfaceCapabilitiesKHR(surface);
|
||||||
|
width = surface_capabilities.currentExtent.width;
|
||||||
|
height = surface_capabilities.currentExtent.height;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (width < 1 || height < 1)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (extents.width != width || extents.height != height)
|
||||||
|
{
|
||||||
|
recreate(width, height);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
bool Swapchain::create(unsigned int desired_num_swapchain_images, int new_width, int new_height)
|
bool Swapchain::create(unsigned int desired_num_swapchain_images, int new_width, int new_height)
|
||||||
{
|
{
|
||||||
frames.clear();
|
frames.clear();
|
||||||
|
@ -217,7 +240,7 @@ bool Swapchain::begin_frame()
|
||||||
if (result_value.result == vk::Result::eErrorOutOfDateKHR ||
|
if (result_value.result == vk::Result::eErrorOutOfDateKHR ||
|
||||||
result_value.result == vk::Result::eSuboptimalKHR)
|
result_value.result == vk::Result::eSuboptimalKHR)
|
||||||
{
|
{
|
||||||
printf("Out of date\n");
|
// printf("Out of date\n");
|
||||||
recreate();
|
recreate();
|
||||||
return begin_frame();
|
return begin_frame();
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,6 +19,7 @@ class Swapchain
|
||||||
~Swapchain();
|
~Swapchain();
|
||||||
bool create(unsigned int num_frames, int width = -1, int height = -1);
|
bool create(unsigned int num_frames, int width = -1, int height = -1);
|
||||||
bool recreate(int width = -1, int height = -1);
|
bool recreate(int width = -1, int height = -1);
|
||||||
|
bool check_and_resize(int width = -1, int height = -1);
|
||||||
bool begin_frame();
|
bool begin_frame();
|
||||||
void begin_render_pass();
|
void begin_render_pass();
|
||||||
void end_render_pass();
|
void end_render_pass();
|
||||||
|
|
Loading…
Reference in New Issue