diff options
author | Istvan Miklos <istvan.miklos@h-lab.eu> | 2019-09-16 10:21:50 +0200 |
---|---|---|
committer | Istvan Miklos <istvan.miklos@h-lab.eu> | 2019-10-02 12:51:32 +0200 |
commit | 248545ddda503e06bc59b5274c63a6c25da4b355 (patch) | |
tree | b1c7614309ab6d6d6eef5630d989405fe8b97631 /components/canvas_traits | |
parent | 9706cd497da0fcc30c9af04b7d3dc0d4e9d7c8fb (diff) | |
download | servo-248545ddda503e06bc59b5274c63a6c25da4b355.tar.gz servo-248545ddda503e06bc59b5274c63a6c25da4b355.zip |
Initial implementation of WebGLSync
This patch adds initial support for WebGLSync.
Note:
There is no test for the isSync, deleteSync and waitSync functions in the `conformance2/sync/sync-webgl-specific.html`.
Diffstat (limited to 'components/canvas_traits')
-rw-r--r-- | components/canvas_traits/webgl.rs | 47 |
1 files changed, 32 insertions, 15 deletions
diff --git a/components/canvas_traits/webgl.rs b/components/canvas_traits/webgl.rs index ce021b82d6d..0801ee5bd24 100644 --- a/components/canvas_traits/webgl.rs +++ b/components/canvas_traits/webgl.rs @@ -9,7 +9,7 @@ use sparkle::gl; use sparkle::gl::Gl; use std::borrow::Cow; use std::fmt; -use std::num::NonZeroU32; +use std::num::{NonZeroU32, NonZeroU64}; use std::ops::Deref; use webrender_api::{DocumentId, ImageKey, PipelineId}; use webvr_traits::WebVRPoseInformation; @@ -280,6 +280,12 @@ pub enum WebGLCommand { StencilMaskSeparate(u32, u32), StencilOp(u32, u32, u32), StencilOpSeparate(u32, u32, u32, u32), + FenceSync(WebGLSender<WebGLSyncId>), + IsSync(WebGLSyncId, WebGLSender<bool>), + ClientWaitSync(WebGLSyncId, u32, u64, WebGLSender<u32>), + WaitSync(WebGLSyncId, u32, i64), + GetSyncParameter(WebGLSyncId, u32, WebGLSender<u32>), + DeleteSync(WebGLSyncId), Hint(u32, u32), LineWidth(f32), PixelStorei(u32, i32), @@ -434,20 +440,29 @@ pub enum WebGLCommand { GetQueryState(WebGLSender<u32>, WebGLQueryId, u32), } +macro_rules! nonzero_type { + (u32) => { + NonZeroU32 + }; + (u64) => { + NonZeroU64 + }; +} + macro_rules! define_resource_id { - ($name:ident) => { + ($name:ident, $type:tt) => { #[derive(Clone, Copy, Eq, Hash, PartialEq)] - pub struct $name(NonZeroU32); + pub struct $name(nonzero_type!($type)); impl $name { #[allow(unsafe_code)] #[inline] - pub unsafe fn new(id: u32) -> Self { - $name(NonZeroU32::new_unchecked(id)) + pub unsafe fn new(id: $type) -> Self { + $name(<nonzero_type!($type)>::new_unchecked(id)) } #[inline] - pub fn get(self) -> u32 { + pub fn get(self) -> $type { self.0.get() } } @@ -458,7 +473,7 @@ macro_rules! define_resource_id { where D: ::serde::Deserializer<'de>, { - let id = u32::deserialize(deserializer)?; + let id = <$type>::deserialize(deserializer)?; if id == 0 { Err(::serde::de::Error::custom("expected a non-zero value")) } else { @@ -498,14 +513,15 @@ macro_rules! define_resource_id { }; } -define_resource_id!(WebGLBufferId); -define_resource_id!(WebGLFramebufferId); -define_resource_id!(WebGLRenderbufferId); -define_resource_id!(WebGLTextureId); -define_resource_id!(WebGLProgramId); -define_resource_id!(WebGLQueryId); -define_resource_id!(WebGLShaderId); -define_resource_id!(WebGLVertexArrayId); +define_resource_id!(WebGLBufferId, u32); +define_resource_id!(WebGLFramebufferId, u32); +define_resource_id!(WebGLRenderbufferId, u32); +define_resource_id!(WebGLTextureId, u32); +define_resource_id!(WebGLProgramId, u32); +define_resource_id!(WebGLQueryId, u32); +define_resource_id!(WebGLShaderId, u32); +define_resource_id!(WebGLSyncId, u64); +define_resource_id!(WebGLVertexArrayId, u32); #[derive( Clone, Copy, Debug, Deserialize, Eq, Hash, MallocSizeOf, Ord, PartialEq, PartialOrd, Serialize, @@ -893,6 +909,7 @@ pub struct GLLimits { pub max_varying_vectors: u32, pub max_vertex_texture_image_units: u32, pub max_vertex_uniform_vectors: u32, + pub max_client_wait_timeout_webgl: std::time::Duration, } #[derive(Clone, Copy, Debug, Deserialize, MallocSizeOf, Serialize)] |