1/*
2 * Copyright (C) 2011 Google Inc. All rights reserved.
3 * Copyright (C) 2012 Research In Motion Limited. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * 1.  Redistributions of source code must retain the above copyright
10 *     notice, this list of conditions and the following disclaimer.
11 * 2.  Redistributions in binary form must reproduce the above copyright
12 *     notice, this list of conditions and the following disclaimer in the
13 *     documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
16 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
19 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
22 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 */
26
27#ifndef Extensions3DOpenGLES_h
28#define Extensions3DOpenGLES_h
29
30#include "Extensions3DOpenGLCommon.h"
31
32#include <GLES2/gl2.h>
33#include <GLES2/gl2ext.h>
34
35#ifndef GL_EXT_robustness
36/* reuse GL_NO_ERROR */
37#define GL_GUILTY_CONTEXT_RESET_EXT 0x8253
38#define GL_INNOCENT_CONTEXT_RESET_EXT 0x8254
39#define GL_UNKNOWN_CONTEXT_RESET_EXT 0x8255
40#define GL_CONTEXT_ROBUST_ACCESS_EXT 0x90F3
41#define GL_RESET_NOTIFICATION_STRATEGY_EXT 0x8256
42#define GL_LOSE_CONTEXT_ON_RESET_EXT 0x8252
43#define GL_NO_RESET_NOTIFICATION_EXT 0x8261
44#endif
45
46#ifndef GL_EXT_robustness
47#define GL_EXT_robustness 1
48#ifdef GL_GLEXT_PROTOTYPES
49GL_APICALL GC3Denum GL_APIENTRY glGetGraphicsResetStatusEXT(void);
50GL_APICALL void GL_APIENTRY glReadnPixelsEXT(GLint x, GLint y, GC3Dsizei width, GC3Dsizei height, GC3Denum format, GC3Denum type, GC3Dsizei bufSize, void *data);
51GL_APICALL void GL_APIENTRY glGetnUniformfvEXT(GLuint program, GLint location, GC3Dsizei bufSize, float *params);
52GL_APICALL void GL_APIENTRY glGetnUniformivEXT(GLuint program, GLint location, GC3Dsizei bufSize, GLint *params);
53#endif
54typedef GC3Denum (GL_APIENTRYP PFNGLGETGRAPHICSRESETSTATUSEXTPROC) (void);
55typedef void (GL_APIENTRYP PFNGLREADNPIXELSEXTPROC) (GLint x, GLint y, GC3Dsizei width, GC3Dsizei height, GC3Denum format, GC3Denum type, GC3Dsizei bufSize, void *data);
56typedef void (GL_APIENTRYP PFNGLGETNUNIFORMFVEXTPROC) (GLuint program, GLint location, GC3Dsizei bufSize, float *params);
57typedef void (GL_APIENTRYP PFNGLGETNUNIFORMIVEXTPROC) (GLuint program, GLint location, GC3Dsizei bufSize, GLint *params);
58#endif
59
60namespace WebCore {
61
62class Extensions3DOpenGLES : public Extensions3DOpenGLCommon {
63public:
64    virtual ~Extensions3DOpenGLES();
65
66    virtual void framebufferTexture2DMultisampleIMG(unsigned long target, unsigned long attachment, unsigned long textarget, unsigned int texture, int level, unsigned long samples);
67    virtual void renderbufferStorageMultisampleIMG(unsigned long target, unsigned long samples, unsigned long internalformat, unsigned long width, unsigned long height);
68
69    // Extension3D methods
70    virtual void blitFramebuffer(long srcX0, long srcY0, long srcX1, long srcY1, long dstX0, long dstY0, long dstX1, long dstY1, unsigned long mask, unsigned long filter);
71    virtual void renderbufferStorageMultisample(unsigned long target, unsigned long samples, unsigned long internalformat, unsigned long width, unsigned long height);
72    virtual void insertEventMarkerEXT(const String&);
73    virtual void pushGroupMarkerEXT(const String&);
74    virtual void popGroupMarkerEXT(void);
75
76    virtual Platform3DObject createVertexArrayOES();
77    virtual void deleteVertexArrayOES(Platform3DObject);
78    virtual GC3Dboolean isVertexArrayOES(Platform3DObject);
79    virtual void bindVertexArrayOES(Platform3DObject);
80    virtual void drawBuffersEXT(GC3Dsizei, const GC3Denum*);
81
82    virtual void drawArraysInstanced(GC3Denum mode, GC3Dint first, GC3Dsizei count, GC3Dsizei primcount);
83    virtual void drawElementsInstanced(GC3Denum mode, GC3Dsizei count, GC3Denum type, long long offset, GC3Dsizei primcount);
84    virtual void vertexAttribDivisor(GC3Duint index, GC3Duint divisor);
85
86    // EXT Robustness - reset
87    virtual int getGraphicsResetStatusARB();
88    void setEXTContextLostCallback(std::unique_ptr<GraphicsContext3D::ContextLostCallback>);
89
90    // EXT Robustness - etc
91    virtual void readnPixelsEXT(int x, int y, GC3Dsizei width, GC3Dsizei height, GC3Denum format, GC3Denum type, GC3Dsizei bufSize, void *data);
92    virtual void getnUniformfvEXT(GC3Duint program, int location, GC3Dsizei bufSize, float *params);
93    virtual void getnUniformivEXT(GC3Duint program, int location, GC3Dsizei bufSize, int *params);
94
95protected:
96    // This class only needs to be instantiated by GraphicsContext3D implementations.
97    friend class GraphicsContext3D;
98    Extensions3DOpenGLES(GraphicsContext3D*);
99
100    virtual bool supportsExtension(const String&);
101    virtual String getExtensions();
102
103    GC3Denum m_contextResetStatus;
104
105    bool m_supportsOESvertexArrayObject;
106    bool m_supportsIMGMultisampledRenderToTexture;
107    bool m_supportsANGLEinstancedArrays;
108
109    PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEIMGPROC m_glFramebufferTexture2DMultisampleIMG;
110    PFNGLRENDERBUFFERSTORAGEMULTISAMPLEIMGPROC m_glRenderbufferStorageMultisampleIMG;
111    PFNGLBINDVERTEXARRAYOESPROC m_glBindVertexArrayOES;
112    PFNGLDELETEVERTEXARRAYSOESPROC m_glDeleteVertexArraysOES;
113    PFNGLGENVERTEXARRAYSOESPROC m_glGenVertexArraysOES;
114    PFNGLISVERTEXARRAYOESPROC m_glIsVertexArrayOES;
115    PFNGLGETGRAPHICSRESETSTATUSEXTPROC m_glGetGraphicsResetStatusEXT;
116    PFNGLREADNPIXELSEXTPROC m_glReadnPixelsEXT;
117    PFNGLGETNUNIFORMFVEXTPROC m_glGetnUniformfvEXT;
118    PFNGLGETNUNIFORMIVEXTPROC m_glGetnUniformivEXT;
119    PFNGLVERTEXATTRIBDIVISORANGLEPROC m_glVertexAttribDivisorANGLE;
120    PFNGLDRAWARRAYSINSTANCEDANGLEPROC m_glDrawArraysInstancedANGLE;
121    PFNGLDRAWELEMENTSINSTANCEDANGLEPROC m_glDrawElementsInstancedANGLE;
122
123    std::unique_ptr<GraphicsContext3D::ContextLostCallback> m_contextLostCallback;
124};
125
126} // namespace WebCore
127
128#endif // Extensions3DOpenGLES_h
129