From 5ff05b7f02b2ff1b0859a9a61ca7e1af6476424f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= Date: Tue, 5 Nov 2019 20:40:17 +0100 Subject: [PATCH] Apply HiDPI scaling to quads The anti-aliasing strategy is pretty naive, but we will manage for now. --- wgpu/src/quad.rs | 58 +++++++++++++++++++++++++--------- wgpu/src/renderer.rs | 7 ++-- wgpu/src/shader/quad.frag | 8 ++--- wgpu/src/shader/quad.frag.spv | Bin 3212 -> 3044 bytes wgpu/src/shader/quad.vert | 20 +++++++----- wgpu/src/shader/quad.vert.spv | Bin 2544 -> 3020 bytes 6 files changed, 61 insertions(+), 32 deletions(-) diff --git a/wgpu/src/quad.rs b/wgpu/src/quad.rs index bfbd7e2d..4356f8af 100644 --- a/wgpu/src/quad.rs +++ b/wgpu/src/quad.rs @@ -6,7 +6,7 @@ use std::mem; pub struct Pipeline { pipeline: wgpu::RenderPipeline, constants: wgpu::BindGroup, - transform: wgpu::Buffer, + constants_buffer: wgpu::Buffer, vertices: wgpu::Buffer, indices: wgpu::Buffer, instances: wgpu::Buffer, @@ -23,20 +23,20 @@ impl Pipeline { }], }); - let transform = device + let constants_buffer = device .create_buffer_mapped( - 16, + 1, wgpu::BufferUsage::UNIFORM | wgpu::BufferUsage::COPY_DST, ) - .fill_from_slice(Transformation::identity().as_ref()); + .fill_from_slice(&[Uniforms::default()]); let constants = device.create_bind_group(&wgpu::BindGroupDescriptor { layout: &constant_layout, bindings: &[wgpu::Binding { binding: 0, resource: wgpu::BindingResource::Buffer { - buffer: &transform, - range: 0..64, + buffer: &constants_buffer, + range: 0..std::mem::size_of::() as u64, }, }], }); @@ -124,7 +124,7 @@ impl Pipeline { }, wgpu::VertexAttributeDescriptor { shader_location: 4, - format: wgpu::VertexFormat::Uint, + format: wgpu::VertexFormat::Float, offset: 4 * (2 + 2 + 4), }, ], @@ -151,7 +151,7 @@ impl Pipeline { Pipeline { pipeline, constants, - transform, + constants_buffer, vertices, indices, instances, @@ -164,19 +164,22 @@ impl Pipeline { encoder: &mut wgpu::CommandEncoder, instances: &[Quad], transformation: Transformation, + scale: f32, bounds: Rectangle, target: &wgpu::TextureView, ) { - let transform_buffer = device - .create_buffer_mapped(16, wgpu::BufferUsage::COPY_SRC) - .fill_from_slice(transformation.as_ref()); + let uniforms = Uniforms::new(transformation, scale); + + let constants_buffer = device + .create_buffer_mapped(1, wgpu::BufferUsage::COPY_SRC) + .fill_from_slice(&[uniforms]); encoder.copy_buffer_to_buffer( - &transform_buffer, + &constants_buffer, 0, - &self.transform, + &self.constants_buffer, 0, - 16 * 4, + std::mem::size_of::() as u64, ); let mut i = 0; @@ -271,9 +274,34 @@ pub struct Quad { pub position: [f32; 2], pub scale: [f32; 2], pub color: [f32; 4], - pub border_radius: u32, + pub border_radius: f32, } impl Quad { const MAX: usize = 100_000; } + +#[repr(C)] +#[derive(Debug, Clone, Copy)] +struct Uniforms { + transform: [f32; 16], + scale: f32, +} + +impl Uniforms { + fn new(transformation: Transformation, scale: f32) -> Uniforms { + Self { + transform: *transformation.as_ref(), + scale, + } + } +} + +impl Default for Uniforms { + fn default() -> Self { + Self { + transform: *Transformation::identity().as_ref(), + scale: 1.0, + } + } +} diff --git a/wgpu/src/renderer.rs b/wgpu/src/renderer.rs index 7ac74e93..f46acb8c 100644 --- a/wgpu/src/renderer.rs +++ b/wgpu/src/renderer.rs @@ -239,7 +239,7 @@ impl Renderer { color: match background { Background::Color(color) => color.into_linear(), }, - border_radius: *border_radius as u32, + border_radius: *border_radius as f32, }); } Primitive::Image { path, bounds } => { @@ -327,13 +327,14 @@ impl Renderer { encoder, &layer.quads, transformation, + dpi, bounds, target, ); } if layer.images.len() > 0 { - let translated = transformation + let translated_and_scaled = transformation * Transformation::scale(dpi, dpi) * Transformation::translate( -(layer.offset.x as f32), @@ -344,7 +345,7 @@ impl Renderer { &mut self.device, encoder, &layer.images, - translated, + translated_and_scaled, bounds, target, ); diff --git a/wgpu/src/shader/quad.frag b/wgpu/src/shader/quad.frag index 849f581e..2ee77e71 100644 --- a/wgpu/src/shader/quad.frag +++ b/wgpu/src/shader/quad.frag @@ -3,7 +3,7 @@ layout(location = 0) in vec4 v_Color; layout(location = 1) in vec2 v_Pos; layout(location = 2) in vec2 v_Scale; -layout(location = 3) in flat uint v_BorderRadius; +layout(location = 3) in float v_BorderRadius; layout(location = 0) out vec4 o_Color; @@ -27,11 +27,7 @@ float rounded(in vec2 frag_coord, in vec2 position, in vec2 size, float radius, } void main() { - float radius_alpha = 1.0; - - if(v_BorderRadius > 0.0) { - radius_alpha = rounded(gl_FragCoord.xy, v_Pos, v_Scale, v_BorderRadius, 0.5); - } + float radius_alpha = rounded(gl_FragCoord.xy, v_Pos, v_Scale, v_BorderRadius, 0.5); o_Color = vec4(v_Color.xyz, v_Color.w * radius_alpha); } diff --git a/wgpu/src/shader/quad.frag.spv b/wgpu/src/shader/quad.frag.spv index 71b91b44f7cc7dda15caea27aeb00d1d99874601..17bd8f465ada98f5308097b3ce01c65532cdf70a 100644 GIT binary patch delta 1057 zcmZ9LO)mpc6o&6qsYZm2G&YTdo!I(_AXr$oSok)EmX_);bbKvlWoIM(C5``LXD9xJ z#QThUMS7FBbKY~#J?A}VrZ1zPg~6W8c+MElcJ~r{IrYL zy7>7oPyPx}DD+puMi`|9o8qzMYihtC1HzC1M|e^2EN4J?#&U**_gGGSIEVYxFPipO z<~=EhZj1H_Sz%1SJ9<(Y|Gec$z(;(~+S+y+ha-tN`EVq;{6lNggE$6YImzLDizP&{we}y+~qJU{3@Q0jDUjGl88ELlB%8W7P%rMGSFp zY=j*Nb0(kWUC165XiR#dfX==}j7ux3aA delta 1244 zcmZ9LO^*yw6ozkqOwUYYupko~BvvAyEu?q}L$4PZ#;v84u!5Uy z+`7D)47vsH!-q+h+>8Ff7Jh#-&%s^9bdSXWRyb{L$D-0ReKg=)CYK9AmJ zZ-6@RT*7Wl8+cA`S!()Mqs_buzuYqQ8xPNmktrNPF!>r_oiTxfsDU={fZS)Ol^5DG z&s*S_-5mPO=YyU`ZoX&O#u{^sj#tCR$NG`nxt2A~U^~}I?p#Ygi|tq^xnq@|=Hg}c z3*c0|{u;Ku9KyYJ1*m=Ddi#3A9w;6KKS|JHcm3f2&Ttc`{i0g!GVyKf$;3Uln*KKX z9pEq)Db3>UMoryiA1t`f{e{zm2Kse7C7pIcUiwmO{|bF}MXqf}EI`|CIK&fSws>)d zy%X4F^A&#yyK%-ZbAK@CH!mz->R!I&F}71)lfJI>?=yaER4xQM7`VP57cwRLPYFD3+NCo$l%0GdM6gn$m$ZnhvJz)L%!^07y!Q(nz(>FDx%i z_jWg?&z*nEh{I{H3N+>^{#--IR;#Ee4xvAbEFg=>ZDbi)LGB@|$R;w#-vImH5Dmjn z=g@u(-%fL>?6GUhThwfCp6`@vtxk_jM{*`9?KSUqTid+{Wp@j7xWdhKuerS5>a;-y z(-CZ!ykqP;`@W$n_hR23PA}pwYMh?2wz4@_cFJzWVVyytM!-roFmm+l+9~p zccb0C)7mKZC~}x=eV^hH_RWNE_}W_zPV1ZbG_*8wzk*X`#!s?Z?DtY_xWb4;4bU8e?R8>=5uex!MyV(c7H02 z)$aEIHBI`DRmT{>^mGlA!?;;wo_pmoU+=MRrx91!6MeI?ojdc0c>AR7GTuIETcfsp zioCV$Q~kU%TaULt+Rmyq+-G+=o36mDL9G8C{WxuB$VnJ{M{Ru#?1SuLiuU8|=A(Tn+mWN^p9J^3xs37uFuR!cIREW~SpUwU zs%PFME}uQLKVrwRpJ8tx-g!3LN3(4{$Iy+HFY>W}#_P9sbM;R78tjToz6Se*2Fv)< z?8eKd-~DAIrC(;kK2zEMpMMSe05Zi%Yn?`nQ9SD&XRD82N;6aReH8p{L`?DiTkQ5m z9_!I|{>1cu%I;m^*Ivw+{v~u{<@UU`^C=d#^BH`fXFc9e+j$ND7wFy>er@Mh>=gXp zW}j~`PL#7}ZpQ0V%&W;Rr+)L$UPZ)w8~fZsT*j}l+gJN$ymPmSc<%+?PM-Jd|5iEdA@>(IeSY~XFpy= z#Lv_uI9~^o(;f!rS#oI)3?bH0HspT6LY+TR58J$}n?^$xn2^L{($`7XM+E3k9u zV)i+5KaXy#KJPJyh`)etZLYxHLl=`Hu!|XUZUTEhW6n=tAD~;8E3ixGVs*X`Ggjxj zoUuCJ6)?XCuHc(N7pwElW~|P4HDh(YYhb>IEBNNn#p-<5GgjyOC}Z-)+ulI;4Sh4; z$Ttb!Ji6~;{nl%J;k$`$ZPqf2m}~exMmJCMG7s<7=WqEF#5?7d!&v9s-=jX~$9eq> zSw!?LWIJZ-4z{zU&u^P{`0k=R%liDzY3mzd{}Q=}IQPfczd|1VJ${|>-}8)qgY7wS zIak=ln=z1G8} literal 2544 zcmZvdYfn=_5QZ0O3xcAETvWuCdI#|ah$2u5T2#qJKN)2m+Nu8?t^Q~pz9XnT)#_2YhkmrIn!(%%*@W+ zBVxcMqCjHK=pS-IIIIM9^wYv6VP04e7KJ4tC**~Kup=b&uUqSHB}ytoJV#PYpL{`i zw^6A#KZT9MD2CiYxwK!YRU?~of^sozY9$9}hUK-e7B(WA^Mja8EnzI4y24JrR8(VF z&WDYIYGbEz5F9CSQhlKA;6MB`@ta9}ny-J+<=!bl3wcyKo&}>!e`_+z*uH!qZ)jGbUdPqMJ?*CG2p%#9u)SB9tifnvG z$NHFXn~)Or@D^WvPYSZ>@q|Dv*z_2iy0PgoHiAu$v8fN69>?S9F}CH)dE4UYEq>mA zLls%?`eh@=aXuWYapZ&}mvQKDtiz5N~!iVvlqBFx**z9K>1u^lnl> zxG#1lvf4KNR)w!NP_5=&0}tV04~@x#)IG5-ae?#IfsDy7zo0($^H zR;z{iVK24LX{8VB!H>;6!Qp?Tm00s*Ghep1T0%y@f>=yzup`FYZ z?@O*%T6tSIa$z%L_TF1wCmuiV&&-i~UNcP`vx896A2G~3vCLARz#Ue_^7exQ^TJFl zDTce96X1)AB=)@L?2TD%|A=(<(<9qIDjnYTk4a|_yyYO4cN`a(k!{t(*_S=1rNi+( z5yu@Z=N0M1;v*+>XF1Z+sTnaYBOQ($#!Y&To*9?*9KAE{s&wvv7ulPh~>K_9WI{lw&&vcraTwVH!Y5SAeQfrbhvoF8PCP@-Sr&#thf9}pB6I0 zq>vTNcV9aF;Qri~`lY`i0O)s;Gk6B?3 z9}D~*;Ny1#+ve!0bmj;jzX{mpTb9m@;^X%L8z0~OnvjpUgv)uG+1`@=THxE`TP2=a z-w5z#7o}6@FYUp