|
|
|
@ -329,39 +329,55 @@ VkResult create_layer(
|
|
|
|
|
uint32_t max_codes = (input->num_codes > input->max_codes) ? input->num_codes : input->max_codes;
|
|
|
|
|
uint32_t max_drawables = (input->num_drawables > input->max_drawables) ? input->num_drawables : input->max_drawables;
|
|
|
|
|
|
|
|
|
|
if(max_strings > 0) {
|
|
|
|
|
container->layers[index].strings_buffer = malloc(sizeof(GPUString)*max_strings);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(max_drawables > 0) {
|
|
|
|
|
container->layers[index].drawables_buffer = malloc(sizeof(GPUDrawable)*max_drawables);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(max_codes > 0) {
|
|
|
|
|
container->layers[index].codes_buffer = malloc(sizeof(uint32_t)*max_codes);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for(uint32_t i = 0; i < MAX_FRAMES_IN_FLIGHT; i++) {
|
|
|
|
|
|
|
|
|
|
VK_RESULT(create_storage_buffer(gpu->allocator, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT, sizeof(GPULayer), &container->layers[index].layer[i], &container->layers[index].layer_memory[i]));
|
|
|
|
|
if(max_strings > 0) {
|
|
|
|
|
VK_RESULT(create_storage_buffer(gpu->allocator, 0, sizeof(GPUString)*max_strings, &container->layers[index].strings[i], &container->layers[index].strings_memory[i]));
|
|
|
|
|
container->layers[index].strings_buffer = malloc(sizeof(GPUString)*max_strings);
|
|
|
|
|
VkDeviceAddress address = buffer_address(gpu->device, container->layers[index].strings[i]);
|
|
|
|
|
add_transfer(
|
|
|
|
|
&address,
|
|
|
|
|
container->layers[index].layer[i],
|
|
|
|
|
offsetof(GPULayer, strings),
|
|
|
|
|
sizeof(VkDeviceAddress),
|
|
|
|
|
i,
|
|
|
|
|
gpu);
|
|
|
|
|
}
|
|
|
|
|
if(max_codes + max_drawables > 0) {
|
|
|
|
|
VK_RESULT(create_storage_buffer(gpu->allocator, 0, sizeof(GPUDrawable)*(max_drawables + max_codes), &container->layers[index].drawables[i], &container->layers[index].drawables_memory[i]));
|
|
|
|
|
container->layers[index].drawables_buffer = malloc(sizeof(GPUDrawable)*max_drawables);
|
|
|
|
|
VkDeviceAddress address = buffer_address(gpu->device, container->layers[index].drawables[i]);
|
|
|
|
|
add_transfer(
|
|
|
|
|
&address,
|
|
|
|
|
container->layers[index].layer[i],
|
|
|
|
|
offsetof(GPULayer, drawables),
|
|
|
|
|
sizeof(VkDeviceAddress),
|
|
|
|
|
i,
|
|
|
|
|
gpu);
|
|
|
|
|
}
|
|
|
|
|
if(max_codes > 0) {
|
|
|
|
|
VK_RESULT(create_storage_buffer(gpu->allocator, 0, sizeof(uint32_t)*max_codes, &container->layers[index].codes[i], &container->layers[index].codes_memory[i]));
|
|
|
|
|
container->layers[index].codes_buffer = malloc(sizeof(uint32_t)*max_codes);
|
|
|
|
|
VkDeviceAddress address = buffer_address(gpu->device, container->layers[index].codes[i]);
|
|
|
|
|
add_transfer(
|
|
|
|
|
&address,
|
|
|
|
|
container->layers[index].layer[i],
|
|
|
|
|
offsetof(GPULayer, codes),
|
|
|
|
|
sizeof(VkDeviceAddress),
|
|
|
|
|
i,
|
|
|
|
|
gpu);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(max_strings > 0) {
|
|
|
|
|
container->layers[index].data.strings = buffer_address(gpu->device, container->layers[index].strings[i]);
|
|
|
|
|
} else {
|
|
|
|
|
container->layers[index].data.strings = 0x00000000;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(max_codes > 0) {
|
|
|
|
|
container->layers[index].data.codes = buffer_address(gpu->device, container->layers[index].codes[i]);
|
|
|
|
|
} else {
|
|
|
|
|
container->layers[index].data.codes = 0x00000000;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(max_codes + max_drawables > 0) {
|
|
|
|
|
container->layers[index].data.drawables = buffer_address(gpu->device, container->layers[index].drawables[i]);
|
|
|
|
|
} else {
|
|
|
|
|
container->layers[index].data.drawables = 0x00000000;
|
|
|
|
|
}
|
|
|
|
|
container->layers[index].address[i] = buffer_address(gpu->device, container->layers[index].layer[i]);
|
|
|
|
|
}
|
|
|
|
|
fprintf(stderr, "Created layer with storage buffers %p/%p\n", container->layers[index].layer[0], container->layers[index].layer[1]);
|
|
|
|
@ -391,7 +407,7 @@ VkResult create_layer(
|
|
|
|
|
container->layers[index].data.max_strings = max_strings;
|
|
|
|
|
container->layers[index].data.max_codes = max_codes;
|
|
|
|
|
container->layers[index].data.num_drawables = max_drawables;
|
|
|
|
|
add_transfers(&container->layers[index].data, container->layers[index].layer, 0, sizeof(GPULayer)-sizeof(VkDeviceAddress), gpu);
|
|
|
|
|
add_transfers(&container->layers[index].data, container->layers[index].layer, 0, sizeof(GPULayer)-4*sizeof(VkDeviceAddress), gpu);
|
|
|
|
|
|
|
|
|
|
if(input->num_strings > 0) {
|
|
|
|
|
memcpy(container->layers[index].strings_buffer, input->strings, sizeof(GPUString)*input->num_strings);
|
|
|
|
|