417 lines
12 KiB
C++
417 lines
12 KiB
C++
/*
|
|
* Glide64 - Glide video plugin for Nintendo 64 emulators.
|
|
* Copyright (c) 2002 Dave2001
|
|
* Copyright (c) 2003-2009 Sergey 'Gonetz' Lipski
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*/
|
|
#include <GLES2/gl2.h>
|
|
#include "glitchmain.h"
|
|
|
|
#undef glActiveTexture
|
|
#undef glBindTexture
|
|
#undef glBlendEquation
|
|
#undef glBlendEquationSeparate
|
|
#undef glBlendFunc
|
|
#undef glBlendFuncSeparate
|
|
#undef glClearColor
|
|
#undef glClearDepthf
|
|
#undef glCullFace
|
|
#undef glDepthFunc
|
|
#undef glDepthMask
|
|
#undef glDepthRangef
|
|
#undef glDisable
|
|
#undef glEnable
|
|
#undef glFrontFace
|
|
#undef glPolygonOffset
|
|
#undef glScissor
|
|
#undef glUseProgram
|
|
#undef glViewport
|
|
|
|
void vbo_draw();
|
|
|
|
void cache_glActiveTexture (GLenum texture)
|
|
{
|
|
static GLenum cached_texture;
|
|
|
|
if(texture != cached_texture)
|
|
{
|
|
WriteTrace(TraceOGLWrapper, TraceDebug, "texture: %d",texture);
|
|
vbo_draw();
|
|
glActiveTexture(texture);
|
|
cached_texture = texture;
|
|
}
|
|
else
|
|
{
|
|
WriteTrace(TraceOGLWrapper, TraceDebug, "Ignored - texture: %d",texture);
|
|
}
|
|
}
|
|
|
|
void cache_glBindTexture (GLenum target, GLuint texture)
|
|
{
|
|
WriteTrace(TraceOGLWrapper, TraceDebug, "target: %d texture: %d",target, texture);
|
|
vbo_draw();
|
|
glBindTexture(target, texture);
|
|
}
|
|
|
|
void cache_glBlendEquation ( GLenum mode )
|
|
{
|
|
static GLenum cached_mode;
|
|
|
|
if(mode != cached_mode)
|
|
{
|
|
WriteTrace(TraceOGLWrapper, TraceDebug, "mode: %d",mode);
|
|
vbo_draw();
|
|
glBlendEquation(mode);
|
|
cached_mode = mode;
|
|
}
|
|
else
|
|
{
|
|
WriteTrace(TraceOGLWrapper, TraceDebug, "Ignored - mode: %d",mode);
|
|
}
|
|
}
|
|
|
|
void cache_glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha)
|
|
{
|
|
static GLenum cached_modeRGB;
|
|
static GLenum cached_modeAlpha;
|
|
|
|
if(modeRGB != cached_modeRGB || modeAlpha != cached_modeAlpha)
|
|
{
|
|
WriteTrace(TraceOGLWrapper, TraceDebug, "modeRGB: %d cached_modeAlpha: %d",modeRGB, cached_modeAlpha);
|
|
vbo_draw();
|
|
glBlendEquationSeparate(modeRGB, modeAlpha);
|
|
cached_modeRGB = modeRGB;
|
|
cached_modeAlpha = modeAlpha;
|
|
}
|
|
else
|
|
{
|
|
WriteTrace(TraceOGLWrapper, TraceDebug, "Ignored - modeRGB: %d cached_modeAlpha: %d",modeRGB, cached_modeAlpha);
|
|
}
|
|
|
|
}
|
|
|
|
void cache_glBlendFunc (GLenum sfactor, GLenum dfactor)
|
|
{
|
|
static GLenum cached_sfactor;
|
|
static GLenum cached_dfactor;
|
|
|
|
if(sfactor != cached_sfactor || dfactor != cached_dfactor)
|
|
{
|
|
WriteTrace(TraceOGLWrapper, TraceDebug, "sfactor: %d dfactor: %d",sfactor, dfactor);
|
|
vbo_draw();
|
|
glBlendFunc(sfactor, dfactor);
|
|
cached_sfactor = sfactor;
|
|
cached_dfactor = dfactor;
|
|
}
|
|
else
|
|
{
|
|
WriteTrace(TraceOGLWrapper, TraceDebug, "Ignored - sfactor: %d dfactor: %d",sfactor, dfactor);
|
|
}
|
|
}
|
|
|
|
void cache_glBlendFuncSeparate (GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
|
|
{
|
|
static GLenum cached_BlendFuncSeparate_srcRGB;
|
|
static GLenum cached_BlendFuncSeparate_dstRGB;
|
|
static GLenum cached_BlendFuncSeparate_srcAlpha;
|
|
static GLenum cached_BlendFuncSeparate_dstAlpha;
|
|
|
|
if(srcRGB != cached_BlendFuncSeparate_srcRGB || dstRGB != cached_BlendFuncSeparate_dstRGB || srcAlpha != cached_BlendFuncSeparate_srcAlpha || dstAlpha != cached_BlendFuncSeparate_dstAlpha)
|
|
{
|
|
WriteTrace(TraceOGLWrapper, TraceDebug, "srcRGB: %d dstRGB: %d srcAlpha: %d dstAlpha: %d",srcRGB, dstRGB, srcAlpha, dstAlpha);
|
|
vbo_draw();
|
|
glBlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha);
|
|
cached_BlendFuncSeparate_srcRGB = srcRGB;
|
|
cached_BlendFuncSeparate_dstRGB = dstRGB;
|
|
cached_BlendFuncSeparate_srcAlpha = srcAlpha;
|
|
cached_BlendFuncSeparate_dstAlpha = dstAlpha;
|
|
}
|
|
else
|
|
{
|
|
WriteTrace(TraceOGLWrapper, TraceDebug, "Ignored - srcRGB: %d dstRGB: %d srcAlpha: %d dstAlpha: %d",srcRGB, dstRGB, srcAlpha, dstAlpha);
|
|
}
|
|
}
|
|
|
|
void cache_glClearDepthf (GLclampf depth)
|
|
{
|
|
static GLclampf cached_depth;
|
|
|
|
if(depth != cached_depth)
|
|
{
|
|
WriteTrace(TraceOGLWrapper, TraceDebug, "depth: %d",depth);
|
|
vbo_draw();
|
|
glClearDepthf(depth);
|
|
cached_depth = depth;
|
|
}
|
|
else
|
|
{
|
|
WriteTrace(TraceOGLWrapper, TraceDebug, "Ignored - depth: %d",depth);
|
|
}
|
|
}
|
|
|
|
void cache_glCullFace (GLenum mode)
|
|
{
|
|
static GLenum cached_CullFace_mode;
|
|
|
|
if(mode != cached_CullFace_mode)
|
|
{
|
|
WriteTrace(TraceOGLWrapper, TraceDebug, "mode: %d",mode);
|
|
vbo_draw();
|
|
glCullFace(mode);
|
|
cached_CullFace_mode = mode;
|
|
}
|
|
else
|
|
{
|
|
WriteTrace(TraceOGLWrapper, TraceDebug, "Ignored - mode: %d",mode);
|
|
}
|
|
}
|
|
|
|
void cache_glDepthFunc (GLenum func)
|
|
{
|
|
static GLenum cached_func;
|
|
|
|
if(func != cached_func)
|
|
{
|
|
WriteTrace(TraceOGLWrapper, TraceDebug, "func: %d",func);
|
|
vbo_draw();
|
|
glDepthFunc(func);
|
|
cached_func = func;
|
|
}
|
|
else
|
|
{
|
|
WriteTrace(TraceOGLWrapper, TraceDebug, "Ignored - func: %d",func);
|
|
}
|
|
}
|
|
|
|
void cache_glDepthMask (GLboolean flag)
|
|
{
|
|
static GLboolean cached_DepthMask_flag;
|
|
|
|
if(flag != cached_DepthMask_flag)
|
|
{
|
|
WriteTrace(TraceOGLWrapper, TraceDebug, "flag: %d",(int)flag);
|
|
vbo_draw();
|
|
glDepthMask(flag);
|
|
cached_DepthMask_flag = flag;
|
|
}
|
|
else
|
|
{
|
|
WriteTrace(TraceOGLWrapper, TraceDebug, "Ignored - flag: %d",(int)flag);
|
|
}
|
|
}
|
|
|
|
void cache_glDepthRangef (GLclampf zNear, GLclampf zFar)
|
|
{
|
|
static GLclampf cached_zNear;
|
|
static GLclampf cached_zFar;
|
|
if(zNear != cached_zNear || zFar != cached_zFar)
|
|
{
|
|
WriteTrace(TraceOGLWrapper, TraceDebug, "zNear: %d zFar: %d",zNear, zFar);
|
|
vbo_draw();
|
|
glDepthRangef(zNear, zFar);
|
|
cached_zNear = zNear;
|
|
cached_zFar = zFar;
|
|
}
|
|
else
|
|
{
|
|
WriteTrace(TraceOGLWrapper, TraceDebug, "Ignored - zNear: %d zFar: %d",zNear, zFar);
|
|
}
|
|
}
|
|
|
|
|
|
void cache_glEnableDisableItem (GLenum cap, bool enable, bool & cached_state, const char * StateName)
|
|
{
|
|
if (enable)
|
|
{
|
|
if(!cached_state)
|
|
{
|
|
WriteTrace(TraceOGLWrapper, TraceDebug, "glEnable(%s)",StateName);
|
|
vbo_draw();
|
|
glEnable(cap);
|
|
cached_state = true;
|
|
}
|
|
else
|
|
{
|
|
WriteTrace(TraceOGLWrapper, TraceDebug, "Ignored - glEnable(%s)",StateName);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (cached_state)
|
|
{
|
|
WriteTrace(TraceOGLWrapper, TraceDebug, "glDisable(%s)",StateName);
|
|
vbo_draw();
|
|
glDisable(cap);
|
|
cached_state = false;
|
|
}
|
|
else
|
|
{
|
|
WriteTrace(TraceOGLWrapper, TraceDebug, "Ignored - glEnable(%s)",StateName);
|
|
}
|
|
}
|
|
}
|
|
|
|
void cache_glEnableDisable (GLenum cap, bool enable)
|
|
{
|
|
static bool cached_BLEND = false;
|
|
static bool cached_CULL_FACE = false;
|
|
static bool cached_DEPTH_TEST = false;
|
|
static bool cached_DITHER = false;
|
|
static bool cached_POLYGON_OFFSET_FILL = false;
|
|
static bool cached_SAMPLE_ALPHA_TO_COVERAGE = false;
|
|
static bool cached_SAMPLE_COVERAGE = false;
|
|
static bool cached_SCISSOR_TEST = false;
|
|
static bool cached_STENCIL_TEST = false;
|
|
|
|
if(cap == GL_BLEND) { cache_glEnableDisableItem(cap, enable, cached_BLEND, "GL_BLEND"); }
|
|
else if(cap == GL_CULL_FACE) { cache_glEnableDisableItem(cap, enable, cached_CULL_FACE, "GL_CULL_FACE"); }
|
|
else if(cap == GL_DEPTH_TEST) { cache_glEnableDisableItem(cap, enable, cached_DEPTH_TEST, "GL_DEPTH_TEST"); }
|
|
else if(cap == GL_DITHER) { cache_glEnableDisableItem(cap, enable, cached_DITHER, "GL_DITHER"); }
|
|
else if(cap == GL_POLYGON_OFFSET_FILL) { cache_glEnableDisableItem(cap, enable, cached_POLYGON_OFFSET_FILL, "GL_POLYGON_OFFSET_FILL"); }
|
|
else if(cap == GL_SAMPLE_ALPHA_TO_COVERAGE) { cache_glEnableDisableItem(cap, enable, cached_SAMPLE_ALPHA_TO_COVERAGE, "GL_SAMPLE_ALPHA_TO_COVERAGE"); }
|
|
else if(cap == GL_SAMPLE_COVERAGE) { cache_glEnableDisableItem(cap, enable, cached_SAMPLE_COVERAGE, "GL_SAMPLE_COVERAGE"); }
|
|
else if(cap == GL_SCISSOR_TEST) { cache_glEnableDisableItem(cap, enable, cached_SCISSOR_TEST, "GL_SCISSOR_TEST"); }
|
|
else if(cap == GL_STENCIL_TEST) { cache_glEnableDisableItem(cap, enable, cached_STENCIL_TEST, "GL_STENCIL_TEST"); }
|
|
else
|
|
{
|
|
if (enable)
|
|
{
|
|
WriteTrace(TraceOGLWrapper, TraceDebug, "glEnable(%d)",cap);
|
|
vbo_draw();
|
|
glEnable(cap);
|
|
}
|
|
else
|
|
{
|
|
WriteTrace(TraceOGLWrapper, TraceDebug, "glDisable(%d)",cap);
|
|
vbo_draw();
|
|
glDisable(cap);
|
|
}
|
|
}
|
|
}
|
|
|
|
void cache_glFrontFace (GLenum mode)
|
|
{
|
|
static GLenum cached_FrontFace_mode;
|
|
if(mode != cached_FrontFace_mode)
|
|
{
|
|
WriteTrace(TraceOGLWrapper, TraceDebug, "mode: %d",mode);
|
|
vbo_draw();
|
|
glFrontFace(mode);
|
|
cached_FrontFace_mode = mode;
|
|
}
|
|
else
|
|
{
|
|
WriteTrace(TraceOGLWrapper, TraceDebug, "Ignored - mode: %d",mode);
|
|
}
|
|
}
|
|
|
|
void cache_glPolygonOffset (GLfloat factor, GLfloat units)
|
|
{
|
|
static GLfloat cached_factor;
|
|
static GLfloat cached_units;
|
|
if(factor != cached_factor || units != cached_units)
|
|
{
|
|
vbo_draw();
|
|
WriteTrace(TraceOGLWrapper, TraceDebug, "factor: %f units: %f",factor, units);
|
|
glPolygonOffset(factor, units);
|
|
cached_factor = factor;
|
|
cached_units = units;
|
|
}
|
|
else
|
|
{
|
|
WriteTrace(TraceOGLWrapper, TraceDebug, "Ignored - factor: %f units: %f",factor, units);
|
|
}
|
|
}
|
|
|
|
void cache_glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
|
|
{
|
|
static GLclampf cached_red, cached_green, cached_blue, cached_alpha;
|
|
|
|
if(red != cached_red || green != cached_green || blue != cached_blue || alpha != cached_alpha)
|
|
{
|
|
WriteTrace(TraceOGLWrapper, TraceDebug, "red: %f, green: %f, blue: %f, alpha: %f", red, green, blue, alpha);
|
|
vbo_draw();
|
|
glClearColor(red, green, blue, alpha);
|
|
cached_red = red;
|
|
cached_green = green;
|
|
cached_blue = blue;
|
|
cached_alpha = alpha;
|
|
}
|
|
else
|
|
{
|
|
WriteTrace(TraceOGLWrapper, TraceDebug, "Ignored - red: %f, green: %f, blue: %f, alpha: %f", red, green, blue, alpha);
|
|
}
|
|
}
|
|
|
|
void cache_glScissor (GLint x, GLint y, GLsizei width, GLsizei height)
|
|
{
|
|
static GLint cached_x, cached_y;
|
|
static GLsizei cached_width, cached_height;
|
|
|
|
if(x != cached_x || y != cached_y || width != cached_width || height != cached_height)
|
|
{
|
|
WriteTrace(TraceOGLWrapper, TraceDebug, "x: %d, y: %d, width: %d, height: %d", x, y, width, height);
|
|
vbo_draw();
|
|
glScissor(x, y, width, height);
|
|
cached_x = x;
|
|
cached_y = y;
|
|
cached_width = width;
|
|
cached_height = height;
|
|
}
|
|
else
|
|
{
|
|
WriteTrace(TraceOGLWrapper, TraceDebug, "Ignored - x: %d, y: %d, width: %d, height: %d", x, y, width, height);
|
|
}
|
|
}
|
|
|
|
void cache_glUseProgram (GLuint program)
|
|
{
|
|
static GLuint cached_program;
|
|
if(program != cached_program)
|
|
{
|
|
WriteTrace(TraceOGLWrapper, TraceDebug, "program: %d", program);
|
|
vbo_draw();
|
|
glUseProgram(program);
|
|
cached_program = program;
|
|
}
|
|
else
|
|
{
|
|
WriteTrace(TraceOGLWrapper, TraceDebug, "Ignored - program: %d", program);
|
|
}
|
|
}
|
|
|
|
void cache_glViewport (GLint x, GLint y, GLsizei width, GLsizei height)
|
|
{
|
|
static GLint cached_x = 0, cached_y = 0;
|
|
static GLsizei cached_width = 0, cached_height = 0;
|
|
|
|
if(x != cached_x || y != cached_y || width != cached_width || height != cached_height)
|
|
{
|
|
WriteTrace(TraceOGLWrapper, TraceDebug, "x: %d, y: %d, width: %d, height: %d", x, y, width, height);
|
|
vbo_draw();
|
|
glViewport(x, y, width, height);
|
|
cached_x = x;
|
|
cached_y = y;
|
|
cached_width = width;
|
|
cached_height = height;
|
|
}
|
|
else
|
|
{
|
|
WriteTrace(TraceOGLWrapper, TraceDebug, "ignored x: %d, y: %d, width: %d, height: %d", x, y, width, height);
|
|
}
|
|
}
|
|
|