mirror of
https://github.com/bsnes-emu/bsnes.git
synced 2025-01-17 20:58:28 +01:00
434e303ffb
byuu says: Changelog: - ruby/video: cleaned up Direct3D9 driver and fixed catastrophic memory leak - ruby/video: added fullscreen exclusive mode support to the Direct3D9 driver¹ - ruby/video: minor cosmetic code cleanups to various drivers - tomoko: added support to always allow input when in fullscreen exclusive mode - tomoko: fixed window to not remove resizability flag when exiting fullscreen mode ¹: I am assuming that exclusive mode will try to capture the primary monitor. I don't know what will happen in multi-monitor setups, however, as I don't use such a setup here. Also, I am using `D3DPRESENT_DISCARD` instead of `D3DPRESENT_FLIP`. I'm not sure if this will prove better or worse, but I've heard it will waste less memory, and having a BackBufferCount of 1 should still result in page flipping anyway. The difference is supposedly just that you can't rely on the back buffer being a valid copy of the previous frame like you can with FLIP. Lastly, if you want Vsync, you can edit the configuration file to enable that, and then turn off audio sync. Errata: "pause emulation when focus is lost" is not working with exclusive mode. I need to add a check to never auto-pause when in exclusive mode. Thanks to bun for catching that one.
110 lines
3.8 KiB
C++
110 lines
3.8 KiB
C++
#pragma once
|
|
|
|
/* ruby
|
|
* author: byuu
|
|
* license: ISC
|
|
* version: 0.16 (2017-07-08)
|
|
*
|
|
* ruby is a cross-platform hardware abstraction layer.
|
|
* it provides a common interface to video, audio and input devices.
|
|
*/
|
|
|
|
#include <nall/nall.hpp>
|
|
|
|
namespace ruby {
|
|
|
|
struct Video {
|
|
static const nall::string Exclusive;
|
|
static const nall::string Handle;
|
|
static const nall::string Synchronize;
|
|
static const nall::string Depth;
|
|
static const nall::string Filter;
|
|
static const nall::string Shader;
|
|
|
|
static const uint FilterNearest;
|
|
static const uint FilterLinear;
|
|
|
|
static auto create(const nall::string& driver = "") -> Video*;
|
|
static auto optimalDriver() -> nall::string;
|
|
static auto safestDriver() -> nall::string;
|
|
static auto availableDrivers() -> nall::string_vector;
|
|
|
|
virtual ~Video() = default;
|
|
|
|
virtual auto cap(const nall::string& name) -> bool { return false; }
|
|
virtual auto get(const nall::string& name) -> nall::any { return false; }
|
|
virtual auto set(const nall::string& name, const nall::any& value) -> bool { return false; }
|
|
|
|
virtual auto lock(uint32_t*& data, uint& pitch, uint width, uint height) -> bool { return false; }
|
|
virtual auto unlock() -> void {}
|
|
virtual auto clear() -> void {}
|
|
virtual auto refresh() -> void {}
|
|
|
|
virtual auto init() -> bool { return true; }
|
|
virtual auto term() -> void {}
|
|
};
|
|
|
|
struct Audio {
|
|
static const nall::string Device;
|
|
static const nall::string Exclusive;
|
|
static const nall::string Handle;
|
|
static const nall::string Synchronize;
|
|
static const nall::string Frequency;
|
|
static const nall::string Latency;
|
|
|
|
static auto create(const nall::string& driver = "") -> Audio*;
|
|
static auto optimalDriver() -> nall::string;
|
|
static auto safestDriver() -> nall::string;
|
|
static auto availableDrivers() -> nall::string_vector;
|
|
|
|
virtual ~Audio() = default;
|
|
|
|
virtual auto cap(const nall::string& name) -> bool { return false; }
|
|
virtual auto get(const nall::string& name) -> nall::any { return false; }
|
|
virtual auto set(const nall::string& name, const nall::any& value) -> bool { return false; }
|
|
|
|
virtual auto sample(int16_t left, int16_t right) -> void {}
|
|
virtual auto clear() -> void {}
|
|
|
|
virtual auto init() -> bool { return true; }
|
|
virtual auto term() -> void {}
|
|
};
|
|
|
|
struct Input {
|
|
static const nall::string Handle;
|
|
static const nall::string KeyboardSupport;
|
|
static const nall::string MouseSupport;
|
|
static const nall::string JoypadSupport;
|
|
static const nall::string JoypadRumbleSupport;
|
|
|
|
static auto create(const nall::string& driver = "") -> Input*;
|
|
static auto optimalDriver() -> nall::string;
|
|
static auto safestDriver() -> nall::string;
|
|
static auto availableDrivers() -> nall::string_vector;
|
|
|
|
virtual ~Input() = default;
|
|
|
|
virtual auto cap(const nall::string& name) -> bool { return false; }
|
|
virtual auto get(const nall::string& name) -> nall::any { return false; }
|
|
virtual auto set(const nall::string& name, const nall::any& value) -> bool { return false; }
|
|
|
|
virtual auto acquire() -> bool { return false; }
|
|
virtual auto release() -> bool { return false; }
|
|
virtual auto acquired() -> bool { return false; }
|
|
virtual auto poll() -> nall::vector<nall::shared_pointer<nall::HID::Device>> { return {}; }
|
|
virtual auto rumble(uint64_t id, bool enable) -> bool { return false; }
|
|
|
|
virtual auto init() -> bool { return true; }
|
|
virtual auto term() -> void {}
|
|
|
|
auto onChange(const nall::function<void (nall::shared_pointer<nall::HID::Device>, uint, uint, int16_t, int16_t)>& callback) { _onChange = callback; }
|
|
auto doChange(nall::shared_pointer<nall::HID::Device> device, uint group, uint input, int16_t oldValue, int16_t newValue) -> void {
|
|
if(_onChange) _onChange(device, group, input, oldValue, newValue);
|
|
}
|
|
|
|
private:
|
|
nall::function<void (nall::shared_pointer<nall::HID::Device> device, uint group, uint input, int16_t oldValue, int16_t newValue)> _onChange;
|
|
};
|
|
|
|
}
|