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

Side by Side Diff: Source/core/html/canvas/WebGLRenderingContextBase.h

Issue 24096029: Moved the majority of WebGL functionality into WebGLRenderingContextBase (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Revamped extension testing, added featureLevel Created 7 years, 3 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 | Annotate | Revision Log
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
11 * documentation and/or other materials provided with the distribution. 11 * documentation and/or other materials provided with the distribution.
12 * 12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
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 #ifndef WebGLRenderingContext_h 26 #ifndef WebGLRenderingContextBase_h
27 #define WebGLRenderingContext_h 27 #define WebGLRenderingContextBase_h
28 28
29 #include "core/dom/ActiveDOMObject.h" 29 #include "core/dom/ActiveDOMObject.h"
30 #include "core/html/canvas/CanvasRenderingContext.h" 30 #include "core/html/canvas/CanvasRenderingContext.h"
31 #include "core/html/canvas/WebGLExtensionNames.h"
31 #include "core/html/canvas/WebGLGetInfo.h" 32 #include "core/html/canvas/WebGLGetInfo.h"
32 #include "core/page/Page.h" 33 #include "core/page/Page.h"
33 #include "core/platform/Timer.h" 34 #include "core/platform/Timer.h"
34 #include "core/platform/graphics/GraphicsContext3D.h" 35 #include "core/platform/graphics/GraphicsContext3D.h"
35 #include "core/platform/graphics/ImageBuffer.h" 36 #include "core/platform/graphics/ImageBuffer.h"
36 37
37 #include "wtf/Float32Array.h" 38 #include "wtf/Float32Array.h"
38 #include "wtf/Int32Array.h" 39 #include "wtf/Int32Array.h"
39 #include "wtf/OwnArrayPtr.h" 40 #include "wtf/OwnArrayPtr.h"
40 #include "wtf/text/WTFString.h" 41 #include "wtf/text/WTFString.h"
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
78 class WebGLObject; 79 class WebGLObject;
79 class WebGLProgram; 80 class WebGLProgram;
80 class WebGLRenderbuffer; 81 class WebGLRenderbuffer;
81 class WebGLShader; 82 class WebGLShader;
82 class WebGLShaderPrecisionFormat; 83 class WebGLShaderPrecisionFormat;
83 class WebGLSharedObject; 84 class WebGLSharedObject;
84 class WebGLTexture; 85 class WebGLTexture;
85 class WebGLUniformLocation; 86 class WebGLUniformLocation;
86 class WebGLVertexArrayObjectOES; 87 class WebGLVertexArrayObjectOES;
87 88
88 class WebGLRenderingContext : public CanvasRenderingContext, public ActiveDOMObj ect, private Page::MultisamplingChangedObserver { 89 class WebGLRenderingContextBase : public CanvasRenderingContext, public ActiveDO MObject, private Page::MultisamplingChangedObserver {
89 public: 90 public:
90 static PassOwnPtr<WebGLRenderingContext> create(HTMLCanvasElement*, WebGLCon textAttributes*); 91 virtual ~WebGLRenderingContextBase();
91 virtual ~WebGLRenderingContext();
92 92
93 virtual bool is3d() const { return true; } 93 virtual bool is3d() const { return true; }
94 virtual bool isAccelerated() const { return true; } 94 virtual bool isAccelerated() const { return true; }
95 95
96 virtual void registerContextExtensions() = 0;
97
96 int drawingBufferWidth() const; 98 int drawingBufferWidth() const;
97 int drawingBufferHeight() const; 99 int drawingBufferHeight() const;
98 100
99 void activeTexture(GC3Denum texture); 101 void activeTexture(GC3Denum texture);
100 void attachShader(WebGLProgram*, WebGLShader*); 102 void attachShader(WebGLProgram*, WebGLShader*);
101 void bindAttribLocation(WebGLProgram*, GC3Duint index, const String& name); 103 void bindAttribLocation(WebGLProgram*, GC3Duint index, const String& name);
102 void bindBuffer(GC3Denum target, WebGLBuffer*); 104 void bindBuffer(GC3Denum target, WebGLBuffer*);
103 void bindFramebuffer(GC3Denum target, WebGLFramebuffer*); 105 void bindFramebuffer(GC3Denum target, WebGLFramebuffer*);
104 void bindRenderbuffer(GC3Denum target, WebGLRenderbuffer*); 106 void bindRenderbuffer(GC3Denum target, WebGLRenderbuffer*);
105 void bindTexture(GC3Denum target, WebGLTexture*); 107 void bindTexture(GC3Denum target, WebGLTexture*);
(...skipping 11 matching lines...) Expand all
117 119
118 GC3Denum checkFramebufferStatus(GC3Denum target); 120 GC3Denum checkFramebufferStatus(GC3Denum target);
119 void clear(GC3Dbitfield mask); 121 void clear(GC3Dbitfield mask);
120 void clearColor(GC3Dfloat red, GC3Dfloat green, GC3Dfloat blue, GC3Dfloat al pha); 122 void clearColor(GC3Dfloat red, GC3Dfloat green, GC3Dfloat blue, GC3Dfloat al pha);
121 void clearDepth(GC3Dfloat); 123 void clearDepth(GC3Dfloat);
122 void clearStencil(GC3Dint); 124 void clearStencil(GC3Dint);
123 void colorMask(GC3Dboolean red, GC3Dboolean green, GC3Dboolean blue, GC3Dboo lean alpha); 125 void colorMask(GC3Dboolean red, GC3Dboolean green, GC3Dboolean blue, GC3Dboo lean alpha);
124 void compileShader(WebGLShader*); 126 void compileShader(WebGLShader*);
125 127
126 void compressedTexImage2D(GC3Denum target, GC3Dint level, GC3Denum internalf ormat, GC3Dsizei width, 128 void compressedTexImage2D(GC3Denum target, GC3Dint level, GC3Denum internalf ormat, GC3Dsizei width,
127 GC3Dsizei height, GC3Dint border, ArrayBufferView* data); 129 GC3Dsizei height, GC3Dint border, ArrayBufferView* data);
128 void compressedTexSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset , GC3Dint yoffset, 130 void compressedTexSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset , GC3Dint yoffset,
129 GC3Dsizei width, GC3Dsizei height, GC3Denum for mat, ArrayBufferView* data); 131 GC3Dsizei width, GC3Dsizei height, GC3Denum format, ArrayBufferView* dat a);
130 132
131 void copyTexImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height, GC3Dint border); 133 void copyTexImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height, GC3Dint border);
132 void copyTexSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3D int yoffset, GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height); 134 void copyTexSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3D int yoffset, GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height);
133 135
134 PassRefPtr<WebGLBuffer> createBuffer(); 136 PassRefPtr<WebGLBuffer> createBuffer();
135 PassRefPtr<WebGLFramebuffer> createFramebuffer(); 137 PassRefPtr<WebGLFramebuffer> createFramebuffer();
136 PassRefPtr<WebGLProgram> createProgram(); 138 PassRefPtr<WebGLProgram> createProgram();
137 PassRefPtr<WebGLRenderbuffer> createRenderbuffer(); 139 PassRefPtr<WebGLRenderbuffer> createRenderbuffer();
138 PassRefPtr<WebGLShader> createShader(GC3Denum type); 140 PassRefPtr<WebGLShader> createShader(GC3Denum type);
139 PassRefPtr<WebGLTexture> createTexture(); 141 PassRefPtr<WebGLTexture> createTexture();
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after
325 327
326 void removeSharedObject(WebGLSharedObject*); 328 void removeSharedObject(WebGLSharedObject*);
327 void removeContextObject(WebGLContextObject*); 329 void removeContextObject(WebGLContextObject*);
328 330
329 unsigned getMaxVertexAttribs() const { return m_maxVertexAttribs; } 331 unsigned getMaxVertexAttribs() const { return m_maxVertexAttribs; }
330 332
331 // ActiveDOMObject notifications 333 // ActiveDOMObject notifications
332 virtual bool hasPendingActivity() const; 334 virtual bool hasPendingActivity() const;
333 virtual void stop(); 335 virtual void stop();
334 336
335 private: 337 protected:
336 friend class WebGLDrawBuffers; 338 friend class WebGLDrawBuffers;
337 friend class WebGLFramebuffer; 339 friend class WebGLFramebuffer;
338 friend class WebGLObject; 340 friend class WebGLObject;
339 friend class OESVertexArrayObject; 341 friend class OESVertexArrayObject;
340 friend class WebGLDebugShaders; 342 friend class WebGLDebugShaders;
341 friend class WebGLCompressedTextureATC; 343 friend class WebGLCompressedTextureATC;
342 friend class WebGLCompressedTexturePVRTC; 344 friend class WebGLCompressedTexturePVRTC;
343 friend class WebGLCompressedTextureS3TC; 345 friend class WebGLCompressedTextureS3TC;
344 friend class WebGLRenderingContextErrorMessageCallback; 346 friend class WebGLRenderingContextErrorMessageCallback;
345 friend class WebGLVertexArrayObjectOES; 347 friend class WebGLVertexArrayObjectOES;
346 348
347 WebGLRenderingContext(HTMLCanvasElement*, PassRefPtr<GraphicsContext3D>, Gra phicsContext3D::Attributes, GraphicsContext3D::Attributes); 349 WebGLRenderingContextBase(const String&, unsigned featureLevel, HTMLCanvasEl ement*, PassRefPtr<GraphicsContext3D>, GraphicsContext3D::Attributes, GraphicsCo ntext3D::Attributes);
348 void initializeNewContext(); 350 void initializeNewContext();
349 void setupFlags(); 351 void setupFlags();
350 352
351 void addSharedObject(WebGLSharedObject*); 353 void addSharedObject(WebGLSharedObject*);
352 void addContextObject(WebGLContextObject*); 354 void addContextObject(WebGLContextObject*);
353 void detachAndRemoveAllObjects(); 355 void detachAndRemoveAllObjects();
354 356
355 void destroyGraphicsContext3D(); 357 void destroyGraphicsContext3D();
356 void markContextChanged(); 358 void markContextChanged();
357 359
358 // Query if the GL implementation is NPOT strict. 360 // Query if the GL implementation is NPOT strict.
359 bool isGLES2NPOTStrict() { return m_isGLES2NPOTStrict; } 361 bool isGLES2NPOTStrict() { return m_isGLES2NPOTStrict; }
360 // Query if depth_stencil buffer is supported. 362 // Query if depth_stencil buffer is supported.
361 bool isDepthStencilSupported() { return m_isDepthStencilSupported; } 363 bool isDepthStencilSupported() { return m_isDepthStencilSupported; }
362 364
363 // Helper to return the size in bytes of OpenGL data types 365 // Helper to return the size in bytes of OpenGL data types
364 // like GL_FLOAT, GL_INT, etc. 366 // like GL_FLOAT, GL_INT, etc.
365 unsigned int sizeInBytes(GC3Denum type); 367 unsigned sizeInBytes(GC3Denum type);
366 368
367 // Check if each enabled vertex attribute is bound to a buffer. 369 // Check if each enabled vertex attribute is bound to a buffer.
368 bool validateRenderingState(); 370 bool validateRenderingState();
369 371
370 bool validateWebGLObject(const char*, WebGLObject*); 372 bool validateWebGLObject(const char*, WebGLObject*);
371 373
372 // Adds a compressed texture format. 374 // Adds a compressed texture format.
373 void addCompressedTextureFormat(GC3Denum); 375 void addCompressedTextureFormat(GC3Denum);
374 void removeAllCompressedTextureFormats(); 376 void removeAllCompressedTextureFormats();
375 377
376 PassRefPtr<Image> videoFrameToImage(HTMLVideoElement*, BackingStoreCopy); 378 PassRefPtr<Image> videoFrameToImage(HTMLVideoElement*, BackingStoreCopy);
377 379
378 WebGLRenderbuffer* ensureEmulatedStencilBuffer(GC3Denum target, WebGLRenderb uffer*); 380 WebGLRenderbuffer* ensureEmulatedStencilBuffer(GC3Denum target, WebGLRenderb uffer*);
379 381
382 const String m_contextName;
383 unsigned m_featureLevel;
380 RefPtr<GraphicsContext3D> m_context; 384 RefPtr<GraphicsContext3D> m_context;
381 RefPtr<WebGLContextGroup> m_contextGroup; 385 RefPtr<WebGLContextGroup> m_contextGroup;
382 386
383 // Structure for rendering to a DrawingBuffer, instead of directly 387 // Structure for rendering to a DrawingBuffer, instead of directly
384 // to the back-buffer of m_context. 388 // to the back-buffer of m_context.
385 RefPtr<DrawingBuffer> m_drawingBuffer; 389 RefPtr<DrawingBuffer> m_drawingBuffer;
386 390
387 // Dispatches a context lost event once it is determined that one is needed. 391 // Dispatches a context lost event once it is determined that one is needed.
388 // This is used both for synthetic and real context losses. For real ones, i t's 392 // This is used both for synthetic and real context losses. For real ones, i t's
389 // likely that there's no JavaScript on the stack, but that might be depende nt 393 // likely that there's no JavaScript on the stack, but that might be depende nt
390 // on how exactly the platform discovers that the context was lost. For bett er 394 // on how exactly the platform discovers that the context was lost. For bett er
391 // portability we always defer the dispatch of the event. 395 // portability we always defer the dispatch of the event.
392 Timer<WebGLRenderingContext> m_dispatchContextLostEventTimer; 396 Timer<WebGLRenderingContextBase> m_dispatchContextLostEventTimer;
393 bool m_restoreAllowed; 397 bool m_restoreAllowed;
394 Timer<WebGLRenderingContext> m_restoreTimer; 398 Timer<WebGLRenderingContextBase> m_restoreTimer;
395 399
396 bool m_needsUpdate; 400 bool m_needsUpdate;
397 bool m_markedCanvasDirty; 401 bool m_markedCanvasDirty;
398 HashSet<WebGLContextObject*> m_contextObjects; 402 HashSet<WebGLContextObject*> m_contextObjects;
399 403
400 // List of bound VBO's. Used to maintain info about sizes for ARRAY_BUFFER a nd stored values for ELEMENT_ARRAY_BUFFER 404 // List of bound VBO's. Used to maintain info about sizes for ARRAY_BUFFER a nd stored values for ELEMENT_ARRAY_BUFFER
401 RefPtr<WebGLBuffer> m_boundArrayBuffer; 405 RefPtr<WebGLBuffer> m_boundArrayBuffer;
402 406
403 RefPtr<WebGLVertexArrayObjectOES> m_defaultVertexArrayObject; 407 RefPtr<WebGLVertexArrayObjectOES> m_defaultVertexArrayObject;
404 RefPtr<WebGLVertexArrayObjectOES> m_boundVertexArrayObject; 408 RefPtr<WebGLVertexArrayObjectOES> m_boundVertexArrayObject;
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
449 RefPtr<WebGLTexture> m_blackTexture2D; 453 RefPtr<WebGLTexture> m_blackTexture2D;
450 RefPtr<WebGLTexture> m_blackTextureCubeMap; 454 RefPtr<WebGLTexture> m_blackTextureCubeMap;
451 455
452 Vector<GC3Denum> m_compressedTextureFormats; 456 Vector<GC3Denum> m_compressedTextureFormats;
453 457
454 // Fixed-size cache of reusable image buffers for video texImage2D calls. 458 // Fixed-size cache of reusable image buffers for video texImage2D calls.
455 class LRUImageBufferCache { 459 class LRUImageBufferCache {
456 public: 460 public:
457 LRUImageBufferCache(int capacity); 461 LRUImageBufferCache(int capacity);
458 // The pointer returned is owned by the image buffer map. 462 // The pointer returned is owned by the image buffer map.
459 ImageBuffer* imageBuffer(const IntSize& size); 463 ImageBuffer* imageBuffer(const IntSize&);
460 private: 464 private:
461 void bubbleToFront(int idx); 465 void bubbleToFront(int idx);
462 OwnArrayPtr<OwnPtr<ImageBuffer> > m_buffers; 466 OwnArrayPtr<OwnPtr<ImageBuffer> > m_buffers;
463 int m_capacity; 467 int m_capacity;
464 }; 468 };
465 LRUImageBufferCache m_videoCache; 469 LRUImageBufferCache m_videoCache;
466 470
467 GC3Dint m_maxTextureSize; 471 GC3Dint m_maxTextureSize;
468 GC3Dint m_maxCubeMapTextureSize; 472 GC3Dint m_maxCubeMapTextureSize;
469 GC3Dint m_maxRenderbufferSize; 473 GC3Dint m_maxRenderbufferSize;
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
505 509
506 bool m_synthesizedErrorsToConsole; 510 bool m_synthesizedErrorsToConsole;
507 int m_numGLErrorsToConsoleAllowed; 511 int m_numGLErrorsToConsoleAllowed;
508 512
509 bool m_multisamplingAllowed; 513 bool m_multisamplingAllowed;
510 bool m_multisamplingObserverRegistered; 514 bool m_multisamplingObserverRegistered;
511 515
512 GC3Duint m_onePlusMaxEnabledAttribIndex; 516 GC3Duint m_onePlusMaxEnabledAttribIndex;
513 unsigned long m_onePlusMaxNonDefaultTextureUnit; 517 unsigned long m_onePlusMaxNonDefaultTextureUnit;
514 518
515 // Enabled extension objects.
516 RefPtr<ANGLEInstancedArrays> m_angleInstancedArrays;
517 RefPtr<EXTFragDepth> m_extFragDepth;
518 RefPtr<EXTTextureFilterAnisotropic> m_extTextureFilterAnisotropic;
519 RefPtr<OESTextureFloat> m_oesTextureFloat;
520 RefPtr<OESTextureFloatLinear> m_oesTextureFloatLinear;
521 RefPtr<OESTextureHalfFloat> m_oesTextureHalfFloat;
522 RefPtr<OESTextureHalfFloatLinear> m_oesTextureHalfFloatLinear;
523 RefPtr<OESStandardDerivatives> m_oesStandardDerivatives;
524 RefPtr<OESVertexArrayObject> m_oesVertexArrayObject;
525 RefPtr<OESElementIndexUint> m_oesElementIndexUint;
526 RefPtr<WebGLLoseContext> m_webglLoseContext;
527 RefPtr<WebGLDebugRendererInfo> m_webglDebugRendererInfo;
528 RefPtr<WebGLDebugShaders> m_webglDebugShaders;
529 RefPtr<WebGLDrawBuffers> m_webglDrawBuffers;
530 RefPtr<WebGLCompressedTextureATC> m_webglCompressedTextureATC;
531 RefPtr<WebGLCompressedTexturePVRTC> m_webglCompressedTexturePVRTC;
532 RefPtr<WebGLCompressedTextureS3TC> m_webglCompressedTextureS3TC;
533 RefPtr<WebGLDepthTexture> m_webglDepthTexture;
534
535 enum ExtensionFlags { 519 enum ExtensionFlags {
536 ApprovedExtension = 0x00, 520 ApprovedExtension = 0x00,
537 DraftExtension = 0x01, 521 DraftExtension = 0x01,
538 PrivilegedExtension = 0x02, 522 PrivilegedExtension = 0x02,
539 PrefixedExtension = 0x04, 523 PrefixedExtension = 0x04,
540 }; 524 };
541 525
542 class ExtensionTracker { 526 class ExtensionTracker {
543 public: 527 public:
544 ExtensionTracker(ExtensionFlags flags, const char** prefixes) 528 ExtensionTracker(ExtensionFlags flags, const char** prefixes)
(...skipping 18 matching lines...) Expand all
563 return m_privileged; 547 return m_privileged;
564 } 548 }
565 549
566 bool getDraft() const 550 bool getDraft() const
567 { 551 {
568 return m_draft; 552 return m_draft;
569 } 553 }
570 554
571 bool matchesNameWithPrefixes(const String&) const; 555 bool matchesNameWithPrefixes(const String&) const;
572 556
573 virtual PassRefPtr<WebGLExtension> getExtension(WebGLRenderingContext*) const = 0; 557 virtual PassRefPtr<WebGLExtension> getExtension(WebGLRenderingContextBas e*) = 0;
574 virtual bool supported(WebGLRenderingContext*) const = 0; 558 virtual bool supported(WebGLRenderingContextBase*) const = 0;
575 virtual const char* getExtensionName() const = 0; 559 virtual const char* getExtensionName() const = 0;
576 virtual void loseExtension() = 0; 560 virtual void loseExtension() = 0;
577 561
578 private: 562 private:
579 bool m_privileged; 563 bool m_privileged;
580 bool m_draft; 564 bool m_draft;
581 bool m_prefixed; 565 bool m_prefixed;
582 const char** m_prefixes; 566 const char** m_prefixes;
583 }; 567 };
584 568
585 template <typename T> 569 template <typename T>
586 class TypedExtensionTracker : public ExtensionTracker { 570 class TypedExtensionTracker : public ExtensionTracker {
587 public: 571 public:
588 TypedExtensionTracker(RefPtr<T>& extensionField, ExtensionFlags flags, c onst char** prefixes) 572 TypedExtensionTracker(RefPtr<T>& extensionField, ExtensionFlags flags, c onst char** prefixes)
589 : ExtensionTracker(flags, prefixes) 573 : ExtensionTracker(flags, prefixes)
590 , m_extensionField(extensionField) 574 , m_extensionField(extensionField)
575 , m_extension(0)
591 { 576 {
592 } 577 }
593 578
594 ~TypedExtensionTracker() 579 ~TypedExtensionTracker()
595 { 580 {
596 if (m_extensionField) { 581 if (m_extension) {
597 m_extensionField->lose(true); 582 m_extension->lose(true);
598 m_extensionField = 0; 583 m_extension = 0;
599 } 584 }
600 } 585 }
601 586
602 virtual PassRefPtr<WebGLExtension> getExtension(WebGLRenderingContext* c ontext) const 587 virtual PassRefPtr<WebGLExtension> getExtension(WebGLRenderingContextBas e* context)
603 { 588 {
604 if (!m_extensionField) 589 if (!m_extension) {
605 m_extensionField = T::create(context); 590 m_extension = T::create(context);
591 m_extensionField = m_extension;
592 }
606 593
607 return m_extensionField; 594 return m_extension;
608 } 595 }
609 596
610 virtual bool supported(WebGLRenderingContext* context) const 597 virtual bool supported(WebGLRenderingContextBase* context) const
611 { 598 {
612 return T::supported(context); 599 return T::supported(context);
613 } 600 }
614 601
615 virtual const char* getExtensionName() const 602 virtual const char* getExtensionName() const
616 { 603 {
617 return T::getExtensionName(); 604 return T::getExtensionName();
618 } 605 }
619 606
620 virtual void loseExtension() 607 virtual void loseExtension()
621 { 608 {
622 if (m_extensionField) { 609 if (m_extension) {
623 m_extensionField->lose(false); 610 m_extension->lose(false);
624 if (m_extensionField->isLost()) 611 if (m_extension->isLost())
625 m_extensionField = 0; 612 m_extension = 0;
626 } 613 }
627 } 614 }
628 615
629 private: 616 private:
630 RefPtr<T>& m_extensionField; 617 RefPtr<T>& m_extensionField;
618 // ExtensionTracker holds it's own reference to the extension to ensure
619 // that it is not deleted before this object's destructor is called
620 RefPtr<T> m_extension;
631 }; 621 };
632 622
623 bool m_extensionEnabled[WebGLExtensionNameCount];
633 Vector<ExtensionTracker*> m_extensions; 624 Vector<ExtensionTracker*> m_extensions;
634 625
635 template <typename T> 626 template <typename T>
636 void registerExtension(RefPtr<T>& extensionPtr, ExtensionFlags flags = Appro vedExtension, const char** prefixes = 0) 627 void registerExtension(RefPtr<T>& extensionPtr, ExtensionFlags flags = Appro vedExtension, const char** prefixes = 0)
637 { 628 {
638 m_extensions.append(new TypedExtensionTracker<T>(extensionPtr, flags, pr efixes)); 629 m_extensions.append(new TypedExtensionTracker<T>(extensionPtr, flags, pr efixes));
639 } 630 }
640 631
632 inline bool extensionEnabled(WebGLExtensionName name)
bajones 2013/09/24 00:12:01 It turns out that every single use of the WebGL ex
633 {
634 return m_extensionEnabled[name];
635 }
636
641 // Errors raised by synthesizeGLError() while the context is lost. 637 // Errors raised by synthesizeGLError() while the context is lost.
642 Vector<GC3Denum> lost_context_errors_; 638 Vector<GC3Denum> m_lostContextErrors;
643 639
644 // Helpers for getParameter and others 640 // Helpers for getParameter and others
645 WebGLGetInfo getBooleanParameter(GC3Denum); 641 WebGLGetInfo getBooleanParameter(GC3Denum);
646 WebGLGetInfo getBooleanArrayParameter(GC3Denum); 642 WebGLGetInfo getBooleanArrayParameter(GC3Denum);
647 WebGLGetInfo getFloatParameter(GC3Denum); 643 WebGLGetInfo getFloatParameter(GC3Denum);
648 WebGLGetInfo getIntParameter(GC3Denum); 644 WebGLGetInfo getIntParameter(GC3Denum);
649 WebGLGetInfo getUnsignedIntParameter(GC3Denum); 645 WebGLGetInfo getUnsignedIntParameter(GC3Denum);
650 WebGLGetInfo getWebGLFloatArrayParameter(GC3Denum); 646 WebGLGetInfo getWebGLFloatArrayParameter(GC3Denum);
651 WebGLGetInfo getWebGLIntArrayParameter(GC3Denum); 647 WebGLGetInfo getWebGLIntArrayParameter(GC3Denum);
652 648
653 // Clear the backbuffer if it was composited since the last operation. 649 // Clear the backbuffer if it was composited since the last operation.
654 // clearMask is set to the bitfield of any clear that would happen anyway at this time 650 // clearMask is set to the bitfield of any clear that would happen anyway at this time
655 // and the function returns true if that clear is now unnecessary. 651 // and the function returns true if that clear is now unnecessary.
656 bool clearIfComposited(GC3Dbitfield clearMask = 0); 652 bool clearIfComposited(GC3Dbitfield clearMask = 0);
657 653
658 // Helper to restore state that clearing the framebuffer may destroy. 654 // Helper to restore state that clearing the framebuffer may destroy.
659 void restoreStateAfterClear(); 655 void restoreStateAfterClear();
660 656
661 void texImage2DBase(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height, GC3Dint border, GC3Denum format, GC3Denum ty pe, const void* pixels, ExceptionState&); 657 void texImage2DBase(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height, GC3Dint border, GC3Denum format, GC3Denum ty pe, const void* pixels, ExceptionState&);
662 void texImage2DImpl(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Denum format, GC3Denum type, Image*, GraphicsContext3D::ImageHtmlDomSource, bool flipY, bool premultiplyAlpha, ExceptionState&); 658 void texImage2DImpl(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Denum format, GC3Denum type, Image*, GraphicsContext3D::ImageHtmlDomSource, bool flipY, bool premultiplyAlpha, ExceptionState&);
663 void texSubImage2DBase(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3D int yoffset, GC3Dsizei width, GC3Dsizei height, GC3Denum format, GC3Denum type, const void* pixels, ExceptionState&); 659 void texSubImage2DBase(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3D int yoffset, GC3Dsizei width, GC3Dsizei height, GC3Denum format, GC3Denum type, const void* pixels, ExceptionState&);
664 void texSubImage2DImpl(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3D int yoffset, GC3Denum format, GC3Denum type, Image*, GraphicsContext3D::ImageHtm lDomSource, bool flipY, bool premultiplyAlpha, ExceptionState&); 660 void texSubImage2DImpl(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3D int yoffset, GC3Denum format, GC3Denum type, Image*, GraphicsContext3D::ImageHtm lDomSource, bool flipY, bool premultiplyAlpha, ExceptionState&);
665 661
666 void handleTextureCompleteness(const char*, bool); 662 void handleTextureCompleteness(const char*, bool);
667 void createFallbackBlackTextures1x1(); 663 void createFallbackBlackTextures1x1();
668 664
669 // Helper function for copyTex{Sub}Image, check whether the internalformat 665 // Helper function for copyTex{Sub}Image, check whether the internalformat
670 // and the color buffer format of the current bound framebuffer combination 666 // and the color buffer format of the current bound framebuffer combination
671 // is valid. 667 // is valid.
672 bool isTexInternalFormatColorBufferCombinationValid(GC3Denum texInternalForm at, 668 bool isTexInternalFormatColorBufferCombinationValid(GC3Denum texInternalForm at, GC3Denum colorBufferFormat);
673 GC3Denum colorBufferForm at);
674 669
675 // Helper function to get the bound framebuffer's color buffer format. 670 // Helper function to get the bound framebuffer's color buffer format.
676 GC3Denum getBoundFramebufferColorFormat(); 671 GC3Denum getBoundFramebufferColorFormat();
677 672
678 // Helper function to get the bound framebuffer's width. 673 // Helper function to get the bound framebuffer's width.
679 int getBoundFramebufferWidth(); 674 int getBoundFramebufferWidth();
680 675
681 // Helper function to get the bound framebuffer's height. 676 // Helper function to get the bound framebuffer's height.
682 int getBoundFramebufferHeight(); 677 int getBoundFramebufferHeight();
683 678
684 // Helper function to verify limits on the length of uniform and attribute l ocations. 679 // Helper function to verify limits on the length of uniform and attribute l ocations.
685 bool validateLocationLength(const char* functionName, const String&); 680 bool validateLocationLength(const char* functionName, const String&);
686 681
687 // Helper function to check if size is non-negative. 682 // Helper function to check if size is non-negative.
688 // Generate GL error and return false for negative inputs; otherwise, return true. 683 // Generate GL error and return false for negative inputs; otherwise, return true.
689 bool validateSize(const char* functionName, GC3Dint x, GC3Dint y); 684 bool validateSize(const char* functionName, GC3Dint x, GC3Dint y);
690 685
691 // Helper function to check if all characters in the string belong to the 686 // Helper function to check if all characters in the string belong to the
692 // ASCII subset as defined in GLSL ES 1.0 spec section 3.1. 687 // ASCII subset as defined in GLSL ES 1.0 spec section 3.1.
693 bool validateString(const char* functionName, const String&); 688 bool validateString(const char* functionName, const String&);
694 689
695 // Helper function to check target and texture bound to the target. 690 // Helper function to check target and texture bound to the target.
696 // Generate GL errors and return 0 if target is invalid or texture bound is 691 // Generate GL errors and return 0 if target is invalid or texture bound is
697 // null. Otherwise, return the texture bound to the target. 692 // null. Otherwise, return the texture bound to the target.
698 WebGLTexture* validateTextureBinding(const char* functionName, GC3Denum targ et, bool useSixEnumsForCubeMap); 693 WebGLTexture* validateTextureBinding(const char* functionName, GC3Denum targ et, bool useSixEnumsForCubeMap);
699 694
700 // Helper function to check input format/type for functions {copy}Tex{Sub}Im age. 695 // Helper function to check input format/type for functions {copy}Tex{Sub}Im age.
701 // Generates GL error and returns false if parameters are invalid. 696 // Generates GL error and returns false if parameters are invalid.
702 bool validateTexFuncFormatAndType(const char* functionName, GC3Denum format, GC3Denum type, GC3Dint level); 697 bool validateTexFuncFormatAndType(const char* functionName, GC3Denum format, GC3Denum type, GC3Dint level);
703 698
704 // Helper function to check input level for functions {copy}Tex{Sub}Image. 699 // Helper function to check input level for functions {copy}Tex{Sub}Image.
705 // Generates GL error and returns false if level is invalid. 700 // Generates GL error and returns false if level is invalid.
706 bool validateTexFuncLevel(const char* functionName, GC3Denum target, GC3Dint level); 701 bool validateTexFuncLevel(const char* functionName, GC3Denum target, GC3Dint level);
707 702
(...skipping 16 matching lines...) Expand all
724 GC3Dsizei height, GC3Dint border, GC3Denum format, GC3Denum type, GC3Din t xoffset, GC3Dint yoffset); 719 GC3Dsizei height, GC3Dint border, GC3Denum format, GC3Denum type, GC3Din t xoffset, GC3Dint yoffset);
725 720
726 // Helper function to check input width and height for functions {copy, comp ressed}Tex{Sub}Image. 721 // Helper function to check input width and height for functions {copy, comp ressed}Tex{Sub}Image.
727 // Generates GL error and returns false if width or height is invalid. 722 // Generates GL error and returns false if width or height is invalid.
728 bool validateTexFuncDimensions(const char* functionName, TexFuncValidationFu nctionType, 723 bool validateTexFuncDimensions(const char* functionName, TexFuncValidationFu nctionType,
729 GC3Denum target, GC3Dint level, GC3Dsizei width, GC3Dsizei height); 724 GC3Denum target, GC3Dint level, GC3Dsizei width, GC3Dsizei height);
730 725
731 // Helper function to check input parameters for functions {copy}Tex{Sub}Ima ge. 726 // Helper function to check input parameters for functions {copy}Tex{Sub}Ima ge.
732 // Generates GL error and returns false if parameters are invalid. 727 // Generates GL error and returns false if parameters are invalid.
733 bool validateTexFuncParameters(const char* functionName, 728 bool validateTexFuncParameters(const char* functionName,
734 TexFuncValidationFunctionType, 729 TexFuncValidationFunctionType,
735 GC3Denum target, GC3Dint level, 730 GC3Denum target, GC3Dint level,
736 GC3Denum internalformat, 731 GC3Denum internalformat,
737 GC3Dsizei width, GC3Dsizei height, GC3Dint bo rder, 732 GC3Dsizei width, GC3Dsizei height, GC3Dint border,
738 GC3Denum format, GC3Denum type); 733 GC3Denum format, GC3Denum type);
739 734
740 enum NullDisposition { 735 enum NullDisposition {
741 NullAllowed, 736 NullAllowed,
742 NullNotAllowed 737 NullNotAllowed
743 }; 738 };
744 739
745 // Helper function to validate that the given ArrayBufferView 740 // Helper function to validate that the given ArrayBufferView
746 // is of the correct type and contains enough data for the texImage call. 741 // is of the correct type and contains enough data for the texImage call.
747 // Generates GL error and returns false if parameters are invalid. 742 // Generates GL error and returns false if parameters are invalid.
748 bool validateTexFuncData(const char* functionName, GC3Dint level, 743 bool validateTexFuncData(const char* functionName, GC3Dint level,
749 GC3Dsizei width, GC3Dsizei height, 744 GC3Dsizei width, GC3Dsizei height,
750 GC3Denum format, GC3Denum type, 745 GC3Denum format, GC3Denum type,
751 ArrayBufferView* pixels, 746 ArrayBufferView* pixels,
752 NullDisposition); 747 NullDisposition);
753 748
754 // Helper function to validate a given texture format is settable as in 749 // Helper function to validate a given texture format is settable as in
755 // you can supply data to texImage2D, or call texImage2D, copyTexImage2D and 750 // you can supply data to texImage2D, or call texImage2D, copyTexImage2D and
756 // copyTexSubImage2D. 751 // copyTexSubImage2D.
757 // Generates GL error and returns false if the format is not settable. 752 // Generates GL error and returns false if the format is not settable.
758 bool validateSettableTexFormat(const char* functionName, GC3Denum format); 753 bool validateSettableTexFormat(const char* functionName, GC3Denum format);
759 754
760 // Helper function to validate compressed texture data is correct size 755 // Helper function to validate compressed texture data is correct size
761 // for the given format and dimensions. 756 // for the given format and dimensions.
762 bool validateCompressedTexFuncData(const char* functionName, 757 bool validateCompressedTexFuncData(const char* functionName,
763 GC3Dsizei width, GC3Dsizei height, 758 GC3Dsizei width, GC3Dsizei height,
764 GC3Denum format, ArrayBufferView* pixels) ; 759 GC3Denum format, ArrayBufferView* pixels);
765 760
766 // Helper function for validating compressed texture formats. 761 // Helper function for validating compressed texture formats.
767 bool validateCompressedTexFormat(GC3Denum format); 762 bool validateCompressedTexFormat(GC3Denum format);
768 763
769 // Helper function to validate compressed texture dimensions are valid for 764 // Helper function to validate compressed texture dimensions are valid for
770 // the given format. 765 // the given format.
771 bool validateCompressedTexDimensions(const char* functionName, TexFuncValida tionFunctionType, GC3Denum target, GC3Dint level, GC3Dsizei width, GC3Dsizei hei ght, GC3Denum format); 766 bool validateCompressedTexDimensions(const char* functionName, TexFuncValida tionFunctionType, GC3Denum target, GC3Dint level, GC3Dsizei width, GC3Dsizei hei ght, GC3Denum format);
772 767
773 // Helper function to validate compressed texture dimensions are valid for 768 // Helper function to validate compressed texture dimensions are valid for
774 // the given format. 769 // the given format.
775 bool validateCompressedTexSubDimensions(const char* functionName, GC3Denum t arget, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, 770 bool validateCompressedTexSubDimensions(const char* functionName, GC3Denum t arget, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset,
776 GC3Dsizei width, GC3Dsizei height, G C3Denum format, WebGLTexture*); 771 GC3Dsizei width, GC3Dsizei height, GC3Denum format, WebGLTexture*);
777 772
778 // Helper function to validate mode for draw{Arrays/Elements}. 773 // Helper function to validate mode for draw{Arrays/Elements}.
779 bool validateDrawMode(const char* functionName, GC3Denum); 774 bool validateDrawMode(const char* functionName, GC3Denum);
780 775
781 // Helper function to validate if front/back stencilMask and stencilFunc set tings are the same. 776 // Helper function to validate if front/back stencilMask and stencilFunc set tings are the same.
782 bool validateStencilSettings(const char* functionName); 777 bool validateStencilSettings(const char* functionName);
783 778
784 // Helper function to validate stencil or depth func. 779 // Helper function to validate stencil or depth func.
785 bool validateStencilOrDepthFunc(const char* functionName, GC3Denum); 780 bool validateStencilOrDepthFunc(const char* functionName, GC3Denum);
786 781
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
843 838
844 // Helper function for delete* (deleteBuffer, deleteProgram, etc) functions. 839 // Helper function for delete* (deleteBuffer, deleteProgram, etc) functions.
845 // Return false if caller should return without further processing. 840 // Return false if caller should return without further processing.
846 bool deleteObject(WebGLObject*); 841 bool deleteObject(WebGLObject*);
847 842
848 // Helper function for bind* (bindBuffer, bindTexture, etc) and useProgram. 843 // Helper function for bind* (bindBuffer, bindTexture, etc) and useProgram.
849 // If the object has already been deleted, set deleted to true upon return. 844 // If the object has already been deleted, set deleted to true upon return.
850 // Return false if caller should return without further processing. 845 // Return false if caller should return without further processing.
851 bool checkObjectToBeBound(const char* functionName, WebGLObject*, bool& dele ted); 846 bool checkObjectToBeBound(const char* functionName, WebGLObject*, bool& dele ted);
852 847
853 void dispatchContextLostEvent(Timer<WebGLRenderingContext>*); 848 void dispatchContextLostEvent(Timer<WebGLRenderingContextBase>*);
854 // Helper for restoration after context lost. 849 // Helper for restoration after context lost.
855 void maybeRestoreContext(Timer<WebGLRenderingContext>*); 850 void maybeRestoreContext(Timer<WebGLRenderingContextBase>*);
856 851
857 // Determine if we are running privileged code in the browser, for example, 852 // Determine if we are running privileged code in the browser, for example,
858 // a Safari or Chrome extension. 853 // a Safari or Chrome extension.
859 bool allowPrivilegedExtensions() const; 854 bool allowPrivilegedExtensions() const;
860 855
861 enum ConsoleDisplayPreference { 856 enum ConsoleDisplayPreference {
862 DisplayInConsole, 857 DisplayInConsole,
863 DontDisplayInConsole 858 DontDisplayInConsole
864 }; 859 };
865 860
(...skipping 25 matching lines...) Expand all
891 void restoreCurrentTexture2D(); 886 void restoreCurrentTexture2D();
892 887
893 virtual void multisamplingChanged(bool); 888 virtual void multisamplingChanged(bool);
894 889
895 void findNewMaxEnabledAttribIndex(); 890 void findNewMaxEnabledAttribIndex();
896 void findNewMaxNonDefaultTextureUnit(); 891 void findNewMaxNonDefaultTextureUnit();
897 892
898 friend class WebGLStateRestorer; 893 friend class WebGLStateRestorer;
899 friend class WebGLRenderingContextEvictionManager; 894 friend class WebGLRenderingContextEvictionManager;
900 895
901 static Vector<WebGLRenderingContext*>& activeContexts(); 896 static Vector<WebGLRenderingContextBase*>& activeContexts();
902 static Vector<WebGLRenderingContext*>& forciblyEvictedContexts(); 897 static Vector<WebGLRenderingContextBase*>& forciblyEvictedContexts();
903 898
904 static void activateContext(WebGLRenderingContext*); 899 static void activateContext(WebGLRenderingContextBase*);
905 static void deactivateContext(WebGLRenderingContext*, bool addToInactiveList ); 900 static void deactivateContext(WebGLRenderingContextBase*, bool addToInactive List);
906 static void willDestroyContext(WebGLRenderingContext*); 901 static void willDestroyContext(WebGLRenderingContextBase*);
907 static void forciblyLoseOldestContext(const String& reason); 902 static void forciblyLoseOldestContext(const String& reason);
908 static IntSize oldestContextSize(); 903 static IntSize oldestContextSize();
904
905 static GraphicsContext3D::Attributes adjustAttributes(const GraphicsContext3 D::Attributes&, Settings*);
909 }; 906 };
910 907
911 } // namespace WebCore 908 } // namespace WebCore
912 909
913 #endif 910 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698