2 // Copyright (c) 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 // State.cpp: Implements the State class, encapsulating raw GL state.
9 #include "libGLESv2/State.h"
11 #include "libGLESv2/Context.h"
12 #include "libGLESv2/Caps.h"
13 #include "libGLESv2/VertexArray.h"
14 #include "libGLESv2/Query.h"
15 #include "libGLESv2/Framebuffer.h"
16 #include "libGLESv2/FramebufferAttachment.h"
17 #include "libGLESv2/renderer/RenderTarget.h"
18 #include "libGLESv2/formatutils.h"
26 mMaxCombinedTextureImageUnits = 0;
34 void State::initialize(const Caps& caps, GLuint clientVersion)
36 mMaxDrawBuffers = caps.maxDrawBuffers;
37 mMaxCombinedTextureImageUnits = caps.maxCombinedTextureImageUnits;
39 setClearColor(0.0f, 0.0f, 0.0f, 0.0f);
41 mDepthClearValue = 1.0f;
42 mStencilClearValue = 0;
44 mRasterizer.rasterizerDiscard = false;
45 mRasterizer.cullFace = false;
46 mRasterizer.cullMode = GL_BACK;
47 mRasterizer.frontFace = GL_CCW;
48 mRasterizer.polygonOffsetFill = false;
49 mRasterizer.polygonOffsetFactor = 0.0f;
50 mRasterizer.polygonOffsetUnits = 0.0f;
51 mRasterizer.pointDrawMode = false;
52 mRasterizer.multiSample = false;
60 mBlend.sourceBlendRGB = GL_ONE;
61 mBlend.sourceBlendAlpha = GL_ONE;
62 mBlend.destBlendRGB = GL_ZERO;
63 mBlend.destBlendAlpha = GL_ZERO;
64 mBlend.blendEquationRGB = GL_FUNC_ADD;
65 mBlend.blendEquationAlpha = GL_FUNC_ADD;
66 mBlend.sampleAlphaToCoverage = false;
70 mBlendColor.green = 0;
72 mBlendColor.alpha = 0;
74 mDepthStencil.depthTest = false;
75 mDepthStencil.depthFunc = GL_LESS;
76 mDepthStencil.depthMask = true;
77 mDepthStencil.stencilTest = false;
78 mDepthStencil.stencilFunc = GL_ALWAYS;
79 mDepthStencil.stencilMask = -1;
80 mDepthStencil.stencilWritemask = -1;
81 mDepthStencil.stencilBackFunc = GL_ALWAYS;
82 mDepthStencil.stencilBackMask = -1;
83 mDepthStencil.stencilBackWritemask = -1;
84 mDepthStencil.stencilFail = GL_KEEP;
85 mDepthStencil.stencilPassDepthFail = GL_KEEP;
86 mDepthStencil.stencilPassDepthPass = GL_KEEP;
87 mDepthStencil.stencilBackFail = GL_KEEP;
88 mDepthStencil.stencilBackPassDepthFail = GL_KEEP;
89 mDepthStencil.stencilBackPassDepthPass = GL_KEEP;
94 mSampleCoverage = false;
95 mSampleCoverageValue = 1.0f;
96 mSampleCoverageInvert = false;
97 mGenerateMipmapHint = GL_DONT_CARE;
98 mFragmentShaderDerivativeHint = GL_DONT_CARE;
105 mViewport.height = 0;
109 mBlend.colorMaskRed = true;
110 mBlend.colorMaskGreen = true;
111 mBlend.colorMaskBlue = true;
112 mBlend.colorMaskAlpha = true;
116 const GLfloat defaultFloatValues[] = { 0.0f, 0.0f, 0.0f, 1.0f };
117 mVertexAttribCurrentValues.resize(caps.maxVertexAttributes);
118 for (size_t attribIndex = 0; attribIndex < mVertexAttribCurrentValues.size(); ++attribIndex)
120 mVertexAttribCurrentValues[attribIndex].setFloatValues(defaultFloatValues);
123 mUniformBuffers.resize(caps.maxCombinedUniformBlocks);
124 mTransformFeedbackBuffers.resize(caps.maxTransformFeedbackSeparateAttributes);
126 mSamplerTextures[GL_TEXTURE_2D].resize(caps.maxCombinedTextureImageUnits);
127 mSamplerTextures[GL_TEXTURE_CUBE_MAP].resize(caps.maxCombinedTextureImageUnits);
128 if (clientVersion >= 3)
130 // TODO: These could also be enabled via extension
131 mSamplerTextures[GL_TEXTURE_2D_ARRAY].resize(caps.maxCombinedTextureImageUnits);
132 mSamplerTextures[GL_TEXTURE_3D].resize(caps.maxCombinedTextureImageUnits);
135 mSamplers.resize(caps.maxCombinedTextureImageUnits);
137 mActiveQueries[GL_ANY_SAMPLES_PASSED].set(NULL);
138 mActiveQueries[GL_ANY_SAMPLES_PASSED_CONSERVATIVE].set(NULL);
139 mActiveQueries[GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN].set(NULL);
141 mCurrentProgramId = 0;
142 mCurrentProgramBinary.set(NULL);
144 mReadFramebuffer = NULL;
145 mDrawFramebuffer = NULL;
150 for (TextureBindingMap::iterator bindingVec = mSamplerTextures.begin(); bindingVec != mSamplerTextures.end(); bindingVec++)
152 TextureBindingVector &textureVector = bindingVec->second;
153 for (size_t textureIdx = 0; textureIdx < textureVector.size(); textureIdx++)
155 textureVector[textureIdx].set(NULL);
158 for (size_t samplerIdx = 0; samplerIdx < mSamplers.size(); samplerIdx++)
160 mSamplers[samplerIdx].set(NULL);
163 mArrayBuffer.set(NULL);
164 mRenderbuffer.set(NULL);
166 mTransformFeedback.set(NULL);
168 for (State::ActiveQueryMap::iterator i = mActiveQueries.begin(); i != mActiveQueries.end(); i++)
173 mGenericUniformBuffer.set(NULL);
174 mGenericTransformFeedbackBuffer.set(NULL);
175 for (BufferVector::iterator bufItr = mUniformBuffers.begin(); bufItr != mUniformBuffers.end(); ++bufItr)
180 for (BufferVector::iterator bufItr = mTransformFeedbackBuffers.begin(); bufItr != mTransformFeedbackBuffers.end(); ++bufItr)
185 mCopyReadBuffer.set(NULL);
186 mCopyWriteBuffer.set(NULL);
188 mPack.pixelBuffer.set(NULL);
189 mUnpack.pixelBuffer.set(NULL);
192 const RasterizerState &State::getRasterizerState() const
197 const BlendState &State::getBlendState() const
202 const DepthStencilState &State::getDepthStencilState() const
204 return mDepthStencil;
207 void State::setClearColor(float red, float green, float blue, float alpha)
209 mColorClearValue.red = red;
210 mColorClearValue.green = green;
211 mColorClearValue.blue = blue;
212 mColorClearValue.alpha = alpha;
215 void State::setClearDepth(float depth)
217 mDepthClearValue = depth;
220 void State::setClearStencil(int stencil)
222 mStencilClearValue = stencil;
225 ClearParameters State::getClearParameters(GLbitfield mask) const
227 ClearParameters clearParams = { 0 };
228 for (unsigned int i = 0; i < ArraySize(clearParams.clearColor); i++)
230 clearParams.clearColor[i] = false;
232 clearParams.colorFClearValue = mColorClearValue;
233 clearParams.colorClearType = GL_FLOAT;
234 clearParams.colorMaskRed = mBlend.colorMaskRed;
235 clearParams.colorMaskGreen = mBlend.colorMaskGreen;
236 clearParams.colorMaskBlue = mBlend.colorMaskBlue;
237 clearParams.colorMaskAlpha = mBlend.colorMaskAlpha;
238 clearParams.clearDepth = false;
239 clearParams.depthClearValue = mDepthClearValue;
240 clearParams.clearStencil = false;
241 clearParams.stencilClearValue = mStencilClearValue;
242 clearParams.stencilWriteMask = mDepthStencil.stencilWritemask;
243 clearParams.scissorEnabled = mScissorTest;
244 clearParams.scissor = mScissor;
246 const Framebuffer *framebufferObject = getDrawFramebuffer();
247 if (mask & GL_COLOR_BUFFER_BIT)
249 if (framebufferObject->hasEnabledColorAttachment())
251 for (unsigned int i = 0; i < ArraySize(clearParams.clearColor); i++)
253 clearParams.clearColor[i] = true;
258 if (mask & GL_DEPTH_BUFFER_BIT)
260 if (mDepthStencil.depthMask && framebufferObject->getDepthbuffer() != NULL)
262 clearParams.clearDepth = true;
266 if (mask & GL_STENCIL_BUFFER_BIT)
268 if (framebufferObject->getStencilbuffer() != NULL)
270 GLenum stencilActualFormat = framebufferObject->getStencilbuffer()->getActualFormat();
271 if (GetInternalFormatInfo(stencilActualFormat).stencilBits > 0)
273 clearParams.clearStencil = true;
281 void State::setColorMask(bool red, bool green, bool blue, bool alpha)
283 mBlend.colorMaskRed = red;
284 mBlend.colorMaskGreen = green;
285 mBlend.colorMaskBlue = blue;
286 mBlend.colorMaskAlpha = alpha;
289 void State::setDepthMask(bool mask)
291 mDepthStencil.depthMask = mask;
294 bool State::isRasterizerDiscardEnabled() const
296 return mRasterizer.rasterizerDiscard;
299 void State::setRasterizerDiscard(bool enabled)
301 mRasterizer.rasterizerDiscard = enabled;
304 bool State::isCullFaceEnabled() const
306 return mRasterizer.cullFace;
309 void State::setCullFace(bool enabled)
311 mRasterizer.cullFace = enabled;
314 void State::setCullMode(GLenum mode)
316 mRasterizer.cullMode = mode;
319 void State::setFrontFace(GLenum front)
321 mRasterizer.frontFace = front;
324 bool State::isDepthTestEnabled() const
326 return mDepthStencil.depthTest;
329 void State::setDepthTest(bool enabled)
331 mDepthStencil.depthTest = enabled;
334 void State::setDepthFunc(GLenum depthFunc)
336 mDepthStencil.depthFunc = depthFunc;
339 void State::setDepthRange(float zNear, float zFar)
345 void State::getDepthRange(float *zNear, float *zFar) const
351 bool State::isBlendEnabled() const
356 void State::setBlend(bool enabled)
358 mBlend.blend = enabled;
361 void State::setBlendFactors(GLenum sourceRGB, GLenum destRGB, GLenum sourceAlpha, GLenum destAlpha)
363 mBlend.sourceBlendRGB = sourceRGB;
364 mBlend.destBlendRGB = destRGB;
365 mBlend.sourceBlendAlpha = sourceAlpha;
366 mBlend.destBlendAlpha = destAlpha;
369 void State::setBlendColor(float red, float green, float blue, float alpha)
371 mBlendColor.red = red;
372 mBlendColor.green = green;
373 mBlendColor.blue = blue;
374 mBlendColor.alpha = alpha;
377 void State::setBlendEquation(GLenum rgbEquation, GLenum alphaEquation)
379 mBlend.blendEquationRGB = rgbEquation;
380 mBlend.blendEquationAlpha = alphaEquation;
383 const ColorF &State::getBlendColor() const
388 bool State::isStencilTestEnabled() const
390 return mDepthStencil.stencilTest;
393 void State::setStencilTest(bool enabled)
395 mDepthStencil.stencilTest = enabled;
398 void State::setStencilParams(GLenum stencilFunc, GLint stencilRef, GLuint stencilMask)
400 mDepthStencil.stencilFunc = stencilFunc;
401 mStencilRef = (stencilRef > 0) ? stencilRef : 0;
402 mDepthStencil.stencilMask = stencilMask;
405 void State::setStencilBackParams(GLenum stencilBackFunc, GLint stencilBackRef, GLuint stencilBackMask)
407 mDepthStencil.stencilBackFunc = stencilBackFunc;
408 mStencilBackRef = (stencilBackRef > 0) ? stencilBackRef : 0;
409 mDepthStencil.stencilBackMask = stencilBackMask;
412 void State::setStencilWritemask(GLuint stencilWritemask)
414 mDepthStencil.stencilWritemask = stencilWritemask;
417 void State::setStencilBackWritemask(GLuint stencilBackWritemask)
419 mDepthStencil.stencilBackWritemask = stencilBackWritemask;
422 void State::setStencilOperations(GLenum stencilFail, GLenum stencilPassDepthFail, GLenum stencilPassDepthPass)
424 mDepthStencil.stencilFail = stencilFail;
425 mDepthStencil.stencilPassDepthFail = stencilPassDepthFail;
426 mDepthStencil.stencilPassDepthPass = stencilPassDepthPass;
429 void State::setStencilBackOperations(GLenum stencilBackFail, GLenum stencilBackPassDepthFail, GLenum stencilBackPassDepthPass)
431 mDepthStencil.stencilBackFail = stencilBackFail;
432 mDepthStencil.stencilBackPassDepthFail = stencilBackPassDepthFail;
433 mDepthStencil.stencilBackPassDepthPass = stencilBackPassDepthPass;
436 GLint State::getStencilRef() const
441 GLint State::getStencilBackRef() const
443 return mStencilBackRef;
446 bool State::isPolygonOffsetFillEnabled() const
448 return mRasterizer.polygonOffsetFill;
451 void State::setPolygonOffsetFill(bool enabled)
453 mRasterizer.polygonOffsetFill = enabled;
456 void State::setPolygonOffsetParams(GLfloat factor, GLfloat units)
458 // An application can pass NaN values here, so handle this gracefully
459 mRasterizer.polygonOffsetFactor = factor != factor ? 0.0f : factor;
460 mRasterizer.polygonOffsetUnits = units != units ? 0.0f : units;
463 bool State::isSampleAlphaToCoverageEnabled() const
465 return mBlend.sampleAlphaToCoverage;
468 void State::setSampleAlphaToCoverage(bool enabled)
470 mBlend.sampleAlphaToCoverage = enabled;
473 bool State::isSampleCoverageEnabled() const
475 return mSampleCoverage;
478 void State::setSampleCoverage(bool enabled)
480 mSampleCoverage = enabled;
483 void State::setSampleCoverageParams(GLclampf value, bool invert)
485 mSampleCoverageValue = value;
486 mSampleCoverageInvert = invert;
489 void State::getSampleCoverageParams(GLclampf *value, bool *invert)
491 ASSERT(value != NULL && invert != NULL);
493 *value = mSampleCoverageValue;
494 *invert = mSampleCoverageInvert;
497 bool State::isScissorTestEnabled() const
502 void State::setScissorTest(bool enabled)
504 mScissorTest = enabled;
507 void State::setScissorParams(GLint x, GLint y, GLsizei width, GLsizei height)
511 mScissor.width = width;
512 mScissor.height = height;
515 const Rectangle &State::getScissor() const
520 bool State::isDitherEnabled() const
522 return mBlend.dither;
525 void State::setDither(bool enabled)
527 mBlend.dither = enabled;
530 void State::setEnableFeature(GLenum feature, bool enabled)
534 case GL_CULL_FACE: setCullFace(enabled); break;
535 case GL_POLYGON_OFFSET_FILL: setPolygonOffsetFill(enabled); break;
536 case GL_SAMPLE_ALPHA_TO_COVERAGE: setSampleAlphaToCoverage(enabled); break;
537 case GL_SAMPLE_COVERAGE: setSampleCoverage(enabled); break;
538 case GL_SCISSOR_TEST: setScissorTest(enabled); break;
539 case GL_STENCIL_TEST: setStencilTest(enabled); break;
540 case GL_DEPTH_TEST: setDepthTest(enabled); break;
541 case GL_BLEND: setBlend(enabled); break;
542 case GL_DITHER: setDither(enabled); break;
543 case GL_PRIMITIVE_RESTART_FIXED_INDEX: UNIMPLEMENTED(); break;
544 case GL_RASTERIZER_DISCARD: setRasterizerDiscard(enabled); break;
545 default: UNREACHABLE();
549 bool State::getEnableFeature(GLenum feature)
553 case GL_CULL_FACE: return isCullFaceEnabled();
554 case GL_POLYGON_OFFSET_FILL: return isPolygonOffsetFillEnabled();
555 case GL_SAMPLE_ALPHA_TO_COVERAGE: return isSampleAlphaToCoverageEnabled();
556 case GL_SAMPLE_COVERAGE: return isSampleCoverageEnabled();
557 case GL_SCISSOR_TEST: return isScissorTestEnabled();
558 case GL_STENCIL_TEST: return isStencilTestEnabled();
559 case GL_DEPTH_TEST: return isDepthTestEnabled();
560 case GL_BLEND: return isBlendEnabled();
561 case GL_DITHER: return isDitherEnabled();
562 case GL_PRIMITIVE_RESTART_FIXED_INDEX: UNIMPLEMENTED(); return false;
563 case GL_RASTERIZER_DISCARD: return isRasterizerDiscardEnabled();
564 default: UNREACHABLE(); return false;
568 void State::setLineWidth(GLfloat width)
573 void State::setGenerateMipmapHint(GLenum hint)
575 mGenerateMipmapHint = hint;
578 void State::setFragmentShaderDerivativeHint(GLenum hint)
580 mFragmentShaderDerivativeHint = hint;
581 // TODO: Propagate the hint to shader translator so we can write
582 // ddx, ddx_coarse, or ddx_fine depending on the hint.
583 // Ignore for now. It is valid for implementations to ignore hint.
586 void State::setViewportParams(GLint x, GLint y, GLsizei width, GLsizei height)
590 mViewport.width = width;
591 mViewport.height = height;
594 const Rectangle &State::getViewport() const
599 void State::setActiveSampler(unsigned int active)
601 mActiveSampler = active;
604 unsigned int State::getActiveSampler() const
606 return mActiveSampler;
609 void State::setSamplerTexture(GLenum type, Texture *texture)
611 mSamplerTextures[type][mActiveSampler].set(texture);
614 Texture *State::getSamplerTexture(unsigned int sampler, GLenum type) const
616 const BindingPointer<Texture>& binding = mSamplerTextures.at(type)[sampler];
618 if (binding.id() == 0) // Special case: 0 refers to default textures held by Context
623 return binding.get();
626 GLuint State::getSamplerTextureId(unsigned int sampler, GLenum type) const
628 return mSamplerTextures.at(type)[sampler].id();
631 void State::detachTexture(GLuint texture)
633 // Textures have a detach method on State rather than a simple
634 // removeBinding, because the zero/null texture objects are managed
635 // separately, and don't have to go through the Context's maps or
636 // the ResourceManager.
638 // [OpenGL ES 2.0.24] section 3.8 page 84:
639 // If a texture object is deleted, it is as if all texture units which are bound to that texture object are
640 // rebound to texture object zero
642 for (TextureBindingMap::iterator bindingVec = mSamplerTextures.begin(); bindingVec != mSamplerTextures.end(); bindingVec++)
644 TextureBindingVector &textureVector = bindingVec->second;
645 for (size_t textureIdx = 0; textureIdx < textureVector.size(); textureIdx++)
647 BindingPointer<Texture> &binding = textureVector[textureIdx];
648 if (binding.id() == texture)
655 // [OpenGL ES 2.0.24] section 4.4 page 112:
656 // If a texture object is deleted while its image is attached to the currently bound framebuffer, then it is
657 // as if Texture2DAttachment had been called, with a texture of 0, for each attachment point to which this
658 // image was attached in the currently bound framebuffer.
660 if (mReadFramebuffer)
662 mReadFramebuffer->detachTexture(texture);
665 if (mDrawFramebuffer)
667 mDrawFramebuffer->detachTexture(texture);
671 void State::setSamplerBinding(GLuint textureUnit, Sampler *sampler)
673 mSamplers[textureUnit].set(sampler);
676 GLuint State::getSamplerId(GLuint textureUnit) const
678 ASSERT(textureUnit < mSamplers.size());
679 return mSamplers[textureUnit].id();
682 Sampler *State::getSampler(GLuint textureUnit) const
684 return mSamplers[textureUnit].get();
687 void State::detachSampler(GLuint sampler)
689 // [OpenGL ES 3.0.2] section 3.8.2 pages 123-124:
690 // If a sampler object that is currently bound to one or more texture units is
691 // deleted, it is as though BindSampler is called once for each texture unit to
692 // which the sampler is bound, with unit set to the texture unit and sampler set to zero.
693 for (size_t textureUnit = 0; textureUnit < mSamplers.size(); textureUnit++)
695 BindingPointer<Sampler> &samplerBinding = mSamplers[textureUnit];
696 if (samplerBinding.id() == sampler)
698 samplerBinding.set(NULL);
703 void State::setRenderbufferBinding(Renderbuffer *renderbuffer)
705 mRenderbuffer.set(renderbuffer);
708 GLuint State::getRenderbufferId() const
710 return mRenderbuffer.id();
713 Renderbuffer *State::getCurrentRenderbuffer()
715 return mRenderbuffer.get();
718 void State::detachRenderbuffer(GLuint renderbuffer)
720 // [OpenGL ES 2.0.24] section 4.4 page 109:
721 // If a renderbuffer that is currently bound to RENDERBUFFER is deleted, it is as though BindRenderbuffer
722 // had been executed with the target RENDERBUFFER and name of zero.
724 if (mRenderbuffer.id() == renderbuffer)
726 mRenderbuffer.set(NULL);
729 // [OpenGL ES 2.0.24] section 4.4 page 111:
730 // If a renderbuffer object is deleted while its image is attached to the currently bound framebuffer,
731 // then it is as if FramebufferRenderbuffer had been called, with a renderbuffer of 0, for each attachment
732 // point to which this image was attached in the currently bound framebuffer.
734 Framebuffer *readFramebuffer = mReadFramebuffer;
735 Framebuffer *drawFramebuffer = mDrawFramebuffer;
739 readFramebuffer->detachRenderbuffer(renderbuffer);
742 if (drawFramebuffer && drawFramebuffer != readFramebuffer)
744 drawFramebuffer->detachRenderbuffer(renderbuffer);
749 void State::setReadFramebufferBinding(Framebuffer *framebuffer)
751 mReadFramebuffer = framebuffer;
754 void State::setDrawFramebufferBinding(Framebuffer *framebuffer)
756 mDrawFramebuffer = framebuffer;
759 Framebuffer *State::getTargetFramebuffer(GLenum target) const
763 case GL_READ_FRAMEBUFFER_ANGLE: return mReadFramebuffer;
764 case GL_DRAW_FRAMEBUFFER_ANGLE:
765 case GL_FRAMEBUFFER: return mDrawFramebuffer;
766 default: UNREACHABLE(); return NULL;
770 Framebuffer *State::getReadFramebuffer()
772 return mReadFramebuffer;
775 Framebuffer *State::getDrawFramebuffer()
777 return mDrawFramebuffer;
780 const Framebuffer *State::getReadFramebuffer() const
782 return mReadFramebuffer;
785 const Framebuffer *State::getDrawFramebuffer() const
787 return mDrawFramebuffer;
790 bool State::removeReadFramebufferBinding(GLuint framebuffer)
792 if (mReadFramebuffer->id() == framebuffer)
794 mReadFramebuffer = NULL;
801 bool State::removeDrawFramebufferBinding(GLuint framebuffer)
803 if (mDrawFramebuffer->id() == framebuffer)
805 mDrawFramebuffer = NULL;
812 void State::setVertexArrayBinding(VertexArray *vertexArray)
814 mVertexArray = vertexArray;
817 GLuint State::getVertexArrayId() const
819 ASSERT(mVertexArray != NULL);
820 return mVertexArray->id();
823 VertexArray *State::getVertexArray() const
825 ASSERT(mVertexArray != NULL);
829 bool State::removeVertexArrayBinding(GLuint vertexArray)
831 if (mVertexArray->id() == vertexArray)
840 void State::setCurrentProgram(GLuint programId, Program *newProgram)
842 mCurrentProgramId = programId; // set new ID before trying to delete program binary; otherwise it will only be flagged for deletion
843 mCurrentProgramBinary.set(NULL);
847 newProgram->addRef();
848 mCurrentProgramBinary.set(newProgram->getProgramBinary());
852 void State::setCurrentProgramBinary(ProgramBinary *binary)
854 mCurrentProgramBinary.set(binary);
857 GLuint State::getCurrentProgramId() const
859 return mCurrentProgramId;
862 ProgramBinary *State::getCurrentProgramBinary() const
864 return mCurrentProgramBinary.get();
867 void State::setTransformFeedbackBinding(TransformFeedback *transformFeedback)
869 mTransformFeedback.set(transformFeedback);
872 TransformFeedback *State::getCurrentTransformFeedback() const
874 return mTransformFeedback.get();
877 void State::detachTransformFeedback(GLuint transformFeedback)
879 if (mTransformFeedback.id() == transformFeedback)
881 mTransformFeedback.set(NULL);
885 bool State::isQueryActive() const
887 for (State::ActiveQueryMap::const_iterator i = mActiveQueries.begin();
888 i != mActiveQueries.end(); i++)
890 if (i->second.get() != NULL)
899 void State::setActiveQuery(GLenum target, Query *query)
901 mActiveQueries[target].set(query);
904 GLuint State::getActiveQueryId(GLenum target) const
906 const Query *query = getActiveQuery(target);
907 return (query ? query->id() : 0u);
910 Query *State::getActiveQuery(GLenum target) const
912 // All query types should already exist in the activeQueries map
913 ASSERT(mActiveQueries.find(target) != mActiveQueries.end());
915 return mActiveQueries.at(target).get();
918 void State::setArrayBufferBinding(Buffer *buffer)
920 mArrayBuffer.set(buffer);
923 GLuint State::getArrayBufferId() const
925 return mArrayBuffer.id();
928 bool State::removeArrayBufferBinding(GLuint buffer)
930 if (mArrayBuffer.id() == buffer)
932 mArrayBuffer.set(NULL);
939 void State::setGenericUniformBufferBinding(Buffer *buffer)
941 mGenericUniformBuffer.set(buffer);
944 void State::setIndexedUniformBufferBinding(GLuint index, Buffer *buffer, GLintptr offset, GLsizeiptr size)
946 mUniformBuffers[index].set(buffer, offset, size);
949 GLuint State::getIndexedUniformBufferId(GLuint index) const
951 ASSERT(static_cast<size_t>(index) < mUniformBuffers.size());
953 return mUniformBuffers[index].id();
956 Buffer *State::getIndexedUniformBuffer(GLuint index) const
958 ASSERT(static_cast<size_t>(index) < mUniformBuffers.size());
960 return mUniformBuffers[index].get();
963 void State::setGenericTransformFeedbackBufferBinding(Buffer *buffer)
965 mGenericTransformFeedbackBuffer.set(buffer);
968 void State::setIndexedTransformFeedbackBufferBinding(GLuint index, Buffer *buffer, GLintptr offset, GLsizeiptr size)
970 mTransformFeedbackBuffers[index].set(buffer, offset, size);
973 GLuint State::getIndexedTransformFeedbackBufferId(GLuint index) const
975 ASSERT(static_cast<size_t>(index) < mTransformFeedbackBuffers.size());
977 return mTransformFeedbackBuffers[index].id();
980 Buffer *State::getIndexedTransformFeedbackBuffer(GLuint index) const
982 ASSERT(static_cast<size_t>(index) < mTransformFeedbackBuffers.size());
984 return mTransformFeedbackBuffers[index].get();
987 GLuint State::getIndexedTransformFeedbackBufferOffset(GLuint index) const
989 ASSERT(static_cast<size_t>(index) < mTransformFeedbackBuffers.size());
991 return mTransformFeedbackBuffers[index].getOffset();
994 size_t State::getTransformFeedbackBufferIndexRange() const
996 return mTransformFeedbackBuffers.size();
999 void State::setCopyReadBufferBinding(Buffer *buffer)
1001 mCopyReadBuffer.set(buffer);
1004 void State::setCopyWriteBufferBinding(Buffer *buffer)
1006 mCopyWriteBuffer.set(buffer);
1009 void State::setPixelPackBufferBinding(Buffer *buffer)
1011 mPack.pixelBuffer.set(buffer);
1014 void State::setPixelUnpackBufferBinding(Buffer *buffer)
1016 mUnpack.pixelBuffer.set(buffer);
1019 Buffer *State::getTargetBuffer(GLenum target) const
1023 case GL_ARRAY_BUFFER: return mArrayBuffer.get();
1024 case GL_COPY_READ_BUFFER: return mCopyReadBuffer.get();
1025 case GL_COPY_WRITE_BUFFER: return mCopyWriteBuffer.get();
1026 case GL_ELEMENT_ARRAY_BUFFER: return getVertexArray()->getElementArrayBuffer();
1027 case GL_PIXEL_PACK_BUFFER: return mPack.pixelBuffer.get();
1028 case GL_PIXEL_UNPACK_BUFFER: return mUnpack.pixelBuffer.get();
1029 case GL_TRANSFORM_FEEDBACK_BUFFER: return mGenericTransformFeedbackBuffer.get();
1030 case GL_UNIFORM_BUFFER: return mGenericUniformBuffer.get();
1031 default: UNREACHABLE(); return NULL;
1035 void State::setEnableVertexAttribArray(unsigned int attribNum, bool enabled)
1037 getVertexArray()->enableAttribute(attribNum, enabled);
1040 void State::setVertexAttribf(GLuint index, const GLfloat values[4])
1042 ASSERT(static_cast<size_t>(index) < mVertexAttribCurrentValues.size());
1043 mVertexAttribCurrentValues[index].setFloatValues(values);
1046 void State::setVertexAttribu(GLuint index, const GLuint values[4])
1048 ASSERT(static_cast<size_t>(index) < mVertexAttribCurrentValues.size());
1049 mVertexAttribCurrentValues[index].setUnsignedIntValues(values);
1052 void State::setVertexAttribi(GLuint index, const GLint values[4])
1054 ASSERT(static_cast<size_t>(index) < mVertexAttribCurrentValues.size());
1055 mVertexAttribCurrentValues[index].setIntValues(values);
1058 void State::setVertexAttribState(unsigned int attribNum, Buffer *boundBuffer, GLint size, GLenum type, bool normalized,
1059 bool pureInteger, GLsizei stride, const void *pointer)
1061 getVertexArray()->setAttributeState(attribNum, boundBuffer, size, type, normalized, pureInteger, stride, pointer);
1064 const VertexAttribute &State::getVertexAttribState(unsigned int attribNum) const
1066 return getVertexArray()->getVertexAttribute(attribNum);
1069 const VertexAttribCurrentValueData &State::getVertexAttribCurrentValue(unsigned int attribNum) const
1071 ASSERT(static_cast<size_t>(attribNum) < mVertexAttribCurrentValues.size());
1072 return mVertexAttribCurrentValues[attribNum];
1075 const void *State::getVertexAttribPointer(unsigned int attribNum) const
1077 return getVertexArray()->getVertexAttribute(attribNum).pointer;
1080 void State::setPackAlignment(GLint alignment)
1082 mPack.alignment = alignment;
1085 GLint State::getPackAlignment() const
1087 return mPack.alignment;
1090 void State::setPackReverseRowOrder(bool reverseRowOrder)
1092 mPack.reverseRowOrder = reverseRowOrder;
1095 bool State::getPackReverseRowOrder() const
1097 return mPack.reverseRowOrder;
1100 const PixelPackState &State::getPackState() const
1105 void State::setUnpackAlignment(GLint alignment)
1107 mUnpack.alignment = alignment;
1110 GLint State::getUnpackAlignment() const
1112 return mUnpack.alignment;
1115 const PixelUnpackState &State::getUnpackState() const
1120 void State::getBooleanv(GLenum pname, GLboolean *params)
1124 case GL_SAMPLE_COVERAGE_INVERT: *params = mSampleCoverageInvert; break;
1125 case GL_DEPTH_WRITEMASK: *params = mDepthStencil.depthMask; break;
1126 case GL_COLOR_WRITEMASK:
1127 params[0] = mBlend.colorMaskRed;
1128 params[1] = mBlend.colorMaskGreen;
1129 params[2] = mBlend.colorMaskBlue;
1130 params[3] = mBlend.colorMaskAlpha;
1132 case GL_CULL_FACE: *params = mRasterizer.cullFace; break;
1133 case GL_POLYGON_OFFSET_FILL: *params = mRasterizer.polygonOffsetFill; break;
1134 case GL_SAMPLE_ALPHA_TO_COVERAGE: *params = mBlend.sampleAlphaToCoverage; break;
1135 case GL_SAMPLE_COVERAGE: *params = mSampleCoverage; break;
1136 case GL_SCISSOR_TEST: *params = mScissorTest; break;
1137 case GL_STENCIL_TEST: *params = mDepthStencil.stencilTest; break;
1138 case GL_DEPTH_TEST: *params = mDepthStencil.depthTest; break;
1139 case GL_BLEND: *params = mBlend.blend; break;
1140 case GL_DITHER: *params = mBlend.dither; break;
1141 case GL_TRANSFORM_FEEDBACK_ACTIVE: *params = getCurrentTransformFeedback()->isStarted(); break;
1142 case GL_TRANSFORM_FEEDBACK_PAUSED: *params = getCurrentTransformFeedback()->isPaused(); break;
1149 void State::getFloatv(GLenum pname, GLfloat *params)
1151 // Please note: DEPTH_CLEAR_VALUE is included in our internal getFloatv implementation
1152 // because it is stored as a float, despite the fact that the GL ES 2.0 spec names
1153 // GetIntegerv as its native query function. As it would require conversion in any
1154 // case, this should make no difference to the calling application.
1157 case GL_LINE_WIDTH: *params = mLineWidth; break;
1158 case GL_SAMPLE_COVERAGE_VALUE: *params = mSampleCoverageValue; break;
1159 case GL_DEPTH_CLEAR_VALUE: *params = mDepthClearValue; break;
1160 case GL_POLYGON_OFFSET_FACTOR: *params = mRasterizer.polygonOffsetFactor; break;
1161 case GL_POLYGON_OFFSET_UNITS: *params = mRasterizer.polygonOffsetUnits; break;
1162 case GL_DEPTH_RANGE:
1166 case GL_COLOR_CLEAR_VALUE:
1167 params[0] = mColorClearValue.red;
1168 params[1] = mColorClearValue.green;
1169 params[2] = mColorClearValue.blue;
1170 params[3] = mColorClearValue.alpha;
1172 case GL_BLEND_COLOR:
1173 params[0] = mBlendColor.red;
1174 params[1] = mBlendColor.green;
1175 params[2] = mBlendColor.blue;
1176 params[3] = mBlendColor.alpha;
1184 void State::getIntegerv(GLenum pname, GLint *params)
1186 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
1188 unsigned int colorAttachment = (pname - GL_DRAW_BUFFER0_EXT);
1189 ASSERT(colorAttachment < mMaxDrawBuffers);
1190 Framebuffer *framebuffer = mDrawFramebuffer;
1191 *params = framebuffer->getDrawBufferState(colorAttachment);
1195 // Please note: DEPTH_CLEAR_VALUE is not included in our internal getIntegerv implementation
1196 // because it is stored as a float, despite the fact that the GL ES 2.0 spec names
1197 // GetIntegerv as its native query function. As it would require conversion in any
1198 // case, this should make no difference to the calling application. You may find it in
1199 // State::getFloatv.
1202 case GL_ARRAY_BUFFER_BINDING: *params = mArrayBuffer.id(); break;
1203 case GL_ELEMENT_ARRAY_BUFFER_BINDING: *params = getVertexArray()->getElementArrayBufferId(); break;
1204 //case GL_FRAMEBUFFER_BINDING: // now equivalent to GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
1205 case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE: *params = mDrawFramebuffer->id(); break;
1206 case GL_READ_FRAMEBUFFER_BINDING_ANGLE: *params = mReadFramebuffer->id(); break;
1207 case GL_RENDERBUFFER_BINDING: *params = mRenderbuffer.id(); break;
1208 case GL_VERTEX_ARRAY_BINDING: *params = mVertexArray->id(); break;
1209 case GL_CURRENT_PROGRAM: *params = mCurrentProgramId; break;
1210 case GL_PACK_ALIGNMENT: *params = mPack.alignment; break;
1211 case GL_PACK_REVERSE_ROW_ORDER_ANGLE: *params = mPack.reverseRowOrder; break;
1212 case GL_UNPACK_ALIGNMENT: *params = mUnpack.alignment; break;
1213 case GL_GENERATE_MIPMAP_HINT: *params = mGenerateMipmapHint; break;
1214 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES: *params = mFragmentShaderDerivativeHint; break;
1215 case GL_ACTIVE_TEXTURE: *params = (mActiveSampler + GL_TEXTURE0); break;
1216 case GL_STENCIL_FUNC: *params = mDepthStencil.stencilFunc; break;
1217 case GL_STENCIL_REF: *params = mStencilRef; break;
1218 case GL_STENCIL_VALUE_MASK: *params = clampToInt(mDepthStencil.stencilMask); break;
1219 case GL_STENCIL_BACK_FUNC: *params = mDepthStencil.stencilBackFunc; break;
1220 case GL_STENCIL_BACK_REF: *params = mStencilBackRef; break;
1221 case GL_STENCIL_BACK_VALUE_MASK: *params = clampToInt(mDepthStencil.stencilBackMask); break;
1222 case GL_STENCIL_FAIL: *params = mDepthStencil.stencilFail; break;
1223 case GL_STENCIL_PASS_DEPTH_FAIL: *params = mDepthStencil.stencilPassDepthFail; break;
1224 case GL_STENCIL_PASS_DEPTH_PASS: *params = mDepthStencil.stencilPassDepthPass; break;
1225 case GL_STENCIL_BACK_FAIL: *params = mDepthStencil.stencilBackFail; break;
1226 case GL_STENCIL_BACK_PASS_DEPTH_FAIL: *params = mDepthStencil.stencilBackPassDepthFail; break;
1227 case GL_STENCIL_BACK_PASS_DEPTH_PASS: *params = mDepthStencil.stencilBackPassDepthPass; break;
1228 case GL_DEPTH_FUNC: *params = mDepthStencil.depthFunc; break;
1229 case GL_BLEND_SRC_RGB: *params = mBlend.sourceBlendRGB; break;
1230 case GL_BLEND_SRC_ALPHA: *params = mBlend.sourceBlendAlpha; break;
1231 case GL_BLEND_DST_RGB: *params = mBlend.destBlendRGB; break;
1232 case GL_BLEND_DST_ALPHA: *params = mBlend.destBlendAlpha; break;
1233 case GL_BLEND_EQUATION_RGB: *params = mBlend.blendEquationRGB; break;
1234 case GL_BLEND_EQUATION_ALPHA: *params = mBlend.blendEquationAlpha; break;
1235 case GL_STENCIL_WRITEMASK: *params = clampToInt(mDepthStencil.stencilWritemask); break;
1236 case GL_STENCIL_BACK_WRITEMASK: *params = clampToInt(mDepthStencil.stencilBackWritemask); break;
1237 case GL_STENCIL_CLEAR_VALUE: *params = mStencilClearValue; break;
1238 case GL_SAMPLE_BUFFERS:
1241 gl::Framebuffer *framebuffer = mDrawFramebuffer;
1242 if (framebuffer->completeness() == GL_FRAMEBUFFER_COMPLETE)
1246 case GL_SAMPLE_BUFFERS:
1247 if (framebuffer->getSamples() != 0)
1257 *params = framebuffer->getSamples();
1268 params[0] = mViewport.x;
1269 params[1] = mViewport.y;
1270 params[2] = mViewport.width;
1271 params[3] = mViewport.height;
1273 case GL_SCISSOR_BOX:
1274 params[0] = mScissor.x;
1275 params[1] = mScissor.y;
1276 params[2] = mScissor.width;
1277 params[3] = mScissor.height;
1279 case GL_CULL_FACE_MODE: *params = mRasterizer.cullMode; break;
1280 case GL_FRONT_FACE: *params = mRasterizer.frontFace; break;
1286 gl::Framebuffer *framebuffer = getDrawFramebuffer();
1287 gl::FramebufferAttachment *colorbuffer = framebuffer->getFirstColorbuffer();
1293 case GL_RED_BITS: *params = colorbuffer->getRedSize(); break;
1294 case GL_GREEN_BITS: *params = colorbuffer->getGreenSize(); break;
1295 case GL_BLUE_BITS: *params = colorbuffer->getBlueSize(); break;
1296 case GL_ALPHA_BITS: *params = colorbuffer->getAlphaSize(); break;
1307 gl::Framebuffer *framebuffer = getDrawFramebuffer();
1308 gl::FramebufferAttachment *depthbuffer = framebuffer->getDepthbuffer();
1312 *params = depthbuffer->getDepthSize();
1320 case GL_STENCIL_BITS:
1322 gl::Framebuffer *framebuffer = getDrawFramebuffer();
1323 gl::FramebufferAttachment *stencilbuffer = framebuffer->getStencilbuffer();
1327 *params = stencilbuffer->getStencilSize();
1335 case GL_TEXTURE_BINDING_2D:
1336 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
1337 *params = mSamplerTextures.at(GL_TEXTURE_2D)[mActiveSampler].id();
1339 case GL_TEXTURE_BINDING_CUBE_MAP:
1340 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
1341 *params = mSamplerTextures.at(GL_TEXTURE_CUBE_MAP)[mActiveSampler].id();
1343 case GL_TEXTURE_BINDING_3D:
1344 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
1345 *params = mSamplerTextures.at(GL_TEXTURE_3D)[mActiveSampler].id();
1347 case GL_TEXTURE_BINDING_2D_ARRAY:
1348 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
1349 *params = mSamplerTextures.at(GL_TEXTURE_2D_ARRAY)[mActiveSampler].id();
1351 case GL_UNIFORM_BUFFER_BINDING:
1352 *params = mGenericUniformBuffer.id();
1354 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
1355 *params = mGenericTransformFeedbackBuffer.id();
1357 case GL_COPY_READ_BUFFER_BINDING:
1358 *params = mCopyReadBuffer.id();
1360 case GL_COPY_WRITE_BUFFER_BINDING:
1361 *params = mCopyWriteBuffer.id();
1363 case GL_PIXEL_PACK_BUFFER_BINDING:
1364 *params = mPack.pixelBuffer.id();
1366 case GL_PIXEL_UNPACK_BUFFER_BINDING:
1367 *params = mUnpack.pixelBuffer.id();
1375 bool State::getIndexedIntegerv(GLenum target, GLuint index, GLint *data)
1379 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
1380 if (static_cast<size_t>(index) < mTransformFeedbackBuffers.size())
1382 *data = mTransformFeedbackBuffers[index].id();
1385 case GL_UNIFORM_BUFFER_BINDING:
1386 if (static_cast<size_t>(index) < mUniformBuffers.size())
1388 *data = mUniformBuffers[index].id();
1398 bool State::getIndexedInteger64v(GLenum target, GLuint index, GLint64 *data)
1402 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
1403 if (static_cast<size_t>(index) < mTransformFeedbackBuffers.size())
1405 *data = mTransformFeedbackBuffers[index].getOffset();
1408 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
1409 if (static_cast<size_t>(index) < mTransformFeedbackBuffers.size())
1411 *data = mTransformFeedbackBuffers[index].getSize();
1414 case GL_UNIFORM_BUFFER_START:
1415 if (static_cast<size_t>(index) < mUniformBuffers.size())
1417 *data = mUniformBuffers[index].getOffset();
1420 case GL_UNIFORM_BUFFER_SIZE:
1421 if (static_cast<size_t>(index) < mUniformBuffers.size())
1423 *data = mUniformBuffers[index].getSize();
1433 bool State::hasMappedBuffer(GLenum target) const
1435 if (target == GL_ARRAY_BUFFER)
1437 for (size_t attribIndex = 0; attribIndex < mVertexAttribCurrentValues.size(); attribIndex++)
1439 const gl::VertexAttribute &vertexAttrib = getVertexAttribState(static_cast<unsigned int>(attribIndex));
1440 gl::Buffer *boundBuffer = vertexAttrib.buffer.get();
1441 if (vertexAttrib.enabled && boundBuffer && boundBuffer->isMapped())
1451 Buffer *buffer = getTargetBuffer(target);
1452 return (buffer && buffer->isMapped());