diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2020-01-23 17:21:03 +0100 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2020-01-23 16:25:15 +0000 |
commit | c551f43206405019121bd2b2c93714319a0a3300 (patch) | |
tree | 1f48c30631c421fd4bbb3c36da20183c8a2ed7d7 /chromium/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc | |
parent | 7961cea6d1041e3e454dae6a1da660b453efd238 (diff) | |
download | qtwebengine-chromium-c551f43206405019121bd2b2c93714319a0a3300.tar.gz |
BASELINE: Update Chromium to 79.0.3945.139
Change-Id: I336b7182fab9bca80b709682489c07db112eaca5
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'chromium/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc')
-rw-r--r-- | chromium/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc | 178 |
1 files changed, 97 insertions, 81 deletions
diff --git a/chromium/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc b/chromium/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc index 1a094f9a03b..03338285aa6 100644 --- a/chromium/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc +++ b/chromium/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc @@ -28,6 +28,7 @@ #include <memory> #include <utility> +#include "base/feature_list.h" #include "base/numerics/checked_math.h" #include "base/stl_util.h" #include "build/build_config.h" @@ -115,6 +116,10 @@ #include "third_party/blink/renderer/platform/wtf/typed_arrays/array_buffer_contents.h" namespace blink { +namespace { +const base::Feature kLowLatencyWebGLSwapChain{ + "LowLatencyWebGLSwapChain", base::FEATURE_DISABLED_BY_DEFAULT}; +} // namespace bool WebGLRenderingContextBase::webgl_context_limits_initialized_ = false; unsigned WebGLRenderingContextBase::max_active_webgl_contexts_ = 0; @@ -440,6 +445,7 @@ void StripComments::Process(UChar c) { break; case kMiddleOfLine: + case kInPreprocessorDirective: if (c == '/' && Peek(temp)) { if (temp == '/') { parse_state_ = kInSingleLineComment; @@ -463,14 +469,6 @@ void StripComments::Process(UChar c) { Emit(c); break; - case kInPreprocessorDirective: - // No matter what the character is, just pass it - // through. Do not parse comments in this state. This - // might not be the right thing to do long term, but it - // should handle the #error preprocessor directive. - Emit(c); - break; - case kInSingleLineComment: // Line-continuation characters are processed before comment processing. // Advance string if a new line character is immediately behind @@ -772,9 +770,11 @@ WebGLRenderingContextBase::GetStaticBitmapImage( } scoped_refptr<StaticBitmapImage> WebGLRenderingContextBase::GetImage( - AccelerationHint hint) const { + AccelerationHint hint) { if (!GetDrawingBuffer()) return nullptr; + + ScopedFramebufferRestorer fbo_restorer(this); GetDrawingBuffer()->ResolveAndBindForReadAndDraw(); // Use the drawing buffer size here instead of the canvas size to ensure that // sizing is consistent for the GetStaticBitmapImage() result. The forced @@ -1097,7 +1097,7 @@ scoped_refptr<DrawingBuffer> WebGLRenderingContextBase::CreateDrawingBuffer( : DrawingBuffer::kAllowChromiumImage; bool using_swap_chain = - RuntimeEnabledFeatures::WebGLSwapChainEnabled() && + base::FeatureList::IsEnabled(kLowLatencyWebGLSwapChain) && context_provider->GetCapabilities().shared_image_swap_chain && CreationAttributes().desynchronized; @@ -1391,22 +1391,31 @@ void WebGLRenderingContextBase::DidDraw() { CanvasRenderingContext::DidDraw(); } -void WebGLRenderingContextBase::PushFrame() { +bool WebGLRenderingContextBase::PushFrame() { int width = GetDrawingBuffer()->Size().Width(); int height = GetDrawingBuffer()->Size().Height(); + int submitted_frame = false; if (PaintRenderingResultsToCanvas(kBackBuffer)) { if (Host()->GetOrCreateCanvasResourceProvider(kPreferAcceleration)) { - Host()->PushFrame(Host()->ResourceProvider()->ProduceCanvasResource(), - SkIRect::MakeWH(width, height)); + submitted_frame = + Host()->PushFrame(Host()->ResourceProvider()->ProduceCanvasResource(), + SkIRect::MakeWH(width, height)); } } MarkLayerComposited(); + return submitted_frame; } void WebGLRenderingContextBase::FinalizeFrame() { if (GetDrawingBuffer() && GetDrawingBuffer()->UsingSwapChain()) GetDrawingBuffer()->PresentSwapChain(); marked_canvas_dirty_ = false; + + // For low-latency canvases + const bool webgl_overlay_enabled = + RuntimeEnabledFeatures::WebGLImageChromiumEnabled() || UsingSwapChain(); + if (canvas() && canvas()->LowLatencyEnabled() && !webgl_overlay_enabled) + PaintRenderingResultsToCanvas(kBackBuffer); } void WebGLRenderingContextBase::OnErrorMessage(const char* message, @@ -1611,7 +1620,7 @@ bool WebGLRenderingContextBase::ContextCreatedOnXRCompatibleAdapter() { bool WebGLRenderingContextBase::CopyRenderingResultsFromDrawingBuffer( CanvasResourceProvider* resource_provider, - SourceDrawingBuffer source_buffer) const { + SourceDrawingBuffer source_buffer) { if (!drawing_buffer_) return false; if (resource_provider->IsAccelerated()) { @@ -1657,8 +1666,7 @@ IntSize WebGLRenderingContextBase::DrawingBufferSize() const { return GetDrawingBuffer()->Size(); } -scoped_refptr<Uint8Array> -WebGLRenderingContextBase::PaintRenderingResultsToDataArray( +sk_sp<SkData> WebGLRenderingContextBase::PaintRenderingResultsToDataArray( SourceDrawingBuffer source_buffer) { if (isContextLost()) return nullptr; @@ -2911,7 +2919,7 @@ ScriptValue WebGLRenderingContextBase::getBufferParameter( GLenum target, GLenum pname) { if (isContextLost() || !ValidateBufferTarget("getBufferParameter", target)) - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); switch (pname) { case GL_BUFFER_USAGE: { @@ -2929,7 +2937,7 @@ ScriptValue WebGLRenderingContextBase::getBufferParameter( default: SynthesizeGLError(GL_INVALID_ENUM, "getBufferParameter", "invalid parameter name"); - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); } } @@ -3033,7 +3041,7 @@ ScriptValue WebGLRenderingContextBase::getExtension(ScriptState* script_state, ToV8(extension, script_state->GetContext()->Global(), script_state->GetIsolate()); - return ScriptValue(script_state, wrapped_extension); + return ScriptValue(script_state->GetIsolate(), wrapped_extension); } ScriptValue WebGLRenderingContextBase::getFramebufferAttachmentParameter( @@ -3044,18 +3052,18 @@ ScriptValue WebGLRenderingContextBase::getFramebufferAttachmentParameter( if (isContextLost() || !ValidateFramebufferFuncParameters("getFramebufferAttachmentParameter", target, attachment)) - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); if (!framebuffer_binding_ || !framebuffer_binding_->Object()) { SynthesizeGLError(GL_INVALID_OPERATION, "getFramebufferAttachmentParameter", "no framebuffer bound"); - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); } if (framebuffer_binding_ && framebuffer_binding_->Opaque()) { SynthesizeGLError(GL_INVALID_OPERATION, "getFramebufferAttachmentParameter", "cannot query parameters of an opaque framebuffer"); - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); } WebGLSharedObject* attachment_object = @@ -3067,7 +3075,7 @@ ScriptValue WebGLRenderingContextBase::getFramebufferAttachmentParameter( // specifies INVALID_OPERATION. SynthesizeGLError(GL_INVALID_ENUM, "getFramebufferAttachmentParameter", "invalid parameter name"); - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); } DCHECK(attachment_object->IsTexture() || attachment_object->IsRenderbuffer()); @@ -3093,11 +3101,11 @@ ScriptValue WebGLRenderingContextBase::getFramebufferAttachmentParameter( } SynthesizeGLError(GL_INVALID_ENUM, "getFramebufferAttachmentParameter", "invalid parameter name for renderbuffer attachment"); - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); default: SynthesizeGLError(GL_INVALID_ENUM, "getFramebufferAttachmentParameter", "invalid parameter name for texture attachment"); - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); } } else { switch (pname) { @@ -3114,11 +3122,11 @@ ScriptValue WebGLRenderingContextBase::getFramebufferAttachmentParameter( } SynthesizeGLError(GL_INVALID_ENUM, "getFramebufferAttachmentParameter", "invalid parameter name for renderbuffer attachment"); - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); default: SynthesizeGLError(GL_INVALID_ENUM, "getFramebufferAttachmentParameter", "invalid parameter name for renderbuffer attachment"); - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); } } } @@ -3126,7 +3134,7 @@ ScriptValue WebGLRenderingContextBase::getFramebufferAttachmentParameter( ScriptValue WebGLRenderingContextBase::getParameter(ScriptState* script_state, GLenum pname) { if (isContextLost()) - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); const int kIntZero = 0; switch (pname) { case GL_ACTIVE_TEXTURE: @@ -3336,7 +3344,7 @@ ScriptValue WebGLRenderingContextBase::getParameter(ScriptState* script_state, SynthesizeGLError( GL_INVALID_ENUM, "getParameter", "invalid parameter name, OES_standard_derivatives not enabled"); - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); case WebGLDebugRendererInfo::kUnmaskedRendererWebgl: if (ExtensionEnabled(kWebGLDebugRendererInfoName)) return WebGLAny(script_state, @@ -3344,7 +3352,7 @@ ScriptValue WebGLRenderingContextBase::getParameter(ScriptState* script_state, SynthesizeGLError( GL_INVALID_ENUM, "getParameter", "invalid parameter name, WEBGL_debug_renderer_info not enabled"); - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); case WebGLDebugRendererInfo::kUnmaskedVendorWebgl: if (ExtensionEnabled(kWebGLDebugRendererInfoName)) return WebGLAny(script_state, @@ -3352,59 +3360,60 @@ ScriptValue WebGLRenderingContextBase::getParameter(ScriptState* script_state, SynthesizeGLError( GL_INVALID_ENUM, "getParameter", "invalid parameter name, WEBGL_debug_renderer_info not enabled"); - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); case GL_VERTEX_ARRAY_BINDING_OES: // OES_vertex_array_object if (ExtensionEnabled(kOESVertexArrayObjectName) || IsWebGL2OrHigher()) { if (!bound_vertex_array_object_->IsDefaultObject()) return WebGLAny(script_state, bound_vertex_array_object_.Get()); - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); } SynthesizeGLError( GL_INVALID_ENUM, "getParameter", "invalid parameter name, OES_vertex_array_object not enabled"); - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT: // EXT_texture_filter_anisotropic - if (ExtensionEnabled(kEXTTextureFilterAnisotropicName)) - return GetUnsignedIntParameter(script_state, - GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT); + if (ExtensionEnabled(kEXTTextureFilterAnisotropicName)) { + return GetFloatParameter(script_state, + GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT); + } SynthesizeGLError( GL_INVALID_ENUM, "getParameter", "invalid parameter name, EXT_texture_filter_anisotropic not enabled"); - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); case GL_MAX_COLOR_ATTACHMENTS_EXT: // EXT_draw_buffers BEGIN if (ExtensionEnabled(kWebGLDrawBuffersName) || IsWebGL2OrHigher()) return WebGLAny(script_state, MaxColorAttachments()); SynthesizeGLError( GL_INVALID_ENUM, "getParameter", "invalid parameter name, WEBGL_draw_buffers not enabled"); - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); case GL_MAX_DRAW_BUFFERS_EXT: if (ExtensionEnabled(kWebGLDrawBuffersName) || IsWebGL2OrHigher()) return WebGLAny(script_state, MaxDrawBuffers()); SynthesizeGLError( GL_INVALID_ENUM, "getParameter", "invalid parameter name, WEBGL_draw_buffers not enabled"); - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); case GL_TIMESTAMP_EXT: if (ExtensionEnabled(kEXTDisjointTimerQueryName)) return WebGLAny(script_state, 0); SynthesizeGLError( GL_INVALID_ENUM, "getParameter", "invalid parameter name, EXT_disjoint_timer_query not enabled"); - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); case GL_GPU_DISJOINT_EXT: if (ExtensionEnabled(kEXTDisjointTimerQueryName)) return GetBooleanParameter(script_state, GL_GPU_DISJOINT_EXT); SynthesizeGLError( GL_INVALID_ENUM, "getParameter", "invalid parameter name, EXT_disjoint_timer_query not enabled"); - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); case GL_MAX_VIEWS_OVR: if (ExtensionEnabled(kOVRMultiview2Name)) return GetIntParameter(script_state, pname); SynthesizeGLError(GL_INVALID_ENUM, "getParameter", "invalid parameter name, OVR_multiview2 not enabled"); - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); default: if ((ExtensionEnabled(kWebGLDrawBuffersName) || IsWebGL2OrHigher()) && pname >= GL_DRAW_BUFFER0_EXT && @@ -3418,7 +3427,7 @@ ScriptValue WebGLRenderingContextBase::getParameter(ScriptState* script_state, } SynthesizeGLError(GL_INVALID_ENUM, "getParameter", "invalid parameter name"); - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); } } @@ -3427,7 +3436,7 @@ ScriptValue WebGLRenderingContextBase::getProgramParameter( WebGLProgram* program, GLenum pname) { if (!ValidateWebGLProgramOrShader("getProgramParamter", program)) { - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); } GLint value = 0; @@ -3443,7 +3452,7 @@ ScriptValue WebGLRenderingContextBase::getProgramParameter( if (!ExtensionEnabled(kKHRParallelShaderCompileName)) { SynthesizeGLError(GL_INVALID_ENUM, "getProgramParameter", "invalid parameter name"); - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); } bool completed; if (checkProgramCompletionQueryAvailable(program, &completed)) { @@ -3455,7 +3464,7 @@ ScriptValue WebGLRenderingContextBase::getProgramParameter( if (!IsWebGL2OrHigher()) { SynthesizeGLError(GL_INVALID_ENUM, "getProgramParameter", "invalid parameter name"); - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); } FALLTHROUGH; case GL_ATTACHED_SHADERS: @@ -3467,7 +3476,7 @@ ScriptValue WebGLRenderingContextBase::getProgramParameter( if (!IsWebGL2OrHigher()) { SynthesizeGLError(GL_INVALID_ENUM, "getProgramParameter", "invalid parameter name"); - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); } ContextGL()->GetProgramiv(ObjectOrZero(program), pname, &value); return WebGLAny(script_state, static_cast<unsigned>(value)); @@ -3480,7 +3489,7 @@ ScriptValue WebGLRenderingContextBase::getProgramParameter( default: SynthesizeGLError(GL_INVALID_ENUM, "getProgramParameter", "invalid parameter name"); - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); } } @@ -3496,16 +3505,16 @@ ScriptValue WebGLRenderingContextBase::getRenderbufferParameter( GLenum target, GLenum pname) { if (isContextLost()) - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); if (target != GL_RENDERBUFFER) { SynthesizeGLError(GL_INVALID_ENUM, "getRenderbufferParameter", "invalid target"); - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); } if (!renderbuffer_binding_ || !renderbuffer_binding_->Object()) { SynthesizeGLError(GL_INVALID_OPERATION, "getRenderbufferParameter", "no renderbuffer bound"); - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); } GLint value = 0; @@ -3514,7 +3523,7 @@ ScriptValue WebGLRenderingContextBase::getRenderbufferParameter( if (!IsWebGL2OrHigher()) { SynthesizeGLError(GL_INVALID_ENUM, "getRenderbufferParameter", "invalid parameter name"); - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); } FALLTHROUGH; case GL_RENDERBUFFER_WIDTH: @@ -3534,7 +3543,7 @@ ScriptValue WebGLRenderingContextBase::getRenderbufferParameter( default: SynthesizeGLError(GL_INVALID_ENUM, "getRenderbufferParameter", "invalid parameter name"); - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); } } @@ -3543,7 +3552,7 @@ ScriptValue WebGLRenderingContextBase::getShaderParameter( WebGLShader* shader, GLenum pname) { if (!ValidateWebGLProgramOrShader("getShaderParameter", shader)) { - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); } GLint value = 0; switch (pname) { @@ -3556,7 +3565,7 @@ ScriptValue WebGLRenderingContextBase::getShaderParameter( if (!ExtensionEnabled(kKHRParallelShaderCompileName)) { SynthesizeGLError(GL_INVALID_ENUM, "getShaderParameter", "invalid parameter name"); - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); } ContextGL()->GetShaderiv(ObjectOrZero(shader), pname, &value); return WebGLAny(script_state, static_cast<bool>(value)); @@ -3566,7 +3575,7 @@ ScriptValue WebGLRenderingContextBase::getShaderParameter( default: SynthesizeGLError(GL_INVALID_ENUM, "getShaderParameter", "invalid parameter name"); - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); } } @@ -3637,9 +3646,9 @@ ScriptValue WebGLRenderingContextBase::getTexParameter( GLenum target, GLenum pname) { if (isContextLost()) - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); if (!ValidateTextureBinding("getTexParameter", target)) - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); switch (pname) { case GL_TEXTURE_MAG_FILTER: case GL_TEXTURE_MIN_FILTER: @@ -3658,11 +3667,11 @@ ScriptValue WebGLRenderingContextBase::getTexParameter( SynthesizeGLError( GL_INVALID_ENUM, "getTexParameter", "invalid parameter name, EXT_texture_filter_anisotropic not enabled"); - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); default: SynthesizeGLError(GL_INVALID_ENUM, "getTexParameter", "invalid parameter name"); - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); } } @@ -3671,12 +3680,12 @@ ScriptValue WebGLRenderingContextBase::getUniform( WebGLProgram* program, const WebGLUniformLocation* uniform_location) { if (!ValidateWebGLProgramOrShader("getUniform", program)) - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); DCHECK(uniform_location); if (uniform_location->Program() != program) { SynthesizeGLError(GL_INVALID_OPERATION, "getUniform", "no uniformlocation or not valid for this program"); - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); } GLint location = uniform_location->Location(); @@ -3685,11 +3694,11 @@ ScriptValue WebGLRenderingContextBase::getUniform( ContextGL()->GetProgramiv(program_id, GL_ACTIVE_UNIFORM_MAX_LENGTH, &max_name_length); if (max_name_length < 0) - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); if (max_name_length == 0) { SynthesizeGLError(GL_INVALID_VALUE, "getUniform", "no active uniforms exist"); - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); } // FIXME: make this more efficient using WebGLUniformLocation and caching @@ -3707,7 +3716,7 @@ ScriptValue WebGLRenderingContextBase::getUniform( &size, &type, reinterpret_cast<GLchar*>(name_ptr)); if (size < 0) - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); String name(name_impl->Substring(0, name_length)); StringBuilder name_builder; // Strip "[0]" from the name if it's an array. @@ -3802,7 +3811,7 @@ ScriptValue WebGLRenderingContextBase::getUniform( SynthesizeGLError( GL_INVALID_VALUE, "getUniform", "unhandled type, WEBGL_video_texture extension not enabled"); - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); } base_type = GL_INT; length = 1; @@ -3812,7 +3821,7 @@ ScriptValue WebGLRenderingContextBase::getUniform( // Can't handle this type SynthesizeGLError(GL_INVALID_VALUE, "getUniform", "unhandled type"); - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); } // handle GLenums for WebGL 2.0 or higher switch (type) { @@ -3887,7 +3896,7 @@ ScriptValue WebGLRenderingContextBase::getUniform( if (context_type_ != Platform::kWebGL2ComputeContextType) { SynthesizeGLError(GL_INVALID_VALUE, "getUniform", "unhandled type"); - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); } base_type = GL_INT; length = 1; @@ -3897,7 +3906,7 @@ ScriptValue WebGLRenderingContextBase::getUniform( // Can't handle this type SynthesizeGLError(GL_INVALID_VALUE, "getUniform", "unhandled type"); - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); } } switch (base_type) { @@ -3944,7 +3953,7 @@ ScriptValue WebGLRenderingContextBase::getUniform( // If we get here, something went wrong in our unfortunately complex logic // above SynthesizeGLError(GL_INVALID_VALUE, "getUniform", "unknown error"); - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); } WebGLUniformLocation* WebGLRenderingContextBase::getUniformLocation( @@ -3975,11 +3984,11 @@ ScriptValue WebGLRenderingContextBase::getVertexAttrib( GLuint index, GLenum pname) { if (isContextLost()) - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); if (index >= max_vertex_attribs_) { SynthesizeGLError(GL_INVALID_VALUE, "getVertexAttrib", "index out of range"); - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); } if ((ExtensionEnabled(kANGLEInstancedArraysName) || IsWebGL2OrHigher()) && @@ -4033,7 +4042,7 @@ ScriptValue WebGLRenderingContextBase::getVertexAttrib( NOTREACHED(); break; } - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); } case GL_VERTEX_ATTRIB_ARRAY_INTEGER: if (IsWebGL2OrHigher()) { @@ -4045,7 +4054,7 @@ ScriptValue WebGLRenderingContextBase::getVertexAttrib( default: SynthesizeGLError(GL_INVALID_ENUM, "getVertexAttrib", "invalid parameter name"); - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); } } @@ -5455,9 +5464,13 @@ void WebGLRenderingContextBase::TexImageHelperCanvasRenderingContextHost( // TODO(crbug.com/612542): Implement GPU-to-GPU copy path for more // cases, like copying to layers of 3D textures, and elements of // 2D texture arrays. + bool flip_y = unpack_flip_y_; + if (is_origin_top_left_ && is_webgl_canvas) + flip_y = !flip_y; + TexImageImpl(function_id, target, level, internalformat, xoffset, yoffset, zoffset, format, type, image.get(), - WebGLImageConversion::kHtmlDomCanvas, unpack_flip_y_, + WebGLImageConversion::kHtmlDomCanvas, flip_y, unpack_premultiply_alpha_, source_sub_rectangle, depth, unpack_image_height); } @@ -5722,7 +5735,7 @@ void WebGLRenderingContextBase::TexImageHelperImageBitmap( SkPixmap pixmap; uint8_t* pixel_data_ptr = nullptr; - scoped_refptr<Uint8Array> pixel_data; + Vector<uint8_t> pixel_data; // In the case where an ImageBitmap is not texture backed, peekPixels() always // succeed. However, when it is texture backed and !canUseTexImageByGPU, we // do a GPU read back. @@ -5732,7 +5745,7 @@ void WebGLRenderingContextBase::TexImageHelperImageBitmap( } else { pixel_data = bitmap->CopyBitmapData( bitmap->IsPremultiplied() ? kPremultiplyAlpha : kUnpremultiplyAlpha); - pixel_data_ptr = pixel_data->Data(); + pixel_data_ptr = pixel_data.data(); } Vector<uint8_t> data; bool need_conversion = true; @@ -6803,7 +6816,7 @@ ScriptValue WebGLRenderingContextBase::GetIntParameter( if (value == 0) { // This indicates read framebuffer is incomplete and an // INVALID_OPERATION has been generated. - return ScriptValue::CreateNull(script_state); + return ScriptValue::CreateNull(script_state->GetIsolate()); } break; default: @@ -7502,9 +7515,12 @@ void WebGLRenderingContextBase::PrintGLErrorToConsole(const String& message) { } void WebGLRenderingContextBase::PrintWarningToConsole(const String& message) { - Host()->GetTopExecutionContext()->AddConsoleMessage( - ConsoleMessage::Create(mojom::ConsoleMessageSource::kRendering, - mojom::ConsoleMessageLevel::kWarning, message)); + blink::ExecutionContext* context = Host()->GetTopExecutionContext(); + if (context) { + context->AddConsoleMessage( + ConsoleMessage::Create(mojom::ConsoleMessageSource::kRendering, + mojom::ConsoleMessageLevel::kWarning, message)); + } } bool WebGLRenderingContextBase::ValidateFramebufferFuncParameters( |