blob: c783f6c53da400b5fe5813ff664371afd2e344ea [file] [log] [blame]
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001//
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002// Copyright (c) 2002-2012 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
13#define GL_APICALL
14#include <GLES2/gl2.h>
alokp@chromium.orgd303ef92010-09-09 17:30:15 +000015#include <GLES2/gl2ext.h>
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000016#define EGLAPI
17#include <EGL/egl.h>
18#include <d3d9.h>
19
20#include <map>
benvanik@google.coma9d0b762011-04-28 20:11:54 +000021#include <hash_map>
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000022
alokp@chromium.orgea0e1af2010-03-22 19:33:14 +000023#include "common/angleutils.h"
apatrick@chromium.orgb66a7012012-01-23 20:04:48 +000024#include "common/RefCountObject.h"
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +000025#include "libGLESv2/ResourceManager.h"
benvanik@google.com1a233342011-04-28 19:44:39 +000026#include "libGLESv2/HandleAllocator.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000027
28namespace egl
29{
30class Display;
31class Surface;
32class Config;
33}
34
35namespace gl
36{
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +000037struct TranslatedAttribute;
daniel@transgaming.comf8b58a02010-03-26 04:08:45 +000038struct TranslatedIndexData;
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +000039
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000040class Buffer;
41class Shader;
42class Program;
43class Texture;
44class Texture2D;
45class TextureCubeMap;
46class Framebuffer;
47class Renderbuffer;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +000048class RenderbufferStorage;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000049class Colorbuffer;
50class Depthbuffer;
jbauman@chromium.org399c35f2011-04-28 23:19:51 +000051class StreamingIndexBuffer;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000052class Stencilbuffer;
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +000053class DepthStencilbuffer;
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +000054class VertexDataManager;
daniel@transgaming.comf8b58a02010-03-26 04:08:45 +000055class IndexDataManager;
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +000056class Blit;
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000057class Fence;
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000058class Query;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000059
60enum
61{
jbauman@chromium.orge0f059c2012-01-24 23:21:52 +000062 D3D9_MAX_FLOAT_CONSTANTS = 256,
63 D3D9_MAX_BOOL_CONSTANTS = 16,
64 D3D9_MAX_INT_CONSTANTS = 16,
65
daniel@transgaming.com83921382011-01-08 05:46:00 +000066 MAX_VERTEX_ATTRIBS = 16,
jbauman@chromium.orge0f059c2012-01-24 23:21:52 +000067 MAX_VERTEX_UNIFORM_VECTORS = D3D9_MAX_FLOAT_CONSTANTS - 2, // Reserve space for dx_HalfPixelSize and dx_DepthRange.
daniel@transgaming.com396c6432010-11-26 16:26:12 +000068 MAX_VARYING_VECTORS_SM2 = 8,
69 MAX_VARYING_VECTORS_SM3 = 10,
daniel@transgaming.com1c233ff2010-06-08 14:13:00 +000070 MAX_TEXTURE_IMAGE_UNITS = 16,
daniel@transgaming.comaf29cac2011-05-11 15:36:31 +000071 MAX_VERTEX_TEXTURE_IMAGE_UNITS_VTF = 4, // For devices supporting vertex texture fetch
72 MAX_COMBINED_TEXTURE_IMAGE_UNITS_VTF = MAX_TEXTURE_IMAGE_UNITS + MAX_VERTEX_TEXTURE_IMAGE_UNITS_VTF,
daniel@transgaming.comd9a54f92011-12-22 18:32:53 +000073 MAX_FRAGMENT_UNIFORM_VECTORS_SM2 = 32 - 3, // Reserve space for dx_Coord, dx_Depth, and dx_DepthRange. dx_PointOrLines and dx_FrontCCW use separate bool registers.
daniel@transgaming.com458da142010-11-28 02:03:02 +000074 MAX_FRAGMENT_UNIFORM_VECTORS_SM3 = 224 - 3,
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000075 MAX_DRAW_BUFFERS = 1,
76
77 IMPLEMENTATION_COLOR_READ_FORMAT = GL_RGB,
78 IMPLEMENTATION_COLOR_READ_TYPE = GL_UNSIGNED_SHORT_5_6_5
79};
80
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000081enum QueryType
82{
83 QUERY_ANY_SAMPLES_PASSED,
84 QUERY_ANY_SAMPLES_PASSED_CONSERVATIVE,
85
86 QUERY_TYPE_COUNT
87};
88
daniel@transgaming.comd989add2010-03-26 04:08:42 +000089const float ALIASED_LINE_WIDTH_RANGE_MIN = 1.0f;
90const float ALIASED_LINE_WIDTH_RANGE_MAX = 1.0f;
daniel@transgaming.comccad59f2010-03-26 04:08:39 +000091const float ALIASED_POINT_SIZE_RANGE_MIN = 1.0f;
daniel@transgaming.combe5a0862010-07-28 19:20:37 +000092const float ALIASED_POINT_SIZE_RANGE_MAX_SM2 = 1.0f;
93const float ALIASED_POINT_SIZE_RANGE_MAX_SM3 = 64.0f;
daniel@transgaming.comccad59f2010-03-26 04:08:39 +000094
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000095struct Color
96{
97 float red;
98 float green;
99 float blue;
100 float alpha;
101};
102
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000103// Helper structure describing a single vertex attribute
daniel@transgaming.com83921382011-01-08 05:46:00 +0000104class VertexAttribute
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000105{
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000106 public:
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +0000107 VertexAttribute() : mType(GL_FLOAT), mSize(0), mNormalized(false), mStride(0), mPointer(NULL), mArrayEnabled(false), mDivisor(0)
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000108 {
daniel@transgaming.com83921382011-01-08 05:46:00 +0000109 mCurrentValue[0] = 0.0f;
110 mCurrentValue[1] = 0.0f;
111 mCurrentValue[2] = 0.0f;
112 mCurrentValue[3] = 1.0f;
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000113 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000114
daniel@transgaming.com83921382011-01-08 05:46:00 +0000115 int typeSize() const
116 {
117 switch (mType)
118 {
119 case GL_BYTE: return mSize * sizeof(GLbyte);
120 case GL_UNSIGNED_BYTE: return mSize * sizeof(GLubyte);
121 case GL_SHORT: return mSize * sizeof(GLshort);
122 case GL_UNSIGNED_SHORT: return mSize * sizeof(GLushort);
123 case GL_FIXED: return mSize * sizeof(GLfixed);
124 case GL_FLOAT: return mSize * sizeof(GLfloat);
125 default: UNREACHABLE(); return mSize * sizeof(GLfloat);
126 }
127 }
128
129 GLsizei stride() const
130 {
131 return mStride ? mStride : typeSize();
132 }
133
134 // From glVertexAttribPointer
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000135 GLenum mType;
136 GLint mSize;
137 bool mNormalized;
daniel@transgaming.com83921382011-01-08 05:46:00 +0000138 GLsizei mStride; // 0 means natural stride
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000139
daniel@transgaming.com83921382011-01-08 05:46:00 +0000140 union
141 {
142 const void *mPointer;
143 intptr_t mOffset;
144 };
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000145
daniel@transgaming.com83921382011-01-08 05:46:00 +0000146 BindingPointer<Buffer> mBoundBuffer; // Captured when glVertexAttribPointer is called.
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000147
daniel@transgaming.com83921382011-01-08 05:46:00 +0000148 bool mArrayEnabled; // From glEnable/DisableVertexAttribArray
149 float mCurrentValue[4]; // From glVertexAttrib
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +0000150 unsigned int mDivisor;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000151};
152
daniel@transgaming.com83921382011-01-08 05:46:00 +0000153typedef VertexAttribute VertexAttributeArray[MAX_VERTEX_ATTRIBS];
154
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000155// Helper structure to store all raw state
156struct State
157{
158 Color colorClearValue;
159 GLclampf depthClearValue;
160 int stencilClearValue;
161
162 bool cullFace;
163 GLenum cullMode;
164 GLenum frontFace;
165 bool depthTest;
166 GLenum depthFunc;
167 bool blend;
168 GLenum sourceBlendRGB;
169 GLenum destBlendRGB;
170 GLenum sourceBlendAlpha;
171 GLenum destBlendAlpha;
172 GLenum blendEquationRGB;
173 GLenum blendEquationAlpha;
174 Color blendColor;
175 bool stencilTest;
176 GLenum stencilFunc;
177 GLint stencilRef;
178 GLuint stencilMask;
179 GLenum stencilFail;
180 GLenum stencilPassDepthFail;
181 GLenum stencilPassDepthPass;
182 GLuint stencilWritemask;
183 GLenum stencilBackFunc;
184 GLint stencilBackRef;
185 GLuint stencilBackMask;
186 GLenum stencilBackFail;
187 GLenum stencilBackPassDepthFail;
188 GLenum stencilBackPassDepthPass;
189 GLuint stencilBackWritemask;
190 bool polygonOffsetFill;
daniel@transgaming.com777f2672010-04-07 03:25:16 +0000191 GLfloat polygonOffsetFactor;
192 GLfloat polygonOffsetUnits;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000193 bool sampleAlphaToCoverage;
194 bool sampleCoverage;
195 GLclampf sampleCoverageValue;
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +0000196 bool sampleCoverageInvert;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000197 bool scissorTest;
198 bool dither;
199
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +0000200 GLfloat lineWidth;
201
daniel@transgaming.com5949aa12010-03-21 04:31:15 +0000202 GLenum generateMipmapHint;
alokp@chromium.orgd303ef92010-09-09 17:30:15 +0000203 GLenum fragmentShaderDerivativeHint;
daniel@transgaming.com5949aa12010-03-21 04:31:15 +0000204
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000205 GLint viewportX;
206 GLint viewportY;
207 GLsizei viewportWidth;
208 GLsizei viewportHeight;
209 float zNear;
210 float zFar;
211
212 GLint scissorX;
213 GLint scissorY;
214 GLsizei scissorWidth;
215 GLsizei scissorHeight;
216
217 bool colorMaskRed;
218 bool colorMaskGreen;
219 bool colorMaskBlue;
220 bool colorMaskAlpha;
221 bool depthMask;
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000222
daniel@transgaming.comdfd57022011-05-11 15:37:25 +0000223 unsigned int activeSampler; // Active texture unit selector - GL_TEXTURE0
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000224 BindingPointer<Buffer> arrayBuffer;
225 BindingPointer<Buffer> elementArrayBuffer;
apatrick@chromium.orgff8bdfb2010-09-15 17:27:49 +0000226 GLuint readFramebuffer;
227 GLuint drawFramebuffer;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000228 BindingPointer<Renderbuffer> renderbuffer;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000229 GLuint currentProgram;
230
daniel@transgaming.com83921382011-01-08 05:46:00 +0000231 VertexAttribute vertexAttribute[MAX_VERTEX_ATTRIBS];
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +0000232 BindingPointer<Texture> samplerTexture[TEXTURE_TYPE_COUNT][MAX_COMBINED_TEXTURE_IMAGE_UNITS_VTF];
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000233 BindingPointer<Query> activeQuery[QUERY_TYPE_COUNT];
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000234
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +0000235 GLint unpackAlignment;
236 GLint packAlignment;
bsalomon@google.com56d46ab2011-11-23 14:53:10 +0000237 bool packReverseRowOrder;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000238};
239
daniel@transgaming.com09c2c1a2011-04-13 14:57:16 +0000240// Helper class to construct and cache vertex declarations
241class VertexDeclarationCache
242{
243 public:
244 VertexDeclarationCache();
245 ~VertexDeclarationCache();
246
daniel@transgaming.comd6449312012-01-27 15:39:32 +0000247 GLenum applyDeclaration(IDirect3DDevice9 *device, TranslatedAttribute attributes[], Program *program, GLsizei instances, GLsizei *repeatDraw);
daniel@transgaming.com09c2c1a2011-04-13 14:57:16 +0000248
jbauman@chromium.orgd8f3faa2011-09-02 01:10:47 +0000249 void markStateDirty();
250
daniel@transgaming.com09c2c1a2011-04-13 14:57:16 +0000251 private:
252 UINT mMaxLru;
253
jbauman@chromium.org88d91fb2012-04-04 22:54:37 +0000254 enum { NUM_VERTEX_DECL_CACHE_ENTRIES = 32 };
daniel@transgaming.com09c2c1a2011-04-13 14:57:16 +0000255
jbauman@chromium.orgd8f3faa2011-09-02 01:10:47 +0000256 struct VBData
257 {
258 unsigned int serial;
259 unsigned int stride;
260 unsigned int offset;
261 };
262
263 VBData mAppliedVBs[MAX_VERTEX_ATTRIBS];
264 IDirect3DVertexDeclaration9 *mLastSetVDecl;
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +0000265 bool mInstancingEnabled;
jbauman@chromium.orgd8f3faa2011-09-02 01:10:47 +0000266
daniel@transgaming.com09c2c1a2011-04-13 14:57:16 +0000267 struct VertexDeclCacheEntry
268 {
269 D3DVERTEXELEMENT9 cachedElements[MAX_VERTEX_ATTRIBS + 1];
270 UINT lruCount;
271 IDirect3DVertexDeclaration9 *vertexDeclaration;
272 } mVertexDeclCache[NUM_VERTEX_DECL_CACHE_ENTRIES];
273};
274
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000275class Context
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000276{
277 public:
daniel@transgaming.com4ff960d2011-11-09 17:47:09 +0000278 Context(const egl::Config *config, const gl::Context *shareContext, bool notifyResets, bool robustAccess);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000279
280 ~Context();
281
282 void makeCurrent(egl::Display *display, egl::Surface *surface);
283
daniel@transgaming.com4fa08332010-05-11 02:29:27 +0000284 void markAllStateDirty();
daniel@transgaming.com11399d52012-04-28 00:35:14 +0000285 void markDxUniformsDirty();
daniel@transgaming.com4fa08332010-05-11 02:29:27 +0000286
daniel@transgaming.com09fcc9f2011-11-09 17:46:47 +0000287 virtual void markContextLost();
288 bool isContextLost();
289
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000290 // State manipulation
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000291 void setClearColor(float red, float green, float blue, float alpha);
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000292
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000293 void setClearDepth(float depth);
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000294
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000295 void setClearStencil(int stencil);
296
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000297 void setCullFace(bool enabled);
298 bool isCullFaceEnabled() const;
299
300 void setCullMode(GLenum mode);
301
302 void setFrontFace(GLenum front);
303
304 void setDepthTest(bool enabled);
305 bool isDepthTestEnabled() const;
306
307 void setDepthFunc(GLenum depthFunc);
308
309 void setDepthRange(float zNear, float zFar);
310
311 void setBlend(bool enabled);
312 bool isBlendEnabled() const;
313
314 void setBlendFactors(GLenum sourceRGB, GLenum destRGB, GLenum sourceAlpha, GLenum destAlpha);
315 void setBlendColor(float red, float green, float blue, float alpha);
316 void setBlendEquation(GLenum rgbEquation, GLenum alphaEquation);
317
318 void setStencilTest(bool enabled);
319 bool isStencilTestEnabled() const;
320
321 void setStencilParams(GLenum stencilFunc, GLint stencilRef, GLuint stencilMask);
322 void setStencilBackParams(GLenum stencilBackFunc, GLint stencilBackRef, GLuint stencilBackMask);
323 void setStencilWritemask(GLuint stencilWritemask);
324 void setStencilBackWritemask(GLuint stencilBackWritemask);
325 void setStencilOperations(GLenum stencilFail, GLenum stencilPassDepthFail, GLenum stencilPassDepthPass);
326 void setStencilBackOperations(GLenum stencilBackFail, GLenum stencilBackPassDepthFail, GLenum stencilBackPassDepthPass);
327
328 void setPolygonOffsetFill(bool enabled);
329 bool isPolygonOffsetFillEnabled() const;
330
331 void setPolygonOffsetParams(GLfloat factor, GLfloat units);
332
333 void setSampleAlphaToCoverage(bool enabled);
334 bool isSampleAlphaToCoverageEnabled() const;
335
336 void setSampleCoverage(bool enabled);
337 bool isSampleCoverageEnabled() const;
338
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +0000339 void setSampleCoverageParams(GLclampf value, bool invert);
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000340
341 void setScissorTest(bool enabled);
342 bool isScissorTestEnabled() const;
343
344 void setDither(bool enabled);
345 bool isDitherEnabled() const;
346
347 void setLineWidth(GLfloat width);
348
349 void setGenerateMipmapHint(GLenum hint);
alokp@chromium.orgd303ef92010-09-09 17:30:15 +0000350 void setFragmentShaderDerivativeHint(GLenum hint);
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000351
352 void setViewportParams(GLint x, GLint y, GLsizei width, GLsizei height);
353
354 void setScissorParams(GLint x, GLint y, GLsizei width, GLsizei height);
355
356 void setColorMask(bool red, bool green, bool blue, bool alpha);
357 void setDepthMask(bool mask);
358
daniel@transgaming.comdfd57022011-05-11 15:37:25 +0000359 void setActiveSampler(unsigned int active);
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000360
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000361 GLuint getReadFramebufferHandle() const;
362 GLuint getDrawFramebufferHandle() const;
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000363 GLuint getRenderbufferHandle() const;
364
365 GLuint getArrayBufferHandle() const;
366
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000367 GLuint getActiveQuery(GLenum target) const;
368
daniel@transgaming.com83921382011-01-08 05:46:00 +0000369 void setEnableVertexAttribArray(unsigned int attribNum, bool enabled);
370 const VertexAttribute &getVertexAttribState(unsigned int attribNum);
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000371 void setVertexAttribState(unsigned int attribNum, Buffer *boundBuffer, GLint size, GLenum type,
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000372 bool normalized, GLsizei stride, const void *pointer);
373 const void *getVertexAttribPointer(unsigned int attribNum) const;
374
daniel@transgaming.com83921382011-01-08 05:46:00 +0000375 const VertexAttributeArray &getVertexAttributes();
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000376
377 void setUnpackAlignment(GLint alignment);
378 GLint getUnpackAlignment() const;
379
380 void setPackAlignment(GLint alignment);
381 GLint getPackAlignment() const;
382
bsalomon@google.com56d46ab2011-11-23 14:53:10 +0000383 void setPackReverseRowOrder(bool reverseRowOrder);
384 bool getPackReverseRowOrder() const;
385
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000386 // These create and destroy methods are merely pass-throughs to
387 // ResourceManager, which owns these object types
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000388 GLuint createBuffer();
389 GLuint createShader(GLenum type);
390 GLuint createProgram();
391 GLuint createTexture();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000392 GLuint createRenderbuffer();
393
394 void deleteBuffer(GLuint buffer);
395 void deleteShader(GLuint shader);
396 void deleteProgram(GLuint program);
397 void deleteTexture(GLuint texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000398 void deleteRenderbuffer(GLuint renderbuffer);
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000399
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000400 // Framebuffers are owned by the Context, so these methods do not pass through
401 GLuint createFramebuffer();
402 void deleteFramebuffer(GLuint framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000403
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +0000404 // Fences are owned by the Context.
405 GLuint createFence();
406 void deleteFence(GLuint fence);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000407
408 // Queries are owned by the Context;
409 GLuint createQuery();
410 void deleteQuery(GLuint query);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +0000411
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000412 void bindArrayBuffer(GLuint buffer);
413 void bindElementArrayBuffer(GLuint buffer);
414 void bindTexture2D(GLuint texture);
415 void bindTextureCubeMap(GLuint texture);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000416 void bindReadFramebuffer(GLuint framebuffer);
417 void bindDrawFramebuffer(GLuint framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000418 void bindRenderbuffer(GLuint renderbuffer);
419 void useProgram(GLuint program);
420
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000421 void beginQuery(GLenum target, GLuint query);
422 void endQuery(GLenum target);
423
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000424 void setFramebufferZero(Framebuffer *framebuffer);
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000425
426 void setRenderbufferStorage(RenderbufferStorage *renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000427
daniel@transgaming.come4b08c82010-04-20 18:53:06 +0000428 void setVertexAttrib(GLuint index, const GLfloat *values);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +0000429 void setVertexAttribDivisor(GLuint index, GLuint divisor);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +0000430
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000431 Buffer *getBuffer(GLuint handle);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +0000432 Fence *getFence(GLuint handle);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000433 Shader *getShader(GLuint handle);
434 Program *getProgram(GLuint handle);
435 Texture *getTexture(GLuint handle);
436 Framebuffer *getFramebuffer(GLuint handle);
437 Renderbuffer *getRenderbuffer(GLuint handle);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000438 Query *getQuery(GLuint handle, bool create, GLenum type);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000439
440 Buffer *getArrayBuffer();
441 Buffer *getElementArrayBuffer();
442 Program *getCurrentProgram();
443 Texture2D *getTexture2D();
444 TextureCubeMap *getTextureCubeMap();
daniel@transgaming.com0e64dd62011-05-11 15:36:37 +0000445 Texture *getSamplerTexture(unsigned int sampler, TextureType type);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000446 Framebuffer *getReadFramebuffer();
447 Framebuffer *getDrawFramebuffer();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000448
daniel@transgaming.com777f2672010-04-07 03:25:16 +0000449 bool getFloatv(GLenum pname, GLfloat *params);
450 bool getIntegerv(GLenum pname, GLint *params);
451 bool getBooleanv(GLenum pname, GLboolean *params);
452
453 bool getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams);
454
daniel@transgaming.comb7915a52011-11-12 03:14:20 +0000455 void readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei *bufSize, void* pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000456 void clear(GLbitfield mask);
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +0000457 void drawArrays(GLenum mode, GLint first, GLsizei count, GLsizei instances);
458 void drawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instances);
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +0000459 void sync(bool block); // flush/finish
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000460
daniel@transgaming.com6c4b5e02012-01-27 15:39:12 +0000461 void drawLineLoop(GLsizei count, GLenum type, const GLvoid *indices, int minIndex);
daniel@transgaming.comddcd7372011-01-08 05:46:33 +0000462
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000463 void recordInvalidEnum();
464 void recordInvalidValue();
465 void recordInvalidOperation();
466 void recordOutOfMemory();
467 void recordInvalidFramebufferOperation();
468
469 GLenum getError();
daniel@transgaming.com17f548c2011-11-09 17:47:02 +0000470 GLenum getResetStatus();
daniel@transgaming.com4ff960d2011-11-09 17:47:09 +0000471 virtual bool isResetNotificationEnabled();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000472
daniel@transgaming.combe5a0862010-07-28 19:20:37 +0000473 bool supportsShaderModel3() const;
daniel@transgaming.com396c6432010-11-26 16:26:12 +0000474 int getMaximumVaryingVectors() const;
daniel@transgaming.comdfd57022011-05-11 15:37:25 +0000475 unsigned int getMaximumVertexTextureImageUnits() const;
476 unsigned int getMaximumCombinedTextureImageUnits() const;
daniel@transgaming.com458da142010-11-28 02:03:02 +0000477 int getMaximumFragmentUniformVectors() const;
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000478 int getMaximumRenderbufferDimension() const;
479 int getMaximumTextureDimension() const;
480 int getMaximumCubeTextureDimension() const;
481 int getMaximumTextureLevel() const;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000482 GLsizei getMaxSupportedSamples() const;
483 int getNearestSupportedSamples(D3DFORMAT format, int requested) const;
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +0000484 const char *getExtensionString() const;
daniel@transgaming.comc23ff642011-08-16 20:28:45 +0000485 const char *getRendererString() const;
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +0000486 bool supportsEventQueries() const;
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000487 bool supportsOcclusionQueries() const;
gman@chromium.org50c526d2011-08-10 05:19:44 +0000488 bool supportsDXT1Textures() const;
489 bool supportsDXT3Textures() const;
490 bool supportsDXT5Textures() const;
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +0000491 bool supportsFloat32Textures() const;
492 bool supportsFloat32LinearFilter() const;
493 bool supportsFloat32RenderableTextures() const;
494 bool supportsFloat16Textures() const;
495 bool supportsFloat16LinearFilter() const;
496 bool supportsFloat16RenderableTextures() const;
daniel@transgaming.comed828e52010-10-15 17:57:30 +0000497 bool supportsLuminanceTextures() const;
498 bool supportsLuminanceAlphaTextures() const;
daniel@transgaming.com1c49f792012-05-31 01:14:02 +0000499 bool supportsDepthTextures() const;
daniel@transgaming.com83921382011-01-08 05:46:00 +0000500 bool supports32bitIndices() const;
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +0000501 bool supportsNonPower2Texture() const;
daniel@transgaming.comc6f7f9d2012-01-27 15:40:00 +0000502 bool supportsInstancing() const;
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +0000503
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +0000504 void blitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
505 GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
506 GLbitfield mask);
507
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +0000508 Blit *getBlitter() { return mBlit; }
509
daniel@transgaming.comc808c5a2010-05-14 17:31:01 +0000510 const D3DCAPS9 &getDeviceCaps() { return mDeviceCaps; }
511
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000512 private:
513 DISALLOW_COPY_AND_ASSIGN(Context);
514
daniel@transgaming.comd4a35172011-05-11 15:36:45 +0000515 bool applyRenderTarget(bool ignoreViewport);
516 void applyState(GLenum drawMode);
daniel@transgaming.comd6449312012-01-27 15:39:32 +0000517 GLenum applyVertexBuffer(GLint first, GLsizei count, GLsizei instances, GLsizei *repeatDraw);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +0000518 GLenum applyIndexBuffer(const GLvoid *indices, GLsizei count, GLenum mode, GLenum type, TranslatedIndexData *indexInfo);
daniel@transgaming.comd4a35172011-05-11 15:36:45 +0000519 void applyShaders();
520 void applyTextures();
521 void applyTextures(SamplerType type);
522
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000523 void detachBuffer(GLuint buffer);
524 void detachTexture(GLuint texture);
525 void detachFramebuffer(GLuint framebuffer);
526 void detachRenderbuffer(GLuint renderbuffer);
527
daniel@transgaming.com0e64dd62011-05-11 15:36:37 +0000528 Texture *getIncompleteTexture(TextureType type);
daniel@transgaming.com12d54072010-03-16 06:23:26 +0000529
daniel@transgaming.com5af64272010-04-15 20:45:12 +0000530 bool cullSkipsDraw(GLenum drawMode);
531 bool isTriangleMode(GLenum drawMode);
daniel@transgaming.comace5e662010-03-21 04:31:20 +0000532
daniel@transgaming.comc23ff642011-08-16 20:28:45 +0000533 void initExtensionString();
534 void initRendererString();
535
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000536 const egl::Config *const mConfig;
daniel@transgaming.comc941e252011-10-26 02:32:31 +0000537 egl::Display *mDisplay;
538 IDirect3DDevice9 *mDevice;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000539
daniel@transgaming.combaa74512011-04-13 14:56:47 +0000540 State mState;
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000541
apatrick@chromium.org4e3bad42010-09-15 17:31:48 +0000542 BindingPointer<Texture2D> mTexture2DZero;
543 BindingPointer<TextureCubeMap> mTextureCubeMapZero;
apatrick@chromium.orgff8bdfb2010-09-15 17:27:49 +0000544
benvanik@google.coma9d0b762011-04-28 20:11:54 +0000545 typedef stdext::hash_map<GLuint, Framebuffer*> FramebufferMap;
apatrick@chromium.orgff8bdfb2010-09-15 17:27:49 +0000546 FramebufferMap mFramebufferMap;
benvanik@google.com1a233342011-04-28 19:44:39 +0000547 HandleAllocator mFramebufferHandleAllocator;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000548
benvanik@google.coma9d0b762011-04-28 20:11:54 +0000549 typedef stdext::hash_map<GLuint, Fence*> FenceMap;
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +0000550 FenceMap mFenceMap;
benvanik@google.com1a233342011-04-28 19:44:39 +0000551 HandleAllocator mFenceHandleAllocator;
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +0000552
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000553 typedef stdext::hash_map<GLuint, Query*> QueryMap;
554 QueryMap mQueryMap;
555 HandleAllocator mQueryHandleAllocator;
556
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +0000557 std::string mExtensionString;
daniel@transgaming.comc23ff642011-08-16 20:28:45 +0000558 std::string mRendererString;
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +0000559
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000560 VertexDataManager *mVertexDataManager;
daniel@transgaming.comf8b58a02010-03-26 04:08:45 +0000561 IndexDataManager *mIndexDataManager;
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000562
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +0000563 Blit *mBlit;
jbauman@chromium.org399c35f2011-04-28 23:19:51 +0000564
daniel@transgaming.com6c4b5e02012-01-27 15:39:12 +0000565 StreamingIndexBuffer *mLineLoopIB;
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000566
daniel@transgaming.com0e64dd62011-05-11 15:36:37 +0000567 BindingPointer<Texture> mIncompleteTextures[TEXTURE_TYPE_COUNT];
daniel@transgaming.com12d54072010-03-16 06:23:26 +0000568
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000569 // Recorded errors
570 bool mInvalidEnum;
571 bool mInvalidValue;
572 bool mInvalidOperation;
573 bool mOutOfMemory;
574 bool mInvalidFramebufferOperation;
daniel@transgaming.com159acdf2010-03-21 04:31:24 +0000575
daniel@transgaming.com09fcc9f2011-11-09 17:46:47 +0000576 // Current/lost context flags
daniel@transgaming.com159acdf2010-03-21 04:31:24 +0000577 bool mHasBeenCurrent;
daniel@transgaming.com09fcc9f2011-11-09 17:46:47 +0000578 bool mContextLost;
daniel@transgaming.com17f548c2011-11-09 17:47:02 +0000579 GLenum mResetStatus;
daniel@transgaming.com4ff960d2011-11-09 17:47:09 +0000580 GLenum mResetStrategy;
581 bool mRobustAccess;
daniel@transgaming.com296ca9c2010-04-03 20:56:07 +0000582
daniel@transgaming.comd4a35172011-05-11 15:36:45 +0000583 unsigned int mAppliedTextureSerialPS[MAX_TEXTURE_IMAGE_UNITS];
584 unsigned int mAppliedTextureSerialVS[MAX_VERTEX_TEXTURE_IMAGE_UNITS_VTF];
daniel@transgaming.coma9eb5da2011-03-21 16:39:16 +0000585 unsigned int mAppliedProgramSerial;
daniel@transgaming.com092bd482010-05-12 03:39:36 +0000586 unsigned int mAppliedRenderTargetSerial;
daniel@transgaming.com339ae702010-05-12 03:40:20 +0000587 unsigned int mAppliedDepthbufferSerial;
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000588 unsigned int mAppliedStencilbufferSerial;
jbauman@chromium.orgd8f3faa2011-09-02 01:10:47 +0000589 unsigned int mAppliedIBSerial;
vangelis@chromium.orgcf66ebb2010-09-14 22:15:43 +0000590 bool mDepthStencilInitialized;
jbauman@chromium.orgd8f3faa2011-09-02 01:10:47 +0000591 bool mViewportInitialized;
592 D3DVIEWPORT9 mSetViewport;
593 bool mRenderTargetDescInitialized;
594 D3DSURFACE_DESC mRenderTargetDesc;
jbauman@chromium.org54f59ef2011-10-12 17:03:34 +0000595 bool mDxUniformsDirty;
jbauman@chromium.orgc6209852011-10-07 15:19:26 +0000596 Program *mCachedCurrentProgram;
jbauman@chromium.org040c4db2011-10-13 21:35:52 +0000597 Framebuffer *mBoundDrawFramebuffer;
daniel@transgaming.com4fa08332010-05-11 02:29:27 +0000598
daniel@transgaming.combe5a0862010-07-28 19:20:37 +0000599 bool mSupportsShaderModel3;
daniel@transgaming.comaf29cac2011-05-11 15:36:31 +0000600 bool mSupportsVertexTexture;
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +0000601 bool mSupportsNonPower2Texture;
daniel@transgaming.comc6f7f9d2012-01-27 15:40:00 +0000602 bool mSupportsInstancing;
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000603 int mMaxRenderbufferDimension;
604 int mMaxTextureDimension;
605 int mMaxCubeTextureDimension;
606 int mMaxTextureLevel;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000607 std::map<D3DFORMAT, bool *> mMultiSampleSupport;
608 GLsizei mMaxSupportedSamples;
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +0000609 bool mSupportsEventQueries;
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000610 bool mSupportsOcclusionQueries;
gman@chromium.org50c526d2011-08-10 05:19:44 +0000611 bool mSupportsDXT1Textures;
612 bool mSupportsDXT3Textures;
613 bool mSupportsDXT5Textures;
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +0000614 bool mSupportsFloat32Textures;
615 bool mSupportsFloat32LinearFilter;
616 bool mSupportsFloat32RenderableTextures;
617 bool mSupportsFloat16Textures;
618 bool mSupportsFloat16LinearFilter;
619 bool mSupportsFloat16RenderableTextures;
daniel@transgaming.comed828e52010-10-15 17:57:30 +0000620 bool mSupportsLuminanceTextures;
621 bool mSupportsLuminanceAlphaTextures;
daniel@transgaming.com1c49f792012-05-31 01:14:02 +0000622 bool mSupportsDepthTextures;
daniel@transgaming.com83921382011-01-08 05:46:00 +0000623 bool mSupports32bitIndices;
gman@chromium.org50c526d2011-08-10 05:19:44 +0000624 int mNumCompressedTextureFormats;
daniel@transgaming.coma79f9d12010-05-12 03:40:01 +0000625
626 // state caching flags
627 bool mClearStateDirty;
628 bool mCullStateDirty;
629 bool mDepthStateDirty;
630 bool mMaskStateDirty;
631 bool mPixelPackingStateDirty;
632 bool mBlendStateDirty;
633 bool mStencilStateDirty;
634 bool mPolygonOffsetStateDirty;
635 bool mScissorStateDirty;
636 bool mSampleStateDirty;
637 bool mFrontFaceDirty;
638 bool mDitherStateDirty;
daniel@transgaming.comc808c5a2010-05-14 17:31:01 +0000639
daniel@transgaming.com8f05d1a2010-06-07 02:06:03 +0000640 IDirect3DStateBlock9 *mMaskedClearSavedState;
641
daniel@transgaming.comc808c5a2010-05-14 17:31:01 +0000642 D3DCAPS9 mDeviceCaps;
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000643
644 ResourceManager *mResourceManager;
daniel@transgaming.combaa74512011-04-13 14:56:47 +0000645
daniel@transgaming.com09c2c1a2011-04-13 14:57:16 +0000646 VertexDeclarationCache mVertexDeclarationCache;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000647};
648}
649
650extern "C"
651{
652// Exported functions for use by EGL
daniel@transgaming.com4ff960d2011-11-09 17:47:09 +0000653gl::Context *glCreateContext(const egl::Config *config, const gl::Context *shareContext, bool notifyResets, bool robustAccess);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000654void glDestroyContext(gl::Context *context);
655void glMakeCurrent(gl::Context *context, egl::Display *display, egl::Surface *surface);
656gl::Context *glGetCurrentContext();
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +0000657__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +0000658bool __stdcall glBindTexImage(egl::Surface *surface);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000659}
660
661#endif // INCLUDE_CONTEXT_H_