diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2019-10-08 11:56:11 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-10-08 11:56:11 -0400 |
commit | a7d48dca80497083e8ad6db059536fc1f3b96701 (patch) | |
tree | 05f59c87f05a835237acb51b590f87c126a5a172 /components/script/dom/webgl2renderingcontext.rs | |
parent | 26e5281bfc9c5f91ec75fde8c39480bda993a83f (diff) | |
parent | 26df1962c38421251a998b8acc7d6652116d4866 (diff) | |
download | servo-a7d48dca80497083e8ad6db059536fc1f3b96701.tar.gz servo-a7d48dca80497083e8ad6db059536fc1f3b96701.zip |
Auto merge of #24333 - mmatyas:webgl_fns_samplers, r=jdm
Add WebGLSampler support
Reference: https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.13
<!-- Please describe your changes on the following line: -->
cc @jdm @zakorgy
---
<!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `___` with appropriate data: -->
- [x] `./mach build -d` does not report any errors
- [x] `./mach test-tidy` does not report any errors
- [ ] These changes fix #___ (GitHub issue number if applicable)
<!-- Either: -->
- [x] There are tests for these changes OR
- [ ] These changes do not require tests because ___
<!-- Also, please make sure that "Allow edits from maintainers" checkbox is checked, so that we can help you if you get stuck somewhere along the way.-->
<!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. -->
<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/24333)
<!-- Reviewable:end -->
Diffstat (limited to 'components/script/dom/webgl2renderingcontext.rs')
-rw-r--r-- | components/script/dom/webgl2renderingcontext.rs | 101 |
1 files changed, 100 insertions, 1 deletions
diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index ec959177d32..63cfd0bc530 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -11,6 +11,7 @@ use crate::dom::bindings::codegen::UnionTypes::ArrayBufferViewOrArrayBuffer; use crate::dom::bindings::codegen::UnionTypes::Float32ArrayOrUnrestrictedFloatSequence; use crate::dom::bindings::codegen::UnionTypes::ImageDataOrHTMLImageElementOrHTMLCanvasElementOrHTMLVideoElement; use crate::dom::bindings::codegen::UnionTypes::Int32ArrayOrLongSequence; +use crate::dom::bindings::conversions::ToJSValConvertible; use crate::dom::bindings::error::{ErrorResult, Fallible}; use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; use crate::dom::bindings::root::{Dom, DomRoot, LayoutDom, MutNullableDom}; @@ -26,6 +27,7 @@ use crate::dom::webglrenderbuffer::WebGLRenderbuffer; use crate::dom::webglrenderingcontext::{ LayoutCanvasWebGLRenderingContextHelpers, WebGLRenderingContext, }; +use crate::dom::webglsampler::{WebGLSampler, WebGLSamplerValue}; use crate::dom::webglshader::WebGLShader; use crate::dom::webglshaderprecisionformat::WebGLShaderPrecisionFormat; use crate::dom::webglsync::WebGLSync; @@ -39,7 +41,7 @@ use canvas_traits::webgl::{webgl_channel, GLContextAttributes, WebGLCommand, Web use dom_struct::dom_struct; use euclid::default::Size2D; use js::jsapi::JSObject; -use js::jsval::{BooleanValue, Int32Value, JSVal, NullValue, UInt32Value}; +use js::jsval::{BooleanValue, DoubleValue, Int32Value, JSVal, NullValue, UInt32Value}; use js::rust::CustomAutoRooterGuard; use js::typedarray::ArrayBufferView; use script_layout_interface::HTMLCanvasDataSource; @@ -51,6 +53,7 @@ pub struct WebGL2RenderingContext { base: Dom<WebGLRenderingContext>, occlusion_query: MutNullableDom<WebGLQuery>, primitives_query: MutNullableDom<WebGLQuery>, + samplers: Box<[MutNullableDom<WebGLSampler>]>, } impl WebGL2RenderingContext { @@ -61,11 +64,18 @@ impl WebGL2RenderingContext { attrs: GLContextAttributes, ) -> Option<WebGL2RenderingContext> { let base = WebGLRenderingContext::new(window, canvas, WebGLVersion::WebGL2, size, attrs)?; + + let samplers = (0..base.limits().max_combined_texture_image_units) + .map(|_| Default::default()) + .collect::<Vec<_>>() + .into(); + Some(WebGL2RenderingContext { reflector_: Reflector::new(), base: Dom::from_ref(&*base), occlusion_query: MutNullableDom::new(None), primitives_query: MutNullableDom::new(None), + samplers: samplers, }) } @@ -130,6 +140,12 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { constants::MAX_CLIENT_WAIT_TIMEOUT_WEBGL => { Int32Value(self.base.limits().max_client_wait_timeout_webgl.as_nanos() as i32) }, + constants::SAMPLER_BINDING => unsafe { + let idx = (self.base.textures().active_unit_enum() - constants::TEXTURE0) as usize; + assert!(idx < self.samplers.len()); + let sampler = self.samplers[idx].get(); + optional_root_object_to_js_or_null!(*cx, sampler) + }, _ => self.base.GetParameter(cx, parameter), } } @@ -1099,6 +1115,32 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } } + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.13 + fn CreateSampler(&self) -> Option<DomRoot<WebGLSampler>> { + Some(WebGLSampler::new(&self.base)) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.13 + fn DeleteSampler(&self, sampler: Option<&WebGLSampler>) { + if let Some(sampler) = sampler { + handle_potential_webgl_error!(self.base, self.base.validate_ownership(sampler), return); + for slot in self.samplers.iter() { + if slot.get().map_or(false, |s| sampler == &*s) { + slot.set(None); + } + } + sampler.delete(false); + } + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.13 + fn IsSampler(&self, sampler: Option<&WebGLSampler>) -> bool { + match sampler { + Some(sampler) => self.base.validate_ownership(sampler).is_ok() && sampler.is_valid(), + None => false, + } + } + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.12 #[cfg_attr(rustfmt, rustfmt_skip)] fn BeginQuery(&self, target: u32, query: &WebGLQuery) { @@ -1321,6 +1363,63 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { sync.delete(false); } } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.13 + fn BindSampler(&self, unit: u32, sampler: Option<&WebGLSampler>) { + if let Some(sampler) = sampler { + handle_potential_webgl_error!(self.base, self.base.validate_ownership(sampler), return); + + if unit as usize >= self.samplers.len() { + self.base.webgl_error(InvalidValue); + return; + } + + let result = sampler.bind(&self.base, unit); + match result { + Ok(_) => self.samplers[unit as usize].set(Some(sampler)), + Err(error) => self.base.webgl_error(error), + } + } + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.13 + fn SamplerParameteri(&self, sampler: &WebGLSampler, pname: u32, param: i32) { + handle_potential_webgl_error!(self.base, self.base.validate_ownership(sampler), return); + let param = WebGLSamplerValue::GLenum(param as u32); + let result = sampler.set_parameter(&self.base, pname, param); + if let Err(error) = result { + self.base.webgl_error(error); + } + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.13 + fn SamplerParameterf(&self, sampler: &WebGLSampler, pname: u32, param: f32) { + handle_potential_webgl_error!(self.base, self.base.validate_ownership(sampler), return); + let param = WebGLSamplerValue::Float(param); + let result = sampler.set_parameter(&self.base, pname, param); + if let Err(error) = result { + self.base.webgl_error(error); + } + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.13 + fn GetSamplerParameter(&self, _cx: JSContext, sampler: &WebGLSampler, pname: u32) -> JSVal { + handle_potential_webgl_error!( + self.base, + self.base.validate_ownership(sampler), + return NullValue() + ); + match sampler.get_parameter(&self.base, pname) { + Ok(value) => match value { + WebGLSamplerValue::GLenum(value) => UInt32Value(value), + WebGLSamplerValue::Float(value) => DoubleValue(value as f64), + }, + Err(error) => { + self.base.webgl_error(error); + NullValue() + }, + } + } } impl LayoutCanvasWebGLRenderingContextHelpers for LayoutDom<WebGL2RenderingContext> { |