Shader first pass

This commit is contained in:
2026-03-17 08:42:43 -05:00
parent 7356286fe0
commit ff92a78dda
24 changed files with 634 additions and 87 deletions
+57 -40
View File
@@ -44,11 +44,11 @@ errorret_t screenInit() {
#endif
// Init screen to backbuffer mode by default
screenBind();
errorChain(screenBind());
errorOk();
}
void screenBind() {
errorret_t screenBind() {
// Assume backbuffer is currently bound.
switch(SCREEN.mode) {
case SCREEN_MODE_BACKBUFFER: {
@@ -59,7 +59,7 @@ void screenBind() {
// No needd for a framebuffer.
#ifdef DUSK_DISPLAY_SIZE_DYNAMIC
if(SCREEN.framebufferReady) {
frameBufferDispose(&SCREEN.framebuffer);
errorChain(frameBufferDispose(&SCREEN.framebuffer));
SCREEN.framebufferReady = false;
}
#endif
@@ -79,19 +79,21 @@ void screenBind() {
curFbHeight = frameBufferGetHeight(&SCREEN.framebuffer);
if(curFbWidth == SCREEN.width && curFbHeight == SCREEN.height) {
// Correct size, nothing to do.
frameBufferBind(&SCREEN.framebuffer);
return;
errorChain(frameBufferBind(&SCREEN.framebuffer));
errorOk();
}
// Need a new framebuffer.
frameBufferDispose(&SCREEN.framebuffer);
errorChain(frameBufferDispose(&SCREEN.framebuffer));
SCREEN.framebufferReady = false;
}
// Create new framebuffer
frameBufferInit(&SCREEN.framebuffer, SCREEN.width, SCREEN.height);
errorChain(frameBufferInit(
&SCREEN.framebuffer, SCREEN.width, SCREEN.height
));
SCREEN.framebufferReady = true;
frameBufferBind(&SCREEN.framebuffer);
errorChain(frameBufferBind(&SCREEN.framebuffer));
break;
}
@@ -109,10 +111,10 @@ void screenBind() {
SCREEN.aspect = (float_t)SCREEN.width / (float_t)SCREEN.height;
if(SCREEN.framebufferReady) {
frameBufferDispose(&SCREEN.framebuffer);
errorChain(frameBufferDispose(&SCREEN.framebuffer));
SCREEN.framebufferReady = false;
}
return;
errorOk();
}
int32_t newFbWidth, newFbHeight;
@@ -136,24 +138,26 @@ void screenBind() {
SCREEN.width = newFbWidth;
SCREEN.height = newFbHeight;
SCREEN.aspect = (float_t)SCREEN.width / (float_t)SCREEN.height;
frameBufferBind(&SCREEN.framebuffer);
return;
errorChain(frameBufferBind(&SCREEN.framebuffer));
errorOk();
}
// Need a new framebuffer.
frameBufferDispose(&SCREEN.framebuffer);
errorChain(frameBufferDispose(&SCREEN.framebuffer));
SCREEN.framebufferReady = false;
}
// Create new framebuffer
frameBufferInit(&SCREEN.framebuffer, newFbWidth, newFbHeight);
errorChain(frameBufferInit(
&SCREEN.framebuffer, newFbWidth, newFbHeight
));
SCREEN.width = newFbWidth;
SCREEN.height = newFbHeight;
SCREEN.aspect = (float_t)SCREEN.width / (float_t)SCREEN.height;
SCREEN.framebufferReady = true;
// Bind FB
frameBufferBind(&SCREEN.framebuffer);
errorChain(frameBufferBind(&SCREEN.framebuffer));
break;
}
@@ -173,10 +177,10 @@ void screenBind() {
if(fbWidth == newFbWidth && fbHeight == newFbHeight) {
// No need to use framebuffer.
if(SCREEN.framebufferReady) {
frameBufferDispose(&SCREEN.framebuffer);
errorChain(frameBufferDispose(&SCREEN.framebuffer));
SCREEN.framebufferReady = false;
}
return;
errorOk();
}
if(SCREEN.framebufferReady) {
@@ -185,19 +189,21 @@ void screenBind() {
curFbWidth = frameBufferGetWidth(&SCREEN.framebuffer);
curFbHeight = frameBufferGetHeight(&SCREEN.framebuffer);
if(curFbWidth == newFbWidth && curFbHeight == newFbHeight) {
frameBufferBind(&SCREEN.framebuffer);
return;
errorChain(frameBufferBind(&SCREEN.framebuffer));
errorOk();
}
// Need a new framebuffer.
frameBufferDispose(&SCREEN.framebuffer);
errorChain(frameBufferDispose(&SCREEN.framebuffer));
SCREEN.framebufferReady = false;
}
// Create a new framebuffer.
frameBufferInit(&SCREEN.framebuffer, newFbWidth, newFbHeight);
errorChain(frameBufferInit(
&SCREEN.framebuffer, newFbWidth, newFbHeight
));
SCREEN.framebufferReady = true;
frameBufferBind(&SCREEN.framebuffer);
errorChain(frameBufferBind(&SCREEN.framebuffer));
break;
}
@@ -217,10 +223,10 @@ void screenBind() {
if(fbWidth == newFbWidth && fbHeight == newFbHeight) {
// No need to use framebuffer.
if(SCREEN.framebufferReady) {
frameBufferDispose(&SCREEN.framebuffer);
errorChain(frameBufferDispose(&SCREEN.framebuffer));
SCREEN.framebufferReady = false;
}
return;
errorOk();
}
if(SCREEN.framebufferReady) {
@@ -229,19 +235,21 @@ void screenBind() {
curFbWidth = frameBufferGetWidth(&SCREEN.framebuffer);
curFbHeight = frameBufferGetHeight(&SCREEN.framebuffer);
if(curFbWidth == newFbWidth && curFbHeight == newFbHeight) {
frameBufferBind(&SCREEN.framebuffer);
return;
errorChain(frameBufferBind(&SCREEN.framebuffer));
errorOk();
}
// Need a new framebuffer.
frameBufferDispose(&SCREEN.framebuffer);
errorChain(frameBufferDispose(&SCREEN.framebuffer));
SCREEN.framebufferReady = false;
}
// Create a new framebuffer.
frameBufferInit(&SCREEN.framebuffer, newFbWidth, newFbHeight);
errorChain(frameBufferInit(
&SCREEN.framebuffer, newFbWidth, newFbHeight
));
SCREEN.framebufferReady = true;
frameBufferBind(&SCREEN.framebuffer);
errorChain(frameBufferBind(&SCREEN.framebuffer));
break;
}
@@ -262,9 +270,11 @@ void screenBind() {
break;
}
}
errorOk();
}
void screenUnbind() {
errorret_t screenUnbind() {
switch(SCREEN.mode) {
// Nothing to do here.
case SCREEN_MODE_BACKBUFFER:
@@ -275,7 +285,9 @@ void screenUnbind() {
case SCREEN_MODE_FIXED_HEIGHT:
case SCREEN_MODE_FIXED_SIZE:
case SCREEN_MODE_FIXED_WIDTH:
if(SCREEN.framebufferReady) frameBufferBind(NULL);
if(SCREEN.framebufferReady) {
errorChain(frameBufferBind(NULL));
}
break;
case SCREEN_MODE_FIXED_VIEWPORT_HEIGHT:
@@ -286,17 +298,19 @@ void screenUnbind() {
assertUnreachable("Invalid screen mode.");
break;
}
errorOk();
}
void screenRender() {
errorret_t screenRender() {
if(SCREEN.mode == SCREEN_MODE_BACKBUFFER) {
return;
errorOk();
}
#ifdef DUSK_DISPLAY_SIZE_DYNAMIC
if(SCREEN.mode == SCREEN_MODE_FIXED_VIEWPORT_HEIGHT) {
glViewport(0, 0, SCREEN.width, SCREEN.height);
return;
errorOk();
}
if(
@@ -307,7 +321,7 @@ void screenRender() {
) {
if(!SCREEN.framebufferReady) {
// Nothing to do here.
return;
errorOk();
}
float_t bbWidth, bbHeight;
@@ -357,22 +371,25 @@ void screenRender() {
COLOR_BLACK
);
cameraPushMatrix(&SCREEN.framebufferCamera);
textureBind(&SCREEN.framebuffer.texture);
meshDraw(&SCREEN.frameBufferMesh, 0, -1);
errorChain(textureBind(&SCREEN.framebuffer.texture));
errorChain(meshDraw(&SCREEN.frameBufferMesh, 0, -1));
cameraPopMatrix();
return;
errorOk();
};
#endif
assertUnreachable("Invalid screen mode.");
errorThrow("Invalid screen mode.");
}
void screenDispose() {
errorret_t screenDispose() {
#ifdef DUSK_DISPLAY_SIZE_DYNAMIC
if(SCREEN.framebufferReady) {
frameBufferDispose(&SCREEN.framebuffer);
errorChain(frameBufferDispose(&SCREEN.framebuffer));
SCREEN.framebufferReady = false;
}
#endif
errorOk();
}