mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
Move native/gfx_es2/gl_state.cpp/h into GPU/GLES/GLStateCache.cpp/h
This commit is contained in:
parent
08735b806f
commit
ab3468ea02
20 changed files with 320 additions and 20 deletions
|
@ -923,8 +923,6 @@ add_library(native STATIC
|
|||
native/gfx_es2/draw_buffer.h
|
||||
native/gfx_es2/draw_text.cpp
|
||||
native/gfx_es2/draw_text.h
|
||||
native/gfx_es2/gl_state.cpp
|
||||
native/gfx_es2/gl_state.h
|
||||
native/gfx_es2/gpu_features.cpp
|
||||
native/gfx_es2/gpu_features.h
|
||||
native/gfx_es2/glsl_program.cpp
|
||||
|
@ -1487,6 +1485,8 @@ add_library(GPU OBJECT
|
|||
GPU/GLES/FBO.h
|
||||
GPU/GLES/GLES_GPU.cpp
|
||||
GPU/GLES/GLES_GPU.h
|
||||
GPU/GLES/GLStateCache.cpp
|
||||
GPU/GLES/GLStateCache.h
|
||||
GPU/GLES/FragmentShaderGenerator.cpp
|
||||
GPU/GLES/FragmentShaderGenerator.h
|
||||
GPU/GLES/FragmentTestCache.cpp
|
||||
|
|
|
@ -17,10 +17,10 @@
|
|||
|
||||
#include <stdio.h>
|
||||
|
||||
#include "gfx_es2/gl_state.h"
|
||||
#include "Common/Log.h"
|
||||
#include "Core/Reporting.h"
|
||||
#include "GPU/GPUState.h"
|
||||
#include "GPU/GLES/GLStateCache.h"
|
||||
#include "GPU/Common/DepalettizeShaderCommon.h"
|
||||
|
||||
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
#include "Core/Reporting.h"
|
||||
#include "DepalettizeShader.h"
|
||||
#include "GPU/GLES/TextureCache.h"
|
||||
#include "GPU/GLES/GLStateCache.h"
|
||||
#include "GPU/Common/DepalettizeShaderCommon.h"
|
||||
|
||||
static const int DEPAL_TEXTURE_OLD_AGE = 120;
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
#include <map>
|
||||
|
||||
#include "Common/CommonTypes.h"
|
||||
#include "gfx_es2/gl_state.h"
|
||||
#include "gfx/gl_common.h"
|
||||
#include "GPU/ge_constants.h"
|
||||
|
||||
class DepalShader {
|
||||
|
|
|
@ -19,8 +19,8 @@
|
|||
|
||||
#include "base/logging.h"
|
||||
#include "gfx/gl_common.h"
|
||||
#include "gfx_es2/gl_state.h"
|
||||
|
||||
#include "GPU/GLES/GLStateCache.h"
|
||||
#include "GPU/GLES/FBO.h"
|
||||
|
||||
#ifdef IOS
|
||||
|
|
|
@ -19,10 +19,11 @@
|
|||
|
||||
#include <map>
|
||||
#include "Common/CommonTypes.h"
|
||||
#include "gfx_es2/gl_state.h"
|
||||
#include "GPU/ge_constants.h"
|
||||
#include "GPU/GLES/GLStateCache.h"
|
||||
#include "GPU/GLES/TextureCache.h"
|
||||
|
||||
#include "GPU/ge_constants.h"
|
||||
|
||||
struct FragmentTestID {
|
||||
union {
|
||||
struct {
|
||||
|
|
|
@ -21,7 +21,6 @@
|
|||
#include "profiler/profiler.h"
|
||||
|
||||
#include "gfx_es2/glsl_program.h"
|
||||
#include "gfx_es2/gl_state.h"
|
||||
|
||||
#include "base/timeutil.h"
|
||||
#include "math/lin/matrix4x4.h"
|
||||
|
@ -40,6 +39,7 @@
|
|||
#include "GPU/Common/TextureDecoder.h"
|
||||
#include "GPU/Common/FramebufferCommon.h"
|
||||
#include "GPU/Debugger/Stepping.h"
|
||||
#include "GPU/GLES/GLStateCache.h"
|
||||
#include "GPU/GLES/FBO.h"
|
||||
#include "GPU/GLES/Framebuffer.h"
|
||||
#include "GPU/GLES/TextureCache.h"
|
||||
|
|
|
@ -16,7 +16,6 @@
|
|||
// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.
|
||||
|
||||
#include "base/logging.h"
|
||||
#include "gfx_es2/gl_state.h"
|
||||
#include "profiler/profiler.h"
|
||||
|
||||
#include "Common/ChunkFile.h"
|
||||
|
@ -34,6 +33,7 @@
|
|||
#include "GPU/GeDisasm.h"
|
||||
#include "GPU/Common/FramebufferCommon.h"
|
||||
|
||||
#include "GPU/GLES/GLStateCache.h"
|
||||
#include "GPU/GLES/ShaderManager.h"
|
||||
#include "GPU/GLES/GLES_GPU.h"
|
||||
#include "GPU/GLES/Framebuffer.h"
|
||||
|
|
52
GPU/GLES/GLStateCache.cpp
Normal file
52
GPU/GLES/GLStateCache.cpp
Normal file
|
@ -0,0 +1,52 @@
|
|||
#include <stdlib.h>
|
||||
|
||||
#include "base/logging.h"
|
||||
|
||||
#include "GPU/GLES/GLStateCache.h"
|
||||
|
||||
OpenGLState glstate;
|
||||
|
||||
int OpenGLState::state_count = 0;
|
||||
|
||||
void OpenGLState::Restore() {
|
||||
int count = 0;
|
||||
|
||||
blend.restore(); count++;
|
||||
blendEquationSeparate.restore(); count++;
|
||||
blendFuncSeparate.restore(); count++;
|
||||
blendColor.restore(); count++;
|
||||
|
||||
scissorTest.restore(); count++;
|
||||
scissorRect.restore(); count++;
|
||||
|
||||
cullFace.restore(); count++;
|
||||
cullFaceMode.restore(); count++;
|
||||
frontFace.restore(); count++;
|
||||
|
||||
depthTest.restore(); count++;
|
||||
depthRange.restore(); count++;
|
||||
depthFunc.restore(); count++;
|
||||
depthWrite.restore(); count++;
|
||||
|
||||
colorMask.restore(); count++;
|
||||
viewport.restore(); count++;
|
||||
|
||||
stencilTest.restore(); count++;
|
||||
stencilOp.restore(); count++;
|
||||
stencilFunc.restore(); count++;
|
||||
stencilMask.restore(); count++;
|
||||
|
||||
dither.restore(); count++;
|
||||
|
||||
#if !defined(USING_GLES2)
|
||||
colorLogicOp.restore(); count++;
|
||||
logicOp.restore(); count++;
|
||||
#endif
|
||||
|
||||
arrayBuffer.restore(); count++;
|
||||
elementArrayBuffer.restore(); count++;
|
||||
|
||||
if (count != state_count) {
|
||||
FLOG("OpenGLState::Restore is missing some states");
|
||||
}
|
||||
}
|
240
GPU/GLES/GLStateCache.h
Normal file
240
GPU/GLES/GLStateCache.h
Normal file
|
@ -0,0 +1,240 @@
|
|||
#pragma once
|
||||
|
||||
#include <functional>
|
||||
#include <string.h>
|
||||
#include <string>
|
||||
|
||||
#include "gfx/gl_common.h"
|
||||
#include "gfx_es2/gpu_features.h"
|
||||
|
||||
// OpenGL state cache.
|
||||
// Probably only really worth it in rendering cores on weak mobile hardware.
|
||||
class OpenGLState {
|
||||
private:
|
||||
template<GLenum cap, bool init>
|
||||
class BoolState {
|
||||
private:
|
||||
bool _value;
|
||||
public:
|
||||
BoolState() : _value(init) {
|
||||
OpenGLState::state_count++;
|
||||
}
|
||||
|
||||
inline void set(bool value) {
|
||||
if (value && value != _value) {
|
||||
_value = value;
|
||||
glEnable(cap);
|
||||
}
|
||||
if (!value && value != _value) {
|
||||
_value = value;
|
||||
glDisable(cap);
|
||||
}
|
||||
}
|
||||
inline void enable() {
|
||||
set(true);
|
||||
}
|
||||
inline void disable() {
|
||||
set(false);
|
||||
}
|
||||
operator bool() const {
|
||||
return isset();
|
||||
}
|
||||
inline bool isset() {
|
||||
return _value;
|
||||
}
|
||||
void restore() {
|
||||
if (_value)
|
||||
glEnable(cap);
|
||||
else
|
||||
glDisable(cap);
|
||||
}
|
||||
};
|
||||
|
||||
#define STATE1(func, p1type, p1def) \
|
||||
class SavedState1_##func { \
|
||||
p1type p1; \
|
||||
public: \
|
||||
SavedState1_##func() : p1(p1def) { \
|
||||
OpenGLState::state_count++; \
|
||||
} \
|
||||
void set(p1type newp1) { \
|
||||
if (newp1 != p1) { \
|
||||
p1 = newp1; \
|
||||
func(p1); \
|
||||
} \
|
||||
} \
|
||||
void restore() { \
|
||||
func(p1); \
|
||||
} \
|
||||
}
|
||||
|
||||
#define STATE2(func, p1type, p2type, p1def, p2def) \
|
||||
class SavedState2_##func { \
|
||||
p1type p1; \
|
||||
p2type p2; \
|
||||
public: \
|
||||
SavedState2_##func() : p1(p1def), p2(p2def) { \
|
||||
OpenGLState::state_count++; \
|
||||
} \
|
||||
inline void set(p1type newp1, p2type newp2) { \
|
||||
if (newp1 != p1 || newp2 != p2) { \
|
||||
p1 = newp1; \
|
||||
p2 = newp2; \
|
||||
func(p1, p2); \
|
||||
} \
|
||||
} \
|
||||
inline void restore() { \
|
||||
func(p1, p2); \
|
||||
} \
|
||||
}
|
||||
|
||||
#define STATE3(func, p1type, p2type, p3type, p1def, p2def, p3def) \
|
||||
class SavedState3_##func { \
|
||||
p1type p1; \
|
||||
p2type p2; \
|
||||
p3type p3; \
|
||||
public: \
|
||||
SavedState3_##func() : p1(p1def), p2(p2def), p3(p3def) { \
|
||||
OpenGLState::state_count++; \
|
||||
} \
|
||||
inline void set(p1type newp1, p2type newp2, p3type newp3) { \
|
||||
if (newp1 != p1 || newp2 != p2 || newp3 != p3) { \
|
||||
p1 = newp1; \
|
||||
p2 = newp2; \
|
||||
p3 = newp3; \
|
||||
func(p1, p2, p3); \
|
||||
} \
|
||||
} \
|
||||
inline void restore() { \
|
||||
func(p1, p2, p3); \
|
||||
} \
|
||||
}
|
||||
|
||||
#define STATE4(func, p1type, p2type, p3type, p4type, p1def, p2def, p3def, p4def) \
|
||||
class SavedState4_##func { \
|
||||
p1type p1; \
|
||||
p2type p2; \
|
||||
p3type p3; \
|
||||
p4type p4; \
|
||||
public: \
|
||||
SavedState4_##func() : p1(p1def), p2(p2def), p3(p3def), p4(p4def) { \
|
||||
OpenGLState::state_count++; \
|
||||
} \
|
||||
inline void set(p1type newp1, p2type newp2, p3type newp3, p4type newp4) { \
|
||||
if (newp1 != p1 || newp2 != p2 || newp3 != p3 || newp4 != p4) { \
|
||||
p1 = newp1; \
|
||||
p2 = newp2; \
|
||||
p3 = newp3; \
|
||||
p4 = newp4; \
|
||||
func(p1, p2, p3, p4); \
|
||||
} \
|
||||
} \
|
||||
inline void restore() { \
|
||||
func(p1, p2, p3, p4); \
|
||||
} \
|
||||
}
|
||||
|
||||
#define STATEFLOAT4(func, def) \
|
||||
class SavedState4_##func { \
|
||||
float p[4]; \
|
||||
public: \
|
||||
SavedState4_##func() { \
|
||||
for (int i = 0; i < 4; i++) {p[i] = def;} \
|
||||
OpenGLState::state_count++; \
|
||||
} \
|
||||
inline void set(const float v[4]) { \
|
||||
if (memcmp(p,v,sizeof(float)*4)) { \
|
||||
memcpy(p,v,sizeof(float)*4); \
|
||||
func(p[0], p[1], p[2], p[3]); \
|
||||
} \
|
||||
} \
|
||||
inline void restore() { \
|
||||
func(p[0], p[1], p[2], p[3]); \
|
||||
} \
|
||||
}
|
||||
|
||||
#define STATEBIND(func, target) \
|
||||
class SavedBind_##func_##target { \
|
||||
GLuint val_; \
|
||||
public: \
|
||||
SavedBind_##func_##target() { \
|
||||
val_ = 0; \
|
||||
OpenGLState::state_count++; \
|
||||
} \
|
||||
inline void bind(GLuint val) { \
|
||||
if (val_ != val) { \
|
||||
func(target, val); \
|
||||
val_ = val; \
|
||||
} \
|
||||
} \
|
||||
inline void unbind() { \
|
||||
bind(0); \
|
||||
} \
|
||||
inline void restore() { \
|
||||
func(target, val_); \
|
||||
} \
|
||||
}
|
||||
|
||||
public:
|
||||
static int state_count;
|
||||
OpenGLState() {}
|
||||
void Restore();
|
||||
|
||||
// When adding a state here, don't forget to add it to OpenGLState::Restore() too
|
||||
|
||||
// Blending
|
||||
BoolState<GL_BLEND, false> blend;
|
||||
STATE4(glBlendFuncSeparate, GLenum, GLenum, GLenum, GLenum, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) blendFuncSeparate;
|
||||
|
||||
// On OpenGL ES, using minmax blend requires glBlendEquationEXT (in theory at least but I don't think it's true in practice)
|
||||
STATE2(glBlendEquationSeparate, GLenum, GLenum, GL_FUNC_ADD, GL_FUNC_ADD) blendEquationSeparate;
|
||||
STATEFLOAT4(glBlendColor, 1.0f) blendColor;
|
||||
|
||||
// Logic Ops. Not available on OpenGL ES at all.
|
||||
#if !defined(USING_GLES2)
|
||||
BoolState<GL_COLOR_LOGIC_OP, false> colorLogicOp;
|
||||
STATE1(glLogicOp, GLenum, GL_COPY) logicOp;
|
||||
#endif
|
||||
|
||||
// Dither
|
||||
BoolState<GL_DITHER, false> dither;
|
||||
|
||||
// Cull Face
|
||||
BoolState<GL_CULL_FACE, false> cullFace;
|
||||
STATE1(glCullFace, GLenum, GL_FRONT) cullFaceMode;
|
||||
STATE1(glFrontFace, GLenum, GL_CCW) frontFace;
|
||||
|
||||
// Depth Test
|
||||
BoolState<GL_DEPTH_TEST, false> depthTest;
|
||||
#if defined(USING_GLES2)
|
||||
STATE2(glDepthRangef, float, float, 0.f, 1.f) depthRange;
|
||||
#else
|
||||
STATE2(glDepthRange, double, double, 0.0, 1.0) depthRange;
|
||||
#endif
|
||||
STATE1(glDepthFunc, GLenum, GL_LESS) depthFunc;
|
||||
STATE1(glDepthMask, GLboolean, GL_TRUE) depthWrite;
|
||||
|
||||
// Color Mask
|
||||
STATE4(glColorMask, bool, bool, bool, bool, true, true, true, true) colorMask;
|
||||
|
||||
// Viewport
|
||||
STATE4(glViewport, GLint, GLint, GLsizei, GLsizei, 0, 0, 128, 128) viewport;
|
||||
|
||||
// Scissor Test
|
||||
BoolState<GL_SCISSOR_TEST, false> scissorTest;
|
||||
STATE4(glScissor, GLint, GLint, GLsizei, GLsizei, 0, 0, 128, 128) scissorRect;
|
||||
|
||||
// Stencil Test
|
||||
BoolState<GL_STENCIL_TEST, false> stencilTest;
|
||||
STATE3(glStencilOp, GLenum, GLenum, GLenum, GL_KEEP, GL_KEEP, GL_KEEP) stencilOp;
|
||||
STATE3(glStencilFunc, GLenum, GLint, GLuint, GL_ALWAYS, 0, 0xFF) stencilFunc;
|
||||
STATE1(glStencilMask, GLuint, 0xFF) stencilMask;
|
||||
|
||||
STATEBIND(glBindBuffer, GL_ARRAY_BUFFER) arrayBuffer;
|
||||
STATEBIND(glBindBuffer, GL_ELEMENT_ARRAY_BUFFER) elementArrayBuffer;
|
||||
};
|
||||
|
||||
#undef STATE1
|
||||
#undef STATE2
|
||||
|
||||
extern OpenGLState glstate;
|
|
@ -27,7 +27,6 @@
|
|||
|
||||
#include "base/logging.h"
|
||||
#include "math/math_util.h"
|
||||
#include "gfx_es2/gl_state.h"
|
||||
#include "math/lin/matrix4x4.h"
|
||||
#include "profiler/profiler.h"
|
||||
|
||||
|
@ -36,6 +35,7 @@
|
|||
#include "GPU/Math3D.h"
|
||||
#include "GPU/GPUState.h"
|
||||
#include "GPU/ge_constants.h"
|
||||
#include "GPU/GLES/GLStateCache.h"
|
||||
#include "GPU/GLES/ShaderManager.h"
|
||||
#include "GPU/GLES/TransformPipeline.h"
|
||||
#include "UI/OnScreenDisplay.h"
|
||||
|
|
|
@ -21,7 +21,6 @@
|
|||
|
||||
|
||||
#include "StateMapping.h"
|
||||
#include "gfx_es2/gl_state.h"
|
||||
#include "profiler/profiler.h"
|
||||
|
||||
#include "GPU/Math3D.h"
|
||||
|
@ -31,6 +30,7 @@
|
|||
#include "Core/Config.h"
|
||||
#include "Core/Reporting.h"
|
||||
#include "GPU/GLES/GLES_GPU.h"
|
||||
#include "GPU/GLES/GLStateCache.h"
|
||||
#include "GPU/GLES/ShaderManager.h"
|
||||
#include "GPU/GLES/TextureCache.h"
|
||||
#include "GPU/GLES/Framebuffer.h"
|
||||
|
|
|
@ -16,8 +16,8 @@
|
|||
// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.
|
||||
|
||||
#include "gfx_es2/glsl_program.h"
|
||||
#include "gfx_es2/gl_state.h"
|
||||
#include "Core/Reporting.h"
|
||||
#include "GPU/GLES/GLStateCache.h"
|
||||
#include "GPU/GLES/Framebuffer.h"
|
||||
#include "GPU/GLES/ShaderManager.h"
|
||||
#include "GPU/GLES/TextureCache.h"
|
||||
|
|
|
@ -18,6 +18,8 @@
|
|||
#include <algorithm>
|
||||
#include <cstring>
|
||||
|
||||
#include "ext/xxhash.h"
|
||||
#include "math/math_util.h"
|
||||
#include "profiler/profiler.h"
|
||||
|
||||
#include "Common/ColorConv.h"
|
||||
|
@ -26,6 +28,7 @@
|
|||
#include "Core/Reporting.h"
|
||||
#include "GPU/ge_constants.h"
|
||||
#include "GPU/GPUState.h"
|
||||
#include "GPU/GLES/GLStateCache.h"
|
||||
#include "GPU/GLES/TextureCache.h"
|
||||
#include "GPU/GLES/Framebuffer.h"
|
||||
#include "GPU/GLES/FragmentShaderGenerator.h"
|
||||
|
@ -35,10 +38,6 @@
|
|||
#include "Core/Config.h"
|
||||
#include "Core/Host.h"
|
||||
|
||||
#include "ext/xxhash.h"
|
||||
#include "math/math_util.h"
|
||||
#include "native/gfx_es2/gl_state.h"
|
||||
|
||||
#ifdef _M_SSE
|
||||
#include <xmmintrin.h>
|
||||
#endif
|
||||
|
|
|
@ -72,7 +72,6 @@
|
|||
#include "Core/Config.h"
|
||||
#include "Core/CoreTiming.h"
|
||||
|
||||
#include "gfx_es2/gl_state.h"
|
||||
#include "profiler/profiler.h"
|
||||
|
||||
#include "GPU/Math3D.h"
|
||||
|
@ -83,6 +82,7 @@
|
|||
#include "GPU/Common/SplineCommon.h"
|
||||
#include "GPU/Common/VertexDecoderCommon.h"
|
||||
#include "GPU/Common/SoftwareTransformCommon.h"
|
||||
#include "GPU/GLES/GLStateCache.h"
|
||||
#include "GPU/GLES/FragmentTestCache.h"
|
||||
#include "GPU/GLES/StateMapping.h"
|
||||
#include "GPU/GLES/TextureCache.h"
|
||||
|
|
|
@ -222,6 +222,7 @@
|
|||
<ClInclude Include="GLES\FragmentTestCache.h" />
|
||||
<ClInclude Include="GLES\Framebuffer.h" />
|
||||
<ClInclude Include="GLES\GLES_GPU.h" />
|
||||
<ClInclude Include="GLES\GLStateCache.h" />
|
||||
<ClInclude Include="GLES\ShaderManager.h" />
|
||||
<ClInclude Include="GLES\StateMapping.h" />
|
||||
<ClInclude Include="GLES\TextureCache.h" />
|
||||
|
@ -297,6 +298,7 @@
|
|||
<ClCompile Include="GLES\FragmentTestCache.cpp" />
|
||||
<ClCompile Include="GLES\Framebuffer.cpp" />
|
||||
<ClCompile Include="GLES\GLES_GPU.cpp" />
|
||||
<ClCompile Include="GLES\GLStateCache.cpp" />
|
||||
<ClCompile Include="GLES\ShaderManager.cpp" />
|
||||
<ClCompile Include="GLES\StateMapping.cpp" />
|
||||
<ClCompile Include="GLES\StencilBuffer.cpp" />
|
||||
|
|
|
@ -189,6 +189,9 @@
|
|||
<ClInclude Include="Directx9\helper\dx_fbo.h">
|
||||
<Filter>DirectX9\helper</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="GLES\GLStateCache.h">
|
||||
<Filter>GLES</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="Math3D.cpp">
|
||||
|
@ -365,5 +368,8 @@
|
|||
<ClCompile Include="Directx9\helper\dx_fbo.cpp">
|
||||
<Filter>DirectX9\helper</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="GLES\GLStateCache.cpp">
|
||||
<Filter>GLES</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
</Project>
|
|
@ -29,7 +29,6 @@
|
|||
#include "Core/MIPS/MIPS.h"
|
||||
#include "Core/Reporting.h"
|
||||
#include "gfx/gl_common.h"
|
||||
// #include "gfx_es2/gl_state.h"
|
||||
#include "profiler/profiler.h"
|
||||
|
||||
#include "GPU/Software/SoftGpu.h"
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
#include "debugger_memorytex.h"
|
||||
#include "gfx_es2/gl_state.h"
|
||||
#include "GPU/GLES/GLStateCache.h"
|
||||
#include "gfx/gl_common.h"
|
||||
#include "gfx/gl_lost_manager.h"
|
||||
#include "ui_debugger_memorytex.h"
|
||||
|
|
2
native
2
native
|
@ -1 +1 @@
|
|||
Subproject commit 65e3d31e249ca811809121529f1971e408c154d3
|
||||
Subproject commit 3f02f9fc778b5b4c45db92a96f0a4087f947d5a2
|
Loading…
Add table
Reference in a new issue