add display state

This commit is contained in:
2026-05-04 22:16:30 -05:00
parent 31cc186424
commit 6edcf75a0c
11 changed files with 120 additions and 21 deletions
+8
View File
@@ -33,6 +33,7 @@ errorret_t displayInit(void) {
#ifdef displayPlatformInit
errorChain(displayPlatformInit());
#endif
errorChain(displaySetState((displaystate_t){ .flags = 0 }));
errorChain(textureInit(
&TEXTURE_WHITE, 4, 4,
TEXTURE_FORMAT_RGBA, (texturedata_t){ .rgbaColors = TEXTURE_WHITE_PIXELS }
@@ -110,6 +111,13 @@ errorret_t displayUpdate(void) {
errorOk();
}
errorret_t displaySetState(displaystate_t state) {
#ifdef displayPlatformSetState
errorChain(displayPlatformSetState(state));
#endif
errorOk();
}
errorret_t displayDispose(void) {
errorChain(shaderDispose(&SHADER_UNLIT));
errorChain(spriteBatchDispose());
+11
View File
@@ -40,15 +40,26 @@ extern display_t DISPLAY;
/**
* Initializes the display system.
* @return An errorret_t indicating success or failure.
*/
errorret_t displayInit(void);
/**
* Tells the display system to actually draw the frame.
* @return An errorret_t indicating success or failure.
*/
errorret_t displayUpdate(void);
/**
* Sets the display state.
*
* @param state The state to set.
* @return An errorret_t indicating success or failure.
*/
errorret_t displaySetState(displaystate_t state);
/**
* Disposes of the display system.
* @return An errorret_t indicating success or failure.
*/
errorret_t displayDispose(void);
+17
View File
@@ -0,0 +1,17 @@
/**
* Copyright (c) 2026 Dominic Masters
*
* This software is released under the MIT License.
* https://opensource.org/licenses/MIT
*/
#pragma once
#include "dusk.h"
#define DISPLAY_STATE_FLAG_CULL (1 << 0)
#define DISPLAY_STATE_FLAG_DEPTH_TEST (1 << 1)
#define DISPLAY_STATE_FLAG_BLEND (1 << 2)
typedef struct {
uint8_t flags;
} displaystate_t;
+7
View File
@@ -56,6 +56,10 @@ errorret_t sceneRender(void) {
shader_t *shaderCurrent = NULL;
mat4 view, proj, model;
errorChain(displaySetState((displaystate_t){
.flags = DISPLAY_STATE_FLAG_CULL | DISPLAY_STATE_FLAG_DEPTH_TEST
}));
// For each camera
for(entityid_t camIndex = 0; camIndex < camCount; camIndex++) {
entityid_t camEnt = camEnts[camIndex];
@@ -148,6 +152,9 @@ errorret_t sceneRender(void) {
errorChain(shaderSetMatrix(&SHADER_UNLIT, SHADER_UNLIT_PROJECTION, proj));
errorChain(shaderSetMatrix(&SHADER_UNLIT, SHADER_UNLIT_VIEW, view));
errorChain(shaderSetMatrix(&SHADER_UNLIT, SHADER_UNLIT_MODEL, model));
errorChain(displaySetState((displaystate_t){
.flags = DISPLAY_STATE_FLAG_BLEND
}));
errorChain(uiRender());
+26 -6
View File
@@ -75,10 +75,6 @@ errorret_t displayInitDolphin(void) {
)
);
// Setup cull modes
GX_SetCullMode(GX_CULL_NONE);
GX_SetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_CLEAR);
GX_SetZMode(GX_TRUE, GX_ALWAYS, GX_FALSE);
GX_SetDispCopyGamma(GX_GM_1_0);
GX_SetColorUpdate(GX_TRUE);
@@ -103,12 +99,36 @@ errorret_t displayUpdateDolphin(void) {
errorOk();
}
errorret_t displaySetStateDolphin(displaystate_t state) {
if(state.flags & DISPLAY_STATE_FLAG_CULL) {
GX_SetCullMode(GX_CULL_BACK);
} else {
GX_SetCullMode(GX_CULL_NONE);
}
if(state.flags & DISPLAY_STATE_FLAG_DEPTH_TEST) {
GX_SetZMode(GX_TRUE, GX_LEQUAL, GX_TRUE);
} else {
GX_SetZMode(GX_FALSE, GX_ALWAYS, GX_FALSE);
}
if(state.flags & DISPLAY_STATE_FLAG_BLEND) {
GX_SetBlendMode(
GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_CLEAR
);
} else {
GX_SetBlendMode(
GX_BM_NONE, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_CLEAR
);
}
errorOk();
}
errorret_t displaySwapDolphin(void) {
GX_DrawDone();
DISPLAY.whichFrameBuffer ^= 1;
// GX_SetZMode(GX_TRUE, GX_LEQUAL, GX_TRUE);
// GX_SetColorUpdate(GX_TRUE);
GX_CopyDisp(DISPLAY.frameBuffer[DISPLAY.whichFrameBuffer], GX_TRUE);
VIDEO_SetNextFramebuffer(DISPLAY.frameBuffer[DISPLAY.whichFrameBuffer]);
VIDEO_Flush();
+6
View File
@@ -7,6 +7,7 @@
#pragma once
#include "error/error.h"
#include "display/displaystate.h"
#define DISPLAY_DOLPHIN_FIFO_SIZE (256*1024)
@@ -31,3 +32,8 @@ errorret_t displayUpdateDolphin(void);
* Swaps the display buffers on Dolphin.
*/
errorret_t displaySwapDolphin(void);
/**
* Sets the display state on Dolphin.
*/
errorret_t displaySetStateDolphin(displaystate_t state);
@@ -11,5 +11,6 @@
#define displayPlatformInit displayInitDolphin
#define displayPlatformUpdate displayUpdateDolphin
#define displayPlatformSwap displaySwapDolphin
#define displayPlatformSetState displaySetStateDolphin
typedef displaydolphin_t displayplatform_t;
-14
View File
@@ -8,20 +8,6 @@
#include "displaygl.h"
errorret_t displayOpenGLInit(void) {
glDisable(GL_CULL_FACE);
errorChain(errorGLCheck());
glEnable(GL_DEPTH_TEST);
errorChain(errorGLCheck());
glDepthFunc(GL_LEQUAL);
errorChain(errorGLCheck());
glClearDepth(1.0f);
errorChain(errorGLCheck());
glEnable(GL_BLEND);
errorChain(errorGLCheck());
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
errorChain(errorGLCheck());
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
errorChain(errorGLCheck());
+1
View File
@@ -13,4 +13,5 @@ typedef displaysdl2_t displayplatform_t;
#define displayPlatformInit displaySDL2Init
#define displayPlatformUpdate displaySDL2Update
#define displayPlatformSwap displaySDL2Swap
#define displayPlatformSetState displaySDL2SetState
#define displayPlatformDispose displaySDL2Dispose
+36
View File
@@ -102,6 +102,42 @@ errorret_t displaySDL2Swap(void) {
errorOk();
}
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());
}
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());
}
errorOk();
}
void displaySDL2Dispose(void) {
if(DISPLAY.glContext) {
SDL_GL_DeleteContext(DISPLAY.glContext);
+6
View File
@@ -7,6 +7,7 @@
#pragma once
#include "error/error.h"
#include "display/displaystate.h"
typedef struct {
SDL_Window *window;
@@ -29,6 +30,11 @@ errorret_t displaySDL2Update(void);
*/
errorret_t displaySDL2Swap(void);
/**
* Sets the SDL2 display state.
*/
errorret_t displaySDL2SetState(displaystate_t state);
/**
* Disposes/Cleans up the SDL2 Render system.
*/