mirror of
https://github.com/servo/servo.git
synced 2025-08-01 03:30:33 +01:00
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`.
This commit is contained in:
parent
9706cd497d
commit
248545ddda
11 changed files with 378 additions and 83 deletions
|
@ -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)]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue