Skip to content

Commit

Permalink
refac: return bindgroup slot 0 to draw stream from area in graphics ext
Browse files Browse the repository at this point in the history
  • Loading branch information
jonathan hoffstadt committed May 9, 2024
1 parent 49fdeee commit 2336130
Show file tree
Hide file tree
Showing 5 changed files with 52 additions and 46 deletions.
9 changes: 9 additions & 0 deletions extensions/pl_graphics_ext.c
Original file line number Diff line number Diff line change
Expand Up @@ -495,6 +495,7 @@ enum plDrawStreamBits
PL_DRAW_STREAM_BIT_DYNAMIC_BUFFER = 1 << 2,
PL_DRAW_STREAM_BIT_BINDGROUP_2 = 1 << 3,
PL_DRAW_STREAM_BIT_BINDGROUP_1 = 1 << 4,
PL_DRAW_STREAM_BIT_BINDGROUP_0 = 1 << 5,
PL_DRAW_STREAM_BIT_INDEX_OFFSET = 1 << 6,
PL_DRAW_STREAM_BIT_VERTEX_OFFSET = 1 << 7,
PL_DRAW_STREAM_BIT_INDEX_BUFFER = 1 << 8,
Expand Down Expand Up @@ -538,6 +539,12 @@ pl_drawstream_draw(plDrawStream* ptStream, plStreamDraw tDraw)
uDirtyMask |= PL_DRAW_STREAM_BIT_DYNAMIC_OFFSET;
}

if(ptStream->tCurrentDraw.uBindGroup0 != tDraw.uBindGroup0)
{
ptStream->tCurrentDraw.uBindGroup0 = tDraw.uBindGroup0;
uDirtyMask |= PL_DRAW_STREAM_BIT_BINDGROUP_0;
}

if(ptStream->tCurrentDraw.uBindGroup1 != tDraw.uBindGroup1)
{
ptStream->tCurrentDraw.uBindGroup1 = tDraw.uBindGroup1;
Expand Down Expand Up @@ -603,6 +610,8 @@ pl_drawstream_draw(plDrawStream* ptStream, plStreamDraw tDraw)
pl_sb_push(ptStream->sbtStream, ptStream->tCurrentDraw.uShaderVariant);
if(uDirtyMask & PL_DRAW_STREAM_BIT_DYNAMIC_OFFSET)
pl_sb_push(ptStream->sbtStream, ptStream->tCurrentDraw.uDynamicBufferOffset);
if(uDirtyMask & PL_DRAW_STREAM_BIT_BINDGROUP_0)
pl_sb_push(ptStream->sbtStream, ptStream->tCurrentDraw.uBindGroup0);
if(uDirtyMask & PL_DRAW_STREAM_BIT_BINDGROUP_1)
pl_sb_push(ptStream->sbtStream, ptStream->tCurrentDraw.uBindGroup1);
if(uDirtyMask & PL_DRAW_STREAM_BIT_BINDGROUP_2)
Expand Down
2 changes: 1 addition & 1 deletion extensions/pl_graphics_ext.h
Original file line number Diff line number Diff line change
Expand Up @@ -684,7 +684,6 @@ typedef struct _plDrawArea
{
plRenderViewport tViewport;
plScissor tScissor;
uint32_t uBindGroup0;
plDrawStream* ptDrawStream;
} plDrawArea;

Expand All @@ -707,6 +706,7 @@ typedef struct _plStreamDraw
uint32_t uIndexOffset;
uint32_t uTriangleCount;
uint32_t uShaderVariant;
uint32_t uBindGroup0;
uint32_t uBindGroup1;
uint32_t uBindGroup2;
uint32_t uDynamicBufferOffset;
Expand Down
48 changes: 21 additions & 27 deletions extensions/pl_metal_ext.m
Original file line number Diff line number Diff line change
Expand Up @@ -2293,33 +2293,6 @@ - (instancetype)initWithBuffer:(id<MTLBuffer>)buffer
uint32_t uInstanceCount = 1;
id<MTLDepthStencilState> tCurrentDepthStencilState = nil;

{
plMetalBindGroup* ptMetalBindGroup = &ptMetalGraphics->sbtBindGroupsHot[ptArea->uBindGroup0];

for(uint32 j = 0; j < ptMetalBindGroup->uHeapCount; j++)
{
[tRenderEncoder useHeap:ptMetalBindGroup->atRequiredHeaps[j] stages:MTLRenderStageVertex | MTLRenderStageFragment];
}

for(uint32_t k = 0; k < ptMetalBindGroup->tLayout.uTextureBindingCount; k++)
{

const plTextureHandle tTextureHandle = ptMetalBindGroup->atTextureBindings[k];
id<MTLHeap> tHeap = ptMetalGraphics->sbtTexturesHot[tTextureHandle.uIndex].tHeap;
[tRenderEncoder useResource:ptMetalGraphics->sbtTexturesHot[tTextureHandle.uIndex].tTexture
usage:MTLResourceUsageRead
stages:MTLRenderStageVertex | MTLRenderStageFragment];
}

[tRenderEncoder setVertexBuffer:ptMetalBindGroup->tShaderArgumentBuffer
offset:ptMetalBindGroup->uOffset
atIndex:1];

[tRenderEncoder setFragmentBuffer:ptMetalBindGroup->tShaderArgumentBuffer
offset:ptMetalBindGroup->uOffset
atIndex:1];
}

uint32_t uDynamicSlot = UINT32_MAX;
while(uCurrentStreamIndex < uTokens)
{
Expand Down Expand Up @@ -2351,6 +2324,27 @@ - (instancetype)initWithBuffer:(id<MTLBuffer>)buffer
uCurrentStreamIndex++;
}

if(uDirtyMask & PL_DRAW_STREAM_BIT_BINDGROUP_0)
{
plMetalBindGroup* ptMetalBindGroup = &ptMetalGraphics->sbtBindGroupsHot[ptStream->sbtStream[uCurrentStreamIndex]];

for(uint32 j = 0; j < ptMetalBindGroup->uHeapCount; j++)
{
[tRenderEncoder useHeap:ptMetalBindGroup->atRequiredHeaps[j] stages:MTLRenderStageVertex | MTLRenderStageFragment];
}

for(uint32_t k = 0; k < ptMetalBindGroup->tLayout.uTextureBindingCount; k++)
{
const plTextureHandle tTextureHandle = ptMetalBindGroup->atTextureBindings[k];
plTexture* ptTexture = pl__get_texture(&ptGraphics->tDevice, tTextureHandle);
[tRenderEncoder useResource:ptMetalGraphics->sbtTexturesHot[tTextureHandle.uIndex].tTexture usage:MTLResourceUsageRead stages:MTLRenderStageVertex | MTLRenderStageFragment];
}

[tRenderEncoder setVertexBuffer:ptMetalBindGroup->tShaderArgumentBuffer offset:ptMetalBindGroup->uOffset atIndex:1];
[tRenderEncoder setFragmentBuffer:ptMetalBindGroup->tShaderArgumentBuffer offset:ptMetalBindGroup->uOffset atIndex:1];
uCurrentStreamIndex++;
}

if(uDirtyMask & PL_DRAW_STREAM_BIT_BINDGROUP_1)
{
plMetalBindGroup* ptMetalBindGroup = &ptMetalGraphics->sbtBindGroupsHot[ptStream->sbtStream[uCurrentStreamIndex]];
Expand Down
13 changes: 7 additions & 6 deletions extensions/pl_ref_renderer_ext.c
Original file line number Diff line number Diff line change
Expand Up @@ -2778,8 +2778,7 @@ pl_refr_render_scene(plCommandBuffer tCommandBuffer, uint32_t uSceneHandle, uint
.fWidth = tDimensions.x,
.fHeight = tDimensions.y,
.fMaxDepth = 1.0f
},
.uBindGroup0 = tGlobalBG.uIndex,
}
};

static double* pdVisibleOpaqueObjects = NULL;
Expand Down Expand Up @@ -2825,6 +2824,7 @@ pl_refr_render_scene(plCommandBuffer tCommandBuffer, uint32_t uSceneHandle, uint
.uIndexBuffer = tDrawable.uIndexCount == 0 ? UINT32_MAX : ptScene->tIndexBuffer.uIndex,
.uIndexOffset = tDrawable.uIndexOffset,
.uTriangleCount = tDrawable.uIndexCount == 0 ? tDrawable.uVertexCount / 3 : tDrawable.uIndexCount / 3,
.uBindGroup0 = tGlobalBG.uIndex,
.uBindGroup1 = tDrawable.tMaterialBindGroup.uIndex,
.uBindGroup2 = UINT32_MAX,
.uDynamicBufferOffset = tDynamicBinding.uByteOffset,
Expand Down Expand Up @@ -2898,6 +2898,7 @@ pl_refr_render_scene(plCommandBuffer tCommandBuffer, uint32_t uSceneHandle, uint
.uIndexBuffer = ptScene->tIndexBuffer.uIndex,
.uIndexOffset = ptScene->tLightingDrawable.uIndexOffset,
.uTriangleCount = 2,
.uBindGroup0 = tGlobalBG.uIndex,
.uBindGroup1 = ptView->tLightingBindGroup[ptGraphics->uCurrentFrameIndex].uIndex,
.uBindGroup2 = tLightBindGroup2.uIndex,
.uDynamicBufferOffset = tLightingDynamicData.uByteOffset,
Expand Down Expand Up @@ -2926,14 +2927,13 @@ pl_refr_render_scene(plCommandBuffer tCommandBuffer, uint32_t uSceneHandle, uint
.uIndexBuffer = ptScene->tIndexBuffer.uIndex,
.uIndexOffset = ptScene->tSkyboxDrawable.uIndexOffset,
.uTriangleCount = ptScene->tSkyboxDrawable.uIndexCount / 3,
.uBindGroup0 = tGlobalBG.uIndex,
.uBindGroup1 = ptScene->tSkyboxBindGroup.uIndex,
.uBindGroup2 = UINT32_MAX,
.uDynamicBufferOffset = tSkyboxDynamicData.uByteOffset,
.uInstanceStart = 0,
.uInstanceCount = 1
});

tArea.uBindGroup0 = tGlobalBG.uIndex;
gptGfx->draw_stream(&tEncoder, 1, &tArea);
}
gptGfx->reset_draw_stream(ptStream);
Expand Down Expand Up @@ -2961,8 +2961,9 @@ pl_refr_render_scene(plCommandBuffer tCommandBuffer, uint32_t uSceneHandle, uint
.uIndexBuffer = tDrawable.uIndexCount == 0 ? UINT32_MAX : ptScene->tIndexBuffer.uIndex,
.uIndexOffset = tDrawable.uIndexOffset,
.uTriangleCount = tDrawable.uIndexCount == 0 ? tDrawable.uVertexCount / 3 : tDrawable.uIndexCount / 3,
.uBindGroup1 = tDrawable.tMaterialBindGroup.uIndex,
.uBindGroup2 = UINT32_MAX,
.uBindGroup0 = tGlobalBG.uIndex,
.uBindGroup1 = tLightBindGroup2.uIndex,
.uBindGroup2 = tDrawable.tMaterialBindGroup.uIndex,
.uDynamicBufferOffset = tDynamicBinding.uByteOffset,
.uInstanceStart = 0,
.uInstanceCount = 1
Expand Down
26 changes: 14 additions & 12 deletions extensions/pl_vulkan_ext.c
Original file line number Diff line number Diff line change
Expand Up @@ -2832,14 +2832,14 @@ typedef struct _plBindGroupManagerData
{
uint32_t uFirstSlot;
uint32_t uCount;
VkDescriptorSet auSlots[3];
VkDescriptorSet auSlots[4];
uint32_t auOffsets[2];
} plBindGroupManagerData;

static void pl__set_bind_group_count(plBindGroupManagerData* ptData, uint32_t uCount)
{
ptData->uCount = uCount;
ptData->uFirstSlot = 1;
ptData->uCount = uCount + 1;
ptData->uFirstSlot = 0;
}

static void pl__set_bind_group(plBindGroupManagerData* ptData, uint32_t uIndex, VkDescriptorSet tSet)
Expand All @@ -2857,10 +2857,10 @@ static void pl__set_dynamic_bind_group(plBindGroupManagerData* ptData, VkDescrip

static void pl__update_bindings(plBindGroupManagerData* ptData, VkCommandBuffer tCmdBuffer, VkPipelineLayout tLayout)
{
VkDescriptorSet atSets[3] = {VK_NULL_HANDLE, VK_NULL_HANDLE, VK_NULL_HANDLE};
VkDescriptorSet atSets[4] = {VK_NULL_HANDLE, VK_NULL_HANDLE, VK_NULL_HANDLE, VK_NULL_HANDLE};
for(uint32_t i = 0; i < ptData->uCount; i++)
atSets[i] = ptData->auSlots[i];
vkCmdBindDescriptorSets(tCmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, tLayout, ptData->uFirstSlot + 1, ptData->uCount - ptData->uFirstSlot, &atSets[ptData->uFirstSlot], 1, ptData->auOffsets);
vkCmdBindDescriptorSets(tCmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, tLayout, ptData->uFirstSlot, ptData->uCount - ptData->uFirstSlot, &atSets[ptData->uFirstSlot], 1, ptData->auOffsets);
}

static void
Expand Down Expand Up @@ -2918,9 +2918,6 @@ pl_draw_stream(plRenderEncoder* ptEncoder, uint32_t uAreaCount, plDrawArea* atAr
plVulkanShader* ptVulkanShader = NULL;
plVulkanDynamicBuffer* ptVulkanDynamicBuffer = NULL;

plVulkanBindGroup* ptBindGroup0 = &ptVulkanGfx->sbtBindGroupsHot[ptArea->uBindGroup0];
VkDescriptorSet atDescriptorSets[4] = {ptBindGroup0->tDescriptorSet, VK_NULL_HANDLE, VK_NULL_HANDLE, VK_NULL_HANDLE};

plBindGroupManagerData tBindGroupManagerData = {0};

while(uCurrentStreamIndex < uTokens)
Expand All @@ -2934,7 +2931,6 @@ pl_draw_stream(plRenderEncoder* ptEncoder, uint32_t uAreaCount, plDrawArea* atAr
const plShader* ptShader= &ptGraphics->sbtShadersCold[ptStream->sbtStream[uCurrentStreamIndex]];
ptVulkanShader = &ptVulkanGfx->sbtShadersHot[ptStream->sbtStream[uCurrentStreamIndex]];
vkCmdBindPipeline(tCmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, ptVulkanShader->tPipeline);
vkCmdBindDescriptorSets(tCmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, ptVulkanShader->tPipelineLayout, 0, 1, &ptBindGroup0->tDescriptorSet, 0, NULL);
pl__set_bind_group_count(&tBindGroupManagerData, ptShader->tDescription.uBindGroupLayoutCount);
uCurrentStreamIndex++;
}
Expand All @@ -2946,23 +2942,29 @@ pl_draw_stream(plRenderEncoder* ptEncoder, uint32_t uAreaCount, plDrawArea* atAr
uCurrentStreamIndex++;
}

if(uDirtyMask & PL_DRAW_STREAM_BIT_BINDGROUP_0)
{
plVulkanBindGroup* ptBindGroup0 = &ptVulkanGfx->sbtBindGroupsHot[ptStream->sbtStream[uCurrentStreamIndex]];
pl__set_bind_group(&tBindGroupManagerData, 0, ptBindGroup0->tDescriptorSet);
uCurrentStreamIndex++;
}

if(uDirtyMask & PL_DRAW_STREAM_BIT_BINDGROUP_1)
{
plVulkanBindGroup* ptBindGroup1 = &ptVulkanGfx->sbtBindGroupsHot[ptStream->sbtStream[uCurrentStreamIndex]];
pl__set_bind_group(&tBindGroupManagerData, 0, ptBindGroup1->tDescriptorSet);
pl__set_bind_group(&tBindGroupManagerData, 1, ptBindGroup1->tDescriptorSet);
uCurrentStreamIndex++;
}

if(uDirtyMask & PL_DRAW_STREAM_BIT_BINDGROUP_2)
{
plVulkanBindGroup* ptBindGroup2 = &ptVulkanGfx->sbtBindGroupsHot[ptStream->sbtStream[uCurrentStreamIndex]];
pl__set_bind_group(&tBindGroupManagerData, 1, ptBindGroup2->tDescriptorSet);
pl__set_bind_group(&tBindGroupManagerData, 2, ptBindGroup2->tDescriptorSet);
uCurrentStreamIndex++;
}

if(uDirtyMask & PL_DRAW_STREAM_BIT_DYNAMIC_BUFFER)
{
// uDescriptorStart = 3;
ptVulkanDynamicBuffer = &ptCurrentFrame->sbtDynamicBuffers[ptStream->sbtStream[uCurrentStreamIndex]];
pl__set_dynamic_bind_group(&tBindGroupManagerData, ptVulkanDynamicBuffer->tDescriptorSet, uDynamicBufferOffset);
uCurrentStreamIndex++;
Expand Down

0 comments on commit 2336130

Please sign in to comment.