Index: third_party/WebKit/Source/platform/graphics/gpu/DrawingBuffer.h |
diff --git a/third_party/WebKit/Source/platform/graphics/gpu/DrawingBuffer.h b/third_party/WebKit/Source/platform/graphics/gpu/DrawingBuffer.h |
index 56f1eea05f3abd78eada2f5db471b6905ff3b8e9..b99c5e7b642828a0bb305ffe29e5fbf20c79099d 100644 |
--- a/third_party/WebKit/Source/platform/graphics/gpu/DrawingBuffer.h |
+++ b/third_party/WebKit/Source/platform/graphics/gpu/DrawingBuffer.h |
@@ -232,6 +232,19 @@ class PLATFORM_EXPORT DrawingBuffer |
new_mailbox_callback_ = std::move(closure); |
} |
+ // This class helps implement correct semantics for BlitFramebuffer |
+ // when the DrawingBuffer is using a CHROMIUM image for its backing |
+ // store and RGB emulation is in use (basically, macOS only). |
+ class PLATFORM_EXPORT ScopedRGBEmulationForBlitFramebuffer { |
+ public: |
+ ScopedRGBEmulationForBlitFramebuffer(DrawingBuffer*); |
+ ~ScopedRGBEmulationForBlitFramebuffer(); |
+ |
+ private: |
+ RefPtr<DrawingBuffer> drawing_buffer_; |
+ bool doing_work_ = false; |
+ }; |
+ |
protected: // For unittests |
DrawingBuffer(std::unique_ptr<WebGraphicsContext3DProvider>, |
std::unique_ptr<Extensions3DUtil>, |
@@ -257,6 +270,7 @@ class PLATFORM_EXPORT DrawingBuffer |
Vector<RecycledBitmap> recycled_bitmaps_; |
private: |
+ friend class ScopedRGBEmulationForBlitFramebuffer; |
friend class ScopedStateRestorer; |
friend class ColorBuffer; |
@@ -317,6 +331,16 @@ class PLATFORM_EXPORT DrawingBuffer |
const GLuint image_id = 0; |
std::unique_ptr<gfx::GpuMemoryBuffer> gpu_memory_buffer; |
+ // If we're emulating an RGB back buffer using an RGBA Chromium |
+ // image (essentially macOS only), then when performing |
+ // BlitFramebuffer calls, we have to swap in an RGB texture in |
+ // place of the RGBA texture bound to the image. The reason is |
+ // that BlitFramebuffer requires the internal formats of the |
+ // source and destination to match (e.g. RGB8 on both sides). |
+ // There are bugs in the semantics of RGB8 textures in this |
+ // situation (the alpha channel is zeroed), requiring more fixups. |
+ GLuint rgb_workaround_texture_id = 0; |
+ |
// The mailbox used to send this buffer to the compositor. |
gpu::Mailbox mailbox; |
@@ -428,6 +452,11 @@ class PLATFORM_EXPORT DrawingBuffer |
// The format to use when creating a multisampled renderbuffer. |
GLenum GetMultisampledRenderbufferFormat(); |
+ // Helpers to ensure correct behavior of BlitFramebuffer when using |
+ // an emulated RGB CHROMIUM_image back buffer. |
+ bool SetupRGBEmulationForBlitFramebuffer(); |
+ void CleanupRGBEmulationForBlitFramebuffer(); |
+ |
// Weak, reset by beginDestruction. |
Client* client_ = nullptr; |
@@ -448,9 +477,9 @@ class PLATFORM_EXPORT DrawingBuffer |
std::unique_ptr<WTF::Closure> new_mailbox_callback_; |
- // The current state restorer, which is used to track state dirtying. It is in |
+ // The current state restorer, which is used to track state dirtying. It is an |
// error to dirty state shared with WebGL while there is no existing state |
- // restorer. It is also in error to instantiate two state restorers at once. |
+ // restorer. |
ScopedStateRestorer* state_restorer_ = nullptr; |
// This is used when the user requests either a depth or stencil buffer. |