Skip to content

Commit 90cbf02

Browse files
committed
fix: various fixes related the blit encoders
1 parent 921064d commit 90cbf02

4 files changed

Lines changed: 105 additions & 56 deletions

File tree

assets/core/scenes/scene-helmet.json

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,12 @@
1010
"bDrawAllBoundingBoxes": false,
1111
"bFrustumCulling": true,
1212
"bMSAA": true,
13-
"szIndexBufferSize": 64000000,
14-
"szVertexBufferSize": 64000000,
15-
"szDataBufferSize": 64000000,
16-
"szMaterialBufferSize": 8000000,
17-
"szSkinBufferSize": 8000000
13+
"szIndexBufferSize": 32000000,
14+
"szVertexBufferSize": 32000000,
15+
"szDataBufferSize": 32000000,
16+
"szMaterialBufferSize": 2000000,
17+
"szSkinBufferSize": 2000000,
18+
"uShadowAtlasResolution": 4096
1819
},
1920
"debug": {
2021
"bWireframe": false,

assets/core/scenes/scene-humanoid.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
"tPosition": [-2.539, 4.003, 2.640],
3737
"fYFov": 1.04719755,
3838
"fNearZ": 0.1,
39-
"fFarZ": 50.0,
39+
"fFarZ": 100.0,
4040
"fPitch": -0.395,
4141
"fYaw": 2.436
4242
},
@@ -55,7 +55,7 @@
5555
],
5656
"fMaxShadowRange": 100.0,
5757
"fConstantDepthBias": -1.250,
58-
"fSlopeDepthBias": -1.750
58+
"fSlopeDepthBias": -10.750
5959
},
6060
"bloom": {
6161
"active" : false,

extensions/pl_renderer_ext.c

Lines changed: 64 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -847,44 +847,11 @@ pl_renderer_create_scene(const plSceneDesc* ptInit)
847847
ptScene->atFilterWorkingBuffers[i] = pl__renderer_create_local_buffer(&tInputBufferDesc, "filter buffer", i);
848848
}
849849

850-
// create probe material & mesh
851-
plMaterialComponent* ptMaterial = NULL;
852-
plEntity tMaterial = gptMaterial->create(ptScene->ptComponentLibrary, "environment probe material", &ptMaterial);
853-
ptMaterial->tAlphaMode = PL_MATERIAL_ALPHA_MODE_OPAQUE;
854-
ptMaterial->tShaderType = PL_SHADER_TYPE_PBR;
855-
ptMaterial->tFlags |= PL_MATERIAL_FLAG_CAST_RECEIVE_SHADOW;
856-
ptMaterial->tFlags &= ~PL_MATERIAL_FLAG_CAST_SHADOW;
857-
ptMaterial->tBaseColor = (plVec4){1.0f, 1.0f, 1.0f, 1.0f};
858-
ptMaterial->fRoughness = 0.0f;
859-
ptMaterial->fMetalness = 1.0f;
860-
pl_renderer__add_material_to_scene(ptScene, tMaterial);
861-
862-
plMeshComponent* ptMesh = NULL;
863-
ptScene->tProbeMesh = gptMesh->create_sphere(ptScene->ptComponentLibrary, "environment probe mesh", 0.25f, 32, 32, &ptMesh);
864-
ptMesh->tMaterial = tMaterial;
865-
866-
ptMesh = NULL;
867-
ptScene->tUnitSphereMesh = gptMesh->create_sphere(ptScene->ptComponentLibrary, "unit sphere mesh", 1.0f, 16, 16, &ptMesh);
868-
869-
plFreeListNode* ptIndexBufferNode = gptFreeList->get_node(&ptScene->tIndexBufferFreeList, (uint32_t)ptMesh->szIndexCount * sizeof(uint32_t));
870-
plFreeListNode* ptVertexBufferNode = gptFreeList->get_node(&ptScene->tVertexBufferFreeList, (uint32_t)ptMesh->szVertexCount * sizeof(plVec3));
871-
872-
const plDrawable tDrawable = {
873-
.uIndexCount = (uint32_t)ptMesh->szIndexCount,
874-
.uVertexCount = (uint32_t)ptMesh->szVertexCount,
875-
.uIndexOffset = (uint32_t)(ptIndexBufferNode->uOffset / sizeof(uint32_t)),
876-
.uVertexOffset = (uint32_t)(ptVertexBufferNode->uOffset / sizeof(plVec3)),
877-
.uTransformIndex = ptScene->uNextTransformIndex++,
878-
.uTriangleCount = (uint32_t)ptMesh->szIndexCount / 3
879-
};
880-
ptScene->tUnitSphereDrawable = tDrawable;
881-
882-
gptStage->stage_buffer_upload(ptScene->tIndexBuffer, ptIndexBufferNode->uOffset, ptMesh->puIndices, sizeof(uint32_t) * ptMesh->szIndexCount);
883-
gptStage->stage_buffer_upload(ptScene->tVertexBuffer, ptVertexBufferNode->uOffset, ptMesh->ptVertexPositions, sizeof(plVec3) * ptMesh->szVertexCount);
884-
gptStage->flush();
885-
886850
// create shadow atlas
887-
ptScene->uShadowAtlasResolution = 1024 * 8 * 2;
851+
ptScene->uShadowAtlasResolution = ptInit->uShadowAtlasResolution;
852+
if(ptScene->uShadowAtlasResolution == 0)
853+
ptScene->uShadowAtlasResolution = 1024 * 16;
854+
888855
const plTextureDesc tShadowDepthTextureDesc = {
889856
.tDimensions = {(float)ptScene->uShadowAtlasResolution, (float)ptScene->uShadowAtlasResolution, 1},
890857
.tFormat = PL_FORMAT_D16_UNORM,
@@ -1180,6 +1147,43 @@ pl_renderer_create_scene(const plSceneDesc* ptInit)
11801147

11811148
gptGfx->update_bind_group(gptData->ptDevice, ptScene->atShadowBG[i], &tShadowBGData);
11821149
}
1150+
1151+
plMeshComponent* ptMesh = NULL;
1152+
ptScene->tProbeMesh = gptMesh->create_sphere(ptScene->ptComponentLibrary, "environment probe mesh", 0.25f, 32, 32, &ptMesh);
1153+
1154+
ptMesh = NULL;
1155+
ptScene->tUnitSphereMesh = gptMesh->create_sphere(ptScene->ptComponentLibrary, "unit sphere mesh", 1.0f, 16, 16, &ptMesh);
1156+
1157+
plFreeListNode* ptIndexBufferNode = gptFreeList->get_node(&ptScene->tIndexBufferFreeList, (uint32_t)ptMesh->szIndexCount * sizeof(uint32_t));
1158+
plFreeListNode* ptVertexBufferNode = gptFreeList->get_node(&ptScene->tVertexBufferFreeList, (uint32_t)ptMesh->szVertexCount * sizeof(plVec3));
1159+
1160+
const plDrawable tDrawable = {
1161+
.uIndexCount = (uint32_t)ptMesh->szIndexCount,
1162+
.uVertexCount = (uint32_t)ptMesh->szVertexCount,
1163+
.uIndexOffset = (uint32_t)(ptIndexBufferNode->uOffset / sizeof(uint32_t)),
1164+
.uVertexOffset = (uint32_t)(ptVertexBufferNode->uOffset / sizeof(plVec3)),
1165+
.uTransformIndex = ptScene->uNextTransformIndex++,
1166+
.uTriangleCount = (uint32_t)ptMesh->szIndexCount / 3
1167+
};
1168+
ptScene->tUnitSphereDrawable = tDrawable;
1169+
1170+
gptStage->stage_buffer_upload(ptScene->tIndexBuffer, ptIndexBufferNode->uOffset, ptMesh->puIndices, sizeof(uint32_t) * ptMesh->szIndexCount);
1171+
gptStage->stage_buffer_upload(ptScene->tVertexBuffer, ptVertexBufferNode->uOffset, ptMesh->ptVertexPositions, sizeof(plVec3) * ptMesh->szVertexCount);
1172+
gptStage->flush();
1173+
1174+
// create probe material & mesh
1175+
plMaterialComponent* ptMaterial = NULL;
1176+
plEntity tMaterial = gptMaterial->create(ptScene->ptComponentLibrary, "environment probe material", &ptMaterial);
1177+
ptMaterial->tAlphaMode = PL_MATERIAL_ALPHA_MODE_OPAQUE;
1178+
ptMaterial->tShaderType = PL_SHADER_TYPE_PBR;
1179+
ptMaterial->tFlags |= PL_MATERIAL_FLAG_CAST_RECEIVE_SHADOW;
1180+
ptMaterial->tFlags &= ~PL_MATERIAL_FLAG_CAST_SHADOW;
1181+
ptMaterial->tBaseColor = (plVec4){1.0f, 1.0f, 1.0f, 1.0f};
1182+
ptMaterial->fRoughness = 0.0f;
1183+
ptMaterial->fMetalness = 1.0f;
1184+
pl_renderer__add_material_to_scene(ptScene, tMaterial);
1185+
ptMesh = gptECS->get_component(ptScene->ptComponentLibrary, gptMesh->get_ecs_type_key_mesh(), ptScene->tProbeMesh);
1186+
ptMesh->tMaterial = tMaterial;
11831187
return ptScene;
11841188
}
11851189

@@ -1226,6 +1230,8 @@ pl_renderer_destroy_view(plView* ptView)
12261230

12271231
for(uint32_t i = 0; i < gptGfx->get_frames_in_flight(); i++)
12281232
{
1233+
gptGfx->queue_buffer_for_deletion(gptData->ptDevice, ptView->atDShadowCameraBuffers[i]);
1234+
gptGfx->queue_buffer_for_deletion(gptData->ptDevice, ptView->atDLightShadowDataBuffer[i]);
12291235
gptGfx->queue_buffer_for_deletion(gptData->ptDevice, ptView->atViewBuffers[i]);
12301236
gptGfx->queue_buffer_for_deletion(gptData->ptDevice, ptView->atView2Buffers[i]);
12311237
gptGfx->queue_buffer_for_deletion(gptData->ptDevice, ptView->atPickBuffer[i]);
@@ -1261,6 +1267,8 @@ pl_renderer_destroy_scene(plScene* ptScene)
12611267
{
12621268
plEnvironmentProbeData* ptProbe = &ptScene->sbtProbeData[j];
12631269

1270+
gptGfx->queue_buffer_for_deletion(gptData->ptDevice, ptProbe->tDShadowCameraBuffers);
1271+
gptGfx->queue_buffer_for_deletion(gptData->ptDevice, ptProbe->tDLightShadowDataBuffer);
12641272
gptGfx->queue_texture_for_deletion(gptData->ptDevice, ptProbe->tLambertianEnvTexture);
12651273
gptGfx->queue_texture_for_deletion(gptData->ptDevice, ptProbe->tGGXEnvTexture);
12661274
if(ptScene->tFlags & PL_SCENE_INTERNAL_FLAG_SHEEN_REQUIRED)
@@ -1286,7 +1294,6 @@ pl_renderer_destroy_scene(plScene* ptScene)
12861294
gptGfx->queue_buffer_for_deletion(gptData->ptDevice, ptProbe->tViewBuffer);
12871295
gptGfx->queue_buffer_for_deletion(gptData->ptDevice, ptProbe->tView2Buffer);
12881296

1289-
12901297
gptGfx->queue_bind_group_for_deletion(gptData->ptDevice, ptProbe->tViewBG);
12911298
gptGfx->queue_bind_group_for_deletion(gptData->ptDevice, ptProbe->tGBufferBG);
12921299

@@ -1300,6 +1307,8 @@ pl_renderer_destroy_scene(plScene* ptScene)
13001307

13011308
for(uint32_t i = 0; i < gptGfx->get_frames_in_flight(); i++)
13021309
{
1310+
gptGfx->queue_buffer_for_deletion(gptData->ptDevice, ptScene->atTransformBuffer[i]);
1311+
gptGfx->queue_buffer_for_deletion(gptData->ptDevice, ptScene->atInstanceBuffer[i]);
13031312
gptGfx->queue_buffer_for_deletion(gptData->ptDevice, ptScene->atDynamicSkinBuffer[i]);
13041313
gptGfx->queue_buffer_for_deletion(gptData->ptDevice, ptScene->atSceneBuffer[i]);
13051314
gptGfx->queue_buffer_for_deletion(gptData->ptDevice, ptScene->atPointLightBuffer[i]);
@@ -1309,8 +1318,6 @@ pl_renderer_destroy_scene(plScene* ptScene)
13091318
gptGfx->queue_buffer_for_deletion(gptData->ptDevice, ptScene->atPointLightShadowDataBuffer[i]);
13101319
gptGfx->queue_buffer_for_deletion(gptData->ptDevice, ptScene->atSpotLightShadowDataBuffer[i]);
13111320
gptGfx->queue_bind_group_for_deletion(gptData->ptDevice, ptScene->atSceneBindGroups[i]);
1312-
// gptGfx->queue_buffer_for_deletion(gptData->ptDevice, ptScene->atDLightShadowDataBuffer[i]);
1313-
// gptGfx->queue_buffer_for_deletion(gptData->ptDevice, ptScene->atDShadowCameraBuffers[i]);
13141321
}
13151322
gptGfx->queue_buffer_for_deletion(gptData->ptDevice, ptScene->tGPUProbeDataBuffers);
13161323
gptGfx->queue_buffer_for_deletion(gptData->ptDevice, ptScene->tMaterialDataBuffer);
@@ -3281,9 +3288,9 @@ pl_renderer_prepare_scene(plScene* ptScene, const plCamera** atCameras, uint32_t
32813288
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~perform skinning~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
32823289

32833290
const plBeginCommandInfo tSkinningBeginInfo = {
3284-
.uWaitSemaphoreCount = 1,
3285-
.atWaitSempahores = {gptStarter->get_current_timeline_semaphore()},
3286-
.auWaitSemaphoreValues = {gptStarter->get_current_timeline_value()},
3291+
.uWaitSemaphoreCount = 2,
3292+
.atWaitSempahores = {gptStarter->get_current_timeline_semaphore(), gptStarter->get_last_timeline_semaphore()},
3293+
.auWaitSemaphoreValues = {gptStarter->get_current_timeline_value(), gptStarter->get_last_timeline_value()},
32873294
};
32883295

32893296
plCommandBuffer* ptSkinningCmdBuffer = gptGfx->request_command_buffer(ptCmdPool, "skinning");
@@ -3910,6 +3917,16 @@ pl_renderer_render_view(plView* ptView, const plRenderViewDesc* ptViewDesc)
39103917

39113918
if(ptView->tBloomOptions.tFlags & PL_RENDERER_BLOOM_FLAGS_ACTIVE && pl_sb_size(ptView->sbtBloomDownChain) >= ptView->tBloomOptions.uChainLength)
39123919
pl__render_view_bloom_pass(ptView);
3920+
else if(!(ptView->tBloomOptions.tFlags & PL_RENDERER_BLOOM_FLAGS_ACTIVE))
3921+
{
3922+
for(uint32_t i = 0; i < pl_sb_size(ptView->sbtBloomDownChain); i++)
3923+
{
3924+
gptGfx->queue_texture_for_deletion(gptData->ptDevice, ptView->sbtBloomDownChain[i]);
3925+
gptGfx->queue_texture_for_deletion(gptData->ptDevice, ptView->sbtBloomUpChain[i]);
3926+
}
3927+
pl_sb_reset(ptView->sbtBloomDownChain);
3928+
pl_sb_reset(ptView->sbtBloomUpChain);
3929+
}
39133930

39143931
pl__render_view_tonemap_pass(ptView);
39153932

@@ -4283,7 +4300,8 @@ pl_renderer_ecs_add_drawable_objects_to_scene(plScene* ptScene, uint32_t uObject
42834300

42844301
uint64_t uMaterialIndex = pl_renderer__add_material_to_scene(ptScene, ptMesh->tMaterial);
42854302

4286-
ptScene->sbtDrawables[uDrawableIndex].uMaterialIndex = (uint32_t)ptScene->sbtMaterialNodes[uMaterialIndex]->uOffset;
4303+
// ptScene->sbtDrawables[uDrawableIndex].uMaterialIndex = (uint32_t)ptScene->sbtMaterialNodes[uMaterialIndex]->uOffset/ sizeof(plGpuMaterial);
4304+
// (uint32_t)ptScene->sbtMaterialNodes[uMaterialIndex2]->uOffset / sizeof(plGpuMaterial);
42874305

42884306
int iDataStride = 0;
42894307
int iFlagCopy0 = (int)ptMesh->ulVertexStreamMask;
@@ -5022,6 +5040,7 @@ pl_renderer_load_test_world(const char* pcPath, plComponentLibrary* ptComponentL
50225040
tSceneInit.szDataBufferSize = (size_t)pl_json_uint_member(ptAppObject, "szDataBufferSize", 64000000);
50235041
tSceneInit.szMaterialBufferSize = (size_t)pl_json_uint_member(ptAppObject, "szMaterialBufferSize", 8000000);
50245042
tSceneInit.szSkinBufferSize = (size_t)pl_json_uint_member(ptAppObject, "szSkinBufferSize", 8000000);
5043+
tSceneInit.uShadowAtlasResolution = (size_t)pl_json_uint_member(ptAppObject, "uShadowAtlasResolution", 4096 * 4);
50255044

50265045
ptDataOut->ptScene = pl_renderer_create_scene(&tSceneInit);
50275046
plViewDesc tViewDesc = PL_ZERO_INIT;
@@ -5052,7 +5071,7 @@ pl_renderer_load_test_world(const char* pcPath, plComponentLibrary* ptComponentL
50525071
plJsonObject* ptEditorObject = pl_json_member(ptRootJsonObject, "editor");
50535072
plJsonObject* ptDebugObject = pl_json_member(ptRootJsonObject, "debug");
50545073

5055-
ptDataOut->bMSAA = pl_json_bool_member(ptEditorObject, "bMSAA", true);
5074+
ptDataOut->bMSAA = pl_json_bool_member(ptAppObject, "bMSAA", true);
50565075
tDebugOptions.bWireframe = pl_json_bool_member(ptDebugObject, "bWireframe", false);
50575076
tDebugOptions.bShowOrigin = pl_json_bool_member(ptDebugObject, "bShowOrigin", false);
50585077
tDebugOptions.bShowProbes = pl_json_bool_member(ptDebugObject, "bShowProbes", false);

extensions/pl_renderer_internal.c

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,9 @@ pl__renderer_create_local_texture(const plTextureDesc* ptDesc, const char* pcNam
218218
pl_temp_allocator_reset(&tTempAllocator);
219219

220220
// choose allocator
221-
plDeviceMemoryAllocatorI* ptAllocator = gptData->ptLocalDedicatedAllocator;
221+
plDeviceMemoryAllocatorI* ptAllocator = gptData->ptLocalBuddyAllocator;
222+
if(ptTexture->tMemoryRequirements.ulSize > gptGpuAllocators->get_buddy_block_size())
223+
ptAllocator = gptData->ptLocalDedicatedAllocator;
222224

223225
// allocate memory
224226
const plDeviceMemoryAllocation tAllocation = ptAllocator->allocate(ptAllocator->ptInst,
@@ -605,7 +607,7 @@ pl__renderer_pack_shadow_atlas(plScene* ptScene)
605607
for(uint32_t uView = 0; uView < uViewCount; uView++)
606608
{
607609
const plPackRect tPackRect = {
608-
.iWidth = (int)(ptLight->uShadowResolution * ptLight->uCascadeCount),
610+
.iWidth = (int)((ptLight->uShadowResolution) * ptLight->uCascadeCount),
609611
.iHeight = (int)ptLight->uShadowResolution,
610612
.iId = (int)pl_sb_size(ptScene->sbtShadowRectData)
611613
};
@@ -875,7 +877,7 @@ pl__renderer_generate_shadow_maps(plRenderEncoder* ptEncoder, plCommandBuffer* p
875877
{
876878
pl_sb_push(ptScene->sbtVisibleDrawables1, tVisibleDrawable);
877879
}
878-
else
880+
else if(!(tDrawable.tFlags & PL_DRAWABLE_FLAG_PROBE))
879881
{
880882
pl_sb_push(ptScene->sbtVisibleDrawables0, tVisibleDrawable);
881883
}
@@ -1707,7 +1709,7 @@ pl__renderer_generate_cascaded_shadow_map(plRenderEncoder* ptEncoder, plCommandB
17071709
{
17081710
pl_sb_push(ptScene->sbtVisibleDrawables1, tVisibleDrawable);
17091711
}
1710-
else
1712+
else if(!(tDrawable.tFlags & PL_DRAWABLE_FLAG_PROBE))
17111713
{
17121714
pl_sb_push(ptScene->sbtVisibleDrawables0, tVisibleDrawable);
17131715
}
@@ -2077,8 +2079,35 @@ pl_renderer__add_material_to_scene(plScene* ptScene, plEntity tMaterial)
20772079
if(ptMaterial->tFlags & PL_MATERIAL_FLAG_TRANSMISSION || ptMaterial->tFlags & PL_MATERIAL_FLAG_VOLUME || ptMaterial->tFlags & PL_MATERIAL_FLAG_DIFFUSE_TRANSMISSION)
20782080
ptScene->tFlags |= PL_SCENE_INTERNAL_FLAG_TRANSMISSION_REQUIRED;
20792081
pl_hm_insert(&ptScene->tMaterialHashmap, tMaterial.uData, uMaterialIndex);
2082+
2083+
gptStage->new_frame();
2084+
2085+
if(ptScene->uMaterialDirtyValue > 0)
2086+
{
2087+
if(gptStage->completed(ptScene->uMaterialDirtyValue))
2088+
{
2089+
const plEcsTypeKey tMeshComponentType = gptMesh->get_ecs_type_key_mesh();
2090+
2091+
const uint32_t uDrawableCount = pl_sb_size(ptScene->sbtDrawables);
2092+
for(uint32_t i = 0; i < uDrawableCount; i++)
2093+
{
2094+
plObjectComponent* ptObject = gptECS->get_component(ptScene->ptComponentLibrary, gptData->tObjectComponentType, ptScene->sbtDrawables[i].tEntity);
2095+
plMeshComponent* ptMesh = gptECS->get_component(ptScene->ptComponentLibrary, tMeshComponentType, ptObject->tMesh);
2096+
2097+
if(pl_hm_has_key(&ptScene->tMaterialHashmap, ptMesh->tMaterial.uData))
2098+
{
2099+
uint32_t uMaterialIndex2 = (uint32_t)pl_hm_lookup(&ptScene->tMaterialHashmap, ptMesh->tMaterial.uData);
2100+
ptScene->sbtDrawables[i].uMaterialIndex = (uint32_t)ptScene->sbtMaterialNodes[uMaterialIndex2]->uOffset / sizeof(plGpuMaterial);
2101+
}
2102+
}
2103+
ptScene->uMaterialDirtyValue = 0;
2104+
}
2105+
}
2106+
20802107
return uMaterialIndex;
20812108
}
2109+
2110+
20822111
return pl_hm_lookup(&ptScene->tMaterialHashmap, tMaterial.uData);
20832112
}
20842113

0 commit comments

Comments
 (0)