Chromium Code Reviews| Index: Source/modules/webgl/WebGLRenderingContextBase.h |
| diff --git a/Source/modules/webgl/WebGLRenderingContextBase.h b/Source/modules/webgl/WebGLRenderingContextBase.h |
| index fb2d4636476f6c9d2c02aead671317d4d38229e3..b99767aae91eb1e0a915c71c6e34a310ff70bc6e 100644 |
| --- a/Source/modules/webgl/WebGLRenderingContextBase.h |
| +++ b/Source/modules/webgl/WebGLRenderingContextBase.h |
| @@ -121,6 +121,33 @@ struct FormatTypeCompare { |
| } |
| }; |
| +// ScopedDrawingBufferBinder is used for ReadPixels/CopyTexImage2D/CopySubImage2D to read from |
| +// a multisampled DrawingBuffer. In this situation, we need to blit to a single sampled buffer |
| +// for reading, during which the bindings could be changed and need to be recovered. |
| +class ScopedDrawingBufferBinder { |
|
yunchao
2015/08/18 05:40:16
I'd like to move ScopedDrawingBufferBinder from We
|
| + STACK_ALLOCATED(); |
| +public: |
| + ScopedDrawingBufferBinder(DrawingBuffer* drawingBuffer, WebGLFramebuffer* framebufferBinding) |
| + : m_drawingBuffer(drawingBuffer) |
| + , m_readFramebufferBinding(framebufferBinding) |
| + { |
| + // Commit DrawingBuffer if needed (e.g., for multisampling) |
| + if (!m_readFramebufferBinding && m_drawingBuffer) |
| + m_drawingBuffer->commit(); |
| + } |
| + |
| + ~ScopedDrawingBufferBinder() |
| + { |
| + // Restore DrawingBuffer if needed |
| + if (!m_readFramebufferBinding && m_drawingBuffer) |
| + m_drawingBuffer->restoreFramebufferBindings(); |
| + } |
| + |
| +private: |
| + DrawingBuffer* m_drawingBuffer; |
| + Member<WebGLFramebuffer> m_readFramebufferBinding; |
| +}; |
| + |
| class MODULES_EXPORT WebGLRenderingContextBase : public CanvasRenderingContext, public Page::MultisamplingChangedObserver { |
| WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(WebGLRenderingContextBase); |
| public: |
| @@ -249,7 +276,7 @@ public: |
| void linkProgram(WebGLProgram*); |
| void pixelStorei(GLenum pname, GLint param); |
| void polygonOffset(GLfloat factor, GLfloat units); |
| - void readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, DOMArrayBufferView* pixels); |
| + virtual void readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, DOMArrayBufferView* pixels); |
| void renderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height); |
| void sampleCoverage(GLfloat value, GLboolean invert); |
| void scissor(GLint x, GLint y, GLsizei width, GLsizei height); |
| @@ -821,6 +848,13 @@ protected: |
| // Generates INVALID_OPERATION and returns false if the combination is unsupported. |
| bool validateReadPixelsFormatTypeCombination(GLenum format, GLenum type, GLenum readBufferInternalFormat, GLenum readBufferType); |
| + // Helper function to check parameters of readPixels. Returns true if all parameters |
| + // are valid. Otherwise, generates appropriate error and returns false. |
| + bool validateReadPixelsFuncParameters(GLsizei width, GLsizei height, GLenum format, GLenum type, unsigned domArrayBufferLength, WebGLFramebuffer*& readFramebufferBinding); |
| + |
| + // Helper function to readPixels in WebGLRenderingContext and WebGL2RenderingContext |
| + void readPixelsImpl(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* data, unsigned domArrayBufferLength); |
|
Zhenyao Mo
2015/08/18 21:48:39
Just name it bufferSize, so it can cover the case
|
| + |
| virtual GLint getMaxTextureLevelForTarget(GLenum target); |
| // Helper function to check input level for functions {copy}Tex{Sub}Image. |