// SwiftShader Software Renderer | |
// | |
// Copyright(c) 2005-2013 TransGaming Inc. | |
// | |
// All rights reserved. No part of this software may be copied, distributed, transmitted, | |
// transcribed, stored in a retrieval system, translated into any human or computer | |
// language by any means, or disclosed to third parties without the explicit written | |
// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express | |
// or implied, including but not limited to any patent rights, are granted to you. | |
// | |
// Context.h: Defines the 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 "Context.hpp" | |
#include "Image.hpp" | |
#include "Renderer/Sampler.hpp" | |
#define GL_APICALL | |
#include <GLES2/gl2.h> | |
#include <GLES2/gl2ext.h> | |
#define EGLAPI | |
#include <EGL/egl.h> | |
#include <map> | |
#include <string> | |
namespace egl | |
{ | |
class Display; | |
class Surface; | |
class Config; | |
} | |
namespace es2 | |
{ | |
class Device; | |
class Shader; | |
class Program; | |
class Texture; | |
class Texture2D; | |
class TextureCubeMap; | |
class TextureExternal; | |
class Fence; | |
enum | |
{ | |
MAX_VERTEX_ATTRIBS = 16, | |
MAX_UNIFORM_VECTORS = 256, // Device limit | |
MAX_VERTEX_UNIFORM_VECTORS = 256 - 3, // Reserve space for gl_DepthRange | |
MAX_VARYING_VECTORS = 10, | |
MAX_TEXTURE_IMAGE_UNITS = 16, | |
MAX_VERTEX_TEXTURE_IMAGE_UNITS = 4, | |
MAX_COMBINED_TEXTURE_IMAGE_UNITS = MAX_TEXTURE_IMAGE_UNITS + MAX_VERTEX_TEXTURE_IMAGE_UNITS, | |
MAX_FRAGMENT_UNIFORM_VECTORS = 224 - 3, // Reserve space for gl_DepthRange | |
MAX_DRAW_BUFFERS = 1, | |
IMPLEMENTATION_COLOR_READ_FORMAT = GL_RGB, | |
IMPLEMENTATION_COLOR_READ_TYPE = GL_UNSIGNED_SHORT_5_6_5 | |
}; | |
const float ALIASED_LINE_WIDTH_RANGE_MIN = 1.0f; | |
const float ALIASED_LINE_WIDTH_RANGE_MAX = 1.0f; | |
const float ALIASED_POINT_SIZE_RANGE_MIN = 0.125f; | |
const float ALIASED_POINT_SIZE_RANGE_MAX = 8192.0f; | |
const float MAX_TEXTURE_MAX_ANISOTROPY = 16.0f; | |
struct Color | |
{ | |
float red; | |
float green; | |
float blue; | |
float alpha; | |
}; | |
// Helper structure describing a single vertex attribute | |
class VertexAttribute | |
{ | |
public: | |
VertexAttribute() : mType(GL_FLOAT), mSize(0), mNormalized(false), mStride(0), mOffset(0), mArrayEnabled(false) | |
{ | |
} | |
int typeSize() const; | |
GLsizei stride() const | |
{ | |
return mStride ? mStride : typeSize(); | |
} | |
// From glVertexAttribPointer | |
GLenum mType; | |
GLint mSize; | |
bool mNormalized; | |
GLsizei mStride; // 0 means natural stride | |
intptr_t mOffset; | |
sw::Resource *buffer; | |
bool mArrayEnabled; // From glEnable/DisableVertexAttribArray | |
}; | |
typedef VertexAttribute VertexAttributeArray[MAX_VERTEX_ATTRIBS]; | |
// Helper structure to store all raw state | |
struct State | |
{ | |
Color colorClearValue; | |
GLclampf depthClearValue; | |
int stencilClearValue; | |
bool cullFace; | |
GLenum cullMode; | |
GLenum frontFace; | |
bool depthTest; | |
GLenum depthFunc; | |
bool blend; | |
GLenum sourceBlendRGB; | |
GLenum destBlendRGB; | |
GLenum sourceBlendAlpha; | |
GLenum destBlendAlpha; | |
GLenum blendEquationRGB; | |
GLenum blendEquationAlpha; | |
Color blendColor; | |
bool stencilTest; | |
GLenum stencilFunc; | |
GLint stencilRef; | |
GLuint stencilMask; | |
GLenum stencilFail; | |
GLenum stencilPassDepthFail; | |
GLenum stencilPassDepthPass; | |
GLuint stencilWritemask; | |
GLenum stencilBackFunc; | |
GLint stencilBackRef; | |
GLuint stencilBackMask; | |
GLenum stencilBackFail; | |
GLenum stencilBackPassDepthFail; | |
GLenum stencilBackPassDepthPass; | |
GLuint stencilBackWritemask; | |
bool polygonOffsetFill; | |
GLfloat polygonOffsetFactor; | |
GLfloat polygonOffsetUnits; | |
bool sampleAlphaToCoverage; | |
bool sampleCoverage; | |
GLclampf sampleCoverageValue; | |
bool sampleCoverageInvert; | |
bool scissorTest; | |
bool dither; | |
GLfloat lineWidth; | |
GLenum generateMipmapHint; | |
GLenum fragmentShaderDerivativeHint; | |
GLint viewportX; | |
GLint viewportY; | |
GLsizei viewportWidth; | |
GLsizei viewportHeight; | |
float zNear; | |
float zFar; | |
GLint scissorX; | |
GLint scissorY; | |
GLsizei scissorWidth; | |
GLsizei scissorHeight; | |
bool colorMaskRed; | |
bool colorMaskGreen; | |
bool colorMaskBlue; | |
bool colorMaskAlpha; | |
bool depthMask; | |
unsigned int activeSampler; // Active texture unit selector - GL_TEXTURE0 | |
sw::Resource *elementArrayBuffer; | |
GLuint readFramebuffer; | |
GLuint drawFramebuffer; | |
Program *program; | |
egl::Image *colorBuffer; | |
egl::Image *depthBuffer; | |
egl::Image *stencilBuffer; | |
VertexAttribute vertexAttribute[MAX_VERTEX_ATTRIBS]; | |
GLint unpackAlignment; | |
GLint packAlignment; | |
}; | |
class Context : public egl::Context | |
{ | |
public: | |
Context(const egl::Config *config, const Context *shareContext); | |
virtual void makeCurrent(egl::Surface *surface); | |
virtual void destroy(); | |
virtual int getClientVersion(); | |
void markAllStateDirty(); | |
// State manipulation | |
void setClearColor(float red, float green, float blue, float alpha); | |
void setClearDepth(float depth); | |
void setClearStencil(int stencil); | |
void setCullFace(bool enabled); | |
bool isCullFaceEnabled() const; | |
void setCullMode(GLenum mode); | |
void setFrontFace(GLenum front); | |
void setDepthTest(bool enabled); | |
bool isDepthTestEnabled() const; | |
void setDepthFunc(GLenum depthFunc); | |
void setDepthRange(float zNear, float zFar); | |
void setBlend(bool enabled); | |
bool isBlendEnabled() const; | |
void setBlendFactors(GLenum sourceRGB, GLenum destRGB, GLenum sourceAlpha, GLenum destAlpha); | |
void setBlendColor(float red, float green, float blue, float alpha); | |
void setBlendEquation(GLenum rgbEquation, GLenum alphaEquation); | |
void setStencilTest(bool enabled); | |
bool isStencilTestEnabled() const; | |
void setStencilParams(GLenum stencilFunc, GLint stencilRef, GLuint stencilMask); | |
void setStencilBackParams(GLenum stencilBackFunc, GLint stencilBackRef, GLuint stencilBackMask); | |
void setStencilWritemask(GLuint stencilWritemask); | |
void setStencilBackWritemask(GLuint stencilBackWritemask); | |
void setStencilOperations(GLenum stencilFail, GLenum stencilPassDepthFail, GLenum stencilPassDepthPass); | |
void setStencilBackOperations(GLenum stencilBackFail, GLenum stencilBackPassDepthFail, GLenum stencilBackPassDepthPass); | |
void setPolygonOffsetFill(bool enabled); | |
bool isPolygonOffsetFillEnabled() const; | |
void setPolygonOffsetParams(GLfloat factor, GLfloat units); | |
void setSampleAlphaToCoverage(bool enabled); | |
bool isSampleAlphaToCoverageEnabled() const; | |
void setSampleCoverage(bool enabled); | |
bool isSampleCoverageEnabled() const; | |
void setSampleCoverageParams(GLclampf value, bool invert); | |
void setDither(bool enabled); | |
bool isDitherEnabled() const; | |
void setLineWidth(GLfloat width); | |
void setGenerateMipmapHint(GLenum hint); | |
void setFragmentShaderDerivativeHint(GLenum hint); | |
void setViewportParams(GLint x, GLint y, GLsizei width, GLsizei height); | |
void setScissorTest(bool enabled); | |
bool isScissorTestEnabled() const; | |
void setScissorParams(GLint x, GLint y, GLsizei width, GLsizei height); | |
void setColorMask(bool red, bool green, bool blue, bool alpha); | |
void setDepthMask(bool mask); | |
void setActiveSampler(unsigned int active); | |
void setEnableVertexAttribArray(unsigned int attribNum, bool enabled); | |
const VertexAttribute &getVertexAttribState(unsigned int attribNum); | |
void setVertexAttribState(unsigned int attribNum, sw::Resource *buffer, GLint size, GLenum type, | |
bool normalized, GLsizei stride, intptr_t offset); | |
void setUnpackAlignment(GLint alignment); | |
GLint getUnpackAlignment() const; | |
void setPackAlignment(GLint alignment); | |
GLint getPackAlignment() const; | |
void drawArrays(GLenum mode, GLint first, GLsizei count); | |
void drawElements(GLenum mode, GLsizei count, GLenum type, intptr_t offset); | |
void finish(); | |
void flush(); | |
void recordInvalidEnum(); | |
void recordInvalidValue(); | |
void recordInvalidOperation(); | |
void recordOutOfMemory(); | |
void recordInvalidFramebufferOperation(); | |
GLenum getError(); | |
static int getSupportedMultiSampleDepth(sw::Format format, int requested); | |
Device *getDevice(); | |
public: | |
virtual ~Context(); | |
bool applyRenderTarget(); | |
void applyState(GLenum drawMode); | |
GLenum applyVertexBuffer(GLint base, GLint first); | |
void applyIndexBuffer(); | |
void applyShaders(); | |
void applyTexture(sw::SamplerType type, int sampler, Texture *texture); | |
bool cullSkipsDraw(GLenum drawMode); | |
bool isTriangleMode(GLenum drawMode); | |
const egl::Config *const mConfig; | |
State mState; | |
// Recorded errors | |
bool mInvalidEnum; | |
bool mInvalidValue; | |
bool mInvalidOperation; | |
bool mOutOfMemory; | |
bool mInvalidFramebufferOperation; | |
bool mHasBeenCurrent; | |
unsigned int mAppliedProgramSerial; | |
// state caching flags | |
bool mDepthStateDirty; | |
bool mMaskStateDirty; | |
bool mPixelPackingStateDirty; | |
bool mBlendStateDirty; | |
bool mStencilStateDirty; | |
bool mPolygonOffsetStateDirty; | |
bool mSampleStateDirty; | |
bool mFrontFaceDirty; | |
bool mDitherStateDirty; | |
Device *device; | |
}; | |
} | |
#endif // INCLUDE_CONTEXT_H_ |