mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-12-08 06:09:58 +00:00
LibWeb: Implement WebGL getVertexAttrib
This also implements all allowed parameter name values for this function.
This commit is contained in:
parent
2d8b393c76
commit
a2c659ee6b
Notes:
github-actions[bot]
2025-11-01 23:55:22 +00:00
Author: https://github.com/cqundefine
Commit: a2c659ee6b
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/6663
Reviewed-by: https://github.com/gmta ✅
10 changed files with 134 additions and 1 deletions
|
|
@ -256,6 +256,11 @@ bool WebGL2RenderingContext::ext_texture_filter_anisotropic_extension_enabled()
|
|||
return !!m_ext_texture_filter_anisotropic;
|
||||
}
|
||||
|
||||
bool WebGL2RenderingContext::angle_instanced_arrays_extension_enabled() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
ReadonlySpan<WebIDL::UnsignedLong> WebGL2RenderingContext::enabled_compressed_texture_formats() const
|
||||
{
|
||||
return m_enabled_compressed_texture_formats;
|
||||
|
|
|
|||
|
|
@ -52,6 +52,7 @@ public:
|
|||
WebIDL::Long drawing_buffer_height() const;
|
||||
|
||||
virtual bool ext_texture_filter_anisotropic_extension_enabled() const override;
|
||||
virtual bool angle_instanced_arrays_extension_enabled() const override;
|
||||
virtual ReadonlySpan<WebIDL::UnsignedLong> enabled_compressed_texture_formats() const override;
|
||||
|
||||
private:
|
||||
|
|
|
|||
|
|
@ -3128,6 +3128,65 @@ GC::Root<WebGLUniformLocation> WebGL2RenderingContextImpl::get_uniform_location(
|
|||
return WebGLUniformLocation::create(m_realm, location);
|
||||
}
|
||||
|
||||
JS::Value WebGL2RenderingContextImpl::get_vertex_attrib(WebIDL::UnsignedLong index, WebIDL::UnsignedLong pname)
|
||||
{
|
||||
switch (pname) {
|
||||
case GL_CURRENT_VERTEX_ATTRIB: {
|
||||
Array<GLfloat, 4> result;
|
||||
result.fill(0);
|
||||
glGetVertexAttribfvRobustANGLE(index, GL_CURRENT_VERTEX_ATTRIB, result.size(), nullptr, result.data());
|
||||
|
||||
auto byte_buffer = MUST(ByteBuffer::copy(result.span().reinterpret<u8>()));
|
||||
auto array_buffer = JS::ArrayBuffer::create(m_realm, move(byte_buffer));
|
||||
return JS::Float32Array::create(m_realm, result.size(), array_buffer);
|
||||
}
|
||||
case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: {
|
||||
GLint handle { 0 };
|
||||
glGetVertexAttribivRobustANGLE(index, GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, 1, nullptr, &handle);
|
||||
return WebGLBuffer::create(m_realm, *this, handle);
|
||||
}
|
||||
case GL_VERTEX_ATTRIB_ARRAY_DIVISOR: {
|
||||
GLint result { 0 };
|
||||
glGetVertexAttribivRobustANGLE(index, GL_VERTEX_ATTRIB_ARRAY_DIVISOR, 1, nullptr, &result);
|
||||
return JS::Value(result);
|
||||
}
|
||||
case GL_VERTEX_ATTRIB_ARRAY_ENABLED: {
|
||||
GLint result { 0 };
|
||||
glGetVertexAttribivRobustANGLE(index, GL_VERTEX_ATTRIB_ARRAY_ENABLED, 1, nullptr, &result);
|
||||
return JS::Value(result == GL_TRUE);
|
||||
}
|
||||
case GL_VERTEX_ATTRIB_ARRAY_INTEGER: {
|
||||
GLint result { 0 };
|
||||
glGetVertexAttribivRobustANGLE(index, GL_VERTEX_ATTRIB_ARRAY_INTEGER, 1, nullptr, &result);
|
||||
return JS::Value(result == GL_TRUE);
|
||||
}
|
||||
case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED: {
|
||||
GLint result { 0 };
|
||||
glGetVertexAttribivRobustANGLE(index, GL_VERTEX_ATTRIB_ARRAY_NORMALIZED, 1, nullptr, &result);
|
||||
return JS::Value(result == GL_TRUE);
|
||||
}
|
||||
case GL_VERTEX_ATTRIB_ARRAY_SIZE: {
|
||||
GLint result { 0 };
|
||||
glGetVertexAttribivRobustANGLE(index, GL_VERTEX_ATTRIB_ARRAY_SIZE, 1, nullptr, &result);
|
||||
return JS::Value(result);
|
||||
}
|
||||
case GL_VERTEX_ATTRIB_ARRAY_STRIDE: {
|
||||
GLint result { 0 };
|
||||
glGetVertexAttribivRobustANGLE(index, GL_VERTEX_ATTRIB_ARRAY_STRIDE, 1, nullptr, &result);
|
||||
return JS::Value(result);
|
||||
}
|
||||
case GL_VERTEX_ATTRIB_ARRAY_TYPE: {
|
||||
GLint result { 0 };
|
||||
glGetVertexAttribivRobustANGLE(index, GL_VERTEX_ATTRIB_ARRAY_TYPE, 1, nullptr, &result);
|
||||
return JS::Value(result);
|
||||
}
|
||||
default:
|
||||
dbgln("Unknown WebGL vertex attrib name: 0x{:04x}", pname);
|
||||
set_error(GL_INVALID_ENUM);
|
||||
return JS::js_null();
|
||||
}
|
||||
}
|
||||
|
||||
void WebGL2RenderingContextImpl::hint(WebIDL::UnsignedLong target, WebIDL::UnsignedLong mode)
|
||||
{
|
||||
m_context->make_current();
|
||||
|
|
|
|||
|
|
@ -198,6 +198,7 @@ public:
|
|||
Optional<String> get_shader_info_log(GC::Root<WebGLShader> shader);
|
||||
Optional<String> get_shader_source(GC::Root<WebGLShader> shader);
|
||||
GC::Root<WebGLUniformLocation> get_uniform_location(GC::Root<WebGLProgram> program, String name);
|
||||
JS::Value get_vertex_attrib(WebIDL::UnsignedLong index, WebIDL::UnsignedLong pname);
|
||||
void hint(WebIDL::UnsignedLong target, WebIDL::UnsignedLong mode);
|
||||
bool is_buffer(GC::Root<WebGLBuffer> buffer);
|
||||
bool is_enabled(WebIDL::UnsignedLong cap);
|
||||
|
|
|
|||
|
|
@ -283,6 +283,11 @@ bool WebGLRenderingContext::ext_texture_filter_anisotropic_extension_enabled() c
|
|||
return !!m_ext_texture_filter_anisotropic;
|
||||
}
|
||||
|
||||
bool WebGLRenderingContext::angle_instanced_arrays_extension_enabled() const
|
||||
{
|
||||
return !!m_angle_instanced_arrays_extension;
|
||||
}
|
||||
|
||||
ReadonlySpan<WebIDL::UnsignedLong> WebGLRenderingContext::enabled_compressed_texture_formats() const
|
||||
{
|
||||
return m_enabled_compressed_texture_formats;
|
||||
|
|
|
|||
|
|
@ -51,6 +51,7 @@ public:
|
|||
WebIDL::Long drawing_buffer_height() const;
|
||||
|
||||
virtual bool ext_texture_filter_anisotropic_extension_enabled() const override;
|
||||
virtual bool angle_instanced_arrays_extension_enabled() const override;
|
||||
virtual ReadonlySpan<WebIDL::UnsignedLong> enabled_compressed_texture_formats() const override;
|
||||
|
||||
private:
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@ public:
|
|||
virtual void visit_edges(JS::Cell::Visitor&) = 0;
|
||||
virtual OpenGLContext& context() = 0;
|
||||
virtual bool ext_texture_filter_anisotropic_extension_enabled() const = 0;
|
||||
virtual bool angle_instanced_arrays_extension_enabled() const = 0;
|
||||
virtual ReadonlySpan<WebIDL::UnsignedLong> enabled_compressed_texture_formats() const = 0;
|
||||
|
||||
template<typename T>
|
||||
|
|
|
|||
|
|
@ -131,7 +131,7 @@ interface mixin WebGLRenderingContextBase {
|
|||
|
||||
WebGLUniformLocation? getUniformLocation(WebGLProgram program, DOMString name);
|
||||
|
||||
[FIXME] any getVertexAttrib(GLuint index, GLenum pname);
|
||||
any getVertexAttrib(GLuint index, GLenum pname);
|
||||
|
||||
[FIXME] GLintptr getVertexAttribOffset(GLuint index, GLenum pname);
|
||||
|
||||
|
|
|
|||
|
|
@ -1692,6 +1692,65 @@ GC::Root<WebGLUniformLocation> WebGLRenderingContextImpl::get_uniform_location(G
|
|||
return WebGLUniformLocation::create(m_realm, location);
|
||||
}
|
||||
|
||||
JS::Value WebGLRenderingContextImpl::get_vertex_attrib(WebIDL::UnsignedLong index, WebIDL::UnsignedLong pname)
|
||||
{
|
||||
switch (pname) {
|
||||
case GL_CURRENT_VERTEX_ATTRIB: {
|
||||
Array<GLfloat, 4> result;
|
||||
result.fill(0);
|
||||
glGetVertexAttribfvRobustANGLE(index, GL_CURRENT_VERTEX_ATTRIB, result.size(), nullptr, result.data());
|
||||
|
||||
auto byte_buffer = MUST(ByteBuffer::copy(result.span().reinterpret<u8>()));
|
||||
auto array_buffer = JS::ArrayBuffer::create(m_realm, move(byte_buffer));
|
||||
return JS::Float32Array::create(m_realm, result.size(), array_buffer);
|
||||
}
|
||||
case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: {
|
||||
GLint handle { 0 };
|
||||
glGetVertexAttribivRobustANGLE(index, GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, 1, nullptr, &handle);
|
||||
return WebGLBuffer::create(m_realm, *this, handle);
|
||||
}
|
||||
case GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE: {
|
||||
if (angle_instanced_arrays_extension_enabled()) {
|
||||
GLint result { 0 };
|
||||
glGetVertexAttribivRobustANGLE(index, GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE, 1, nullptr, &result);
|
||||
return JS::Value(result);
|
||||
}
|
||||
|
||||
set_error(GL_INVALID_ENUM);
|
||||
return JS::js_null();
|
||||
}
|
||||
case GL_VERTEX_ATTRIB_ARRAY_ENABLED: {
|
||||
GLint result { 0 };
|
||||
glGetVertexAttribivRobustANGLE(index, GL_VERTEX_ATTRIB_ARRAY_ENABLED, 1, nullptr, &result);
|
||||
return JS::Value(result == GL_TRUE);
|
||||
}
|
||||
case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED: {
|
||||
GLint result { 0 };
|
||||
glGetVertexAttribivRobustANGLE(index, GL_VERTEX_ATTRIB_ARRAY_NORMALIZED, 1, nullptr, &result);
|
||||
return JS::Value(result == GL_TRUE);
|
||||
}
|
||||
case GL_VERTEX_ATTRIB_ARRAY_SIZE: {
|
||||
GLint result { 0 };
|
||||
glGetVertexAttribivRobustANGLE(index, GL_VERTEX_ATTRIB_ARRAY_SIZE, 1, nullptr, &result);
|
||||
return JS::Value(result);
|
||||
}
|
||||
case GL_VERTEX_ATTRIB_ARRAY_STRIDE: {
|
||||
GLint result { 0 };
|
||||
glGetVertexAttribivRobustANGLE(index, GL_VERTEX_ATTRIB_ARRAY_STRIDE, 1, nullptr, &result);
|
||||
return JS::Value(result);
|
||||
}
|
||||
case GL_VERTEX_ATTRIB_ARRAY_TYPE: {
|
||||
GLint result { 0 };
|
||||
glGetVertexAttribivRobustANGLE(index, GL_VERTEX_ATTRIB_ARRAY_TYPE, 1, nullptr, &result);
|
||||
return JS::Value(result);
|
||||
}
|
||||
default:
|
||||
dbgln("Unknown WebGL vertex attrib name: 0x{:04x}", pname);
|
||||
set_error(GL_INVALID_ENUM);
|
||||
return JS::js_null();
|
||||
}
|
||||
}
|
||||
|
||||
void WebGLRenderingContextImpl::hint(WebIDL::UnsignedLong target, WebIDL::UnsignedLong mode)
|
||||
{
|
||||
m_context->make_current();
|
||||
|
|
|
|||
|
|
@ -113,6 +113,7 @@ public:
|
|||
Optional<String> get_shader_info_log(GC::Root<WebGLShader> shader);
|
||||
Optional<String> get_shader_source(GC::Root<WebGLShader> shader);
|
||||
GC::Root<WebGLUniformLocation> get_uniform_location(GC::Root<WebGLProgram> program, String name);
|
||||
JS::Value get_vertex_attrib(WebIDL::UnsignedLong index, WebIDL::UnsignedLong pname);
|
||||
void hint(WebIDL::UnsignedLong target, WebIDL::UnsignedLong mode);
|
||||
bool is_buffer(GC::Root<WebGLBuffer> buffer);
|
||||
bool is_enabled(WebIDL::UnsignedLong cap);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue