Better solution, still pretty much optimal.

This commit is contained in:
Henrik Rydgård 2024-01-10 18:14:59 +01:00
parent d0817c4c0a
commit b4fe03de8b
3 changed files with 19 additions and 9 deletions

View file

@ -1806,8 +1806,8 @@ void VKRPipelineLayout::FlushDescSets(VulkanContext *vulkan, int frame, QueuePro
case BindingType::STORAGE_BUFFER_VERTEX: case BindingType::STORAGE_BUFFER_VERTEX:
case BindingType::STORAGE_BUFFER_COMPUTE: case BindingType::STORAGE_BUFFER_COMPUTE:
bufferInfo[numBuffers].buffer = data[i].buffer.buffer; bufferInfo[numBuffers].buffer = data[i].buffer.buffer;
bufferInfo[numBuffers].offset = data[i].buffer.offset;
bufferInfo[numBuffers].range = data[i].buffer.range; bufferInfo[numBuffers].range = data[i].buffer.range;
bufferInfo[numBuffers].offset = data[i].buffer.offset;
writes[numWrites].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; writes[numWrites].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
writes[numWrites].pBufferInfo = &bufferInfo[numBuffers]; writes[numWrites].pBufferInfo = &bufferInfo[numBuffers];
writes[numWrites].pImageInfo = nullptr; writes[numWrites].pImageInfo = nullptr;
@ -1816,8 +1816,8 @@ void VKRPipelineLayout::FlushDescSets(VulkanContext *vulkan, int frame, QueuePro
case BindingType::UNIFORM_BUFFER_DYNAMIC_ALL: case BindingType::UNIFORM_BUFFER_DYNAMIC_ALL:
case BindingType::UNIFORM_BUFFER_DYNAMIC_VERTEX: case BindingType::UNIFORM_BUFFER_DYNAMIC_VERTEX:
bufferInfo[numBuffers].buffer = data[i].buffer.buffer; bufferInfo[numBuffers].buffer = data[i].buffer.buffer;
bufferInfo[numBuffers].offset = 0;
bufferInfo[numBuffers].range = data[i].buffer.range; bufferInfo[numBuffers].range = data[i].buffer.range;
bufferInfo[numBuffers].offset = 0;
writes[numWrites].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC; writes[numWrites].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
writes[numWrites].pBufferInfo = &bufferInfo[numBuffers]; writes[numWrites].pBufferInfo = &bufferInfo[numBuffers];
writes[numWrites].pImageInfo = nullptr; writes[numWrites].pImageInfo = nullptr;

View file

@ -205,10 +205,12 @@ struct PackedDescriptor {
uint32_t range; uint32_t range;
uint32_t offset; uint32_t offset;
} buffer; } buffer;
#if false
struct { struct {
VkBuffer buffer; VkBuffer buffer;
uint64_t range; // write range and a zero offset in one operation with this. uint64_t range; // write range and a zero offset in one operation with this.
} buffer_zero_offset; } buffer_zero_offset;
#endif
}; };
}; };

View file

@ -328,22 +328,30 @@ void DrawEngineVulkan::DoFlush() {
PackedDescriptor *descriptors = renderManager->PushDescriptorSet(descCount, &descSetIndex); PackedDescriptor *descriptors = renderManager->PushDescriptorSet(descCount, &descSetIndex);
descriptors[0].image.view = imageView; descriptors[0].image.view = imageView;
descriptors[0].image.sampler = sampler; descriptors[0].image.sampler = sampler;
descriptors[1].image.view = boundSecondary_; descriptors[1].image.view = boundSecondary_;
descriptors[1].image.sampler = samplerSecondaryNearest_; descriptors[1].image.sampler = samplerSecondaryNearest_;
descriptors[2].image.view = boundDepal_; descriptors[2].image.view = boundDepal_;
descriptors[2].image.sampler = (boundDepal_ && boundDepalSmoothed_) ? samplerSecondaryLinear_ : samplerSecondaryNearest_; descriptors[2].image.sampler = (boundDepal_ && boundDepalSmoothed_) ? samplerSecondaryLinear_ : samplerSecondaryNearest_;
descriptors[3].buffer_zero_offset.buffer = baseBuf;
descriptors[3].buffer_zero_offset.range = sizeof(UB_VS_FS_Base); descriptors[3].buffer.buffer = baseBuf;
descriptors[4].buffer_zero_offset.buffer = lightBuf; descriptors[3].buffer.range = sizeof(UB_VS_FS_Base);
descriptors[4].buffer_zero_offset.range = sizeof(UB_VS_Lights); descriptors[3].buffer.offset = 0;
descriptors[5].buffer_zero_offset.buffer = boneBuf;
descriptors[5].buffer_zero_offset.range = sizeof(UB_VS_Bones); descriptors[4].buffer.buffer = lightBuf;
descriptors[4].buffer.range = sizeof(UB_VS_Lights);
descriptors[4].buffer.offset = 0;
descriptors[5].buffer.buffer = boneBuf;
descriptors[5].buffer.range = sizeof(UB_VS_Bones);
descriptors[5].buffer.offset = 0;
if (tess) { if (tess) {
const VkDescriptorBufferInfo *bufInfo = tessDataTransferVulkan->GetBufferInfo(); const VkDescriptorBufferInfo *bufInfo = tessDataTransferVulkan->GetBufferInfo();
for (int j = 0; j < 3; j++) { for (int j = 0; j < 3; j++) {
descriptors[j + 6].buffer.buffer = bufInfo[j].buffer; descriptors[j + 6].buffer.buffer = bufInfo[j].buffer;
descriptors[j + 6].buffer.offset = bufInfo[j].offset;
descriptors[j + 6].buffer.range = bufInfo[j].range; descriptors[j + 6].buffer.range = bufInfo[j].range;
descriptors[j + 6].buffer.offset = bufInfo[j].offset;
} }
} }
// TODO: Can we avoid binding all three when not needed? Same below for hardware transform. // TODO: Can we avoid binding all three when not needed? Same below for hardware transform.