blob: f7b6a998505ab811c3ca3d2162213385ab29cd2a [file] [log] [blame]
//
// Copyright 2018 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.
//
// GLES1Renderer.h: Defines GLES1 emulation rendering operations on top of a GLES3
// context. Used by Context.h.
#ifndef LIBANGLE_GLES1_RENDERER_H_
#define LIBANGLE_GLES1_RENDERER_H_
#include "angle_gl.h"
#include "common/angleutils.h"
#include "libANGLE/angletypes.h"
#include <memory>
#include <string>
#include <unordered_map>
namespace gl
{
class Context;
class GLES1State;
class Program;
class State;
class Shader;
class ShaderProgramManager;
class GLES1Renderer final : angle::NonCopyable
{
public:
GLES1Renderer();
~GLES1Renderer();
void onDestroy(Context *context, State *state);
angle::Result prepareForDraw(PrimitiveMode mode, Context *context, State *glState);
static int VertexArrayIndex(ClientVertexArrayType type, const GLES1State &gles1);
static int TexCoordArrayIndex(unsigned int unit);
void drawTexture(Context *context,
State *glState,
float x,
float y,
float z,
float width,
float height);
static constexpr int kTexUnitCount = 4;
private:
using Mat4Uniform = float[16];
using Vec4Uniform = float[4];
using Vec3Uniform = float[3];
Shader *getShader(ShaderProgramID handle) const;
Program *getProgram(ShaderProgramID handle) const;
angle::Result compileShader(Context *context,
ShaderType shaderType,
const char *src,
ShaderProgramID *shaderOut);
angle::Result linkProgram(Context *context,
State *glState,
ShaderProgramID vshader,
ShaderProgramID fshader,
const std::unordered_map<GLint, std::string> &attribLocs,
ShaderProgramID *programOut);
angle::Result initializeRendererProgram(Context *context, State *glState);
void setUniform1i(Context *context, Program *programObject, GLint loc, GLint value);
void setUniform1iv(Context *context,
Program *programObject,
GLint loc,
GLint count,
const GLint *value);
void setUniformMatrix4fv(Program *programObject,
GLint loc,
GLint count,
GLboolean transpose,
const GLfloat *value);
void setUniform4fv(Program *programObject, GLint loc, GLint count, const GLfloat *value);
void setUniform3fv(Program *programObject, GLint loc, GLint count, const GLfloat *value);
void setUniform2fv(Program *programObject, GLint loc, GLint count, const GLfloat *value);
void setUniform1f(Program *programObject, GLint loc, GLfloat value);
void setUniform1fv(Program *programObject, GLint loc, GLint count, const GLfloat *value);
void setAttributesEnabled(Context *context, State *glState, AttributesMask mask);
static constexpr int kLightCount = 8;
static constexpr int kClipPlaneCount = 6;
static constexpr int kVertexAttribIndex = 0;
static constexpr int kNormalAttribIndex = 1;
static constexpr int kColorAttribIndex = 2;
static constexpr int kPointSizeAttribIndex = 3;
static constexpr int kTextureCoordAttribIndexBase = 4;
bool mRendererProgramInitialized;
ShaderProgramManager *mShaderPrograms;
struct GLES1ProgramState
{
ShaderProgramID program;
GLint projMatrixLoc;
GLint modelviewMatrixLoc;
GLint textureMatrixLoc;
GLint modelviewInvTrLoc;
// Texturing
GLint enableTexture2DLoc;
GLint enableTextureCubeMapLoc;
std::array<GLint, kTexUnitCount> tex2DSamplerLocs;
std::array<GLint, kTexUnitCount> texCubeSamplerLocs;
GLint textureFormatLoc;
GLint textureEnvModeLoc;
GLint combineRgbLoc;
GLint combineAlphaLoc;
GLint src0rgbLoc;
GLint src0alphaLoc;
GLint src1rgbLoc;
GLint src1alphaLoc;
GLint src2rgbLoc;
GLint src2alphaLoc;
GLint op0rgbLoc;
GLint op0alphaLoc;
GLint op1rgbLoc;
GLint op1alphaLoc;
GLint op2rgbLoc;
GLint op2alphaLoc;
GLint textureEnvColorLoc;
GLint rgbScaleLoc;
GLint alphaScaleLoc;
GLint pointSpriteCoordReplaceLoc;
// Alpha test
GLint enableAlphaTestLoc;
GLint alphaFuncLoc;
GLint alphaTestRefLoc;
// Shading, materials, and lighting
GLint shadeModelFlatLoc;
GLint enableLightingLoc;
GLint enableRescaleNormalLoc;
GLint enableNormalizeLoc;
GLint enableColorMaterialLoc;
GLint materialAmbientLoc;
GLint materialDiffuseLoc;
GLint materialSpecularLoc;
GLint materialEmissiveLoc;
GLint materialSpecularExponentLoc;
GLint lightModelSceneAmbientLoc;
GLint lightModelTwoSidedLoc;
GLint lightEnablesLoc;
GLint lightAmbientsLoc;
GLint lightDiffusesLoc;
GLint lightSpecularsLoc;
GLint lightPositionsLoc;
GLint lightDirectionsLoc;
GLint lightSpotlightExponentsLoc;
GLint lightSpotlightCutoffAnglesLoc;
GLint lightAttenuationConstsLoc;
GLint lightAttenuationLinearsLoc;
GLint lightAttenuationQuadraticsLoc;
// Fog
GLint fogEnableLoc;
GLint fogModeLoc;
GLint fogDensityLoc;
GLint fogStartLoc;
GLint fogEndLoc;
GLint fogColorLoc;
// Clip planes
GLint enableClipPlanesLoc;
GLint clipPlaneEnablesLoc;
GLint clipPlanesLoc;
// Point rasterization
GLint pointRasterizationLoc;
GLint pointSizeMinLoc;
GLint pointSizeMaxLoc;
GLint pointDistanceAttenuationLoc;
GLint pointSpriteEnabledLoc;
// Draw texture
GLint enableDrawTextureLoc;
GLint drawTextureCoordsLoc;
GLint drawTextureDimsLoc;
GLint drawTextureNormalizedCropRectLoc;
};
struct GLES1UniformBuffers
{
std::array<Mat4Uniform, kTexUnitCount> textureMatrices;
std::array<GLint, kTexUnitCount> tex2DEnables;
std::array<GLint, kTexUnitCount> texCubeEnables;
std::array<GLint, kTexUnitCount> texEnvModes;
std::array<GLint, kTexUnitCount> texCombineRgbs;
std::array<GLint, kTexUnitCount> texCombineAlphas;
std::array<GLint, kTexUnitCount> texCombineSrc0Rgbs;
std::array<GLint, kTexUnitCount> texCombineSrc0Alphas;
std::array<GLint, kTexUnitCount> texCombineSrc1Rgbs;
std::array<GLint, kTexUnitCount> texCombineSrc1Alphas;
std::array<GLint, kTexUnitCount> texCombineSrc2Rgbs;
std::array<GLint, kTexUnitCount> texCombineSrc2Alphas;
std::array<GLint, kTexUnitCount> texCombineOp0Rgbs;
std::array<GLint, kTexUnitCount> texCombineOp0Alphas;
std::array<GLint, kTexUnitCount> texCombineOp1Rgbs;
std::array<GLint, kTexUnitCount> texCombineOp1Alphas;
std::array<GLint, kTexUnitCount> texCombineOp2Rgbs;
std::array<GLint, kTexUnitCount> texCombineOp2Alphas;
std::array<Vec4Uniform, kTexUnitCount> texEnvColors;
std::array<GLfloat, kTexUnitCount> texEnvRgbScales;
std::array<GLfloat, kTexUnitCount> texEnvAlphaScales;
std::array<GLint, kTexUnitCount> pointSpriteCoordReplaces;
// Lighting
std::array<GLint, kLightCount> lightEnables;
std::array<Vec4Uniform, kLightCount> lightAmbients;
std::array<Vec4Uniform, kLightCount> lightDiffuses;
std::array<Vec4Uniform, kLightCount> lightSpeculars;
std::array<Vec4Uniform, kLightCount> lightPositions;
std::array<Vec3Uniform, kLightCount> lightDirections;
std::array<GLfloat, kLightCount> spotlightExponents;
std::array<GLfloat, kLightCount> spotlightCutoffAngles;
std::array<GLfloat, kLightCount> attenuationConsts;
std::array<GLfloat, kLightCount> attenuationLinears;
std::array<GLfloat, kLightCount> attenuationQuadratics;
// Clip planes
std::array<GLint, kClipPlaneCount> clipPlaneEnables;
std::array<Vec4Uniform, kClipPlaneCount> clipPlanes;
// Texture crop rectangles
std::array<Vec4Uniform, kTexUnitCount> texCropRects;
};
GLES1UniformBuffers mUniformBuffers;
GLES1ProgramState mProgramState;
bool mDrawTextureEnabled = false;
GLfloat mDrawTextureCoords[4] = {0.0f, 0.0f, 0.0f, 0.0f};
GLfloat mDrawTextureDims[2] = {0.0f, 0.0f};
};
} // namespace gl
#endif // LIBANGLE_GLES1_RENDERER_H_