3#include <Tempest/Application>
4#include <Tempest/Device>
13using namespace Tempest;
15Shaders* Shaders::instance =
nullptr;
20 deferredCompilation = std::async(std::launch::async, [
this]() {
22 auto time = Application::tickCount();
24 time = Application::tickCount() - time;
26 Log::i(
"Shader compilation took: ",time/1000,
" seconds");
31 deferredCompilation.wait();
36 deferredCompilation.wait();
44void Shaders::compileKeyShaders() {
45 bink = postEffect(
"bink");
48void Shaders::compileShaders() {
53 copyBuf = computeShader(
"copy.comp.sprv");
54 copyImg = computeShader(
"copy_img.comp.sprv");
55 copy = postEffect(
"copy");
57 patch = computeShader(
"patch.comp.sprv");
59 stash = postEffect(
"stash");
61 clusterInit = computeShader(
"cluster_init.comp.sprv");
67 ssao = computeShader(
"ssao.comp.sprv");
68 ssaoBlur = computeShader(
"ssao_blur.comp.sprv");
70 directLight = postEffect(
"direct_light", RenderState::ZTestMode::NoEqual);
71 directLightSh = postEffect(
"direct_light_sh", RenderState::ZTestMode::NoEqual);
72 if(
Gothic::options().doRayQuery && device.properties().descriptors.nonUniformIndexing)
73 directLightRq = postEffect(
"direct_light_rq", RenderState::ZTestMode::NoEqual);
78 irradiance = computeShader(
"irradiance.comp.sprv");
79 cloudsLut = computeShader(
"clouds_lut.comp.sprv");
89 skyExposure = computeShader(
"sky_exposure.comp.sprv");
90 sky = postEffect(
"sky");
91 skySep = postEffect(
"sky_sep");
92 fog = fogShader (
"fog");
93 fog3dHQ = fogShader (
"fog3d_hq");
97 state.setCullFaceMode (RenderState::CullMode::Front);
98 state.setBlendSource (RenderState::BlendMode::One);
99 state.setBlendDest (RenderState::BlendMode::SrcAlpha);
100 state.setZTestMode (RenderState::ZTestMode::Always);
101 state.setZWriteEnabled(
false);
103 auto sh = GothicShader::get(
"triangle.vert.sprv");
104 auto vsLight = device.shader(sh.data,sh.len);
105 sh = GothicShader::get(
"sky_pathtrace.frag.sprv");
106 auto fsLight = device.shader(sh.data,sh.len);
107 skyPathTrace = device.pipeline(Triangles, state, vsLight, fsLight);
110 underwaterT = inWaterShader(
"underwater_t",
false);
112 waterReflection = reflectionShader(
"water_reflection.frag.sprv",meshlets);
117 state.setCullFaceMode (RenderState::CullMode::Front);
118 state.setBlendSource (RenderState::BlendMode::One);
119 state.setBlendDest (RenderState::BlendMode::SrcAlpha);
120 state.setZTestMode (RenderState::ZTestMode::Equal);
121 state.setZWriteEnabled(
false);
123 auto sh = GothicShader::get(
"sun.vert.sprv");
124 auto vsLight = device.shader(sh.data,sh.len);
125 sh = GothicShader::get(
"sun.frag.sprv");
126 auto fsLight = device.shader(sh.data,sh.len);
127 sun = device.pipeline(Triangles, state, vsLight, fsLight);
132 state.setCullFaceMode (RenderState::CullMode::Front);
133 state.setBlendSource (RenderState::BlendMode::One);
134 state.setBlendDest (RenderState::BlendMode::One);
135 state.setZTestMode (RenderState::ZTestMode::Less);
137 state.setZWriteEnabled(
false);
139 auto sh = GothicShader::get(
"light.vert.sprv");
140 auto vsLight = device.shader(sh.data,sh.len);
141 sh = GothicShader::get(
"light.frag.sprv");
142 auto fsLight = device.shader(sh.data,sh.len);
143 lights = device.pipeline(Triangles, state, vsLight, fsLight);
146 sh = GothicShader::get(
"light_rq_at.frag.sprv");
147 fsLight = device.shader(sh.data,sh.len);
149 sh = GothicShader::get(
"light_rq.frag.sprv");
150 fsLight = device.shader(sh.data,sh.len);
152 lightsRq = device.pipeline(Triangles, state, vsLight, fsLight);
155 sh = GothicShader::get(
"light_vsm.frag.sprv");
156 fsLight = device.shader(sh.data,sh.len);
157 lightsVsm = device.pipeline(Triangles, state, vsLight, fsLight);
161 tonemapping = postEffect(
"triangle_uv",
"tonemapping", RenderState::ZTestMode::Always);
162 tonemappingUpscale = postEffect(
"triangle_uv",
"tonemapping_up", RenderState::ZTestMode::Always);
170 auto sh = GothicShader::get(
"cmaa2_deferred_color_apply_2x2.vert.sprv");
171 auto vs = device.shader(sh.data,sh.len);
172 sh = GothicShader::get(
"cmaa2_deferred_color_apply_2x2.frag.sprv");
173 auto fs = device.shader(sh.data,sh.len);
177 hiZPot = computeShader(
"hiz_pot.comp.sprv");
178 hiZMip = computeShader(
"hiz_mip.comp.sprv");
182 state.setCullFaceMode(RenderState::CullMode::NoCull);
183 state.setZTestMode (RenderState::ZTestMode::Less);
185 auto sh = GothicShader::get(
"probe_dbg.vert.sprv");
186 auto vs = device.shader(sh.data,sh.len);
187 sh = GothicShader::get(
"probe_dbg.frag.sprv");
188 auto fs = device.shader(sh.data,sh.len);
189 probeDbg = device.pipeline(Triangles,state,vs,fs);
191 sh = GothicShader::get(
"probe_hit_dbg.vert.sprv");
192 vs = device.shader(sh.data,sh.len);
193 sh = GothicShader::get(
"probe_hit_dbg.frag.sprv");
194 fs = device.shader(sh.data,sh.len);
195 probeHitDbg = device.pipeline(Triangles,state,vs,fs);
197 probeInit = computeShader(
"probe_init.comp.sprv");
198 probeClear = computeShader(
"probe_clear.comp.sprv");
201 probeVote = computeShader(
"probe_vote.comp.sprv");
202 probePrune = computeShader(
"probe_prune.comp.sprv");
204 probeTrace = computeShader(
"probe_trace.comp.sprv");
207 state.setBlendSource (RenderState::BlendMode::One);
208 state.setBlendDest (RenderState::BlendMode::SrcAlpha);
209 state.setZTestMode (RenderState::ZTestMode::NoEqual);
210 state.setZWriteEnabled(
false);
211 sh = GothicShader::get(
"probe_ambient.vert.sprv");
212 vs = device.shader(sh.data,sh.len);
213 sh = GothicShader::get(
"probe_ambient.frag.sprv");
214 fs = device.shader(sh.data,sh.len);
225 vsmClear = computeShader(
"vsm_clear.comp.sprv");
226 vsmClearOmni = computeShader(
"vsm_clear_omni.comp.sprv");
228 vsmMarkPages = computeShader(
"vsm_mark_pages.comp.sprv");
231 vsmTrimPages = computeShader(
"vsm_trim_pages.comp.sprv");
233 vsmListPages = computeShader(
"vsm_list_pages.comp.sprv");
234 vsmSortPages = computeShader(
"vsm_sort_pages.comp.sprv");
238 vsmPackDraw0 = computeShader(
"vsm_pack_draws0.comp.sprv");
239 vsmPackDraw1 = computeShader(
"vsm_pack_draws1.comp.sprv");
240 vsmFogPages = computeShader(
"vsm_fog_mark_pages.comp.sprv");
241 vsmFogShadow = computeShader(
"vsm_fog_shadow.comp.sprv");
242 vsmFogTrace = computeShader(
"vsm_fog_trace.comp.sprv");
243 vsmFog = fogShader(
"fog_epipolar");
245 vsmDirectLight = postEffect(
"direct_light_vsm", RenderState::ZTestMode::NoEqual);
246 vsmDbg = postEffect(
"vsm_dbg", RenderState::ZTestMode::Always);
247 vsmRendering = computeShader(
"vsm_rendering.comp.sprv");
251 rtsmDirectLight = postEffect(
"rtsm_direct_light", RenderState::ZTestMode::NoEqual);
253 rtsmClear = computeShader(
"rtsm_clear.comp.sprv");
254 rtsmPages = computeShader(
"rtsm_mark_pages.comp.sprv");
255 rtsmFogPages = computeShader(
"rtsm_mark_fog_pages.comp.sprv");
256 rtsmHiZ = computeShader(
"rtsm_hiz_pages.comp.sprv");
258 rtsmCulling = computeShader(
"rtsm_culling.comp.sprv");
259 rtsmPosition = computeShader(
"rtsm_position.comp.sprv");
261 rtsmPrimCull = computeShader(
"rtsm_primitive_cull.comp.sprv");
262 rtsmRaster = computeShader(
"rtsm_raster.comp.sprv");
275 rtsmTaskOmni = computeShader(
"rtsm_omni_task.comp.sprv");
276 rtsmPrimOmni = computeShader(
"rtsm_omni_primitive.comp.sprv");
281 rtsmDbg = postEffect(
"rtsm_dbg", RenderState::ZTestMode::Always);
284 swRaytracing = computeShader(
"sw_raytracing.comp.sprv");
291 swRendering = computeShader(
"sw_rendering_imm.comp.sprv");
294 swRendering = computeShader(
"sw_rendering_tbr.comp.sprv");
300 swRenderingDbg = postEffect(
"vbuffer_blit", RenderState::ZTestMode::Always);
305 state.setCullFaceMode(RenderState::CullMode::Front);
306 state.setZTestMode (RenderState::ZTestMode::LEqual);
308 auto sh = GothicShader::get(
"item.vert.sprv");
309 auto vs = device.shader(sh.data,sh.len);
310 sh = GothicShader::get(
"item.frag.sprv");
311 auto fs = device.shader(sh.data,sh.len);
312 inventory = device.pipeline(Triangles,state,vs,fs);
318 if(gpu.compute.maxInvocations>=1024 && gpu.render.maxClipCullDistances>=4 &&
319 gpu.render.maxViewportSize.w>=8192 && gpu.render.maxViewportSize.h>=8192) {
330 if(!gpu.hasStorageFormat(TextureFormat::RG32U) || !gpu.hasStorageFormat(TextureFormat::R11G11B10UF))
332 if(gpu.compute.maxInvocations<512 || gpu.compute.maxSharedMemory<32*1024 || !gpu.descriptors.nonUniformIndexing) {
354 for(
auto& i:materials) {
355 if(i.alpha==alpha && i.type==t && i.pipelineType==pt && i.bindless==bl && i.trivial==trivial)
360 state.setCullFaceMode(RenderState::CullMode::Front);
361 state.setZTestMode (RenderState::ZTestMode::LEqual);
365 state.setZTestMode(RenderState::ZTestMode::Greater);
369 state.setZTestMode(RenderState::ZTestMode::Greater);
379 state.setBlendSource (RenderState::BlendMode::SrcAlpha);
380 state.setBlendDest (RenderState::BlendMode::OneMinusSrcAlpha);
381 state.setZWriteEnabled(
false);
384 state.setBlendSource (RenderState::BlendMode::SrcAlpha);
385 state.setBlendDest (RenderState::BlendMode::One);
386 state.setZWriteEnabled(
false);
390 state.setBlendSource (RenderState::BlendMode::DstColor);
391 state.setBlendDest (RenderState::BlendMode::SrcColor);
392 state.setZWriteEnabled(
false);
396 static bool overdrawDbg =
false;
399 state.setBlendSource(RenderState::BlendMode::One);
400 state.setBlendDest (RenderState::BlendMode::One);
401 state.setZWriteEnabled(
false);
402 state.setZTestMode(RenderState::ZTestMode::Always);
405 const char* vsTok =
"";
406 const char* fsTok =
"";
432 const char* typeVsM =
nullptr;
433 const char* typeVsD =
nullptr;
434 const char* typeVsV =
nullptr;
435 const char* typeFsM =
nullptr;
436 const char* typeFsD =
nullptr;
437 const char* typeFsV =
nullptr;
481 const char* typeVs =
"";
482 const char* typeFs =
"";
499 if(typeVs==
nullptr || typeFs==
nullptr)
502 const char* bindless = bl ?
"_bindless" :
"_slot";
504 materials.emplace_front();
505 auto& b = materials.front();
514 auto shVs = GothicShader::get(
string_frm(
"main_", vsTok, typeVs, bindless,
".vert.sprv"));
515 auto shTc = GothicShader::get(
string_frm(
"main_", vsTok, typeVs, bindless,
".tesc.sprv"));
516 auto shTe = GothicShader::get(
string_frm(
"main_", vsTok, typeVs, bindless,
".tese.sprv"));
517 auto shFs = GothicShader::get(
string_frm(
"main_", fsTok, typeFs, bindless,
".frag.sprv"));
519 auto vs = device.shader(shVs.data,shVs.len);
520 auto tc = device.shader(shTc.data,shTc.len);
521 auto te = device.shader(shTe.data,shTe.len);
522 auto fs = device.shader(shFs.data,shFs.len);
523 b.pipeline = device.pipeline(Triangles, state, vs, tc, te, fs);
526 auto shMs = GothicShader::get(
string_frm(
"main_", vsTok, typeVs, bindless,
".mesh.sprv"));
527 auto shFs = GothicShader::get(
string_frm(
"main_", fsTok, typeFs, bindless,
".frag.sprv"));
529 auto ms = device.shader(shMs.data,shMs.len);
530 auto fs = device.shader(shFs.data,shFs.len);
531 b.pipeline = device.pipeline(state, Shader(), ms, fs);
534 auto shVs = GothicShader::get(
string_frm(
"main_", vsTok, typeVs, bindless,
".vert.sprv"));
535 auto shFs = GothicShader::get(
string_frm(
"main_", fsTok, typeFs, bindless,
".frag.sprv"));
537 auto vs = device.shader(shVs.data,shVs.len);
538 auto fs = device.shader(shFs.data,shFs.len);
539 b.pipeline = device.pipeline(Triangles, state, vs, fs);
542 auto shVs = GothicShader::get(
string_frm(
"main_", vsTok, typeVs,
".vert.sprv"));
543 auto shFs = GothicShader::get(
string_frm(
"main_", fsTok, typeFs,
".frag.sprv"));
545 auto vs = device.shader(shVs.data,shVs.len);
546 auto fs = device.shader(shFs.data,shFs.len);
547 b.pipeline = device.pipeline(Triangles, state, vs, fs);
553RenderPipeline Shaders::postEffect(std::string_view name) {
554 return postEffect(
"triangle",name);
557RenderPipeline Shaders::postEffect(std::string_view name, Tempest::RenderState::ZTestMode ztest) {
558 return postEffect(
"triangle",name,ztest);
561RenderPipeline Shaders::postEffect(std::string_view vsName, std::string_view fsName, Tempest::RenderState::ZTestMode ztest) {
564 RenderState stateFsq;
565 stateFsq.setZTestMode (ztest);
566 stateFsq.setZWriteEnabled(
false);
568 auto sh = GothicShader::get(
string_frm(vsName,
".vert.sprv"));
569 auto vs = device.shader(sh.data,sh.len);
571 sh = GothicShader::get(
string_frm(fsName,
".frag.sprv"));
572 auto fs = device.shader(sh.data,sh.len);
573 return device.pipeline(Triangles,stateFsq,vs,fs);
576ComputePipeline Shaders::computeShader(std::string_view name) {
578 auto sh = GothicShader::get(name);
579 return device.pipeline(device.shader(sh.data,sh.len));
582RenderPipeline Shaders::fogShader(std::string_view name) {
584 const bool fogDbg =
false;
587 state.setZWriteEnabled(
false);
588 state.setBlendSource (RenderState::BlendMode::One);
590 state.setBlendDest(RenderState::BlendMode::OneMinusSrcAlpha);
593 auto sh = GothicShader::get(
"triangle.vert.sprv");
594 auto vs = device.shader(sh.data,sh.len);
596 sh = GothicShader::get(
string_frm(name,
".frag.sprv"));
597 auto fs = device.shader(sh.data,sh.len);
598 return device.pipeline(Triangles,state,vs,fs);
601RenderPipeline Shaders::inWaterShader(std::string_view name,
bool isScattering) {
605 state.setZWriteEnabled(
false);
608 state.setBlendSource(RenderState::BlendMode::One);
609 state.setBlendDest (RenderState::BlendMode::One);
611 state.setBlendSource(RenderState::BlendMode::Zero);
612 state.setBlendDest (RenderState::BlendMode::SrcColor);
615 auto sh = GothicShader::get(
"triangle.vert.sprv");
616 auto vs = device.shader(sh.data,sh.len);
618 sh = GothicShader::get(
string_frm(name,
".frag.sprv"));
619 auto fs = device.shader(sh.data,sh.len);
620 return device.pipeline(Triangles,state,vs,fs);
623RenderPipeline Shaders::reflectionShader(std::string_view name,
bool hasMeshlets) {
627 state.setZTestMode (RenderState::ZTestMode::LEqual);
628 state.setZWriteEnabled(
false);
629 state.setBlendSource (RenderState::BlendMode::One);
630 state.setBlendDest (RenderState::BlendMode::One);
632 auto sh = GothicShader::get(
"triangle.vert.sprv");
633 auto vs = device.shader(sh.data,sh.len);
634 sh = GothicShader::get(name);
635 auto fs = device.shader(sh.data,sh.len);
638 sh = GothicShader::get(
"water_reflection.mesh.sprv");
639 vs = device.shader(sh.data,sh.len);
642 return device.pipeline(Triangles, state, vs, fs);
645RenderPipeline Shaders::ambientLightShader(std::string_view name) {
649 state.setBlendSource (RenderState::BlendMode::One);
650 state.setBlendDest (RenderState::BlendMode::SrcAlpha);
651 state.setZTestMode (RenderState::ZTestMode::NoEqual);
652 state.setZWriteEnabled(
false);
654 auto sh = GothicShader::get(
"triangle.vert.sprv");
655 auto vs = device.shader(sh.data,sh.len);
656 sh = GothicShader::get(
string_frm(name,
".frag.sprv"));
657 auto fs = device.shader(sh.data,sh.len);
659 return device.pipeline(Triangles, state, vs, fs);
static auto options() -> const Options &
bool isTesselated() const
bool hasUvAnimation() const
static Tempest::Device & device()
Tempest::ComputePipeline rtsmPrimOmni
Tempest::ComputePipeline rtsmHiZ
Tempest::ComputePipeline fogViewLut3d
Tempest::RenderPipeline fog3dHQ
Tempest::ComputePipeline rtsmMeshletCull
Tempest::ComputePipeline clusterPatch
Tempest::ComputePipeline vsmListPages
Tempest::RenderPipeline skyPathTrace
Tempest::ComputePipeline probeAlocation
Tempest::ComputePipeline vsmRendering
Tempest::ComputePipeline rtsmLightsOmni
Tempest::ComputePipeline rtsmMeshletOmni
Tempest::ComputePipeline vsmCullLights
Tempest::ComputePipeline fogViewLutSep
Tempest::ComputePipeline rtsmBackfaceOmni
Tempest::RenderPipeline tonemappingUpscale
Tempest::ComputePipeline probeInit
Tempest::RenderPipeline directLightSh
Tempest::ComputePipeline swRaytracing64
Tempest::ComputePipeline fogOcclusion
Tempest::ComputePipeline swRendering
Tempest::RenderPipeline stash
Tempest::RenderPipeline probeHitDbg
Tempest::RenderPipeline waterReflection
Tempest::ComputePipeline hiZMip
Tempest::RenderPipeline rtsmDbg
Tempest::ComputePipeline probePrune
Tempest::ComputePipeline vsmPackDraw1
static bool isRtsmSupported()
Tempest::RenderPipeline probeAmbient
Tempest::ComputePipeline rtsmCulling
Tempest::ComputePipeline rtsmCompactOmni
Tempest::RenderPipeline vsmDirectLight
Tempest::RenderPipeline skyViewLut
Tempest::ComputePipeline vsmPostprocessOmni
Tempest::RenderPipeline directLightRq
const Tempest::RenderPipeline * materialPipeline(const Material &desc, DrawCommands::Type t, PipelineType pt, bool bindless) const
Tempest::ComputePipeline vsmSortPages
Tempest::RenderPipeline ambientLight
Tempest::ComputePipeline rtsmRaster
Tempest::RenderPipeline vsmDbg
Tempest::ComputePipeline visibilityPassSh
Tempest::RenderPipeline sun
Tempest::RenderPipeline lightsVsm
Tempest::ComputePipeline visibilityPassHiZCr
Tempest::RenderPipeline inventory
Tempest::ComputePipeline rtsmPosition
Tempest::ComputePipeline rtsmRendering
Tempest::ComputePipeline vsmMarkOmniPages
Tempest::ComputePipeline swRaytracing
Tempest::RenderPipeline skyTransmittance
Tempest::ComputePipeline hiZPot
Tempest::ComputePipeline probeMakeHash
Tempest::RenderPipeline swRenderingDbg
Tempest::ComputePipeline ssao
Tempest::ComputePipeline rtsmCullLights
Tempest::ComputePipeline rtsmRasterOmni
Tempest::RenderPipeline lightsRq
Tempest::ComputePipeline ssaoBlur
Tempest::ComputePipeline rtsmTaskOmni
Tempest::ComputePipeline vsmFogShadow
Tempest::ComputePipeline probeClear
Tempest::ComputePipeline visibilityPassHiZ
Tempest::ComputePipeline vsmVisibilityPass
Tempest::ComputePipeline vsmPackDraw0
Tempest::RenderPipeline vsmFog
Tempest::ComputePipeline rtsmRenderingOmni
Tempest::ComputePipeline vsmAllocPages
static bool isVsmSupported()
Tempest::ComputePipeline rtsmCompactLights
Tempest::ComputePipeline rtsmPrimCull
Tempest::RenderPipeline skyViewCldLut
Tempest::ComputePipeline cmaa2ProcessCandidates
Tempest::RenderPipeline directLight
Tempest::RenderPipeline fog
Tempest::ComputePipeline probeVote
Tempest::ComputePipeline vsmClear
Tempest::ComputePipeline rtsmClearOmni
Tempest::ComputePipeline vsmFogPages
Tempest::ComputePipeline vsmMergePages
Tempest::RenderPipeline ambientLightSsao
Tempest::ComputePipeline vsmTrimPages
Tempest::ComputePipeline fogEpipolarVsm
Tempest::RenderPipeline underwaterT
Tempest::RenderPipeline copy
Tempest::RenderPipeline sky
Tempest::RenderPipeline cmaa2DeferredColorApply2x2
Tempest::ComputePipeline cloudsLut
Tempest::ComputePipeline rtsmCullingOmni
Tempest::ComputePipeline probeTrace
Tempest::RenderPipeline skyMultiScattering
Tempest::ComputePipeline rtsmPositionOmni
Tempest::RenderPipeline lights
Tempest::ComputePipeline clusterInit
Tempest::ComputePipeline rtsmBboxesOmni
Tempest::ComputePipeline cmaa2EdgeColor2x2Presets[uint32_t(AaPreset::PRESETS_COUNT)]
Tempest::ComputePipeline vsmFogTrace
Tempest::RenderPipeline skySep
Tempest::ComputePipeline patch
Tempest::ComputePipeline fogEpipolarOcclusion
Tempest::RenderPipeline bink
Tempest::ComputePipeline irradiance
Tempest::ComputePipeline copyImg
Tempest::RenderPipeline rtsmDirectLight
Tempest::ComputePipeline swRaytracing8
Tempest::ComputePipeline vsmClearOmni
Tempest::ComputePipeline rtsmFogPages
Tempest::ComputePipeline copyBuf
Tempest::ComputePipeline probeLighting
Tempest::RenderPipeline waterReflectionSSR
Tempest::ComputePipeline rtsmPages
Tempest::RenderPipeline underwaterS
Tempest::ComputePipeline vsmMarkPages
Tempest::ComputePipeline vsmClumpPages
Tempest::RenderPipeline probeDbg
Tempest::ComputePipeline rtsmClear
Tempest::ComputePipeline probeClearHash
Tempest::ComputePipeline skyExposure
Tempest::RenderPipeline tonemapping
Tempest::ComputePipeline vsmAlloc2Pages
static void setThreadName(const char *threadName)