Shader test past
Some checks failed
CI / React UI Build (push) Successful in 11s
CI / Native Windows Build And Tests (push) Successful in 2m52s
CI / Windows Release Package (push) Has been cancelled

This commit is contained in:
Aiden
2026-05-12 02:08:48 +10:00
parent e0ca548ef5
commit 4ea829af85
11 changed files with 534 additions and 7 deletions

View File

@@ -5,10 +5,13 @@
#include "../platform/HiddenGlWindow.h"
#include "Bgra8ReadbackPipeline.h"
#include "GLExtensions.h"
#include "RuntimeShaderRenderer.h"
#include "SimpleMotionRenderer.h"
#include <algorithm>
#include <iostream>
#include <thread>
#include <windows.h>
RenderThread::RenderThread(SystemFrameExchange& frameExchange, Config config) :
mFrameExchange(frameExchange),
@@ -83,12 +86,14 @@ void RenderThread::ThreadMain()
}
SimpleMotionRenderer renderer;
RuntimeShaderRenderer runtimeShaderRenderer;
Bgra8ReadbackPipeline readback;
if (!renderer.InitializeGl(mConfig.width, mConfig.height) || !readback.Initialize(mConfig.width, mConfig.height, mConfig.pboDepth))
{
SignalStartupFailure("Render pipeline initialization failed.");
return;
}
mSlangCompiler.StartHappyAccidentBuild();
RenderCadenceClock clock(mConfig.frameDurationMilliseconds);
uint64_t frameIndex = 0;
@@ -114,7 +119,13 @@ void RenderThread::ThreadMain()
continue;
}
if (!readback.RenderAndQueue(frameIndex, [&renderer](uint64_t index) { renderer.RenderFrame(index); }))
TryCommitReadyRuntimeShader(runtimeShaderRenderer);
if (!readback.RenderAndQueue(frameIndex, [this, &renderer, &runtimeShaderRenderer](uint64_t index) {
if (runtimeShaderRenderer.HasProgram())
runtimeShaderRenderer.RenderFrame(index, mConfig.width, mConfig.height);
else
renderer.RenderFrame(index);
}))
{
std::lock_guard<std::mutex> lock(mMetricsMutex);
++mMetrics.pboQueueMisses;
@@ -143,7 +154,9 @@ void RenderThread::ThreadMain()
}
readback.Shutdown();
runtimeShaderRenderer.ShutdownGl();
renderer.ShutdownGl();
mSlangCompiler.Stop();
window.ClearCurrent();
mRunning.store(false, std::memory_order_release);
}
@@ -179,3 +192,34 @@ void RenderThread::CountAcquireMiss()
std::lock_guard<std::mutex> lock(mMetricsMutex);
++mMetrics.acquireMisses;
}
void RenderThread::TryCommitReadyRuntimeShader(RuntimeShaderRenderer& runtimeShaderRenderer)
{
RuntimeSlangShaderBuild build;
if (!mSlangCompiler.TryConsume(build))
return;
if (!build.succeeded)
{
std::cout << "Runtime Slang build failed: " << build.message << "\n";
OutputDebugStringA(("Runtime Slang build failed: " + build.message + "\n").c_str());
std::lock_guard<std::mutex> lock(mMetricsMutex);
++mMetrics.shaderBuildFailures;
return;
}
std::string commitError;
if (!runtimeShaderRenderer.CommitFragmentShader(build.fragmentShaderSource, commitError))
{
std::cout << "Runtime shader GL commit failed: " << commitError << "\n";
OutputDebugStringA(("Runtime shader GL commit failed: " + commitError + "\n").c_str());
std::lock_guard<std::mutex> lock(mMetricsMutex);
++mMetrics.shaderBuildFailures;
return;
}
std::cout << "Runtime shader committed: " << build.shaderId << ". " << build.message << "\n";
OutputDebugStringA(("Runtime shader committed: " + build.shaderId + ". " + build.message + "\n").c_str());
std::lock_guard<std::mutex> lock(mMetricsMutex);
++mMetrics.shaderBuildsCommitted;
}