Skip to content

Commit 67593b6

Browse files
committed
Move descriptor push implementation to a non-templated function
This makes it easier to profile and improves code size.
1 parent 6b4d816 commit 67593b6

File tree

1 file changed

+62
-52
lines changed

1 file changed

+62
-52
lines changed

src/niagara.cpp

Lines changed: 62 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,67 @@ struct FrameDescriptors
105105
uint32_t descriptorOffsetEnd;
106106
};
107107

108+
#if VK_EXT_descriptor_heap
109+
static uint32_t pushDescriptorHeap(FrameDescriptors& framedesc, const Program& program, const DescriptorInfo* descriptors)
110+
{
111+
assert(framedesc.descriptorOffset + program.pushDescriptorCount <= framedesc.descriptorOffsetEnd);
112+
113+
uint32_t result = framedesc.descriptorOffset;
114+
115+
for (int i = 0; i < 32; ++i)
116+
if (program.resourceMask & (1 << i))
117+
{
118+
const DescriptorInfo& info = descriptors[i];
119+
120+
char descriptor[128];
121+
122+
switch (program.resourceTypes[i])
123+
{
124+
case VK_DESCRIPTOR_TYPE_SAMPLER:
125+
{
126+
// mapped via constant offsets (statically)
127+
continue;
128+
}
129+
case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
130+
case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
131+
{
132+
const Image* image = static_cast<const Image*>(info.resource);
133+
assert(image);
134+
uint32_t mipLevel = (info.resourceMip < 0) ? 0 : uint32_t(info.resourceMip);
135+
uint32_t levelCount = (info.resourceMip < 0) ? VK_REMAINING_MIP_LEVELS : 1;
136+
getDescriptor(framedesc.device, image->image, image->format, mipLevel, levelCount, program.resourceTypes[i], descriptor, framedesc.descriptorSize);
137+
break;
138+
}
139+
140+
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
141+
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
142+
{
143+
const Buffer* buffer = static_cast<const Buffer*>(info.resource);
144+
assert(buffer);
145+
getDescriptor(framedesc.device, buffer->address, buffer->size, program.resourceTypes[i], descriptor, framedesc.descriptorSize);
146+
break;
147+
}
148+
149+
case VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR:
150+
{
151+
VkAccelerationStructureDeviceAddressInfoKHR addressInfo = { VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_DEVICE_ADDRESS_INFO_KHR };
152+
addressInfo.accelerationStructure = info.accelerationStructure;
153+
VkDeviceAddress address = vkGetAccelerationStructureDeviceAddressKHR(framedesc.device, &addressInfo);
154+
getDescriptor(framedesc.device, address, 0, program.resourceTypes[i], descriptor, framedesc.descriptorSize);
155+
break;
156+
}
157+
default:
158+
assert(!"Unsupported descriptor type");
159+
}
160+
161+
memcpy(static_cast<char*>(framedesc.descriptorHeap) + framedesc.descriptorOffset * framedesc.descriptorSize, descriptor, framedesc.descriptorSize);
162+
framedesc.descriptorOffset++;
163+
}
164+
165+
return result;
166+
}
167+
#endif
168+
108169
template <typename PushConstants>
109170
void pushConstants(VkCommandBuffer commandBuffer, FrameDescriptors& framedesc, const Program& program, const PushConstants& constants)
110171
{
@@ -132,65 +193,14 @@ void pushDescriptors(VkCommandBuffer commandBuffer, FrameDescriptors& framedesc,
132193
if (program.descriptorSize)
133194
{
134195
#if VK_EXT_descriptor_heap
135-
assert(framedesc.descriptorOffset + program.pushDescriptorCount <= framedesc.descriptorOffsetEnd);
196+
uint32_t descriptorOffset = pushDescriptorHeap(framedesc, program, descriptors);
136197

137-
uint32_t descriptorOffset = framedesc.descriptorOffset;
138198
VkPushDataInfoEXT pushDataInfo = { VK_STRUCTURE_TYPE_PUSH_DATA_INFO_EXT };
139199
pushDataInfo.offset = program.pushConstantSize;
140200
pushDataInfo.data.address = &descriptorOffset;
141201
pushDataInfo.data.size = sizeof(descriptorOffset);
142202

143203
vkCmdPushDataEXT(commandBuffer, &pushDataInfo);
144-
145-
for (int i = 0; i < 32; ++i)
146-
if (program.resourceMask & (1 << i))
147-
{
148-
const DescriptorInfo& info = descriptors[i];
149-
150-
char descriptor[128];
151-
152-
switch (program.resourceTypes[i])
153-
{
154-
case VK_DESCRIPTOR_TYPE_SAMPLER:
155-
{
156-
// mapped via constant offsets (statically)
157-
continue;
158-
}
159-
case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
160-
case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
161-
{
162-
const Image* image = static_cast<const Image*>(info.resource);
163-
assert(image);
164-
uint32_t mipLevel = (info.resourceMip < 0) ? 0 : uint32_t(info.resourceMip);
165-
uint32_t levelCount = (info.resourceMip < 0) ? VK_REMAINING_MIP_LEVELS : 1;
166-
getDescriptor(framedesc.device, image->image, image->format, mipLevel, levelCount, program.resourceTypes[i], descriptor, framedesc.descriptorSize);
167-
break;
168-
}
169-
170-
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
171-
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
172-
{
173-
const Buffer* buffer = static_cast<const Buffer*>(info.resource);
174-
assert(buffer);
175-
getDescriptor(framedesc.device, buffer->address, buffer->size, program.resourceTypes[i], descriptor, framedesc.descriptorSize);
176-
break;
177-
}
178-
179-
case VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR:
180-
{
181-
VkAccelerationStructureDeviceAddressInfoKHR addressInfo = { VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_DEVICE_ADDRESS_INFO_KHR };
182-
addressInfo.accelerationStructure = info.accelerationStructure;
183-
VkDeviceAddress address = vkGetAccelerationStructureDeviceAddressKHR(framedesc.device, &addressInfo);
184-
getDescriptor(framedesc.device, address, 0, program.resourceTypes[i], descriptor, framedesc.descriptorSize);
185-
break;
186-
}
187-
default:
188-
assert(!"Unsupported descriptor type");
189-
}
190-
191-
memcpy(static_cast<char*>(framedesc.descriptorHeap) + framedesc.descriptorOffset * framedesc.descriptorSize, descriptor, framedesc.descriptorSize);
192-
framedesc.descriptorOffset++;
193-
}
194204
#endif
195205
}
196206
else

0 commit comments

Comments
 (0)