blob: decbf4830c99edc1a2f6ee245445c24cbd6fbc2c [file] [log] [blame]
/*
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#include <GLES/gl.h>
#include <GLES/glext.h>
#include <glm/mat4x4.hpp>
#include <vector>
#include <unordered_map>
#include <unordered_set>
class GLEScmContext;
class GLESpointer;
class CoreProfileEngine {
public:
CoreProfileEngine(GLEScmContext* ctx, bool onGles = false);
~CoreProfileEngine();
struct GeometryDrawState {
GLuint vshader;
GLuint fshader;
GLuint program;
GLuint vshaderFlat;
GLuint fshaderFlat;
GLuint programFlat;
GLuint ibo;
GLuint vao;
GLint projMatrixLoc;
GLint modelviewMatrixLoc;
GLint textureMatrixLoc;
GLint modelviewInvTrLoc;
GLint textureSamplerLoc;
GLint textureCubeSamplerLoc;
GLint enableTextureLoc;
GLint enableLightingLoc;
GLint enableRescaleNormalLoc;
GLint enableNormalizeLoc;
GLint enableColorMaterialLoc;
GLint enableFogLoc;
GLint enableReflectionMapLoc;
GLint textureEnvModeLoc;
GLint textureFormatLoc;
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;
GLint fogModeLoc;
GLint fogDensityLoc;
GLint fogStartLoc;
GLint fogEndLoc;
GLint fogColorLoc;
GLuint posVbo;
GLuint normalVbo;
GLuint colorVbo;
GLuint pointsizeVbo;
GLuint texcoordVbo;
};
struct DrawTexOESCoreState {
GLuint vshader;
GLuint fshader;
GLuint program;
GLuint vbo;
GLuint ibo;
GLuint vao;
};
const DrawTexOESCoreState& getDrawTexOESCoreState();
void teardown();
const GeometryDrawState& getGeometryDrawState();
GLint getAndClearLastError() {
GLint err = mCurrError;
mCurrError = 0;
return err;
}
// Utility functions
void setupArrayForDraw(GLenum arrayType, GLESpointer* p, GLint first, GLsizei count, bool isIndexed, GLenum indicesType, const GLvoid* indices);
void preDrawTextureUnitEmulation();
void postDrawTextureUnitEmulation();
void preDrawVertexSetup();
void postDrawVertexSetup();
void setupLighting();
void setupFog();
// GLES 1 API (deprecated + incompatible with core only)
void enable(GLenum cap);
void disable(GLenum cap);
void shadeModel(GLenum mode);
void matrixMode(GLenum mode);
void loadIdentity();
void loadMatrixf(const GLfloat* m);
void pushMatrix();
void popMatrix();
void multMatrixf(const GLfloat* m);
void orthof(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);
void frustumf(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);
void texEnvf(GLenum target, GLenum pname, GLfloat param);
void texEnvfv(GLenum target, GLenum pname, const GLfloat* params);
void texEnvi(GLenum target, GLenum pname, GLint param);
void texEnviv(GLenum target, GLenum pname, const GLint* params);
void getTexEnvfv(GLenum env, GLenum pname, GLfloat* params);
void getTexEnviv(GLenum env, GLenum pname, GLint* params);
void texGenf(GLenum coord, GLenum pname, GLfloat param);
void texGenfv(GLenum coord, GLenum pname, const GLfloat* params);
void texGeni(GLenum coord, GLenum pname, GLint param);
void texGeniv(GLenum coord, GLenum pname, const GLint* params);
void getTexGeniv(GLenum coord, GLenum pname, GLint* params);
void getTexGenfv(GLenum coord, GLenum pname, GLfloat* params);
void enableClientState(GLenum clientState);
void disableClientState(GLenum clientState);
void drawTexOES(float x, float y, float z, float width, float height);
void rotatef(float angle, float x, float y, float z);
void scalef(float x, float y, float z);
void translatef(float x, float y, float z);
void color4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
void color4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
void activeTexture(GLenum unit);
void clientActiveTexture(GLenum unit);
void drawArrays(GLenum type, GLint first, GLsizei count);
void drawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices);
private:
GLEScmContext* mCtx = nullptr;
GLint mCurrError = 0;
void setError(GLint err) { mCurrError = err; }
size_t sizeOfType(GLenum dataType);
GLuint getVboFor(GLenum arrayType);
DrawTexOESCoreState m_drawTexOESCoreState = {};
GeometryDrawState m_geometryDrawState = {};
// If we are on a gles impl.
bool mOnGles = false;
static constexpr int kMaxLights = 8;
struct LightingBuffer {
GLint lightEnables[kMaxLights];
GLfloat lightAmbients[4 * kMaxLights];
GLfloat lightDiffuses[4 * kMaxLights];
GLfloat lightSpeculars[4 * kMaxLights];
GLfloat lightPositions[4 * kMaxLights];
GLfloat lightDirections[3 * kMaxLights];
GLfloat spotlightExponents[kMaxLights];
GLfloat spotlightCutoffAngles[kMaxLights];
GLfloat attenuationConsts[kMaxLights];
GLfloat attenuationLinears[kMaxLights];
GLfloat attenuationQuadratics[kMaxLights];
};
LightingBuffer m_lightingBuffer;
};