tell parallel-n64 to use glide64 when using the SDL_GL component
This commit is contained in:
parent
2b3409318b
commit
f954fe9ffb
|
@ -41,6 +41,8 @@ pub fn main() {
|
||||||
|
|
||||||
let mut sdl_context = sdl2::init().unwrap();
|
let mut sdl_context = sdl2::init().unwrap();
|
||||||
|
|
||||||
|
emu.register_component(StderrLogComponent { prefix: "{log} ".to_string() });
|
||||||
|
|
||||||
//let sdl2_canvas = SimpleSdl2CanvasComponent::new(&mut sdl_context, emu.libretro_core());
|
//let sdl2_canvas = SimpleSdl2CanvasComponent::new(&mut sdl_context, emu.libretro_core());
|
||||||
let sdl2_canvas = SimpleSdl2OpenglComponent::new(&mut sdl_context, emu.libretro_core()).unwrap();
|
let sdl2_canvas = SimpleSdl2OpenglComponent::new(&mut sdl_context, emu.libretro_core()).unwrap();
|
||||||
emu.register_component(sdl2_canvas);
|
emu.register_component(sdl2_canvas);
|
||||||
|
@ -53,7 +55,6 @@ pub fn main() {
|
||||||
let sleep_fps = SleepFramerateLimitComponent::new(emu.libretro_core());
|
let sleep_fps = SleepFramerateLimitComponent::new(emu.libretro_core());
|
||||||
emu.register_component(sleep_fps);
|
emu.register_component(sleep_fps);
|
||||||
|
|
||||||
emu.register_component(StderrLogComponent::default());
|
|
||||||
emu.register_component(PathBufComponent {
|
emu.register_component(PathBufComponent {
|
||||||
sys_path: opt.system.clone(),
|
sys_path: opt.system.clone(),
|
||||||
libretro_path: Some(opt.core.to_path_buf()),
|
libretro_path: Some(opt.core.to_path_buf()),
|
||||||
|
|
|
@ -6,5 +6,5 @@ pub mod prelude {
|
||||||
pub use ferretro_base::retro::constants::*;
|
pub use ferretro_base::retro::constants::*;
|
||||||
pub use ferretro_base::retro::wrapped_types::*;
|
pub use ferretro_base::retro::wrapped_types::*;
|
||||||
pub use ferretro_base::retro::wrapper::{RetroCallbacks, LibretroWrapper, LibretroWrapperAccess};
|
pub use ferretro_base::retro::wrapper::{RetroCallbacks, LibretroWrapper, LibretroWrapperAccess};
|
||||||
pub use ferretro_base::retro::ffi::{PixelFormat, GameGeometry, HwContextResetFn, HwRenderCallback, SystemAvInfo, SystemInfo};
|
pub use ferretro_base::retro::ffi::{PixelFormat, GameGeometry, HwContextResetFn, HwRenderCallback, SystemAvInfo, SystemInfo, MemoryMap};
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,7 @@ impl SimpleSdl2CanvasComponent {
|
||||||
pub fn new(sdl_context: &mut Sdl, retro: &LibretroWrapper) -> Self {
|
pub fn new(sdl_context: &mut Sdl, retro: &LibretroWrapper) -> Self {
|
||||||
let sys_info = retro.get_system_info();
|
let sys_info = retro.get_system_info();
|
||||||
let title = format!(
|
let title = format!(
|
||||||
"{} - ferretro",
|
"{} - ferretro SDL",
|
||||||
unsafe { CStr::from_ptr(sys_info.library_name) }.to_string_lossy()
|
unsafe { CStr::from_ptr(sys_info.library_name) }.to_string_lossy()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ use crate::prelude::*;
|
||||||
use std::ffi::CStr;
|
use std::ffi::CStr;
|
||||||
use std::os::raw::c_uint;
|
use std::os::raw::c_uint;
|
||||||
|
|
||||||
use sdl2::Sdl;
|
use sdl2::{Sdl, VideoSubsystem};
|
||||||
use sdl2::video::{GLContext, Window};
|
use sdl2::video::{GLContext, Window};
|
||||||
|
|
||||||
pub struct SimpleSdl2OpenglComponent {
|
pub struct SimpleSdl2OpenglComponent {
|
||||||
|
@ -20,7 +20,7 @@ impl SimpleSdl2OpenglComponent {
|
||||||
pub fn new(sdl_context: &mut Sdl, retro: &LibretroWrapper) -> Result<Self, Box<dyn std::error::Error>> {
|
pub fn new(sdl_context: &mut Sdl, retro: &LibretroWrapper) -> Result<Self, Box<dyn std::error::Error>> {
|
||||||
let sys_info = retro.get_system_info();
|
let sys_info = retro.get_system_info();
|
||||||
let title = format!(
|
let title = format!(
|
||||||
"{} - ferretro",
|
"{} - ferretro SDL GL",
|
||||||
unsafe { CStr::from_ptr(sys_info.library_name) }.to_string_lossy()
|
unsafe { CStr::from_ptr(sys_info.library_name) }.to_string_lossy()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -36,15 +36,7 @@ impl SimpleSdl2OpenglComponent {
|
||||||
// http://forums.libsdl.org/viewtopic.php?p=43353
|
// http://forums.libsdl.org/viewtopic.php?p=43353
|
||||||
// likely to remain `0` on any platform that isn't iOS, but we'll do it anyhow
|
// likely to remain `0` on any platform that isn't iOS, but we'll do it anyhow
|
||||||
let gl_context = window.gl_create_context()?;
|
let gl_context = window.gl_create_context()?;
|
||||||
let mut window_fbo: c_uint = 0;
|
let window_fbo = Self::current_framebuffer_binding(&video);
|
||||||
unsafe {
|
|
||||||
const GL_FRAMEBUFFER_BINDING: c_uint = 0x8CA6;
|
|
||||||
#[allow(non_snake_case)]
|
|
||||||
let glGetIntegerv: unsafe extern "C" fn(c_uint, *mut c_uint) = std::mem::transmute(
|
|
||||||
video.gl_get_proc_address("glGetIntegerv")
|
|
||||||
);
|
|
||||||
glGetIntegerv(GL_FRAMEBUFFER_BINDING, &mut window_fbo);
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(SimpleSdl2OpenglComponent {
|
Ok(SimpleSdl2OpenglComponent {
|
||||||
window,
|
window,
|
||||||
|
@ -55,6 +47,28 @@ impl SimpleSdl2OpenglComponent {
|
||||||
hw_context_destroy_fn: None,
|
hw_context_destroy_fn: None,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn current_framebuffer_binding(video: &VideoSubsystem) -> c_uint {
|
||||||
|
let mut fbo: c_uint = 0;
|
||||||
|
unsafe {
|
||||||
|
const GL_FRAMEBUFFER_BINDING: c_uint = 0x8CA6;
|
||||||
|
#[allow(non_snake_case)]
|
||||||
|
let glGetIntegerv: unsafe extern "C" fn(c_uint, *mut c_uint) = std::mem::transmute(
|
||||||
|
video.gl_get_proc_address("glGetIntegerv")
|
||||||
|
);
|
||||||
|
glGetIntegerv(GL_FRAMEBUFFER_BINDING, &mut fbo);
|
||||||
|
}
|
||||||
|
eprintln!("get_framebuffer_binding: {}", fbo);
|
||||||
|
fbo
|
||||||
|
}
|
||||||
|
|
||||||
|
fn call_context_reset(&self) -> Option<()> {
|
||||||
|
self.hw_context_reset_fn.map(|f| unsafe { f(); })
|
||||||
|
}
|
||||||
|
|
||||||
|
fn call_context_destroy(&self) -> Option<()> {
|
||||||
|
self.hw_context_destroy_fn.map(|f| unsafe { f(); })
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl RetroCallbacks for SimpleSdl2OpenglComponent {
|
impl RetroCallbacks for SimpleSdl2OpenglComponent {
|
||||||
|
@ -71,23 +85,31 @@ impl RetroCallbacks for SimpleSdl2OpenglComponent {
|
||||||
self.hw_context_reset_fn.replace(hw_render_callback.context_reset);
|
self.hw_context_reset_fn.replace(hw_render_callback.context_reset);
|
||||||
self.hw_context_destroy_fn.replace(hw_render_callback.context_destroy);
|
self.hw_context_destroy_fn.replace(hw_render_callback.context_destroy);
|
||||||
|
|
||||||
self.hw_context_reset_fn.map(|f| unsafe { f() });
|
self.call_context_reset();
|
||||||
|
|
||||||
Some(true)
|
Some(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
fn get_variable(&mut self, key: &str) -> Option<String> {
|
||||||
|
match key {
|
||||||
|
"parallel-n64-gfxplugin" => Some("glide64".to_string()),
|
||||||
|
_ => None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn set_system_av_info(&mut self, av_info: &SystemAvInfo) -> Option<bool> {
|
fn set_system_av_info(&mut self, av_info: &SystemAvInfo) -> Option<bool> {
|
||||||
self.set_geometry(&av_info.geometry);
|
self.set_geometry(&av_info.geometry)?;
|
||||||
Some(true)
|
Some(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn set_geometry(&mut self, geom: &GameGeometry) -> Option<bool> {
|
fn set_geometry(&mut self, geom: &GameGeometry) -> Option<bool> {
|
||||||
let _ = self.canvas.window_mut().set_size(geom.base_width, geom.base_height);
|
self.window.set_size(geom.base_width, geom.base_height).ok()?;
|
||||||
let _ = self.canvas.set_logical_size(geom.base_width, geom.base_height);
|
self.call_context_destroy()?;
|
||||||
|
self.gl_context = self.window.gl_create_context().ok()?;
|
||||||
|
self.window_fbo = Self::current_framebuffer_binding(self.window.subsystem());
|
||||||
|
self.call_context_reset()?;
|
||||||
Some(true)
|
Some(true)
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
fn hw_get_current_framebuffer(&mut self) -> Option<usize> {
|
fn hw_get_current_framebuffer(&mut self) -> Option<usize> {
|
||||||
Some(self.window_fbo as usize)
|
Some(self.window_fbo as usize)
|
||||||
|
|
Loading…
Reference in New Issue