Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / third_party / angle / src / libGLESv2 / Context.h
1 //
2 // Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6
7 // Context.h: Defines the gl::Context class, managing all GL state and performing
8 // rendering operations. It is the GLES2 specific implementation of EGLContext.
9
10 #ifndef LIBGLESV2_CONTEXT_H_
11 #define LIBGLESV2_CONTEXT_H_
12
13 #include "common/angleutils.h"
14 #include "common/RefCountObject.h"
15 #include "libGLESv2/Caps.h"
16 #include "libGLESv2/Error.h"
17 #include "libGLESv2/HandleAllocator.h"
18 #include "libGLESv2/angletypes.h"
19 #include "libGLESv2/Constants.h"
20 #include "libGLESv2/VertexAttribute.h"
21 #include "libGLESv2/State.h"
22
23 #include "angle_gl.h"
24
25 #include <string>
26 #include <set>
27 #include <map>
28 #include <unordered_map>
29 #include <array>
30
31 namespace rx
32 {
33 class Renderer;
34 }
35
36 namespace egl
37 {
38 class Surface;
39 }
40
41 namespace gl
42 {
43 class Shader;
44 class Program;
45 class ProgramBinary;
46 class Texture;
47 class Texture2D;
48 class TextureCubeMap;
49 class Texture3D;
50 class Texture2DArray;
51 class Framebuffer;
52 class Renderbuffer;
53 class RenderbufferStorage;
54 class Colorbuffer;
55 class Depthbuffer;
56 class Stencilbuffer;
57 class DepthStencilbuffer;
58 class FenceNV;
59 class FenceSync;
60 class Query;
61 class ResourceManager;
62 class Buffer;
63 struct VertexAttribute;
64 class VertexArray;
65 class Sampler;
66 class TransformFeedback;
67
68 class Context
69 {
70   public:
71     Context(int clientVersion, const gl::Context *shareContext, rx::Renderer *renderer, bool notifyResets, bool robustAccess);
72
73     virtual ~Context();
74
75     void makeCurrent(egl::Surface *surface);
76
77     virtual void markContextLost();
78     bool isContextLost();
79
80     // These create  and destroy methods are merely pass-throughs to 
81     // ResourceManager, which owns these object types
82     GLuint createBuffer();
83     GLuint createShader(GLenum type);
84     GLuint createProgram();
85     GLuint createTexture();
86     GLuint createRenderbuffer();
87     GLuint createSampler();
88     GLuint createTransformFeedback();
89     GLsync createFenceSync();
90
91     void deleteBuffer(GLuint buffer);
92     void deleteShader(GLuint shader);
93     void deleteProgram(GLuint program);
94     void deleteTexture(GLuint texture);
95     void deleteRenderbuffer(GLuint renderbuffer);
96     void deleteSampler(GLuint sampler);
97     void deleteTransformFeedback(GLuint transformFeedback);
98     void deleteFenceSync(GLsync fenceSync);
99
100     // Framebuffers are owned by the Context, so these methods do not pass through
101     GLuint createFramebuffer();
102     void deleteFramebuffer(GLuint framebuffer);
103
104     // NV Fences are owned by the Context.
105     GLuint createFenceNV();
106     void deleteFenceNV(GLuint fence);
107     
108     // Queries are owned by the Context;
109     GLuint createQuery();
110     void deleteQuery(GLuint query);
111
112     // Vertex arrays are owned by the Context
113     GLuint createVertexArray();
114     void deleteVertexArray(GLuint vertexArray);
115
116     void bindArrayBuffer(GLuint buffer);
117     void bindElementArrayBuffer(GLuint buffer);
118     void bindTexture(GLenum target, GLuint texture);
119     void bindReadFramebuffer(GLuint framebuffer);
120     void bindDrawFramebuffer(GLuint framebuffer);
121     void bindRenderbuffer(GLuint renderbuffer);
122     void bindVertexArray(GLuint vertexArray);
123     void bindSampler(GLuint textureUnit, GLuint sampler);
124     void bindGenericUniformBuffer(GLuint buffer);
125     void bindIndexedUniformBuffer(GLuint buffer, GLuint index, GLintptr offset, GLsizeiptr size);
126     void bindGenericTransformFeedbackBuffer(GLuint buffer);
127     void bindIndexedTransformFeedbackBuffer(GLuint buffer, GLuint index, GLintptr offset, GLsizeiptr size);
128     void bindCopyReadBuffer(GLuint buffer);
129     void bindCopyWriteBuffer(GLuint buffer);
130     void bindPixelPackBuffer(GLuint buffer);
131     void bindPixelUnpackBuffer(GLuint buffer);
132     void useProgram(GLuint program);
133     Error linkProgram(GLuint program);
134     Error setProgramBinary(GLuint program, GLenum binaryFormat, const void *binary, GLint length);
135     void bindTransformFeedback(GLuint transformFeedback);
136
137     Error beginQuery(GLenum target, GLuint query);
138     Error endQuery(GLenum target);
139
140     void setFramebufferZero(Framebuffer *framebuffer);
141
142     void setRenderbufferStorage(GLsizei width, GLsizei height, GLenum internalformat, GLsizei samples);
143
144     void setVertexAttribDivisor(GLuint index, GLuint divisor);
145
146     void samplerParameteri(GLuint sampler, GLenum pname, GLint param);
147     void samplerParameterf(GLuint sampler, GLenum pname, GLfloat param);
148     GLint getSamplerParameteri(GLuint sampler, GLenum pname);
149     GLfloat getSamplerParameterf(GLuint sampler, GLenum pname);
150
151     Buffer *getBuffer(GLuint handle);
152     FenceNV *getFenceNV(GLuint handle);
153     FenceSync *getFenceSync(GLsync handle) const;
154     Shader *getShader(GLuint handle) const;
155     Program *getProgram(GLuint handle) const;
156     Texture *getTexture(GLuint handle) const;
157     Framebuffer *getFramebuffer(GLuint handle) const;
158     Renderbuffer *getRenderbuffer(GLuint handle);
159     VertexArray *getVertexArray(GLuint handle) const;
160     Sampler *getSampler(GLuint handle) const;
161     Query *getQuery(GLuint handle, bool create, GLenum type);
162     TransformFeedback *getTransformFeedback(GLuint handle) const;
163
164     Texture *getTargetTexture(GLenum target) const;
165     Texture2D *getTexture2D() const;
166     TextureCubeMap *getTextureCubeMap() const;
167     Texture3D *getTexture3D() const;
168     Texture2DArray *getTexture2DArray() const;
169
170     Texture *getSamplerTexture(unsigned int sampler, GLenum type) const;
171
172     bool isSampler(GLuint samplerName) const;
173
174     void getBooleanv(GLenum pname, GLboolean *params);
175     void getFloatv(GLenum pname, GLfloat *params);
176     void getIntegerv(GLenum pname, GLint *params);
177     void getInteger64v(GLenum pname, GLint64 *params);
178
179     bool getIndexedIntegerv(GLenum target, GLuint index, GLint *data);
180     bool getIndexedInteger64v(GLenum target, GLuint index, GLint64 *data);
181
182     bool getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams);
183     bool getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned int *numParams);
184
185     Error clear(GLbitfield mask);
186     Error clearBufferfv(GLenum buffer, int drawbuffer, const float *values);
187     Error clearBufferuiv(GLenum buffer, int drawbuffer, const unsigned int *values);
188     Error clearBufferiv(GLenum buffer, int drawbuffer, const int *values);
189     Error clearBufferfi(GLenum buffer, int drawbuffer, float depth, int stencil);
190
191     Error readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei *bufSize, void* pixels);
192     Error drawArrays(GLenum mode, GLint first, GLsizei count, GLsizei instances);
193     Error drawElements(GLenum mode, GLsizei count, GLenum type,
194                        const GLvoid *indices, GLsizei instances,
195                        const rx::RangeUI &indexRange);
196     Error sync(bool block);   // flush/finish
197
198     void recordError(const Error &error);
199
200     GLenum getError();
201     GLenum getResetStatus();
202     virtual bool isResetNotificationEnabled();
203
204     virtual int getClientVersion() const;
205
206     const Caps &getCaps() const;
207     const TextureCapsMap &getTextureCaps() const;
208     const Extensions &getExtensions() const;
209
210     const std::string &getRendererString() const;
211
212     const std::string &getExtensionString() const;
213     const std::string &getExtensionString(size_t idx) const;
214     size_t getExtensionStringCount() const;
215
216     void getCurrentReadFormatType(GLenum *internalFormat, GLenum *format, GLenum *type);
217
218     Error blitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
219                           GLbitfield mask, GLenum filter);
220
221     rx::Renderer *getRenderer() { return mRenderer; }
222
223     State &getState() { return mState; }
224     const State &getState() const { return mState; }
225
226     void releaseShaderCompiler();
227
228   private:
229     DISALLOW_COPY_AND_ASSIGN(Context);
230
231     // TODO: std::array may become unavailable using older versions of GCC
232     typedef std::array<unsigned int, IMPLEMENTATION_MAX_FRAMEBUFFER_ATTACHMENTS> FramebufferTextureSerialArray;
233
234     Error applyRenderTarget(GLenum drawMode, bool ignoreViewport);
235     Error applyState(GLenum drawMode);
236     Error applyShaders(ProgramBinary *programBinary, bool transformFeedbackActive);
237     Error applyTextures(ProgramBinary *programBinary, SamplerType shaderType, const FramebufferTextureSerialArray &framebufferSerials,
238                         size_t framebufferSerialCount);
239     Error applyTextures(ProgramBinary *programBinary);
240     Error applyUniformBuffers();
241     bool applyTransformFeedbackBuffers();
242     void markTransformFeedbackUsage();
243
244     void detachBuffer(GLuint buffer);
245     void detachTexture(GLuint texture);
246     void detachFramebuffer(GLuint framebuffer);
247     void detachRenderbuffer(GLuint renderbuffer);
248     void detachVertexArray(GLuint vertexArray);
249     void detachTransformFeedback(GLuint transformFeedback);
250     void detachSampler(GLuint sampler);
251
252     Error generateSwizzles(ProgramBinary *programBinary, SamplerType type);
253     Error generateSwizzles(ProgramBinary *programBinary);
254
255     Texture *getIncompleteTexture(GLenum type);
256
257     bool skipDraw(GLenum drawMode);
258
259     void initRendererString();
260     void initExtensionStrings();
261
262     size_t getBoundFramebufferTextureSerials(FramebufferTextureSerialArray *outSerialArray);
263
264     void initCaps(GLuint clientVersion);
265
266     // Caps to use for validation
267     Caps mCaps;
268     TextureCapsMap mTextureCaps;
269     Extensions mExtensions;
270
271     rx::Renderer *const mRenderer;
272     State mState;
273
274     int mClientVersion;
275
276     typedef std::map< GLenum, BindingPointer<Texture> > TextureMap;
277     TextureMap mZeroTextures;
278     TextureMap mIncompleteTextures;
279
280     typedef std::unordered_map<GLuint, Framebuffer*> FramebufferMap;
281     FramebufferMap mFramebufferMap;
282     HandleAllocator mFramebufferHandleAllocator;
283
284     typedef std::unordered_map<GLuint, FenceNV*> FenceNVMap;
285     FenceNVMap mFenceNVMap;
286     HandleAllocator mFenceNVHandleAllocator;
287
288     typedef std::unordered_map<GLuint, Query*> QueryMap;
289     QueryMap mQueryMap;
290     HandleAllocator mQueryHandleAllocator;
291
292     typedef std::unordered_map<GLuint, VertexArray*> VertexArrayMap;
293     VertexArrayMap mVertexArrayMap;
294     HandleAllocator mVertexArrayHandleAllocator;
295
296     BindingPointer<TransformFeedback> mTransformFeedbackZero;
297     typedef std::unordered_map<GLuint, TransformFeedback*> TransformFeedbackMap;
298     TransformFeedbackMap mTransformFeedbackMap;
299     HandleAllocator mTransformFeedbackAllocator;
300
301     std::string mRendererString;
302     std::string mExtensionString;
303     std::vector<std::string> mExtensionStrings;
304
305     // Recorded errors
306     typedef std::set<GLenum> ErrorSet;
307     ErrorSet mErrors;
308
309     // Current/lost context flags
310     bool mHasBeenCurrent;
311     bool mContextLost;
312     GLenum mResetStatus;
313     GLenum mResetStrategy;
314     bool mRobustAccess;
315
316     ResourceManager *mResourceManager;
317 };
318 }
319
320 #endif   // INCLUDE_CONTEXT_H_