mirror of
https://github.com/servo/servo.git
synced 2025-08-03 04:30:10 +01:00
Auto merge of #25538 - szeged:mmatyas__webgl_fns_uniforms_p2, r=jdm
Add support for WebGL2 uniform array operations Adds support for the WebGL2 overloads of `uniform[1234][if]v`. <!-- Please describe your changes on the following line: --> WebGL2 adds two optional parameters for the `uniform[1234][if]v` functions to allow specifying input data ranges. However, because they have the same name and overlapping parameters, the Codegen cannot make a difference between their GL1 and 2 variants. As a workaround, I've added the new parameters to the WebGL1 side, which which isn't strictly what the spec says, but shouldn't break things either. (Note: Firefox devs also run into this issue: [[1](https://searchfox.org/mozilla-central/source/dom/webidl/WebGLRenderingContext.webidl#794), [2](https://bugzilla.mozilla.org/show_bug.cgi?id=1324543)]). cc @jdm @zakorgy @imiklos --- <!-- 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 - [x] There are tests for these changes <!-- 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. -->
This commit is contained in:
commit
d3b37ead0a
5 changed files with 187 additions and 423 deletions
|
@ -391,7 +391,7 @@ impl WebGL2RenderingContext {
|
|||
}
|
||||
}
|
||||
|
||||
fn uniform_vec_section(
|
||||
fn uniform_vec_section_uint(
|
||||
&self,
|
||||
vec: Uint32ArrayOrUnsignedLongSequence,
|
||||
offset: u32,
|
||||
|
@ -403,35 +403,8 @@ impl WebGL2RenderingContext {
|
|||
Uint32ArrayOrUnsignedLongSequence::Uint32Array(v) => v.to_vec(),
|
||||
Uint32ArrayOrUnsignedLongSequence::UnsignedLongSequence(v) => v,
|
||||
};
|
||||
|
||||
let offset = offset as usize;
|
||||
if offset > vec.len() {
|
||||
return Err(InvalidValue);
|
||||
}
|
||||
|
||||
let length = if length > 0 {
|
||||
length as usize
|
||||
} else {
|
||||
vec.len() - offset
|
||||
};
|
||||
if offset + length > vec.len() {
|
||||
return Err(InvalidValue);
|
||||
}
|
||||
|
||||
let vec = if offset == 0 && length == vec.len() {
|
||||
vec
|
||||
} else {
|
||||
vec[offset..offset + length].to_vec()
|
||||
};
|
||||
|
||||
if vec.len() < uniform_size || vec.len() % uniform_size != 0 {
|
||||
return Err(InvalidValue);
|
||||
}
|
||||
if uniform_location.size().is_none() && vec.len() != uniform_size {
|
||||
return Err(InvalidOperation);
|
||||
}
|
||||
|
||||
Ok(vec)
|
||||
self.base
|
||||
.uniform_vec_section::<u32>(vec, offset, length, uniform_size, uniform_location)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1515,8 +1488,14 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext {
|
|||
}
|
||||
|
||||
/// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10
|
||||
fn Uniform1iv(&self, location: Option<&WebGLUniformLocation>, v: Int32ArrayOrLongSequence) {
|
||||
self.base.Uniform1iv(location, v)
|
||||
fn Uniform1iv(
|
||||
&self,
|
||||
location: Option<&WebGLUniformLocation>,
|
||||
v: Int32ArrayOrLongSequence,
|
||||
src_offset: u32,
|
||||
src_length: u32,
|
||||
) {
|
||||
self.base.Uniform1iv(location, v, src_offset, src_length)
|
||||
}
|
||||
|
||||
// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.8
|
||||
|
@ -1549,7 +1528,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext {
|
|||
_ => return Err(InvalidOperation),
|
||||
}
|
||||
|
||||
let val = self.uniform_vec_section(val, src_offset, src_length, 1, location)?;
|
||||
let val = self.uniform_vec_section_uint(val, src_offset, src_length, 1, location)?;
|
||||
|
||||
match location.type_() {
|
||||
constants::SAMPLER_2D | constants::SAMPLER_CUBE => {
|
||||
|
@ -1575,8 +1554,10 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext {
|
|||
&self,
|
||||
location: Option<&WebGLUniformLocation>,
|
||||
v: Float32ArrayOrUnrestrictedFloatSequence,
|
||||
src_offset: u32,
|
||||
src_length: u32,
|
||||
) {
|
||||
self.base.Uniform1fv(location, v);
|
||||
self.base.Uniform1fv(location, v, src_offset, src_length);
|
||||
}
|
||||
|
||||
/// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10
|
||||
|
@ -1589,8 +1570,10 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext {
|
|||
&self,
|
||||
location: Option<&WebGLUniformLocation>,
|
||||
v: Float32ArrayOrUnrestrictedFloatSequence,
|
||||
src_offset: u32,
|
||||
src_length: u32,
|
||||
) {
|
||||
self.base.Uniform2fv(location, v);
|
||||
self.base.Uniform2fv(location, v, src_offset, src_length);
|
||||
}
|
||||
|
||||
/// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10
|
||||
|
@ -1599,8 +1582,14 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext {
|
|||
}
|
||||
|
||||
/// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10
|
||||
fn Uniform2iv(&self, location: Option<&WebGLUniformLocation>, v: Int32ArrayOrLongSequence) {
|
||||
self.base.Uniform2iv(location, v)
|
||||
fn Uniform2iv(
|
||||
&self,
|
||||
location: Option<&WebGLUniformLocation>,
|
||||
v: Int32ArrayOrLongSequence,
|
||||
src_offset: u32,
|
||||
src_length: u32,
|
||||
) {
|
||||
self.base.Uniform2iv(location, v, src_offset, src_length)
|
||||
}
|
||||
|
||||
// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.8
|
||||
|
@ -1629,7 +1618,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext {
|
|||
constants::BOOL_VEC2 | constants::UNSIGNED_INT_VEC2 => {},
|
||||
_ => return Err(InvalidOperation),
|
||||
}
|
||||
let val = self.uniform_vec_section(val, src_offset, src_length, 2, location)?;
|
||||
let val = self.uniform_vec_section_uint(val, src_offset, src_length, 2, location)?;
|
||||
self.base
|
||||
.send_command(WebGLCommand::Uniform2uiv(location.id(), val));
|
||||
Ok(())
|
||||
|
@ -1646,8 +1635,10 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext {
|
|||
&self,
|
||||
location: Option<&WebGLUniformLocation>,
|
||||
v: Float32ArrayOrUnrestrictedFloatSequence,
|
||||
src_offset: u32,
|
||||
src_length: u32,
|
||||
) {
|
||||
self.base.Uniform3fv(location, v);
|
||||
self.base.Uniform3fv(location, v, src_offset, src_length);
|
||||
}
|
||||
|
||||
/// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10
|
||||
|
@ -1656,8 +1647,14 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext {
|
|||
}
|
||||
|
||||
/// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10
|
||||
fn Uniform3iv(&self, location: Option<&WebGLUniformLocation>, v: Int32ArrayOrLongSequence) {
|
||||
self.base.Uniform3iv(location, v)
|
||||
fn Uniform3iv(
|
||||
&self,
|
||||
location: Option<&WebGLUniformLocation>,
|
||||
v: Int32ArrayOrLongSequence,
|
||||
src_offset: u32,
|
||||
src_length: u32,
|
||||
) {
|
||||
self.base.Uniform3iv(location, v, src_offset, src_length)
|
||||
}
|
||||
|
||||
// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.8
|
||||
|
@ -1686,7 +1683,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext {
|
|||
constants::BOOL_VEC3 | constants::UNSIGNED_INT_VEC3 => {},
|
||||
_ => return Err(InvalidOperation),
|
||||
}
|
||||
let val = self.uniform_vec_section(val, src_offset, src_length, 3, location)?;
|
||||
let val = self.uniform_vec_section_uint(val, src_offset, src_length, 3, location)?;
|
||||
self.base
|
||||
.send_command(WebGLCommand::Uniform3uiv(location.id(), val));
|
||||
Ok(())
|
||||
|
@ -1699,8 +1696,14 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext {
|
|||
}
|
||||
|
||||
/// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10
|
||||
fn Uniform4iv(&self, location: Option<&WebGLUniformLocation>, v: Int32ArrayOrLongSequence) {
|
||||
self.base.Uniform4iv(location, v)
|
||||
fn Uniform4iv(
|
||||
&self,
|
||||
location: Option<&WebGLUniformLocation>,
|
||||
v: Int32ArrayOrLongSequence,
|
||||
src_offset: u32,
|
||||
src_length: u32,
|
||||
) {
|
||||
self.base.Uniform4iv(location, v, src_offset, src_length)
|
||||
}
|
||||
|
||||
// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.8
|
||||
|
@ -1729,7 +1732,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext {
|
|||
constants::BOOL_VEC4 | constants::UNSIGNED_INT_VEC4 => {},
|
||||
_ => return Err(InvalidOperation),
|
||||
}
|
||||
let val = self.uniform_vec_section(val, src_offset, src_length, 4, location)?;
|
||||
let val = self.uniform_vec_section_uint(val, src_offset, src_length, 4, location)?;
|
||||
self.base
|
||||
.send_command(WebGLCommand::Uniform4uiv(location.id(), val));
|
||||
Ok(())
|
||||
|
@ -1746,8 +1749,10 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext {
|
|||
&self,
|
||||
location: Option<&WebGLUniformLocation>,
|
||||
v: Float32ArrayOrUnrestrictedFloatSequence,
|
||||
src_offset: u32,
|
||||
src_length: u32,
|
||||
) {
|
||||
self.base.Uniform4fv(location, v);
|
||||
self.base.Uniform4fv(location, v, src_offset, src_length);
|
||||
}
|
||||
|
||||
/// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue