mirror of
https://github.com/bsnes-emu/bsnes.git
synced 2025-08-24 01:43:28 +02:00
Update to 20180728 release.
byuu says: Sigh, I seem to be spiraling a bit here ... but the work is very important. Hopefully I can get a solid WIP together soon. But for now... I've integrated dynamic rate control into ruby::Audio via setDynamic(bool) for now. It's very demanding, as you would expect. When it's not in use, I realized the OSS driver's performance was pretty bad due to calling write() for every sample for every channel. I implemented a tiny 256-sample buffer and bsnes went from 290fps to 330fps on my FreeBSD desktop. It may be possible to do the same buffering with DRC, but for now, I'm not doing so, and adjusting the audio input frequency on every sample. I also added ruby::Video::setFlush(bool), which is available only in the OpenGL drivers, and this causes glFinish() to be called after swapping display buffers. I really couldn't think of a good name for this, "hard GPU sync" sounds kind of silly. In my view, flush is what commits queued events. Eg fflush(). OpenGL of course treats glFlush differently (I really don't even know what the point of it is even after reading the manual ...), and then has glFinish ... meh, whatever. It's setFlush(bool) until I come up with something better. Also as expected, this one's a big hit to performance. To implement the DRC, I started putting helper functions into the ruby video/audio/input core classes. And then the XVideo driver started crashing. It took hours and hours and hours to track down the problem: you have to clear XSetWindowAttributes to zero before calling XCreateWindow. No amount of `--sync`, `gdb break gdk_x_error`, `-Og`, etc will make Xlib be even remotely helpful in debugging errors like this. The GLX, GLX2, and XVideo drivers basically worked by chance before. If the stack frame had the right memory cleared, it worked. Otherwise it'd crash with BadValue, and my changing things broke that condition on the XVideo driver. So this has been fixed in all three now. Once XVideo was running again, I realized that non-power of two video sizes were completely broken for the YUV formats. It took a while, but I managed to fix all of that as well. At this point, most of ruby is going to be broken outside of FreeBSD, as I still need to finish updating all the drivers.
This commit is contained in:
@@ -10,29 +10,30 @@ struct InputSDL : Input {
|
||||
InputSDL() : _keyboard(*this), _mouse(*this), _joypad(*this) { initialize(); }
|
||||
~InputSDL() { terminate(); }
|
||||
|
||||
auto ready() -> bool { return _ready; }
|
||||
auto driver() -> string override { return "SDL"; }
|
||||
auto ready() -> bool override { return _ready; }
|
||||
|
||||
auto context() -> uintptr { return _context; }
|
||||
auto hasContext() -> bool override { return true; }
|
||||
|
||||
auto setContext(uintptr context) -> bool {
|
||||
if(_context == context) return true;
|
||||
_context = context;
|
||||
auto setContext(uintptr context) -> bool override {
|
||||
if(context == this->context()) return true;
|
||||
if(!Input::setContext(context)) return false;
|
||||
return initialize();
|
||||
}
|
||||
|
||||
auto acquired() -> bool {
|
||||
auto acquired() -> bool override {
|
||||
return _mouse.acquired();
|
||||
}
|
||||
|
||||
auto acquire() -> bool {
|
||||
auto acquire() -> bool override {
|
||||
return _mouse.acquire();
|
||||
}
|
||||
|
||||
auto release() -> bool {
|
||||
auto release() -> bool override {
|
||||
return _mouse.release();
|
||||
}
|
||||
|
||||
auto poll() -> vector<shared_pointer<HID::Device>> {
|
||||
auto poll() -> vector<shared_pointer<HID::Device>> override {
|
||||
vector<shared_pointer<HID::Device>> devices;
|
||||
_keyboard.poll(devices);
|
||||
_mouse.poll(devices);
|
||||
@@ -40,7 +41,7 @@ struct InputSDL : Input {
|
||||
return devices;
|
||||
}
|
||||
|
||||
auto rumble(uint64_t id, bool enable) -> bool {
|
||||
auto rumble(uint64_t id, bool enable) -> bool override {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -62,7 +63,6 @@ private:
|
||||
}
|
||||
|
||||
bool _ready = false;
|
||||
uintptr _context = 0;
|
||||
|
||||
InputKeyboardXlib _keyboard;
|
||||
InputMouseXlib _mouse;
|
||||
|
@@ -11,36 +11,37 @@ struct InputXlib : Input {
|
||||
InputXlib() : _keyboard(*this), _mouse(*this) { initialize(); }
|
||||
~InputXlib() { terminate(); }
|
||||
|
||||
auto ready() -> bool { return _ready; }
|
||||
auto driver() -> string override { return "Xlib"; }
|
||||
auto ready() -> bool override { return _ready; }
|
||||
|
||||
auto context() -> uintptr { return _context; }
|
||||
auto hasContext() -> bool override { return true; }
|
||||
|
||||
auto setContext(uintptr context) -> bool {
|
||||
if(_context == context) return true;
|
||||
_context = context;
|
||||
auto setContext(uintptr context) -> bool override {
|
||||
if(context == this->context()) return true;
|
||||
if(!Input::setContext(context)) return false;
|
||||
return initialize();
|
||||
}
|
||||
|
||||
auto acquired() -> bool {
|
||||
auto acquired() -> bool override {
|
||||
return _mouse.acquired();
|
||||
}
|
||||
|
||||
auto acquire() -> bool {
|
||||
auto acquire() -> bool override {
|
||||
return _mouse.acquire();
|
||||
}
|
||||
|
||||
auto release() -> bool {
|
||||
auto release() -> bool override {
|
||||
return _mouse.release();
|
||||
}
|
||||
|
||||
auto poll() -> vector<shared_pointer<HID::Device>> {
|
||||
auto poll() -> vector<shared_pointer<HID::Device>> override {
|
||||
vector<shared_pointer<HID::Device>> devices;
|
||||
_keyboard.poll(devices);
|
||||
_mouse.poll(devices);
|
||||
return devices;
|
||||
}
|
||||
|
||||
auto rumble(uint64_t id, bool enable) -> bool {
|
||||
auto rumble(uint64_t id, bool enable) -> bool override {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -60,7 +61,6 @@ private:
|
||||
}
|
||||
|
||||
bool _ready = false;
|
||||
uintptr _context = 0;
|
||||
|
||||
InputKeyboardXlib _keyboard;
|
||||
InputMouseXlib _mouse;
|
||||
|
Reference in New Issue
Block a user