server: warning cleanup
This commit is contained in:
parent
3c2d4cee6f
commit
2e4e810e5f
9 changed files with 61 additions and 37 deletions
|
@ -5,7 +5,6 @@ mod video;
|
||||||
|
|
||||||
mod transport;
|
mod transport;
|
||||||
|
|
||||||
use anyhow::Context;
|
|
||||||
use async_trait::async_trait;
|
use async_trait::async_trait;
|
||||||
|
|
||||||
use cudarc::driver::CudaDevice;
|
use cudarc::driver::CudaDevice;
|
||||||
|
@ -14,15 +13,14 @@ use retro_thread::{spawn_retro_thread, RetroEvent};
|
||||||
use transport::websocket::WebsocketTransport;
|
use transport::websocket::WebsocketTransport;
|
||||||
use transport::{Transport, TransportReciever};
|
use transport::{Transport, TransportReciever};
|
||||||
use video::cuda_gl::safe::GraphicsResource;
|
use video::cuda_gl::safe::GraphicsResource;
|
||||||
|
use video::encoder_thread;
|
||||||
use video::encoder_thread::EncodeThreadInput;
|
use video::encoder_thread::EncodeThreadInput;
|
||||||
use video::{encoder_thread, ffmpeg};
|
|
||||||
|
|
||||||
use std::{
|
use std::{
|
||||||
sync::{Arc, Mutex},
|
sync::{Arc, Mutex},
|
||||||
time::Duration,
|
time::Duration,
|
||||||
};
|
};
|
||||||
|
|
||||||
use std::net::SocketAddr;
|
|
||||||
use tokio::sync::{
|
use tokio::sync::{
|
||||||
mpsc::{self, error::TryRecvError},
|
mpsc::{self, error::TryRecvError},
|
||||||
Mutex as TokioMutex,
|
Mutex as TokioMutex,
|
||||||
|
@ -198,12 +196,21 @@ async fn main() -> anyhow::Result<()> {
|
||||||
.name("retro_event_rx".into())
|
.name("retro_event_rx".into())
|
||||||
.spawn(move || {
|
.spawn(move || {
|
||||||
// load game
|
// load game
|
||||||
|
/*
|
||||||
let _ = retro_input_event_tx.blocking_send(retro_thread::RetroInEvent::LoadCore(
|
let _ = retro_input_event_tx.blocking_send(retro_thread::RetroInEvent::LoadCore(
|
||||||
"cores/swanstation_libretro.so".into(),
|
"cores/swanstation_libretro.so".into(),
|
||||||
));
|
));
|
||||||
let _ = retro_input_event_tx.blocking_send(retro_thread::RetroInEvent::LoadGame(
|
let _ = retro_input_event_tx.blocking_send(retro_thread::RetroInEvent::LoadGame(
|
||||||
"roms/merged/nmv2/jagb/nmv2jagb.cue".into(),
|
"roms/merged/nmv2/jagb/nmv2jagb.cue".into(),
|
||||||
));
|
));
|
||||||
|
*/
|
||||||
|
|
||||||
|
let _ = retro_input_event_tx.blocking_send(retro_thread::RetroInEvent::LoadCore(
|
||||||
|
"cores/pcsx2_libretro.so".into(),
|
||||||
|
));
|
||||||
|
let _ = retro_input_event_tx.blocking_send(retro_thread::RetroInEvent::LoadGame(
|
||||||
|
"/data/sda/lily/ISOs/Sony PlayStation 2/ztx-hl.bin".into(),
|
||||||
|
));
|
||||||
|
|
||||||
// start the libretro thread looping now that we're alive
|
// start the libretro thread looping now that we're alive
|
||||||
let _ = retro_input_event_tx.blocking_send(retro_thread::RetroInEvent::Start);
|
let _ = retro_input_event_tx.blocking_send(retro_thread::RetroInEvent::Start);
|
||||||
|
|
|
@ -217,21 +217,18 @@ impl FrontendInterface for RetroState {
|
||||||
self.software_framebuffer.resize(Size { width, height });
|
self.software_framebuffer.resize(Size { width, height });
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe {
|
// register the FBO's texture to our cuda interop resource
|
||||||
}
|
|
||||||
|
|
||||||
// map to cuda
|
|
||||||
{
|
{
|
||||||
let mut locked = self
|
let mut locked = self
|
||||||
.cuda_resource
|
.cuda_resource
|
||||||
.lock()
|
.lock()
|
||||||
.expect("YOU MOTHERFUCKER PISS GO COUNT YOUR DICK");
|
.expect("Failed to lock CUDA resource");
|
||||||
|
|
||||||
locked.device().bind_to_thread().expect("fuck");
|
locked.device().bind_to_thread().expect("Failed to bind CUDA device to thread");
|
||||||
|
|
||||||
locked
|
locked
|
||||||
.register(self.gl_framebuffer.texture_id(), gl::TEXTURE_2D)
|
.register(self.gl_framebuffer.texture_id(), gl::TEXTURE_2D)
|
||||||
.expect("you fucking asswater");
|
.expect("Failed to register OpenGL texture with CUDA Graphics resource");
|
||||||
}
|
}
|
||||||
|
|
||||||
let _ = self.event_tx.blocking_send(RetroEvent::Resize {
|
let _ = self.event_tx.blocking_send(RetroEvent::Resize {
|
||||||
|
@ -375,6 +372,8 @@ impl FrontendInterface for RetroState {
|
||||||
self.software_framebuffer.clear();
|
self.software_framebuffer.clear();
|
||||||
self.gl_rendering = true;
|
self.gl_rendering = true;
|
||||||
|
|
||||||
|
tracing::info!("Rendering with OpenGL via EGL");
|
||||||
|
|
||||||
return Some(HwGlInitData {
|
return Some(HwGlInitData {
|
||||||
get_proc_address: gpu::egl::GetProcAddress as *mut std::ffi::c_void,
|
get_proc_address: gpu::egl::GetProcAddress as *mut std::ffi::c_void,
|
||||||
});
|
});
|
||||||
|
|
|
@ -6,16 +6,12 @@ use std::sync::Arc;
|
||||||
|
|
||||||
use rand::distributions::DistString;
|
use rand::distributions::DistString;
|
||||||
use std::net::SocketAddr;
|
use std::net::SocketAddr;
|
||||||
use tokio::sync::{
|
use tokio::sync::broadcast;
|
||||||
broadcast,
|
|
||||||
mpsc::{self, error::TryRecvError},
|
|
||||||
Mutex as TokioMutex,
|
|
||||||
};
|
|
||||||
|
|
||||||
use axum::{
|
use axum::{
|
||||||
extract::{
|
extract::{
|
||||||
connect_info::ConnectInfo,
|
connect_info::ConnectInfo,
|
||||||
ws::{self, Message, WebSocket, WebSocketUpgrade},
|
ws::{Message, WebSocket, WebSocketUpgrade},
|
||||||
State,
|
State,
|
||||||
},
|
},
|
||||||
response::IntoResponse,
|
response::IntoResponse,
|
||||||
|
@ -34,7 +30,7 @@ async fn ws_handler<T: TransportReciever + Sync + Send + 'static>(
|
||||||
ConnectInfo(addr): ConnectInfo<SocketAddr>,
|
ConnectInfo(addr): ConnectInfo<SocketAddr>,
|
||||||
|
|
||||||
State(state): State<Arc<T>>,
|
State(state): State<Arc<T>>,
|
||||||
mut broadcast_rx: broadcast::Receiver<TransportMessage>,
|
broadcast_rx: broadcast::Receiver<TransportMessage>,
|
||||||
) -> impl IntoResponse {
|
) -> impl IntoResponse {
|
||||||
// finalize the upgrade process by returning upgrade callback.
|
// finalize the upgrade process by returning upgrade callback.
|
||||||
// we can customize the callback by sending additional info such as address.
|
// we can customize the callback by sending additional info such as address.
|
||||||
|
@ -44,7 +40,7 @@ async fn ws_handler<T: TransportReciever + Sync + Send + 'static>(
|
||||||
/// Actual websocket statemachine (one will be spawned per connection)
|
/// Actual websocket statemachine (one will be spawned per connection)
|
||||||
async fn handle_socket<T: TransportReciever + Sync + Send + 'static>(
|
async fn handle_socket<T: TransportReciever + Sync + Send + 'static>(
|
||||||
socket: WebSocket,
|
socket: WebSocket,
|
||||||
who: SocketAddr,
|
_who: SocketAddr, // FIXME
|
||||||
state: Arc<T>,
|
state: Arc<T>,
|
||||||
mut broadcast_rx: broadcast::Receiver<TransportMessage>,
|
mut broadcast_rx: broadcast::Receiver<TransportMessage>,
|
||||||
) {
|
) {
|
||||||
|
@ -56,7 +52,7 @@ async fn handle_socket<T: TransportReciever + Sync + Send + 'static>(
|
||||||
|
|
||||||
let recv_clone = Arc::clone(&state);
|
let recv_clone = Arc::clone(&state);
|
||||||
|
|
||||||
state.on_connect(&username).await;
|
let _ = state.on_connect(&username).await;
|
||||||
|
|
||||||
let mut send_task = tokio::spawn(async move {
|
let mut send_task = tokio::spawn(async move {
|
||||||
while let Ok(msg) = broadcast_rx.recv().await {
|
while let Ok(msg) = broadcast_rx.recv().await {
|
||||||
|
@ -80,7 +76,7 @@ async fn handle_socket<T: TransportReciever + Sync + Send + 'static>(
|
||||||
while let Some(Ok(msg)) = receiver.next().await {
|
while let Some(Ok(msg)) = receiver.next().await {
|
||||||
match msg {
|
match msg {
|
||||||
Message::Text(msg) => {
|
Message::Text(msg) => {
|
||||||
recv_clone.on_message(&username_clone, &msg).await;
|
let _ = recv_clone.on_message(&username_clone, &msg).await;
|
||||||
}
|
}
|
||||||
Message::Close(_) => break,
|
Message::Close(_) => break,
|
||||||
_ => {}
|
_ => {}
|
||||||
|
@ -98,7 +94,7 @@ async fn handle_socket<T: TransportReciever + Sync + Send + 'static>(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
state.on_leave(&username).await;
|
let _ = state.on_leave(&username).await;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl WebsocketTransport {
|
impl WebsocketTransport {
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
#[allow(non_snake_case)]
|
||||||
pub mod sys;
|
pub mod sys;
|
||||||
use sys::*;
|
use sys::*;
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,4 @@
|
||||||
use cudarc::driver::{result as cuda_result, safe as cuda_safe, sys as cuda_sys, CudaDevice};
|
use cudarc::driver::{result as cuda_result, sys as cuda_sys, CudaDevice};
|
||||||
|
|
||||||
use super::sys;
|
|
||||||
|
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
|
@ -49,7 +47,9 @@ impl MappedGraphicsResource {
|
||||||
Ok(array)
|
Ok(array)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_device_pointer(&mut self) -> Result<cuda_sys::CUdeviceptr, cuda_result::DriverError> {
|
pub fn get_device_pointer(
|
||||||
|
&mut self,
|
||||||
|
) -> Result<cuda_sys::CUdeviceptr, cuda_result::DriverError> {
|
||||||
assert!(
|
assert!(
|
||||||
!self.resource.is_null(),
|
!self.resource.is_null(),
|
||||||
"do not call GraphicsResource::get_mapped_array if no resource is actually registered"
|
"do not call GraphicsResource::get_mapped_array if no resource is actually registered"
|
||||||
|
@ -138,8 +138,6 @@ impl GraphicsResource {
|
||||||
self.resource = std::ptr::null_mut();
|
self.resource = std::ptr::null_mut();
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Drop for GraphicsResource {
|
impl Drop for GraphicsResource {
|
||||||
|
|
|
@ -193,13 +193,14 @@ impl H264Encoder {
|
||||||
video_encoder_context.set_format(ffmpeg::format::Pixel::CUDA);
|
video_encoder_context.set_format(ffmpeg::format::Pixel::CUDA);
|
||||||
|
|
||||||
video_encoder_context.set_qmin(35);
|
video_encoder_context.set_qmin(35);
|
||||||
video_encoder_context.set_qmax(30);
|
video_encoder_context.set_qmax(38);
|
||||||
|
|
||||||
unsafe {
|
unsafe {
|
||||||
// FIXME: this currently breaks the avbufferref system a bit
|
// FIXME: this currently breaks the avbufferref system a bit
|
||||||
(*video_encoder_context.as_mut_ptr()).hw_frames_ctx = hw_frame_context.as_raw_mut();
|
(*video_encoder_context.as_mut_ptr()).hw_frames_ctx =
|
||||||
|
ffmpeg::sys::av_buffer_ref(hw_frame_context.as_raw_mut());
|
||||||
(*video_encoder_context.as_mut_ptr()).hw_device_ctx =
|
(*video_encoder_context.as_mut_ptr()).hw_device_ctx =
|
||||||
hw_frame_context.as_device_context_mut();
|
ffmpeg::sys::av_buffer_ref(hw_frame_context.as_device_context_mut());
|
||||||
}
|
}
|
||||||
|
|
||||||
// set h264_nvenc options
|
// set h264_nvenc options
|
||||||
|
@ -269,7 +270,6 @@ impl H264Encoder {
|
||||||
(*frame.as_mut_ptr()).height = encoder.height() as i32;
|
(*frame.as_mut_ptr()).height = encoder.height() as i32;
|
||||||
(*frame.as_mut_ptr()).hw_frames_ctx = hw_context.as_raw_mut();
|
(*frame.as_mut_ptr()).hw_frames_ctx = hw_context.as_raw_mut();
|
||||||
|
|
||||||
hw_context.get_buffer(&mut frame)?;
|
|
||||||
hw_context.get_buffer(&mut frame)?;
|
hw_context.get_buffer(&mut frame)?;
|
||||||
|
|
||||||
(*frame.as_mut_ptr()).linesize[0] = (*frame.as_ptr()).width * 4;
|
(*frame.as_mut_ptr()).linesize[0] = (*frame.as_ptr()).width * 4;
|
||||||
|
|
|
@ -30,6 +30,16 @@ impl CudaDeviceContext {
|
||||||
// }
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Drop for CudaDeviceContext {
|
||||||
|
fn drop(&mut self) {
|
||||||
|
unsafe {
|
||||||
|
if !self.buffer.is_null() {
|
||||||
|
ffmpeg::sys::av_buffer_unref(&mut self.buffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub struct CudaDeviceContextBuilder {
|
pub struct CudaDeviceContextBuilder {
|
||||||
buffer: *mut ffmpeg::sys::AVBufferRef,
|
buffer: *mut ffmpeg::sys::AVBufferRef,
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,18 +32,20 @@ impl HwFrameContext {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn as_device_context_mut(&mut self) -> &mut ffmpeg::sys::AVBufferRef {
|
pub fn as_device_context_mut(&mut self) -> &mut ffmpeg::sys::AVBufferRef {
|
||||||
unsafe {
|
self._cuda_device_context.as_raw_mut()
|
||||||
self._cuda_device_context.as_raw_mut()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// call once to allocate frame
|
/// call once to allocate frame
|
||||||
pub fn get_buffer(&mut self, frame: &mut ffmpeg::frame::Video) -> Result<(), ffmpeg::Error> {
|
pub fn get_buffer(&mut self, frame: &mut ffmpeg::frame::Video) -> Result<(), ffmpeg::Error> {
|
||||||
unsafe {
|
unsafe {
|
||||||
super::check_ret(ffmpeg::sys::av_hwframe_get_buffer(self.buffer, frame.as_mut_ptr(), 0))?;
|
super::check_ret(ffmpeg::sys::av_hwframe_get_buffer(
|
||||||
|
self.buffer,
|
||||||
|
frame.as_mut_ptr(),
|
||||||
|
0,
|
||||||
|
))?;
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
// pub fn as_raw(&self) -> &ffmpeg::sys::AVBufferRef {
|
// pub fn as_raw(&self) -> &ffmpeg::sys::AVBufferRef {
|
||||||
|
@ -53,6 +55,16 @@ impl HwFrameContext {
|
||||||
|
|
||||||
unsafe impl Send for HwFrameContext {}
|
unsafe impl Send for HwFrameContext {}
|
||||||
|
|
||||||
|
impl Drop for HwFrameContext {
|
||||||
|
fn drop(&mut self) {
|
||||||
|
unsafe {
|
||||||
|
if !self.buffer.is_null() {
|
||||||
|
ffmpeg::sys::av_buffer_unref(&mut self.buffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub struct HwFrameContextBuilder {
|
pub struct HwFrameContextBuilder {
|
||||||
cuda_device_context: CudaDeviceContext,
|
cuda_device_context: CudaDeviceContext,
|
||||||
buffer: *mut ffmpeg::sys::AVBufferRef,
|
buffer: *mut ffmpeg::sys::AVBufferRef,
|
||||||
|
|
|
@ -7,6 +7,7 @@ pub use ffmpeg as ffmpeg;
|
||||||
pub mod hwdevice;
|
pub mod hwdevice;
|
||||||
pub mod hwframe;
|
pub mod hwframe;
|
||||||
|
|
||||||
|
#[allow(unused)] // FIXME
|
||||||
pub mod encoder_thread;
|
pub mod encoder_thread;
|
||||||
|
|
||||||
pub mod cuda_gl;
|
pub mod cuda_gl;
|
||||||
|
|
Loading…
Reference in a new issue