feat(wayland/surface): geometry resizing, unused

This commit is contained in:
Nova
2023-01-04 21:36:55 -05:00
parent 0c190cc833
commit 3f1bad18c8
6 changed files with 39 additions and 29 deletions

View File

@@ -28,7 +28,7 @@ psIn vs(vsIn input, uint id : SV_InstanceID) {
float3 world = mul(float4(input.pos.xyz, 1), sk_inst[id].world).xyz; float3 world = mul(float4(input.pos.xyz, 1), sk_inst[id].world).xyz;
o.pos = mul(float4(world, 1), sk_viewproj[o.view_id]); o.pos = mul(float4(world, 1), sk_viewproj[o.view_id]);
o.uv = (input.uv) + uv_offset * uv_scale; o.uv = (input.uv + uv_offset) * uv_scale;
return o; return o;
} }
float4 ps(psIn input) : SV_TARGET { float4 ps(psIn input) : SV_TARGET {

View File

@@ -4,19 +4,19 @@
//--name = stardust/text_shader //--name = stardust/text_shader
//--diffuse = white //--diffuse = white
//--fcFactor = 1.0
//--ripple = 4.0
//--uv_offset = 0.0, 0.0 //--uv_offset = 0.0, 0.0
//--uv_scale = 1.0, 1.0 //--uv_scale = 1.0, 1.0
//--fcFactor = 1.0
//--ripple = 4.0
//--alpha_min = 0.0 //--alpha_min = 0.0
//--alpha_max = 1.0 //--alpha_max = 1.0
Texture2D diffuse : register(t0); Texture2D diffuse : register(t0);
SamplerState diffuse_s : register(s0); SamplerState diffuse_s : register(s0);
float4 diffuse_i; float4 diffuse_i;
float fcFactor;
float ripple;
float2 uv_scale; float2 uv_scale;
float2 uv_offset; float2 uv_offset;
float fcFactor;
float ripple;
float alpha_min; float alpha_min;
float alpha_max; float alpha_max;
@@ -39,7 +39,7 @@ psIn vs(vsIn input, uint id : SV_InstanceID) {
float3 world = mul(float4(input.pos.xyz, 1), sk_inst[id].world).xyz; float3 world = mul(float4(input.pos.xyz, 1), sk_inst[id].world).xyz;
o.pos = mul(float4(world, 1), sk_viewproj[o.view_id]); o.pos = mul(float4(world, 1), sk_viewproj[o.view_id]);
o.uv = (input.uv) + uv_offset * uv_scale; o.uv = (input.uv + uv_offset) * uv_scale;
return o; return o;
} }

View File

@@ -3,7 +3,6 @@ use crate::{
core::{delta::Delta, destroy_queue, registry::Registry}, core::{delta::Delta, destroy_queue, registry::Registry},
nodes::drawable::model::Model, nodes::drawable::model::Model,
}; };
use glam::vec2;
use mint::Vector2; use mint::Vector2;
use once_cell::sync::OnceCell; use once_cell::sync::OnceCell;
use parking_lot::Mutex; use parking_lot::Mutex;
@@ -67,7 +66,7 @@ pub struct CoreSurface {
sk_tex: OnceCell<SendWrapper<SKTexture>>, sk_tex: OnceCell<SendWrapper<SKTexture>>,
sk_mat: OnceCell<Arc<SendWrapper<Material>>>, sk_mat: OnceCell<Arc<SendWrapper<Material>>>,
material_offset: Mutex<Delta<u32>>, material_offset: Mutex<Delta<u32>>,
geometry: Mutex<Delta<SurfaceGeometry>>, // geometry: Mutex<Delta<Option<SurfaceGeometry>>>,
pub pending_material_applications: Mutex<Vec<(Arc<Model>, u32)>>, pub pending_material_applications: Mutex<Vec<(Arc<Model>, u32)>>,
} }
@@ -78,6 +77,9 @@ impl CoreSurface {
surface: &WlSurface, surface: &WlSurface,
) { ) {
compositor::with_states(surface, |data| { compositor::with_states(surface, |data| {
// let mut geometry: Delta<Option<SurfaceGeometry>> =
// Delta::new(data.data_map.get::<SurfaceGeometry>().cloned());
// geometry.mark_changed();
data.data_map.insert_if_missing_threadsafe(|| { data.data_map.insert_if_missing_threadsafe(|| {
CORE_SURFACES.add(CoreSurface { CORE_SURFACES.add(CoreSurface {
display: Arc::downgrade(display), display: Arc::downgrade(display),
@@ -87,10 +89,7 @@ impl CoreSurface {
sk_tex: OnceCell::new(), sk_tex: OnceCell::new(),
sk_mat: OnceCell::new(), sk_mat: OnceCell::new(),
material_offset: Mutex::new(Delta::new(0)), material_offset: Mutex::new(Delta::new(0)),
geometry: Mutex::new(Delta::new(SurfaceGeometry { // geometry: Mutex::new(geometry),
origin: [0; 2].into(),
size: [0; 2].into(),
})),
pending_material_applications: Mutex::new(Vec::new()), pending_material_applications: Mutex::new(Vec::new()),
}) })
}); });
@@ -147,11 +146,12 @@ impl CoreSurface {
self.with_states(|data| { self.with_states(|data| {
// let just_mapped = mapped_data.is_none(); // let just_mapped = mapped_data.is_none();
// if just_mapped { // if just_mapped {
let smithay_tex = data let renderer_surface_state = data
.data_map .data_map
.get::<RendererSurfaceStateUserData>() .get::<RendererSurfaceStateUserData>()
.unwrap() .unwrap()
.borrow() .borrow();
let smithay_tex = renderer_surface_state
.texture::<Gles2Renderer>(renderer.id()) .texture::<Gles2Renderer>(renderer.id())
.unwrap() .unwrap()
.clone(); .clone();
@@ -173,16 +173,25 @@ impl CoreSurface {
if let Some(material_offset) = self.material_offset.lock().delta() { if let Some(material_offset) = self.material_offset.lock().delta() {
sk_mat.set_queue_offset(*material_offset as i32); sk_mat.set_queue_offset(*material_offset as i32);
} }
if let Some(geometry) = self.geometry.lock().delta() { // if let Some(geometry) = self.geometry.lock().delta().cloned().unwrap_or_default() {
let tex_size = vec2(smithay_tex.width() as f32, smithay_tex.height() as f32); // let buffer_size = renderer_surface_state.buffer_size().unwrap();
let geometry_origin = vec2(geometry.origin.x as f32, geometry.origin.y as f32); // let surface_size = dbg!(vec2(buffer_size.w as f32, buffer_size.h as f32));
let geometry_size = vec2(geometry.size.x as f32, geometry.size.y as f32); // let geometry_origin =
sk_mat.set_parameter("uv_offset", &Vector2::from(geometry_origin / tex_size)); // dbg!(vec2(geometry.origin.x as f32, geometry.origin.y as f32));
sk_mat.set_parameter("uv_scale", &Vector2::from(geometry_size / tex_size)); // let geometry_size = dbg!(vec2(geometry.size.x as f32, geometry.size.y as f32));
} // sk_mat.set_parameter(
// "uv_offset",
// &Vector2::from(dbg!(geometry_origin / surface_size)),
// );
// sk_mat.set_parameter(
// "uv_scale",
// &Vector2::from(dbg!(geometry_size / surface_size)),
// );
// }
let surface_size = renderer_surface_state.surface_size().unwrap();
let new_mapped_data = CoreSurfaceData { let new_mapped_data = CoreSurfaceData {
size: Vector2::from([smithay_tex.width(), smithay_tex.height()]), size: Vector2::from([surface_size.w as u32, surface_size.h as u32]),
wl_tex: Some(SendWrapper::new(smithay_tex)), wl_tex: Some(SendWrapper::new(smithay_tex)),
}; };
*mapped_data = Some(new_mapped_data); *mapped_data = Some(new_mapped_data);
@@ -207,9 +216,9 @@ impl CoreSurface {
*self.material_offset.lock().value_mut() = material_offset; *self.material_offset.lock().value_mut() = material_offset;
} }
pub fn set_geometry(&self, geometry: SurfaceGeometry) { // pub fn set_geometry(&self, geometry: SurfaceGeometry) {
*self.geometry.lock().value_mut() = geometry; // *self.geometry.lock().value_mut() = Some(geometry);
} // }
pub fn apply_material(&self, model: Arc<Model>, material_idx: u32) { pub fn apply_material(&self, model: Arc<Model>, material_idx: u32) {
self.pending_material_applications self.pending_material_applications

View File

@@ -3,7 +3,7 @@ use std::sync::Arc;
use super::{ use super::{
panel_item::{PanelItem, RecommendedState, ToplevelState}, panel_item::{PanelItem, RecommendedState, ToplevelState},
state::WaylandState, state::WaylandState,
surface::{CoreSurface, SurfaceGeometry}, surface::SurfaceGeometry,
SERIAL_COUNTER, SERIAL_COUNTER,
}; };
use mint::Vector2; use mint::Vector2;
@@ -278,9 +278,10 @@ impl Dispatch<XdgSurface, WaylandSurface, WaylandState> for WaylandState {
*data.geometry.lock() = Some(geometry); *data.geometry.lock() = Some(geometry);
let Ok(wl_surface) = data.wl_surface.upgrade() else { return; }; let Ok(wl_surface) = data.wl_surface.upgrade() else { return; };
compositor::with_states(&wl_surface, |data| { compositor::with_states(&wl_surface, |data| {
if let Some(core_surface) = data.data_map.get::<CoreSurface>() { // if let Some(core_surface) = data.data_map.get::<Arc<CoreSurface>>() {
core_surface.set_geometry(geometry); // core_surface.set_geometry(geometry);
} // }
data.data_map.insert_if_missing_threadsafe(|| geometry);
}); });
} }
xdg_surface::Request::AckConfigure { serial: _ } => (), xdg_surface::Request::AckConfigure { serial: _ } => (),