Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "config.h" | 5 #include "config.h" |
| 6 #include "core/html/canvas/WebGL2RenderingContextBase.h" | 6 #include "core/html/canvas/WebGL2RenderingContextBase.h" |
| 7 | 7 |
| 8 #include "bindings/core/v8/WebGLAny.h" | 8 #include "bindings/core/v8/WebGLAny.h" |
| 9 #include "core/html/HTMLCanvasElement.h" | 9 #include "core/html/HTMLCanvasElement.h" |
| 10 #include "core/html/HTMLImageElement.h" | 10 #include "core/html/HTMLImageElement.h" |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 60 m_currentTransformFeedbackPrimitivesWrittenQuery = nullptr; | 60 m_currentTransformFeedbackPrimitivesWrittenQuery = nullptr; |
| 61 } | 61 } |
| 62 | 62 |
| 63 void WebGL2RenderingContextBase::initializeNewContext() | 63 void WebGL2RenderingContextBase::initializeNewContext() |
| 64 { | 64 { |
| 65 ASSERT(!isContextLost()); | 65 ASSERT(!isContextLost()); |
| 66 ASSERT(drawingBuffer()); | 66 ASSERT(drawingBuffer()); |
| 67 | 67 |
| 68 m_readFramebufferBinding = nullptr; | 68 m_readFramebufferBinding = nullptr; |
| 69 | 69 |
| 70 // set the default value of read buffer for drawing buffer | |
| 71 m_readBuffer = GL_BACK; | |
| 72 | |
| 70 m_boundCopyReadBuffer = nullptr; | 73 m_boundCopyReadBuffer = nullptr; |
| 71 m_boundCopyWriteBuffer = nullptr; | 74 m_boundCopyWriteBuffer = nullptr; |
| 72 m_boundPixelPackBuffer = nullptr; | 75 m_boundPixelPackBuffer = nullptr; |
| 73 m_boundPixelUnpackBuffer = nullptr; | 76 m_boundPixelUnpackBuffer = nullptr; |
| 74 m_boundTransformFeedbackBuffer = nullptr; | 77 m_boundTransformFeedbackBuffer = nullptr; |
| 75 m_boundUniformBuffer = nullptr; | 78 m_boundUniformBuffer = nullptr; |
| 76 | 79 |
| 77 m_currentBooleanOcclusionQuery = nullptr; | 80 m_currentBooleanOcclusionQuery = nullptr; |
| 78 m_currentTransformFeedbackPrimitivesWrittenQuery = nullptr; | 81 m_currentTransformFeedbackPrimitivesWrittenQuery = nullptr; |
| 79 | 82 |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 167 return; | 170 return; |
| 168 | 171 |
| 169 webContext()->invalidateSubFramebuffer(target, attachments.size(), attachmen ts.data(), x, y, width, height); | 172 webContext()->invalidateSubFramebuffer(target, attachments.size(), attachmen ts.data(), x, y, width, height); |
| 170 } | 173 } |
| 171 | 174 |
| 172 void WebGL2RenderingContextBase::readBuffer(GLenum mode) | 175 void WebGL2RenderingContextBase::readBuffer(GLenum mode) |
| 173 { | 176 { |
| 174 if (isContextLost()) | 177 if (isContextLost()) |
| 175 return; | 178 return; |
| 176 | 179 |
| 180 switch (mode) { | |
| 181 case GL_BACK: | |
| 182 case GL_NONE: | |
| 183 case GL_COLOR_ATTACHMENT0: | |
| 184 break; | |
| 185 default: | |
| 186 if (mode > GL_COLOR_ATTACHMENT0 | |
| 187 && mode < static_cast<GLenum>(GL_COLOR_ATTACHMENT0 + maxColorAttachm ents())) | |
| 188 break; | |
| 189 synthesizeGLError(GL_INVALID_ENUM, "readBuffer", "invalid read buffer"); | |
| 190 return; | |
| 191 } | |
| 192 | |
| 193 WebGLFramebuffer* readFramebufferBinding = getFramebufferBinding(GL_READ_FRA MEBUFFER); | |
| 194 if (!readFramebufferBinding) { | |
| 195 ASSERT(drawingBuffer()); | |
| 196 if (mode != GL_BACK && mode != GL_NONE) { | |
| 197 synthesizeGLError(GL_INVALID_OPERATION, "readBuffer", "invalid read buffer"); | |
| 198 return; | |
| 199 } | |
| 200 // translate GL_BACK to GL_COLOR_ATTACHMENT0, because the default | |
| 201 // framebuffer for WebGL is not fb 0, it is an internal fbo. | |
| 202 if (mode == GL_BACK) | |
| 203 mode = GL_COLOR_ATTACHMENT0; | |
| 204 m_readBuffer = mode; | |
|
Zhenyao Mo
2015/07/06 17:52:25
I think it's better to cache the original value he
Ken Russell (switch to Gerrit)
2015/07/06 21:19:13
I agree with Mo; it's clearer if the cache holds t
yunchao
2015/07/07 08:10:39
Yeah. Agree with you two. It should cache the orig
| |
| 205 } else { | |
| 206 if (mode == GL_BACK) { | |
| 207 synthesizeGLError(GL_INVALID_OPERATION, "readBuffer", "invalid read buffer"); | |
| 208 return; | |
| 209 } | |
| 210 readFramebufferBinding->readBuffer(mode); | |
| 211 } | |
| 177 webContext()->readBuffer(mode); | 212 webContext()->readBuffer(mode); |
| 178 } | 213 } |
| 179 | 214 |
| 180 void WebGL2RenderingContextBase::renderbufferStorageImpl( | 215 void WebGL2RenderingContextBase::renderbufferStorageImpl( |
| 181 GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsize i height, | 216 GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsize i height, |
| 182 const char* functionName) | 217 const char* functionName) |
| 183 { | 218 { |
| 184 switch (internalformat) { | 219 switch (internalformat) { |
| 185 case GL_R8UI: | 220 case GL_R8UI: |
| 186 case GL_R8I: | 221 case GL_R8I: |
| (...skipping 1583 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1770 return getIntParameter(scriptState, pname); | 1805 return getIntParameter(scriptState, pname); |
| 1771 case GL_PACK_SKIP_ROWS: | 1806 case GL_PACK_SKIP_ROWS: |
| 1772 return getIntParameter(scriptState, pname); | 1807 return getIntParameter(scriptState, pname); |
| 1773 case GL_PIXEL_PACK_BUFFER_BINDING: | 1808 case GL_PIXEL_PACK_BUFFER_BINDING: |
| 1774 return WebGLAny(scriptState, PassRefPtrWillBeRawPtr<WebGLObject>(m_bound PixelPackBuffer.get())); | 1809 return WebGLAny(scriptState, PassRefPtrWillBeRawPtr<WebGLObject>(m_bound PixelPackBuffer.get())); |
| 1775 case GL_PIXEL_UNPACK_BUFFER_BINDING: | 1810 case GL_PIXEL_UNPACK_BUFFER_BINDING: |
| 1776 return WebGLAny(scriptState, PassRefPtrWillBeRawPtr<WebGLObject>(m_bound PixelUnpackBuffer.get())); | 1811 return WebGLAny(scriptState, PassRefPtrWillBeRawPtr<WebGLObject>(m_bound PixelUnpackBuffer.get())); |
| 1777 case GL_RASTERIZER_DISCARD: | 1812 case GL_RASTERIZER_DISCARD: |
| 1778 return getBooleanParameter(scriptState, pname); | 1813 return getBooleanParameter(scriptState, pname); |
| 1779 case GL_READ_BUFFER: | 1814 case GL_READ_BUFFER: |
| 1780 return getUnsignedIntParameter(scriptState, pname); | 1815 { |
| 1816 GLint value = 0; | |
| 1817 if (!isContextLost()) { | |
| 1818 webContext()->getIntegerv(pname, &value); | |
| 1819 // translate GL_COLOR_ATTACHMENT0 to GL_BACK for the default fra mebuffer | |
| 1820 if (value == GL_COLOR_ATTACHMENT0 && !getFramebufferBinding(GL_R EAD_FRAMEBUFFER)) | |
| 1821 value = GL_BACK; | |
|
Ken Russell (switch to Gerrit)
2015/07/06 21:19:13
The point of caching m_readBuffer is so that its v
yunchao
2015/07/07 08:10:39
Done.
| |
| 1822 } | |
| 1823 return WebGLAny(scriptState, static_cast<unsigned>(value)); | |
| 1824 } | |
| 1781 case GL_READ_FRAMEBUFFER_BINDING: | 1825 case GL_READ_FRAMEBUFFER_BINDING: |
| 1782 return WebGLAny(scriptState, PassRefPtrWillBeRawPtr<WebGLObject>(m_readF ramebufferBinding.get())); | 1826 return WebGLAny(scriptState, PassRefPtrWillBeRawPtr<WebGLObject>(m_readF ramebufferBinding.get())); |
| 1783 case GL_SAMPLE_ALPHA_TO_COVERAGE: | 1827 case GL_SAMPLE_ALPHA_TO_COVERAGE: |
| 1784 return getBooleanParameter(scriptState, pname); | 1828 return getBooleanParameter(scriptState, pname); |
| 1785 case GL_SAMPLE_COVERAGE: | 1829 case GL_SAMPLE_COVERAGE: |
| 1786 return getBooleanParameter(scriptState, pname); | 1830 return getBooleanParameter(scriptState, pname); |
| 1787 // case GL_SAMPLER_BINDING WebGLSampler | 1831 // case GL_SAMPLER_BINDING WebGLSampler |
| 1788 case GL_TEXTURE_BINDING_2D_ARRAY: | 1832 case GL_TEXTURE_BINDING_2D_ARRAY: |
| 1789 return WebGLAny(scriptState, PassRefPtrWillBeRawPtr<WebGLObject>(m_textu reUnits[m_activeTextureUnit].m_texture2DArrayBinding.get())); | 1833 return WebGLAny(scriptState, PassRefPtrWillBeRawPtr<WebGLObject>(m_textu reUnits[m_activeTextureUnit].m_texture2DArrayBinding.get())); |
| 1790 case GL_TEXTURE_BINDING_3D: | 1834 case GL_TEXTURE_BINDING_3D: |
| (...skipping 433 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2224 GLenum WebGL2RenderingContextBase::boundFramebufferColorFormat() | 2268 GLenum WebGL2RenderingContextBase::boundFramebufferColorFormat() |
| 2225 { | 2269 { |
| 2226 if (m_readFramebufferBinding && m_readFramebufferBinding->object()) | 2270 if (m_readFramebufferBinding && m_readFramebufferBinding->object()) |
| 2227 return m_readFramebufferBinding->colorBufferFormat(); | 2271 return m_readFramebufferBinding->colorBufferFormat(); |
| 2228 if (m_requestedAttributes.alpha()) | 2272 if (m_requestedAttributes.alpha()) |
| 2229 return GL_RGBA; | 2273 return GL_RGBA; |
| 2230 return GL_RGB; | 2274 return GL_RGB; |
| 2231 } | 2275 } |
| 2232 | 2276 |
| 2233 } // namespace blink | 2277 } // namespace blink |
| OLD | NEW |