• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include "GLSnapshot.h"
2 
3 #include <GLES2/gl2.h>
4 #include <GLES3/gl31.h>
5 
6 #include <stdio.h>
7 
8 #define DEBUG 0
9 
10 #if DEBUG
11 
12 #define D(fmt,...) do { \
13     fprintf(stderr, "%s:%s:%d: " fmt "\n", __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__); \
14 } while(0) \
15 
16 #else
17 #define D(...)
18 #endif
19 
20 namespace GLSnapshot {
21 
GLSnapshotState(const GLESv2Dispatch * gl)22 GLSnapshotState::GLSnapshotState(const GLESv2Dispatch* gl) : mGL(gl) {
23     D("init snapshot state");
24 }
25 
getGlobalStateEnum(GLenum name,int size)26 void GLSnapshotState::getGlobalStateEnum(GLenum name, int size) {
27     D("save 0x%x", name);
28     std::vector<GLenum>& store = mGlobals[name].enums;
29     store.resize(size);
30     mGL->glGetIntegerv(name, (GLint*)&store[0]);
31 }
32 
getGlobalStateByte(GLenum name,int size)33 void GLSnapshotState::getGlobalStateByte(GLenum name, int size) {
34     D("save 0x%x", name);
35     std::vector<unsigned char>& store = mGlobals[name].bytes;
36     store.resize(size);
37     mGL->glGetBooleanv(name, (GLboolean*)&store[0]);
38 }
39 
getGlobalStateInt(GLenum name,int size)40 void GLSnapshotState::getGlobalStateInt(GLenum name, int size) {
41     D("save 0x%x", name);
42     std::vector<uint32_t>& store = mGlobals[name].ints;
43     store.resize(size);
44     mGL->glGetIntegerv(name, (GLint*)&store[0]);
45 }
46 
getGlobalStateFloat(GLenum name,int size)47 void GLSnapshotState::getGlobalStateFloat(GLenum name, int size) {
48     D("save 0x%x", name);
49     std::vector<float>& store = mGlobals[name].floats;
50     store.resize(size);
51     mGL->glGetFloatv(name, (GLfloat*)&store[0]);
52 }
53 
getGlobalStateInt64(GLenum name,int size)54 void GLSnapshotState::getGlobalStateInt64(GLenum name, int size) {
55     D("save 0x%x", name);
56     std::vector<uint64_t>& store = mGlobals[name].int64s;
57     store.resize(size);
58     mGL->glGetInteger64v(name, (GLint64*)&store[0]);
59 }
60 
getGlobalStateEnable(GLenum name)61 void GLSnapshotState::getGlobalStateEnable(GLenum name) {
62     D("save 0x%x", name);
63     mEnables[name] = mGL->glIsEnabled(name) == GL_TRUE;
64 }
65 
save()66 void GLSnapshotState::save() {
67     getGlobalStateEnable(GL_DEPTH_TEST);
68 
69     getGlobalStateFloat(GL_COLOR_CLEAR_VALUE, 4);
70     getGlobalStateInt(GL_ACTIVE_TEXTURE, 1);
71 }
72 
restore()73 void GLSnapshotState::restore() {
74     for (const auto& it : mEnables) {
75         if (it.second) {
76             mGL->glEnable(it.first);
77         } else {
78             mGL->glDisable(it.first);
79         }
80     }
81 
82     for (auto& it: mProgramNames) {
83         GLShaderState& shaderState = mShaderState[it.first];
84         it.second = mGL->glCreateShader(shaderState.type);
85         if (shaderState.source.size()) {
86             GLint len = shaderState.source.size();
87             const char* source = shaderState.source.c_str();
88             const char** sources = &source;
89             mGL->glShaderSource(it.second, 1, sources, &len);
90         }
91         if (shaderState.compileStatus) {
92             mGL->glCompileShader(it.second);
93         }
94     }
95 
96     std::vector<float> clearColor = mGlobals[GL_COLOR_CLEAR_VALUE].floats;
97     mGL->glClearColor(clearColor[0], clearColor[1], clearColor[2], clearColor[3]);
98 
99     mGL->glActiveTexture(mGlobals[GL_ACTIVE_TEXTURE].ints[0]);
100 }
101 
createShader(GLuint shader,GLenum shaderType)102 GLuint GLSnapshotState::createShader(GLuint shader, GLenum shaderType) {
103     GLuint shaderName = mProgramCounter++;
104     mProgramNames[shaderName] = shader;
105     mProgramNamesBack[shader] = shaderName;
106     mShaderState[shaderName].type = shaderType;
107     mShaderState[shaderName].source = "";
108     mShaderState[shaderName].compileStatus = false;
109     return shaderName;
110 }
111 
createProgram(GLuint program)112 GLuint GLSnapshotState::createProgram(GLuint program) {
113     return program;
114 }
115 
116 
shaderString(GLuint shader,const GLchar * string)117 void GLSnapshotState::shaderString(GLuint shader, const GLchar* string) {
118     mShaderState[mProgramNamesBack[shader]].source = std::string(string);
119 
120 }
121 
genBuffers(GLsizei n,GLuint * buffers)122 void GLSnapshotState::genBuffers(GLsizei n, GLuint* buffers) {
123     return;
124 }
125 
getProgramName(GLuint name)126 GLuint GLSnapshotState::getProgramName(GLuint name) {
127     return mProgramNames[name];
128 }
129 
130 } // namespace GLSnapshot
131