115 lines
2.4 KiB
C
115 lines
2.4 KiB
C
/* Copyright (c) 2013-2015 Jeffrey Pfau
|
|
*
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
#ifndef GLES2_H
|
|
#define GLES2_H
|
|
|
|
#include <mgba-util/common.h>
|
|
|
|
CXX_GUARD_START
|
|
|
|
#ifdef USE_EPOXY
|
|
#include <epoxy/gl.h>
|
|
#elif defined(__APPLE__)
|
|
#include <OpenGL/gl3.h>
|
|
#elif defined(BUILD_GL)
|
|
#define GL_GLEXT_PROTOTYPES
|
|
#include <GL/gl.h>
|
|
#include <GL/glext.h>
|
|
#elif defined(BUILD_GLES3)
|
|
#include <GLES3/gl3.h>
|
|
#else
|
|
#include <GLES2/gl2.h>
|
|
#endif
|
|
|
|
#include <mgba/feature/video-backend.h>
|
|
|
|
union mGLES2UniformValue {
|
|
GLfloat f;
|
|
GLint i;
|
|
GLboolean b;
|
|
GLfloat fvec2[2];
|
|
GLfloat fvec3[3];
|
|
GLfloat fvec4[4];
|
|
GLint ivec2[2];
|
|
GLint ivec3[3];
|
|
GLint ivec4[4];
|
|
GLboolean bvec2[2];
|
|
GLboolean bvec3[3];
|
|
GLboolean bvec4[4];
|
|
GLfloat fmat2x2[4];
|
|
GLfloat fmat3x3[9];
|
|
GLfloat fmat4x4[16];
|
|
};
|
|
|
|
struct mGLES2Uniform {
|
|
const char* name;
|
|
GLenum type;
|
|
union mGLES2UniformValue value;
|
|
GLuint location;
|
|
union mGLES2UniformValue min;
|
|
union mGLES2UniformValue max;
|
|
const char* readableName;
|
|
};
|
|
|
|
struct mGLES2Shader {
|
|
int width;
|
|
int height;
|
|
bool integerScaling;
|
|
bool filter;
|
|
bool blend;
|
|
bool dirty;
|
|
GLuint tex;
|
|
GLuint fbo;
|
|
GLuint vao;
|
|
GLuint fragmentShader;
|
|
GLuint vertexShader;
|
|
GLuint program;
|
|
GLuint texLocation;
|
|
GLuint texSizeLocation;
|
|
GLuint positionLocation;
|
|
GLuint outputSizeLocation;
|
|
|
|
struct mGLES2Uniform* uniforms;
|
|
size_t nUniforms;
|
|
};
|
|
|
|
struct mGLES2Context {
|
|
struct VideoBackend d;
|
|
|
|
GLuint tex[VIDEO_LAYER_MAX];
|
|
GLuint vbo;
|
|
|
|
struct mRectangle layerDims[VIDEO_LAYER_MAX];
|
|
struct mSize imageSizes[VIDEO_LAYER_MAX];
|
|
int x;
|
|
int y;
|
|
unsigned width;
|
|
unsigned height;
|
|
|
|
struct mGLES2Shader initialShader;
|
|
struct mGLES2Shader finalShader;
|
|
struct mGLES2Shader interframeShader;
|
|
|
|
struct mGLES2Shader* shaders;
|
|
size_t nShaders;
|
|
};
|
|
|
|
void mGLES2ContextCreate(struct mGLES2Context*);
|
|
void mGLES2ContextUseFramebuffer(struct mGLES2Context*);
|
|
|
|
void mGLES2ShaderInit(struct mGLES2Shader*, const char* vs, const char* fs, int width, int height, bool integerScaling, struct mGLES2Uniform* uniforms, size_t nUniforms);
|
|
void mGLES2ShaderDeinit(struct mGLES2Shader*);
|
|
void mGLES2ShaderAttach(struct mGLES2Context*, struct mGLES2Shader*, size_t nShaders);
|
|
void mGLES2ShaderDetach(struct mGLES2Context*);
|
|
|
|
struct VDir;
|
|
bool mGLES2ShaderLoad(struct VideoShader*, struct VDir*);
|
|
void mGLES2ShaderFree(struct VideoShader*);
|
|
|
|
CXX_GUARD_END
|
|
|
|
#endif
|