blob: fd072c7424f21ab9160b87ce027bec18dc6a68db [file] [log] [blame]
#pragma once
#include "OpenGLESDispatch/GLESv2Dispatch.h"
#include <map>
#include <string>
#include <vector>
#include <inttypes.h>
#include <GLES2/gl2.h>
namespace gfxstream {
namespace gl {
namespace snapshot {
struct GLValue {
std::vector<GLenum> enums;
std::vector<unsigned char> bytes;
std::vector<uint16_t> shorts;
std::vector<uint32_t> ints;
std::vector<float> floats;
std::vector<uint64_t> int64s;
};
typedef std::map<GLenum, GLValue> GlobalStateMap;
typedef std::map<GLenum, bool> GlobalEnables;
struct GLShaderState {
GLenum type;
std::string source;
bool compileStatus;
};
struct GLProgramState {
std::map<GLenum, GLuint> linkage;
bool linkStatus;
};
class GLSnapshotState {
public:
GLSnapshotState(const GLESv2Dispatch* gl);
void save();
void restore();
// Shaders
GLuint createShader(GLuint shader, GLenum shaderType);
GLuint createProgram(GLuint program);
void shaderString(GLuint shader, const GLchar* string);
void genBuffers(GLsizei n, GLuint* buffers);
GLuint getProgramName(GLuint name);
private:
void getGlobalStateEnum(GLenum name, int size);
void getGlobalStateByte(GLenum name, int size);
void getGlobalStateInt(GLenum name, int size);
void getGlobalStateFloat(GLenum name, int size);
void getGlobalStateInt64(GLenum name, int size);
void getGlobalStateEnable(GLenum name);
const GLESv2Dispatch* mGL;
GlobalStateMap mGlobals;
GlobalEnables mEnables;
GLuint mProgramCounter = 1;
std::map<GLuint, GLuint> mProgramNames;
std::map<GLuint, GLuint> mProgramNamesBack;
std::map<GLuint, GLShaderState> mShaderState;
std::map<GLuint, GLProgramState> mShaderProgramState;
};
} // namespace snapshot
} // namespace gl
} // namespace gfxstream