namespace egl
{
class Display;
-class Surface;
class Config;
}
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,
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[] =
mCurrentValue[1].f = 0.0f;
mCurrentValue[2].f = 0.0f;
mCurrentValue[3].f = 1.0f;
- mCurrentValueType = ValueUnion::FloatType;
+ mCurrentValueType = GL_FLOAT;
}
int typeSize() const
}
}
+ GLenum currentValueType() const
+ {
+ return mCurrentValueType;
+ }
+
GLsizei stride() const
{
return mStride ? mStride : typeSize();
{
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;
}
}
{
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;
}
}
{
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;
}
}
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)
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)
mCurrentValue[1].ui = values[1];
mCurrentValue[2].ui = values[2];
mCurrentValue[3].ui = values[3];
- mCurrentValueType = ValueUnion::UIntType;
+ mCurrentValueType = GL_UNSIGNED_INT;
}
// From glVertexAttribPointer
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];
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();
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);
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();
void blitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
- GLbitfield mask);
+ 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();
Query *createQuery(GLuint handle, GLenum type);
const EGLint clientVersion;
+ const egl::Config *const config;
State mState;