Explorar o código

LibWeb: Increase SkSurface's generation id when it's modified by WebGL

Skia is not aware of surface modifications done by WebGL, so we need to
manually increase generation id whenver WebGL invokes a writing
function.
Aliaksandr Kalenik hai 8 meses
pai
achega
46cbbda944

+ 5 - 0
Libraries/LibGfx/PaintingSurface.cpp

@@ -114,6 +114,11 @@ SkSurface& PaintingSurface::sk_surface() const
     return *m_impl->surface;
 }
 
+void PaintingSurface::notify_content_will_change()
+{
+    m_impl->surface->notifyContentWillChange(SkSurface::kDiscard_ContentChangeMode);
+}
+
 template<>
 sk_sp<SkImage> PaintingSurface::sk_image_snapshot() const
 {

+ 2 - 0
Libraries/LibGfx/PaintingSurface.h

@@ -34,6 +34,8 @@ public:
     void read_into_bitmap(Bitmap&);
     void write_from_bitmap(Bitmap&);
 
+    void notify_content_will_change();
+
     IntSize size() const;
     IntRect rect() const;
 

+ 5 - 0
Libraries/LibWeb/WebGL/OpenGLContext.cpp

@@ -108,6 +108,11 @@ OwnPtr<OpenGLContext> OpenGLContext::create(NonnullRefPtr<Gfx::SkiaBackendContex
 #endif
 }
 
+void OpenGLContext::notify_content_will_change()
+{
+    m_painting_surface->notify_content_will_change();
+}
+
 void OpenGLContext::clear_buffer_to_default_values()
 {
 }

+ 1 - 0
Libraries/LibWeb/WebGL/OpenGLContext.h

@@ -15,6 +15,7 @@ class OpenGLContext {
 public:
     static OwnPtr<OpenGLContext> create(NonnullRefPtr<Gfx::SkiaBackendContext>);
 
+    void notify_content_will_change();
     void clear_buffer_to_default_values();
     void allocate_painting_surface_if_needed();
 

+ 4 - 0
Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateWebGLRenderingContext.cpp

@@ -205,6 +205,10 @@ public:
     m_context->make_current();
 )~~~");
 
+        if (gl_function_modifies_framebuffer(function.name)) {
+            function_impl_generator.append("    m_context->notify_content_will_change();\n"sv);
+        }
+
         Vector<ByteString> gl_call_arguments;
         for (size_t i = 0; i < function.parameters.size(); ++i) {
             auto const& parameter = function.parameters[i];