From 5dcfb8cc0804b6469c045f05680e2d57894d7aed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Wo=C5=BAniak?= Date: Thu, 10 Feb 2022 09:51:53 +0100 Subject: [PATCH] Add glow, small build fixes --- Cargo.lock | 38 ++++++ amdguid/Cargo.toml | 9 +- .../src/backend/{xorg.rs => glium_backend.rs} | 66 +++------- amdguid/src/backend/glow_backend.rs | 120 ++++++++++++++++++ amdguid/src/backend/mod.rs | 64 +++++++++- .../{wayland.rs => wayland_backend.rs} | 53 +------- amdguid/src/main.rs | 13 +- assets/logo.png | Bin 0 -> 24006 bytes scripts/build.sh | 17 ++- scripts/compile.sh | 2 +- scripts/zip-ci.sh | 1 + scripts/zip-local.sh | 17 +++ 12 files changed, 288 insertions(+), 112 deletions(-) rename amdguid/src/backend/{xorg.rs => glium_backend.rs} (51%) create mode 100644 amdguid/src/backend/glow_backend.rs rename amdguid/src/backend/{wayland.rs => wayland_backend.rs} (84%) create mode 100644 assets/logo.png create mode 100755 scripts/zip-local.sh diff --git a/Cargo.lock b/Cargo.lock index d6ef533..0858faf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -127,10 +127,13 @@ dependencies = [ "egui", "egui-winit", "egui_glium", + "egui_glow", "egui_vulkano", "epaint", "epi", "glium", + "glow", + "glutin", "gumdrop", "log", "nix 0.23.1", @@ -754,6 +757,20 @@ dependencies = [ "glium", ] +[[package]] +name = "egui_glow" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fba815b217b8d4c17dcd080497d9ea2ad0e2047aec8d584db1c7c4a28e978db" +dependencies = [ + "egui", + "egui-winit", + "epi", + "glow", + "glutin", + "memoffset", +] + [[package]] name = "egui_vulkano" version = "0.4.0" @@ -881,6 +898,18 @@ dependencies = [ "takeable-option", ] +[[package]] +name = "glow" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8bd5877156a19b8ac83a29b2306fe20537429d318f3ff0a1a2119f8d9c61919" +dependencies = [ + "js-sys", + "slotmap", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "glutin" version = "0.27.0" @@ -1777,6 +1806,15 @@ dependencies = [ "libc", ] +[[package]] +name = "slotmap" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1e08e261d0e8f5c43123b7adf3e4ca1690d655377ac93a03b2c9d3e98de1342" +dependencies = [ + "version_check", +] + [[package]] name = "smallvec" version = "1.7.0" diff --git a/amdguid/Cargo.toml b/amdguid/Cargo.toml index 405c39a..1bc49aa 100644 --- a/amdguid/Cargo.toml +++ b/amdguid/Cargo.toml @@ -16,7 +16,8 @@ wayland = [ "vulkano-shaders", "_gui" ] -xorg = ["glium", "egui_glium", "_gui"] +xorg-glium = ["glium", "egui_glium", "_gui"] +xorg-glow = ["glow", "egui_glow", "glutin", "_gui"] default = ["wayland"] _gui = [ "egui", @@ -49,9 +50,13 @@ egui_vulkano = { version = "0.4.0", optional = true } vulkano-win = { version = "0.25.0", optional = true } vulkano = { version = "0.25.0", optional = true } vulkano-shaders = { version = "0.25.0", optional = true } -# xorg +# xorg glium glium = { version = "0.30", optional = true } egui_glium = { version = "0.15.0", optional = true } +# xorg glow +glutin = { version = "0.27.0", optional = true } +glow = { version = "0.11.2", optional = true } +egui_glow = { version = "0.15.0", optional = true } tokio = { version = "1.15.0", features = ["full"] } parking_lot = { version = "0.11.2" } diff --git a/amdguid/src/backend/xorg.rs b/amdguid/src/backend/glium_backend.rs similarity index 51% rename from amdguid/src/backend/xorg.rs rename to amdguid/src/backend/glium_backend.rs index abece09..a0ca948 100644 --- a/amdguid/src/backend/xorg.rs +++ b/amdguid/src/backend/glium_backend.rs @@ -1,10 +1,9 @@ -use egui::panel::TopBottomSide; -use egui::{Layout, PointerButton}; -use epaint::TextStyle; use parking_lot::Mutex; use std::sync::Arc; +use tokio::sync::mpsc::UnboundedReceiver; -use crate::app::{AmdGui, Page}; +use crate::app::AmdGui; +use crate::backend::create_ui; use glium::glutin; fn create_display(event_loop: &glutin::event_loop::EventLoop<()>) -> glium::Display { @@ -25,57 +24,28 @@ fn create_display(event_loop: &glutin::event_loop::EventLoop<()>) -> glium::Disp glium::Display::new(window_builder, context_builder, event_loop).unwrap() } -pub fn run_app(amd_gui: Arc>) { +pub fn run_app(amd_gui: Arc>, mut receiver: UnboundedReceiver) { let event_loop = glutin::event_loop::EventLoop::with_user_event(); let display = create_display(&event_loop); let mut egui = egui_glium::EguiGlium::new(&display); + let proxy = event_loop.create_proxy(); + tokio::spawn(async move { + loop { + if receiver.recv().await.is_some() { + if let Err(e) = proxy.send_event(()) { + log::error!("{:?}", e); + } + } + } + }); + event_loop.run(move |event, _, control_flow| { let mut redraw = || { egui.begin_frame(&display); - egui::containers::TopBottomPanel::new(TopBottomSide::Top, "menu").show( - egui.ctx(), - |ui| { - let mut child = - ui.child_ui(ui.available_rect_before_wrap(), Layout::left_to_right()); - if child - .add(egui::Button::new("Config").text_style(TextStyle::Heading)) - .clicked_by(PointerButton::Primary) - { - amd_gui.lock().page = Page::Config; - } - if child - .add(egui::Button::new("Monitoring").text_style(TextStyle::Heading)) - .clicked_by(PointerButton::Primary) - { - amd_gui.lock().page = Page::Monitoring; - } - if child - .add(egui::Button::new("Settings").text_style(TextStyle::Heading)) - .clicked_by(PointerButton::Primary) - { - amd_gui.lock().page = Page::Settings; - } - }, - ); - - egui::containers::CentralPanel::default().show(egui.ctx(), |ui| { - let mut gui = amd_gui.lock(); - let page = gui.page; - match page { - Page::Config => { - gui.ui(ui); - } - Page::Monitoring => { - gui.ui(ui); - } - Page::Settings => { - egui.ctx().settings_ui(ui); - } - } - }); + create_ui(amd_gui.clone(), egui.ctx()); let (needs_repaint, shapes) = egui.end_frame(&display); @@ -98,7 +68,9 @@ pub fn run_app(amd_gui: Arc>) { }; match event { - glutin::event::Event::RedrawRequested(_) => redraw(), + glutin::event::Event::UserEvent(_) | glutin::event::Event::RedrawRequested(_) => { + redraw() + } glutin::event::Event::WindowEvent { event, .. } => { if egui.is_quit_event(&event) { *control_flow = glium::glutin::event_loop::ControlFlow::Exit; diff --git a/amdguid/src/backend/glow_backend.rs b/amdguid/src/backend/glow_backend.rs new file mode 100644 index 0000000..7cbdc9d --- /dev/null +++ b/amdguid/src/backend/glow_backend.rs @@ -0,0 +1,120 @@ +use std::sync::Arc; + +use parking_lot::Mutex; +use tokio::sync::mpsc::UnboundedReceiver; + +use crate::backend::create_ui; +use crate::AmdGui; + +fn create_display( + event_loop: &glutin::event_loop::EventLoop<()>, +) -> ( + glutin::WindowedContext, + ::glow::Context, +) { + let window_builder = glutin::window::WindowBuilder::new() + .with_resizable(true) + .with_inner_size(glutin::dpi::LogicalSize { + width: 800.0, + height: 600.0, + }) + .with_title("AMD GUI"); + + let gl_window = unsafe { + glutin::ContextBuilder::new() + .with_depth_buffer(0) + .with_srgb(true) + .with_stencil_buffer(0) + .with_vsync(true) + .build_windowed(window_builder, event_loop) + .unwrap() + .make_current() + .unwrap() + }; + + let gl = unsafe { ::glow::Context::from_loader_function(|s| gl_window.get_proc_address(s)) }; + + unsafe { + use glow::HasContext as _; + gl.enable(glow::FRAMEBUFFER_SRGB); + } + + (gl_window, gl) +} + +pub fn run_app(amd_gui: Arc>, mut receiver: UnboundedReceiver) { + let event_loop = glutin::event_loop::EventLoop::with_user_event(); + let (gl_window, gl) = create_display(&event_loop); + + let mut egui = egui_glow::EguiGlow::new(&gl_window, &gl); + let proxy = event_loop.create_proxy(); + + tokio::spawn(async move { + loop { + if receiver.recv().await.is_some() { + if let Err(e) = proxy.send_event(()) { + log::error!("{:?}", e); + } + } + } + }); + + event_loop.run(move |event, _, control_flow| { + let mut redraw = || { + egui.begin_frame(gl_window.window()); + + create_ui(amd_gui.clone(), egui.ctx()); + + let (needs_repaint, shapes) = egui.end_frame(gl_window.window()); + + *control_flow = if needs_repaint { + gl_window.window().request_redraw(); + glutin::event_loop::ControlFlow::Poll + } else { + glutin::event_loop::ControlFlow::Wait + }; + + { + let color = egui::Rgba::from_rgb(0.1, 0.3, 0.2); + unsafe { + use glow::HasContext as _; + gl.clear_color(color[0], color[1], color[2], color[3]); + gl.clear(glow::COLOR_BUFFER_BIT); + } + + // draw things behind egui here + + egui.paint(&gl_window, &gl, shapes); + + // draw things on top of egui here + + gl_window.swap_buffers().unwrap(); + } + }; + + match event { + glutin::event::Event::UserEvent(_) | glutin::event::Event::RedrawRequested(_) => { + redraw() + } + + glutin::event::Event::WindowEvent { event, .. } => { + if egui.is_quit_event(&event) { + *control_flow = glutin::event_loop::ControlFlow::Exit; + } + + if let glutin::event::WindowEvent::Resized(physical_size) = event { + gl_window.resize(physical_size); + } + + egui.on_event(&event); + + gl_window.window().request_redraw(); // TODO: ask egui if the events warrants a repaint instead + } + glutin::event::Event::LoopDestroyed => { + egui.destroy(&gl); + } + + _ => (), + } + }); +} diff --git a/amdguid/src/backend/mod.rs b/amdguid/src/backend/mod.rs index c33963e..9a4273e 100644 --- a/amdguid/src/backend/mod.rs +++ b/amdguid/src/backend/mod.rs @@ -1,10 +1,62 @@ +#[cfg(feature = "xorg-glium")] +pub mod glium_backend; +#[cfg(feature = "xorg-glow")] +pub mod glow_backend; #[cfg(feature = "wayland")] -pub mod wayland; -#[cfg(feature = "xorg")] -pub mod xorg; +pub mod wayland_backend; +use egui::panel::TopBottomSide; +use egui::{Layout, PointerButton}; +use epaint::TextStyle; +use parking_lot::Mutex; +use std::sync::Arc; #[cfg(feature = "wayland")] -pub use wayland::run_app; +pub use wayland_backend::run_app; -#[cfg(feature = "xorg")] -pub use xorg::run_app; +#[cfg(feature = "xorg-glow")] +pub use glow_backend::run_app; + +use crate::app::Page; +use crate::AmdGui; +#[cfg(feature = "xorg-glium")] +pub use glium_backend::run_app; + +pub fn create_ui(amd_gui: Arc>, ctx: &egui::CtxRef) { + egui::containers::TopBottomPanel::new(TopBottomSide::Top, "menu").show(ctx, |ui| { + let mut child = ui.child_ui(ui.available_rect_before_wrap(), Layout::left_to_right()); + if child + .add(egui::Button::new("Config").text_style(TextStyle::Heading)) + .clicked_by(PointerButton::Primary) + { + amd_gui.lock().page = Page::Config; + } + if child + .add(egui::Button::new("Monitoring").text_style(TextStyle::Heading)) + .clicked_by(PointerButton::Primary) + { + amd_gui.lock().page = Page::Monitoring; + } + if child + .add(egui::Button::new("Settings").text_style(TextStyle::Heading)) + .clicked_by(PointerButton::Primary) + { + amd_gui.lock().page = Page::Settings; + } + }); + + egui::containers::CentralPanel::default().show(ctx, |ui| { + let mut gui = amd_gui.lock(); + let page = gui.page; + match page { + Page::Config => { + gui.ui(ui); + } + Page::Monitoring => { + gui.ui(ui); + } + Page::Settings => { + ctx.settings_ui(ui); + } + } + }); +} diff --git a/amdguid/src/backend/wayland.rs b/amdguid/src/backend/wayland_backend.rs similarity index 84% rename from amdguid/src/backend/wayland.rs rename to amdguid/src/backend/wayland_backend.rs index 31ba9ce..f03bbae 100644 --- a/amdguid/src/backend/wayland.rs +++ b/amdguid/src/backend/wayland_backend.rs @@ -1,9 +1,8 @@ -use crate::app::{AmdGui, Page}; -use egui::panel::TopBottomSide; -use egui::{Layout, PointerButton}; -use epaint::TextStyle; +use crate::app::AmdGui; +use crate::backend::create_ui; use parking_lot::Mutex; use std::sync::Arc; +use tokio::sync::mpsc::UnboundedReceiver; use vulkano::buffer::{BufferUsage, CpuAccessibleBuffer}; use vulkano::command_buffer::{ AutoCommandBufferBuilder, CommandBufferUsage, DynamicState, SubpassContents, @@ -52,7 +51,7 @@ struct Vertex { position: [f32; 2], } -pub fn run_app(amd_gui: Arc>) { +pub fn run_app(amd_gui: Arc>, _receiver: UnboundedReceiver) { let required_extensions = vulkano_win::required_extensions(); let instance = vulkano::instance::Instance::new(None, Version::V1_0, &required_extensions, None).unwrap(); @@ -213,7 +212,7 @@ pub fn run_app(amd_gui: Arc>) { // do your own event handling here }; } - Event::RedrawEventsCleared => { + Event::UserEvent(_) | Event::RedrawEventsCleared => { previous_frame_end.as_mut().unwrap().cleanup_finished(); if recreate_swap_chain { @@ -275,47 +274,7 @@ pub fn run_app(amd_gui: Arc>) { egui_ctx.begin_frame(egui_winit.take_egui_input(surface.window())); - egui::containers::TopBottomPanel::new(TopBottomSide::Top, "menu").show( - &egui_ctx, - |ui| { - let mut child = - ui.child_ui(ui.available_rect_before_wrap(), Layout::left_to_right()); - if child - .add(egui::Button::new("Config").text_style(TextStyle::Heading)) - .clicked_by(PointerButton::Primary) - { - amd_gui.lock().page = Page::Config; - } - if child - .add(egui::Button::new("Monitoring").text_style(TextStyle::Heading)) - .clicked_by(PointerButton::Primary) - { - amd_gui.lock().page = Page::Monitoring; - } - if child - .add(egui::Button::new("Settings").text_style(TextStyle::Heading)) - .clicked_by(PointerButton::Primary) - { - amd_gui.lock().page = Page::Settings; - } - }, - ); - - egui::containers::CentralPanel::default().show(&egui_ctx, |ui| { - let mut gui = amd_gui.lock(); - let page = gui.page; - match page { - Page::Config => { - gui.ui(ui); - } - Page::Monitoring => { - gui.ui(ui); - } - Page::Settings => { - egui_ctx.settings_ui(ui); - } - } - }); + create_ui(amd_gui.clone(), &egui_ctx); let (egui_output, clipped_shapes) = egui_ctx.end_frame(); egui_winit.handle_output(surface.window(), &egui_ctx, egui_output); diff --git a/amdguid/src/main.rs b/amdguid/src/main.rs index 533331d..9180d9d 100644 --- a/amdguid/src/main.rs +++ b/amdguid/src/main.rs @@ -1,4 +1,5 @@ use app::AmdGui; +use tokio::sync::mpsc::UnboundedReceiver; mod app; mod backend; @@ -22,16 +23,22 @@ async fn main() { )); let amd_gui = Arc::new(Mutex::new(AmdGui::new_with_config(config))); - schedule_tick(amd_gui.clone()); + let receiver = schedule_tick(amd_gui.clone()); - backend::run_app(amd_gui); + backend::run_app(amd_gui, receiver); } -fn schedule_tick(amd_gui: std::sync::Arc>) { +fn schedule_tick(amd_gui: std::sync::Arc>) -> UnboundedReceiver { + let (sender, receiver) = tokio::sync::mpsc::unbounded_channel(); tokio::spawn(async move { + let sender = sender; loop { amd_gui.lock().tick(); + if let Err(e) = sender.send(true) { + log::error!("Failed to propagate tick update. {:?}", e); + } tokio::time::sleep(tokio::time::Duration::from_millis(166)).await; } }); + receiver } diff --git a/assets/logo.png b/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8613465e98451cfd5d9b544eddd0b0fa3a190abb GIT binary patch literal 24006 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 PZ<2|znGtoL!=?WMQ|S2~ literal 0 HcmV?d00001 diff --git a/scripts/build.sh b/scripts/build.sh index 9d95097..ad7fbe0 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -8,16 +8,21 @@ strip target/x86_64-unknown-linux-musl/release/amdfand strip target/x86_64-unknown-linux-musl/release/amdvold strip target/x86_64-unknown-linux-musl/release/amdmond -upx --best --lzma target/x86_64-unknown-linux-musl/release/amdfand -upx --best --lzma target/x86_64-unknown-linux-musl/release/amdvold -upx --best --lzma target/x86_64-unknown-linux-musl/release/amdmond +#upx --best --lzma target/x86_64-unknown-linux-musl/release/amdfand +#upx --best --lzma target/x86_64-unknown-linux-musl/release/amdvold +#upx --best --lzma target/x86_64-unknown-linux-musl/release/amdmond -cargo build --release --target x86_64-unknown-linux-gnu --bin amdguid --no-default-features --features xorg +cargo build --release --target x86_64-unknown-linux-gnu --bin amdguid --no-default-features --features xorg-glium strip target/x86_64-unknown-linux-gnu/release/amdguid -upx --best --lzma target/x86_64-unknown-linux-gnu/release/amdguid +#upx --best --lzma target/x86_64-unknown-linux-gnu/release/amdguid zip ./target/amdguid-glium.zip ./target/x86_64-unknown-linux-gnu/release/amdguid +cargo build --release --target x86_64-unknown-linux-gnu --bin amdguid --no-default-features --features xorg-glow +strip target/x86_64-unknown-linux-gnu/release/amdguid +#upx --best --lzma target/x86_64-unknown-linux-gnu/release/amdguid +zip ./target/amdguid-glow.zip ./target/x86_64-unknown-linux-gnu/release/amdguid + cargo build --release --target x86_64-unknown-linux-gnu --bin amdguid --no-default-features --features wayland strip target/x86_64-unknown-linux-gnu/release/amdguid -upx --best --lzma target/x86_64-unknown-linux-gnu/release/amdguid +#upx --best --lzma target/x86_64-unknown-linux-gnu/release/amdguid zip ./target/amdguid-wayland.zip ./target/x86_64-unknown-linux-gnu/release/amdguid diff --git a/scripts/compile.sh b/scripts/compile.sh index fcdf8b4..726d06c 100755 --- a/scripts/compile.sh +++ b/scripts/compile.sh @@ -6,4 +6,4 @@ cargo build --release --target x86_64-unknown-linux-musl --bin amdfand cargo build --release --target x86_64-unknown-linux-musl --bin amdmond cargo build --release --target x86_64-unknown-linux-musl --bin amdvold cargo build --release --target x86_64-unknown-linux-musl --bin amdgui-helper -cargo build --release --target x86_64-unknown-linux-gnu --bin amdguid --no-default-features --features xorg +cargo build --release --target x86_64-unknown-linux-gnu --bin amdguid --no-default-features --features xorg-glium diff --git a/scripts/zip-ci.sh b/scripts/zip-ci.sh index a2d7f8a..13acc4c 100755 --- a/scripts/zip-ci.sh +++ b/scripts/zip-ci.sh @@ -6,3 +6,4 @@ zip binaries-$1.zip ./target/x86_64-unknown-linux-musl/release/amdvold; zip binaries-$1.zip ./target/x86_64-unknown-linux-musl/release/amdgui-helper; zip binaries-$1.zip ./target/amdguid-wayland.zip; zip binaries-$1.zip ./target/amdguid-glium.zip +zip binaries-$1.zip ./target/amdguid-glow.zip diff --git a/scripts/zip-local.sh b/scripts/zip-local.sh new file mode 100755 index 0000000..1db95f0 --- /dev/null +++ b/scripts/zip-local.sh @@ -0,0 +1,17 @@ +cd "$(git rev-parse --show-toplevel)" + +echo Building archlinux.zip + +rm -Rf ./tmp/*.zip + +cp ./target/x86_64-unknown-linux-musl/release/amdfand ./tmp +cp ./target/x86_64-unknown-linux-musl/release/amdmond ./tmp +cp ./target/x86_64-unknown-linux-musl/release/amdvold ./tmp +cp ./target/x86_64-unknown-linux-musl/release/amdgui-helper ./tmp +cp ./target/amdguid-wayland.zip ./tmp +cp ./target/amdguid-glium.zip ./tmp +cp ./target/amdguid-glow.zip ./tmp + +cd ./tmp + +zip -R archlinux.zip *