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 15 matching lines...) Expand all Loading... |
26 #ifndef GraphicsContext3D_h | 26 #ifndef GraphicsContext3D_h |
27 #define GraphicsContext3D_h | 27 #define GraphicsContext3D_h |
28 | 28 |
29 #include "platform/PlatformExport.h" | 29 #include "platform/PlatformExport.h" |
30 #include "platform/geometry/IntRect.h" | 30 #include "platform/geometry/IntRect.h" |
31 #include "platform/graphics/GraphicsTypes3D.h" | 31 #include "platform/graphics/GraphicsTypes3D.h" |
32 #include "platform/graphics/Image.h" | 32 #include "platform/graphics/Image.h" |
33 #include "platform/weborigin/KURL.h" | 33 #include "platform/weborigin/KURL.h" |
34 #include "third_party/khronos/GLES2/gl2.h" | 34 #include "third_party/khronos/GLES2/gl2.h" |
35 #include "third_party/khronos/GLES2/gl2ext.h" | 35 #include "third_party/khronos/GLES2/gl2ext.h" |
36 #include "third_party/skia/include/core/SkBitmap.h" | |
37 #include "wtf/HashMap.h" | 36 #include "wtf/HashMap.h" |
38 #include "wtf/HashSet.h" | 37 #include "wtf/HashSet.h" |
39 #include "wtf/ListHashSet.h" | 38 #include "wtf/ListHashSet.h" |
40 #include "wtf/Noncopyable.h" | 39 #include "wtf/Noncopyable.h" |
41 #include "wtf/OwnPtr.h" | 40 #include "wtf/OwnPtr.h" |
42 #include "wtf/PassOwnPtr.h" | 41 #include "wtf/PassOwnPtr.h" |
43 #include "wtf/RefCounted.h" | 42 #include "wtf/RefCounted.h" |
44 #include "wtf/text/WTFString.h" | 43 #include "wtf/text/WTFString.h" |
45 | 44 |
46 // FIXME: Find a better way to avoid the name confliction for NO_ERROR. | 45 // FIXME: Find a better way to avoid the name confliction for NO_ERROR. |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
94 bool antialias; | 93 bool antialias; |
95 bool premultipliedAlpha; | 94 bool premultipliedAlpha; |
96 bool preserveDrawingBuffer; | 95 bool preserveDrawingBuffer; |
97 bool noExtensions; | 96 bool noExtensions; |
98 bool shareResources; | 97 bool shareResources; |
99 bool preferDiscreteGPU; | 98 bool preferDiscreteGPU; |
100 bool failIfMajorPerformanceCaveat; | 99 bool failIfMajorPerformanceCaveat; |
101 KURL topDocumentURL; | 100 KURL topDocumentURL; |
102 }; | 101 }; |
103 | 102 |
104 class ContextLostCallback { | |
105 public: | |
106 virtual void onContextLost() = 0; | |
107 virtual ~ContextLostCallback() {} | |
108 }; | |
109 | |
110 class ErrorMessageCallback { | |
111 public: | |
112 virtual void onErrorMessage(const String& message, GLint id) = 0; | |
113 virtual ~ErrorMessageCallback() { } | |
114 }; | |
115 | |
116 void setContextLostCallback(PassOwnPtr<ContextLostCallback>); | |
117 void setErrorMessageCallback(PassOwnPtr<ErrorMessageCallback>); | |
118 | |
119 // This is the preferred method for creating an instance of this class. When
created this way the webContext | 103 // This is the preferred method for creating an instance of this class. When
created this way the webContext |
120 // is not owned by the GraphicsContext3D | 104 // is not owned by the GraphicsContext3D |
121 static PassRefPtr<GraphicsContext3D> createContextSupport(blink::WebGraphics
Context3D* webContext); | 105 static PassRefPtr<GraphicsContext3D> createContextSupport(blink::WebGraphics
Context3D* webContext); |
122 | 106 |
123 // The following three creation methods are obsolete and should not be used
by new code. They will be removed soon. | 107 // The following three creation methods are obsolete and should not be used
by new code. They will be removed soon. |
124 | 108 |
125 // Callers must make the context current before using it AND check that the
context was created successfully | 109 // Callers must make the context current before using it AND check that the
context was created successfully |
126 // via ContextLost before using the context in any way. Once made current on
a thread, the context cannot | 110 // via ContextLost before using the context in any way. Once made current on
a thread, the context cannot |
127 // be used on any other thread. | 111 // be used on any other thread. |
128 static PassRefPtr<GraphicsContext3D> create(Attributes); | 112 static PassRefPtr<GraphicsContext3D> create(Attributes); |
129 static PassRefPtr<GraphicsContext3D> createGraphicsContextFromWebContext(Pas
sOwnPtr<blink::WebGraphicsContext3D>, bool preserveDrawingBuffer = false); | 113 static PassRefPtr<GraphicsContext3D> createGraphicsContextFromWebContext(Pas
sOwnPtr<blink::WebGraphicsContext3D>, bool preserveDrawingBuffer = false); |
130 static PassRefPtr<GraphicsContext3D> createGraphicsContextFromProvider(PassO
wnPtr<blink::WebGraphicsContext3DProvider>, bool preserveDrawingBuffer = false); | 114 static PassRefPtr<GraphicsContext3D> createGraphicsContextFromProvider(PassO
wnPtr<blink::WebGraphicsContext3DProvider>, bool preserveDrawingBuffer = false); |
131 | 115 |
132 | 116 |
133 ~GraphicsContext3D(); | 117 ~GraphicsContext3D(); |
134 | 118 |
135 GrContext* grContext(); | 119 GrContext* grContext(); |
136 blink::WebGraphicsContext3D* webContext() const { return m_impl; } | 120 blink::WebGraphicsContext3D* webContext() const { return m_impl; } |
137 | 121 |
138 bool makeContextCurrent(); | 122 bool makeContextCurrent(); |
139 | 123 |
140 uint32_t lastFlushID(); | |
141 | |
142 // Helper to texImage2D with pixel==0 case: pixels are initialized to 0. | |
143 // Return true if no GL error is synthesized. | |
144 // By default, alignment is 4, the OpenGL default setting. | |
145 bool texImage2DResourceSafe(GLenum target, GLint level, GLenum internalforma
t, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, GLin
t alignment = 4); | |
146 | |
147 //---------------------------------------------------------------------- | 124 //---------------------------------------------------------------------- |
148 // Helpers for texture uploading and pixel readback. | 125 // Helpers for texture uploading and pixel readback. |
149 // | 126 // |
150 | 127 |
151 // Computes the components per pixel and bytes per component | 128 // Computes the components per pixel and bytes per component |
152 // for the given format and type combination. Returns false if | 129 // for the given format and type combination. Returns false if |
153 // either was an invalid enum. | 130 // either was an invalid enum. |
154 static bool computeFormatAndTypeParameters(GLenum format, GLenum type, unsig
ned* componentsPerPixel, unsigned* bytesPerComponent); | 131 static bool computeFormatAndTypeParameters(GLenum format, GLenum type, unsig
ned* componentsPerPixel, unsigned* bytesPerComponent); |
155 | 132 |
156 // Computes the image size in bytes. If paddingInBytes is not null, padding | 133 // Computes the image size in bytes. If paddingInBytes is not null, padding |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
263 void uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z); | 240 void uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z); |
264 void uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w); | 241 void uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w); |
265 void uniformMatrix4fv(GLint location, GLsizei, GLboolean transpose, GLfloat*
value); | 242 void uniformMatrix4fv(GLint location, GLsizei, GLboolean transpose, GLfloat*
value); |
266 | 243 |
267 void useProgram(Platform3DObject); | 244 void useProgram(Platform3DObject); |
268 | 245 |
269 void vertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean no
rmalized, GLsizei stride, GLintptr offset); | 246 void vertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean no
rmalized, GLsizei stride, GLintptr offset); |
270 | 247 |
271 void viewport(GLint x, GLint y, GLsizei width, GLsizei height); | 248 void viewport(GLint x, GLint y, GLsizei width, GLsizei height); |
272 | 249 |
273 void markContextChanged(); | |
274 void markLayerComposited(); | |
275 bool layerComposited() const; | |
276 | |
277 void paintRenderingResultsToCanvas(ImageBuffer*, DrawingBuffer*); | |
278 PassRefPtr<Uint8ClampedArray> paintRenderingResultsToImageData(DrawingBuffer
*, int&, int&); | |
279 | |
280 // Support for buffer creation and deletion | 250 // Support for buffer creation and deletion |
281 Platform3DObject createBuffer(); | 251 Platform3DObject createBuffer(); |
282 Platform3DObject createFramebuffer(); | 252 Platform3DObject createFramebuffer(); |
283 Platform3DObject createProgram(); | 253 Platform3DObject createProgram(); |
284 Platform3DObject createRenderbuffer(); | 254 Platform3DObject createRenderbuffer(); |
285 Platform3DObject createShader(GLenum); | 255 Platform3DObject createShader(GLenum); |
286 Platform3DObject createTexture(); | 256 Platform3DObject createTexture(); |
287 | 257 |
288 void deleteBuffer(Platform3DObject); | 258 void deleteBuffer(Platform3DObject); |
289 void deleteFramebuffer(Platform3DObject); | 259 void deleteFramebuffer(Platform3DObject); |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
380 | 350 |
381 // Helper function which extracts the user-supplied texture | 351 // Helper function which extracts the user-supplied texture |
382 // data, applying the flipY and premultiplyAlpha parameters. | 352 // data, applying the flipY and premultiplyAlpha parameters. |
383 // If the data is not tightly packed according to the passed | 353 // If the data is not tightly packed according to the passed |
384 // unpackAlignment, the output data will be tightly packed. | 354 // unpackAlignment, the output data will be tightly packed. |
385 // Returns true if successful, false if any error occurred. | 355 // Returns true if successful, false if any error occurred. |
386 static bool extractTextureData(unsigned width, unsigned height, GLenum forma
t, GLenum type, unsigned unpackAlignment, bool flipY, bool premultiplyAlpha, con
st void* pixels, Vector<uint8_t>& data); | 356 static bool extractTextureData(unsigned width, unsigned height, GLenum forma
t, GLenum type, unsigned unpackAlignment, bool flipY, bool premultiplyAlpha, con
st void* pixels, Vector<uint8_t>& data); |
387 | 357 |
388 // End GraphicsContext3DImagePacking.cpp functions | 358 // End GraphicsContext3DImagePacking.cpp functions |
389 | 359 |
390 // This is the order of bytes to use when doing a readback. | |
391 enum ReadbackOrder { | |
392 ReadbackRGBA, | |
393 ReadbackSkia | |
394 }; | |
395 | |
396 // Helper function which does a readback from the currently-bound | |
397 // framebuffer into a buffer of a certain size with 4-byte pixels. | |
398 void readBackFramebuffer(unsigned char* pixels, int width, int height, Readb
ackOrder, AlphaOp); | |
399 | |
400 void setPackAlignment(GLint param); | |
401 | |
402 // Extension support. | 360 // Extension support. |
403 bool supportsExtension(const String& name); | 361 bool supportsExtension(const String& name); |
404 bool ensureExtensionEnabled(const String& name); | 362 bool ensureExtensionEnabled(const String& name); |
405 bool isExtensionEnabled(const String& name); | 363 bool isExtensionEnabled(const String& name); |
406 bool canUseCopyTextureCHROMIUM(GLenum destFormat, GLenum destType, GLint lev
el); | |
407 | 364 |
408 void paintFramebufferToCanvas(int framebuffer, int width, int height, bool p
remultiplyAlpha, ImageBuffer*); | 365 static bool canUseCopyTextureCHROMIUM(GLenum destFormat, GLenum destType, GL
int level); |
409 | 366 |
410 private: | 367 private: |
411 GraphicsContext3D(PassOwnPtr<blink::WebGraphicsContext3D>, bool preserveDraw
ingBuffer); | 368 GraphicsContext3D(PassOwnPtr<blink::WebGraphicsContext3D>, bool preserveDraw
ingBuffer); |
412 GraphicsContext3D(PassOwnPtr<blink::WebGraphicsContext3DProvider>, bool pres
erveDrawingBuffer); | 369 GraphicsContext3D(PassOwnPtr<blink::WebGraphicsContext3DProvider>, bool pres
erveDrawingBuffer); |
413 GraphicsContext3D(blink::WebGraphicsContext3D* webContext); | 370 GraphicsContext3D(blink::WebGraphicsContext3D* webContext); |
414 | 371 |
415 // Helper for packImageData/extractImageData/extractTextureData which implem
ent packing of pixel | 372 // Helper for packImageData/extractImageData/extractTextureData which implem
ent packing of pixel |
416 // data into the specified OpenGL destination format and type. | 373 // data into the specified OpenGL destination format and type. |
417 // A sourceUnpackAlignment of zero indicates that the source | 374 // A sourceUnpackAlignment of zero indicates that the source |
418 // data is tightly packed. Non-zero values may take a slow path. | 375 // data is tightly packed. Non-zero values may take a slow path. |
419 // Destination data will have no gaps between rows. | 376 // Destination data will have no gaps between rows. |
420 // Implemented in GraphicsContext3DImagePacking.cpp | 377 // Implemented in GraphicsContext3DImagePacking.cpp |
421 static bool packPixels(const uint8_t* sourceData, DataFormat sourceDataForma
t, unsigned width, unsigned height, unsigned sourceUnpackAlignment, unsigned des
tinationFormat, unsigned destinationType, AlphaOp, void* destinationData, bool f
lipY); | 378 static bool packPixels(const uint8_t* sourceData, DataFormat sourceDataForma
t, unsigned width, unsigned height, unsigned sourceUnpackAlignment, unsigned des
tinationFormat, unsigned destinationType, AlphaOp, void* destinationData, bool f
lipY); |
422 | 379 |
423 // Helper function to flip a bitmap vertically. | |
424 void flipVertically(uint8_t* data, int width, int height); | |
425 | |
426 void initializeExtensions(); | 380 void initializeExtensions(); |
427 | 381 |
428 bool preserveDrawingBuffer() const { return m_preserveDrawingBuffer; } | |
429 | |
430 OwnPtr<blink::WebGraphicsContext3DProvider> m_provider; | 382 OwnPtr<blink::WebGraphicsContext3DProvider> m_provider; |
431 blink::WebGraphicsContext3D* m_impl; | 383 blink::WebGraphicsContext3D* m_impl; |
432 OwnPtr<GraphicsContext3DContextLostCallbackAdapter> m_contextLostCallbackAda
pter; | |
433 OwnPtr<GraphicsContext3DErrorMessageCallbackAdapter> m_errorMessageCallbackA
dapter; | |
434 OwnPtr<blink::WebGraphicsContext3D> m_ownedWebContext; | 384 OwnPtr<blink::WebGraphicsContext3D> m_ownedWebContext; |
435 bool m_initializedAvailableExtensions; | 385 bool m_initializedAvailableExtensions; |
436 HashSet<String> m_enabledExtensions; | 386 HashSet<String> m_enabledExtensions; |
437 HashSet<String> m_requestableExtensions; | 387 HashSet<String> m_requestableExtensions; |
438 bool m_layerComposited; | |
439 bool m_preserveDrawingBuffer; | 388 bool m_preserveDrawingBuffer; |
440 int m_packAlignment; | |
441 | |
442 // If the width and height of the Canvas's backing store don't | |
443 // match those that we were given in the most recent call to | |
444 // reshape(), then we need an intermediate bitmap to read back the | |
445 // frame buffer into. This seems to happen when CSS styles are | |
446 // used to resize the Canvas. | |
447 SkBitmap m_resizingBitmap; | |
448 | |
449 GrContext* m_grContext; | 389 GrContext* m_grContext; |
450 | |
451 // Used to flip a bitmap vertically. | |
452 Vector<uint8_t> m_scanline; | |
453 }; | 390 }; |
454 | 391 |
455 } // namespace WebCore | 392 } // namespace WebCore |
456 | 393 |
457 #endif // GraphicsContext3D_h | 394 #endif // GraphicsContext3D_h |
OLD | NEW |