blob: 5fef0756161d90c56e7da9c14b9d263a786f65b5 [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,
UniformLocation location,
GLint value);
void setUniform1iv(Context *context,
Program *programObject,
UniformLocation location,
GLint count,
const GLint *value);
void setUniformMatrix4fv(Program *programObject,
UniformLocation location,
GLint count,
GLboolean transpose,
const GLfloat *value);
void setUniform4fv(Program *programObject,
UniformLocation location,
GLint count,
const GLfloat *value);
void setUniform3fv(Program *programObject,
UniformLocation location,
GLint count,
const GLfloat *value);
void setUniform2fv(Program *programObject,
UniformLocation location,
GLint count,
const GLfloat *value);
void setUniform1f(Program *programObject, UniformLocation location, GLfloat value);
void setUniform1fv(Program *programObject,
UniformLocation location,
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;
UniformLocation projMatrixLoc;
UniformLocation modelviewMatrixLoc;
UniformLocation textureMatrixLoc;
UniformLocation modelviewInvTrLoc;
// Texturing
UniformLocation enableTexture2DLoc;
UniformLocation enableTextureCubeMapLoc;
std::array<UniformLocation, kTexUnitCount> tex2DSamplerLocs;
std::array<UniformLocation, kTexUnitCount> texCubeSamplerLocs;
UniformLocation textureFormatLoc;
UniformLocation textureEnvModeLoc;
UniformLocation combineRgbLoc;
UniformLocation combineAlphaLoc;
UniformLocation src0rgbLoc;
UniformLocation src0alphaLoc;
UniformLocation src1rgbLoc;
UniformLocation src1alphaLoc;
UniformLocation src2rgbLoc;
UniformLocation src2alphaLoc;
UniformLocation op0rgbLoc;
UniformLocation op0alphaLoc;
UniformLocation op1rgbLoc;
UniformLocation op1alphaLoc;
UniformLocation op2rgbLoc;
UniformLocation op2alphaLoc;
UniformLocation textureEnvColorLoc;
UniformLocation rgbScaleLoc;
UniformLocation alphaScaleLoc;
UniformLocation pointSpriteCoordReplaceLoc;
// Alpha test
UniformLocation enableAlphaTestLoc;
UniformLocation alphaFuncLoc;
UniformLocation alphaTestRefLoc;
// Shading, materials, and lighting
UniformLocation shadeModelFlatLoc;
UniformLocation enableLightingLoc;
UniformLocation enableRescaleNormalLoc;
UniformLocation enableNormalizeLoc;
UniformLocation enableColorMaterialLoc;
UniformLocation materialAmbientLoc;
UniformLocation materialDiffuseLoc;
UniformLocation materialSpecularLoc;
UniformLocation materialEmissiveLoc;
UniformLocation materialSpecularExponentLoc;
UniformLocation lightModelSceneAmbientLoc;
UniformLocation lightModelTwoSidedLoc;
UniformLocation lightEnablesLoc;
UniformLocation lightAmbientsLoc;
UniformLocation lightDiffusesLoc;
UniformLocation lightSpecularsLoc;
UniformLocation lightPositionsLoc;
UniformLocation lightDirectionsLoc;
UniformLocation lightSpotlightExponentsLoc;
UniformLocation lightSpotlightCutoffAnglesLoc;
UniformLocation lightAttenuationConstsLoc;
UniformLocation lightAttenuationLinearsLoc;
UniformLocation lightAttenuationQuadraticsLoc;
// Fog
UniformLocation fogEnableLoc;
UniformLocation fogModeLoc;
UniformLocation fogDensityLoc;
UniformLocation fogStartLoc;
UniformLocation fogEndLoc;
UniformLocation fogColorLoc;
// Clip planes
UniformLocation enableClipPlanesLoc;
UniformLocation clipPlaneEnablesLoc;
UniformLocation clipPlanesLoc;
// Point rasterization
UniformLocation pointRasterizationLoc;
UniformLocation pointSizeMinLoc;
UniformLocation pointSizeMaxLoc;
UniformLocation pointDistanceAttenuationLoc;
UniformLocation pointSpriteEnabledLoc;
// Draw texture
UniformLocation enableDrawTextureLoc;
UniformLocation drawTextureCoordsLoc;
UniformLocation drawTextureDimsLoc;
UniformLocation 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_