Optimize PSP slightly
This commit is contained in:
@@ -10,7 +10,12 @@
|
||||
#include "display/displaygl.h"
|
||||
#include "error/errorgl.h"
|
||||
|
||||
static bool_t DISPLAY_SDL2_STATE_VALID = false;
|
||||
static uint8_t DISPLAY_SDL2_STATE_FLAGS = 0;
|
||||
|
||||
errorret_t displaySDL2Init(void) {
|
||||
DISPLAY_SDL2_STATE_VALID = false;
|
||||
|
||||
uint32_t flags = SDL_INIT_VIDEO;
|
||||
#ifdef DUSK_INPUT_GAMEPAD
|
||||
flags |= SDL_INIT_GAMECONTROLLER | SDL_INIT_JOYSTICK;
|
||||
@@ -103,38 +108,53 @@ errorret_t displaySDL2Swap(void) {
|
||||
}
|
||||
|
||||
errorret_t displaySDL2SetState(displaystate_t state) {
|
||||
if(state.flags & DISPLAY_STATE_FLAG_CULL) {
|
||||
glEnable(GL_CULL_FACE);
|
||||
errorChain(errorGLCheck());
|
||||
glCullFace(GL_BACK);
|
||||
errorChain(errorGLCheck());
|
||||
} else {
|
||||
glDisable(GL_CULL_FACE);
|
||||
errorChain(errorGLCheck());
|
||||
// Only touch GL state that actually differs from what's already bound --
|
||||
// avoids a redundant glEnable/glDisable/glBlendFunc/glDepthFunc round
|
||||
// trip per draw when consecutive entities share the same display state.
|
||||
const uint8_t changed = DISPLAY_SDL2_STATE_VALID ?
|
||||
(state.flags ^ DISPLAY_SDL2_STATE_FLAGS) : 0xFF;
|
||||
|
||||
if(changed & DISPLAY_STATE_FLAG_CULL) {
|
||||
if(state.flags & DISPLAY_STATE_FLAG_CULL) {
|
||||
glEnable(GL_CULL_FACE);
|
||||
errorChain(errorGLCheck());
|
||||
glCullFace(GL_BACK);
|
||||
errorChain(errorGLCheck());
|
||||
} else {
|
||||
glDisable(GL_CULL_FACE);
|
||||
errorChain(errorGLCheck());
|
||||
}
|
||||
}
|
||||
|
||||
if(state.flags & DISPLAY_STATE_FLAG_DEPTH_TEST) {
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
errorChain(errorGLCheck());
|
||||
glDepthFunc(GL_LEQUAL);
|
||||
errorChain(errorGLCheck());
|
||||
glClearDepth(1.0f);
|
||||
errorChain(errorGLCheck());
|
||||
} else {
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
errorChain(errorGLCheck());
|
||||
if(changed & DISPLAY_STATE_FLAG_DEPTH_TEST) {
|
||||
if(state.flags & DISPLAY_STATE_FLAG_DEPTH_TEST) {
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
errorChain(errorGLCheck());
|
||||
glDepthFunc(GL_LEQUAL);
|
||||
errorChain(errorGLCheck());
|
||||
glClearDepth(1.0f);
|
||||
errorChain(errorGLCheck());
|
||||
} else {
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
errorChain(errorGLCheck());
|
||||
}
|
||||
}
|
||||
|
||||
if(state.flags & DISPLAY_STATE_FLAG_BLEND) {
|
||||
glEnable(GL_BLEND);
|
||||
errorChain(errorGLCheck());
|
||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
errorChain(errorGLCheck());
|
||||
} else {
|
||||
glDisable(GL_BLEND);
|
||||
errorChain(errorGLCheck());
|
||||
if(changed & DISPLAY_STATE_FLAG_BLEND) {
|
||||
if(state.flags & DISPLAY_STATE_FLAG_BLEND) {
|
||||
glEnable(GL_BLEND);
|
||||
errorChain(errorGLCheck());
|
||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
errorChain(errorGLCheck());
|
||||
} else {
|
||||
glDisable(GL_BLEND);
|
||||
errorChain(errorGLCheck());
|
||||
}
|
||||
}
|
||||
|
||||
DISPLAY_SDL2_STATE_FLAGS = state.flags;
|
||||
DISPLAY_SDL2_STATE_VALID = true;
|
||||
|
||||
errorOk();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user