diff --git a/Libraries/LibWeb/WebGL/ANGLEInstancedArrays.cpp b/Libraries/LibWeb/WebGL/ANGLEInstancedArrays.cpp index 01c1e672070..a1b1c74c2c3 100644 --- a/Libraries/LibWeb/WebGL/ANGLEInstancedArrays.cpp +++ b/Libraries/LibWeb/WebGL/ANGLEInstancedArrays.cpp @@ -8,6 +8,8 @@ #include #include #include +#include +#include #define GL_GLEXT_PROTOTYPES 1 #include @@ -17,28 +19,33 @@ namespace Web::WebGL { GC_DEFINE_ALLOCATOR(ANGLEInstancedArrays); -JS::ThrowCompletionOr> ANGLEInstancedArrays::create(JS::Realm& realm) +JS::ThrowCompletionOr> ANGLEInstancedArrays::create(JS::Realm& realm, GC::Ref context) { - return realm.create(realm); + return realm.create(realm, context); } -ANGLEInstancedArrays::ANGLEInstancedArrays(JS::Realm& realm) +ANGLEInstancedArrays::ANGLEInstancedArrays(JS::Realm& realm, GC::Ref context) : PlatformObject(realm) + , m_context(context) { + m_context->context().request_extension("GL_ANGLE_instanced_arrays"); } void ANGLEInstancedArrays::vertex_attrib_divisor_angle(GLuint index, GLuint divisor) { + m_context->context().make_current(); glVertexAttribDivisorANGLE(index, divisor); } void ANGLEInstancedArrays::draw_arrays_instanced_angle(GLenum mode, GLint first, GLsizei count, GLsizei primcount) { + m_context->context().make_current(); glDrawArraysInstancedANGLE(mode, first, count, primcount); } void ANGLEInstancedArrays::draw_elements_instanced_angle(GLenum mode, GLsizei count, GLenum type, GLintptr offset, GLsizei primcount) { + m_context->context().make_current(); glDrawElementsInstancedANGLE(mode, count, type, reinterpret_cast(offset), primcount); } @@ -48,4 +55,10 @@ void ANGLEInstancedArrays::initialize(JS::Realm& realm) WEB_SET_PROTOTYPE_FOR_INTERFACE(ANGLEInstancedArrays); } +void ANGLEInstancedArrays::visit_edges(Visitor& visitor) +{ + Base::visit_edges(visitor); + visitor.visit(m_context); +} + } diff --git a/Libraries/LibWeb/WebGL/ANGLEInstancedArrays.h b/Libraries/LibWeb/WebGL/ANGLEInstancedArrays.h index 54d40ae5e46..f2bf80a0244 100644 --- a/Libraries/LibWeb/WebGL/ANGLEInstancedArrays.h +++ b/Libraries/LibWeb/WebGL/ANGLEInstancedArrays.h @@ -17,7 +17,7 @@ class ANGLEInstancedArrays : public Bindings::PlatformObject { GC_DECLARE_ALLOCATOR(ANGLEInstancedArrays); public: - static JS::ThrowCompletionOr> create(JS::Realm&); + static JS::ThrowCompletionOr> create(JS::Realm&, GC::Ref); void draw_arrays_instanced_angle(GLenum mode, GLint first, GLsizei count, GLsizei primcount); void draw_elements_instanced_angle(GLenum mode, GLsizei count, GLenum type, GLintptr offset, GLsizei primcount); @@ -25,9 +25,12 @@ public: protected: void initialize(JS::Realm&) override; + void visit_edges(Visitor&) override; private: - ANGLEInstancedArrays(JS::Realm&); + ANGLEInstancedArrays(JS::Realm&, GC::Ref); + + GC::Ref m_context; }; } diff --git a/Libraries/LibWeb/WebGL/OpenGLContext.cpp b/Libraries/LibWeb/WebGL/OpenGLContext.cpp index 133c2e1ec83..44513299ef9 100644 --- a/Libraries/LibWeb/WebGL/OpenGLContext.cpp +++ b/Libraries/LibWeb/WebGL/OpenGLContext.cpp @@ -313,4 +313,14 @@ Vector OpenGLContext::get_supported_extensions() #endif } +void OpenGLContext::request_extension(char const* extension_name) +{ +#ifdef AK_OS_MACOS + make_current(); + glRequestExtensionANGLE(extension_name); +#else + (void)extension_name; +#endif +} + } diff --git a/Libraries/LibWeb/WebGL/OpenGLContext.h b/Libraries/LibWeb/WebGL/OpenGLContext.h index 7ec8fdafdd5..562bf447083 100644 --- a/Libraries/LibWeb/WebGL/OpenGLContext.h +++ b/Libraries/LibWeb/WebGL/OpenGLContext.h @@ -34,6 +34,7 @@ public: u32 default_renderbuffer() const; Vector get_supported_extensions(); + void request_extension(char const* extension_name); private: NonnullRefPtr m_skia_backend_context;