mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-08-06 08:10:02 +00:00
LibWeb/WebGL2: Implement uniformMatrix{2,3,4}fv
This commit is contained in:
parent
3c60510896
commit
bd1cc239df
Notes:
github-actions[bot]
2024-12-14 08:10:43 +00:00
Author: https://github.com/Lubrsi
Commit: bd1cc239df
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/2905
2 changed files with 38 additions and 12 deletions
|
@ -53,9 +53,9 @@ interface mixin WebGL2RenderingContextOverloads {
|
||||||
undefined uniform3iv(WebGLUniformLocation? location, Int32List v, optional unsigned long long srcOffset = 0, optional GLuint srcLength = 0);
|
undefined uniform3iv(WebGLUniformLocation? location, Int32List v, optional unsigned long long srcOffset = 0, optional GLuint srcLength = 0);
|
||||||
undefined uniform4iv(WebGLUniformLocation? location, Int32List v, optional unsigned long long srcOffset = 0, optional GLuint srcLength = 0);
|
undefined uniform4iv(WebGLUniformLocation? location, Int32List v, optional unsigned long long srcOffset = 0, optional GLuint srcLength = 0);
|
||||||
|
|
||||||
[FIXME] undefined uniformMatrix2fv(WebGLUniformLocation? location, GLboolean transpose, Float32List data, optional unsigned long long srcOffset = 0, optional GLuint srcLength = 0);
|
undefined uniformMatrix2fv(WebGLUniformLocation? location, GLboolean transpose, Float32List data, optional unsigned long long srcOffset = 0, optional GLuint srcLength = 0);
|
||||||
[FIXME] undefined uniformMatrix3fv(WebGLUniformLocation? location, GLboolean transpose, Float32List data, optional unsigned long long srcOffset = 0, optional GLuint srcLength = 0);
|
undefined uniformMatrix3fv(WebGLUniformLocation? location, GLboolean transpose, Float32List data, optional unsigned long long srcOffset = 0, optional GLuint srcLength = 0);
|
||||||
[FIXME] undefined uniformMatrix4fv(WebGLUniformLocation? location, GLboolean transpose, Float32List data, optional unsigned long long srcOffset = 0, optional GLuint srcLength = 0);
|
undefined uniformMatrix4fv(WebGLUniformLocation? location, GLboolean transpose, Float32List data, optional unsigned long long srcOffset = 0, optional GLuint srcLength = 0);
|
||||||
|
|
||||||
// Reading back pixels
|
// Reading back pixels
|
||||||
// WebGL1:
|
// WebGL1:
|
||||||
|
|
|
@ -687,19 +687,45 @@ public:
|
||||||
if (function.name.starts_with("uniformMatrix"sv)) {
|
if (function.name.starts_with("uniformMatrix"sv)) {
|
||||||
auto number_of_matrix_elements = function.name.substring_view(13, 1);
|
auto number_of_matrix_elements = function.name.substring_view(13, 1);
|
||||||
function_impl_generator.set("number_of_matrix_elements", number_of_matrix_elements);
|
function_impl_generator.set("number_of_matrix_elements", number_of_matrix_elements);
|
||||||
function_impl_generator.append(R"~~~(
|
|
||||||
auto matrix_size = @number_of_matrix_elements@ * @number_of_matrix_elements@;
|
if (webgl_version == 1) {
|
||||||
if (value.has<Vector<float>>()) {
|
function_impl_generator.set("array_argument_name", "value");
|
||||||
auto& data = value.get<Vector<float>>();
|
} else {
|
||||||
glUniformMatrix@number_of_matrix_elements@fv(location->handle(), data.size() / matrix_size, transpose, data.data());
|
function_impl_generator.set("array_argument_name", "data");
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
auto& typed_array_base = static_cast<JS::TypedArrayBase&>(*value.get<GC::Root<WebIDL::BufferSource>>()->raw_object());
|
function_impl_generator.append(R"~~~(
|
||||||
|
auto matrix_size = @number_of_matrix_elements@ * @number_of_matrix_elements@;
|
||||||
|
float const* raw_data = nullptr;
|
||||||
|
u64 count = 0;
|
||||||
|
if (@array_argument_name@.has<Vector<float>>()) {
|
||||||
|
auto& vector_data = @array_argument_name@.get<Vector<float>>();
|
||||||
|
raw_data = vector_data.data();
|
||||||
|
count = vector_data.size() / matrix_size;
|
||||||
|
} else {
|
||||||
|
auto& typed_array_base = static_cast<JS::TypedArrayBase&>(*@array_argument_name@.get<GC::Root<WebIDL::BufferSource>>()->raw_object());
|
||||||
auto& float32_array = verify_cast<JS::Float32Array>(typed_array_base);
|
auto& float32_array = verify_cast<JS::Float32Array>(typed_array_base);
|
||||||
float const* data = float32_array.data().data();
|
raw_data = float32_array.data().data();
|
||||||
auto count = float32_array.array_length().length() / matrix_size;
|
count = float32_array.array_length().length() / matrix_size;
|
||||||
glUniformMatrix@number_of_matrix_elements@fv(location->handle(), count, transpose, data);
|
}
|
||||||
|
)~~~");
|
||||||
|
|
||||||
|
if (webgl_version == 2) {
|
||||||
|
function_impl_generator.append(R"~~~(
|
||||||
|
raw_data += src_offset;
|
||||||
|
if (src_length == 0) {
|
||||||
|
count -= src_offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (src_offset + src_length <= count) {
|
||||||
|
set_error(GL_INVALID_VALUE);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
)~~~");
|
||||||
|
}
|
||||||
|
|
||||||
|
function_impl_generator.append(R"~~~(
|
||||||
|
glUniformMatrix@number_of_matrix_elements@fv(location->handle(), count, transpose, raw_data);
|
||||||
)~~~");
|
)~~~");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue