diff --git a/Libraries/LibWeb/WebGL/WebGL2RenderingContextOverloads.idl b/Libraries/LibWeb/WebGL/WebGL2RenderingContextOverloads.idl index 58c50634347..3ed7b1b6b0f 100644 --- a/Libraries/LibWeb/WebGL/WebGL2RenderingContextOverloads.idl +++ b/Libraries/LibWeb/WebGL/WebGL2RenderingContextOverloads.idl @@ -43,15 +43,15 @@ interface mixin WebGL2RenderingContextOverloads { [FIXME] undefined compressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, GLintptr offset); [FIXME] undefined compressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,GLsizei width, GLsizei height, GLenum format, [AllowShared] ArrayBufferView srcData, optional unsigned long long srcOffset = 0, optional GLuint srcLengthOverride = 0); - [FIXME] undefined uniform1fv(WebGLUniformLocation? location, Float32List data, optional unsigned long long srcOffset = 0, optional GLuint srcLength = 0); - [FIXME] undefined uniform2fv(WebGLUniformLocation? location, Float32List data, optional unsigned long long srcOffset = 0, optional GLuint srcLength = 0); - [FIXME] undefined uniform3fv(WebGLUniformLocation? location, Float32List data, optional unsigned long long srcOffset = 0, optional GLuint srcLength = 0); - [FIXME] undefined uniform4fv(WebGLUniformLocation? location, Float32List data, optional unsigned long long srcOffset = 0, optional GLuint srcLength = 0); + undefined uniform1fv(WebGLUniformLocation? location, Float32List v, optional unsigned long long srcOffset = 0, optional GLuint srcLength = 0); + undefined uniform2fv(WebGLUniformLocation? location, Float32List v, optional unsigned long long srcOffset = 0, optional GLuint srcLength = 0); + undefined uniform3fv(WebGLUniformLocation? location, Float32List v, optional unsigned long long srcOffset = 0, optional GLuint srcLength = 0); + undefined uniform4fv(WebGLUniformLocation? location, Float32List v, optional unsigned long long srcOffset = 0, optional GLuint srcLength = 0); - [FIXME] undefined uniform1iv(WebGLUniformLocation? location, Int32List data, optional unsigned long long srcOffset = 0, optional GLuint srcLength = 0); - [FIXME] undefined uniform2iv(WebGLUniformLocation? location, Int32List data, optional unsigned long long srcOffset = 0, optional GLuint srcLength = 0); - [FIXME] undefined uniform3iv(WebGLUniformLocation? location, Int32List data, optional unsigned long long srcOffset = 0, optional GLuint srcLength = 0); - [FIXME] undefined uniform4iv(WebGLUniformLocation? location, Int32List data, optional unsigned long long srcOffset = 0, optional GLuint srcLength = 0); + undefined uniform1iv(WebGLUniformLocation? location, Int32List v, optional unsigned long long srcOffset = 0, optional GLuint srcLength = 0); + undefined uniform2iv(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); [FIXME] 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); diff --git a/Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateWebGLRenderingContext.cpp b/Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateWebGLRenderingContext.cpp index de31b332960..d875c743583 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateWebGLRenderingContext.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateWebGLRenderingContext.cpp @@ -326,7 +326,7 @@ ErrorOr serenity_main(Main::Arguments arguments) SourceGenerator implementation_file_generator { implementation_file_string_builder }; implementation_file_generator.set("class_name", class_name); - auto webgl_version = class_name == "WebGLRenderingContext" ? 1 : 2; + auto webgl_version = class_name == "WebGLRenderingContextImpl" ? 1 : 2; if (webgl_version == 1) { implementation_file_generator.append(R"~~~( #include @@ -713,17 +713,38 @@ public: } function_impl_generator.set("number_of_vector_elements", number_of_vector_elements); function_impl_generator.append(R"~~~( + @cpp_element_type@ const* data = nullptr; + size_t count = 0; if (v.has>()) { - auto& data = v.get>(); - glUniform@number_of_vector_elements@@gl_postfix@v(location->handle(), data.size() / @number_of_vector_elements@, data.data()); - return; + auto& vector = v.get>(); + data = vector.data(); + count = vector.size(); + } else if (v.has>()) { + auto& typed_array_base = static_cast(*v.get>()->raw_object()); + auto& typed_array = verify_cast(typed_array_base); + data = typed_array.data().data(); + count = typed_array.array_length().length(); + } else { + VERIFY_NOT_REACHED(); + } +)~~~"); + + if (webgl_version == 2) { + function_impl_generator.append(R"~~~( + data += src_offset; + if (src_length == 0) { + count -= src_offset; } - auto& typed_array_base = static_cast(*v.get>()->raw_object()); - auto& typed_array = verify_cast(typed_array_base); - @cpp_element_type@ const* data = typed_array.data().data(); - auto count = typed_array.array_length().length() / @number_of_vector_elements@; - glUniform@number_of_vector_elements@@gl_postfix@v(location->handle(), count, data); + if (src_offset + src_length <= count) { + set_error(GL_INVALID_VALUE); + return; + } +)~~~"); + } + + function_impl_generator.append(R"~~~( + glUniform@number_of_vector_elements@@gl_postfix@v(location->handle(), count / @number_of_vector_elements@, data); )~~~"); continue; }