1
0
mirror of https://github.com/blawar/GLideN64.git synced 2024-07-07 03:13:49 +00:00

Add cached versions of GL state functions. These functions change GL state

only when it differs from previous cached state.

Idea and partial implementation is taken from gles2glide64.
This commit is contained in:
Sergey Lipskiy 2015-02-16 15:19:47 +06:00
parent ce97a2c626
commit 4fd0ebfa32
8 changed files with 339 additions and 2 deletions

View File

@ -21,6 +21,7 @@ set(GLideN64_SOURCES
gDP.cpp
GLideN64.cpp
GLSLCombiner.cpp
glState.cpp
gSP.cpp
L3D.cpp
L3DEX2.cpp

View File

@ -266,6 +266,7 @@
<ClCompile Include="GBI.cpp" />
<ClCompile Include="gDP.cpp" />
<ClCompile Include="GLideN64.cpp" />
<ClCompile Include="glState.cpp" />
<ClCompile Include="gSP.cpp" />
<ClCompile Include="MupenPlusPluginAPI.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>

View File

@ -189,6 +189,9 @@
<ClCompile Include="PostProcessor.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="glState.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="3DMath.h">

View File

@ -1277,6 +1277,7 @@ void OGLRender::_initStates()
void OGLRender::_initData()
{
glState.reset();
_initExtensions();
_initStates();
_setSpecialTexrect();

View File

@ -32,6 +32,7 @@
#endif // USE_SDL
#endif // OS_WINDOWS
#include "glState.h"
#include "gSP.h"
#define INDEXMAP_SIZE 80U

43
glState.cpp Normal file
View File

@ -0,0 +1,43 @@
#include "OpenGL.h"
#ifdef GLSTATE_H
void GLState::reset()
{
cached_ActiveTexture_texture = 0;
cached_BlendFunc_sfactor = 0;
cached_BlendFunc_dfactor = 0;
cached_ReadBufferMode = 0;
cached_glPixelStorei_target = 0;
cached_glPixelStorei_param = 0;
cached_ClearColor_red = 0;
cached_ClearColor_green = 0;
cached_ClearColor_blue = 0;
cached_ClearColor_alpha = 0;
cached_CullFace_mode = 0;
cached_DepthFunc_func = 0;
cached_DepthMask_flag = 0;
cached_BLEND = false;
cached_CULL_FACE = false;
cached_DEPTH_TEST = false;
cached_DITHER = false;
cached_POLYGON_OFFSET_FILL = false;
cached_SAMPLE_ALPHA_TO_COVERAGE = false;
cached_SAMPLE_COVERAGE = false;
cached_SCISSOR_TEST = false;
cached_PolygonOffset_factor = 0;
cached_PolygonOffset_units = 0;
cached_Scissor_x = 0;
cached_Scissor_y = 0;
cached_Scissor_width = 0;
cached_Scissor_height = 0;
cached_UseProgram_program = -1;
cached_Viewport_x = 0;
cached_Viewport_y = 0;
cached_Viewport_width = 0;
cached_Viewport_height = 0;
}
GLState glState;
#endif // GLSTATE_H

289
glState.h Normal file
View File

@ -0,0 +1,289 @@
#ifndef GLSTATE_H
#define GLSTATE_H
struct GLState {
GLState() { reset(); }
void reset();
GLenum cached_ActiveTexture_texture;
GLenum cached_BlendFunc_sfactor;
GLenum cached_BlendFunc_dfactor;
GLenum cached_ReadBufferMode;
GLenum cached_glPixelStorei_target;
GLint cached_glPixelStorei_param;
GLclampf cached_ClearColor_red;
GLclampf cached_ClearColor_green;
GLclampf cached_ClearColor_blue;
GLclampf cached_ClearColor_alpha;
GLenum cached_DepthFunc_func;
GLboolean cached_DepthMask_flag;
bool cached_BLEND;
bool cached_CULL_FACE;
bool cached_DEPTH_TEST;
bool cached_DITHER;
bool cached_POLYGON_OFFSET_FILL;
bool cached_SAMPLE_ALPHA_TO_COVERAGE;
bool cached_SAMPLE_COVERAGE;
bool cached_SCISSOR_TEST;
GLenum cached_FrontFace_mode;
GLenum cached_CullFace_mode;
GLfloat cached_PolygonOffset_factor;
GLfloat cached_PolygonOffset_units;
GLint cached_Scissor_x;
GLint cached_Scissor_y;
GLsizei cached_Scissor_width;
GLsizei cached_Scissor_height;
GLuint cached_UseProgram_program;
GLint cached_Viewport_x;
GLint cached_Viewport_y;
GLsizei cached_Viewport_width;
GLsizei cached_Viewport_height;
};
extern GLState glState;
void inline cache_glActiveTexture (GLenum texture)
{
if (texture != glState.cached_ActiveTexture_texture) {
glActiveTexture(texture);
glState.cached_ActiveTexture_texture = texture;
}
}
#define glActiveTexture(texture) cache_glActiveTexture(texture)
void inline cache_glBlendFunc (GLenum sfactor, GLenum dfactor)
{
if (sfactor != glState.cached_BlendFunc_sfactor || dfactor != glState.cached_BlendFunc_dfactor) {
glBlendFunc(sfactor, dfactor);
glState.cached_BlendFunc_sfactor = sfactor;
glState.cached_BlendFunc_dfactor = dfactor;
}
}
#define glBlendFunc(sfactor, dfactor) cache_glBlendFunc(sfactor, dfactor)
void inline cache_glReadBuffer(GLenum mode)
{
if (mode != glState.cached_ReadBufferMode)
glState.cached_ReadBufferMode = mode;
}
#define glReadBuffer(mode) cache_glReadBuffer(mode)
void inline cache_glPixelStorei(GLenum target, GLint param)
{
if (target != glState.cached_glPixelStorei_target || param != glState.cached_glPixelStorei_param) {
glPixelStorei(target, param);
glState.cached_glPixelStorei_target = target;
glState.cached_glPixelStorei_param = param;
}
}
#define glPixelStorei(target, param) cache_glPixelStorei(target, param)
void inline cache_glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
{
if (red != glState.cached_ClearColor_red || green != glState.cached_ClearColor_green || blue != glState.cached_ClearColor_blue || alpha != glState.cached_ClearColor_alpha) {
glClearColor(red, green, blue, alpha);
glState.cached_ClearColor_red = red;
glState.cached_ClearColor_green = green;
glState.cached_ClearColor_blue = blue;
glState.cached_ClearColor_alpha = alpha;
}
}
#define glClearColor(red, green, blue, alpha) cache_glClearColor(red, green, blue, alpha)
void inline cache_glCullFace (GLenum mode)
{
if (mode != glState.cached_CullFace_mode) {
glCullFace(mode);
glState.cached_CullFace_mode = mode;
}
}
#define glCullFace(mode) cache_glCullFace(mode)
void inline cache_glDepthFunc (GLenum func)
{
if (func != glState.cached_DepthFunc_func) {
glDepthFunc(func);
glState.cached_DepthFunc_func = func;
}
}
#define glDepthFunc(func) cache_glDepthFunc(func)
void inline cache_glDepthMask (GLboolean flag)
{
if (flag != glState.cached_DepthMask_flag) {
glDepthMask(flag);
glState.cached_DepthMask_flag = flag;
}
}
#define glDepthMask(flag) cache_glDepthMask(flag)
void inline cache_glDisable (GLenum cap)
{
switch (cap) {
case GL_BLEND:
if (glState.cached_BLEND) {
glDisable(GL_BLEND);
glState.cached_BLEND = false;
}
break;
case GL_CULL_FACE:
if (glState.cached_CULL_FACE) {
glDisable(GL_CULL_FACE);
glState.cached_CULL_FACE = false;
}
break;
case GL_DEPTH_TEST:
if (glState.cached_DEPTH_TEST) {
glDisable(GL_DEPTH_TEST);
glState.cached_DEPTH_TEST = false;
}
break;
case GL_DITHER:
if (glState.cached_DITHER) {
glDisable(GL_DITHER);
glState.cached_DITHER = false;
}
break;
case GL_POLYGON_OFFSET_FILL:
if (glState.cached_POLYGON_OFFSET_FILL) {
glDisable(GL_POLYGON_OFFSET_FILL);
glState.cached_POLYGON_OFFSET_FILL = false;
}
break;
case GL_SAMPLE_ALPHA_TO_COVERAGE:
if (glState.cached_SAMPLE_ALPHA_TO_COVERAGE) {
glDisable(GL_SAMPLE_ALPHA_TO_COVERAGE);
glState.cached_SAMPLE_ALPHA_TO_COVERAGE = false;
}
break;
case GL_SAMPLE_COVERAGE:
if (glState.cached_SAMPLE_COVERAGE) {
glDisable(GL_SAMPLE_COVERAGE);
glState.cached_SAMPLE_COVERAGE = false;
}
break;
case GL_SCISSOR_TEST:
if (glState.cached_SCISSOR_TEST) {
glDisable(GL_SCISSOR_TEST);
glState.cached_SCISSOR_TEST = false;
}
break;
default:
glDisable(cap);
break;
}
}
#define glDisable(cap) cache_glDisable(cap)
void inline cache_glEnable(GLenum cap)
{
switch (cap) {
case GL_BLEND:
if (!glState.cached_BLEND) {
glEnable(GL_BLEND);
glState.cached_BLEND = true;
}
break;
case GL_CULL_FACE:
if (!glState.cached_CULL_FACE) {
glEnable(GL_CULL_FACE);
glState.cached_CULL_FACE = true;
}
break;
case GL_DEPTH_TEST:
if (!glState.cached_DEPTH_TEST) {
glEnable(GL_DEPTH_TEST);
glState.cached_DEPTH_TEST = true;
}
break;
case GL_DITHER:
if (!glState.cached_DITHER) {
glEnable(GL_DITHER);
glState.cached_DITHER = true;
}
break;
case GL_POLYGON_OFFSET_FILL:
if (!glState.cached_POLYGON_OFFSET_FILL) {
glEnable(GL_POLYGON_OFFSET_FILL);
glState.cached_POLYGON_OFFSET_FILL = true;
}
break;
case GL_SAMPLE_ALPHA_TO_COVERAGE:
if (!glState.cached_SAMPLE_ALPHA_TO_COVERAGE) {
glEnable(GL_SAMPLE_ALPHA_TO_COVERAGE);
glState.cached_SAMPLE_ALPHA_TO_COVERAGE = true;
}
break;
case GL_SAMPLE_COVERAGE:
if (!glState.cached_SAMPLE_COVERAGE) {
glEnable(GL_SAMPLE_COVERAGE);
glState.cached_SAMPLE_COVERAGE = true;
}
break;
case GL_SCISSOR_TEST:
if (!glState.cached_SCISSOR_TEST) {
glEnable(GL_SCISSOR_TEST);
glState.cached_SCISSOR_TEST = true;
}
break;
default:
glEnable(cap);
break;
}
}
#define glEnable(cap) cache_glEnable(cap)
void inline cache_glPolygonOffset (GLfloat factor, GLfloat units)
{
if (factor != glState.cached_PolygonOffset_factor || units != glState.cached_PolygonOffset_units) {
glPolygonOffset(factor, units);
glState.cached_PolygonOffset_factor = factor;
glState.cached_PolygonOffset_units = units;
}
}
#define glPolygonOffset(factor, units) cache_glPolygonOffset(factor, units)
void inline cache_glScissor (GLint x, GLint y, GLsizei width, GLsizei height)
{
if (x != glState.cached_Scissor_x || y != glState.cached_Scissor_y || width != glState.cached_Scissor_width || height != glState.cached_Scissor_height) {
glScissor(x, y, width, height);
glState.cached_Scissor_x = x;
glState.cached_Scissor_y = y;
glState.cached_Scissor_width = width;
glState.cached_Scissor_height = height;
}
}
#define glScissor(x, y, width, height) cache_glScissor(x, y, width, height)
void inline cache_glUseProgram (GLuint program)
{
if (program != glState.cached_UseProgram_program) {
glUseProgram(program);
glState.cached_UseProgram_program = program;
}
}
#define glUseProgram(program) cache_glUseProgram(program)
void inline cache_glViewport (GLint x, GLint y, GLsizei width, GLsizei height)
{
if (x != glState.cached_Viewport_x || y != glState.cached_Viewport_y || width != glState.cached_Viewport_width || height != glState.cached_Viewport_height) {
glViewport(x, y, width, height);
glState.cached_Viewport_x = x;
glState.cached_Viewport_y = y;
glState.cached_Viewport_width = width;
glState.cached_Viewport_height = height;
}
}
#define glViewport(x, y, width, height) cache_glViewport(x, y, width, height)
#endif //GLSTATE_H

View File

@ -7,8 +7,6 @@
#include "../GLideN64.h"
#include "../GBI.h"
#include "../RSP.h"
#include "../Textures.h"
#include "../OpenGL.h"
#include "../Log.h"
Config config;