Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(725)

Unified Diff: third_party/WebKit/Source/platform/graphics/gpu/DrawingBuffer.h

Issue 1950053003: Clean up DrawingBuffer. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix completeness checks. Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 a8e739b96413bb2ba46460622d583730188d3e0d..c36a9ea2e8494ca01251b042b1bbabed31b8010d 100644
--- a/third_party/WebKit/Source/platform/graphics/gpu/DrawingBuffer.h
+++ b/third_party/WebKit/Source/platform/graphics/gpu/DrawingBuffer.h
@@ -105,7 +105,14 @@ public:
// Given the desired buffer size, provides the largest dimensions that will fit in the pixel budget.
static IntSize adjustSize(const IntSize& desiredSize, const IntSize& curSize, int maxTextureSize);
- bool reset(const IntSize&, bool wantDepthOrStencilBuffer);
+
+ // Resizes (or allocates if necessary) all buffers attached to the default
+ // framebuffer. Returns whether the operation was successful. Leaves GL
+ // bindings dirtied.
+ bool reset(const IntSize&);
+
+ // Bind the default framebuffer to |target|. |target| must be
+ // GL_FRAMEBUFFER, GL_READ_FRAMEBUFFER, or GL_DRAW_FRAMEBUFFER.
void bind(GLenum target);
IntSize size() const { return m_size; }
@@ -176,11 +183,11 @@ public:
void setIsHidden(bool);
void setFilterQuality(SkFilterQuality);
- // Indicates that the currently bound framebuffer has internalformat
- // GL_RGBA, but is emulating GL_RGB. This happens to the backbuffer when the
- // client requests alpha:False, but GL_RGB textures are unusable because of
- // driver bugs.
- bool requiresRGBEmulation();
+ // Whether the target for draw operations has format GL_RGBA, but is
+ // emulating format GL_RGB. When the target's storage is first
+ // allocated, its alpha channel must be cleared to 1. All future drawing
+ // operations must use a color mask with alpha=GL_FALSE.
+ bool requiresAlphaChannelToBePreserved();
WebLayer* platformLayer();
@@ -206,6 +213,8 @@ public:
// Otherwise, bind to the default FBO.
void restoreFramebufferBindings();
+ void restoreTextureBindings();
+
void addNewMailboxCallback(PassOwnPtr<SameThreadClosure> closure) { m_newMailboxCallback = std::move(closure); }
protected: // For unittests
@@ -215,46 +224,35 @@ protected: // For unittests
bool discardFramebufferSupported,
bool wantAlphaChannel,
bool premultipliedAlpha,
- PreserveDrawingBuffer);
+ PreserveDrawingBuffer,
+ bool wantsDepth,
+ bool wantsStencil);
- bool initialize(const IntSize&, bool wantDepthBuffer, bool wantStencilBuffer, bool useMultisampling);
+ bool initialize(const IntSize&, bool useMultisampling);
private:
+ // All parameters necessary to generate the texture that will be passed to
+ // prepareMailbox.
struct TextureParameters {
DISALLOW_NEW();
- GLenum target;
- GLenum internalColorFormat;
+ GLenum target = 0;
+ GLenum internalColorFormat = 0;
// The internal color format used when allocating storage for the
// texture. This may be different from internalColorFormat if RGB
// emulation is required.
- GLenum creationInternalColorFormat;
- GLenum colorFormat;
- GLenum internalRenderbufferFormat;
-
- TextureParameters()
- : target(0)
- , internalColorFormat(0)
- , creationInternalColorFormat(0)
- , colorFormat(0)
- , internalRenderbufferFormat(0)
- {
- }
+ GLenum creationInternalColorFormat = 0;
+ GLenum colorFormat = 0;
+ GLenum internalRenderbufferFormat = 0;
};
// If we used CHROMIUM_image as the backing storage for our buffers,
// we need to know the mapping from texture id to image.
struct TextureInfo {
DISALLOW_NEW();
- GLuint textureId;
- GLuint imageId;
+ GLuint textureId = 0;
+ GLuint imageId = 0;
TextureParameters parameters;
-
- TextureInfo()
- : textureId(0)
- , imageId(0)
- {
- }
};
struct MailboxInfo : public RefCounted<MailboxInfo> {
@@ -287,11 +285,13 @@ private:
GLuint createColorTexture(const TextureParameters&);
// Create the depth/stencil and multisample buffers, if needed.
- void createSecondaryBuffers();
- bool resizeFramebuffer(const IntSize&, bool wantDepthOrStencilBuffer);
- bool resizeMultisampleFramebuffer(const IntSize&, bool wantDepthOrStencilBuffer);
+ bool resizeMultisampleFramebuffer(const IntSize&);
void resizeDepthStencil(const IntSize&);
+ // Attempts to allocator storage for, or resize all buffers. Returns whether
+ // the operation was successful.
+ bool resizeDefaultFramebuffer(const IntSize&);
+
void clearPlatformLayer();
PassRefPtr<MailboxInfo> recycledMailbox();
@@ -336,15 +336,25 @@ private:
void resizeTextureMemory(TextureInfo*, const IntSize&);
- void attachColorBufferToCurrentFBO();
+ // Attaches |m_colorBuffer| to |m_fbo|, which is always the source for read
+ // operations.
+ void attachColorBufferToReadFramebuffer();
+
+ // Whether the WebGL client desires an explicit resolve. This is
+ // implemented by forwarding all draw operations to a multisample
+ // renderbuffer, which is resolved before any read operations or swaps.
+ bool wantExplicitResolve();
+
+ // Whether the WebGL client wants a depth or stencil buffer.
+ bool wantDepthOrStencil();
const PreserveDrawingBuffer m_preserveDrawingBuffer;
- bool m_scissorEnabled;
- GLuint m_texture2DBinding;
- GLuint m_drawFramebufferBinding;
- GLuint m_readFramebufferBinding;
- GLuint m_renderbufferBinding;
- GLenum m_activeTextureUnit;
+ bool m_scissorEnabled = false;
+ GLuint m_texture2DBinding = 0;
+ GLuint m_drawFramebufferBinding = 0;
+ GLuint m_readFramebufferBinding = 0;
+ GLuint m_renderbufferBinding = 0;
+ GLenum m_activeTextureUnit = GL_TEXTURE0;
GLfloat m_clearColor[4];
GLboolean m_colorMask[4];
@@ -352,14 +362,11 @@ private:
// Lifetime is tied to the m_contextProvider.
gpu::gles2::GLES2Interface* m_gl;
OwnPtr<Extensions3DUtil> m_extensionsUtil;
- IntSize m_size;
+ IntSize m_size = { -1, -1 };
const bool m_discardFramebufferSupported;
const bool m_wantAlphaChannel;
const bool m_premultipliedAlpha;
- bool m_hasImplicitStencilBuffer;
- GLuint m_fbo;
- // DrawingBuffer's output is double-buffered. m_colorBuffer is the back buffer.
- TextureInfo m_colorBuffer;
+ bool m_hasImplicitStencilBuffer = false;
struct FrontBufferInfo {
TextureInfo texInfo;
WebExternalTextureMailbox mailbox;
@@ -369,20 +376,38 @@ private:
OwnPtr<SameThreadClosure> m_newMailboxCallback;
// This is used when the user requests either a depth or stencil buffer.
- GLuint m_depthStencilBuffer;
+ GLuint m_depthStencilBuffer = 0;
+
+ // For explicit resolve.
+ GLuint m_intermediateFBO = 0;
+ GLuint m_intermediateRenderbuffer = 0;
+
+ // When wantsExplicitResolve() returns true, the target of all draw
+ // operations.
+ GLuint m_multisampleFBO = 0;
- // For multisampling.
- GLuint m_multisampleFBO;
- GLuint m_intermediateFBO;
- GLuint m_intermediateRenderbuffer;
- GLuint m_multisampleColorBuffer;
+ // The id of the renderbuffer storage for |m_multisampleFBO|.
+ GLuint m_multisampleRenderbuffer = 0;
+
+ // When wantsExplicitResolve() returns false, the target of all draw and
+ // read operations. When wantsExplicitResolve() returns true, the target of
+ // all read operations. A swap is performed by exchanging |m_colorBuffer|
+ // with |m_frontColorBuffer|.
+ GLuint m_fbo = 0;
+
+ // All information about the texture storage for |m_fbo|.
+ TextureInfo m_colorBuffer;
// True if our contents have been modified since the last presentation of this buffer.
- bool m_contentsChanged;
+ bool m_contentsChanged = true;
// True if commit() has been called since the last time markContentsChanged() had been called.
- bool m_contentsChangeCommitted;
- bool m_bufferClearNeeded;
+ bool m_contentsChangeCommitted = false;
+ bool m_bufferClearNeeded = false;
+
+ // Whether the client wants a depth or stencil buffer.
+ const bool m_wantDepth;
+ const bool m_wantStencil;
enum AntialiasingMode {
None,
@@ -391,14 +416,14 @@ private:
ScreenSpaceAntialiasing,
};
- AntialiasingMode m_antiAliasingMode;
+ AntialiasingMode m_antiAliasingMode = None;
- int m_maxTextureSize;
- int m_sampleCount;
- int m_packAlignment;
- bool m_destructionInProgress;
- bool m_isHidden;
- SkFilterQuality m_filterQuality;
+ int m_maxTextureSize = 0;
+ int m_sampleCount = 0;
+ int m_packAlignment = 4;
+ bool m_destructionInProgress = false;
+ bool m_isHidden = false;
+ SkFilterQuality m_filterQuality = kLow_SkFilterQuality;
OwnPtr<WebExternalTextureLayer> m_layer;

Powered by Google App Engine
This is Rietveld 408576698