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

Side by Side Diff: third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp

Issue 2389203002: reflow comments in modules/webgl (Closed)
Patch Set: Created 4 years, 2 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2009 Apple Inc. All rights reserved. 2 * Copyright (C) 2009 Apple Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 631 matching lines...) Expand 10 before | Expand all | Expand 10 after
642 Document& document = canvas->document(); 642 Document& document = canvas->document();
643 LocalFrame* frame = document.frame(); 643 LocalFrame* frame = document.frame();
644 if (!frame) { 644 if (!frame) {
645 canvas->dispatchEvent(WebGLContextEvent::create( 645 canvas->dispatchEvent(WebGLContextEvent::create(
646 EventTypeNames::webglcontextcreationerror, false, true, 646 EventTypeNames::webglcontextcreationerror, false, true,
647 "Web page was not allowed to create a WebGL context.")); 647 "Web page was not allowed to create a WebGL context."));
648 return nullptr; 648 return nullptr;
649 } 649 }
650 Settings* settings = frame->settings(); 650 Settings* settings = frame->settings();
651 651
652 // The FrameLoaderClient might block creation of a new WebGL context despite t he page settings; in 652 // The FrameLoaderClient might block creation of a new WebGL context despite
653 // particular, if WebGL contexts were lost one or more times via the GL_ARB_ro bustness extension. 653 // the page settings; in particular, if WebGL contexts were lost one or more
654 // times via the GL_ARB_robustness extension.
654 if (!frame->loader().client()->allowWebGL(settings && 655 if (!frame->loader().client()->allowWebGL(settings &&
655 settings->webGLEnabled())) { 656 settings->webGLEnabled())) {
656 canvas->dispatchEvent(WebGLContextEvent::create( 657 canvas->dispatchEvent(WebGLContextEvent::create(
657 EventTypeNames::webglcontextcreationerror, false, true, 658 EventTypeNames::webglcontextcreationerror, false, true,
658 "Web page was not allowed to create a WebGL context.")); 659 "Web page was not allowed to create a WebGL context."));
659 return nullptr; 660 return nullptr;
660 } 661 }
661 662
662 return createContextProviderInternal(canvas, nullptr, attributes, 663 return createContextProviderInternal(canvas, nullptr, attributes,
663 webGLVersion); 664 webGLVersion);
(...skipping 29 matching lines...) Expand all
693 // no HTMLCanvas associated, thrown InvalidStateError 694 // no HTMLCanvas associated, thrown InvalidStateError
694 if (getOffscreenCanvas()->getAssociatedCanvasId() == -1) { 695 if (getOffscreenCanvas()->getAssociatedCanvasId() == -1) {
695 exceptionState.throwDOMException(InvalidStateError, 696 exceptionState.throwDOMException(InvalidStateError,
696 "Commit() was called on a context whose " 697 "Commit() was called on a context whose "
697 "OffscreenCanvas is not associated with a " 698 "OffscreenCanvas is not associated with a "
698 "canvas element."); 699 "canvas element.");
699 return; 700 return;
700 } 701 }
701 if (!drawingBuffer()) 702 if (!drawingBuffer())
702 return; 703 return;
703 // TODO(crbug.com/646864): Make commit() work correctly with { preserveDrawing Buffer : true }. 704 // TODO(crbug.com/646864): Make commit() work correctly with
705 // { preserveDrawingBuffer : true }.
704 getOffscreenCanvas()->getOrCreateFrameDispatcher()->dispatchFrame( 706 getOffscreenCanvas()->getOrCreateFrameDispatcher()->dispatchFrame(
705 std::move(drawingBuffer()->transferToStaticBitmapImage())); 707 std::move(drawingBuffer()->transferToStaticBitmapImage()));
706 } 708 }
707 709
708 PassRefPtr<Image> WebGLRenderingContextBase::getImage( 710 PassRefPtr<Image> WebGLRenderingContextBase::getImage(
709 AccelerationHint hint, 711 AccelerationHint hint,
710 SnapshotReason reason) const { 712 SnapshotReason reason) const {
711 if (!drawingBuffer()) 713 if (!drawingBuffer())
712 return nullptr; 714 return nullptr;
713 715
714 drawingBuffer()->commit(); 716 drawingBuffer()->commit();
715 IntSize size = clampedCanvasSize(); 717 IntSize size = clampedCanvasSize();
716 OpacityMode opacityMode = 718 OpacityMode opacityMode =
717 creationAttributes().hasAlpha() ? NonOpaque : Opaque; 719 creationAttributes().hasAlpha() ? NonOpaque : Opaque;
718 std::unique_ptr<AcceleratedImageBufferSurface> surface = 720 std::unique_ptr<AcceleratedImageBufferSurface> surface =
719 wrapUnique(new AcceleratedImageBufferSurface(size, opacityMode)); 721 wrapUnique(new AcceleratedImageBufferSurface(size, opacityMode));
720 if (!surface->isValid()) 722 if (!surface->isValid())
721 return nullptr; 723 return nullptr;
722 std::unique_ptr<ImageBuffer> buffer = ImageBuffer::create(std::move(surface)); 724 std::unique_ptr<ImageBuffer> buffer = ImageBuffer::create(std::move(surface));
723 if (!buffer->copyRenderingResultsFromDrawingBuffer(drawingBuffer(), 725 if (!buffer->copyRenderingResultsFromDrawingBuffer(drawingBuffer(),
724 BackBuffer)) { 726 BackBuffer)) {
725 // copyRenderingResultsFromDrawingBuffer is expected to always succeed becau se we've 727 // copyRenderingResultsFromDrawingBuffer is expected to always succeed
726 // explicitly created an Accelerated surface and have already validated it. 728 // because we've explicitly created an Accelerated surface and have already
729 // validated it.
727 NOTREACHED(); 730 NOTREACHED();
728 return nullptr; 731 return nullptr;
729 } 732 }
730 return buffer->newImageSnapshot(hint, reason); 733 return buffer->newImageSnapshot(hint, reason);
731 } 734 }
732 735
733 namespace { 736 namespace {
734 737
735 // Exposed by GL_ANGLE_depth_texture 738 // Exposed by GL_ANGLE_depth_texture
736 static const GLenum kSupportedInternalFormatsOESDepthTex[] = { 739 static const GLenum kSupportedInternalFormatsOESDepthTex[] = {
(...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after
1147 convertToBaseCallback( 1150 convertToBaseCallback(
1148 WTF::bind(&WebGLRenderingContextBase::onErrorMessage, 1151 WTF::bind(&WebGLRenderingContextBase::onErrorMessage,
1149 wrapWeakPersistent(this)))); 1152 wrapWeakPersistent(this))));
1150 1153
1151 // If WebGL 2, the PRIMITIVE_RESTART_FIXED_INDEX should be always enabled. 1154 // If WebGL 2, the PRIMITIVE_RESTART_FIXED_INDEX should be always enabled.
1152 // See the section <Primitive Restart is Always Enabled> in WebGL 2 spec: 1155 // See the section <Primitive Restart is Always Enabled> in WebGL 2 spec:
1153 // https://www.khronos.org/registry/webgl/specs/latest/2.0/#4.1.4 1156 // https://www.khronos.org/registry/webgl/specs/latest/2.0/#4.1.4
1154 if (isWebGL2OrHigher()) 1157 if (isWebGL2OrHigher())
1155 contextGL()->Enable(GL_PRIMITIVE_RESTART_FIXED_INDEX); 1158 contextGL()->Enable(GL_PRIMITIVE_RESTART_FIXED_INDEX);
1156 1159
1157 // This ensures that the context has a valid "lastFlushID" and won't be mistak enly identified as the "least recently used" context. 1160 // This ensures that the context has a valid "lastFlushID" and won't be
1161 // mistakenly identified as the "least recently used" context.
1158 contextGL()->Flush(); 1162 contextGL()->Flush();
1159 1163
1160 for (int i = 0; i < WebGLExtensionNameCount; ++i) 1164 for (int i = 0; i < WebGLExtensionNameCount; ++i)
1161 m_extensionEnabled[i] = false; 1165 m_extensionEnabled[i] = false;
1162 1166
1163 m_isWebGL2FormatsTypesAdded = false; 1167 m_isWebGL2FormatsTypesAdded = false;
1164 m_isWebGL2TexImageSourceFormatsTypesAdded = false; 1168 m_isWebGL2TexImageSourceFormatsTypesAdded = false;
1165 m_isWebGL2InternalFormatsCopyTexImageAdded = false; 1169 m_isWebGL2InternalFormatsCopyTexImageAdded = false;
1166 m_isOESTextureFloatFormatsTypesAdded = false; 1170 m_isOESTextureFloatFormatsTypesAdded = false;
1167 m_isOESTextureHalfFloatFormatsTypesAdded = false; 1171 m_isOESTextureHalfFloatFormatsTypesAdded = false;
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
1203 1207
1204 void WebGLRenderingContextBase::addCompressedTextureFormat(GLenum format) { 1208 void WebGLRenderingContextBase::addCompressedTextureFormat(GLenum format) {
1205 if (!m_compressedTextureFormats.contains(format)) 1209 if (!m_compressedTextureFormats.contains(format))
1206 m_compressedTextureFormats.append(format); 1210 m_compressedTextureFormats.append(format);
1207 } 1211 }
1208 1212
1209 void WebGLRenderingContextBase::removeAllCompressedTextureFormats() { 1213 void WebGLRenderingContextBase::removeAllCompressedTextureFormats() {
1210 m_compressedTextureFormats.clear(); 1214 m_compressedTextureFormats.clear();
1211 } 1215 }
1212 1216
1213 // Helper function for V8 bindings to identify what version of WebGL a CanvasRen deringContext supports. 1217 // Helper function for V8 bindings to identify what version of WebGL a
1218 // CanvasRenderingContext supports.
1214 unsigned WebGLRenderingContextBase::getWebGLVersion( 1219 unsigned WebGLRenderingContextBase::getWebGLVersion(
1215 const CanvasRenderingContext* context) { 1220 const CanvasRenderingContext* context) {
1216 if (!context->is3d()) 1221 if (!context->is3d())
1217 return 0; 1222 return 0;
1218 return static_cast<const WebGLRenderingContextBase*>(context)->version(); 1223 return static_cast<const WebGLRenderingContextBase*>(context)->version();
1219 } 1224 }
1220 1225
1221 WebGLRenderingContextBase::~WebGLRenderingContextBase() { 1226 WebGLRenderingContextBase::~WebGLRenderingContextBase() {
1222 // Remove all references to WebGLObjects so if they are the last reference 1227 // Remove all references to WebGLObjects so if they are the last reference
1223 // they will be freed before the last context is removed from the context grou p. 1228 // they will be freed before the last context is removed from the context
1229 // group.
1224 m_boundArrayBuffer = nullptr; 1230 m_boundArrayBuffer = nullptr;
1225 m_defaultVertexArrayObject = nullptr; 1231 m_defaultVertexArrayObject = nullptr;
1226 m_boundVertexArrayObject = nullptr; 1232 m_boundVertexArrayObject = nullptr;
1227 m_currentProgram = nullptr; 1233 m_currentProgram = nullptr;
1228 m_framebufferBinding = nullptr; 1234 m_framebufferBinding = nullptr;
1229 m_renderbufferBinding = nullptr; 1235 m_renderbufferBinding = nullptr;
1230 1236
1231 // WebGLTexture shared objects will be detached and deleted 1237 // WebGLTexture shared objects will be detached and deleted
1232 // m_contextGroup->removeContext(this), which will bring about deleteTexture() calls. 1238 // m_contextGroup->removeContext(this), which will bring about deleteTexture()
1233 // We null these out to avoid accessing those members in deleteTexture(). 1239 // calls. We null these out to avoid accessing those members in
1240 // deleteTexture().
1234 for (size_t i = 0; i < m_textureUnits.size(); ++i) { 1241 for (size_t i = 0; i < m_textureUnits.size(); ++i) {
1235 m_textureUnits[i].m_texture2DBinding = nullptr; 1242 m_textureUnits[i].m_texture2DBinding = nullptr;
1236 m_textureUnits[i].m_textureCubeMapBinding = nullptr; 1243 m_textureUnits[i].m_textureCubeMapBinding = nullptr;
1237 m_textureUnits[i].m_texture3DBinding = nullptr; 1244 m_textureUnits[i].m_texture3DBinding = nullptr;
1238 m_textureUnits[i].m_texture2DArrayBinding = nullptr; 1245 m_textureUnits[i].m_texture2DArrayBinding = nullptr;
1239 } 1246 }
1240 1247
1241 detachAndRemoveAllObjects(); 1248 detachAndRemoveAllObjects();
1242 1249
1243 // Release all extensions now. 1250 // Release all extensions now.
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
1320 if (!drawingBuffer()->bufferClearNeeded() || (mask && m_framebufferBinding)) 1327 if (!drawingBuffer()->bufferClearNeeded() || (mask && m_framebufferBinding))
1321 return Skipped; 1328 return Skipped;
1322 1329
1323 Nullable<WebGLContextAttributes> contextAttributes; 1330 Nullable<WebGLContextAttributes> contextAttributes;
1324 getContextAttributes(contextAttributes); 1331 getContextAttributes(contextAttributes);
1325 if (contextAttributes.isNull()) { 1332 if (contextAttributes.isNull()) {
1326 // Unlikely, but context was lost. 1333 // Unlikely, but context was lost.
1327 return Skipped; 1334 return Skipped;
1328 } 1335 }
1329 1336
1330 // Determine if it's possible to combine the clear the user asked for and this clear. 1337 // Determine if it's possible to combine the clear the user asked for and this
1338 // clear.
1331 bool combinedClear = mask && !m_scissorEnabled; 1339 bool combinedClear = mask && !m_scissorEnabled;
1332 1340
1333 contextGL()->Disable(GL_SCISSOR_TEST); 1341 contextGL()->Disable(GL_SCISSOR_TEST);
1334 if (combinedClear && (mask & GL_COLOR_BUFFER_BIT)) { 1342 if (combinedClear && (mask & GL_COLOR_BUFFER_BIT)) {
1335 contextGL()->ClearColor(m_colorMask[0] ? m_clearColor[0] : 0, 1343 contextGL()->ClearColor(m_colorMask[0] ? m_clearColor[0] : 0,
1336 m_colorMask[1] ? m_clearColor[1] : 0, 1344 m_colorMask[1] ? m_clearColor[1] : 0,
1337 m_colorMask[2] ? m_clearColor[2] : 0, 1345 m_colorMask[2] ? m_clearColor[2] : 0,
1338 m_colorMask[3] ? m_clearColor[3] : 0); 1346 m_colorMask[3] ? m_clearColor[3] : 0);
1339 } else { 1347 } else {
1340 contextGL()->ClearColor(0, 0, 0, 0); 1348 contextGL()->ClearColor(0, 0, 0, 0);
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
1418 1426
1419 if (!canvas()->buffer()) 1427 if (!canvas()->buffer())
1420 return false; 1428 return false;
1421 1429
1422 ScopedTexture2DRestorer restorer(this); 1430 ScopedTexture2DRestorer restorer(this);
1423 ScopedFramebufferRestorer fboRestorer(this); 1431 ScopedFramebufferRestorer fboRestorer(this);
1424 1432
1425 drawingBuffer()->commit(); 1433 drawingBuffer()->commit();
1426 if (!canvas()->buffer()->copyRenderingResultsFromDrawingBuffer( 1434 if (!canvas()->buffer()->copyRenderingResultsFromDrawingBuffer(
1427 drawingBuffer(), sourceBuffer)) { 1435 drawingBuffer(), sourceBuffer)) {
1428 // Currently, copyRenderingResultsFromDrawingBuffer is expected to always su cceed because cases 1436 // Currently, copyRenderingResultsFromDrawingBuffer is expected to always
1429 // where canvas()-buffer() is not accelerated are handle before reaching thi s point. 1437 // succeed because cases where canvas()-buffer() is not accelerated are
1430 // If that assumption ever stops holding true, we may need to implement a fa llback right here. 1438 // handle before reaching this point. If that assumption ever stops holding
1439 // true, we may need to implement a fallback right here.
1431 ASSERT_NOT_REACHED(); 1440 ASSERT_NOT_REACHED();
1432 return false; 1441 return false;
1433 } 1442 }
1434 1443
1435 return true; 1444 return true;
1436 } 1445 }
1437 1446
1438 ImageData* WebGLRenderingContextBase::paintRenderingResultsToImageData( 1447 ImageData* WebGLRenderingContextBase::paintRenderingResultsToImageData(
1439 SourceDrawingBuffer sourceBuffer) { 1448 SourceDrawingBuffer sourceBuffer) {
1440 if (isContextLost()) 1449 if (isContextLost())
(...skipping 18 matching lines...) Expand all
1459 } 1468 }
1460 1469
1461 void WebGLRenderingContextBase::reshape(int width, int height) { 1470 void WebGLRenderingContextBase::reshape(int width, int height) {
1462 if (isContextLost()) 1471 if (isContextLost())
1463 return; 1472 return;
1464 1473
1465 if (isWebGL2OrHigher()) { 1474 if (isWebGL2OrHigher()) {
1466 contextGL()->BindBuffer(GL_PIXEL_UNPACK_BUFFER, 0); 1475 contextGL()->BindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
1467 } 1476 }
1468 1477
1469 // This is an approximation because at WebGLRenderingContextBase level we don' t 1478 // This is an approximation because at WebGLRenderingContextBase level we
1470 // know if the underlying FBO uses textures or renderbuffers. 1479 // don't know if the underlying FBO uses textures or renderbuffers.
1471 GLint maxSize = std::min(m_maxTextureSize, m_maxRenderbufferSize); 1480 GLint maxSize = std::min(m_maxTextureSize, m_maxRenderbufferSize);
1472 GLint maxWidth = std::min(maxSize, m_maxViewportDims[0]); 1481 GLint maxWidth = std::min(maxSize, m_maxViewportDims[0]);
1473 GLint maxHeight = std::min(maxSize, m_maxViewportDims[1]); 1482 GLint maxHeight = std::min(maxSize, m_maxViewportDims[1]);
1474 width = clamp(width, 1, maxWidth); 1483 width = clamp(width, 1, maxWidth);
1475 height = clamp(height, 1, maxHeight); 1484 height = clamp(height, 1, maxHeight);
1476 1485
1477 // Limit drawing buffer area to 4k*4k to avoid memory exhaustion. Width or hei ght may be larger than 1486 // Limit drawing buffer area to 4k*4k to avoid memory exhaustion. Width or
1478 // 4k as long as it's within the max viewport dimensions and total area remain s within the limit. 1487 // height may be larger than 4k as long as it's within the max viewport
1488 // dimensions and total area remains within the limit.
1479 // For example: 5120x2880 should be fine. 1489 // For example: 5120x2880 should be fine.
1480 const int maxArea = 4096 * 4096; 1490 const int maxArea = 4096 * 4096;
1481 int currentArea = width * height; 1491 int currentArea = width * height;
1482 if (currentArea > maxArea) { 1492 if (currentArea > maxArea) {
1483 // If we've exceeded the area limit scale the buffer down, preserving ascpec t ratio, until it fits. 1493 // If we've exceeded the area limit scale the buffer down, preserving
1494 // ascpect ratio, until it fits.
1484 float scaleFactor = 1495 float scaleFactor =
1485 sqrtf(static_cast<float>(maxArea) / static_cast<float>(currentArea)); 1496 sqrtf(static_cast<float>(maxArea) / static_cast<float>(currentArea));
1486 width = std::max(1, static_cast<int>(width * scaleFactor)); 1497 width = std::max(1, static_cast<int>(width * scaleFactor));
1487 height = std::max(1, static_cast<int>(height * scaleFactor)); 1498 height = std::max(1, static_cast<int>(height * scaleFactor));
1488 } 1499 }
1489 1500
1490 // We don't have to mark the canvas as dirty, since the newly created image bu ffer will also start off 1501 // We don't have to mark the canvas as dirty, since the newly created image
1491 // clear (and this matches what reshape will do). 1502 // buffer will also start off clear (and this matches what reshape will do).
1492 drawingBuffer()->reset(IntSize(width, height)); 1503 drawingBuffer()->reset(IntSize(width, height));
1493 restoreStateAfterClear(); 1504 restoreStateAfterClear();
1494 1505
1495 contextGL()->BindTexture( 1506 contextGL()->BindTexture(
1496 GL_TEXTURE_2D, 1507 GL_TEXTURE_2D,
1497 objectOrZero( 1508 objectOrZero(
1498 m_textureUnits[m_activeTextureUnit].m_texture2DBinding.get())); 1509 m_textureUnits[m_activeTextureUnit].m_texture2DBinding.get()));
1499 contextGL()->BindRenderbuffer(GL_RENDERBUFFER, 1510 contextGL()->BindRenderbuffer(GL_RENDERBUFFER,
1500 objectOrZero(m_renderbufferBinding.get())); 1511 objectOrZero(m_renderbufferBinding.get()));
1501 drawingBuffer()->restoreFramebufferBindings(); 1512 drawingBuffer()->restoreFramebufferBindings();
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after
1694 synthesizeGLError(GL_INVALID_ENUM, "bindTexture", "invalid target"); 1705 synthesizeGLError(GL_INVALID_ENUM, "bindTexture", "invalid target");
1695 return; 1706 return;
1696 } 1707 }
1697 1708
1698 contextGL()->BindTexture(target, objectOrZero(texture)); 1709 contextGL()->BindTexture(target, objectOrZero(texture));
1699 if (texture) { 1710 if (texture) {
1700 texture->setTarget(target); 1711 texture->setTarget(target);
1701 m_onePlusMaxNonDefaultTextureUnit = 1712 m_onePlusMaxNonDefaultTextureUnit =
1702 max(m_activeTextureUnit + 1, m_onePlusMaxNonDefaultTextureUnit); 1713 max(m_activeTextureUnit + 1, m_onePlusMaxNonDefaultTextureUnit);
1703 } else { 1714 } else {
1704 // If the disabled index is the current maximum, trace backwards to find the new max enabled texture index 1715 // If the disabled index is the current maximum, trace backwards to find the
1716 // new max enabled texture index
1705 if (m_onePlusMaxNonDefaultTextureUnit == m_activeTextureUnit + 1) { 1717 if (m_onePlusMaxNonDefaultTextureUnit == m_activeTextureUnit + 1) {
1706 findNewMaxNonDefaultTextureUnit(); 1718 findNewMaxNonDefaultTextureUnit();
1707 } 1719 }
1708 } 1720 }
1709 1721
1710 // Note: previously we used to automatically set the TEXTURE_WRAP_R 1722 // Note: previously we used to automatically set the TEXTURE_WRAP_R
1711 // repeat mode to CLAMP_TO_EDGE for cube map textures, because OpenGL 1723 // repeat mode to CLAMP_TO_EDGE for cube map textures, because OpenGL
1712 // ES 2.0 doesn't expose this flag (a bug in the specification) and 1724 // ES 2.0 doesn't expose this flag (a bug in the specification) and
1713 // otherwise the application has no control over the seams in this 1725 // otherwise the application has no control over the seams in this
1714 // dimension. However, it appears that supporting this properly on all 1726 // dimension. However, it appears that supporting this properly on all
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
1905 m_framebufferBinding->checkDepthStencilStatus(&reason) != 1917 m_framebufferBinding->checkDepthStencilStatus(&reason) !=
1906 GL_FRAMEBUFFER_COMPLETE) { 1918 GL_FRAMEBUFFER_COMPLETE) {
1907 synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, "clear", reason); 1919 synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, "clear", reason);
1908 return; 1920 return;
1909 } 1921 }
1910 1922
1911 ScopedRGBEmulationColorMask emulationColorMask(contextGL(), m_colorMask, 1923 ScopedRGBEmulationColorMask emulationColorMask(contextGL(), m_colorMask,
1912 m_drawingBuffer.get()); 1924 m_drawingBuffer.get());
1913 1925
1914 if (clearIfComposited(mask) != CombinedClear) { 1926 if (clearIfComposited(mask) != CombinedClear) {
1915 // If clearing the default back buffer's depth buffer, also clear the stenci l buffer, if one 1927 // If clearing the default back buffer's depth buffer, also clear the
1916 // was allocated implicitly. This avoids performance problems on some GPUs. 1928 // stencil buffer, if one was allocated implicitly. This avoids performance
1929 // problems on some GPUs.
1917 if (!m_framebufferBinding && drawingBuffer()->hasImplicitStencilBuffer() && 1930 if (!m_framebufferBinding && drawingBuffer()->hasImplicitStencilBuffer() &&
1918 (mask & GL_DEPTH_BUFFER_BIT)) { 1931 (mask & GL_DEPTH_BUFFER_BIT)) {
1919 // It shouldn't matter what value it's cleared to, since in other queries in the API, we 1932 // It shouldn't matter what value it's cleared to, since in other queries
1920 // claim that the stencil buffer doesn't exist. 1933 // in the API, we claim that the stencil buffer doesn't exist.
1921 mask |= GL_STENCIL_BUFFER_BIT; 1934 mask |= GL_STENCIL_BUFFER_BIT;
1922 } 1935 }
1923 contextGL()->Clear(mask); 1936 contextGL()->Clear(mask);
1924 } 1937 }
1925 markContextChanged(CanvasChanged); 1938 markContextChanged(CanvasChanged);
1926 } 1939 }
1927 1940
1928 void WebGLRenderingContextBase::clearColor(GLfloat r, 1941 void WebGLRenderingContextBase::clearColor(GLfloat r,
1929 GLfloat g, 1942 GLfloat g,
1930 GLfloat b, 1943 GLfloat b,
(...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after
2255 } 2268 }
2256 } 2269 }
2257 } 2270 }
2258 if (m_framebufferBinding) 2271 if (m_framebufferBinding)
2259 m_framebufferBinding->removeAttachmentFromBoundFramebuffer(GL_FRAMEBUFFER, 2272 m_framebufferBinding->removeAttachmentFromBoundFramebuffer(GL_FRAMEBUFFER,
2260 texture); 2273 texture);
2261 if (getFramebufferBinding(GL_READ_FRAMEBUFFER)) 2274 if (getFramebufferBinding(GL_READ_FRAMEBUFFER))
2262 getFramebufferBinding(GL_READ_FRAMEBUFFER) 2275 getFramebufferBinding(GL_READ_FRAMEBUFFER)
2263 ->removeAttachmentFromBoundFramebuffer(GL_READ_FRAMEBUFFER, texture); 2276 ->removeAttachmentFromBoundFramebuffer(GL_READ_FRAMEBUFFER, texture);
2264 2277
2265 // If the deleted was bound to the the current maximum index, trace backwards to find the new max texture index 2278 // If the deleted was bound to the the current maximum index, trace backwards
2279 // to find the new max texture index.
2266 if (m_onePlusMaxNonDefaultTextureUnit == 2280 if (m_onePlusMaxNonDefaultTextureUnit ==
2267 static_cast<unsigned long>(maxBoundTextureIndex + 1)) { 2281 static_cast<unsigned long>(maxBoundTextureIndex + 1)) {
2268 findNewMaxNonDefaultTextureUnit(); 2282 findNewMaxNonDefaultTextureUnit();
2269 } 2283 }
2270 } 2284 }
2271 2285
2272 void WebGLRenderingContextBase::depthFunc(GLenum func) { 2286 void WebGLRenderingContextBase::depthFunc(GLenum func) {
2273 if (isContextLost()) 2287 if (isContextLost())
2274 return; 2288 return;
2275 contextGL()->DepthFunc(func); 2289 contextGL()->DepthFunc(func);
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after
2509 // implementations use an FBO internally in place of the default 2523 // implementations use an FBO internally in place of the default
2510 // FBO. 2524 // FBO.
2511 WebGLFramebuffer* framebufferBinding = getFramebufferBinding(target); 2525 WebGLFramebuffer* framebufferBinding = getFramebufferBinding(target);
2512 if (!framebufferBinding || !framebufferBinding->object()) { 2526 if (!framebufferBinding || !framebufferBinding->object()) {
2513 synthesizeGLError(GL_INVALID_OPERATION, "framebufferRenderbuffer", 2527 synthesizeGLError(GL_INVALID_OPERATION, "framebufferRenderbuffer",
2514 "no framebuffer bound"); 2528 "no framebuffer bound");
2515 return; 2529 return;
2516 } 2530 }
2517 GLuint bufferObject = objectOrZero(buffer); 2531 GLuint bufferObject = objectOrZero(buffer);
2518 if (isWebGL2OrHigher() && attachment == GL_DEPTH_STENCIL_ATTACHMENT) { 2532 if (isWebGL2OrHigher() && attachment == GL_DEPTH_STENCIL_ATTACHMENT) {
2519 // On ES3, DEPTH_STENCIL_ATTACHMENT is like an alias for DEPTH_ATTACHMENT + STENCIL_ATTACHMENT. 2533 // On ES3, DEPTH_STENCIL_ATTACHMENT is like an alias for DEPTH_ATTACHMENT +
2520 // We divide it here so in WebGLFramebuffer, we don't have to handle DEPTH_S TENCIL_ATTACHMENT in WebGL 2. 2534 // STENCIL_ATTACHMENT. We divide it here so in WebGLFramebuffer, we don't
2535 // have to handle DEPTH_STENCIL_ATTACHMENT in WebGL 2.
2521 contextGL()->FramebufferRenderbuffer(target, GL_DEPTH_ATTACHMENT, 2536 contextGL()->FramebufferRenderbuffer(target, GL_DEPTH_ATTACHMENT,
2522 renderbuffertarget, bufferObject); 2537 renderbuffertarget, bufferObject);
2523 contextGL()->FramebufferRenderbuffer(target, GL_STENCIL_ATTACHMENT, 2538 contextGL()->FramebufferRenderbuffer(target, GL_STENCIL_ATTACHMENT,
2524 renderbuffertarget, bufferObject); 2539 renderbuffertarget, bufferObject);
2525 framebufferBinding->setAttachmentForBoundFramebuffer( 2540 framebufferBinding->setAttachmentForBoundFramebuffer(
2526 target, GL_DEPTH_ATTACHMENT, buffer); 2541 target, GL_DEPTH_ATTACHMENT, buffer);
2527 framebufferBinding->setAttachmentForBoundFramebuffer( 2542 framebufferBinding->setAttachmentForBoundFramebuffer(
2528 target, GL_STENCIL_ATTACHMENT, buffer); 2543 target, GL_STENCIL_ATTACHMENT, buffer);
2529 } else { 2544 } else {
2530 contextGL()->FramebufferRenderbuffer(target, attachment, renderbuffertarget, 2545 contextGL()->FramebufferRenderbuffer(target, attachment, renderbuffertarget,
(...skipping 22 matching lines...) Expand all
2553 // implementations use an FBO internally in place of the default 2568 // implementations use an FBO internally in place of the default
2554 // FBO. 2569 // FBO.
2555 WebGLFramebuffer* framebufferBinding = getFramebufferBinding(target); 2570 WebGLFramebuffer* framebufferBinding = getFramebufferBinding(target);
2556 if (!framebufferBinding || !framebufferBinding->object()) { 2571 if (!framebufferBinding || !framebufferBinding->object()) {
2557 synthesizeGLError(GL_INVALID_OPERATION, "framebufferTexture2D", 2572 synthesizeGLError(GL_INVALID_OPERATION, "framebufferTexture2D",
2558 "no framebuffer bound"); 2573 "no framebuffer bound");
2559 return; 2574 return;
2560 } 2575 }
2561 GLuint textureObject = objectOrZero(texture); 2576 GLuint textureObject = objectOrZero(texture);
2562 if (isWebGL2OrHigher() && attachment == GL_DEPTH_STENCIL_ATTACHMENT) { 2577 if (isWebGL2OrHigher() && attachment == GL_DEPTH_STENCIL_ATTACHMENT) {
2563 // On ES3, DEPTH_STENCIL_ATTACHMENT is like an alias for DEPTH_ATTACHMENT + STENCIL_ATTACHMENT. 2578 // On ES3, DEPTH_STENCIL_ATTACHMENT is like an alias for DEPTH_ATTACHMENT +
2564 // We divide it here so in WebGLFramebuffer, we don't have to handle DEPTH_S TENCIL_ATTACHMENT in WebGL 2. 2579 // STENCIL_ATTACHMENT. We divide it here so in WebGLFramebuffer, we don't
2580 // have to handle DEPTH_STENCIL_ATTACHMENT in WebGL 2.
2565 contextGL()->FramebufferTexture2D(target, GL_DEPTH_ATTACHMENT, textarget, 2581 contextGL()->FramebufferTexture2D(target, GL_DEPTH_ATTACHMENT, textarget,
2566 textureObject, level); 2582 textureObject, level);
2567 contextGL()->FramebufferTexture2D(target, GL_STENCIL_ATTACHMENT, textarget, 2583 contextGL()->FramebufferTexture2D(target, GL_STENCIL_ATTACHMENT, textarget,
2568 textureObject, level); 2584 textureObject, level);
2569 framebufferBinding->setAttachmentForBoundFramebuffer( 2585 framebufferBinding->setAttachmentForBoundFramebuffer(
2570 target, GL_DEPTH_ATTACHMENT, textarget, texture, level, 0); 2586 target, GL_DEPTH_ATTACHMENT, textarget, texture, level, 0);
2571 framebufferBinding->setAttachmentForBoundFramebuffer( 2587 framebufferBinding->setAttachmentForBoundFramebuffer(
2572 target, GL_STENCIL_ATTACHMENT, textarget, texture, level, 0); 2588 target, GL_STENCIL_ATTACHMENT, textarget, texture, level, 0);
2573 } else { 2589 } else {
2574 contextGL()->FramebufferTexture2D(target, attachment, textarget, 2590 contextGL()->FramebufferTexture2D(target, attachment, textarget,
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
2722 "invalid parameter name"); 2738 "invalid parameter name");
2723 return ScriptValue::createNull(scriptState); 2739 return ScriptValue::createNull(scriptState);
2724 } 2740 }
2725 } 2741 }
2726 2742
2727 void WebGLRenderingContextBase::getContextAttributes( 2743 void WebGLRenderingContextBase::getContextAttributes(
2728 Nullable<WebGLContextAttributes>& result) { 2744 Nullable<WebGLContextAttributes>& result) {
2729 if (isContextLost()) 2745 if (isContextLost())
2730 return; 2746 return;
2731 result.set(toWebGLContextAttributes(creationAttributes())); 2747 result.set(toWebGLContextAttributes(creationAttributes()));
2732 // Some requested attributes may not be honored, so we need to query the under lying 2748 // Some requested attributes may not be honored, so we need to query the
2733 // context/drawing buffer and adjust accordingly. 2749 // underlying context/drawing buffer and adjust accordingly.
2734 if (creationAttributes().depth() && !drawingBuffer()->hasDepthBuffer()) 2750 if (creationAttributes().depth() && !drawingBuffer()->hasDepthBuffer())
2735 result.get().setDepth(false); 2751 result.get().setDepth(false);
2736 if (creationAttributes().stencil() && !drawingBuffer()->hasStencilBuffer()) 2752 if (creationAttributes().stencil() && !drawingBuffer()->hasStencilBuffer())
2737 result.get().setStencil(false); 2753 result.get().setStencil(false);
2738 result.get().setAntialias(drawingBuffer()->multisample()); 2754 result.get().setAntialias(drawingBuffer()->multisample());
2739 } 2755 }
2740 2756
2741 GLenum WebGLRenderingContextBase::getError() { 2757 GLenum WebGLRenderingContextBase::getError() {
2742 if (!m_lostContextErrors.isEmpty()) { 2758 if (!m_lostContextErrors.isEmpty()) {
2743 GLenum error = m_lostContextErrors.first(); 2759 GLenum error = m_lostContextErrors.first();
(...skipping 675 matching lines...) Expand 10 before | Expand all | Expand 10 after
3419 contextGL()->GetProgramiv(programId, GL_ACTIVE_UNIFORM_MAX_LENGTH, 3435 contextGL()->GetProgramiv(programId, GL_ACTIVE_UNIFORM_MAX_LENGTH,
3420 &maxNameLength); 3436 &maxNameLength);
3421 if (maxNameLength < 0) 3437 if (maxNameLength < 0)
3422 return ScriptValue::createNull(scriptState); 3438 return ScriptValue::createNull(scriptState);
3423 if (maxNameLength == 0) { 3439 if (maxNameLength == 0) {
3424 synthesizeGLError(GL_INVALID_VALUE, "getUniform", 3440 synthesizeGLError(GL_INVALID_VALUE, "getUniform",
3425 "no active uniforms exist"); 3441 "no active uniforms exist");
3426 return ScriptValue::createNull(scriptState); 3442 return ScriptValue::createNull(scriptState);
3427 } 3443 }
3428 3444
3429 // FIXME: make this more efficient using WebGLUniformLocation and caching type s in it 3445 // FIXME: make this more efficient using WebGLUniformLocation and caching
3446 // types in it.
3430 GLint activeUniforms = 0; 3447 GLint activeUniforms = 0;
3431 contextGL()->GetProgramiv(programId, GL_ACTIVE_UNIFORMS, &activeUniforms); 3448 contextGL()->GetProgramiv(programId, GL_ACTIVE_UNIFORMS, &activeUniforms);
3432 for (GLint i = 0; i < activeUniforms; i++) { 3449 for (GLint i = 0; i < activeUniforms; i++) {
3433 LChar* namePtr; 3450 LChar* namePtr;
3434 RefPtr<StringImpl> nameImpl = 3451 RefPtr<StringImpl> nameImpl =
3435 StringImpl::createUninitialized(maxNameLength, namePtr); 3452 StringImpl::createUninitialized(maxNameLength, namePtr);
3436 GLsizei length = 0; 3453 GLsizei length = 0;
3437 GLint size = -1; 3454 GLint size = -1;
3438 GLenum type = 0; 3455 GLenum type = 0;
3439 contextGL()->GetActiveUniform(programId, i, maxNameLength, &length, &size, 3456 contextGL()->GetActiveUniform(programId, i, maxNameLength, &length, &size,
3440 &type, reinterpret_cast<GLchar*>(namePtr)); 3457 &type, reinterpret_cast<GLchar*>(namePtr));
3441 if (size < 0) 3458 if (size < 0)
3442 return ScriptValue::createNull(scriptState); 3459 return ScriptValue::createNull(scriptState);
3443 String name(nameImpl->substring(0, length)); 3460 String name(nameImpl->substring(0, length));
3444 StringBuilder nameBuilder; 3461 StringBuilder nameBuilder;
3445 // Strip "[0]" from the name if it's an array. 3462 // Strip "[0]" from the name if it's an array.
3446 if (size > 1 && name.endsWith("[0]")) 3463 if (size > 1 && name.endsWith("[0]"))
3447 name = name.left(name.length() - 3); 3464 name = name.left(name.length() - 3);
3448 // If it's an array, we need to iterate through each element, appending "[in dex]" to the name. 3465 // If it's an array, we need to iterate through each element, appending
3466 // "[index]" to the name.
3449 for (GLint index = 0; index < size; ++index) { 3467 for (GLint index = 0; index < size; ++index) {
3450 nameBuilder.clear(); 3468 nameBuilder.clear();
3451 nameBuilder.append(name); 3469 nameBuilder.append(name);
3452 if (size > 1 && index >= 1) { 3470 if (size > 1 && index >= 1) {
3453 nameBuilder.append('['); 3471 nameBuilder.append('[');
3454 nameBuilder.appendNumber(index); 3472 nameBuilder.appendNumber(index);
3455 nameBuilder.append(']'); 3473 nameBuilder.append(']');
3456 } 3474 }
3457 // Now need to look this up by name again to find its location 3475 // Now need to look this up by name again to find its location
3458 GLint loc = contextGL()->GetUniformLocation( 3476 GLint loc = contextGL()->GetUniformLocation(
3459 objectOrZero(program), nameBuilder.toString().utf8().data()); 3477 objectOrZero(program), nameBuilder.toString().utf8().data());
3460 if (loc == location) { 3478 if (loc == location) {
3461 // Found it. Use the type in the ActiveInfo to determine the return type . 3479 // Found it. Use the type in the ActiveInfo to determine the return
3480 // type.
3462 GLenum baseType; 3481 GLenum baseType;
3463 unsigned length; 3482 unsigned length;
3464 switch (type) { 3483 switch (type) {
3465 case GL_BOOL: 3484 case GL_BOOL:
3466 baseType = GL_BOOL; 3485 baseType = GL_BOOL;
3467 length = 1; 3486 length = 1;
3468 break; 3487 break;
3469 case GL_BOOL_VEC2: 3488 case GL_BOOL_VEC2:
3470 baseType = GL_BOOL; 3489 baseType = GL_BOOL;
3471 length = 2; 3490 length = 2;
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
3621 return WebGLAny(scriptState, boolValue, length); 3640 return WebGLAny(scriptState, boolValue, length);
3622 } 3641 }
3623 return WebGLAny(scriptState, static_cast<bool>(value[0])); 3642 return WebGLAny(scriptState, static_cast<bool>(value[0]));
3624 } 3643 }
3625 default: 3644 default:
3626 NOTIMPLEMENTED(); 3645 NOTIMPLEMENTED();
3627 } 3646 }
3628 } 3647 }
3629 } 3648 }
3630 } 3649 }
3631 // If we get here, something went wrong in our unfortunately complex logic abo ve 3650 // If we get here, something went wrong in our unfortunately complex logic
3651 // above
3632 synthesizeGLError(GL_INVALID_VALUE, "getUniform", "unknown error"); 3652 synthesizeGLError(GL_INVALID_VALUE, "getUniform", "unknown error");
3633 return ScriptValue::createNull(scriptState); 3653 return ScriptValue::createNull(scriptState);
3634 } 3654 }
3635 3655
3636 WebGLUniformLocation* WebGLRenderingContextBase::getUniformLocation( 3656 WebGLUniformLocation* WebGLRenderingContextBase::getUniformLocation(
3637 WebGLProgram* program, 3657 WebGLProgram* program,
3638 const String& name) { 3658 const String& name) {
3639 if (isContextLost() || !validateWebGLObject("getUniformLocation", program)) 3659 if (isContextLost() || !validateWebGLObject("getUniformLocation", program))
3640 return nullptr; 3660 return nullptr;
3641 if (!validateLocationLength("getUniformLocation", name)) 3661 if (!validateLocationLength("getUniformLocation", name))
(...skipping 435 matching lines...) Expand 10 before | Expand all | Expand 10 after
4077 } 4097 }
4078 } 4098 }
4079 4099
4080 void WebGLRenderingContextBase::renderbufferStorageImpl( 4100 void WebGLRenderingContextBase::renderbufferStorageImpl(
4081 GLenum target, 4101 GLenum target,
4082 GLsizei samples, 4102 GLsizei samples,
4083 GLenum internalformat, 4103 GLenum internalformat,
4084 GLsizei width, 4104 GLsizei width,
4085 GLsizei height, 4105 GLsizei height,
4086 const char* functionName) { 4106 const char* functionName) {
4087 ASSERT( 4107 ASSERT(!samples); // |samples| > 0 is only valid in WebGL2's
4088 !samples); // |samples| > 0 is only valid in WebGL2's renderbufferStorage Multisample(). 4108 // renderbufferStorageMultisample().
4089 ASSERT(!isWebGL2OrHigher()); // Make sure this is overridden in WebGL 2. 4109 ASSERT(!isWebGL2OrHigher()); // Make sure this is overridden in WebGL 2.
4090 switch (internalformat) { 4110 switch (internalformat) {
4091 case GL_DEPTH_COMPONENT16: 4111 case GL_DEPTH_COMPONENT16:
4092 case GL_RGBA4: 4112 case GL_RGBA4:
4093 case GL_RGB5_A1: 4113 case GL_RGB5_A1:
4094 case GL_RGB565: 4114 case GL_RGB565:
4095 case GL_STENCIL_INDEX8: 4115 case GL_STENCIL_INDEX8:
4096 contextGL()->RenderbufferStorage(target, internalformat, width, height); 4116 contextGL()->RenderbufferStorage(target, internalformat, width, height);
4097 m_renderbufferBinding->setInternalFormat(internalformat); 4117 m_renderbufferBinding->setInternalFormat(internalformat);
4098 m_renderbufferBinding->setSize(width, height); 4118 m_renderbufferBinding->setSize(width, height);
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
4157 if (isContextLost()) 4177 if (isContextLost())
4158 return; 4178 return;
4159 contextGL()->Scissor(x, y, width, height); 4179 contextGL()->Scissor(x, y, width, height);
4160 } 4180 }
4161 4181
4162 void WebGLRenderingContextBase::shaderSource(WebGLShader* shader, 4182 void WebGLRenderingContextBase::shaderSource(WebGLShader* shader,
4163 const String& string) { 4183 const String& string) {
4164 if (isContextLost() || !validateWebGLObject("shaderSource", shader)) 4184 if (isContextLost() || !validateWebGLObject("shaderSource", shader))
4165 return; 4185 return;
4166 String stringWithoutComments = StripComments(string).result(); 4186 String stringWithoutComments = StripComments(string).result();
4167 // TODO(danakj): Make validateShaderSource reject characters > 255 (or utf16 S trings) 4187 // TODO(danakj): Make validateShaderSource reject characters > 255 (or utf16
4168 // so we don't need to use StringUTF8Adaptor. 4188 // Strings) so we don't need to use StringUTF8Adaptor.
4169 if (!validateShaderSource(stringWithoutComments)) 4189 if (!validateShaderSource(stringWithoutComments))
4170 return; 4190 return;
4171 shader->setSource(string); 4191 shader->setSource(string);
4172 WTF::StringUTF8Adaptor adaptor(stringWithoutComments); 4192 WTF::StringUTF8Adaptor adaptor(stringWithoutComments);
4173 const GLchar* shaderData = adaptor.data(); 4193 const GLchar* shaderData = adaptor.data();
4174 // TODO(danakj): Use base::saturated_cast<GLint>. 4194 // TODO(danakj): Use base::saturated_cast<GLint>.
4175 const GLint shaderLength = adaptor.length(); 4195 const GLint shaderLength = adaptor.length();
4176 contextGL()->ShaderSource(objectOrZero(shader), 1, &shaderData, 4196 contextGL()->ShaderSource(objectOrZero(shader), 1, &shaderData,
4177 &shaderLength); 4197 &shaderLength);
4178 } 4198 }
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
4263 GLenum zfail, 4283 GLenum zfail,
4264 GLenum zpass) { 4284 GLenum zpass) {
4265 if (isContextLost()) 4285 if (isContextLost())
4266 return; 4286 return;
4267 contextGL()->StencilOpSeparate(face, fail, zfail, zpass); 4287 contextGL()->StencilOpSeparate(face, fail, zfail, zpass);
4268 } 4288 }
4269 4289
4270 GLenum WebGLRenderingContextBase::convertTexInternalFormat( 4290 GLenum WebGLRenderingContextBase::convertTexInternalFormat(
4271 GLenum internalformat, 4291 GLenum internalformat,
4272 GLenum type) { 4292 GLenum type) {
4273 // Convert to sized internal formats that are renderable with GL_CHROMIUM_colo r_buffer_float_rgb(a). 4293 // Convert to sized internal formats that are renderable with
4294 // GL_CHROMIUM_color_buffer_float_rgb(a).
4274 if (type == GL_FLOAT && internalformat == GL_RGBA && 4295 if (type == GL_FLOAT && internalformat == GL_RGBA &&
4275 extensionsUtil()->isExtensionEnabled( 4296 extensionsUtil()->isExtensionEnabled(
4276 "GL_CHROMIUM_color_buffer_float_rgba")) 4297 "GL_CHROMIUM_color_buffer_float_rgba"))
4277 return GL_RGBA32F_EXT; 4298 return GL_RGBA32F_EXT;
4278 if (type == GL_FLOAT && internalformat == GL_RGB && 4299 if (type == GL_FLOAT && internalformat == GL_RGB &&
4279 extensionsUtil()->isExtensionEnabled( 4300 extensionsUtil()->isExtensionEnabled(
4280 "GL_CHROMIUM_color_buffer_float_rgb")) 4301 "GL_CHROMIUM_color_buffer_float_rgb"))
4281 return GL_RGB32F_EXT; 4302 return GL_RGB32F_EXT;
4282 return internalformat; 4303 return internalformat;
4283 } 4304 }
4284 4305
4285 void WebGLRenderingContextBase::texImage2DBase(GLenum target, 4306 void WebGLRenderingContextBase::texImage2DBase(GLenum target,
4286 GLint level, 4307 GLint level,
4287 GLint internalformat, 4308 GLint internalformat,
4288 GLsizei width, 4309 GLsizei width,
4289 GLsizei height, 4310 GLsizei height,
4290 GLint border, 4311 GLint border,
4291 GLenum format, 4312 GLenum format,
4292 GLenum type, 4313 GLenum type,
4293 const void* pixels) { 4314 const void* pixels) {
4294 // All calling functions check isContextLost, so a duplicate check is not need ed here. 4315 // All calling functions check isContextLost, so a duplicate check is not
4316 // needed here.
4295 contextGL()->TexImage2D(target, level, 4317 contextGL()->TexImage2D(target, level,
4296 convertTexInternalFormat(internalformat, type), width, 4318 convertTexInternalFormat(internalformat, type), width,
4297 height, border, format, type, pixels); 4319 height, border, format, type, pixels);
4298 } 4320 }
4299 4321
4300 void WebGLRenderingContextBase::texImageImpl( 4322 void WebGLRenderingContextBase::texImageImpl(
4301 TexImageFunctionID functionID, 4323 TexImageFunctionID functionID,
4302 GLenum target, 4324 GLenum target,
4303 GLint level, 4325 GLint level,
4304 GLint internalformat, 4326 GLint internalformat,
4305 GLint xoffset, 4327 GLint xoffset,
4306 GLint yoffset, 4328 GLint yoffset,
4307 GLint zoffset, 4329 GLint zoffset,
4308 GLenum format, 4330 GLenum format,
4309 GLenum type, 4331 GLenum type,
4310 Image* image, 4332 Image* image,
4311 WebGLImageConversion::ImageHtmlDomSource domSource, 4333 WebGLImageConversion::ImageHtmlDomSource domSource,
4312 bool flipY, 4334 bool flipY,
4313 bool premultiplyAlpha) { 4335 bool premultiplyAlpha) {
4314 const char* funcName = getTexImageFunctionName(functionID); 4336 const char* funcName = getTexImageFunctionName(functionID);
4315 // All calling functions check isContextLost, so a duplicate check is not need ed here. 4337 // All calling functions check isContextLost, so a duplicate check is not
4338 // needed here.
4316 if (type == GL_UNSIGNED_INT_10F_11F_11F_REV) { 4339 if (type == GL_UNSIGNED_INT_10F_11F_11F_REV) {
4317 // The UNSIGNED_INT_10F_11F_11F_REV type pack/unpack isn't implemented. 4340 // The UNSIGNED_INT_10F_11F_11F_REV type pack/unpack isn't implemented.
4318 type = GL_FLOAT; 4341 type = GL_FLOAT;
4319 } 4342 }
4320 Vector<uint8_t> data; 4343 Vector<uint8_t> data;
4321 WebGLImageConversion::ImageExtractor imageExtractor( 4344 WebGLImageConversion::ImageExtractor imageExtractor(
4322 image, domSource, premultiplyAlpha, 4345 image, domSource, premultiplyAlpha,
4323 m_unpackColorspaceConversion == GL_NONE); 4346 m_unpackColorspaceConversion == GL_NONE);
4324 if (!imageExtractor.imagePixelData()) { 4347 if (!imageExtractor.imagePixelData()) {
4325 synthesizeGLError(GL_INVALID_VALUE, funcName, "bad image data"); 4348 synthesizeGLError(GL_INVALID_VALUE, funcName, "bad image data");
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
4390 level, internalformat, width, height, depth, 4413 level, internalformat, width, height, depth,
4391 border, format, type)) 4414 border, format, type))
4392 return false; 4415 return false;
4393 4416
4394 if (functionType == TexSubImage) { 4417 if (functionType == TexSubImage) {
4395 if (!validateSettableTexFormat(functionName, format)) 4418 if (!validateSettableTexFormat(functionName, format))
4396 return false; 4419 return false;
4397 if (!validateSize(functionName, xoffset, yoffset, zoffset)) 4420 if (!validateSize(functionName, xoffset, yoffset, zoffset))
4398 return false; 4421 return false;
4399 } else { 4422 } else {
4400 // For SourceArrayBufferView, function validateTexFuncData() would handle wh ether to validate the SettableTexFormat 4423 // For SourceArrayBufferView, function validateTexFuncData() would handle
4424 // whether to validate the SettableTexFormat
4401 // by checking if the ArrayBufferView is null or not. 4425 // by checking if the ArrayBufferView is null or not.
4402 if (sourceType != SourceArrayBufferView) { 4426 if (sourceType != SourceArrayBufferView) {
4403 if (!validateSettableTexFormat(functionName, format)) 4427 if (!validateSettableTexFormat(functionName, format))
4404 return false; 4428 return false;
4405 } 4429 }
4406 } 4430 }
4407 4431
4408 return true; 4432 return true;
4409 } 4433 }
4410 4434
4411 bool WebGLRenderingContextBase::validateValueFitNonNegInt32( 4435 bool WebGLRenderingContextBase::validateValueFitNonNegInt32(
4412 const char* functionName, 4436 const char* functionName,
4413 const char* paramName, 4437 const char* paramName,
4414 long long value) { 4438 long long value) {
4415 if (value < 0) { 4439 if (value < 0) {
4416 String errorMsg = String(paramName) + " < 0"; 4440 String errorMsg = String(paramName) + " < 0";
4417 synthesizeGLError(GL_INVALID_VALUE, functionName, errorMsg.ascii().data()); 4441 synthesizeGLError(GL_INVALID_VALUE, functionName, errorMsg.ascii().data());
4418 return false; 4442 return false;
4419 } 4443 }
4420 if (value > static_cast<long long>(std::numeric_limits<int>::max())) { 4444 if (value > static_cast<long long>(std::numeric_limits<int>::max())) {
4421 String errorMsg = String(paramName) + " more than 32-bit"; 4445 String errorMsg = String(paramName) + " more than 32-bit";
4422 synthesizeGLError(GL_INVALID_OPERATION, functionName, 4446 synthesizeGLError(GL_INVALID_OPERATION, functionName,
4423 errorMsg.ascii().data()); 4447 errorMsg.ascii().data());
4424 return false; 4448 return false;
4425 } 4449 }
4426 return true; 4450 return true;
4427 } 4451 }
4428 4452
4429 // TODO(fmalita): figure why WebGLImageConversion::ImageExtractor can't handle S VG-backed images, 4453 // TODO(fmalita): figure why WebGLImageConversion::ImageExtractor can't handle
4430 // and get rid of this intermediate step. 4454 // SVG-backed images, and get rid of this intermediate step.
4431 PassRefPtr<Image> WebGLRenderingContextBase::drawImageIntoBuffer( 4455 PassRefPtr<Image> WebGLRenderingContextBase::drawImageIntoBuffer(
4432 PassRefPtr<Image> passImage, 4456 PassRefPtr<Image> passImage,
4433 int width, 4457 int width,
4434 int height, 4458 int height,
4435 const char* functionName) { 4459 const char* functionName) {
4436 RefPtr<Image> image(passImage); 4460 RefPtr<Image> image(passImage);
4437 ASSERT(image); 4461 ASSERT(image);
4438 4462
4439 IntSize size(width, height); 4463 IntSize size(width, height);
4440 ImageBuffer* buf = m_generatedImageCache.imageBuffer(size); 4464 ImageBuffer* buf = m_generatedImageCache.imageBuffer(size);
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
4607 functionType = TexImage; 4631 functionType = TexImage;
4608 else 4632 else
4609 functionType = TexSubImage; 4633 functionType = TexSubImage;
4610 if (!validateTexFunc(funcName, functionType, SourceImageData, target, level, 4634 if (!validateTexFunc(funcName, functionType, SourceImageData, target, level,
4611 internalformat, pixels->width(), pixels->height(), depth, 4635 internalformat, pixels->width(), pixels->height(), depth,
4612 border, format, type, xoffset, yoffset, zoffset)) 4636 border, format, type, xoffset, yoffset, zoffset))
4613 return; 4637 return;
4614 Vector<uint8_t> data; 4638 Vector<uint8_t> data;
4615 bool needConversion = true; 4639 bool needConversion = true;
4616 // The data from ImageData is always of format RGBA8. 4640 // The data from ImageData is always of format RGBA8.
4617 // No conversion is needed if destination format is RGBA and type is USIGNED_B YTE and no Flip or Premultiply operation is required. 4641 // No conversion is needed if destination format is RGBA and type is
4642 // USIGNED_BYTE and no Flip or Premultiply operation is required.
4618 if (!m_unpackFlipY && !m_unpackPremultiplyAlpha && format == GL_RGBA && 4643 if (!m_unpackFlipY && !m_unpackPremultiplyAlpha && format == GL_RGBA &&
4619 type == GL_UNSIGNED_BYTE) { 4644 type == GL_UNSIGNED_BYTE) {
4620 needConversion = false; 4645 needConversion = false;
4621 } else { 4646 } else {
4622 if (type == GL_UNSIGNED_INT_10F_11F_11F_REV) { 4647 if (type == GL_UNSIGNED_INT_10F_11F_11F_REV) {
4623 // The UNSIGNED_INT_10F_11F_11F_REV type pack/unpack isn't implemented. 4648 // The UNSIGNED_INT_10F_11F_11F_REV type pack/unpack isn't implemented.
4624 type = GL_FLOAT; 4649 type = GL_FLOAT;
4625 } 4650 }
4626 if (!WebGLImageConversion::extractImageData( 4651 if (!WebGLImageConversion::extractImageData(
4627 pixels->data()->data(), 4652 pixels->data()->data(),
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
4715 } 4740 }
4716 4741
4717 bool WebGLRenderingContextBase::canUseTexImageByGPU( 4742 bool WebGLRenderingContextBase::canUseTexImageByGPU(
4718 TexImageFunctionID functionID, 4743 TexImageFunctionID functionID,
4719 GLint internalformat, 4744 GLint internalformat,
4720 GLenum type) { 4745 GLenum type) {
4721 if (functionID == TexImage2D && 4746 if (functionID == TexImage2D &&
4722 (isFloatType(type) || isIntegerFormat(internalformat) || 4747 (isFloatType(type) || isIntegerFormat(internalformat) ||
4723 isSRGBFormat(internalformat))) 4748 isSRGBFormat(internalformat)))
4724 return false; 4749 return false;
4725 // TODO(crbug.com/622958): Implement GPU-to-GPU path for WebGL 2 and more inte rnal formats. 4750 // TODO(crbug.com/622958): Implement GPU-to-GPU path for WebGL 2 and more
4751 // internal formats.
4726 if (functionID == TexSubImage2D && 4752 if (functionID == TexSubImage2D &&
4727 (isWebGL2OrHigher() || extensionEnabled(OESTextureFloatName) || 4753 (isWebGL2OrHigher() || extensionEnabled(OESTextureFloatName) ||
4728 extensionEnabled(OESTextureHalfFloatName) || 4754 extensionEnabled(OESTextureHalfFloatName) ||
4729 extensionEnabled(EXTsRGBName))) 4755 extensionEnabled(EXTsRGBName)))
4730 return false; 4756 return false;
4731 return true; 4757 return true;
4732 } 4758 }
4733 4759
4734 void WebGLRenderingContextBase::texImageCanvasByGPU(HTMLCanvasElement* canvas, 4760 void WebGLRenderingContextBase::texImageCanvasByGPU(HTMLCanvasElement* canvas,
4735 GLuint targetTexture, 4761 GLuint targetTexture,
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
4776 GLuint targetTexture = texture->object(); 4802 GLuint targetTexture = texture->object();
4777 GLenum targetType = type; 4803 GLenum targetType = type;
4778 GLenum targetInternalformat = internalformat; 4804 GLenum targetInternalformat = internalformat;
4779 GLint targetLevel = level; 4805 GLint targetLevel = level;
4780 bool possibleDirectCopy = false; 4806 bool possibleDirectCopy = false;
4781 if (functionType == TexImage2DByGPU) { 4807 if (functionType == TexImage2DByGPU) {
4782 possibleDirectCopy = Extensions3DUtil::canUseCopyTextureCHROMIUM( 4808 possibleDirectCopy = Extensions3DUtil::canUseCopyTextureCHROMIUM(
4783 target, internalformat, type, level); 4809 target, internalformat, type, level);
4784 } 4810 }
4785 4811
4786 // if direct copy is not possible, create a temporary texture and then copy fr om canvas to temporary texture to target texture. 4812 // if direct copy is not possible, create a temporary texture and then copy
4813 // from canvas to temporary texture to target texture.
4787 if (!possibleDirectCopy) { 4814 if (!possibleDirectCopy) {
4788 targetLevel = 0; 4815 targetLevel = 0;
4789 targetInternalformat = GL_RGBA; 4816 targetInternalformat = GL_RGBA;
4790 targetType = GL_UNSIGNED_BYTE; 4817 targetType = GL_UNSIGNED_BYTE;
4791 contextGL()->GenTextures(1, &targetTexture); 4818 contextGL()->GenTextures(1, &targetTexture);
4792 contextGL()->BindTexture(GL_TEXTURE_2D, targetTexture); 4819 contextGL()->BindTexture(GL_TEXTURE_2D, targetTexture);
4793 contextGL()->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, 4820 contextGL()->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
4794 GL_NEAREST); 4821 GL_NEAREST);
4795 contextGL()->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, 4822 contextGL()->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
4796 GL_NEAREST); 4823 GL_NEAREST);
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
4857 TexImageFunctionType functionType; 4884 TexImageFunctionType functionType;
4858 if (functionID == TexImage2D) 4885 if (functionID == TexImage2D)
4859 functionType = TexImage; 4886 functionType = TexImage;
4860 else 4887 else
4861 functionType = TexSubImage; 4888 functionType = TexSubImage;
4862 if (!validateTexFunc(funcName, functionType, SourceHTMLCanvasElement, target, 4889 if (!validateTexFunc(funcName, functionType, SourceHTMLCanvasElement, target,
4863 level, internalformat, canvas->width(), canvas->height(), 4890 level, internalformat, canvas->width(), canvas->height(),
4864 1, 0, format, type, xoffset, yoffset, zoffset)) 4891 1, 0, format, type, xoffset, yoffset, zoffset))
4865 return; 4892 return;
4866 if (functionID == TexImage2D || functionID == TexSubImage2D) { 4893 if (functionID == TexImage2D || functionID == TexSubImage2D) {
4867 // texImageByGPU relies on copyTextureCHROMIUM which doesn't support float/i nteger/sRGB internal format. 4894 // texImageByGPU relies on copyTextureCHROMIUM which doesn't support
4868 // TODO(crbug.com/622958): relax the constrains if copyTextureCHROMIUM is up graded to handle more formats. 4895 // float/integer/sRGB internal format.
4896 // TODO(crbug.com/622958): relax the constrains if copyTextureCHROMIUM is
4897 // upgraded to handle more formats.
4869 if (!canvas->renderingContext() || 4898 if (!canvas->renderingContext() ||
4870 !canvas->renderingContext()->isAccelerated() || 4899 !canvas->renderingContext()->isAccelerated() ||
4871 !canUseTexImageByGPU(functionID, internalformat, type)) { 4900 !canUseTexImageByGPU(functionID, internalformat, type)) {
4872 // 2D canvas has only FrontBuffer. 4901 // 2D canvas has only FrontBuffer.
4873 texImageImpl(functionID, target, level, internalformat, xoffset, yoffset, 4902 texImageImpl(functionID, target, level, internalformat, xoffset, yoffset,
4874 zoffset, format, type, 4903 zoffset, format, type,
4875 canvas->copiedImage(FrontBuffer, PreferAcceleration).get(), 4904 canvas->copiedImage(FrontBuffer, PreferAcceleration).get(),
4876 WebGLImageConversion::HtmlDomCanvas, m_unpackFlipY, 4905 WebGLImageConversion::HtmlDomCanvas, m_unpackFlipY,
4877 m_unpackPremultiplyAlpha); 4906 m_unpackPremultiplyAlpha);
4878 return; 4907 return;
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
4948 functionType = TexImage; 4977 functionType = TexImage;
4949 else 4978 else
4950 functionType = TexSubImage; 4979 functionType = TexSubImage;
4951 if (!validateTexFunc(funcName, functionType, SourceHTMLVideoElement, target, 4980 if (!validateTexFunc(funcName, functionType, SourceHTMLVideoElement, target,
4952 level, internalformat, video->videoWidth(), 4981 level, internalformat, video->videoWidth(),
4953 video->videoHeight(), 1, 0, format, type, xoffset, 4982 video->videoHeight(), 1, 0, format, type, xoffset,
4954 yoffset, zoffset)) 4983 yoffset, zoffset))
4955 return; 4984 return;
4956 4985
4957 if (functionID == TexImage2D) { 4986 if (functionID == TexImage2D) {
4958 // Go through the fast path doing a GPU-GPU textures copy without a readback to system memory if possible. 4987 // Go through the fast path doing a GPU-GPU textures copy without a readback
4959 // Otherwise, it will fall back to the normal SW path. 4988 // to system memory if possible. Otherwise, it will fall back to the normal
4989 // SW path.
4960 if (GL_TEXTURE_2D == target) { 4990 if (GL_TEXTURE_2D == target) {
4961 if (Extensions3DUtil::canUseCopyTextureCHROMIUM(target, internalformat, 4991 if (Extensions3DUtil::canUseCopyTextureCHROMIUM(target, internalformat,
4962 type, level) && 4992 type, level) &&
4963 video->copyVideoTextureToPlatformTexture( 4993 video->copyVideoTextureToPlatformTexture(
4964 contextGL(), texture->object(), internalformat, type, 4994 contextGL(), texture->object(), internalformat, type,
4965 m_unpackPremultiplyAlpha, m_unpackFlipY)) { 4995 m_unpackPremultiplyAlpha, m_unpackFlipY)) {
4966 return; 4996 return;
4967 } 4997 }
4968 4998
4969 // Try using an accelerated image buffer, this allows YUV conversion to be done on the GPU. 4999 // Try using an accelerated image buffer, this allows YUV conversion to be
5000 // done on the GPU.
4970 std::unique_ptr<ImageBufferSurface> surface = 5001 std::unique_ptr<ImageBufferSurface> surface =
4971 wrapUnique(new AcceleratedImageBufferSurface( 5002 wrapUnique(new AcceleratedImageBufferSurface(
4972 IntSize(video->videoWidth(), video->videoHeight()))); 5003 IntSize(video->videoWidth(), video->videoHeight())));
4973 if (surface->isValid()) { 5004 if (surface->isValid()) {
4974 std::unique_ptr<ImageBuffer> imageBuffer( 5005 std::unique_ptr<ImageBuffer> imageBuffer(
4975 ImageBuffer::create(std::move(surface))); 5006 ImageBuffer::create(std::move(surface)));
4976 if (imageBuffer) { 5007 if (imageBuffer) {
4977 // The video element paints an RGBA frame into our surface here. By us ing an AcceleratedImageBufferSurface, 5008 // The video element paints an RGBA frame into our surface here. By
4978 // we enable the WebMediaPlayer implementation to do any necessary col or space conversion on the GPU (though it 5009 // using an AcceleratedImageBufferSurface, we enable the
5010 // WebMediaPlayer implementation to do any necessary color space
5011 // conversion on the GPU (though it
4979 // may still do a CPU conversion and upload the results). 5012 // may still do a CPU conversion and upload the results).
4980 video->paintCurrentFrame( 5013 video->paintCurrentFrame(
4981 imageBuffer->canvas(), 5014 imageBuffer->canvas(),
4982 IntRect(0, 0, video->videoWidth(), video->videoHeight()), 5015 IntRect(0, 0, video->videoWidth(), video->videoHeight()),
4983 nullptr); 5016 nullptr);
4984 5017
4985 // This is a straight GPU-GPU copy, any necessary color space conversi on was handled in the paintCurrentFrameInContext() call. 5018 // This is a straight GPU-GPU copy, any necessary color space
5019 // conversion was handled in the paintCurrentFrameInContext() call.
4986 if (imageBuffer->copyToPlatformTexture( 5020 if (imageBuffer->copyToPlatformTexture(
4987 contextGL(), texture->object(), internalformat, type, level, 5021 contextGL(), texture->object(), internalformat, type, level,
4988 m_unpackPremultiplyAlpha, m_unpackFlipY)) { 5022 m_unpackPremultiplyAlpha, m_unpackFlipY)) {
4989 return; 5023 return;
4990 } 5024 }
4991 } 5025 }
4992 } 5026 }
4993 } 5027 }
4994 } 5028 }
4995 5029
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
5065 } else if (functionID == TexSubImage2D) { 5099 } else if (functionID == TexSubImage2D) {
5066 texImageByGPU(TexSubImage2DByGPU, texture, target, level, GL_RGBA, type, 5100 texImageByGPU(TexSubImage2DByGPU, texture, target, level, GL_RGBA, type,
5067 xoffset, yoffset, 0, bitmap); 5101 xoffset, yoffset, 0, bitmap);
5068 } 5102 }
5069 return; 5103 return;
5070 } 5104 }
5071 sk_sp<SkImage> skImage = bitmap->bitmapImage()->imageForCurrentFrame(); 5105 sk_sp<SkImage> skImage = bitmap->bitmapImage()->imageForCurrentFrame();
5072 SkPixmap pixmap; 5106 SkPixmap pixmap;
5073 uint8_t* pixelDataPtr = nullptr; 5107 uint8_t* pixelDataPtr = nullptr;
5074 RefPtr<Uint8Array> pixelData; 5108 RefPtr<Uint8Array> pixelData;
5075 // In the case where an ImageBitmap is not texture backed, peekPixels() always succeed. 5109 // In the case where an ImageBitmap is not texture backed, peekPixels() always
5076 // However, when it is texture backed and !canUseTexImageByGPU, we do a GPU re ad back. 5110 // succeed. However, when it is texture backed and !canUseTexImageByGPU, we
5111 // do a GPU read back.
5077 bool peekSucceed = skImage->peekPixels(&pixmap); 5112 bool peekSucceed = skImage->peekPixels(&pixmap);
5078 if (peekSucceed) { 5113 if (peekSucceed) {
5079 pixelDataPtr = static_cast<uint8_t*>(pixmap.writable_addr()); 5114 pixelDataPtr = static_cast<uint8_t*>(pixmap.writable_addr());
5080 } else { 5115 } else {
5081 pixelData = bitmap->copyBitmapData( 5116 pixelData = bitmap->copyBitmapData(
5082 bitmap->isPremultiplied() ? PremultiplyAlpha : DontPremultiplyAlpha); 5117 bitmap->isPremultiplied() ? PremultiplyAlpha : DontPremultiplyAlpha);
5083 pixelDataPtr = pixelData->data(); 5118 pixelDataPtr = pixelData->data();
5084 } 5119 }
5085 Vector<uint8_t> data; 5120 Vector<uint8_t> data;
5086 bool needConversion = true; 5121 bool needConversion = true;
5087 bool havePeekableRGBA = 5122 bool havePeekableRGBA =
5088 (peekSucceed && 5123 (peekSucceed &&
5089 pixmap.colorType() == SkColorType::kRGBA_8888_SkColorType); 5124 pixmap.colorType() == SkColorType::kRGBA_8888_SkColorType);
5090 bool isPixelDataRGBA = (havePeekableRGBA || !peekSucceed); 5125 bool isPixelDataRGBA = (havePeekableRGBA || !peekSucceed);
5091 if (isPixelDataRGBA && format == GL_RGBA && type == GL_UNSIGNED_BYTE) { 5126 if (isPixelDataRGBA && format == GL_RGBA && type == GL_UNSIGNED_BYTE) {
5092 needConversion = false; 5127 needConversion = false;
5093 } else { 5128 } else {
5094 if (type == GL_UNSIGNED_INT_10F_11F_11F_REV) { 5129 if (type == GL_UNSIGNED_INT_10F_11F_11F_REV) {
5095 // The UNSIGNED_INT_10F_11F_11F_REV type pack/unpack isn't implemented. 5130 // The UNSIGNED_INT_10F_11F_11F_REV type pack/unpack isn't implemented.
5096 type = GL_FLOAT; 5131 type = GL_FLOAT;
5097 } 5132 }
5098 // In the case of ImageBitmap, we do not need to apply flipY or premultiplyA lpha. 5133 // In the case of ImageBitmap, we do not need to apply flipY or
5134 // premultiplyAlpha.
5099 bool isPixelDataBGRA = 5135 bool isPixelDataBGRA =
5100 pixmap.colorType() == SkColorType::kBGRA_8888_SkColorType; 5136 pixmap.colorType() == SkColorType::kBGRA_8888_SkColorType;
5101 if ((isPixelDataBGRA && 5137 if ((isPixelDataBGRA &&
5102 !WebGLImageConversion::extractImageData( 5138 !WebGLImageConversion::extractImageData(
5103 pixelDataPtr, WebGLImageConversion::DataFormat::DataFormatBGRA8, 5139 pixelDataPtr, WebGLImageConversion::DataFormat::DataFormatBGRA8,
5104 bitmap->size(), format, type, false, false, data)) || 5140 bitmap->size(), format, type, false, false, data)) ||
5105 (isPixelDataRGBA && 5141 (isPixelDataRGBA &&
5106 !WebGLImageConversion::extractImageData( 5142 !WebGLImageConversion::extractImageData(
5107 pixelDataPtr, WebGLImageConversion::DataFormat::DataFormatRGBA8, 5143 pixelDataPtr, WebGLImageConversion::DataFormat::DataFormatRGBA8,
5108 bitmap->size(), format, type, false, false, data))) { 5144 bitmap->size(), format, type, false, false, data))) {
(...skipping 741 matching lines...) Expand 10 before | Expand all | Expand 10 after
5850 5886
5851 void WebGLRenderingContextBase::viewport(GLint x, 5887 void WebGLRenderingContextBase::viewport(GLint x,
5852 GLint y, 5888 GLint y,
5853 GLsizei width, 5889 GLsizei width,
5854 GLsizei height) { 5890 GLsizei height) {
5855 if (isContextLost()) 5891 if (isContextLost())
5856 return; 5892 return;
5857 contextGL()->Viewport(x, y, width, height); 5893 contextGL()->Viewport(x, y, width, height);
5858 } 5894 }
5859 5895
5860 // Added to provide a unified interface with CanvasRenderingContext2D. Prefer ca lling forceLostContext instead. 5896 // Added to provide a unified interface with CanvasRenderingContext2D. Prefer
5897 // calling forceLostContext instead.
5861 void WebGLRenderingContextBase::loseContext(LostContextMode mode) { 5898 void WebGLRenderingContextBase::loseContext(LostContextMode mode) {
5862 forceLostContext(mode, Manual); 5899 forceLostContext(mode, Manual);
5863 } 5900 }
5864 5901
5865 void WebGLRenderingContextBase::forceLostContext( 5902 void WebGLRenderingContextBase::forceLostContext(
5866 LostContextMode mode, 5903 LostContextMode mode,
5867 AutoRecoveryMethod autoRecoveryMethod) { 5904 AutoRecoveryMethod autoRecoveryMethod) {
5868 if (isContextLost()) { 5905 if (isContextLost()) {
5869 synthesizeGLError(GL_INVALID_OPERATION, "loseContext", 5906 synthesizeGLError(GL_INVALID_OPERATION, "loseContext",
5870 "context already lost"); 5907 "context already lost");
5871 return; 5908 return;
5872 } 5909 }
5873 5910
5874 m_contextGroup->loseContextGroup(mode, autoRecoveryMethod); 5911 m_contextGroup->loseContextGroup(mode, autoRecoveryMethod);
5875 } 5912 }
5876 5913
5877 void WebGLRenderingContextBase::loseContextImpl( 5914 void WebGLRenderingContextBase::loseContextImpl(
5878 WebGLRenderingContextBase::LostContextMode mode, 5915 WebGLRenderingContextBase::LostContextMode mode,
5879 AutoRecoveryMethod autoRecoveryMethod) { 5916 AutoRecoveryMethod autoRecoveryMethod) {
5880 if (isContextLost()) 5917 if (isContextLost())
5881 return; 5918 return;
5882 5919
5883 m_contextLostMode = mode; 5920 m_contextLostMode = mode;
5884 ASSERT(m_contextLostMode != NotLostContext); 5921 ASSERT(m_contextLostMode != NotLostContext);
5885 m_autoRecoveryMethod = autoRecoveryMethod; 5922 m_autoRecoveryMethod = autoRecoveryMethod;
5886 5923
5887 // Make absolutely sure we do not refer to an already-deleted texture or frame buffer. 5924 // Make absolutely sure we do not refer to an already-deleted texture or
5925 // framebuffer.
5888 drawingBuffer()->setTexture2DBinding(0); 5926 drawingBuffer()->setTexture2DBinding(0);
5889 drawingBuffer()->setFramebufferBinding(GL_FRAMEBUFFER, 0); 5927 drawingBuffer()->setFramebufferBinding(GL_FRAMEBUFFER, 0);
5890 drawingBuffer()->setRenderbufferBinding(0); 5928 drawingBuffer()->setRenderbufferBinding(0);
5891 5929
5892 detachAndRemoveAllObjects(); 5930 detachAndRemoveAllObjects();
5893 5931
5894 // Lose all the extensions. 5932 // Lose all the extensions.
5895 for (size_t i = 0; i < m_extensions.size(); ++i) { 5933 for (size_t i = 0; i < m_extensions.size(); ++i) {
5896 ExtensionTracker* tracker = m_extensions[i]; 5934 ExtensionTracker* tracker = m_extensions[i];
5897 tracker->loseExtension(false); 5935 tracker->loseExtension(false);
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
5948 SkFilterQuality filterQuality) { 5986 SkFilterQuality filterQuality) {
5949 if (!isContextLost() && drawingBuffer()) { 5987 if (!isContextLost() && drawingBuffer()) {
5950 drawingBuffer()->setFilterQuality(filterQuality); 5988 drawingBuffer()->setFilterQuality(filterQuality);
5951 } 5989 }
5952 } 5990 }
5953 5991
5954 Extensions3DUtil* WebGLRenderingContextBase::extensionsUtil() { 5992 Extensions3DUtil* WebGLRenderingContextBase::extensionsUtil() {
5955 if (!m_extensionsUtil) { 5993 if (!m_extensionsUtil) {
5956 gpu::gles2::GLES2Interface* gl = contextGL(); 5994 gpu::gles2::GLES2Interface* gl = contextGL();
5957 m_extensionsUtil = Extensions3DUtil::create(gl); 5995 m_extensionsUtil = Extensions3DUtil::create(gl);
5958 // The only reason the ExtensionsUtil should be invalid is if the gl context is lost. 5996 // The only reason the ExtensionsUtil should be invalid is if the gl context
5997 // is lost.
5959 ASSERT(m_extensionsUtil->isValid() || 5998 ASSERT(m_extensionsUtil->isValid() ||
5960 gl->GetGraphicsResetStatusKHR() != GL_NO_ERROR); 5999 gl->GetGraphicsResetStatusKHR() != GL_NO_ERROR);
5961 } 6000 }
5962 return m_extensionsUtil.get(); 6001 return m_extensionsUtil.get();
5963 } 6002 }
5964 6003
5965 void WebGLRenderingContextBase::removeSharedObject(WebGLSharedObject* object) { 6004 void WebGLRenderingContextBase::removeSharedObject(WebGLSharedObject* object) {
5966 m_contextGroup->removeObject(object); 6005 m_contextGroup->removeObject(object);
5967 } 6006 }
5968 6007
(...skipping 509 matching lines...) Expand 10 before | Expand all | Expand 10 after
6478 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y: 6517 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
6479 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: 6518 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
6480 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: 6519 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
6481 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: 6520 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
6482 if (functionType != TexSubImage && width != height) { 6521 if (functionType != TexSubImage && width != height) {
6483 synthesizeGLError(GL_INVALID_VALUE, functionName, 6522 synthesizeGLError(GL_INVALID_VALUE, functionName,
6484 "width != height for cube map"); 6523 "width != height for cube map");
6485 return false; 6524 return false;
6486 } 6525 }
6487 // No need to check height here. For texImage width == height. 6526 // No need to check height here. For texImage width == height.
6488 // For texSubImage that will be checked when checking yoffset + height is in range. 6527 // For texSubImage that will be checked when checking yoffset + height is
6528 // in range.
6489 if (width > (m_maxCubeMapTextureSize >> level)) { 6529 if (width > (m_maxCubeMapTextureSize >> level)) {
6490 synthesizeGLError(GL_INVALID_VALUE, functionName, 6530 synthesizeGLError(GL_INVALID_VALUE, functionName,
6491 "width or height out of range for cube map"); 6531 "width or height out of range for cube map");
6492 return false; 6532 return false;
6493 } 6533 }
6494 break; 6534 break;
6495 case GL_TEXTURE_3D: 6535 case GL_TEXTURE_3D:
6496 if (isWebGL2OrHigher()) { 6536 if (isWebGL2OrHigher()) {
6497 if (width > (m_max3DTextureSize >> level) || 6537 if (width > (m_max3DTextureSize >> level) ||
6498 height > (m_max3DTextureSize >> level) || 6538 height > (m_max3DTextureSize >> level) ||
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
6569 TexImageDimension texDimension, 6609 TexImageDimension texDimension,
6570 GLint level, 6610 GLint level,
6571 GLsizei width, 6611 GLsizei width,
6572 GLsizei height, 6612 GLsizei height,
6573 GLsizei depth, 6613 GLsizei depth,
6574 GLenum format, 6614 GLenum format,
6575 GLenum type, 6615 GLenum type,
6576 DOMArrayBufferView* pixels, 6616 DOMArrayBufferView* pixels,
6577 NullDisposition disposition, 6617 NullDisposition disposition,
6578 GLuint srcOffset) { 6618 GLuint srcOffset) {
6579 // All calling functions check isContextLost, so a duplicate check is not need ed here. 6619 // All calling functions check isContextLost, so a duplicate check is not
6620 // needed here.
6580 if (!pixels) { 6621 if (!pixels) {
6581 DCHECK_NE(disposition, NullNotReachable); 6622 DCHECK_NE(disposition, NullNotReachable);
6582 if (disposition == NullAllowed) 6623 if (disposition == NullAllowed)
6583 return true; 6624 return true;
6584 synthesizeGLError(GL_INVALID_VALUE, functionName, "no pixels"); 6625 synthesizeGLError(GL_INVALID_VALUE, functionName, "no pixels");
6585 return false; 6626 return false;
6586 } 6627 }
6587 6628
6588 if (!validateSettableTexFormat(functionName, format)) 6629 if (!validateSettableTexFormat(functionName, format))
6589 return false; 6630 return false;
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
6643 break; 6684 break;
6644 case GL_FLOAT: // OES_texture_float 6685 case GL_FLOAT: // OES_texture_float
6645 if (pixels->type() != DOMArrayBufferView::TypeFloat32) { 6686 if (pixels->type() != DOMArrayBufferView::TypeFloat32) {
6646 synthesizeGLError(GL_INVALID_OPERATION, functionName, 6687 synthesizeGLError(GL_INVALID_OPERATION, functionName,
6647 "type FLOAT but ArrayBufferView not Float32Array"); 6688 "type FLOAT but ArrayBufferView not Float32Array");
6648 return false; 6689 return false;
6649 } 6690 }
6650 break; 6691 break;
6651 case GL_HALF_FLOAT: 6692 case GL_HALF_FLOAT:
6652 case GL_HALF_FLOAT_OES: // OES_texture_half_float 6693 case GL_HALF_FLOAT_OES: // OES_texture_half_float
6653 // As per the specification, ArrayBufferView should be null or a Uint16Arr ay when 6694 // As per the specification, ArrayBufferView should be null or a
6654 // OES_texture_half_float is enabled. 6695 // Uint16Array when OES_texture_half_float is enabled.
6655 if (pixels->type() != DOMArrayBufferView::TypeUint16) { 6696 if (pixels->type() != DOMArrayBufferView::TypeUint16) {
6656 synthesizeGLError(GL_INVALID_OPERATION, functionName, 6697 synthesizeGLError(GL_INVALID_OPERATION, functionName,
6657 "type HALF_FLOAT_OES but ArrayBufferView is not NULL " 6698 "type HALF_FLOAT_OES but ArrayBufferView is not NULL "
6658 "and not Uint16Array"); 6699 "and not Uint16Array");
6659 return false; 6700 return false;
6660 } 6701 }
6661 break; 6702 break;
6662 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: 6703 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
6663 synthesizeGLError(GL_INVALID_OPERATION, functionName, 6704 synthesizeGLError(GL_INVALID_OPERATION, functionName,
6664 "type FLOAT_32_UNSIGNED_INT_24_8_REV but " 6705 "type FLOAT_32_UNSIGNED_INT_24_8_REV but "
(...skipping 442 matching lines...) Expand 10 before | Expand all | Expand 10 after
7107 LocalFrame* frame = canvas()->document().frame(); 7148 LocalFrame* frame = canvas()->document().frame();
7108 if (!frame) 7149 if (!frame)
7109 return; 7150 return;
7110 7151
7111 Settings* settings = frame->settings(); 7152 Settings* settings = frame->settings();
7112 7153
7113 if (!frame->loader().client()->allowWebGL(settings && 7154 if (!frame->loader().client()->allowWebGL(settings &&
7114 settings->webGLEnabled())) 7155 settings->webGLEnabled()))
7115 return; 7156 return;
7116 7157
7117 // If the context was lost due to RealLostContext, we need to destroy the old DrawingBuffer before creating new DrawingBuffer to ensure resource budget enough . 7158 // If the context was lost due to RealLostContext, we need to destroy the old
7159 // DrawingBuffer before creating new DrawingBuffer to ensure resource budget
7160 // enough.
7118 if (drawingBuffer()) { 7161 if (drawingBuffer()) {
7119 m_drawingBuffer->beginDestruction(); 7162 m_drawingBuffer->beginDestruction();
7120 m_drawingBuffer.clear(); 7163 m_drawingBuffer.clear();
7121 } 7164 }
7122 7165
7123 Platform::ContextAttributes attributes = 7166 Platform::ContextAttributes attributes =
7124 toPlatformContextAttributes(creationAttributes(), version()); 7167 toPlatformContextAttributes(creationAttributes(), version());
7125 Platform::GraphicsInfo glInfo; 7168 Platform::GraphicsInfo glInfo;
7126 std::unique_ptr<WebGraphicsContext3DProvider> contextProvider = 7169 std::unique_ptr<WebGraphicsContext3DProvider> contextProvider =
7127 wrapUnique(Platform::current()->createOffscreenGraphicsContext3DProvider( 7170 wrapUnique(Platform::current()->createOffscreenGraphicsContext3DProvider(
7128 attributes, canvas()->document().topDocument().url(), 0, &glInfo)); 7171 attributes, canvas()->document().topDocument().url(), 0, &glInfo));
7129 RefPtr<DrawingBuffer> buffer; 7172 RefPtr<DrawingBuffer> buffer;
7130 if (contextProvider && contextProvider->bindToCurrentThread()) { 7173 if (contextProvider && contextProvider->bindToCurrentThread()) {
7131 // Construct a new drawing buffer with the new GL context. 7174 // Construct a new drawing buffer with the new GL context.
7132 // TODO(xidachen): make sure that the second parameter is correct for Offscr eenCanvas. 7175 // TODO(xidachen): make sure that the second parameter is correct for
7176 // OffscreenCanvas.
7133 buffer = createDrawingBuffer(std::move(contextProvider), 7177 buffer = createDrawingBuffer(std::move(contextProvider),
7134 DrawingBuffer::AllowChromiumImage); 7178 DrawingBuffer::AllowChromiumImage);
7135 // If DrawingBuffer::create() fails to allocate a fbo, |drawingBuffer| is se t to null. 7179 // If DrawingBuffer::create() fails to allocate a fbo, |drawingBuffer| is
7180 // set to null.
7136 } 7181 }
7137 if (!buffer) { 7182 if (!buffer) {
7138 if (m_contextLostMode == RealLostContext) { 7183 if (m_contextLostMode == RealLostContext) {
7139 m_restoreTimer.startOneShot(secondsBetweenRestoreAttempts, 7184 m_restoreTimer.startOneShot(secondsBetweenRestoreAttempts,
7140 BLINK_FROM_HERE); 7185 BLINK_FROM_HERE);
7141 } else { 7186 } else {
7142 // This likely shouldn't happen but is the best way to report it to the We bGL app. 7187 // This likely shouldn't happen but is the best way to report it to the
7188 // WebGL app.
7143 synthesizeGLError(GL_INVALID_OPERATION, "", "error restoring context"); 7189 synthesizeGLError(GL_INVALID_OPERATION, "", "error restoring context");
7144 } 7190 }
7145 return; 7191 return;
7146 } 7192 }
7147 7193
7148 m_drawingBuffer = buffer.release(); 7194 m_drawingBuffer = buffer.release();
7149 m_drawingBuffer->addNewMailboxCallback( 7195 m_drawingBuffer->addNewMailboxCallback(
7150 WTF::bind(&WebGLRenderingContextBase::notifyCanvasContextChanged, 7196 WTF::bind(&WebGLRenderingContextBase::notifyCanvasContextChanged,
7151 wrapWeakPersistent(this))); 7197 wrapWeakPersistent(this)));
7152 7198
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
7344 void WebGLRenderingContextBase::restoreCurrentFramebuffer() { 7390 void WebGLRenderingContextBase::restoreCurrentFramebuffer() {
7345 bindFramebuffer(GL_FRAMEBUFFER, m_framebufferBinding.get()); 7391 bindFramebuffer(GL_FRAMEBUFFER, m_framebufferBinding.get());
7346 } 7392 }
7347 7393
7348 void WebGLRenderingContextBase::restoreCurrentTexture2D() { 7394 void WebGLRenderingContextBase::restoreCurrentTexture2D() {
7349 bindTexture(GL_TEXTURE_2D, 7395 bindTexture(GL_TEXTURE_2D,
7350 m_textureUnits[m_activeTextureUnit].m_texture2DBinding.get()); 7396 m_textureUnits[m_activeTextureUnit].m_texture2DBinding.get());
7351 } 7397 }
7352 7398
7353 void WebGLRenderingContextBase::findNewMaxNonDefaultTextureUnit() { 7399 void WebGLRenderingContextBase::findNewMaxNonDefaultTextureUnit() {
7354 // Trace backwards from the current max to find the new max non-default textur e unit 7400 // Trace backwards from the current max to find the new max non-default
7401 // texture unit
7355 int startIndex = m_onePlusMaxNonDefaultTextureUnit - 1; 7402 int startIndex = m_onePlusMaxNonDefaultTextureUnit - 1;
7356 for (int i = startIndex; i >= 0; --i) { 7403 for (int i = startIndex; i >= 0; --i) {
7357 if (m_textureUnits[i].m_texture2DBinding || 7404 if (m_textureUnits[i].m_texture2DBinding ||
7358 m_textureUnits[i].m_textureCubeMapBinding) { 7405 m_textureUnits[i].m_textureCubeMapBinding) {
7359 m_onePlusMaxNonDefaultTextureUnit = i + 1; 7406 m_onePlusMaxNonDefaultTextureUnit = i + 1;
7360 return; 7407 return;
7361 } 7408 }
7362 } 7409 }
7363 m_onePlusMaxNonDefaultTextureUnit = 0; 7410 m_onePlusMaxNonDefaultTextureUnit = 0;
7364 } 7411 }
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
7428 7475
7429 void WebGLRenderingContextBase::getHTMLOrOffscreenCanvas( 7476 void WebGLRenderingContextBase::getHTMLOrOffscreenCanvas(
7430 HTMLCanvasElementOrOffscreenCanvas& result) const { 7477 HTMLCanvasElementOrOffscreenCanvas& result) const {
7431 if (canvas()) 7478 if (canvas())
7432 result.setHTMLCanvasElement(canvas()); 7479 result.setHTMLCanvasElement(canvas());
7433 else 7480 else
7434 result.setOffscreenCanvas(getOffscreenCanvas()); 7481 result.setOffscreenCanvas(getOffscreenCanvas());
7435 } 7482 }
7436 7483
7437 } // namespace blink 7484 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698