diff --git a/Libraries/LibWeb/WebGL/WebGL2RenderingContextBase.idl b/Libraries/LibWeb/WebGL/WebGL2RenderingContextBase.idl index cf59f58c16b..ce4f485b7cf 100644 --- a/Libraries/LibWeb/WebGL/WebGL2RenderingContextBase.idl +++ b/Libraries/LibWeb/WebGL/WebGL2RenderingContextBase.idl @@ -420,7 +420,7 @@ interface mixin WebGL2RenderingContextBase { undefined bindBufferRange(GLenum target, GLuint index, WebGLBuffer? buffer, GLintptr offset, GLsizeiptr size); [FIXME] any getIndexedParameter(GLenum target, GLuint index); [FIXME] sequence? getUniformIndices(WebGLProgram program, sequence uniformNames); - [FIXME] any getActiveUniforms(WebGLProgram program, sequence uniformIndices, GLenum pname); + any getActiveUniforms(WebGLProgram program, sequence uniformIndices, GLenum pname); GLuint getUniformBlockIndex(WebGLProgram program, DOMString uniformBlockName); any getActiveUniformBlockParameter(WebGLProgram program, GLuint uniformBlockIndex, GLenum pname); DOMString? getActiveUniformBlockName(WebGLProgram program, GLuint uniformBlockIndex); diff --git a/Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateWebGLRenderingContext.cpp b/Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateWebGLRenderingContext.cpp index dfd5a3c81a3..33963d0d28f 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateWebGLRenderingContext.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateWebGLRenderingContext.cpp @@ -1547,6 +1547,44 @@ public: continue; } + if (function.name == "getActiveUniforms"sv) { + generate_webgl_object_handle_unwrap(function_impl_generator, "program"sv, "{}"sv); + function_impl_generator.append(R"~~~( + auto params = MUST(ByteBuffer::create_zeroed(uniform_indices.size() * sizeof(GLint))); + Span params_span(reinterpret_cast(params.data()), uniform_indices.size()); + glGetActiveUniformsiv(program_handle, uniform_indices.size(), uniform_indices.data(), pname, params_span.data()); + + Vector params_as_values; + params_as_values.ensure_capacity(params.size()); + for (GLint param : params_span) { + switch (pname) { + case GL_UNIFORM_TYPE: + params_as_values.unchecked_append(JS::Value(static_cast(param))); + break; + case GL_UNIFORM_SIZE: + params_as_values.unchecked_append(JS::Value(static_cast(param))); + break; + case GL_UNIFORM_BLOCK_INDEX: + case GL_UNIFORM_OFFSET: + case GL_UNIFORM_ARRAY_STRIDE: + case GL_UNIFORM_MATRIX_STRIDE: + params_as_values.unchecked_append(JS::Value(param)); + break; + case GL_UNIFORM_IS_ROW_MAJOR: + params_as_values.unchecked_append(JS::Value(param == GL_TRUE)); + break; + default: + dbgln("Unknown WebGL uniform parameter name in getActiveUniforms: 0x{:04x}", pname); + set_error(GL_INVALID_ENUM); + return JS::js_null(); + } + } + + return JS::Array::create_from(m_realm, params_as_values); +)~~~"); + continue; + } + if (function.name == "getActiveAttrib"sv) { generate_webgl_object_handle_unwrap(function_impl_generator, "program"sv, "{}"sv); function_impl_generator.append(R"~~~(