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.
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.
10 #ifndef LIBGLESV2_CONTEXT_H_
11 #define LIBGLESV2_CONTEXT_H_
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"
28 #include <unordered_map>
53 class RenderbufferStorage;
57 class DepthStencilbuffer;
61 class ResourceManager;
63 struct VertexAttribute;
66 class TransformFeedback;
71 Context(int clientVersion, const gl::Context *shareContext, rx::Renderer *renderer, bool notifyResets, bool robustAccess);
75 void makeCurrent(egl::Surface *surface);
77 virtual void markContextLost();
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();
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);
100 // Framebuffers are owned by the Context, so these methods do not pass through
101 GLuint createFramebuffer();
102 void deleteFramebuffer(GLuint framebuffer);
104 // NV Fences are owned by the Context.
105 GLuint createFenceNV();
106 void deleteFenceNV(GLuint fence);
108 // Queries are owned by the Context;
109 GLuint createQuery();
110 void deleteQuery(GLuint query);
112 // Vertex arrays are owned by the Context
113 GLuint createVertexArray();
114 void deleteVertexArray(GLuint vertexArray);
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);
137 Error beginQuery(GLenum target, GLuint query);
138 Error endQuery(GLenum target);
140 void setFramebufferZero(Framebuffer *framebuffer);
142 void setRenderbufferStorage(GLsizei width, GLsizei height, GLenum internalformat, GLsizei samples);
144 void setVertexAttribDivisor(GLuint index, GLuint divisor);
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);
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;
164 Texture *getTargetTexture(GLenum target) const;
165 Texture2D *getTexture2D() const;
166 TextureCubeMap *getTextureCubeMap() const;
167 Texture3D *getTexture3D() const;
168 Texture2DArray *getTexture2DArray() const;
170 Texture *getSamplerTexture(unsigned int sampler, GLenum type) const;
172 bool isSampler(GLuint samplerName) const;
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);
179 bool getIndexedIntegerv(GLenum target, GLuint index, GLint *data);
180 bool getIndexedInteger64v(GLenum target, GLuint index, GLint64 *data);
182 bool getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams);
183 bool getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned int *numParams);
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);
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
198 void recordError(const Error &error);
201 GLenum getResetStatus();
202 virtual bool isResetNotificationEnabled();
204 virtual int getClientVersion() const;
206 const Caps &getCaps() const;
207 const TextureCapsMap &getTextureCaps() const;
208 const Extensions &getExtensions() const;
210 const std::string &getRendererString() const;
212 const std::string &getExtensionString() const;
213 const std::string &getExtensionString(size_t idx) const;
214 size_t getExtensionStringCount() const;
216 void getCurrentReadFormatType(GLenum *internalFormat, GLenum *format, GLenum *type);
218 Error blitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
219 GLbitfield mask, GLenum filter);
221 rx::Renderer *getRenderer() { return mRenderer; }
223 State &getState() { return mState; }
224 const State &getState() const { return mState; }
226 void releaseShaderCompiler();
229 DISALLOW_COPY_AND_ASSIGN(Context);
231 // TODO: std::array may become unavailable using older versions of GCC
232 typedef std::array<unsigned int, IMPLEMENTATION_MAX_FRAMEBUFFER_ATTACHMENTS> FramebufferTextureSerialArray;
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();
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);
252 Error generateSwizzles(ProgramBinary *programBinary, SamplerType type);
253 Error generateSwizzles(ProgramBinary *programBinary);
255 Texture *getIncompleteTexture(GLenum type);
257 bool skipDraw(GLenum drawMode);
259 void initRendererString();
260 void initExtensionStrings();
262 size_t getBoundFramebufferTextureSerials(FramebufferTextureSerialArray *outSerialArray);
264 void initCaps(GLuint clientVersion);
266 // Caps to use for validation
268 TextureCapsMap mTextureCaps;
269 Extensions mExtensions;
271 rx::Renderer *const mRenderer;
276 typedef std::map< GLenum, BindingPointer<Texture> > TextureMap;
277 TextureMap mZeroTextures;
278 TextureMap mIncompleteTextures;
280 typedef std::unordered_map<GLuint, Framebuffer*> FramebufferMap;
281 FramebufferMap mFramebufferMap;
282 HandleAllocator mFramebufferHandleAllocator;
284 typedef std::unordered_map<GLuint, FenceNV*> FenceNVMap;
285 FenceNVMap mFenceNVMap;
286 HandleAllocator mFenceNVHandleAllocator;
288 typedef std::unordered_map<GLuint, Query*> QueryMap;
290 HandleAllocator mQueryHandleAllocator;
292 typedef std::unordered_map<GLuint, VertexArray*> VertexArrayMap;
293 VertexArrayMap mVertexArrayMap;
294 HandleAllocator mVertexArrayHandleAllocator;
296 BindingPointer<TransformFeedback> mTransformFeedbackZero;
297 typedef std::unordered_map<GLuint, TransformFeedback*> TransformFeedbackMap;
298 TransformFeedbackMap mTransformFeedbackMap;
299 HandleAllocator mTransformFeedbackAllocator;
301 std::string mRendererString;
302 std::string mExtensionString;
303 std::vector<std::string> mExtensionStrings;
306 typedef std::set<GLenum> ErrorSet;
309 // Current/lost context flags
310 bool mHasBeenCurrent;
313 GLenum mResetStrategy;
316 ResourceManager *mResourceManager;
320 #endif // INCLUDE_CONTEXT_H_