Skip to content

Commit 1ba2839

Browse files
committed
WIP
1 parent 15c8e2f commit 1ba2839

File tree

6 files changed

+919
-429
lines changed

6 files changed

+919
-429
lines changed

extensions/pl_renderer_ext.c

Lines changed: 13 additions & 214 deletions
Original file line numberDiff line numberDiff line change
@@ -325,20 +325,6 @@ pl_renderer_initialize(plRendererSettings tSettings)
325325
};
326326
gptData->tPickViewBindGroupLayout = gptGfx->create_bind_group_layout(gptData->ptDevice, &tPickBindGroupLayout);
327327

328-
plBindGroupLayoutDesc tComputeBindGroupLayout = {
329-
.atBufferBindings = {
330-
{ .tType = PL_BUFFER_BINDING_TYPE_STORAGE, .uSlot = 0, .tStages = PL_SHADER_STAGE_COMPUTE},
331-
{ .tType = PL_BUFFER_BINDING_TYPE_STORAGE, .uSlot = 1, .tStages = PL_SHADER_STAGE_COMPUTE},
332-
{ .tType = PL_BUFFER_BINDING_TYPE_STORAGE, .uSlot = 2, .tStages = PL_SHADER_STAGE_COMPUTE},
333-
{ .tType = PL_BUFFER_BINDING_TYPE_STORAGE, .uSlot = 3, .tStages = PL_SHADER_STAGE_COMPUTE},
334-
{ .tType = PL_BUFFER_BINDING_TYPE_STORAGE, .uSlot = 4, .tStages = PL_SHADER_STAGE_COMPUTE},
335-
{ .tType = PL_BUFFER_BINDING_TYPE_STORAGE, .uSlot = 5, .tStages = PL_SHADER_STAGE_COMPUTE},
336-
{ .tType = PL_BUFFER_BINDING_TYPE_STORAGE, .uSlot = 6, .tStages = PL_SHADER_STAGE_COMPUTE},
337-
},
338-
};
339-
gptData->tSkyboxComputeBindGroupLayout = gptGfx->create_bind_group_layout(gptData->ptDevice, &tComputeBindGroupLayout);
340-
341-
342328
plBindGroupLayoutDesc tSkyboxBindGroupLayout = {
343329
.atTextureBindings = { {.uSlot = 0, .tStages = PL_SHADER_STAGE_FRAGMENT | PL_SHADER_STAGE_VERTEX, .tType = PL_TEXTURE_BINDING_TYPE_SAMPLED}}
344330
};
@@ -409,27 +395,6 @@ pl_renderer_initialize(plRendererSettings tSettings)
409395
};
410396
gptData->tPickBG0Layout = gptGfx->create_bind_group_layout(gptData->ptDevice, &tPickBG0Layout);
411397

412-
const plBindGroupLayoutDesc tJFABindGroupLayout = {
413-
.atTextureBindings = {
414-
{.uSlot = 0, .tStages = PL_SHADER_STAGE_COMPUTE, .tType = PL_TEXTURE_BINDING_TYPE_STORAGE},
415-
{.uSlot = 1, .tStages = PL_SHADER_STAGE_COMPUTE, .tType = PL_TEXTURE_BINDING_TYPE_STORAGE}
416-
}
417-
};
418-
gptData->tJFABGLayout = gptGfx->create_bind_group_layout(gptData->ptDevice, &tJFABindGroupLayout);
419-
420-
const plBindGroupLayoutDesc tSkinBindGroupLayout0 = {
421-
.atSamplerBindings = {
422-
{.uSlot = 3, .tStages = PL_SHADER_STAGE_COMPUTE}
423-
},
424-
.atBufferBindings = {
425-
{ .uSlot = 0, .tType = PL_BUFFER_BINDING_TYPE_STORAGE, .tStages = PL_SHADER_STAGE_COMPUTE},
426-
{ .uSlot = 1, .tType = PL_BUFFER_BINDING_TYPE_STORAGE, .tStages = PL_SHADER_STAGE_COMPUTE},
427-
{ .uSlot = 2, .tType = PL_BUFFER_BINDING_TYPE_STORAGE, .tStages = PL_SHADER_STAGE_COMPUTE},
428-
}
429-
};
430-
gptData->tSkin2BGLayout = gptGfx->create_bind_group_layout(gptData->ptDevice, &tSkinBindGroupLayout0);
431-
432-
433398
plBindGroupLayoutDesc tBindGroupLayout0 = {
434399
.atBufferBindings = {
435400
{
@@ -446,42 +411,6 @@ pl_renderer_initialize(plRendererSettings tSettings)
446411
};
447412
gptData->tShadowGlobalBGLayout = gptGfx->create_bind_group_layout(gptData->ptDevice, &tBindGroupLayout0);
448413

449-
const plBindGroupLayoutDesc tOutlineBindGroupLayout = {
450-
.atSamplerBindings = {
451-
{ .uSlot = 0, .tStages = PL_SHADER_STAGE_FRAGMENT}
452-
},
453-
.atTextureBindings = {
454-
{.uSlot = 1, .tStages = PL_SHADER_STAGE_FRAGMENT, .tType = PL_TEXTURE_BINDING_TYPE_SAMPLED},
455-
{.uSlot = 2, .tStages = PL_SHADER_STAGE_FRAGMENT, .tType = PL_TEXTURE_BINDING_TYPE_SAMPLED}
456-
}
457-
};
458-
gptData->tOutlineBGLayout = gptGfx->create_bind_group_layout(gptData->ptDevice, &tOutlineBindGroupLayout);
459-
460-
plBindGroupLayoutDesc tSkinBindGroupLayout = {
461-
.atBufferBindings = {
462-
{.uSlot = 0, .tStages = PL_SHADER_STAGE_COMPUTE, .tType = PL_BUFFER_BINDING_TYPE_STORAGE}
463-
}
464-
};
465-
gptData->tSkinBGLayout = gptGfx->create_bind_group_layout(gptData->ptDevice, &tSkinBindGroupLayout);
466-
467-
plBindGroupLayoutDesc tEnvBindgroupLayout = {
468-
.atTextureBindings = {
469-
{.uSlot = 1, .tStages = PL_SHADER_STAGE_COMPUTE, .tType = PL_TEXTURE_BINDING_TYPE_SAMPLED}
470-
},
471-
.atBufferBindings = {
472-
{ .tType = PL_BUFFER_BINDING_TYPE_STORAGE, .uSlot = 2, .tStages = PL_SHADER_STAGE_COMPUTE},
473-
{ .tType = PL_BUFFER_BINDING_TYPE_STORAGE, .uSlot = 3, .tStages = PL_SHADER_STAGE_COMPUTE},
474-
{ .tType = PL_BUFFER_BINDING_TYPE_STORAGE, .uSlot = 4, .tStages = PL_SHADER_STAGE_COMPUTE},
475-
{ .tType = PL_BUFFER_BINDING_TYPE_STORAGE, .uSlot = 5, .tStages = PL_SHADER_STAGE_COMPUTE},
476-
{ .tType = PL_BUFFER_BINDING_TYPE_STORAGE, .uSlot = 6, .tStages = PL_SHADER_STAGE_COMPUTE},
477-
{ .tType = PL_BUFFER_BINDING_TYPE_STORAGE, .uSlot = 7, .tStages = PL_SHADER_STAGE_COMPUTE},
478-
{ .tType = PL_BUFFER_BINDING_TYPE_STORAGE, .uSlot = 8, .tStages = PL_SHADER_STAGE_COMPUTE},
479-
},
480-
.atSamplerBindings = { {.uSlot = 0, .tStages = PL_SHADER_STAGE_COMPUTE}}
481-
};
482-
gptData->tEnvBGLayout = gptGfx->create_bind_group_layout(gptData->ptDevice, &tEnvBindgroupLayout);
483-
484-
485414
// create pools
486415
for(uint32_t i = 0; i < gptGfx->get_frames_in_flight(); i++)
487416
{
@@ -784,19 +713,7 @@ pl_renderer_initialize(plRendererSettings tSettings)
784713
// create template shaders
785714

786715
pl__renderer_create_global_shaders();
787-
788-
const plComputeShaderDesc tComputeShaderDesc = {
789-
.tShader = gptShader->load_glsl("jumpfloodalgo.comp", "main", NULL, NULL),
790-
.atBindGroupLayouts = {
791-
{
792-
.atTextureBindings = {
793-
{.uSlot = 0, .tStages = PL_SHADER_STAGE_COMPUTE, .tType = PL_TEXTURE_BINDING_TYPE_STORAGE},
794-
{.uSlot = 1, .tStages = PL_SHADER_STAGE_COMPUTE, .tType = PL_TEXTURE_BINDING_TYPE_STORAGE}
795-
}
796-
}
797-
}
798-
};
799-
gptData->tJFAShader = gptGfx->create_compute_shader(gptData->ptDevice, &tComputeShaderDesc);
716+
gptData->tJFAShader = gptShaderTools->load_compute_shader("/shaders/shaders.pls", "jumpfloodalgo", NULL);
800717
pl_temp_allocator_reset(&gptData->tTempAllocator);
801718

802719
// create full quad
@@ -823,28 +740,10 @@ pl_renderer_initialize(plRendererSettings tSettings)
823740

824741
// create semaphores
825742
gptData->ptClickSemaphore = gptGfx->create_semaphore(gptData->ptDevice, false);
743+
gptData->tEnvFilterShader = gptShaderTools->load_compute_shader("/shaders/shaders.pls", "filter_environment", NULL);
826744

827-
plComputeShaderDesc tFilterComputeShaderDesc = {
828-
.tShader = gptShader->load_glsl("filter_environment.comp", "main", NULL, NULL),
829-
.atBindGroupLayouts = {
830-
{
831-
.atTextureBindings = {
832-
{.uSlot = 1, .tStages = PL_SHADER_STAGE_COMPUTE, .tType = PL_TEXTURE_BINDING_TYPE_SAMPLED}
833-
},
834-
.atBufferBindings = {
835-
{ .tType = PL_BUFFER_BINDING_TYPE_STORAGE, .uSlot = 2, .tStages = PL_SHADER_STAGE_COMPUTE},
836-
{ .tType = PL_BUFFER_BINDING_TYPE_STORAGE, .uSlot = 3, .tStages = PL_SHADER_STAGE_COMPUTE},
837-
{ .tType = PL_BUFFER_BINDING_TYPE_STORAGE, .uSlot = 4, .tStages = PL_SHADER_STAGE_COMPUTE},
838-
{ .tType = PL_BUFFER_BINDING_TYPE_STORAGE, .uSlot = 5, .tStages = PL_SHADER_STAGE_COMPUTE},
839-
{ .tType = PL_BUFFER_BINDING_TYPE_STORAGE, .uSlot = 6, .tStages = PL_SHADER_STAGE_COMPUTE},
840-
{ .tType = PL_BUFFER_BINDING_TYPE_STORAGE, .uSlot = 7, .tStages = PL_SHADER_STAGE_COMPUTE},
841-
{ .tType = PL_BUFFER_BINDING_TYPE_STORAGE, .uSlot = 8, .tStages = PL_SHADER_STAGE_COMPUTE},
842-
},
843-
.atSamplerBindings = { {.uSlot = 0, .tStages = PL_SHADER_STAGE_COMPUTE}}
844-
}
845-
}
846-
};
847-
gptData->tEnvFilterShader = gptGfx->create_compute_shader(gptData->ptDevice, &tFilterComputeShaderDesc);
745+
int aiSpecData[4] = {0};
746+
gptData->tSkinShader = gptShaderTools->load_compute_shader("/shaders/shaders.pls", "skinning", aiSpecData);
848747
};
849748

850749
plScene*
@@ -1001,46 +900,7 @@ pl_renderer_create_scene(plSceneInit tInit)
1001900
ptScene->tFirstShadowRenderPass = gptGfx->create_render_pass(gptData->ptDevice, &tFirstDepthRenderPassDesc, atShadowAttachmentSets);
1002901

1003902
// create tonemap shader
1004-
const plShaderDesc tTonemapShaderDesc = {
1005-
.tPixelShader = gptShader->load_glsl("tonemap.frag", "main", NULL, NULL),
1006-
.tVertexShader = gptShader->load_glsl("full_quad.vert", "main", NULL, NULL),
1007-
.tGraphicsState = {
1008-
.ulDepthWriteEnabled = 0,
1009-
.ulDepthMode = PL_COMPARE_MODE_ALWAYS,
1010-
.ulCullMode = PL_CULL_MODE_NONE,
1011-
.ulStencilMode = PL_COMPARE_MODE_ALWAYS,
1012-
.ulStencilRef = 0xff,
1013-
.ulStencilMask = 0xff,
1014-
.ulStencilOpFail = PL_STENCIL_OP_KEEP,
1015-
.ulStencilOpDepthFail = PL_STENCIL_OP_KEEP,
1016-
.ulStencilOpPass = PL_STENCIL_OP_KEEP
1017-
},
1018-
.atVertexBufferLayouts = {
1019-
{
1020-
.uByteStride = sizeof(float) * 4,
1021-
.atAttributes = {
1022-
{.uByteOffset = 0, .tFormat = PL_VERTEX_FORMAT_FLOAT2},
1023-
{.uByteOffset = sizeof(float) * 2, .tFormat = PL_VERTEX_FORMAT_FLOAT2}
1024-
}
1025-
}
1026-
},
1027-
.atBlendStates = {
1028-
pl__renderer_get_blend_state(PL_BLEND_MODE_OPAQUE)
1029-
},
1030-
.tRenderPassLayout = gptData->tPostProcessRenderPassLayout,
1031-
.atBindGroupLayouts = {
1032-
{
1033-
.atSamplerBindings = {
1034-
{ .uSlot = 0, .tStages = PL_SHADER_STAGE_FRAGMENT}
1035-
},
1036-
.atTextureBindings = {
1037-
{.uSlot = 1, .tStages = PL_SHADER_STAGE_FRAGMENT, .tType = PL_TEXTURE_BINDING_TYPE_SAMPLED},
1038-
{.uSlot = 2, .tStages = PL_SHADER_STAGE_FRAGMENT, .tType = PL_TEXTURE_BINDING_TYPE_SAMPLED}
1039-
}
1040-
}
1041-
}
1042-
};
1043-
ptScene->tTonemapShader = gptGfx->create_shader(gptData->ptDevice, &tTonemapShaderDesc);
903+
ptScene->tTonemapShader = gptShaderTools->load_shader("/shaders/shaders.pls", "tonemap", (plGraphicsState){0}, gptData->tPostProcessRenderPassLayout, NULL);
1044904

1045905
return ptScene;
1046906
}
@@ -1173,7 +1033,7 @@ pl_renderer_cleanup_scene(plScene* ptScene)
11731033
gptGfx->queue_texture_for_deletion(gptData->ptDevice, ptScene->tShadowTexture);
11741034
gptGfx->queue_render_pass_for_deletion(gptData->ptDevice, ptScene->tShadowRenderPass);
11751035
gptGfx->queue_render_pass_for_deletion(gptData->ptDevice, ptScene->tFirstShadowRenderPass);
1176-
gptGfx->queue_shader_for_deletion(gptData->ptDevice, ptScene->tTonemapShader);
1036+
gptShaderTools->unload_shader(ptScene->tTonemapShader);
11771037
gptGfx->queue_shader_for_deletion(gptData->ptDevice, ptScene->tLightingShader);
11781038
gptGfx->queue_shader_for_deletion(gptData->ptDevice, ptScene->tEnvLightingShader);
11791039

@@ -1844,29 +1704,7 @@ pl_renderer_load_skybox_from_panorama(plScene* ptScene, const char* pcPath, int
18441704
const size_t uFaceSize = ((size_t)iResolution * (size_t)iResolution) * 4 * sizeof(float);
18451705
{
18461706
int aiSkyboxSpecializationData[] = {iResolution, iPanoramaWidth, iPanoramaHeight};
1847-
const plComputeShaderDesc tSkyboxComputeShaderDesc = {
1848-
.tShader = gptShader->load_glsl("panorama_to_cubemap.comp", "main", NULL, NULL),
1849-
.pTempConstantData = aiSkyboxSpecializationData,
1850-
.atConstants = {
1851-
{ .uID = 0, .uOffset = 0, .tType = PL_DATA_TYPE_INT},
1852-
{ .uID = 1, .uOffset = sizeof(int), .tType = PL_DATA_TYPE_INT},
1853-
{ .uID = 2, .uOffset = 2 * sizeof(int), .tType = PL_DATA_TYPE_INT}
1854-
},
1855-
.atBindGroupLayouts = {
1856-
{
1857-
.atBufferBindings = {
1858-
{ .tType = PL_BUFFER_BINDING_TYPE_STORAGE, .uSlot = 0, .tStages = PL_SHADER_STAGE_COMPUTE},
1859-
{ .tType = PL_BUFFER_BINDING_TYPE_STORAGE, .uSlot = 1, .tStages = PL_SHADER_STAGE_COMPUTE},
1860-
{ .tType = PL_BUFFER_BINDING_TYPE_STORAGE, .uSlot = 2, .tStages = PL_SHADER_STAGE_COMPUTE},
1861-
{ .tType = PL_BUFFER_BINDING_TYPE_STORAGE, .uSlot = 3, .tStages = PL_SHADER_STAGE_COMPUTE},
1862-
{ .tType = PL_BUFFER_BINDING_TYPE_STORAGE, .uSlot = 4, .tStages = PL_SHADER_STAGE_COMPUTE},
1863-
{ .tType = PL_BUFFER_BINDING_TYPE_STORAGE, .uSlot = 5, .tStages = PL_SHADER_STAGE_COMPUTE},
1864-
{ .tType = PL_BUFFER_BINDING_TYPE_STORAGE, .uSlot = 6, .tStages = PL_SHADER_STAGE_COMPUTE},
1865-
}
1866-
}
1867-
}
1868-
};
1869-
plComputeShaderHandle tPanoramaShader = gptGfx->create_compute_shader(ptDevice, &tSkyboxComputeShaderDesc);
1707+
plComputeShaderHandle tPanoramaShader = gptShaderTools->load_compute_shader("/shaders/shaders.pls", "panorama_to_cubemap", aiSkyboxSpecializationData);
18701708
pl_temp_allocator_reset(&gptData->tTempAllocator);
18711709

18721710
plBufferHandle atComputeBuffers[7] = {0};
@@ -1893,11 +1731,11 @@ pl_renderer_load_skybox_from_panorama(plScene* ptScene, const char* pcPath, int
18931731

18941732
const plBindGroupDesc tComputeBindGroupDesc = {
18951733
.ptPool = gptData->aptTempGroupPools[gptGfx->get_current_frame_index()],
1896-
.tLayout = gptData->tSkyboxComputeBindGroupLayout,
1734+
.tLayout = gptShaderTools->get_compute_bind_group_layout(tPanoramaShader, 0),
18971735
.pcDebugName = "compute bind group"
18981736
};
18991737
plBindGroupHandle tComputeBindGroup = gptGfx->create_bind_group(ptDevice, &tComputeBindGroupDesc);
1900-
const plBindGroupUpdateBufferData atBGBufferData[] = {
1738+
const plBindGroupUpdateBufferData atBGBufferData[] = {
19011739
{ .uSlot = 0, .tBuffer = atComputeBuffers[0], .szBufferRange = uPanoramaSize},
19021740
{ .uSlot = 1, .tBuffer = atComputeBuffers[1], .szBufferRange = uFaceSize},
19031741
{ .uSlot = 2, .tBuffer = atComputeBuffers[2], .szBufferRange = uFaceSize},
@@ -2181,7 +2019,7 @@ pl_renderer_reload_scene_shaders(plScene* ptScene)
21812019
gptGfx->queue_shader_for_deletion(gptData->ptDevice, gptData->tPickShader);
21822020
gptGfx->queue_shader_for_deletion(gptData->ptDevice, gptData->tUVShader);
21832021
gptGfx->queue_shader_for_deletion(gptData->ptDevice, gptData->tSkyboxShader);
2184-
gptGfx->queue_compute_shader_for_deletion(gptData->ptDevice, gptData->tEnvFilterShader);
2022+
gptShaderTools->unload_compute_shader(gptData->tEnvFilterShader);
21852023

21862024
pl__renderer_create_global_shaders();
21872025

@@ -2214,7 +2052,7 @@ pl_renderer_reload_scene_shaders(plScene* ptScene)
22142052
pl_sb_reset(ptScene->sbtOutlineDrawablesOldEnvShaders);
22152053

22162054
gptGfx->queue_shader_for_deletion(gptData->ptDevice, ptScene->tLightingShader);
2217-
gptGfx->queue_shader_for_deletion(gptData->ptDevice, ptScene->tTonemapShader);
2055+
gptShaderTools->unload_shader(ptScene->tTonemapShader);
22182056
gptGfx->queue_shader_for_deletion(gptData->ptDevice, ptScene->tEnvLightingShader);
22192057

22202058
int iSceneWideRenderingFlags = PL_RENDERING_FLAG_SHADOWS;
@@ -2319,46 +2157,7 @@ pl_renderer_reload_scene_shaders(plScene* ptScene)
23192157
ptScene->tEnvLightingShader = gptGfx->create_shader(gptData->ptDevice, &tLightingShaderDesc);
23202158
}
23212159

2322-
const plShaderDesc tTonemapShaderDesc = {
2323-
.tPixelShader = gptShader->load_glsl("tonemap.frag", "main", NULL, NULL),
2324-
.tVertexShader = gptShader->load_glsl("full_quad.vert", "main", NULL, NULL),
2325-
.tGraphicsState = {
2326-
.ulDepthWriteEnabled = 0,
2327-
.ulDepthMode = PL_COMPARE_MODE_ALWAYS,
2328-
.ulCullMode = PL_CULL_MODE_NONE,
2329-
.ulStencilMode = PL_COMPARE_MODE_ALWAYS,
2330-
.ulStencilRef = 0xff,
2331-
.ulStencilMask = 0xff,
2332-
.ulStencilOpFail = PL_STENCIL_OP_KEEP,
2333-
.ulStencilOpDepthFail = PL_STENCIL_OP_KEEP,
2334-
.ulStencilOpPass = PL_STENCIL_OP_KEEP
2335-
},
2336-
.atVertexBufferLayouts = {
2337-
{
2338-
.uByteStride = sizeof(float) * 4,
2339-
.atAttributes = {
2340-
{.uByteOffset = 0, .tFormat = PL_VERTEX_FORMAT_FLOAT2},
2341-
{.uByteOffset = sizeof(float) * 2, .tFormat = PL_VERTEX_FORMAT_FLOAT2}
2342-
}
2343-
}
2344-
},
2345-
.atBlendStates = {
2346-
pl__renderer_get_blend_state(PL_BLEND_MODE_OPAQUE)
2347-
},
2348-
.tRenderPassLayout = gptData->tPostProcessRenderPassLayout,
2349-
.atBindGroupLayouts = {
2350-
{
2351-
.atSamplerBindings = {
2352-
{ .uSlot = 0, .tStages = PL_SHADER_STAGE_FRAGMENT}
2353-
},
2354-
.atTextureBindings = {
2355-
{.uSlot = 1, .tStages = PL_SHADER_STAGE_FRAGMENT, .tType = PL_TEXTURE_BINDING_TYPE_SAMPLED},
2356-
{.uSlot = 2, .tStages = PL_SHADER_STAGE_FRAGMENT, .tType = PL_TEXTURE_BINDING_TYPE_SAMPLED}
2357-
}
2358-
}
2359-
}
2360-
};
2361-
ptScene->tTonemapShader = gptGfx->create_shader(gptData->ptDevice, &tTonemapShaderDesc);
2160+
ptScene->tTonemapShader = gptShaderTools->load_shader("/shaders/shaders.pls", "tonemap", (plGraphicsState){0}, gptData->tPostProcessRenderPassLayout, NULL);
23622161

23632162
pl__renderer_set_drawable_shaders(ptScene);
23642163
pl__renderer_sort_drawables(ptScene);
@@ -3007,7 +2806,7 @@ pl_renderer_render_view(plView* ptView, plCamera* ptCamera, plCamera* ptCullCame
30072806

30082807
const plBindGroupDesc tJFABindGroupDesc = {
30092808
.ptPool = gptData->aptTempGroupPools[uFrameIdx],
3010-
.tLayout = gptData->tJFABGLayout,
2809+
.tLayout = gptShaderTools->get_compute_bind_group_layout(gptData->tJFAShader, 0),
30112810
.pcDebugName = "temp jfa bind group"
30122811
};
30132812

0 commit comments

Comments
 (0)