blob: 870ed02dd97268e514c2a44e7ee45a3a34afed8e [file] [log] [blame]
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001//
Geoff Langeeba6e12014-02-03 13:12:30 -05002// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003// 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
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +000010#ifndef LIBGLESV2_CONTEXT_H_
11#define LIBGLESV2_CONTEXT_H_
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000012
shannon.woods%transgaming.com@gtempaccount.comf26ddae2013-04-13 03:29:13 +000013#include <GLES3/gl3.h>
14#include <GLES3/gl3ext.h>
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000015#include <GLES2/gl2.h>
alokp@chromium.orgd303ef92010-09-09 17:30:15 +000016#include <GLES2/gl2ext.h>
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000017#include <EGL/egl.h>
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000018
daniel@transgaming.comdb2115d2012-08-27 16:25:33 +000019#include <string>
Geoff Langcdf22f92013-10-31 10:38:23 -040020#include <set>
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000021#include <map>
daniel@transgaming.comdb2115d2012-08-27 16:25:33 +000022#include <unordered_map>
Geoff Lang43b00422014-05-12 16:28:07 -040023#include <array>
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000024
alokp@chromium.orgea0e1af2010-03-22 19:33:14 +000025#include "common/angleutils.h"
apatrick@chromium.orgb66a7012012-01-23 20:04:48 +000026#include "common/RefCountObject.h"
Geoff Langcec35902014-04-16 10:52:36 -040027#include "libGLESv2/Caps.h"
benvanik@google.com1a233342011-04-28 19:44:39 +000028#include "libGLESv2/HandleAllocator.h"
daniel@transgaming.comd0db3502012-11-28 19:35:20 +000029#include "libGLESv2/angletypes.h"
shannon.woods@transgaming.com0d94d1f2013-02-28 23:15:32 +000030#include "libGLESv2/Constants.h"
Jamie Madill87939712013-07-02 11:57:01 -040031#include "libGLESv2/VertexAttribute.h"
shannon.woods@transgaming.comd2811d62013-02-28 23:11:19 +000032
33namespace rx
34{
35class Renderer;
36}
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000037
38namespace egl
39{
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000040class Surface;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000041}
42
43namespace gl
44{
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000045class Shader;
46class Program;
daniel@transgaming.com5ae3ccc2012-07-24 18:29:38 +000047class ProgramBinary;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000048class Texture;
49class Texture2D;
50class TextureCubeMap;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +000051class Texture3D;
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +000052class Texture2DArray;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000053class Framebuffer;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040054class Renderbuffer;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +000055class RenderbufferStorage;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000056class Colorbuffer;
57class Depthbuffer;
58class Stencilbuffer;
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +000059class DepthStencilbuffer;
Jamie Madill33dc8432013-07-26 11:55:05 -040060class FenceNV;
Jamie Madillcd055f82013-07-26 11:55:15 -040061class FenceSync;
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000062class Query;
shannon.woods@transgaming.comd2811d62013-02-28 23:11:19 +000063class ResourceManager;
64class Buffer;
Brandon Jones5bf98292014-06-06 17:19:38 -070065struct VertexAttribute;
Jamie Madill57a89722013-07-02 11:57:03 -040066class VertexArray;
Jamie Madilldc356042013-07-19 16:36:57 -040067class Sampler;
Geoff Langc8058452014-02-03 12:04:11 -050068class TransformFeedback;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000069
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000070// Helper structure to store all raw state
71struct State
72{
Geoff Lang2a64ee42013-05-31 11:22:40 -040073 ColorF colorClearValue;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000074 GLclampf depthClearValue;
75 int stencilClearValue;
76
daniel@transgaming.comf39967e2012-11-28 19:35:56 +000077 RasterizerState rasterizer;
daniel@transgaming.comd55e8c12012-11-28 21:07:02 +000078 bool scissorTest;
daniel@transgaming.comf39967e2012-11-28 19:35:56 +000079 Rectangle scissor;
80
81 BlendState blend;
Geoff Lang2a64ee42013-05-31 11:22:40 -040082 ColorF blendColor;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000083 bool sampleCoverage;
84 GLclampf sampleCoverageValue;
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +000085 bool sampleCoverageInvert;
daniel@transgaming.comf39967e2012-11-28 19:35:56 +000086
87 DepthStencilState depthStencil;
daniel@transgaming.com08c331d2012-11-28 19:38:39 +000088 GLint stencilRef;
89 GLint stencilBackRef;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000090
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +000091 GLfloat lineWidth;
92
daniel@transgaming.com5949aa12010-03-21 04:31:15 +000093 GLenum generateMipmapHint;
alokp@chromium.orgd303ef92010-09-09 17:30:15 +000094 GLenum fragmentShaderDerivativeHint;
daniel@transgaming.com5949aa12010-03-21 04:31:15 +000095
daniel@transgaming.com3884e2c2012-11-28 19:41:00 +000096 Rectangle viewport;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000097 float zNear;
98 float zFar;
99
daniel@transgaming.comdfd57022011-05-11 15:37:25 +0000100 unsigned int activeSampler; // Active texture unit selector - GL_TEXTURE0
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000101 BindingPointer<Buffer> arrayBuffer;
apatrick@chromium.orgff8bdfb2010-09-15 17:27:49 +0000102 GLuint readFramebuffer;
103 GLuint drawFramebuffer;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400104 BindingPointer<Renderbuffer> renderbuffer;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000105 GLuint currentProgram;
106
Jamie Madilla857c362013-07-02 11:57:02 -0400107 VertexAttribCurrentValueData vertexAttribCurrentValues[MAX_VERTEX_ATTRIBS]; // From glVertexAttrib
Jamie Madill57a89722013-07-02 11:57:03 -0400108 unsigned int vertexArray;
Jamie Madilla857c362013-07-02 11:57:02 -0400109
shannon.woods@transgaming.com233fe952013-01-25 21:51:57 +0000110 BindingPointer<Texture> samplerTexture[TEXTURE_TYPE_COUNT][IMPLEMENTATION_MAX_COMBINED_TEXTURE_IMAGE_UNITS];
Jamie Madilldc356042013-07-19 16:36:57 -0400111 GLuint samplers[IMPLEMENTATION_MAX_COMBINED_TEXTURE_IMAGE_UNITS];
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000112
Geoff Lang37dde692014-01-31 16:34:54 -0500113 typedef std::map< GLenum, BindingPointer<Query> > ActiveQueryMap;
114 ActiveQueryMap activeQueries;
115
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000116 BindingPointer<Buffer> genericUniformBuffer;
shannon.woods%transgaming.com@gtempaccount.com34089352013-04-13 03:36:57 +0000117 OffsetBindingPointer<Buffer> uniformBuffers[IMPLEMENTATION_MAX_COMBINED_SHADER_UNIFORM_BUFFERS];
118
Geoff Langc8058452014-02-03 12:04:11 -0500119 BindingPointer<TransformFeedback> transformFeedback;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000120 BindingPointer<Buffer> genericTransformFeedbackBuffer;
shannon.woods%transgaming.com@gtempaccount.com34089352013-04-13 03:36:57 +0000121 OffsetBindingPointer<Buffer> transformFeedbackBuffers[IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_BUFFERS];
122
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000123 BindingPointer<Buffer> copyReadBuffer;
124 BindingPointer<Buffer> copyWriteBuffer;
125
Jamie Madill950a7752013-09-18 14:36:18 -0400126 PixelUnpackState unpack;
127 PixelPackState pack;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000128};
129
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000130class Context
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000131{
132 public:
shannon.woods%transgaming.com@gtempaccount.comdaea4b42013-04-13 03:28:54 +0000133 Context(int clientVersion, const gl::Context *shareContext, rx::Renderer *renderer, bool notifyResets, bool robustAccess);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000134
Geoff Langa4de2652014-02-11 09:39:20 -0500135 virtual ~Context();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000136
daniel@transgaming.comad629872012-11-28 19:32:06 +0000137 void makeCurrent(egl::Surface *surface);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000138
daniel@transgaming.com09fcc9f2011-11-09 17:46:47 +0000139 virtual void markContextLost();
140 bool isContextLost();
141
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000142 // State manipulation
Geoff Lang0550d032014-01-30 11:29:07 -0500143 void setCap(GLenum cap, bool enabled);
144 bool getCap(GLenum cap);
145
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000146 void setClearColor(float red, float green, float blue, float alpha);
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000147
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000148 void setClearDepth(float depth);
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000149
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000150 void setClearStencil(int stencil);
151
Geoff Lang0550d032014-01-30 11:29:07 -0500152 void setRasterizerDiscard(bool enabled);
153 bool isRasterizerDiscardEnabled() const;
154
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000155 void setCullFace(bool enabled);
156 bool isCullFaceEnabled() const;
157
158 void setCullMode(GLenum mode);
159
160 void setFrontFace(GLenum front);
161
162 void setDepthTest(bool enabled);
163 bool isDepthTestEnabled() const;
164
165 void setDepthFunc(GLenum depthFunc);
166
167 void setDepthRange(float zNear, float zFar);
168
169 void setBlend(bool enabled);
170 bool isBlendEnabled() const;
171
172 void setBlendFactors(GLenum sourceRGB, GLenum destRGB, GLenum sourceAlpha, GLenum destAlpha);
173 void setBlendColor(float red, float green, float blue, float alpha);
174 void setBlendEquation(GLenum rgbEquation, GLenum alphaEquation);
175
176 void setStencilTest(bool enabled);
177 bool isStencilTestEnabled() const;
178
179 void setStencilParams(GLenum stencilFunc, GLint stencilRef, GLuint stencilMask);
180 void setStencilBackParams(GLenum stencilBackFunc, GLint stencilBackRef, GLuint stencilBackMask);
181 void setStencilWritemask(GLuint stencilWritemask);
182 void setStencilBackWritemask(GLuint stencilBackWritemask);
183 void setStencilOperations(GLenum stencilFail, GLenum stencilPassDepthFail, GLenum stencilPassDepthPass);
184 void setStencilBackOperations(GLenum stencilBackFail, GLenum stencilBackPassDepthFail, GLenum stencilBackPassDepthPass);
185
186 void setPolygonOffsetFill(bool enabled);
187 bool isPolygonOffsetFillEnabled() const;
188
189 void setPolygonOffsetParams(GLfloat factor, GLfloat units);
190
191 void setSampleAlphaToCoverage(bool enabled);
192 bool isSampleAlphaToCoverageEnabled() const;
193
194 void setSampleCoverage(bool enabled);
195 bool isSampleCoverageEnabled() const;
196
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +0000197 void setSampleCoverageParams(GLclampf value, bool invert);
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000198
199 void setScissorTest(bool enabled);
200 bool isScissorTestEnabled() const;
201
202 void setDither(bool enabled);
203 bool isDitherEnabled() const;
204
205 void setLineWidth(GLfloat width);
206
207 void setGenerateMipmapHint(GLenum hint);
alokp@chromium.orgd303ef92010-09-09 17:30:15 +0000208 void setFragmentShaderDerivativeHint(GLenum hint);
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000209
210 void setViewportParams(GLint x, GLint y, GLsizei width, GLsizei height);
211
212 void setScissorParams(GLint x, GLint y, GLsizei width, GLsizei height);
Geoff Langc8325162013-08-09 13:26:56 -0400213 void getScissorParams(GLint *x, GLint *y, GLsizei *width, GLsizei *height);
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000214
215 void setColorMask(bool red, bool green, bool blue, bool alpha);
216 void setDepthMask(bool mask);
217
daniel@transgaming.comdfd57022011-05-11 15:37:25 +0000218 void setActiveSampler(unsigned int active);
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000219
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000220 GLuint getReadFramebufferHandle() const;
221 GLuint getDrawFramebufferHandle() const;
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000222 GLuint getRenderbufferHandle() const;
Jamie Madilld8db8662013-07-02 11:57:04 -0400223 GLuint getVertexArrayHandle() const;
Jamie Madilldc356042013-07-19 16:36:57 -0400224 GLuint getSamplerHandle(GLuint textureUnit) const;
Jamie Madill893ab082014-05-16 16:56:10 -0400225 unsigned int getActiveSampler() const;
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000226
227 GLuint getArrayBufferHandle() const;
228
Jamie Madilldb2f14c2014-05-13 13:56:30 -0400229 bool isQueryActive() const;
Jamie Madill45c785d2014-05-13 14:09:34 -0400230 const Query *getActiveQuery(GLenum target) const;
231 GLuint getActiveQueryId(GLenum target) const;
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000232
daniel@transgaming.com83921382011-01-08 05:46:00 +0000233 void setEnableVertexAttribArray(unsigned int attribNum, bool enabled);
Jamie Madilla857c362013-07-02 11:57:02 -0400234 const VertexAttribute &getVertexAttribState(unsigned int attribNum) const;
235 const VertexAttribCurrentValueData &getVertexAttribCurrentValue(unsigned int attribNum) const;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000236 void setVertexAttribState(unsigned int attribNum, Buffer *boundBuffer, GLint size, GLenum type,
shannon.woods%transgaming.com@gtempaccount.com8de4e6a2013-04-13 03:37:44 +0000237 bool normalized, bool pureInteger, GLsizei stride, const void *pointer);
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000238 const void *getVertexAttribPointer(unsigned int attribNum) const;
239
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000240 void setUnpackAlignment(GLint alignment);
241 GLint getUnpackAlignment() const;
Jamie Madill88f18f42013-09-18 14:36:19 -0400242 const PixelUnpackState &getUnpackState() const;
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000243
244 void setPackAlignment(GLint alignment);
245 GLint getPackAlignment() const;
Jamie Madill88f18f42013-09-18 14:36:19 -0400246 const PixelPackState &getPackState() const;
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000247
bsalomon@google.com56d46ab2011-11-23 14:53:10 +0000248 void setPackReverseRowOrder(bool reverseRowOrder);
249 bool getPackReverseRowOrder() const;
250
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000251 // These create and destroy methods are merely pass-throughs to
252 // ResourceManager, which owns these object types
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000253 GLuint createBuffer();
254 GLuint createShader(GLenum type);
255 GLuint createProgram();
256 GLuint createTexture();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000257 GLuint createRenderbuffer();
Jamie Madilldc356042013-07-19 16:36:57 -0400258 GLuint createSampler();
Geoff Langc8058452014-02-03 12:04:11 -0500259 GLuint createTransformFeedback();
Jamie Madillcd055f82013-07-26 11:55:15 -0400260 GLsync createFenceSync(GLenum condition);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000261
262 void deleteBuffer(GLuint buffer);
263 void deleteShader(GLuint shader);
264 void deleteProgram(GLuint program);
265 void deleteTexture(GLuint texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000266 void deleteRenderbuffer(GLuint renderbuffer);
Jamie Madilldc356042013-07-19 16:36:57 -0400267 void deleteSampler(GLuint sampler);
Geoff Langc8058452014-02-03 12:04:11 -0500268 void deleteTransformFeedback(GLuint transformFeedback);
Jamie Madillcd055f82013-07-26 11:55:15 -0400269 void deleteFenceSync(GLsync fenceSync);
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000270
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000271 // Framebuffers are owned by the Context, so these methods do not pass through
272 GLuint createFramebuffer();
273 void deleteFramebuffer(GLuint framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000274
Jamie Madillcd055f82013-07-26 11:55:15 -0400275 // NV Fences are owned by the Context.
Jamie Madill33dc8432013-07-26 11:55:05 -0400276 GLuint createFenceNV();
277 void deleteFenceNV(GLuint fence);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000278
279 // Queries are owned by the Context;
280 GLuint createQuery();
281 void deleteQuery(GLuint query);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +0000282
Jamie Madillbe26b522013-07-26 11:54:50 -0400283 // Vertex arrays are owned by the Context
284 GLuint createVertexArray();
285 void deleteVertexArray(GLuint vertexArray);
286
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000287 void bindArrayBuffer(GLuint buffer);
288 void bindElementArrayBuffer(GLuint buffer);
289 void bindTexture2D(GLuint texture);
290 void bindTextureCubeMap(GLuint texture);
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +0000291 void bindTexture3D(GLuint texture);
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +0000292 void bindTexture2DArray(GLuint texture);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000293 void bindReadFramebuffer(GLuint framebuffer);
294 void bindDrawFramebuffer(GLuint framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000295 void bindRenderbuffer(GLuint renderbuffer);
Jamie Madill57a89722013-07-02 11:57:03 -0400296 void bindVertexArray(GLuint vertexArray);
Jamie Madilldc356042013-07-19 16:36:57 -0400297 void bindSampler(GLuint textureUnit, GLuint sampler);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000298 void bindGenericUniformBuffer(GLuint buffer);
299 void bindIndexedUniformBuffer(GLuint buffer, GLuint index, GLintptr offset, GLsizeiptr size);
300 void bindGenericTransformFeedbackBuffer(GLuint buffer);
301 void bindIndexedTransformFeedbackBuffer(GLuint buffer, GLuint index, GLintptr offset, GLsizeiptr size);
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000302 void bindCopyReadBuffer(GLuint buffer);
303 void bindCopyWriteBuffer(GLuint buffer);
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000304 void bindPixelPackBuffer(GLuint buffer);
305 void bindPixelUnpackBuffer(GLuint buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000306 void useProgram(GLuint program);
daniel@transgaming.com95d29422012-07-24 18:36:10 +0000307 void linkProgram(GLuint program);
308 void setProgramBinary(GLuint program, const void *binary, GLint length);
Geoff Langc8058452014-02-03 12:04:11 -0500309 void bindTransformFeedback(GLuint transformFeedback);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000310
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000311 void beginQuery(GLenum target, GLuint query);
312 void endQuery(GLenum target);
313
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000314 void setFramebufferZero(Framebuffer *framebuffer);
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000315
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000316 void setRenderbufferStorage(GLsizei width, GLsizei height, GLenum internalformat, GLsizei samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000317
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +0000318 void setVertexAttribf(GLuint index, const GLfloat values[4]);
319 void setVertexAttribu(GLuint index, const GLuint values[4]);
320 void setVertexAttribi(GLuint index, const GLint values[4]);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +0000321 void setVertexAttribDivisor(GLuint index, GLuint divisor);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +0000322
Jamie Madille29d1672013-07-19 16:36:57 -0400323 void samplerParameteri(GLuint sampler, GLenum pname, GLint param);
324 void samplerParameterf(GLuint sampler, GLenum pname, GLfloat param);
Jamie Madill9675b802013-07-19 16:36:59 -0400325 GLint getSamplerParameteri(GLuint sampler, GLenum pname);
326 GLfloat getSamplerParameterf(GLuint sampler, GLenum pname);
Jamie Madille29d1672013-07-19 16:36:57 -0400327
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000328 Buffer *getBuffer(GLuint handle);
Jamie Madill33dc8432013-07-26 11:55:05 -0400329 FenceNV *getFenceNV(GLuint handle);
Jamie Madillcd055f82013-07-26 11:55:15 -0400330 FenceSync *getFenceSync(GLsync handle) const;
Geoff Lang48dcae72014-02-05 16:28:24 -0500331 Shader *getShader(GLuint handle) const;
332 Program *getProgram(GLuint handle) const;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000333 Texture *getTexture(GLuint handle);
Jamie Madill1fc7e2c2014-01-21 16:47:10 -0500334 Framebuffer *getFramebuffer(GLuint handle) const;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400335 Renderbuffer *getRenderbuffer(GLuint handle);
Jamie Madill57a89722013-07-02 11:57:03 -0400336 VertexArray *getVertexArray(GLuint handle) const;
Jamie Madilldc356042013-07-19 16:36:57 -0400337 Sampler *getSampler(GLuint handle) const;
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000338 Query *getQuery(GLuint handle, bool create, GLenum type);
Geoff Langc8058452014-02-03 12:04:11 -0500339 TransformFeedback *getTransformFeedback(GLuint handle) const;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000340
Jamie Madill8c96d582014-03-05 15:01:23 -0500341 Buffer *getTargetBuffer(GLenum target) const;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000342 Buffer *getArrayBuffer();
Jamie Madill7a5f7382014-03-05 15:01:24 -0500343 Buffer *getElementArrayBuffer() const;
daniel@transgaming.com62a28462012-07-24 18:33:59 +0000344 ProgramBinary *getCurrentProgramBinary();
Jamie Madill1fc7e2c2014-01-21 16:47:10 -0500345
346 Texture *getTargetTexture(GLenum target) const;
347 Texture2D *getTexture2D() const;
348 TextureCubeMap *getTextureCubeMap() const;
349 Texture3D *getTexture3D() const;
350 Texture2DArray *getTexture2DArray() const;
351
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000352 Buffer *getGenericUniformBuffer();
353 Buffer *getGenericTransformFeedbackBuffer();
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000354 Buffer *getCopyReadBuffer();
355 Buffer *getCopyWriteBuffer();
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000356 Buffer *getPixelPackBuffer();
357 Buffer *getPixelUnpackBuffer();
Jamie Madill1fc7e2c2014-01-21 16:47:10 -0500358 Texture *getSamplerTexture(unsigned int sampler, TextureType type) const;
359
360 Framebuffer *getTargetFramebuffer(GLenum target) const;
361 GLuint getTargetFramebufferHandle(GLenum target) const;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000362 Framebuffer *getReadFramebuffer();
363 Framebuffer *getDrawFramebuffer();
Jamie Madill57a89722013-07-02 11:57:03 -0400364 VertexArray *getCurrentVertexArray() const;
Geoff Langc8058452014-02-03 12:04:11 -0500365 TransformFeedback *getCurrentTransformFeedback() const;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000366
Jamie Madilldc356042013-07-19 16:36:57 -0400367 bool isSampler(GLuint samplerName) const;
368
Jamie Madill893ab082014-05-16 16:56:10 -0400369 void getBooleanv(GLenum pname, GLboolean *params);
370 void getFloatv(GLenum pname, GLfloat *params);
371 void getIntegerv(GLenum pname, GLint *params);
372 void getInteger64v(GLenum pname, GLint64 *params);
daniel@transgaming.com777f2672010-04-07 03:25:16 +0000373
Shannon Woods1b2fb852013-08-19 14:28:48 -0400374 bool getIndexedIntegerv(GLenum target, GLuint index, GLint *data);
375 bool getIndexedInteger64v(GLenum target, GLuint index, GLint64 *data);
376
daniel@transgaming.com777f2672010-04-07 03:25:16 +0000377 bool getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams);
Shannon Woods1b2fb852013-08-19 14:28:48 -0400378 bool getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned int *numParams);
daniel@transgaming.com777f2672010-04-07 03:25:16 +0000379
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000380 void clear(GLbitfield mask);
Geoff Lang42359ca2013-08-21 13:25:17 -0400381 void clearBufferfv(GLenum buffer, int drawbuffer, const float *values);
382 void clearBufferuiv(GLenum buffer, int drawbuffer, const unsigned int *values);
383 void clearBufferiv(GLenum buffer, int drawbuffer, const int *values);
384 void clearBufferfi(GLenum buffer, int drawbuffer, float depth, int stencil);
385
386 void readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei *bufSize, void* pixels);
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +0000387 void drawArrays(GLenum mode, GLint first, GLsizei count, GLsizei instances);
388 void drawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instances);
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +0000389 void sync(bool block); // flush/finish
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000390
391 void recordInvalidEnum();
392 void recordInvalidValue();
393 void recordInvalidOperation();
394 void recordOutOfMemory();
395 void recordInvalidFramebufferOperation();
396
397 GLenum getError();
daniel@transgaming.com17f548c2011-11-09 17:47:02 +0000398 GLenum getResetStatus();
daniel@transgaming.com4ff960d2011-11-09 17:47:09 +0000399 virtual bool isResetNotificationEnabled();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000400
shannon.woods%transgaming.com@gtempaccount.comdaea4b42013-04-13 03:28:54 +0000401 virtual int getClientVersion() const;
402
Geoff Langcec35902014-04-16 10:52:36 -0400403 const Caps &getCaps() const;
404
daniel@transgaming.com9549bea2012-11-28 20:57:23 +0000405 int getMajorShaderModel() const;
daniel@transgaming.com13be3e42012-07-04 19:16:24 +0000406 float getMaximumPointSize() const;
daniel@transgaming.comdfd57022011-05-11 15:37:25 +0000407 unsigned int getMaximumCombinedTextureImageUnits() const;
shannon.woods%transgaming.com@gtempaccount.com34089352013-04-13 03:36:57 +0000408 unsigned int getMaximumCombinedUniformBufferBindings() const;
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000409 int getMaximumRenderbufferDimension() const;
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +0000410 int getMaximum2DTextureDimension() const;
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000411 int getMaximumCubeTextureDimension() const;
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +0000412 int getMaximum3DTextureDimension() const;
shannon.woods%transgaming.com@gtempaccount.coma98a8112013-04-13 03:45:57 +0000413 int getMaximum2DArrayTextureLayers() const;
Geoff Langce635692013-09-24 13:56:32 -0400414 int getMaximum2DTextureLevel() const;
415 int getMaximumCubeTextureLevel() const;
416 int getMaximum3DTextureLevel() const;
417 int getMaximum2DArrayTextureLevel() const;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +0000418 unsigned int getMaximumRenderTargets() const;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000419 GLsizei getMaxSupportedSamples() const;
Geoff Lang005df412013-10-16 14:12:50 -0400420 GLsizei getMaxSupportedFormatSamples(GLenum internalFormat) const;
421 GLsizei getNumSampleCounts(GLenum internalFormat) const;
422 void getSampleCounts(GLenum internalFormat, GLsizei bufSize, GLint *params) const;
shannon.woods%transgaming.com@gtempaccount.com34089352013-04-13 03:36:57 +0000423 unsigned int getMaxTransformFeedbackBufferBindings() const;
shannonwoods@chromium.org97c3d502013-05-30 00:04:34 +0000424 GLintptr getUniformBufferOffsetAlignment() const;
daniel@transgaming.comc23ff642011-08-16 20:28:45 +0000425 const char *getRendererString() const;
Geoff Langcec35902014-04-16 10:52:36 -0400426
427 const char *getExtensionString() const;
428 const char *getExtensionString(size_t idx) const;
429 size_t getExtensionStringCount() const;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +0000430
Jamie Madill893ab082014-05-16 16:56:10 -0400431 void getCurrentReadFormatType(GLenum *internalFormat, GLenum *format, GLenum *type);
daniel@transgaming.com42944b02012-09-27 17:45:57 +0000432
Geoff Lang758d5b22013-06-11 11:42:50 -0400433 void blitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
434 GLbitfield mask, GLenum filter);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +0000435
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +0000436 void invalidateFrameBuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments,
437 GLint x, GLint y, GLsizei width, GLsizei height);
438
Jamie Madill7a5f7382014-03-05 15:01:24 -0500439 bool hasMappedBuffer(GLenum target) const;
440
Jamie Madill2e559bb2013-10-22 15:31:29 -0400441 rx::Renderer *getRenderer() { return mRenderer; }
442
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000443 private:
444 DISALLOW_COPY_AND_ASSIGN(Context);
445
Geoff Lang43b00422014-05-12 16:28:07 -0400446 // TODO: std::array may become unavailable using older versions of GCC
447 typedef std::array<unsigned int, IMPLEMENTATION_MAX_FRAMEBUFFER_ATTACHMENTS> FramebufferTextureSerialArray;
448
daniel@transgaming.com12985182012-12-20 20:56:31 +0000449 bool applyRenderTarget(GLenum drawMode, bool ignoreViewport);
daniel@transgaming.comd4a35172011-05-11 15:36:45 +0000450 void applyState(GLenum drawMode);
Geoff Lang4c5c6bb2014-02-05 16:32:46 -0500451 void applyShaders(ProgramBinary *programBinary, bool transformFeedbackActive);
Geoff Lang43b00422014-05-12 16:28:07 -0400452 void applyTextures(SamplerType shaderType, Texture *textures[], TextureType *textureTypes, SamplerState *samplers,
453 size_t textureCount, const FramebufferTextureSerialArray& framebufferSerials,
454 size_t framebufferSerialCount);
shannonwoods@chromium.org1bddfb92013-05-30 00:11:29 +0000455 bool applyUniformBuffers();
Geoff Langeeba6e12014-02-03 13:12:30 -0500456 bool applyTransformFeedbackBuffers();
457 void markTransformFeedbackUsage();
daniel@transgaming.comd4a35172011-05-11 15:36:45 +0000458
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000459 void detachBuffer(GLuint buffer);
460 void detachTexture(GLuint texture);
461 void detachFramebuffer(GLuint framebuffer);
462 void detachRenderbuffer(GLuint renderbuffer);
Jamie Madill57a89722013-07-02 11:57:03 -0400463 void detachVertexArray(GLuint vertexArray);
Geoff Langc8058452014-02-03 12:04:11 -0500464 void detachTransformFeedback(GLuint transformFeedback);
Jamie Madilldc356042013-07-19 16:36:57 -0400465 void detachSampler(GLuint sampler);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000466
Geoff Lang43b00422014-05-12 16:28:07 -0400467 void generateSwizzles(Texture *textures[], size_t count);
468 size_t getCurrentTexturesAndSamplerStates(ProgramBinary *programBinary, SamplerType type, Texture **outTextures,
469 TextureType *outTextureTypes, SamplerState *outSamplers);
daniel@transgaming.com0e64dd62011-05-11 15:36:37 +0000470 Texture *getIncompleteTexture(TextureType type);
daniel@transgaming.com12d54072010-03-16 06:23:26 +0000471
daniel@transgaming.com087e5782012-09-17 21:28:47 +0000472 bool skipDraw(GLenum drawMode);
daniel@transgaming.comace5e662010-03-21 04:31:20 +0000473
daniel@transgaming.comc23ff642011-08-16 20:28:45 +0000474 void initRendererString();
Geoff Langcec35902014-04-16 10:52:36 -0400475 void initExtensionStrings();
daniel@transgaming.comc23ff642011-08-16 20:28:45 +0000476
Geoff Lang43b00422014-05-12 16:28:07 -0400477 size_t getBoundFramebufferTextureSerials(FramebufferTextureSerialArray *outSerialArray);
Geoff Langcdf22f92013-10-31 10:38:23 -0400478
daniel@transgaming.comdedd1a02012-11-28 20:57:11 +0000479 rx::Renderer *const mRenderer;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000480
shannon.woods%transgaming.com@gtempaccount.comdaea4b42013-04-13 03:28:54 +0000481 int mClientVersion;
482
daniel@transgaming.combaa74512011-04-13 14:56:47 +0000483 State mState;
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000484
apatrick@chromium.org4e3bad42010-09-15 17:31:48 +0000485 BindingPointer<Texture2D> mTexture2DZero;
486 BindingPointer<TextureCubeMap> mTextureCubeMapZero;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +0000487 BindingPointer<Texture3D> mTexture3DZero;
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +0000488 BindingPointer<Texture2DArray> mTexture2DArrayZero;
apatrick@chromium.orgff8bdfb2010-09-15 17:27:49 +0000489
Geoff Lang9b8f92e2013-07-30 15:23:30 -0400490 typedef std::unordered_map<GLuint, Framebuffer*> FramebufferMap;
apatrick@chromium.orgff8bdfb2010-09-15 17:27:49 +0000491 FramebufferMap mFramebufferMap;
benvanik@google.com1a233342011-04-28 19:44:39 +0000492 HandleAllocator mFramebufferHandleAllocator;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000493
Geoff Lang9b8f92e2013-07-30 15:23:30 -0400494 typedef std::unordered_map<GLuint, FenceNV*> FenceNVMap;
Jamie Madill33dc8432013-07-26 11:55:05 -0400495 FenceNVMap mFenceNVMap;
496 HandleAllocator mFenceNVHandleAllocator;
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +0000497
Geoff Lang9b8f92e2013-07-30 15:23:30 -0400498 typedef std::unordered_map<GLuint, Query*> QueryMap;
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000499 QueryMap mQueryMap;
500 HandleAllocator mQueryHandleAllocator;
501
Geoff Lang9b8f92e2013-07-30 15:23:30 -0400502 typedef std::unordered_map<GLuint, VertexArray*> VertexArrayMap;
Jamie Madill57a89722013-07-02 11:57:03 -0400503 VertexArrayMap mVertexArrayMap;
504 HandleAllocator mVertexArrayHandleAllocator;
505
Geoff Langc8058452014-02-03 12:04:11 -0500506 BindingPointer<TransformFeedback> mTransformFeedbackZero;
507 typedef std::unordered_map<GLuint, TransformFeedback*> TransformFeedbackMap;
508 TransformFeedbackMap mTransformFeedbackMap;
509 HandleAllocator mTransformFeedbackAllocator;
510
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +0000511 const char *mRendererString;
Geoff Langcec35902014-04-16 10:52:36 -0400512 const char *mExtensionString;
513 std::vector<const char *> mExtensionStrings;
514
daniel@transgaming.com0e64dd62011-05-11 15:36:37 +0000515 BindingPointer<Texture> mIncompleteTextures[TEXTURE_TYPE_COUNT];
daniel@transgaming.com12d54072010-03-16 06:23:26 +0000516
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000517 // Recorded errors
518 bool mInvalidEnum;
519 bool mInvalidValue;
520 bool mInvalidOperation;
521 bool mOutOfMemory;
522 bool mInvalidFramebufferOperation;
daniel@transgaming.com159acdf2010-03-21 04:31:24 +0000523
daniel@transgaming.com09fcc9f2011-11-09 17:46:47 +0000524 // Current/lost context flags
daniel@transgaming.com159acdf2010-03-21 04:31:24 +0000525 bool mHasBeenCurrent;
daniel@transgaming.com09fcc9f2011-11-09 17:46:47 +0000526 bool mContextLost;
daniel@transgaming.com17f548c2011-11-09 17:47:02 +0000527 GLenum mResetStatus;
daniel@transgaming.com4ff960d2011-11-09 17:47:09 +0000528 GLenum mResetStrategy;
529 bool mRobustAccess;
daniel@transgaming.com296ca9c2010-04-03 20:56:07 +0000530
daniel@transgaming.com989c1c82012-07-24 18:40:38 +0000531 BindingPointer<ProgramBinary> mCurrentProgramBinary;
jbauman@chromium.org040c4db2011-10-13 21:35:52 +0000532 Framebuffer *mBoundDrawFramebuffer;
daniel@transgaming.com4fa08332010-05-11 02:29:27 +0000533
daniel@transgaming.com9549bea2012-11-28 20:57:23 +0000534 int mMajorShaderModel;
daniel@transgaming.com13be3e42012-07-04 19:16:24 +0000535 float mMaximumPointSize;
daniel@transgaming.comaf29cac2011-05-11 15:36:31 +0000536 bool mSupportsVertexTexture;
shannon.woods@transgaming.com8ce2f8f2013-02-28 23:07:10 +0000537 int mMaxViewportDimension;
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000538 int mMaxRenderbufferDimension;
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +0000539 int mMax2DTextureDimension;
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000540 int mMaxCubeTextureDimension;
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +0000541 int mMax3DTextureDimension;
shannon.woods%transgaming.com@gtempaccount.coma98a8112013-04-13 03:45:57 +0000542 int mMax2DArrayTextureLayers;
Geoff Langce635692013-09-24 13:56:32 -0400543 int mMax2DTextureLevel;
544 int mMaxCubeTextureLevel;
545 int mMax3DTextureLevel;
546 int mMax2DArrayTextureLevel;
gman@chromium.org50c526d2011-08-10 05:19:44 +0000547 int mNumCompressedTextureFormats;
daniel@transgaming.coma79f9d12010-05-12 03:40:01 +0000548
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000549 ResourceManager *mResourceManager;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000550};
551}
552
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000553#endif // INCLUDE_CONTEXT_H_