| 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 "modules/webgl/WebGL2RenderingContextBase.h" | 5 #include "modules/webgl/WebGL2RenderingContextBase.h" |
| 6 | 6 |
| 7 #include "bindings/modules/v8/WebGLAny.h" | 7 #include "bindings/modules/v8/WebGLAny.h" |
| 8 #include "core/frame/ImageBitmap.h" | 8 #include "core/frame/ImageBitmap.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 455 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 466 if (attachment == GL_DEPTH_STENCIL_ATTACHMENT) { | 466 if (attachment == GL_DEPTH_STENCIL_ATTACHMENT) { |
| 467 contextGL()->FramebufferTextureLayer(target, GL_DEPTH_ATTACHMENT, | 467 contextGL()->FramebufferTextureLayer(target, GL_DEPTH_ATTACHMENT, |
| 468 objectOrZero(texture), level, layer); | 468 objectOrZero(texture), level, layer); |
| 469 contextGL()->FramebufferTextureLayer(target, GL_STENCIL_ATTACHMENT, | 469 contextGL()->FramebufferTextureLayer(target, GL_STENCIL_ATTACHMENT, |
| 470 objectOrZero(texture), level, layer); | 470 objectOrZero(texture), level, layer); |
| 471 } else { | 471 } else { |
| 472 contextGL()->FramebufferTextureLayer(target, attachment, | 472 contextGL()->FramebufferTextureLayer(target, attachment, |
| 473 objectOrZero(texture), level, layer); | 473 objectOrZero(texture), level, layer); |
| 474 } | 474 } |
| 475 if (attachment == GL_DEPTH_STENCIL_ATTACHMENT) { | 475 if (attachment == GL_DEPTH_STENCIL_ATTACHMENT) { |
| 476 // On ES3, DEPTH_STENCIL_ATTACHMENT is like an alias for DEPTH_ATTACHMENT +
STENCIL_ATTACHMENT. | 476 // On ES3, DEPTH_STENCIL_ATTACHMENT is like an alias for DEPTH_ATTACHMENT + |
| 477 // We divide it here so in WebGLFramebuffer, we don't have to handle DEPTH_S
TENCIL_ATTACHMENT in WebGL 2. | 477 // STENCIL_ATTACHMENT. We divide it here so in WebGLFramebuffer, we don't |
| 478 // have to handle DEPTH_STENCIL_ATTACHMENT in WebGL 2. |
| 478 framebufferBinding->setAttachmentForBoundFramebuffer( | 479 framebufferBinding->setAttachmentForBoundFramebuffer( |
| 479 target, GL_DEPTH_ATTACHMENT, textarget, texture, level, layer); | 480 target, GL_DEPTH_ATTACHMENT, textarget, texture, level, layer); |
| 480 framebufferBinding->setAttachmentForBoundFramebuffer( | 481 framebufferBinding->setAttachmentForBoundFramebuffer( |
| 481 target, GL_STENCIL_ATTACHMENT, textarget, texture, level, layer); | 482 target, GL_STENCIL_ATTACHMENT, textarget, texture, level, layer); |
| 482 } else { | 483 } else { |
| 483 framebufferBinding->setAttachmentForBoundFramebuffer( | 484 framebufferBinding->setAttachmentForBoundFramebuffer( |
| 484 target, attachment, textarget, texture, level, layer); | 485 target, attachment, textarget, texture, level, layer); |
| 485 } | 486 } |
| 486 applyStencilTest(); | 487 applyStencilTest(); |
| 487 } | 488 } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 498 synthesizeGLError(GL_INVALID_ENUM, "getInternalformatParameter", | 499 synthesizeGLError(GL_INVALID_ENUM, "getInternalformatParameter", |
| 499 "invalid target"); | 500 "invalid target"); |
| 500 return ScriptValue::createNull(scriptState); | 501 return ScriptValue::createNull(scriptState); |
| 501 } | 502 } |
| 502 | 503 |
| 503 switch (internalformat) { | 504 switch (internalformat) { |
| 504 // Renderbuffer doesn't support unsized internal formats, | 505 // Renderbuffer doesn't support unsized internal formats, |
| 505 // though GL_RGB and GL_RGBA are color-renderable. | 506 // though GL_RGB and GL_RGBA are color-renderable. |
| 506 case GL_RGB: | 507 case GL_RGB: |
| 507 case GL_RGBA: | 508 case GL_RGBA: |
| 508 // Multisampling is not supported for signed and unsigned integer internal f
ormats. | 509 // Multisampling is not supported for signed and unsigned integer internal |
| 510 // formats. |
| 509 case GL_R8UI: | 511 case GL_R8UI: |
| 510 case GL_R8I: | 512 case GL_R8I: |
| 511 case GL_R16UI: | 513 case GL_R16UI: |
| 512 case GL_R16I: | 514 case GL_R16I: |
| 513 case GL_R32UI: | 515 case GL_R32UI: |
| 514 case GL_R32I: | 516 case GL_R32I: |
| 515 case GL_RG8UI: | 517 case GL_RG8UI: |
| 516 case GL_RG8I: | 518 case GL_RG8I: |
| 517 case GL_RG16UI: | 519 case GL_RG16UI: |
| 518 case GL_RG16I: | 520 case GL_RG16I: |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 590 GLenum target, | 592 GLenum target, |
| 591 Vector<GLenum>& attachments) { | 593 Vector<GLenum>& attachments) { |
| 592 if (!validateFramebufferTarget(target)) { | 594 if (!validateFramebufferTarget(target)) { |
| 593 synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid target"); | 595 synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid target"); |
| 594 return false; | 596 return false; |
| 595 } | 597 } |
| 596 | 598 |
| 597 WebGLFramebuffer* framebufferBinding = getFramebufferBinding(target); | 599 WebGLFramebuffer* framebufferBinding = getFramebufferBinding(target); |
| 598 ASSERT(framebufferBinding || drawingBuffer()); | 600 ASSERT(framebufferBinding || drawingBuffer()); |
| 599 if (!framebufferBinding) { | 601 if (!framebufferBinding) { |
| 600 // For the default framebuffer | 602 // For the default framebuffer, translate GL_COLOR/GL_DEPTH/GL_STENCIL. |
| 601 // Translate GL_COLOR/GL_DEPTH/GL_STENCIL, because the default framebuffer o
f WebGL is not fb 0, it is an internal fbo | 603 // The default framebuffer of WebGL is not fb 0, it is an internal fbo. |
| 602 for (size_t i = 0; i < attachments.size(); ++i) { | 604 for (size_t i = 0; i < attachments.size(); ++i) { |
| 603 switch (attachments[i]) { | 605 switch (attachments[i]) { |
| 604 case GL_COLOR: | 606 case GL_COLOR: |
| 605 attachments[i] = GL_COLOR_ATTACHMENT0; | 607 attachments[i] = GL_COLOR_ATTACHMENT0; |
| 606 break; | 608 break; |
| 607 case GL_DEPTH: | 609 case GL_DEPTH: |
| 608 attachments[i] = GL_DEPTH_ATTACHMENT; | 610 attachments[i] = GL_DEPTH_ATTACHMENT; |
| 609 break; | 611 break; |
| 610 case GL_STENCIL: | 612 case GL_STENCIL: |
| 611 attachments[i] = GL_STENCIL_ATTACHMENT; | 613 attachments[i] = GL_STENCIL_ATTACHMENT; |
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 799 const char* reason = "framebuffer incomplete"; | 801 const char* reason = "framebuffer incomplete"; |
| 800 WebGLFramebuffer* framebuffer = getReadFramebufferBinding(); | 802 WebGLFramebuffer* framebuffer = getReadFramebufferBinding(); |
| 801 if (framebuffer && | 803 if (framebuffer && |
| 802 framebuffer->checkDepthStencilStatus(&reason) != | 804 framebuffer->checkDepthStencilStatus(&reason) != |
| 803 GL_FRAMEBUFFER_COMPLETE) { | 805 GL_FRAMEBUFFER_COMPLETE) { |
| 804 synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, "readPixels", reason); | 806 synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, "readPixels", reason); |
| 805 return; | 807 return; |
| 806 } | 808 } |
| 807 | 809 |
| 808 long long size = buffer->getSize() - offset; | 810 long long size = buffer->getSize() - offset; |
| 809 // If size is negative, or size is not large enough to store pixels, those cas
es | 811 // If size is negative, or size is not large enough to store pixels, those |
| 810 // are handled by validateReadPixelsFuncParameters to generate INVALID_OPERATI
ON. | 812 // cases are handled by validateReadPixelsFuncParameters to generate |
| 813 // INVALID_OPERATION. |
| 811 if (!validateReadPixelsFuncParameters(width, height, format, type, nullptr, | 814 if (!validateReadPixelsFuncParameters(width, height, format, type, nullptr, |
| 812 size)) | 815 size)) |
| 813 return; | 816 return; |
| 814 | 817 |
| 815 clearIfComposited(); | 818 clearIfComposited(); |
| 816 | 819 |
| 817 { | 820 { |
| 818 ScopedDrawingBufferBinder binder(drawingBuffer(), framebuffer); | 821 ScopedDrawingBufferBinder binder(drawingBuffer(), framebuffer); |
| 819 contextGL()->ReadPixels(x, y, width, height, format, type, | 822 contextGL()->ReadPixels(x, y, width, height, format, type, |
| 820 reinterpret_cast<void*>(offset)); | 823 reinterpret_cast<void*>(offset)); |
| (...skipping 1526 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2347 if (!m_framebufferBinding) { | 2350 if (!m_framebufferBinding) { |
| 2348 if (n != 1) { | 2351 if (n != 1) { |
| 2349 synthesizeGLError(GL_INVALID_OPERATION, "drawBuffers", | 2352 synthesizeGLError(GL_INVALID_OPERATION, "drawBuffers", |
| 2350 "the number of buffers is not 1"); | 2353 "the number of buffers is not 1"); |
| 2351 return; | 2354 return; |
| 2352 } | 2355 } |
| 2353 if (bufs[0] != GL_BACK && bufs[0] != GL_NONE) { | 2356 if (bufs[0] != GL_BACK && bufs[0] != GL_NONE) { |
| 2354 synthesizeGLError(GL_INVALID_OPERATION, "drawBuffers", "BACK or NONE"); | 2357 synthesizeGLError(GL_INVALID_OPERATION, "drawBuffers", "BACK or NONE"); |
| 2355 return; | 2358 return; |
| 2356 } | 2359 } |
| 2357 // Because the backbuffer is simulated on all current WebKit ports, we need
to change BACK to COLOR_ATTACHMENT0. | 2360 // Because the backbuffer is simulated on all current WebKit ports, we need |
| 2361 // to change BACK to COLOR_ATTACHMENT0. |
| 2358 GLenum value = (bufs[0] == GL_BACK) ? GL_COLOR_ATTACHMENT0 : GL_NONE; | 2362 GLenum value = (bufs[0] == GL_BACK) ? GL_COLOR_ATTACHMENT0 : GL_NONE; |
| 2359 contextGL()->DrawBuffersEXT(1, &value); | 2363 contextGL()->DrawBuffersEXT(1, &value); |
| 2360 setBackDrawBuffer(bufs[0]); | 2364 setBackDrawBuffer(bufs[0]); |
| 2361 } else { | 2365 } else { |
| 2362 if (n > maxDrawBuffers()) { | 2366 if (n > maxDrawBuffers()) { |
| 2363 synthesizeGLError(GL_INVALID_VALUE, "drawBuffers", | 2367 synthesizeGLError(GL_INVALID_VALUE, "drawBuffers", |
| 2364 "more than max draw buffers"); | 2368 "more than max draw buffers"); |
| 2365 return; | 2369 return; |
| 2366 } | 2370 } |
| 2367 for (GLsizei i = 0; i < n; ++i) { | 2371 for (GLsizei i = 0; i < n; ++i) { |
| (...skipping 1760 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4128 if (isContextLost() || | 4132 if (isContextLost() || |
| 4129 !validateGetFramebufferAttachmentParameterFunc(kFunctionName, target, | 4133 !validateGetFramebufferAttachmentParameterFunc(kFunctionName, target, |
| 4130 attachment)) | 4134 attachment)) |
| 4131 return ScriptValue::createNull(scriptState); | 4135 return ScriptValue::createNull(scriptState); |
| 4132 | 4136 |
| 4133 WebGLFramebuffer* framebufferBinding = getFramebufferBinding(target); | 4137 WebGLFramebuffer* framebufferBinding = getFramebufferBinding(target); |
| 4134 ASSERT(!framebufferBinding || framebufferBinding->object()); | 4138 ASSERT(!framebufferBinding || framebufferBinding->object()); |
| 4135 | 4139 |
| 4136 // Default framebuffer (an internal fbo) | 4140 // Default framebuffer (an internal fbo) |
| 4137 if (!framebufferBinding) { | 4141 if (!framebufferBinding) { |
| 4138 // We can use creationAttributes() because in WebGL 2, they are required to
be honored. | 4142 // We can use creationAttributes() because in WebGL 2, they are required to |
| 4143 // be honored. |
| 4139 bool hasDepth = creationAttributes().depth(); | 4144 bool hasDepth = creationAttributes().depth(); |
| 4140 bool hasStencil = creationAttributes().stencil(); | 4145 bool hasStencil = creationAttributes().stencil(); |
| 4141 bool hasAlpha = creationAttributes().alpha(); | 4146 bool hasAlpha = creationAttributes().alpha(); |
| 4142 bool missingImage = (attachment == GL_DEPTH && !hasDepth) || | 4147 bool missingImage = (attachment == GL_DEPTH && !hasDepth) || |
| 4143 (attachment == GL_STENCIL && !hasStencil); | 4148 (attachment == GL_STENCIL && !hasStencil); |
| 4144 if (missingImage) { | 4149 if (missingImage) { |
| 4145 switch (pname) { | 4150 switch (pname) { |
| 4146 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: | 4151 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: |
| 4147 return WebGLAny(scriptState, GL_NONE); | 4152 return WebGLAny(scriptState, GL_NONE); |
| 4148 default: | 4153 default: |
| (...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4489 params.skipPixels = m_unpackSkipPixels; | 4494 params.skipPixels = m_unpackSkipPixels; |
| 4490 params.skipRows = m_unpackSkipRows; | 4495 params.skipRows = m_unpackSkipRows; |
| 4491 if (dimension == Tex3D) { | 4496 if (dimension == Tex3D) { |
| 4492 params.imageHeight = m_unpackImageHeight; | 4497 params.imageHeight = m_unpackImageHeight; |
| 4493 params.skipImages = m_unpackSkipImages; | 4498 params.skipImages = m_unpackSkipImages; |
| 4494 } | 4499 } |
| 4495 return params; | 4500 return params; |
| 4496 } | 4501 } |
| 4497 | 4502 |
| 4498 } // namespace blink | 4503 } // namespace blink |
| OLD | NEW |