Fix collide issue on PSP

This commit is contained in:
2026-07-19 14:51:57 -05:00
parent 13a435e9c1
commit de0ff2e263
3 changed files with 47 additions and 52 deletions
+36 -46
View File
@@ -10,12 +10,7 @@
#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;
@@ -108,53 +103,48 @@ errorret_t displaySDL2Swap(void) {
}
errorret_t displaySDL2SetState(displaystate_t state) {
// 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());
}
// Unconditionally reapply every group on every call, rather than
// diffing against the last-applied flags and skipping unchanged ones.
// A prior version of this function cached/diffed to skip redundant GL
// calls, but that meant e.g. glDisable(GL_CULL_FACE) only ever fired
// once at program start instead of before every draw -- and on
// PSPGL/GU, GL state doesn't reliably persist across other draw calls
// the way it does on desktop GL drivers, which surfaced as faces
// rendering inconsistently depending on draw order/history. Reasserting
// every call is the same behavior this engine always had before that
// optimization, and is cheap enough not to matter.
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(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_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_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());
}
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();
}