OLD | NEW |
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 11 matching lines...) Expand all Loading... |
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
24 */ | 24 */ |
25 | 25 |
26 #include "config.h" | 26 #include "config.h" |
27 #include "core/html/canvas/WebGLRenderingContext.h" | 27 #include "core/html/canvas/WebGLRenderingContext.h" |
28 | 28 |
29 #include "core/frame/LocalFrame.h" | 29 #include "core/frame/LocalFrame.h" |
30 #include "core/html/canvas/ANGLEInstancedArrays.h" | 30 #include "core/html/canvas/ANGLEInstancedArrays.h" |
31 #include "core/html/canvas/CHROMIUMSubscribeUniform.h" | 31 #include "core/html/canvas/CHROMIUMSubscribeUniform.h" |
| 32 #include "core/html/canvas/ContextAttributeHelpers.h" |
32 #include "core/html/canvas/EXTBlendMinMax.h" | 33 #include "core/html/canvas/EXTBlendMinMax.h" |
33 #include "core/html/canvas/EXTFragDepth.h" | 34 #include "core/html/canvas/EXTFragDepth.h" |
34 #include "core/html/canvas/EXTShaderTextureLOD.h" | 35 #include "core/html/canvas/EXTShaderTextureLOD.h" |
35 #include "core/html/canvas/EXTTextureFilterAnisotropic.h" | 36 #include "core/html/canvas/EXTTextureFilterAnisotropic.h" |
36 #include "core/html/canvas/EXTsRGB.h" | 37 #include "core/html/canvas/EXTsRGB.h" |
37 #include "core/html/canvas/OESElementIndexUint.h" | 38 #include "core/html/canvas/OESElementIndexUint.h" |
38 #include "core/html/canvas/OESStandardDerivatives.h" | 39 #include "core/html/canvas/OESStandardDerivatives.h" |
39 #include "core/html/canvas/OESTextureFloat.h" | 40 #include "core/html/canvas/OESTextureFloat.h" |
40 #include "core/html/canvas/OESTextureFloatLinear.h" | 41 #include "core/html/canvas/OESTextureFloatLinear.h" |
41 #include "core/html/canvas/OESTextureHalfFloat.h" | 42 #include "core/html/canvas/OESTextureHalfFloat.h" |
42 #include "core/html/canvas/OESTextureHalfFloatLinear.h" | 43 #include "core/html/canvas/OESTextureHalfFloatLinear.h" |
43 #include "core/html/canvas/OESVertexArrayObject.h" | 44 #include "core/html/canvas/OESVertexArrayObject.h" |
44 #include "core/html/canvas/WebGLCompressedTextureATC.h" | 45 #include "core/html/canvas/WebGLCompressedTextureATC.h" |
45 #include "core/html/canvas/WebGLCompressedTextureETC1.h" | 46 #include "core/html/canvas/WebGLCompressedTextureETC1.h" |
46 #include "core/html/canvas/WebGLCompressedTexturePVRTC.h" | 47 #include "core/html/canvas/WebGLCompressedTexturePVRTC.h" |
47 #include "core/html/canvas/WebGLCompressedTextureS3TC.h" | 48 #include "core/html/canvas/WebGLCompressedTextureS3TC.h" |
48 #include "core/html/canvas/WebGLContextAttributes.h" | |
49 #include "core/html/canvas/WebGLContextEvent.h" | 49 #include "core/html/canvas/WebGLContextEvent.h" |
50 #include "core/html/canvas/WebGLDebugRendererInfo.h" | 50 #include "core/html/canvas/WebGLDebugRendererInfo.h" |
51 #include "core/html/canvas/WebGLDebugShaders.h" | 51 #include "core/html/canvas/WebGLDebugShaders.h" |
52 #include "core/html/canvas/WebGLDepthTexture.h" | 52 #include "core/html/canvas/WebGLDepthTexture.h" |
53 #include "core/html/canvas/WebGLDrawBuffers.h" | 53 #include "core/html/canvas/WebGLDrawBuffers.h" |
54 #include "core/html/canvas/WebGLLoseContext.h" | 54 #include "core/html/canvas/WebGLLoseContext.h" |
55 #include "core/loader/FrameLoader.h" | 55 #include "core/loader/FrameLoader.h" |
56 #include "core/loader/FrameLoaderClient.h" | 56 #include "core/loader/FrameLoaderClient.h" |
57 #include "core/frame/Settings.h" | 57 #include "core/frame/Settings.h" |
58 #include "core/rendering/RenderBox.h" | 58 #include "core/rendering/RenderBox.h" |
59 #include "platform/CheckedInt.h" | 59 #include "platform/CheckedInt.h" |
60 #include "platform/graphics/gpu/DrawingBuffer.h" | 60 #include "platform/graphics/gpu/DrawingBuffer.h" |
61 #include "public/platform/Platform.h" | 61 #include "public/platform/Platform.h" |
62 | 62 |
63 namespace blink { | 63 namespace blink { |
64 | 64 |
65 static bool shouldFailContextCreationForTesting = false; | 65 static bool shouldFailContextCreationForTesting = false; |
66 | 66 |
67 PassOwnPtrWillBeRawPtr<WebGLRenderingContext> WebGLRenderingContext::create(HTML
CanvasElement* canvas, WebGLContextAttributes* attrs) | 67 PassOwnPtrWillBeRawPtr<WebGLRenderingContext> WebGLRenderingContext::create(HTML
CanvasElement* canvas, const CanvasContextCreationAttributes& attrs) |
68 { | 68 { |
69 Document& document = canvas->document(); | 69 Document& document = canvas->document(); |
70 LocalFrame* frame = document.frame(); | 70 LocalFrame* frame = document.frame(); |
71 if (!frame) { | 71 if (!frame) { |
72 canvas->dispatchEvent(WebGLContextEvent::create(EventTypeNames::webglcon
textcreationerror, false, true, "Web page was not allowed to create a WebGL cont
ext.")); | 72 canvas->dispatchEvent(WebGLContextEvent::create(EventTypeNames::webglcon
textcreationerror, false, true, "Web page was not allowed to create a WebGL cont
ext.")); |
73 return nullptr; | 73 return nullptr; |
74 } | 74 } |
75 Settings* settings = frame->settings(); | 75 Settings* settings = frame->settings(); |
76 | 76 |
77 // The FrameLoaderClient might block creation of a new WebGL context despite
the page settings; in | 77 // The FrameLoaderClient might block creation of a new WebGL context despite
the page settings; in |
78 // particular, if WebGL contexts were lost one or more times via the GL_ARB_
robustness extension. | 78 // particular, if WebGL contexts were lost one or more times via the GL_ARB_
robustness extension. |
79 if (!frame->loader().client()->allowWebGL(settings && settings->webGLEnabled
())) { | 79 if (!frame->loader().client()->allowWebGL(settings && settings->webGLEnabled
())) { |
80 canvas->dispatchEvent(WebGLContextEvent::create(EventTypeNames::webglcon
textcreationerror, false, true, "Web page was not allowed to create a WebGL cont
ext.")); | 80 canvas->dispatchEvent(WebGLContextEvent::create(EventTypeNames::webglcon
textcreationerror, false, true, "Web page was not allowed to create a WebGL cont
ext.")); |
81 return nullptr; | 81 return nullptr; |
82 } | 82 } |
83 | 83 |
84 // The only situation that attrs is null is through Document::getCSSCanvasCo
ntext(). | 84 WebGLContextAttributes attributes = toWebGLContextAttributes(attrs); |
85 RefPtrWillBeRawPtr<WebGLContextAttributes> defaultAttrs = nullptr; | 85 blink::WebGraphicsContext3D::Attributes wgc3dAttributes = toWebGraphicsConte
xt3DAttributes(attributes, document.topDocument().url().string(), settings, 1); |
86 if (!attrs) { | |
87 defaultAttrs = WebGLContextAttributes::create(); | |
88 attrs = defaultAttrs.get(); | |
89 } | |
90 blink::WebGraphicsContext3D::Attributes attributes = attrs->attributes(docum
ent.topDocument().url().string(), settings, 1); | |
91 blink::WebGLInfo glInfo; | 86 blink::WebGLInfo glInfo; |
92 OwnPtr<blink::WebGraphicsContext3D> context = adoptPtr(blink::Platform::curr
ent()->createOffscreenGraphicsContext3D(attributes, 0, &glInfo)); | 87 OwnPtr<blink::WebGraphicsContext3D> context = adoptPtr(blink::Platform::curr
ent()->createOffscreenGraphicsContext3D(wgc3dAttributes, 0, &glInfo)); |
93 if (!context || shouldFailContextCreationForTesting) { | 88 if (!context || shouldFailContextCreationForTesting) { |
94 shouldFailContextCreationForTesting = false; | 89 shouldFailContextCreationForTesting = false; |
95 String statusMessage("Could not create a WebGL context for VendorInfo =
"); | 90 String statusMessage("Could not create a WebGL context for VendorInfo =
"); |
96 statusMessage.append(glInfo.vendorInfo); | 91 statusMessage.append(glInfo.vendorInfo); |
97 statusMessage.append(", RendererInfo = "); | 92 statusMessage.append(", RendererInfo = "); |
98 statusMessage.append(glInfo.rendererInfo); | 93 statusMessage.append(glInfo.rendererInfo); |
99 statusMessage.append(", DriverInfo = "); | 94 statusMessage.append(", DriverInfo = "); |
100 statusMessage.append(glInfo.driverVersion); | 95 statusMessage.append(glInfo.driverVersion); |
101 statusMessage.append("."); | 96 statusMessage.append("."); |
102 canvas->dispatchEvent(WebGLContextEvent::create(EventTypeNames::webglcon
textcreationerror, false, true, statusMessage)); | 97 canvas->dispatchEvent(WebGLContextEvent::create(EventTypeNames::webglcon
textcreationerror, false, true, statusMessage)); |
103 return nullptr; | 98 return nullptr; |
104 } | 99 } |
105 | 100 |
106 OwnPtr<Extensions3DUtil> extensionsUtil = Extensions3DUtil::create(context.g
et()); | 101 OwnPtr<Extensions3DUtil> extensionsUtil = Extensions3DUtil::create(context.g
et()); |
107 if (!extensionsUtil) | 102 if (!extensionsUtil) |
108 return nullptr; | 103 return nullptr; |
109 if (extensionsUtil->supportsExtension("GL_EXT_debug_marker")) | 104 if (extensionsUtil->supportsExtension("GL_EXT_debug_marker")) |
110 context->pushGroupMarkerEXT("WebGLRenderingContext"); | 105 context->pushGroupMarkerEXT("WebGLRenderingContext"); |
111 | 106 |
112 OwnPtrWillBeRawPtr<WebGLRenderingContext> renderingContext = adoptPtrWillBeN
oop(new WebGLRenderingContext(canvas, context.release(), attrs)); | 107 OwnPtrWillBeRawPtr<WebGLRenderingContext> renderingContext = adoptPtrWillBeN
oop(new WebGLRenderingContext(canvas, context.release(), attributes)); |
113 renderingContext->registerContextExtensions(); | 108 renderingContext->registerContextExtensions(); |
114 renderingContext->suspendIfNeeded(); | 109 renderingContext->suspendIfNeeded(); |
115 | 110 |
116 if (!renderingContext->drawingBuffer()) { | 111 if (!renderingContext->drawingBuffer()) { |
117 canvas->dispatchEvent(WebGLContextEvent::create(EventTypeNames::webglcon
textcreationerror, false, true, "Could not create a WebGL context.")); | 112 canvas->dispatchEvent(WebGLContextEvent::create(EventTypeNames::webglcon
textcreationerror, false, true, "Could not create a WebGL context.")); |
118 return nullptr; | 113 return nullptr; |
119 } | 114 } |
120 | 115 |
121 return renderingContext.release(); | 116 return renderingContext.release(); |
122 } | 117 } |
123 | 118 |
124 WebGLRenderingContext::WebGLRenderingContext(HTMLCanvasElement* passedCanvas, Pa
ssOwnPtr<blink::WebGraphicsContext3D> context, WebGLContextAttributes* requested
Attributes) | 119 WebGLRenderingContext::WebGLRenderingContext(HTMLCanvasElement* passedCanvas, Pa
ssOwnPtr<blink::WebGraphicsContext3D> context, const WebGLContextAttributes& req
uestedAttributes) |
125 : WebGLRenderingContextBase(passedCanvas, context, requestedAttributes) | 120 : WebGLRenderingContextBase(passedCanvas, context, requestedAttributes) |
126 { | 121 { |
127 } | 122 } |
128 | 123 |
129 WebGLRenderingContext::~WebGLRenderingContext() | 124 WebGLRenderingContext::~WebGLRenderingContext() |
130 { | 125 { |
131 } | 126 } |
132 | 127 |
133 void WebGLRenderingContext::registerContextExtensions() | 128 void WebGLRenderingContext::registerContextExtensions() |
134 { | 129 { |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
187 visitor->trace(m_webglDepthTexture); | 182 visitor->trace(m_webglDepthTexture); |
188 WebGLRenderingContextBase::trace(visitor); | 183 WebGLRenderingContextBase::trace(visitor); |
189 } | 184 } |
190 | 185 |
191 void WebGLRenderingContext::forceNextWebGLContextCreationToFail() | 186 void WebGLRenderingContext::forceNextWebGLContextCreationToFail() |
192 { | 187 { |
193 shouldFailContextCreationForTesting = true; | 188 shouldFailContextCreationForTesting = true; |
194 } | 189 } |
195 | 190 |
196 } // namespace blink | 191 } // namespace blink |
OLD | NEW |