mirror of
https://github.com/servo/servo.git
synced 2025-07-31 19:20:22 +01:00
Add support for WebGL2 uniform array operations
Adds support for the WebGL2 overloads of `uniform[1234][if]v`.
This commit is contained in:
parent
bc914381a8
commit
0650fc3199
5 changed files with 187 additions and 423 deletions
|
@ -389,7 +389,7 @@ impl WebGL2RenderingContext {
|
|||
}
|
||||
}
|
||||
|
||||
fn uniform_vec_section(
|
||||
fn uniform_vec_section_uint(
|
||||
&self,
|
||||
vec: Uint32ArrayOrUnsignedLongSequence,
|
||||
offset: u32,
|
||||
|
@ -401,35 +401,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)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1498,8 +1471,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
|
||||
|
@ -1532,7 +1511,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 => {
|
||||
|
@ -1558,8 +1537,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
|
||||
|
@ -1572,8 +1553,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
|
||||
|
@ -1582,8 +1565,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
|
||||
|
@ -1612,7 +1601,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(())
|
||||
|
@ -1629,8 +1618,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
|
||||
|
@ -1639,8 +1630,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
|
||||
|
@ -1669,7 +1666,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(())
|
||||
|
@ -1682,8 +1679,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
|
||||
|
@ -1712,7 +1715,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(())
|
||||
|
@ -1729,8 +1732,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
|
||||
|
|
|
@ -1254,6 +1254,74 @@ impl WebGLRenderingContext {
|
|||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn uniform_vec_section_int(
|
||||
&self,
|
||||
vec: Int32ArrayOrLongSequence,
|
||||
offset: u32,
|
||||
length: u32,
|
||||
uniform_size: usize,
|
||||
uniform_location: &WebGLUniformLocation,
|
||||
) -> WebGLResult<Vec<i32>> {
|
||||
let vec = match vec {
|
||||
Int32ArrayOrLongSequence::Int32Array(v) => v.to_vec(),
|
||||
Int32ArrayOrLongSequence::LongSequence(v) => v,
|
||||
};
|
||||
self.uniform_vec_section::<i32>(vec, offset, length, uniform_size, uniform_location)
|
||||
}
|
||||
|
||||
fn uniform_vec_section_float(
|
||||
&self,
|
||||
vec: Float32ArrayOrUnrestrictedFloatSequence,
|
||||
offset: u32,
|
||||
length: u32,
|
||||
uniform_size: usize,
|
||||
uniform_location: &WebGLUniformLocation,
|
||||
) -> WebGLResult<Vec<f32>> {
|
||||
let vec = match vec {
|
||||
Float32ArrayOrUnrestrictedFloatSequence::Float32Array(v) => v.to_vec(),
|
||||
Float32ArrayOrUnrestrictedFloatSequence::UnrestrictedFloatSequence(v) => v,
|
||||
};
|
||||
self.uniform_vec_section::<f32>(vec, offset, length, uniform_size, uniform_location)
|
||||
}
|
||||
|
||||
pub fn uniform_vec_section<T: Clone>(
|
||||
&self,
|
||||
vec: Vec<T>,
|
||||
offset: u32,
|
||||
length: u32,
|
||||
uniform_size: usize,
|
||||
uniform_location: &WebGLUniformLocation,
|
||||
) -> WebGLResult<Vec<T>> {
|
||||
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)
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "webgl_backtrace"))]
|
||||
|
@ -3211,7 +3279,13 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
|
|||
}
|
||||
|
||||
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10
|
||||
fn Uniform1iv(&self, location: Option<&WebGLUniformLocation>, val: Int32ArrayOrLongSequence) {
|
||||
fn Uniform1iv(
|
||||
&self,
|
||||
location: Option<&WebGLUniformLocation>,
|
||||
val: Int32ArrayOrLongSequence,
|
||||
src_offset: u32,
|
||||
src_length: u32,
|
||||
) {
|
||||
self.with_location(location, |location| {
|
||||
match location.type_() {
|
||||
constants::BOOL |
|
||||
|
@ -3220,16 +3294,9 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
|
|||
constants::SAMPLER_CUBE => {},
|
||||
_ => return Err(InvalidOperation),
|
||||
}
|
||||
let val = match val {
|
||||
Int32ArrayOrLongSequence::Int32Array(v) => v.to_vec(),
|
||||
Int32ArrayOrLongSequence::LongSequence(v) => v,
|
||||
};
|
||||
if val.is_empty() {
|
||||
return Err(InvalidValue);
|
||||
}
|
||||
if location.size().is_none() && val.len() != 1 {
|
||||
return Err(InvalidOperation);
|
||||
}
|
||||
|
||||
let val = self.uniform_vec_section_int(val, src_offset, src_length, 1, location)?;
|
||||
|
||||
match location.type_() {
|
||||
constants::SAMPLER_2D | constants::SAMPLER_CUBE => {
|
||||
for &v in val
|
||||
|
@ -3253,22 +3320,15 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
|
|||
&self,
|
||||
location: Option<&WebGLUniformLocation>,
|
||||
val: Float32ArrayOrUnrestrictedFloatSequence,
|
||||
src_offset: u32,
|
||||
src_length: u32,
|
||||
) {
|
||||
self.with_location(location, |location| {
|
||||
match location.type_() {
|
||||
constants::BOOL | constants::FLOAT => {},
|
||||
_ => return Err(InvalidOperation),
|
||||
}
|
||||
let val = match val {
|
||||
Float32ArrayOrUnrestrictedFloatSequence::Float32Array(v) => v.to_vec(),
|
||||
Float32ArrayOrUnrestrictedFloatSequence::UnrestrictedFloatSequence(v) => v,
|
||||
};
|
||||
if val.is_empty() {
|
||||
return Err(InvalidValue);
|
||||
}
|
||||
if location.size().is_none() && val.len() != 1 {
|
||||
return Err(InvalidOperation);
|
||||
}
|
||||
let val = self.uniform_vec_section_float(val, src_offset, src_length, 1, location)?;
|
||||
self.send_command(WebGLCommand::Uniform1fv(location.id(), val));
|
||||
Ok(())
|
||||
});
|
||||
|
@ -3291,22 +3351,15 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
|
|||
&self,
|
||||
location: Option<&WebGLUniformLocation>,
|
||||
val: Float32ArrayOrUnrestrictedFloatSequence,
|
||||
src_offset: u32,
|
||||
src_length: u32,
|
||||
) {
|
||||
self.with_location(location, |location| {
|
||||
match location.type_() {
|
||||
constants::BOOL_VEC2 | constants::FLOAT_VEC2 => {},
|
||||
_ => return Err(InvalidOperation),
|
||||
}
|
||||
let val = match val {
|
||||
Float32ArrayOrUnrestrictedFloatSequence::Float32Array(v) => v.to_vec(),
|
||||
Float32ArrayOrUnrestrictedFloatSequence::UnrestrictedFloatSequence(v) => v,
|
||||
};
|
||||
if val.len() < 2 || val.len() % 2 != 0 {
|
||||
return Err(InvalidValue);
|
||||
}
|
||||
if location.size().is_none() && val.len() != 2 {
|
||||
return Err(InvalidOperation);
|
||||
}
|
||||
let val = self.uniform_vec_section_float(val, src_offset, src_length, 2, location)?;
|
||||
self.send_command(WebGLCommand::Uniform2fv(location.id(), val));
|
||||
Ok(())
|
||||
});
|
||||
|
@ -3325,22 +3378,19 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
|
|||
}
|
||||
|
||||
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10
|
||||
fn Uniform2iv(&self, location: Option<&WebGLUniformLocation>, val: Int32ArrayOrLongSequence) {
|
||||
fn Uniform2iv(
|
||||
&self,
|
||||
location: Option<&WebGLUniformLocation>,
|
||||
val: Int32ArrayOrLongSequence,
|
||||
src_offset: u32,
|
||||
src_length: u32,
|
||||
) {
|
||||
self.with_location(location, |location| {
|
||||
match location.type_() {
|
||||
constants::BOOL_VEC2 | constants::INT_VEC2 => {},
|
||||
_ => return Err(InvalidOperation),
|
||||
}
|
||||
let val = match val {
|
||||
Int32ArrayOrLongSequence::Int32Array(v) => v.to_vec(),
|
||||
Int32ArrayOrLongSequence::LongSequence(v) => v,
|
||||
};
|
||||
if val.len() < 2 || val.len() % 2 != 0 {
|
||||
return Err(InvalidValue);
|
||||
}
|
||||
if location.size().is_none() && val.len() != 2 {
|
||||
return Err(InvalidOperation);
|
||||
}
|
||||
let val = self.uniform_vec_section_int(val, src_offset, src_length, 2, location)?;
|
||||
self.send_command(WebGLCommand::Uniform2iv(location.id(), val));
|
||||
Ok(())
|
||||
});
|
||||
|
@ -3363,22 +3413,15 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
|
|||
&self,
|
||||
location: Option<&WebGLUniformLocation>,
|
||||
val: Float32ArrayOrUnrestrictedFloatSequence,
|
||||
src_offset: u32,
|
||||
src_length: u32,
|
||||
) {
|
||||
self.with_location(location, |location| {
|
||||
match location.type_() {
|
||||
constants::BOOL_VEC3 | constants::FLOAT_VEC3 => {},
|
||||
_ => return Err(InvalidOperation),
|
||||
}
|
||||
let val = match val {
|
||||
Float32ArrayOrUnrestrictedFloatSequence::Float32Array(v) => v.to_vec(),
|
||||
Float32ArrayOrUnrestrictedFloatSequence::UnrestrictedFloatSequence(v) => v,
|
||||
};
|
||||
if val.len() < 3 || val.len() % 3 != 0 {
|
||||
return Err(InvalidValue);
|
||||
}
|
||||
if location.size().is_none() && val.len() != 3 {
|
||||
return Err(InvalidOperation);
|
||||
}
|
||||
let val = self.uniform_vec_section_float(val, src_offset, src_length, 3, location)?;
|
||||
self.send_command(WebGLCommand::Uniform3fv(location.id(), val));
|
||||
Ok(())
|
||||
});
|
||||
|
@ -3397,22 +3440,19 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
|
|||
}
|
||||
|
||||
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10
|
||||
fn Uniform3iv(&self, location: Option<&WebGLUniformLocation>, val: Int32ArrayOrLongSequence) {
|
||||
fn Uniform3iv(
|
||||
&self,
|
||||
location: Option<&WebGLUniformLocation>,
|
||||
val: Int32ArrayOrLongSequence,
|
||||
src_offset: u32,
|
||||
src_length: u32,
|
||||
) {
|
||||
self.with_location(location, |location| {
|
||||
match location.type_() {
|
||||
constants::BOOL_VEC3 | constants::INT_VEC3 => {},
|
||||
_ => return Err(InvalidOperation),
|
||||
}
|
||||
let val = match val {
|
||||
Int32ArrayOrLongSequence::Int32Array(v) => v.to_vec(),
|
||||
Int32ArrayOrLongSequence::LongSequence(v) => v,
|
||||
};
|
||||
if val.len() < 3 || val.len() % 3 != 0 {
|
||||
return Err(InvalidValue);
|
||||
}
|
||||
if location.size().is_none() && val.len() != 3 {
|
||||
return Err(InvalidOperation);
|
||||
}
|
||||
let val = self.uniform_vec_section_int(val, src_offset, src_length, 3, location)?;
|
||||
self.send_command(WebGLCommand::Uniform3iv(location.id(), val));
|
||||
Ok(())
|
||||
});
|
||||
|
@ -3431,22 +3471,19 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
|
|||
}
|
||||
|
||||
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10
|
||||
fn Uniform4iv(&self, location: Option<&WebGLUniformLocation>, val: Int32ArrayOrLongSequence) {
|
||||
fn Uniform4iv(
|
||||
&self,
|
||||
location: Option<&WebGLUniformLocation>,
|
||||
val: Int32ArrayOrLongSequence,
|
||||
src_offset: u32,
|
||||
src_length: u32,
|
||||
) {
|
||||
self.with_location(location, |location| {
|
||||
match location.type_() {
|
||||
constants::BOOL_VEC4 | constants::INT_VEC4 => {},
|
||||
_ => return Err(InvalidOperation),
|
||||
}
|
||||
let val = match val {
|
||||
Int32ArrayOrLongSequence::Int32Array(v) => v.to_vec(),
|
||||
Int32ArrayOrLongSequence::LongSequence(v) => v,
|
||||
};
|
||||
if val.len() < 4 || val.len() % 4 != 0 {
|
||||
return Err(InvalidValue);
|
||||
}
|
||||
if location.size().is_none() && val.len() != 4 {
|
||||
return Err(InvalidOperation);
|
||||
}
|
||||
let val = self.uniform_vec_section_int(val, src_offset, src_length, 4, location)?;
|
||||
self.send_command(WebGLCommand::Uniform4iv(location.id(), val));
|
||||
Ok(())
|
||||
});
|
||||
|
@ -3469,22 +3506,15 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
|
|||
&self,
|
||||
location: Option<&WebGLUniformLocation>,
|
||||
val: Float32ArrayOrUnrestrictedFloatSequence,
|
||||
src_offset: u32,
|
||||
src_length: u32,
|
||||
) {
|
||||
self.with_location(location, |location| {
|
||||
match location.type_() {
|
||||
constants::BOOL_VEC4 | constants::FLOAT_VEC4 => {},
|
||||
_ => return Err(InvalidOperation),
|
||||
}
|
||||
let val = match val {
|
||||
Float32ArrayOrUnrestrictedFloatSequence::Float32Array(v) => v.to_vec(),
|
||||
Float32ArrayOrUnrestrictedFloatSequence::UnrestrictedFloatSequence(v) => v,
|
||||
};
|
||||
if val.len() < 4 || val.len() % 4 != 0 {
|
||||
return Err(InvalidValue);
|
||||
}
|
||||
if location.size().is_none() && val.len() != 4 {
|
||||
return Err(InvalidOperation);
|
||||
}
|
||||
let val = self.uniform_vec_section_float(val, src_offset, src_length, 4, location)?;
|
||||
self.send_command(WebGLCommand::Uniform4fv(location.id(), val));
|
||||
Ok(())
|
||||
});
|
||||
|
|
|
@ -430,24 +430,6 @@ interface mixin WebGL2RenderingContextBase
|
|||
void uniform3ui(WebGLUniformLocation? location, GLuint v0, GLuint v1, GLuint v2);
|
||||
void uniform4ui(WebGLUniformLocation? location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
|
||||
|
||||
// void uniform1fv(WebGLUniformLocation? location, Float32List data, optional GLuint srcOffset = 0,
|
||||
// optional GLuint srcLength = 0);
|
||||
// void uniform2fv(WebGLUniformLocation? location, Float32List data, optional GLuint srcOffset = 0,
|
||||
// optional GLuint srcLength = 0);
|
||||
// void uniform3fv(WebGLUniformLocation? location, Float32List data, optional GLuint srcOffset = 0,
|
||||
// optional GLuint srcLength = 0);
|
||||
// void uniform4fv(WebGLUniformLocation? location, Float32List data, optional GLuint srcOffset = 0,
|
||||
// optional GLuint srcLength = 0);
|
||||
|
||||
// void uniform1iv(WebGLUniformLocation? location, Int32List data, optional GLuint srcOffset = 0,
|
||||
// optional GLuint srcLength = 0);
|
||||
// void uniform2iv(WebGLUniformLocation? location, Int32List data, optional GLuint srcOffset = 0,
|
||||
// optional GLuint srcLength = 0);
|
||||
// void uniform3iv(WebGLUniformLocation? location, Int32List data, optional GLuint srcOffset = 0,
|
||||
// optional GLuint srcLength = 0);
|
||||
// void uniform4iv(WebGLUniformLocation? location, Int32List data, optional GLuint srcOffset = 0,
|
||||
// optional GLuint srcLength = 0);
|
||||
|
||||
void uniform1uiv(WebGLUniformLocation? location, Uint32List data, optional GLuint srcOffset = 0,
|
||||
optional GLuint srcLength = 0);
|
||||
void uniform2uiv(WebGLUniformLocation? location, Uint32List data, optional GLuint srcOffset = 0,
|
||||
|
|
|
@ -650,15 +650,23 @@ interface mixin WebGLRenderingContextBase
|
|||
void uniform3i(WebGLUniformLocation? location, GLint x, GLint y, GLint z);
|
||||
void uniform4i(WebGLUniformLocation? location, GLint x, GLint y, GLint z, GLint w);
|
||||
|
||||
void uniform1fv(WebGLUniformLocation? location, Float32List v);
|
||||
void uniform2fv(WebGLUniformLocation? location, Float32List v);
|
||||
void uniform3fv(WebGLUniformLocation? location, Float32List v);
|
||||
void uniform4fv(WebGLUniformLocation? location, Float32List v);
|
||||
void uniform1fv(WebGLUniformLocation? location, Float32List data, optional GLuint srcOffset = 0,
|
||||
optional GLuint srcLength = 0);
|
||||
void uniform2fv(WebGLUniformLocation? location, Float32List data, optional GLuint srcOffset = 0,
|
||||
optional GLuint srcLength = 0);
|
||||
void uniform3fv(WebGLUniformLocation? location, Float32List data, optional GLuint srcOffset = 0,
|
||||
optional GLuint srcLength = 0);
|
||||
void uniform4fv(WebGLUniformLocation? location, Float32List data, optional GLuint srcOffset = 0,
|
||||
optional GLuint srcLength = 0);
|
||||
|
||||
void uniform1iv(WebGLUniformLocation? location, Int32List v);
|
||||
void uniform2iv(WebGLUniformLocation? location, Int32List v);
|
||||
void uniform3iv(WebGLUniformLocation? location, Int32List v);
|
||||
void uniform4iv(WebGLUniformLocation? location, Int32List v);
|
||||
void uniform1iv(WebGLUniformLocation? location, Int32List data, optional GLuint srcOffset = 0,
|
||||
optional GLuint srcLength = 0);
|
||||
void uniform2iv(WebGLUniformLocation? location, Int32List data, optional GLuint srcOffset = 0,
|
||||
optional GLuint srcLength = 0);
|
||||
void uniform3iv(WebGLUniformLocation? location, Int32List data, optional GLuint srcOffset = 0,
|
||||
optional GLuint srcLength = 0);
|
||||
void uniform4iv(WebGLUniformLocation? location, Int32List data, optional GLuint srcOffset = 0,
|
||||
optional GLuint srcLength = 0);
|
||||
|
||||
void uniformMatrix2fv(WebGLUniformLocation? location, GLboolean transpose, Float32List value);
|
||||
void uniformMatrix3fv(WebGLUniformLocation? location, GLboolean transpose, Float32List value);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue