1 // 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. 5 // 6 7 // State.h: Defines the State class, encapsulating raw GL state 8 9 #ifndef LIBGLESV2_STATE_H_ 10 #define LIBGLESV2_STATE_H_ 11 12 #include "common/angleutils.h" 13 #include "common/RefCountObject.h" 14 #include "libGLESv2/angletypes.h" 15 #include "libGLESv2/VertexAttribute.h" 16 #include "libGLESv2/Renderbuffer.h" 17 #include "libGLESv2/Texture.h" 18 #include "libGLESv2/TransformFeedback.h" 19 #include "libGLESv2/Program.h" 20 #include "libGLESv2/Sampler.h" 21 22 namespace gl 23 { 24 class Query; 25 class VertexArray; 26 class Context; 27 struct Caps; 28 29 class State 30 { 31 public: 32 State(); 33 ~State(); 34 35 void initialize(const Caps& caps, GLuint clientVersion); 36 void reset(); 37 setContext(Context * context)38 void setContext(Context *context) { mContext = context; } 39 40 // State chunk getters 41 const RasterizerState &getRasterizerState() const; 42 const BlendState &getBlendState() const; 43 const DepthStencilState &getDepthStencilState() const; 44 45 // Clear behavior setters & state parameter block generation function 46 void setClearColor(float red, float green, float blue, float alpha); 47 void setClearDepth(float depth); 48 void setClearStencil(int stencil); 49 ClearParameters getClearParameters(GLbitfield mask) const; 50 51 // Write mask manipulation 52 void setColorMask(bool red, bool green, bool blue, bool alpha); 53 void setDepthMask(bool mask); 54 55 // Discard toggle & query 56 bool isRasterizerDiscardEnabled() const; 57 void setRasterizerDiscard(bool enabled); 58 59 // Face culling state manipulation 60 bool isCullFaceEnabled() const; 61 void setCullFace(bool enabled); 62 void setCullMode(GLenum mode); 63 void setFrontFace(GLenum front); 64 65 // Depth test state manipulation 66 bool isDepthTestEnabled() const; 67 void setDepthTest(bool enabled); 68 void setDepthFunc(GLenum depthFunc); 69 void setDepthRange(float zNear, float zFar); 70 void getDepthRange(float *zNear, float *zFar) const; 71 72 // Blend state manipulation 73 bool isBlendEnabled() const; 74 void setBlend(bool enabled); 75 void setBlendFactors(GLenum sourceRGB, GLenum destRGB, GLenum sourceAlpha, GLenum destAlpha); 76 void setBlendColor(float red, float green, float blue, float alpha); 77 void setBlendEquation(GLenum rgbEquation, GLenum alphaEquation); 78 const ColorF &getBlendColor() const; 79 80 // Stencil state maniupulation 81 bool isStencilTestEnabled() const; 82 void setStencilTest(bool enabled); 83 void setStencilParams(GLenum stencilFunc, GLint stencilRef, GLuint stencilMask); 84 void setStencilBackParams(GLenum stencilBackFunc, GLint stencilBackRef, GLuint stencilBackMask); 85 void setStencilWritemask(GLuint stencilWritemask); 86 void setStencilBackWritemask(GLuint stencilBackWritemask); 87 void setStencilOperations(GLenum stencilFail, GLenum stencilPassDepthFail, GLenum stencilPassDepthPass); 88 void setStencilBackOperations(GLenum stencilBackFail, GLenum stencilBackPassDepthFail, GLenum stencilBackPassDepthPass); 89 GLint getStencilRef() const; 90 GLint getStencilBackRef() const; 91 92 // Depth bias/polygon offset state manipulation 93 bool isPolygonOffsetFillEnabled() const; 94 void setPolygonOffsetFill(bool enabled); 95 void setPolygonOffsetParams(GLfloat factor, GLfloat units); 96 97 // Multisample coverage state manipulation 98 bool isSampleAlphaToCoverageEnabled() const; 99 void setSampleAlphaToCoverage(bool enabled); 100 bool isSampleCoverageEnabled() const; 101 void setSampleCoverage(bool enabled); 102 void setSampleCoverageParams(GLclampf value, bool invert); 103 void getSampleCoverageParams(GLclampf *value, bool *invert); 104 105 // Scissor test state toggle & query 106 bool isScissorTestEnabled() const; 107 void setScissorTest(bool enabled); 108 void setScissorParams(GLint x, GLint y, GLsizei width, GLsizei height); 109 const Rectangle &getScissor() const; 110 111 // Dither state toggle & query 112 bool isDitherEnabled() const; 113 void setDither(bool enabled); 114 115 // Generic state toggle & query 116 void setEnableFeature(GLenum feature, bool enabled); 117 bool getEnableFeature(GLenum feature); 118 119 // Line width state setter 120 void setLineWidth(GLfloat width); 121 122 // Hint setters 123 void setGenerateMipmapHint(GLenum hint); 124 void setFragmentShaderDerivativeHint(GLenum hint); 125 126 // Viewport state setter/getter 127 void setViewportParams(GLint x, GLint y, GLsizei width, GLsizei height); 128 const Rectangle &getViewport() const; 129 130 // Texture binding & active texture unit manipulation 131 void setActiveSampler(unsigned int active); 132 unsigned int getActiveSampler() const; 133 void setSamplerTexture(GLenum type, Texture *texture); 134 Texture *getSamplerTexture(unsigned int sampler, GLenum type) const; 135 GLuint getSamplerTextureId(unsigned int sampler, GLenum type) const; 136 void detachTexture(GLuint texture); 137 138 // Sampler object binding manipulation 139 void setSamplerBinding(GLuint textureUnit, Sampler *sampler); 140 GLuint getSamplerId(GLuint textureUnit) const; 141 Sampler *getSampler(GLuint textureUnit) const; 142 void detachSampler(GLuint sampler); 143 144 // Renderbuffer binding manipulation 145 void setRenderbufferBinding(Renderbuffer *renderbuffer); 146 GLuint getRenderbufferId() const; 147 Renderbuffer *getCurrentRenderbuffer(); 148 void detachRenderbuffer(GLuint renderbuffer); 149 150 // Framebuffer binding manipulation 151 void setReadFramebufferBinding(Framebuffer *framebuffer); 152 void setDrawFramebufferBinding(Framebuffer *framebuffer); 153 Framebuffer *getTargetFramebuffer(GLenum target) const; 154 Framebuffer *getReadFramebuffer(); 155 Framebuffer *getDrawFramebuffer(); 156 const Framebuffer *getReadFramebuffer() const; 157 const Framebuffer *getDrawFramebuffer() const; 158 bool removeReadFramebufferBinding(GLuint framebuffer); 159 bool removeDrawFramebufferBinding(GLuint framebuffer); 160 161 // Vertex array object binding manipulation 162 void setVertexArrayBinding(VertexArray *vertexArray); 163 GLuint getVertexArrayId() const; 164 VertexArray *getVertexArray() const; 165 bool removeVertexArrayBinding(GLuint vertexArray); 166 167 // Program binding manipulation 168 void setCurrentProgram(GLuint programId, Program *newProgram); 169 void setCurrentProgramBinary(ProgramBinary *binary); 170 GLuint getCurrentProgramId() const; 171 ProgramBinary *getCurrentProgramBinary() const; 172 173 // Transform feedback object (not buffer) binding manipulation 174 void setTransformFeedbackBinding(TransformFeedback *transformFeedback); 175 TransformFeedback *getCurrentTransformFeedback() const; 176 void detachTransformFeedback(GLuint transformFeedback); 177 178 // Query binding manipulation 179 bool isQueryActive() const; 180 void setActiveQuery(GLenum target, Query *query); 181 GLuint getActiveQueryId(GLenum target) const; 182 Query *getActiveQuery(GLenum target) const; 183 184 //// Typed buffer binding point manipulation //// 185 // GL_ARRAY_BUFFER 186 void setArrayBufferBinding(Buffer *buffer); 187 GLuint getArrayBufferId() const; 188 bool removeArrayBufferBinding(GLuint buffer); 189 190 // GL_UNIFORM_BUFFER - Both indexed and generic targets 191 void setGenericUniformBufferBinding(Buffer *buffer); 192 void setIndexedUniformBufferBinding(GLuint index, Buffer *buffer, GLintptr offset, GLsizeiptr size); 193 GLuint getIndexedUniformBufferId(GLuint index) const; 194 Buffer *getIndexedUniformBuffer(GLuint index) const; 195 196 // GL_TRANSFORM_FEEDBACK_BUFFER - Both indexed and generic targets 197 void setGenericTransformFeedbackBufferBinding(Buffer *buffer); 198 void setIndexedTransformFeedbackBufferBinding(GLuint index, Buffer *buffer, GLintptr offset, GLsizeiptr size); 199 GLuint getIndexedTransformFeedbackBufferId(GLuint index) const; 200 Buffer *getIndexedTransformFeedbackBuffer(GLuint index) const; 201 GLuint getIndexedTransformFeedbackBufferOffset(GLuint index) const; 202 203 // GL_COPY_[READ/WRITE]_BUFFER 204 void setCopyReadBufferBinding(Buffer *buffer); 205 void setCopyWriteBufferBinding(Buffer *buffer); 206 207 // GL_PIXEL[PACK/UNPACK]_BUFFER 208 void setPixelPackBufferBinding(Buffer *buffer); 209 void setPixelUnpackBufferBinding(Buffer *buffer); 210 211 // Retrieve typed buffer by target (non-indexed) 212 Buffer *getTargetBuffer(GLenum target) const; 213 214 // Vertex attrib manipulation 215 void setEnableVertexAttribArray(unsigned int attribNum, bool enabled); 216 void setVertexAttribf(GLuint index, const GLfloat values[4]); 217 void setVertexAttribu(GLuint index, const GLuint values[4]); 218 void setVertexAttribi(GLuint index, const GLint values[4]); 219 void setVertexAttribState(unsigned int attribNum, Buffer *boundBuffer, GLint size, GLenum type, 220 bool normalized, bool pureInteger, GLsizei stride, const void *pointer); 221 const VertexAttribute &getVertexAttribState(unsigned int attribNum) const; 222 const VertexAttribCurrentValueData &getVertexAttribCurrentValue(unsigned int attribNum) const; 223 const VertexAttribCurrentValueData *getVertexAttribCurrentValues() const; 224 const void *getVertexAttribPointer(unsigned int attribNum) const; 225 226 // Pixel pack state manipulation 227 void setPackAlignment(GLint alignment); 228 GLint getPackAlignment() const; 229 void setPackReverseRowOrder(bool reverseRowOrder); 230 bool getPackReverseRowOrder() const; 231 const PixelPackState &getPackState() const; 232 233 // Pixel unpack state manipulation 234 void setUnpackAlignment(GLint alignment); 235 GLint getUnpackAlignment() const; 236 const PixelUnpackState &getUnpackState() const; 237 238 // State query functions 239 void getBooleanv(GLenum pname, GLboolean *params); 240 void getFloatv(GLenum pname, GLfloat *params); 241 void getIntegerv(GLenum pname, GLint *params); 242 bool getIndexedIntegerv(GLenum target, GLuint index, GLint *data); 243 bool getIndexedInteger64v(GLenum target, GLuint index, GLint64 *data); 244 245 bool hasMappedBuffer(GLenum target) const; 246 247 private: 248 DISALLOW_COPY_AND_ASSIGN(State); 249 250 Context *mContext; 251 252 ColorF mColorClearValue; 253 GLclampf mDepthClearValue; 254 int mStencilClearValue; 255 256 RasterizerState mRasterizer; 257 bool mScissorTest; 258 Rectangle mScissor; 259 260 BlendState mBlend; 261 ColorF mBlendColor; 262 bool mSampleCoverage; 263 GLclampf mSampleCoverageValue; 264 bool mSampleCoverageInvert; 265 266 DepthStencilState mDepthStencil; 267 GLint mStencilRef; 268 GLint mStencilBackRef; 269 270 GLfloat mLineWidth; 271 272 GLenum mGenerateMipmapHint; 273 GLenum mFragmentShaderDerivativeHint; 274 275 Rectangle mViewport; 276 float mNearZ; 277 float mFarZ; 278 279 BindingPointer<Buffer> mArrayBuffer; 280 Framebuffer *mReadFramebuffer; 281 Framebuffer *mDrawFramebuffer; 282 BindingPointer<Renderbuffer> mRenderbuffer; 283 GLuint mCurrentProgramId; 284 BindingPointer<ProgramBinary> mCurrentProgramBinary; 285 286 VertexAttribCurrentValueData mVertexAttribCurrentValues[MAX_VERTEX_ATTRIBS]; // From glVertexAttrib 287 VertexArray *mVertexArray; 288 289 // Texture and sampler bindings 290 size_t mActiveSampler; // Active texture unit selector - GL_TEXTURE0 291 292 typedef std::vector< BindingPointer<Texture> > TextureBindingVector; 293 typedef std::map<GLenum, TextureBindingVector> TextureBindingMap; 294 TextureBindingMap mSamplerTextures; 295 296 typedef std::vector< BindingPointer<Sampler> > SamplerBindingVector; 297 SamplerBindingVector mSamplers; 298 299 typedef std::map< GLenum, BindingPointer<Query> > ActiveQueryMap; 300 ActiveQueryMap mActiveQueries; 301 302 BindingPointer<Buffer> mGenericUniformBuffer; 303 OffsetBindingPointer<Buffer> mUniformBuffers[IMPLEMENTATION_MAX_COMBINED_SHADER_UNIFORM_BUFFERS]; 304 305 BindingPointer<TransformFeedback> mTransformFeedback; 306 BindingPointer<Buffer> mGenericTransformFeedbackBuffer; 307 OffsetBindingPointer<Buffer> mTransformFeedbackBuffers[IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_BUFFERS]; 308 309 BindingPointer<Buffer> mCopyReadBuffer; 310 BindingPointer<Buffer> mCopyWriteBuffer; 311 312 PixelUnpackState mUnpack; 313 PixelPackState mPack; 314 }; 315 316 } 317 318 #endif // LIBGLESV2_STATE_H_ 319 320