aboutsummaryrefslogtreecommitdiffstats
path: root/components/canvas_traits
diff options
context:
space:
mode:
authorIstvan Miklos <istvan.miklos@h-lab.eu>2019-09-16 10:21:50 +0200
committerIstvan Miklos <istvan.miklos@h-lab.eu>2019-10-02 12:51:32 +0200
commit248545ddda503e06bc59b5274c63a6c25da4b355 (patch)
treeb1c7614309ab6d6d6eef5630d989405fe8b97631 /components/canvas_traits
parent9706cd497da0fcc30c9af04b7d3dc0d4e9d7c8fb (diff)
downloadservo-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.rs47
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)]