aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/webgl2renderingcontext.rs
diff options
context:
space:
mode:
authorIstvan <istvan.miklos@h-lab.eu>2020-03-18 10:53:23 +0100
committerIstvan <istvan.miklos@h-lab.eu>2020-03-30 13:55:01 +0200
commitbfa43fbeba1ffb1adca44d18bb22dbee81069af9 (patch)
tree8710396fb106aa65a34cff6c0a48ea0da5417e74 /components/script/dom/webgl2renderingcontext.rs
parentc3ecf2ecef36bfc35ba75442c81d54fd2bc695be (diff)
downloadservo-bfa43fbeba1ffb1adca44d18bb22dbee81069af9.tar.gz
servo-bfa43fbeba1ffb1adca44d18bb22dbee81069af9.zip
Add support for DrawRangeElements in WebGL2
Adds initial support for the WebGL2 `DrawRangeElements` call.
Diffstat (limited to 'components/script/dom/webgl2renderingcontext.rs')
-rw-r--r--components/script/dom/webgl2renderingcontext.rs68
1 files changed, 68 insertions, 0 deletions
diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs
index 03eb5e7abc2..3892d2bf320 100644
--- a/components/script/dom/webgl2renderingcontext.rs
+++ b/components/script/dom/webgl2renderingcontext.rs
@@ -189,6 +189,48 @@ impl WebGL2RenderingContext {
self.base.current_vao_webgl2()
}
+ pub fn validate_uniform_block_for_draw(&self) {
+ let program = match self.base.current_program() {
+ Some(program) => program,
+ None => return,
+ };
+ for uniform_block in program.active_uniform_blocks().iter() {
+ let data_size = uniform_block.size as usize;
+ for block in program.active_uniforms().iter() {
+ let index = match block.bind_index {
+ Some(index) => index,
+ None => continue,
+ };
+ let indexed = &self.indexed_uniform_buffer_bindings[index as usize];
+ let buffer = match indexed.buffer.get() {
+ Some(buffer) => buffer,
+ None => {
+ self.base.webgl_error(InvalidOperation);
+ return;
+ },
+ };
+ if indexed.size.get() == 0 {
+ if data_size > buffer.capacity() {
+ self.base.webgl_error(InvalidOperation);
+ return;
+ }
+ } else {
+ let start = indexed.start.get() as usize;
+ let mut size = indexed.size.get() as usize;
+ if start >= size {
+ self.base.webgl_error(InvalidOperation);
+ return;
+ }
+ size -= start;
+ if data_size > size {
+ self.base.webgl_error(InvalidOperation);
+ return;
+ }
+ }
+ }
+ }
+ }
+
pub fn base_context(&self) -> DomRoot<WebGLRenderingContext> {
DomRoot::from_ref(&*self.base)
}
@@ -1527,11 +1569,13 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext {
/// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.11
fn DrawArrays(&self, mode: u32, first: i32, count: i32) {
+ self.validate_uniform_block_for_draw();
self.base.DrawArrays(mode, first, count)
}
/// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.11
fn DrawElements(&self, mode: u32, count: i32, type_: u32, offset: i64) {
+ self.validate_uniform_block_for_draw();
self.base.DrawElements(mode, count, type_, offset)
}
@@ -2776,6 +2820,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext {
/// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.9
fn DrawArraysInstanced(&self, mode: u32, first: i32, count: i32, primcount: i32) {
+ self.validate_uniform_block_for_draw();
handle_potential_webgl_error!(
self.base,
self.base
@@ -2792,6 +2837,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext {
offset: i64,
primcount: i32,
) {
+ self.validate_uniform_block_for_draw();
handle_potential_webgl_error!(
self.base,
self.base
@@ -2800,6 +2846,28 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext {
}
/// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.9
+ fn DrawRangeElements(
+ &self,
+ mode: u32,
+ start: u32,
+ end: u32,
+ count: i32,
+ type_: u32,
+ offset: i64,
+ ) {
+ if end < start {
+ self.base.webgl_error(InvalidValue);
+ return;
+ }
+ self.validate_uniform_block_for_draw();
+ handle_potential_webgl_error!(
+ self.base,
+ self.base
+ .draw_elements_instanced(mode, count, type_, offset, 1)
+ )
+ }
+
+ /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.9
fn VertexAttribDivisor(&self, index: u32, divisor: u32) {
self.base.vertex_attrib_divisor(index, divisor);
}