// // Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // Context.h: Defines the gl::Context class, managing all GL state and performing // rendering operations. It is the GLES2 specific implementation of EGLContext. #ifndef LIBGLESV2_CONTEXT_H_ #define LIBGLESV2_CONTEXT_H_ #include "common/angleutils.h" #include "common/RefCountObject.h" #include "libGLESv2/Caps.h" #include "libGLESv2/Error.h" #include "libGLESv2/HandleAllocator.h" #include "libGLESv2/angletypes.h" #include "libGLESv2/Constants.h" #include "libGLESv2/VertexAttribute.h" #include "libGLESv2/State.h" #include "angle_gl.h" #include #include #include #include #include namespace rx { class Renderer; } namespace egl { class Surface; } namespace gl { class Shader; class Program; class ProgramBinary; class Texture; class Texture2D; class TextureCubeMap; class Texture3D; class Texture2DArray; class Framebuffer; class Renderbuffer; class RenderbufferStorage; class Colorbuffer; class Depthbuffer; class Stencilbuffer; class DepthStencilbuffer; class FenceNV; class FenceSync; class Query; class ResourceManager; class Buffer; struct VertexAttribute; class VertexArray; class Sampler; class TransformFeedback; class Context { public: Context(int clientVersion, const gl::Context *shareContext, rx::Renderer *renderer, bool notifyResets, bool robustAccess); virtual ~Context(); void makeCurrent(egl::Surface *surface); virtual void markContextLost(); bool isContextLost(); // These create and destroy methods are merely pass-throughs to // ResourceManager, which owns these object types GLuint createBuffer(); GLuint createShader(GLenum type); GLuint createProgram(); GLuint createTexture(); GLuint createRenderbuffer(); GLuint createSampler(); GLuint createTransformFeedback(); GLsync createFenceSync(GLenum condition); void deleteBuffer(GLuint buffer); void deleteShader(GLuint shader); void deleteProgram(GLuint program); void deleteTexture(GLuint texture); void deleteRenderbuffer(GLuint renderbuffer); void deleteSampler(GLuint sampler); void deleteTransformFeedback(GLuint transformFeedback); void deleteFenceSync(GLsync fenceSync); // Framebuffers are owned by the Context, so these methods do not pass through GLuint createFramebuffer(); void deleteFramebuffer(GLuint framebuffer); // NV Fences are owned by the Context. GLuint createFenceNV(); void deleteFenceNV(GLuint fence); // Queries are owned by the Context; GLuint createQuery(); void deleteQuery(GLuint query); // Vertex arrays are owned by the Context GLuint createVertexArray(); void deleteVertexArray(GLuint vertexArray); void bindArrayBuffer(GLuint buffer); void bindElementArrayBuffer(GLuint buffer); void bindTexture(GLenum target, GLuint texture); void bindReadFramebuffer(GLuint framebuffer); void bindDrawFramebuffer(GLuint framebuffer); void bindRenderbuffer(GLuint renderbuffer); void bindVertexArray(GLuint vertexArray); void bindSampler(GLuint textureUnit, GLuint sampler); void bindGenericUniformBuffer(GLuint buffer); void bindIndexedUniformBuffer(GLuint buffer, GLuint index, GLintptr offset, GLsizeiptr size); void bindGenericTransformFeedbackBuffer(GLuint buffer); void bindIndexedTransformFeedbackBuffer(GLuint buffer, GLuint index, GLintptr offset, GLsizeiptr size); void bindCopyReadBuffer(GLuint buffer); void bindCopyWriteBuffer(GLuint buffer); void bindPixelPackBuffer(GLuint buffer); void bindPixelUnpackBuffer(GLuint buffer); void useProgram(GLuint program); void linkProgram(GLuint program); void setProgramBinary(GLuint program, GLenum binaryFormat, const void *binary, GLint length); void bindTransformFeedback(GLuint transformFeedback); Error beginQuery(GLenum target, GLuint query); Error endQuery(GLenum target); void setFramebufferZero(Framebuffer *framebuffer); void setRenderbufferStorage(GLsizei width, GLsizei height, GLenum internalformat, GLsizei samples); void setVertexAttribDivisor(GLuint index, GLuint divisor); void samplerParameteri(GLuint sampler, GLenum pname, GLint param); void samplerParameterf(GLuint sampler, GLenum pname, GLfloat param); GLint getSamplerParameteri(GLuint sampler, GLenum pname); GLfloat getSamplerParameterf(GLuint sampler, GLenum pname); Buffer *getBuffer(GLuint handle); FenceNV *getFenceNV(GLuint handle); FenceSync *getFenceSync(GLsync handle) const; Shader *getShader(GLuint handle) const; Program *getProgram(GLuint handle) const; Texture *getTexture(GLuint handle) const; Framebuffer *getFramebuffer(GLuint handle) const; Renderbuffer *getRenderbuffer(GLuint handle); VertexArray *getVertexArray(GLuint handle) const; Sampler *getSampler(GLuint handle) const; Query *getQuery(GLuint handle, bool create, GLenum type); TransformFeedback *getTransformFeedback(GLuint handle) const; Texture *getTargetTexture(GLenum target) const; Texture2D *getTexture2D() const; TextureCubeMap *getTextureCubeMap() const; Texture3D *getTexture3D() const; Texture2DArray *getTexture2DArray() const; Texture *getSamplerTexture(unsigned int sampler, GLenum type) const; bool isSampler(GLuint samplerName) const; void getBooleanv(GLenum pname, GLboolean *params); void getFloatv(GLenum pname, GLfloat *params); void getIntegerv(GLenum pname, GLint *params); void getInteger64v(GLenum pname, GLint64 *params); bool getIndexedIntegerv(GLenum target, GLuint index, GLint *data); bool getIndexedInteger64v(GLenum target, GLuint index, GLint64 *data); bool getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams); bool getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned int *numParams); Error clear(GLbitfield mask); Error clearBufferfv(GLenum buffer, int drawbuffer, const float *values); Error clearBufferuiv(GLenum buffer, int drawbuffer, const unsigned int *values); Error clearBufferiv(GLenum buffer, int drawbuffer, const int *values); Error clearBufferfi(GLenum buffer, int drawbuffer, float depth, int stencil); Error readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei *bufSize, void* pixels); Error drawArrays(GLenum mode, GLint first, GLsizei count, GLsizei instances); Error drawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instances, const rx::RangeUI &indexRange); void sync(bool block); // flush/finish void recordError(const Error &error); GLenum getError(); GLenum getResetStatus(); virtual bool isResetNotificationEnabled(); virtual int getClientVersion() const; const Caps &getCaps() const; const TextureCapsMap &getTextureCaps() const; const Extensions &getExtensions() const; const std::string &getRendererString() const; const std::string &getExtensionString() const; const std::string &getExtensionString(size_t idx) const; size_t getExtensionStringCount() const; void getCurrentReadFormatType(GLenum *internalFormat, GLenum *format, GLenum *type); void blitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); rx::Renderer *getRenderer() { return mRenderer; } State &getState() { return mState; } const State &getState() const { return mState; } void releaseShaderCompiler(); private: DISALLOW_COPY_AND_ASSIGN(Context); // TODO: std::array may become unavailable using older versions of GCC typedef std::array FramebufferTextureSerialArray; Error applyRenderTarget(GLenum drawMode, bool ignoreViewport); Error applyState(GLenum drawMode); Error applyShaders(ProgramBinary *programBinary, bool transformFeedbackActive); Error applyTextures(ProgramBinary *programBinary, SamplerType shaderType, const FramebufferTextureSerialArray &framebufferSerials, size_t framebufferSerialCount); Error applyTextures(ProgramBinary *programBinary); Error applyUniformBuffers(); bool applyTransformFeedbackBuffers(); void markTransformFeedbackUsage(); void detachBuffer(GLuint buffer); void detachTexture(GLuint texture); void detachFramebuffer(GLuint framebuffer); void detachRenderbuffer(GLuint renderbuffer); void detachVertexArray(GLuint vertexArray); void detachTransformFeedback(GLuint transformFeedback); void detachSampler(GLuint sampler); Error generateSwizzles(ProgramBinary *programBinary, SamplerType type); Error generateSwizzles(ProgramBinary *programBinary); Texture *getIncompleteTexture(GLenum type); bool skipDraw(GLenum drawMode); void initRendererString(); void initExtensionStrings(); size_t getBoundFramebufferTextureSerials(FramebufferTextureSerialArray *outSerialArray); void initCaps(GLuint clientVersion); // Caps to use for validation Caps mCaps; TextureCapsMap mTextureCaps; Extensions mExtensions; rx::Renderer *const mRenderer; State mState; int mClientVersion; typedef std::map< GLenum, BindingPointer > TextureMap; TextureMap mZeroTextures; TextureMap mIncompleteTextures; typedef std::unordered_map FramebufferMap; FramebufferMap mFramebufferMap; HandleAllocator mFramebufferHandleAllocator; typedef std::unordered_map FenceNVMap; FenceNVMap mFenceNVMap; HandleAllocator mFenceNVHandleAllocator; typedef std::unordered_map QueryMap; QueryMap mQueryMap; HandleAllocator mQueryHandleAllocator; typedef std::unordered_map VertexArrayMap; VertexArrayMap mVertexArrayMap; HandleAllocator mVertexArrayHandleAllocator; BindingPointer mTransformFeedbackZero; typedef std::unordered_map TransformFeedbackMap; TransformFeedbackMap mTransformFeedbackMap; HandleAllocator mTransformFeedbackAllocator; std::string mRendererString; std::string mExtensionString; std::vector mExtensionStrings; // Recorded errors typedef std::set ErrorSet; ErrorSet mErrors; // Current/lost context flags bool mHasBeenCurrent; bool mContextLost; GLenum mResetStatus; GLenum mResetStrategy; bool mRobustAccess; ResourceManager *mResourceManager; }; } #endif // INCLUDE_CONTEXT_H_