OSDN Git Service

Make Blitter part of Renderer.
[android-x86/external-swiftshader.git] / src / OpenGL / libGLESv2 / Context.h
index f638c05..bbe6ddd 100644 (file)
@@ -37,7 +37,6 @@
 namespace egl
 {
 class Display;
-class Surface;
 class Config;
 }
 
@@ -77,7 +76,7 @@ enum
        MAX_VERTEX_ATTRIBS = sw::MAX_VERTEX_INPUTS,
        MAX_UNIFORM_VECTORS = 256,   // Device limit
        MAX_VERTEX_UNIFORM_VECTORS = sw::VERTEX_UNIFORM_VECTORS - 3,   // Reserve space for gl_DepthRange
-       MAX_VARYING_VECTORS = 10,
+       MAX_VARYING_VECTORS = MIN(sw::MAX_FRAGMENT_INPUTS, sw::MAX_VERTEX_OUTPUTS),
        MAX_TEXTURE_IMAGE_UNITS = sw::TEXTURE_IMAGE_UNITS,
        MAX_VERTEX_TEXTURE_IMAGE_UNITS = sw::VERTEX_TEXTURE_IMAGE_UNITS,
        MAX_COMBINED_TEXTURE_IMAGE_UNITS = MAX_TEXTURE_IMAGE_UNITS + MAX_VERTEX_TEXTURE_IMAGE_UNITS,
@@ -103,6 +102,7 @@ enum
        MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS = 4,
        MAX_UNIFORM_BUFFER_BINDINGS = sw::MAX_UNIFORM_BUFFER_BINDINGS,
        UNIFORM_BUFFER_OFFSET_ALIGNMENT = 1,
+       NUM_PROGRAM_BINARY_FORMATS = 0,
 };
 
 const GLenum compressedTextureFormats[] =
@@ -195,7 +195,7 @@ public:
                mCurrentValue[1].f = 0.0f;
                mCurrentValue[2].f = 0.0f;
                mCurrentValue[3].f = 1.0f;
-               mCurrentValueType = ValueUnion::FloatType;
+               mCurrentValueType = GL_FLOAT;
        }
 
        int typeSize() const
@@ -217,6 +217,11 @@ public:
                }
        }
 
+       GLenum currentValueType() const
+       {
+               return mCurrentValueType;
+       }
+
        GLsizei stride() const
        {
                return mStride ? mStride : typeSize();
@@ -231,9 +236,9 @@ public:
        {
                switch(mCurrentValueType)
                {
-               case ValueUnion::FloatType:     return mCurrentValue[i].f;
-               case ValueUnion::IntType:       return static_cast<float>(mCurrentValue[i].i);
-               case ValueUnion::UIntType:      return static_cast<float>(mCurrentValue[i].ui);
+               case GL_FLOAT:        return mCurrentValue[i].f;
+               case GL_INT:          return static_cast<float>(mCurrentValue[i].i);
+               case GL_UNSIGNED_INT: return static_cast<float>(mCurrentValue[i].ui);
                default: UNREACHABLE(mCurrentValueType); return mCurrentValue[i].f;
                }
        }
@@ -242,9 +247,9 @@ public:
        {
                switch(mCurrentValueType)
                {
-               case ValueUnion::FloatType:     return static_cast<GLint>(mCurrentValue[i].f);
-               case ValueUnion::IntType:       return mCurrentValue[i].i;
-               case ValueUnion::UIntType:      return static_cast<GLint>(mCurrentValue[i].ui);
+               case GL_FLOAT:        return static_cast<GLint>(mCurrentValue[i].f);
+               case GL_INT:          return mCurrentValue[i].i;
+               case GL_UNSIGNED_INT: return static_cast<GLint>(mCurrentValue[i].ui);
                default: UNREACHABLE(mCurrentValueType); return mCurrentValue[i].i;
                }
        }
@@ -253,9 +258,9 @@ public:
        {
                switch(mCurrentValueType)
                {
-               case ValueUnion::FloatType:     return static_cast<GLuint>(mCurrentValue[i].f);
-               case ValueUnion::IntType:       return static_cast<GLuint>(mCurrentValue[i].i);
-               case ValueUnion::UIntType:      return mCurrentValue[i].ui;
+               case GL_FLOAT:        return static_cast<GLuint>(mCurrentValue[i].f);
+               case GL_INT:          return static_cast<GLuint>(mCurrentValue[i].i);
+               case GL_UNSIGNED_INT: return mCurrentValue[i].ui;
                default: UNREACHABLE(mCurrentValueType); return mCurrentValue[i].ui;
                }
        }
@@ -266,7 +271,7 @@ public:
                mCurrentValue[1].f = values[1];
                mCurrentValue[2].f = values[2];
                mCurrentValue[3].f = values[3];
-               mCurrentValueType = ValueUnion::FloatType;
+               mCurrentValueType = GL_FLOAT;
        }
 
        inline void setCurrentValue(const GLint *values)
@@ -275,7 +280,7 @@ public:
                mCurrentValue[1].i = values[1];
                mCurrentValue[2].i = values[2];
                mCurrentValue[3].i = values[3];
-               mCurrentValueType = ValueUnion::IntType;
+               mCurrentValueType = GL_INT;
        }
 
        inline void setCurrentValue(const GLuint *values)
@@ -284,7 +289,7 @@ public:
                mCurrentValue[1].ui = values[1];
                mCurrentValue[2].ui = values[2];
                mCurrentValue[3].ui = values[3];
-               mCurrentValueType = ValueUnion::UIntType;
+               mCurrentValueType = GL_UNSIGNED_INT;
        }
 
        // From glVertexAttribPointer
@@ -307,15 +312,13 @@ public:
 private:
        union ValueUnion
        {
-               enum Type { FloatType, IntType, UIntType };
-
                float f;
                GLint i;
                GLuint ui;
        };
 
        ValueUnion mCurrentValue[4];   // From glVertexAttrib
-       ValueUnion::Type mCurrentValueType;
+       GLenum mCurrentValueType;
 };
 
 typedef VertexAttribute VertexAttributeArray[MAX_VERTEX_ATTRIBS];
@@ -422,13 +425,14 @@ struct State
        GLint packSkipImages;
 };
 
-class Context : public egl::Context
+class [[clang::lto_visibility_public]] Context : public egl::Context
 {
 public:
-       Context(egl::Display *display, const Context *shareContext, EGLint clientVersion);
+       Context(egl::Display *display, const Context *shareContext, EGLint clientVersion, const egl::Config *config);
 
-       virtual void makeCurrent(egl::Surface *surface);
-       virtual EGLint getClientVersion() const;
+       void makeCurrent(gl::Surface *surface) override;
+       EGLint getClientVersion() const override;
+       EGLint getConfigID() const override;
 
        void markAllStateDirty();
 
@@ -660,6 +664,9 @@ public:
 
        bool hasZeroDivisor() const;
 
+       void drawArrays(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount = 1);
+       void drawElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLsizei instanceCount = 1);
+       void blit(sw::Surface *source, const sw::SliceRect &sRect, sw::Surface *dest, const sw::SliceRect &dRect) override;
        void readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei *bufSize, void* pixels);
        void clear(GLbitfield mask);
        void clearColorBuffer(GLint drawbuffer, const GLint *value);
@@ -667,9 +674,7 @@ public:
        void clearColorBuffer(GLint drawbuffer, const GLfloat *value);
        void clearDepthBuffer(const GLfloat value);
        void clearStencilBuffer(const GLint value);
-       void drawArrays(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount = 1);
-       void drawElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLsizei instanceCount = 1);
-       void finish();
+       void finish() override;
        void flush();
 
        void recordInvalidEnum();
@@ -684,19 +689,19 @@ public:
 
        void blitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
                             GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
-                            GLbitfield mask, bool filter);
+                            GLbitfield mask, bool filter, bool allowPartialDepthStencilBlit);
 
-       virtual void bindTexImage(egl::Surface *surface);
-       virtual EGLenum validateSharedImage(EGLenum target, GLuint name, GLuint textureLevel);
-       virtual egl::Image *createSharedImage(EGLenum target, GLuint name, GLuint textureLevel);
+       void bindTexImage(gl::Surface *surface) override;
+       EGLenum validateSharedImage(EGLenum target, GLuint name, GLuint textureLevel) override;
+       egl::Image *createSharedImage(EGLenum target, GLuint name, GLuint textureLevel) override;
        egl::Image *getSharedImage(GLeglImageOES image);
 
        Device *getDevice();
 
-       const GLubyte* getExtensions(GLuint index, GLuint* numExt = nullptr) const;
+       const GLubyte *getExtensions(GLuint index, GLuint *numExt = nullptr) const;
 
 private:
-       virtual ~Context();
+       ~Context() override;
 
        void applyScissor(int width, int height);
        bool applyRenderTarget();
@@ -721,6 +726,7 @@ private:
        Query *createQuery(GLuint handle, GLenum type);
 
        const EGLint clientVersion;
+       const egl::Config *const config;
 
        State mState;