mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
Better solution, still pretty much optimal.
This commit is contained in:
parent
d0817c4c0a
commit
b4fe03de8b
3 changed files with 19 additions and 9 deletions
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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.
|
||||||
|
|
Loading…
Add table
Reference in a new issue