Home | History | Annotate | Download | only in graphics
      1 /*
      2  * Copyright (C) 2009 Apple Inc. All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      7  * 1. Redistributions of source code must retain the above copyright
      8  *    notice, this list of conditions and the following disclaimer.
      9  * 2. Redistributions in binary form must reproduce the above copyright
     10  *    notice, this list of conditions and the following disclaimer in the
     11  *    documentation and/or other materials provided with the distribution.
     12  *
     13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
     14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
     17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
     21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     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.
     24  */
     25 
     26 #ifndef GraphicsContext3D_h
     27 #define GraphicsContext3D_h
     28 
     29 #include "core/platform/graphics/Extensions3D.h"
     30 #include "core/platform/graphics/GraphicsTypes3D.h"
     31 #include "core/platform/graphics/Image.h"
     32 #include "core/platform/graphics/IntRect.h"
     33 #include "third_party/skia/include/core/SkBitmap.h"
     34 #include "weborigin/KURL.h"
     35 #include "wtf/HashMap.h"
     36 #include "wtf/HashSet.h"
     37 #include "wtf/ListHashSet.h"
     38 #include "wtf/Noncopyable.h"
     39 #include "wtf/OwnArrayPtr.h"
     40 #include "wtf/OwnPtr.h"
     41 #include "wtf/PassOwnArrayPtr.h"
     42 #include "wtf/RefCounted.h"
     43 #include "wtf/text/WTFString.h"
     44 
     45 // FIXME: Find a better way to avoid the name confliction for NO_ERROR.
     46 #if OS(WINDOWS)
     47 #undef NO_ERROR
     48 #endif
     49 
     50 class GrContext;
     51 
     52 namespace WebKit {
     53 class WebGraphicsContext3D;
     54 class WebGraphicsContext3DProvider;
     55 }
     56 
     57 namespace WebCore {
     58 class DrawingBuffer;
     59 class Extensions3D;
     60 class GraphicsContext3DContextLostCallbackAdapter;
     61 class GraphicsContext3DErrorMessageCallbackAdapter;
     62 class GrMemoryAllocationChangedCallbackAdapter;
     63 class Image;
     64 class ImageBuffer;
     65 class ImageData;
     66 class IntRect;
     67 class IntSize;
     68 
     69 struct ActiveInfo {
     70     String name;
     71     GC3Denum type;
     72     GC3Dint size;
     73 };
     74 
     75 class GraphicsContext3D : public RefCounted<GraphicsContext3D> {
     76 public:
     77     enum {
     78         DEPTH_BUFFER_BIT = 0x00000100,
     79         STENCIL_BUFFER_BIT = 0x00000400,
     80         COLOR_BUFFER_BIT = 0x00004000,
     81         POINTS = 0x0000,
     82         LINES = 0x0001,
     83         LINE_LOOP = 0x0002,
     84         LINE_STRIP = 0x0003,
     85         TRIANGLES = 0x0004,
     86         TRIANGLE_STRIP = 0x0005,
     87         TRIANGLE_FAN = 0x0006,
     88         ZERO = 0,
     89         ONE = 1,
     90         SRC_COLOR = 0x0300,
     91         ONE_MINUS_SRC_COLOR = 0x0301,
     92         SRC_ALPHA = 0x0302,
     93         ONE_MINUS_SRC_ALPHA = 0x0303,
     94         DST_ALPHA = 0x0304,
     95         ONE_MINUS_DST_ALPHA = 0x0305,
     96         DST_COLOR = 0x0306,
     97         ONE_MINUS_DST_COLOR = 0x0307,
     98         SRC_ALPHA_SATURATE = 0x0308,
     99         FUNC_ADD = 0x8006,
    100         BLEND_EQUATION = 0x8009,
    101         BLEND_EQUATION_RGB = 0x8009,
    102         BLEND_EQUATION_ALPHA = 0x883D,
    103         FUNC_SUBTRACT = 0x800A,
    104         FUNC_REVERSE_SUBTRACT = 0x800B,
    105         BLEND_DST_RGB = 0x80C8,
    106         BLEND_SRC_RGB = 0x80C9,
    107         BLEND_DST_ALPHA = 0x80CA,
    108         BLEND_SRC_ALPHA = 0x80CB,
    109         CONSTANT_COLOR = 0x8001,
    110         ONE_MINUS_CONSTANT_COLOR = 0x8002,
    111         CONSTANT_ALPHA = 0x8003,
    112         ONE_MINUS_CONSTANT_ALPHA = 0x8004,
    113         BLEND_COLOR = 0x8005,
    114         ARRAY_BUFFER = 0x8892,
    115         ELEMENT_ARRAY_BUFFER = 0x8893,
    116         ARRAY_BUFFER_BINDING = 0x8894,
    117         ELEMENT_ARRAY_BUFFER_BINDING = 0x8895,
    118         STREAM_DRAW = 0x88E0,
    119         STATIC_DRAW = 0x88E4,
    120         DYNAMIC_DRAW = 0x88E8,
    121         BUFFER_SIZE = 0x8764,
    122         BUFFER_USAGE = 0x8765,
    123         CURRENT_VERTEX_ATTRIB = 0x8626,
    124         FRONT = 0x0404,
    125         BACK = 0x0405,
    126         FRONT_AND_BACK = 0x0408,
    127         TEXTURE_2D = 0x0DE1,
    128         CULL_FACE = 0x0B44,
    129         BLEND = 0x0BE2,
    130         DITHER = 0x0BD0,
    131         STENCIL_TEST = 0x0B90,
    132         DEPTH_TEST = 0x0B71,
    133         SCISSOR_TEST = 0x0C11,
    134         POLYGON_OFFSET_FILL = 0x8037,
    135         SAMPLE_ALPHA_TO_COVERAGE = 0x809E,
    136         SAMPLE_COVERAGE = 0x80A0,
    137         NO_ERROR = 0,
    138         INVALID_ENUM = 0x0500,
    139         INVALID_VALUE = 0x0501,
    140         INVALID_OPERATION = 0x0502,
    141         OUT_OF_MEMORY = 0x0505,
    142         CW = 0x0900,
    143         CCW = 0x0901,
    144         LINE_WIDTH = 0x0B21,
    145         ALIASED_POINT_SIZE_RANGE = 0x846D,
    146         ALIASED_LINE_WIDTH_RANGE = 0x846E,
    147         CULL_FACE_MODE = 0x0B45,
    148         FRONT_FACE = 0x0B46,
    149         DEPTH_RANGE = 0x0B70,
    150         DEPTH_WRITEMASK = 0x0B72,
    151         DEPTH_CLEAR_VALUE = 0x0B73,
    152         DEPTH_FUNC = 0x0B74,
    153         STENCIL_CLEAR_VALUE = 0x0B91,
    154         STENCIL_FUNC = 0x0B92,
    155         STENCIL_FAIL = 0x0B94,
    156         STENCIL_PASS_DEPTH_FAIL = 0x0B95,
    157         STENCIL_PASS_DEPTH_PASS = 0x0B96,
    158         STENCIL_REF = 0x0B97,
    159         STENCIL_VALUE_MASK = 0x0B93,
    160         STENCIL_WRITEMASK = 0x0B98,
    161         STENCIL_BACK_FUNC = 0x8800,
    162         STENCIL_BACK_FAIL = 0x8801,
    163         STENCIL_BACK_PASS_DEPTH_FAIL = 0x8802,
    164         STENCIL_BACK_PASS_DEPTH_PASS = 0x8803,
    165         STENCIL_BACK_REF = 0x8CA3,
    166         STENCIL_BACK_VALUE_MASK = 0x8CA4,
    167         STENCIL_BACK_WRITEMASK = 0x8CA5,
    168         VIEWPORT = 0x0BA2,
    169         SCISSOR_BOX = 0x0C10,
    170         COLOR_CLEAR_VALUE = 0x0C22,
    171         COLOR_WRITEMASK = 0x0C23,
    172         UNPACK_ALIGNMENT = 0x0CF5,
    173         PACK_ALIGNMENT = 0x0D05,
    174         MAX_TEXTURE_SIZE = 0x0D33,
    175         MAX_VIEWPORT_DIMS = 0x0D3A,
    176         SUBPIXEL_BITS = 0x0D50,
    177         RED_BITS = 0x0D52,
    178         GREEN_BITS = 0x0D53,
    179         BLUE_BITS = 0x0D54,
    180         ALPHA_BITS = 0x0D55,
    181         DEPTH_BITS = 0x0D56,
    182         STENCIL_BITS = 0x0D57,
    183         POLYGON_OFFSET_UNITS = 0x2A00,
    184         POLYGON_OFFSET_FACTOR = 0x8038,
    185         TEXTURE_BINDING_2D = 0x8069,
    186         SAMPLE_BUFFERS = 0x80A8,
    187         SAMPLES = 0x80A9,
    188         SAMPLE_COVERAGE_VALUE = 0x80AA,
    189         SAMPLE_COVERAGE_INVERT = 0x80AB,
    190         NUM_COMPRESSED_TEXTURE_FORMATS = 0x86A2,
    191         COMPRESSED_TEXTURE_FORMATS = 0x86A3,
    192         DONT_CARE = 0x1100,
    193         FASTEST = 0x1101,
    194         NICEST = 0x1102,
    195         GENERATE_MIPMAP_HINT = 0x8192,
    196         BYTE = 0x1400,
    197         UNSIGNED_BYTE = 0x1401,
    198         SHORT = 0x1402,
    199         UNSIGNED_SHORT = 0x1403,
    200         INT = 0x1404,
    201         UNSIGNED_INT = 0x1405,
    202         FLOAT = 0x1406,
    203         HALF_FLOAT_OES = 0x8D61,
    204         FIXED = 0x140C,
    205         DEPTH_COMPONENT = 0x1902,
    206         ALPHA = 0x1906,
    207         RGB = 0x1907,
    208         RGBA = 0x1908,
    209         BGRA = 0x80E1,
    210         LUMINANCE = 0x1909,
    211         LUMINANCE_ALPHA = 0x190A,
    212         UNSIGNED_SHORT_4_4_4_4 = 0x8033,
    213         UNSIGNED_SHORT_5_5_5_1 = 0x8034,
    214         UNSIGNED_SHORT_5_6_5 = 0x8363,
    215         FRAGMENT_SHADER = 0x8B30,
    216         VERTEX_SHADER = 0x8B31,
    217         MAX_VERTEX_ATTRIBS = 0x8869,
    218         MAX_VERTEX_UNIFORM_VECTORS = 0x8DFB,
    219         MAX_VARYING_VECTORS = 0x8DFC,
    220         MAX_COMBINED_TEXTURE_IMAGE_UNITS = 0x8B4D,
    221         MAX_VERTEX_TEXTURE_IMAGE_UNITS = 0x8B4C,
    222         MAX_TEXTURE_IMAGE_UNITS = 0x8872,
    223         MAX_FRAGMENT_UNIFORM_VECTORS = 0x8DFD,
    224         SHADER_TYPE = 0x8B4F,
    225         DELETE_STATUS = 0x8B80,
    226         LINK_STATUS = 0x8B82,
    227         VALIDATE_STATUS = 0x8B83,
    228         ATTACHED_SHADERS = 0x8B85,
    229         ACTIVE_UNIFORMS = 0x8B86,
    230         ACTIVE_UNIFORM_MAX_LENGTH = 0x8B87,
    231         ACTIVE_ATTRIBUTES = 0x8B89,
    232         ACTIVE_ATTRIBUTE_MAX_LENGTH = 0x8B8A,
    233         SHADING_LANGUAGE_VERSION = 0x8B8C,
    234         CURRENT_PROGRAM = 0x8B8D,
    235         NEVER = 0x0200,
    236         LESS = 0x0201,
    237         EQUAL = 0x0202,
    238         LEQUAL = 0x0203,
    239         GREATER = 0x0204,
    240         NOTEQUAL = 0x0205,
    241         GEQUAL = 0x0206,
    242         ALWAYS = 0x0207,
    243         KEEP = 0x1E00,
    244         REPLACE = 0x1E01,
    245         INCR = 0x1E02,
    246         DECR = 0x1E03,
    247         INVERT = 0x150A,
    248         INCR_WRAP = 0x8507,
    249         DECR_WRAP = 0x8508,
    250         VENDOR = 0x1F00,
    251         RENDERER = 0x1F01,
    252         VERSION = 0x1F02,
    253         EXTENSIONS = 0x1F03,
    254         NEAREST = 0x2600,
    255         LINEAR = 0x2601,
    256         NEAREST_MIPMAP_NEAREST = 0x2700,
    257         LINEAR_MIPMAP_NEAREST = 0x2701,
    258         NEAREST_MIPMAP_LINEAR = 0x2702,
    259         LINEAR_MIPMAP_LINEAR = 0x2703,
    260         TEXTURE_MAG_FILTER = 0x2800,
    261         TEXTURE_MIN_FILTER = 0x2801,
    262         TEXTURE_WRAP_S = 0x2802,
    263         TEXTURE_WRAP_T = 0x2803,
    264         TEXTURE = 0x1702,
    265         TEXTURE_CUBE_MAP = 0x8513,
    266         TEXTURE_BINDING_CUBE_MAP = 0x8514,
    267         TEXTURE_CUBE_MAP_POSITIVE_X = 0x8515,
    268         TEXTURE_CUBE_MAP_NEGATIVE_X = 0x8516,
    269         TEXTURE_CUBE_MAP_POSITIVE_Y = 0x8517,
    270         TEXTURE_CUBE_MAP_NEGATIVE_Y = 0x8518,
    271         TEXTURE_CUBE_MAP_POSITIVE_Z = 0x8519,
    272         TEXTURE_CUBE_MAP_NEGATIVE_Z = 0x851A,
    273         MAX_CUBE_MAP_TEXTURE_SIZE = 0x851C,
    274         TEXTURE0 = 0x84C0,
    275         TEXTURE1 = 0x84C1,
    276         TEXTURE2 = 0x84C2,
    277         TEXTURE3 = 0x84C3,
    278         TEXTURE4 = 0x84C4,
    279         TEXTURE5 = 0x84C5,
    280         TEXTURE6 = 0x84C6,
    281         TEXTURE7 = 0x84C7,
    282         TEXTURE8 = 0x84C8,
    283         TEXTURE9 = 0x84C9,
    284         TEXTURE10 = 0x84CA,
    285         TEXTURE11 = 0x84CB,
    286         TEXTURE12 = 0x84CC,
    287         TEXTURE13 = 0x84CD,
    288         TEXTURE14 = 0x84CE,
    289         TEXTURE15 = 0x84CF,
    290         TEXTURE16 = 0x84D0,
    291         TEXTURE17 = 0x84D1,
    292         TEXTURE18 = 0x84D2,
    293         TEXTURE19 = 0x84D3,
    294         TEXTURE20 = 0x84D4,
    295         TEXTURE21 = 0x84D5,
    296         TEXTURE22 = 0x84D6,
    297         TEXTURE23 = 0x84D7,
    298         TEXTURE24 = 0x84D8,
    299         TEXTURE25 = 0x84D9,
    300         TEXTURE26 = 0x84DA,
    301         TEXTURE27 = 0x84DB,
    302         TEXTURE28 = 0x84DC,
    303         TEXTURE29 = 0x84DD,
    304         TEXTURE30 = 0x84DE,
    305         TEXTURE31 = 0x84DF,
    306         ACTIVE_TEXTURE = 0x84E0,
    307         REPEAT = 0x2901,
    308         CLAMP_TO_EDGE = 0x812F,
    309         MIRRORED_REPEAT = 0x8370,
    310         FLOAT_VEC2 = 0x8B50,
    311         FLOAT_VEC3 = 0x8B51,
    312         FLOAT_VEC4 = 0x8B52,
    313         INT_VEC2 = 0x8B53,
    314         INT_VEC3 = 0x8B54,
    315         INT_VEC4 = 0x8B55,
    316         BOOL = 0x8B56,
    317         BOOL_VEC2 = 0x8B57,
    318         BOOL_VEC3 = 0x8B58,
    319         BOOL_VEC4 = 0x8B59,
    320         FLOAT_MAT2 = 0x8B5A,
    321         FLOAT_MAT3 = 0x8B5B,
    322         FLOAT_MAT4 = 0x8B5C,
    323         SAMPLER_2D = 0x8B5E,
    324         SAMPLER_CUBE = 0x8B60,
    325         VERTEX_ATTRIB_ARRAY_ENABLED = 0x8622,
    326         VERTEX_ATTRIB_ARRAY_SIZE = 0x8623,
    327         VERTEX_ATTRIB_ARRAY_STRIDE = 0x8624,
    328         VERTEX_ATTRIB_ARRAY_TYPE = 0x8625,
    329         VERTEX_ATTRIB_ARRAY_NORMALIZED = 0x886A,
    330         VERTEX_ATTRIB_ARRAY_POINTER = 0x8645,
    331         VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = 0x889F,
    332         COMPILE_STATUS = 0x8B81,
    333         INFO_LOG_LENGTH = 0x8B84,
    334         SHADER_SOURCE_LENGTH = 0x8B88,
    335         SHADER_COMPILER = 0x8DFA,
    336         SHADER_BINARY_FORMATS = 0x8DF8,
    337         NUM_SHADER_BINARY_FORMATS = 0x8DF9,
    338         LOW_FLOAT = 0x8DF0,
    339         MEDIUM_FLOAT = 0x8DF1,
    340         HIGH_FLOAT = 0x8DF2,
    341         LOW_INT = 0x8DF3,
    342         MEDIUM_INT = 0x8DF4,
    343         HIGH_INT = 0x8DF5,
    344         FRAMEBUFFER = 0x8D40,
    345         RENDERBUFFER = 0x8D41,
    346         RGBA4 = 0x8056,
    347         RGB5_A1 = 0x8057,
    348         RGB565 = 0x8D62,
    349         DEPTH_COMPONENT16 = 0x81A5,
    350         STENCIL_INDEX = 0x1901,
    351         STENCIL_INDEX8 = 0x8D48,
    352         DEPTH_STENCIL = 0x84F9,
    353         UNSIGNED_INT_24_8 = 0x84FA,
    354         DEPTH24_STENCIL8 = 0x88F0,
    355         RENDERBUFFER_WIDTH = 0x8D42,
    356         RENDERBUFFER_HEIGHT = 0x8D43,
    357         RENDERBUFFER_INTERNAL_FORMAT = 0x8D44,
    358         RENDERBUFFER_RED_SIZE = 0x8D50,
    359         RENDERBUFFER_GREEN_SIZE = 0x8D51,
    360         RENDERBUFFER_BLUE_SIZE = 0x8D52,
    361         RENDERBUFFER_ALPHA_SIZE = 0x8D53,
    362         RENDERBUFFER_DEPTH_SIZE = 0x8D54,
    363         RENDERBUFFER_STENCIL_SIZE = 0x8D55,
    364         FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = 0x8CD0,
    365         FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = 0x8CD1,
    366         FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = 0x8CD2,
    367         FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = 0x8CD3,
    368         COLOR_ATTACHMENT0 = 0x8CE0,
    369         DEPTH_ATTACHMENT = 0x8D00,
    370         STENCIL_ATTACHMENT = 0x8D20,
    371         DEPTH_STENCIL_ATTACHMENT = 0x821A,
    372         NONE = 0,
    373         FRAMEBUFFER_COMPLETE = 0x8CD5,
    374         FRAMEBUFFER_INCOMPLETE_ATTACHMENT = 0x8CD6,
    375         FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 0x8CD7,
    376         FRAMEBUFFER_INCOMPLETE_DIMENSIONS = 0x8CD9,
    377         FRAMEBUFFER_UNSUPPORTED = 0x8CDD,
    378         FRAMEBUFFER_BINDING = 0x8CA6,
    379         RENDERBUFFER_BINDING = 0x8CA7,
    380         MAX_RENDERBUFFER_SIZE = 0x84E8,
    381         INVALID_FRAMEBUFFER_OPERATION = 0x0506,
    382 
    383         // WebGL-specific enums
    384         UNPACK_FLIP_Y_WEBGL = 0x9240,
    385         UNPACK_PREMULTIPLY_ALPHA_WEBGL = 0x9241,
    386         CONTEXT_LOST_WEBGL = 0x9242,
    387         UNPACK_COLORSPACE_CONVERSION_WEBGL = 0x9243,
    388         BROWSER_DEFAULT_WEBGL = 0x9244
    389     };
    390 
    391     // Context creation attributes.
    392     struct Attributes {
    393         Attributes()
    394             : alpha(true)
    395             , depth(true)
    396             , stencil(false)
    397             , antialias(true)
    398             , premultipliedAlpha(true)
    399             , preserveDrawingBuffer(false)
    400             , noExtensions(false)
    401             , shareResources(true)
    402             , preferDiscreteGPU(false)
    403         {
    404         }
    405 
    406         bool alpha;
    407         bool depth;
    408         bool stencil;
    409         bool antialias;
    410         bool premultipliedAlpha;
    411         bool preserveDrawingBuffer;
    412         bool noExtensions;
    413         bool shareResources;
    414         bool preferDiscreteGPU;
    415         KURL topDocumentURL;
    416     };
    417 
    418     class ContextLostCallback {
    419     public:
    420         virtual void onContextLost() = 0;
    421         virtual ~ContextLostCallback() {}
    422     };
    423 
    424     class ErrorMessageCallback {
    425     public:
    426         virtual void onErrorMessage(const String& message, GC3Dint id) = 0;
    427         virtual ~ErrorMessageCallback() { }
    428     };
    429 
    430     void setContextLostCallback(PassOwnPtr<ContextLostCallback>);
    431     void setErrorMessageCallback(PassOwnPtr<ErrorMessageCallback>);
    432 
    433     static PassRefPtr<GraphicsContext3D> create(Attributes);
    434 
    435     // Callers must make the context current before using it AND check that the context was created successfully
    436     // via ContextLost before using the context in any way. Once made current on a thread, the context cannot
    437     // be used on any other thread.
    438     static PassRefPtr<GraphicsContext3D> createGraphicsContextFromWebContext(PassOwnPtr<WebKit::WebGraphicsContext3D>, bool preserveDrawingBuffer = false);
    439     static PassRefPtr<GraphicsContext3D> createGraphicsContextFromProvider(PassOwnPtr<WebKit::WebGraphicsContext3DProvider>, bool preserveDrawingBuffer = false);
    440 
    441     ~GraphicsContext3D();
    442 
    443     GrContext* grContext();
    444     WebKit::WebGraphicsContext3D* webContext() const { return m_impl; }
    445 
    446     bool makeContextCurrent();
    447 
    448     // Helper to texImage2D with pixel==0 case: pixels are initialized to 0.
    449     // Return true if no GL error is synthesized.
    450     // By default, alignment is 4, the OpenGL default setting.
    451     bool texImage2DResourceSafe(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height, GC3Dint border, GC3Denum format, GC3Denum type, GC3Dint alignment = 4);
    452 
    453     //----------------------------------------------------------------------
    454     // Helpers for texture uploading and pixel readback.
    455     //
    456 
    457     // Computes the components per pixel and bytes per component
    458     // for the given format and type combination. Returns false if
    459     // either was an invalid enum.
    460     static bool computeFormatAndTypeParameters(GC3Denum format,
    461                                                GC3Denum type,
    462                                                unsigned int* componentsPerPixel,
    463                                                unsigned int* bytesPerComponent);
    464 
    465     // Computes the image size in bytes. If paddingInBytes is not null, padding
    466     // is also calculated in return. Returns NO_ERROR if succeed, otherwise
    467     // return the suggested GL error indicating the cause of the failure:
    468     //   INVALID_VALUE if width/height is negative or overflow happens.
    469     //   INVALID_ENUM if format/type is illegal.
    470     static GC3Denum computeImageSizeInBytes(GC3Denum format,
    471                                      GC3Denum type,
    472                                      GC3Dsizei width,
    473                                      GC3Dsizei height,
    474                                      GC3Dint alignment,
    475                                      unsigned int* imageSizeInBytes,
    476                                      unsigned int* paddingInBytes);
    477 
    478     // Attempt to enumerate all possible native image formats to
    479     // reduce the amount of temporary allocations during texture
    480     // uploading. This enum must be public because it is accessed
    481     // by non-member functions.
    482     enum DataFormat {
    483         DataFormatRGBA8 = 0,
    484         DataFormatRGBA16F,
    485         DataFormatRGBA32F,
    486         DataFormatRGB8,
    487         DataFormatRGB16F,
    488         DataFormatRGB32F,
    489         DataFormatBGR8,
    490         DataFormatBGRA8,
    491         DataFormatARGB8,
    492         DataFormatABGR8,
    493         DataFormatRGBA5551,
    494         DataFormatRGBA4444,
    495         DataFormatRGB565,
    496         DataFormatR8,
    497         DataFormatR16F,
    498         DataFormatR32F,
    499         DataFormatRA8,
    500         DataFormatRA16F,
    501         DataFormatRA32F,
    502         DataFormatAR8,
    503         DataFormatA8,
    504         DataFormatA16F,
    505         DataFormatA32F,
    506         DataFormatNumFormats
    507     };
    508 
    509     // Check if the format is one of the formats from the ImageData or DOM elements.
    510     // The formats from ImageData is always RGBA8.
    511     // The formats from DOM elements vary with Graphics ports. It can only be RGBA8 or BGRA8.
    512     static ALWAYS_INLINE bool srcFormatComeFromDOMElementOrImageData(DataFormat SrcFormat)
    513     {
    514     return SrcFormat == DataFormatBGRA8 || SrcFormat == DataFormatRGBA8;
    515     }
    516 
    517     //----------------------------------------------------------------------
    518     // Entry points for WebGL.
    519     //
    520 
    521     void activeTexture(GC3Denum texture);
    522     void attachShader(Platform3DObject program, Platform3DObject shader);
    523     void bindAttribLocation(Platform3DObject, GC3Duint index, const String& name);
    524     void bindBuffer(GC3Denum target, Platform3DObject);
    525     void bindFramebuffer(GC3Denum target, Platform3DObject);
    526     void bindRenderbuffer(GC3Denum target, Platform3DObject);
    527     void bindTexture(GC3Denum target, Platform3DObject);
    528     void blendColor(GC3Dclampf red, GC3Dclampf green, GC3Dclampf blue, GC3Dclampf alpha);
    529     void blendEquation(GC3Denum mode);
    530     void blendEquationSeparate(GC3Denum modeRGB, GC3Denum modeAlpha);
    531     void blendFunc(GC3Denum sfactor, GC3Denum dfactor);
    532     void blendFuncSeparate(GC3Denum srcRGB, GC3Denum dstRGB, GC3Denum srcAlpha, GC3Denum dstAlpha);
    533 
    534     void bufferData(GC3Denum target, GC3Dsizeiptr size, GC3Denum usage);
    535     void bufferData(GC3Denum target, GC3Dsizeiptr size, const void* data, GC3Denum usage);
    536     void bufferSubData(GC3Denum target, GC3Dintptr offset, GC3Dsizeiptr size, const void* data);
    537 
    538     GC3Denum checkFramebufferStatus(GC3Denum target);
    539     void clear(GC3Dbitfield mask);
    540     void clearColor(GC3Dclampf red, GC3Dclampf green, GC3Dclampf blue, GC3Dclampf alpha);
    541     void clearDepth(GC3Dclampf depth);
    542     void clearStencil(GC3Dint s);
    543     void colorMask(GC3Dboolean red, GC3Dboolean green, GC3Dboolean blue, GC3Dboolean alpha);
    544     void compileShader(Platform3DObject);
    545 
    546     void compressedTexImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height, GC3Dint border, GC3Dsizei imageSize, const void* data);
    547     void compressedTexSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Dsizei width, GC3Dsizei height, GC3Denum format, GC3Dsizei imageSize, const void* data);
    548     void copyTexImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height, GC3Dint border);
    549     void copyTexSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height);
    550     void cullFace(GC3Denum mode);
    551     void depthFunc(GC3Denum func);
    552     void depthMask(GC3Dboolean flag);
    553     void depthRange(GC3Dclampf zNear, GC3Dclampf zFar);
    554     void detachShader(Platform3DObject, Platform3DObject);
    555     void disable(GC3Denum cap);
    556     void disableVertexAttribArray(GC3Duint index);
    557     void drawArrays(GC3Denum mode, GC3Dint first, GC3Dsizei count);
    558     void drawElements(GC3Denum mode, GC3Dsizei count, GC3Denum type, GC3Dintptr offset);
    559 
    560     void enable(GC3Denum cap);
    561     void enableVertexAttribArray(GC3Duint index);
    562     void finish();
    563     void flush();
    564     void framebufferRenderbuffer(GC3Denum target, GC3Denum attachment, GC3Denum renderbuffertarget, Platform3DObject);
    565     void framebufferTexture2D(GC3Denum target, GC3Denum attachment, GC3Denum textarget, Platform3DObject, GC3Dint level);
    566     void frontFace(GC3Denum mode);
    567     void generateMipmap(GC3Denum target);
    568 
    569     bool getActiveAttrib(Platform3DObject program, GC3Duint index, ActiveInfo&);
    570     bool getActiveUniform(Platform3DObject program, GC3Duint index, ActiveInfo&);
    571     void getAttachedShaders(Platform3DObject program, GC3Dsizei maxCount, GC3Dsizei* count, Platform3DObject* shaders);
    572     GC3Dint getAttribLocation(Platform3DObject, const String& name);
    573     void getBooleanv(GC3Denum pname, GC3Dboolean* value);
    574     void getBufferParameteriv(GC3Denum target, GC3Denum pname, GC3Dint* value);
    575     Attributes getContextAttributes();
    576     GC3Denum getError();
    577     void getFloatv(GC3Denum pname, GC3Dfloat* value);
    578     void getFramebufferAttachmentParameteriv(GC3Denum target, GC3Denum attachment, GC3Denum pname, GC3Dint* value);
    579     void getIntegerv(GC3Denum pname, GC3Dint* value);
    580     void getProgramiv(Platform3DObject program, GC3Denum pname, GC3Dint* value);
    581     String getProgramInfoLog(Platform3DObject);
    582     void getRenderbufferParameteriv(GC3Denum target, GC3Denum pname, GC3Dint* value);
    583     void getShaderiv(Platform3DObject, GC3Denum pname, GC3Dint* value);
    584     String getShaderInfoLog(Platform3DObject);
    585     void getShaderPrecisionFormat(GC3Denum shaderType, GC3Denum precisionType, GC3Dint* range, GC3Dint* precision);
    586     String getShaderSource(Platform3DObject);
    587     String getString(GC3Denum name);
    588     void getTexParameterfv(GC3Denum target, GC3Denum pname, GC3Dfloat* value);
    589     void getTexParameteriv(GC3Denum target, GC3Denum pname, GC3Dint* value);
    590     void getUniformfv(Platform3DObject program, GC3Dint location, GC3Dfloat* value);
    591     void getUniformiv(Platform3DObject program, GC3Dint location, GC3Dint* value);
    592     GC3Dint getUniformLocation(Platform3DObject, const String& name);
    593     void getVertexAttribfv(GC3Duint index, GC3Denum pname, GC3Dfloat* value);
    594     void getVertexAttribiv(GC3Duint index, GC3Denum pname, GC3Dint* value);
    595     GC3Dsizeiptr getVertexAttribOffset(GC3Duint index, GC3Denum pname);
    596 
    597     void hint(GC3Denum target, GC3Denum mode);
    598     GC3Dboolean isBuffer(Platform3DObject);
    599     GC3Dboolean isEnabled(GC3Denum cap);
    600     GC3Dboolean isFramebuffer(Platform3DObject);
    601     GC3Dboolean isProgram(Platform3DObject);
    602     GC3Dboolean isRenderbuffer(Platform3DObject);
    603     GC3Dboolean isShader(Platform3DObject);
    604     GC3Dboolean isTexture(Platform3DObject);
    605     void lineWidth(GC3Dfloat);
    606     void linkProgram(Platform3DObject);
    607     void pixelStorei(GC3Denum pname, GC3Dint param);
    608     void polygonOffset(GC3Dfloat factor, GC3Dfloat units);
    609 
    610     void readPixels(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height, GC3Denum format, GC3Denum type, void* data);
    611 
    612     void releaseShaderCompiler();
    613 
    614     void renderbufferStorage(GC3Denum target, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height);
    615     void sampleCoverage(GC3Dclampf value, GC3Dboolean invert);
    616     void scissor(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height);
    617     void shaderSource(Platform3DObject, const String& string);
    618     void stencilFunc(GC3Denum func, GC3Dint ref, GC3Duint mask);
    619     void stencilFuncSeparate(GC3Denum face, GC3Denum func, GC3Dint ref, GC3Duint mask);
    620     void stencilMask(GC3Duint mask);
    621     void stencilMaskSeparate(GC3Denum face, GC3Duint mask);
    622     void stencilOp(GC3Denum fail, GC3Denum zfail, GC3Denum zpass);
    623     void stencilOpSeparate(GC3Denum face, GC3Denum fail, GC3Denum zfail, GC3Denum zpass);
    624 
    625     void texImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height, GC3Dint border, GC3Denum format, GC3Denum type, const void* pixels);
    626     void texParameterf(GC3Denum target, GC3Denum pname, GC3Dfloat param);
    627     void texParameteri(GC3Denum target, GC3Denum pname, GC3Dint param);
    628     void texSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Dsizei width, GC3Dsizei height, GC3Denum format, GC3Denum type, const void* pixels);
    629 
    630     void uniform1f(GC3Dint location, GC3Dfloat x);
    631     void uniform1fv(GC3Dint location, GC3Dsizei, GC3Dfloat* v);
    632     void uniform1i(GC3Dint location, GC3Dint x);
    633     void uniform1iv(GC3Dint location, GC3Dsizei, GC3Dint* v);
    634     void uniform2f(GC3Dint location, GC3Dfloat x, GC3Dfloat y);
    635     void uniform2fv(GC3Dint location, GC3Dsizei, GC3Dfloat* v);
    636     void uniform2i(GC3Dint location, GC3Dint x, GC3Dint y);
    637     void uniform2iv(GC3Dint location, GC3Dsizei, GC3Dint* v);
    638     void uniform3f(GC3Dint location, GC3Dfloat x, GC3Dfloat y, GC3Dfloat z);
    639     void uniform3fv(GC3Dint location, GC3Dsizei, GC3Dfloat* v);
    640     void uniform3i(GC3Dint location, GC3Dint x, GC3Dint y, GC3Dint z);
    641     void uniform3iv(GC3Dint location, GC3Dsizei, GC3Dint* v);
    642     void uniform4f(GC3Dint location, GC3Dfloat x, GC3Dfloat y, GC3Dfloat z, GC3Dfloat w);
    643     void uniform4fv(GC3Dint location, GC3Dsizei, GC3Dfloat* v);
    644     void uniform4i(GC3Dint location, GC3Dint x, GC3Dint y, GC3Dint z, GC3Dint w);
    645     void uniform4iv(GC3Dint location, GC3Dsizei, GC3Dint* v);
    646     void uniformMatrix2fv(GC3Dint location, GC3Dsizei, GC3Dboolean transpose, GC3Dfloat* value);
    647     void uniformMatrix3fv(GC3Dint location, GC3Dsizei, GC3Dboolean transpose, GC3Dfloat* value);
    648     void uniformMatrix4fv(GC3Dint location, GC3Dsizei, GC3Dboolean transpose, GC3Dfloat* value);
    649 
    650     void useProgram(Platform3DObject);
    651     void validateProgram(Platform3DObject);
    652 
    653     void vertexAttrib1f(GC3Duint index, GC3Dfloat x);
    654     void vertexAttrib1fv(GC3Duint index, GC3Dfloat* values);
    655     void vertexAttrib2f(GC3Duint index, GC3Dfloat x, GC3Dfloat y);
    656     void vertexAttrib2fv(GC3Duint index, GC3Dfloat* values);
    657     void vertexAttrib3f(GC3Duint index, GC3Dfloat x, GC3Dfloat y, GC3Dfloat z);
    658     void vertexAttrib3fv(GC3Duint index, GC3Dfloat* values);
    659     void vertexAttrib4f(GC3Duint index, GC3Dfloat x, GC3Dfloat y, GC3Dfloat z, GC3Dfloat w);
    660     void vertexAttrib4fv(GC3Duint index, GC3Dfloat* values);
    661     void vertexAttribPointer(GC3Duint index, GC3Dint size, GC3Denum type, GC3Dboolean normalized,
    662                              GC3Dsizei stride, GC3Dintptr offset);
    663 
    664     void viewport(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height);
    665 
    666     void reshape(int width, int height);
    667 
    668     void markContextChanged();
    669     void markLayerComposited();
    670     bool layerComposited() const;
    671 
    672     void paintRenderingResultsToCanvas(ImageBuffer*, DrawingBuffer*);
    673     PassRefPtr<ImageData> paintRenderingResultsToImageData(DrawingBuffer*);
    674 
    675     // Support for buffer creation and deletion
    676     Platform3DObject createBuffer();
    677     Platform3DObject createFramebuffer();
    678     Platform3DObject createProgram();
    679     Platform3DObject createRenderbuffer();
    680     Platform3DObject createShader(GC3Denum);
    681     Platform3DObject createTexture();
    682 
    683     void deleteBuffer(Platform3DObject);
    684     void deleteFramebuffer(Platform3DObject);
    685     void deleteProgram(Platform3DObject);
    686     void deleteRenderbuffer(Platform3DObject);
    687     void deleteShader(Platform3DObject);
    688     void deleteTexture(Platform3DObject);
    689 
    690     // Synthesizes an OpenGL error which will be returned from a
    691     // later call to getError. This is used to emulate OpenGL ES
    692     // 2.0 behavior on the desktop and to enforce additional error
    693     // checking mandated by WebGL.
    694     //
    695     // Per the behavior of glGetError, this stores at most one
    696     // instance of any given error, and returns them from calls to
    697     // getError in the order they were added.
    698     void synthesizeGLError(GC3Denum error);
    699 
    700     // Support for extensions. Returns a non-null object, though not
    701     // all methods it contains may necessarily be supported on the
    702     // current hardware. Must call Extensions3D::supports() to
    703     // determine this.
    704     Extensions3D* getExtensions();
    705 
    706     static unsigned getClearBitsByFormat(GC3Denum);
    707 
    708     enum ChannelBits {
    709         ChannelRed = 1,
    710         ChannelGreen = 2,
    711         ChannelBlue = 4,
    712         ChannelAlpha = 8,
    713         ChannelDepth = 16,
    714         ChannelStencil = 32,
    715         ChannelRGB = ChannelRed | ChannelGreen | ChannelBlue,
    716         ChannelRGBA = ChannelRGB | ChannelAlpha,
    717     };
    718 
    719     static unsigned getChannelBitsByFormat(GC3Denum);
    720 
    721     // Possible alpha operations that may need to occur during
    722     // pixel packing. FIXME: kAlphaDoUnmultiply is lossy and must
    723     // be removed.
    724     enum AlphaOp {
    725         AlphaDoNothing = 0,
    726         AlphaDoPremultiply = 1,
    727         AlphaDoUnmultiply = 2
    728     };
    729 
    730     enum ImageHtmlDomSource {
    731         HtmlDomImage = 0,
    732         HtmlDomCanvas = 1,
    733         HtmlDomVideo = 2,
    734         HtmlDomNone = 3
    735     };
    736 
    737     class ImageExtractor {
    738     public:
    739         ImageExtractor(Image*, ImageHtmlDomSource, bool premultiplyAlpha, bool ignoreGammaAndColorProfile);
    740 
    741         ~ImageExtractor();
    742 
    743         bool extractSucceeded() { return m_extractSucceeded; }
    744         const void* imagePixelData() { return m_imagePixelData; }
    745         unsigned imageWidth() { return m_imageWidth; }
    746         unsigned imageHeight() { return m_imageHeight; }
    747         DataFormat imageSourceFormat() { return m_imageSourceFormat; }
    748         AlphaOp imageAlphaOp() { return m_alphaOp; }
    749         unsigned imageSourceUnpackAlignment() { return m_imageSourceUnpackAlignment; }
    750         ImageHtmlDomSource imageHtmlDomSource() { return m_imageHtmlDomSource; }
    751     private:
    752         // Extract the image and keeps track of its status, such as width, height, Source Alignment, format and AlphaOp etc.
    753         // This needs to lock the resources or relevant data if needed and return true upon success
    754         bool extractImage(bool premultiplyAlpha, bool ignoreGammaAndColorProfile);
    755 
    756         RefPtr<NativeImageSkia> m_nativeImage;
    757         RefPtr<NativeImageSkia> m_skiaImage;
    758         Image* m_image;
    759         ImageHtmlDomSource m_imageHtmlDomSource;
    760         bool m_extractSucceeded;
    761         const void* m_imagePixelData;
    762         unsigned m_imageWidth;
    763         unsigned m_imageHeight;
    764         DataFormat m_imageSourceFormat;
    765         AlphaOp m_alphaOp;
    766         unsigned m_imageSourceUnpackAlignment;
    767     };
    768 
    769     // The Following functions are implemented in GraphicsContext3DImagePacking.cpp
    770 
    771     // Packs the contents of the given Image which is passed in |pixels| into the passed Vector
    772     // according to the given format and type, and obeying the flipY and AlphaOp flags.
    773     // Returns true upon success.
    774     static bool packImageData(Image*, const void* pixels, GC3Denum format, GC3Denum type, bool flipY, AlphaOp, DataFormat sourceFormat, unsigned width, unsigned height, unsigned sourceUnpackAlignment, Vector<uint8_t>& data);
    775 
    776     // Extracts the contents of the given ImageData into the passed Vector,
    777     // packing the pixel data according to the given format and type,
    778     // and obeying the flipY and premultiplyAlpha flags. Returns true
    779     // upon success.
    780     static bool extractImageData(ImageData*, GC3Denum format, GC3Denum type, bool flipY, bool premultiplyAlpha, Vector<uint8_t>& data);
    781 
    782     // Helper function which extracts the user-supplied texture
    783     // data, applying the flipY and premultiplyAlpha parameters.
    784     // If the data is not tightly packed according to the passed
    785     // unpackAlignment, the output data will be tightly packed.
    786     // Returns true if successful, false if any error occurred.
    787     static bool extractTextureData(unsigned width, unsigned height, GC3Denum format, GC3Denum type, unsigned unpackAlignment, bool flipY, bool premultiplyAlpha, const void* pixels, Vector<uint8_t>& data);
    788 
    789     // End GraphicsContext3DImagePacking.cpp functions
    790 
    791     // This is the order of bytes to use when doing a readback.
    792     enum ReadbackOrder {
    793         ReadbackRGBA,
    794         ReadbackSkia
    795     };
    796 
    797     // Helper function which does a readback from the currently-bound
    798     // framebuffer into a buffer of a certain size with 4-byte pixels.
    799     void readBackFramebuffer(unsigned char* pixels, int width, int height, ReadbackOrder, AlphaOp);
    800 
    801 private:
    802     friend class Extensions3D;
    803 
    804     GraphicsContext3D(PassOwnPtr<WebKit::WebGraphicsContext3D>, bool preserveDrawingBuffer);
    805     GraphicsContext3D(PassOwnPtr<WebKit::WebGraphicsContext3DProvider>, bool preserveDrawingBuffer);
    806 
    807     // Helper for packImageData/extractImageData/extractTextureData which implement packing of pixel
    808     // data into the specified OpenGL destination format and type.
    809     // A sourceUnpackAlignment of zero indicates that the source
    810     // data is tightly packed. Non-zero values may take a slow path.
    811     // Destination data will have no gaps between rows.
    812     // Implemented in GraphicsContext3DImagePacking.cpp
    813     static bool packPixels(const uint8_t* sourceData, DataFormat sourceDataFormat, unsigned width, unsigned height, unsigned sourceUnpackAlignment, unsigned destinationFormat, unsigned destinationType, AlphaOp, void* destinationData, bool flipY);
    814 
    815     void paintFramebufferToCanvas(int framebuffer, int width, int height, bool premultiplyAlpha, ImageBuffer*);
    816     // Helper function to flip a bitmap vertically.
    817     void flipVertically(uint8_t* data, int width, int height);
    818 
    819     // Extensions3D support.
    820     bool supportsExtension(const String& name);
    821     bool ensureExtensionEnabled(const String& name);
    822     bool isExtensionEnabled(const String& name);
    823 
    824     void initializeExtensions();
    825 
    826     bool preserveDrawingBuffer() const { return m_preserveDrawingBuffer; }
    827 
    828     OwnPtr<WebKit::WebGraphicsContext3DProvider> m_provider;
    829     WebKit::WebGraphicsContext3D* m_impl;
    830     OwnPtr<GraphicsContext3DContextLostCallbackAdapter> m_contextLostCallbackAdapter;
    831     OwnPtr<GraphicsContext3DErrorMessageCallbackAdapter> m_errorMessageCallbackAdapter;
    832     OwnPtr<WebKit::WebGraphicsContext3D> m_ownedWebContext;
    833     OwnPtr<Extensions3D> m_extensions;
    834     OwnPtr<GrMemoryAllocationChangedCallbackAdapter> m_grContextMemoryAllocationCallbackAdapter;
    835     bool m_initializedAvailableExtensions;
    836     HashSet<String> m_enabledExtensions;
    837     HashSet<String> m_requestableExtensions;
    838     bool m_layerComposited;
    839     bool m_preserveDrawingBuffer;
    840     int m_packAlignment;
    841 
    842     enum ResourceSafety {
    843         ResourceSafetyUnknown,
    844         ResourceSafe,
    845         ResourceUnsafe
    846     };
    847     ResourceSafety m_resourceSafety;
    848 
    849     // If the width and height of the Canvas's backing store don't
    850     // match those that we were given in the most recent call to
    851     // reshape(), then we need an intermediate bitmap to read back the
    852     // frame buffer into. This seems to happen when CSS styles are
    853     // used to resize the Canvas.
    854     SkBitmap m_resizingBitmap;
    855 
    856     GrContext* m_grContext;
    857     SkAutoTUnref<GrContext> m_ownedGrContext;
    858 
    859     // Used to flip a bitmap vertically.
    860     Vector<uint8_t> m_scanline;
    861 };
    862 
    863 } // namespace WebCore
    864 
    865 #endif // GraphicsContext3D_h
    866