}:+()___ [Smile]
> как оно по скорости по сравнению с предварительной заливкой в DEVICE_LOCAL буфер?
По идее ресурсы доступные для CPU работают Медленее на GPU. Причём аналогично для Direct3D12(D3D12_HEAP_TYPE_DEFAULT) и Metal(MTLStorageModePrivate).
как оно по скорости по сравнению с предварительной заливкой в DEVICE_LOCAL буфер?
Медленней заметно (прям десятки fps)
Имеется в виду разница в скорости у "рисования из host-буффера" и "заливки в device-буффер + рисования из него".
Т. е. имеет смысл организовывать заливку самому или проще рисовать сразу из host-буффера?
Буфер динамический и обновляется каждый кадр. Статику понятно, что заливать надо.
}:+()___ [Smile]
>
> Буфер динамический и обновляется каждый кадр.
В таком случае динамический может быть быстрей, но попробуй сделать два Ring Buffer'а. Заливаешь в host копируешь в device local. А буфер динамический большой? Persistent mapping пробовал вместо копирования?
Andrey
> В таком случае динамический может быть быстрей, но попробуй сделать два Ring Buffer'а.
У меня сейчас два host-буффера, в которые я поочередно заливаю и рисую. Проблема в том, что у меня нет железа без DEVICE_LOCAL + HOST_VISIBLE памяти, так что мои тесты нерепрезентативные.
> А буфер динамический большой?
Пока маленький, но вопрос на перспективу: стоит городить специальную инфраструктуру для стриминга или можно просто рисовать из host-буффера не заморачиваясь.
> Persistent mapping пробовал вместо копирования?
Ну так в сабже это техника по умолчанию.
}:+()___ [Smile]
> стоит городить специальную инфраструктуру для стриминга или можно просто рисовать из host-буффера не заморачиваясь.
а что стримить? собираешься? геометрию при движении камеры? подгрузка уровней? если такие задачи то стоит городить. Такое все равно рисовать нужно быстро из GPU Visible Only.
/A\
Я думал что ролинг контекст это про зависимость пайплайнов и мягкую перезагрузку
Тем временем в Vulkan продолжают заимствовать идеи из Direct3D 12 😂.
Вот тут интересно пишут.
https://vk.com/wall-178581777_12499?ysclid=mks1vr669m4556002
Ну а вообще вулкан вышел в 2016 году и до сих пор всё никак не допилят его за 8 лет.
Варзецы пилят наверное :)
Vulkan уже 10 лет, а с начала разработки дизайна прошло уже лет 12. Некоторые решения которые в него изначально закладывались уже выглядят устаревшими. Возможно пришло время для Vulkan 2.0.
prowkan
> Тем временем в Vulkan продолжают заимствовать идеи из Direct3D 12 😂
Это понятно, не надр было биндинги числые вершинных аттрибутрв итресурсов делать с убогим метюртворожденным GLSL, не нужно было VkFrameBuffer(и не надо гнать что мобилки тут , вообще не причем)вводить, ну и куча legacy расширения для совместимости с убогой Галей. А это же ресурсы и время комитета. Вообще плохо что в спецификации учавствовали старики от Гали. Отсюда куча переделок, сраных расширений которые потом deprecated.
https://www.sebastianaaltonen.com/blog/no-graphics-api
No Graphics API by Sebastian Aaltonen
Лонгрид на тему разбора архитектурных косяков Вулкана.
Чел предлагает новое апи, насколько можно простое.
Его основные тезисы (насколько я их понял):
- абстракции и сущности прошлых API соотносятся с аппаратурой GPU
- железо GPU сильно прогрессировало в сторону универсализации, и многие абстракции стали ненужными
- всё для чего нету специальной поддержки в GPU, должно быть представлено как массив байт. Работа идёт с указателями на такие массивы. Нету особых причин почему так не можно/не нужно
- то для чего есть специализированные блоки (например индексы вершин) должно быть максимально упрощено
- общая идея - минимализм
- для нового API должны быть прослойки трансляции из Vulkan/DX12
- понадобится поддержка вендоров
Очередной опрос https://www.surveymonkey.com/r/LRFD7V6
Установил новый СДК и опять слои мне ненавязчиво намекают, что я опять все не так сделал:
validation layer: vkQueueSubmit(): pSubmits[0].pSignalSemaphores[0] (VkSemaphore 0x8fa00000008fa) is being signaled by VkQueue 0x1c886916290, but it may still be in use by VkSwapchainKHR 0x9c600000009c6. Most recently acquired image indices: 0, 0, 0, 0, 0, [1], 0, 2. (Brackets mark the last use of VkSemaphore 0x8fa00000008fa in a presentation operation.) Swapchain image 1 was presented but was not re-acquired, so VkSemaphore 0x8fa00000008fa may still be in use and cannot be safely reused with image index 2. Vulkan insight: See https://docs.vulkan.org/guide/latest/swapchain_semaphore_reuse.html for details on swapchain semaphore reuse. Examples of possible approaches: a) Use a separate semaphore per swapchain image. Index these semaphores using the index of the acquired image. b) Consider the VK_KHR_swapchain_maintenance1 extension. It allows using a VkFence with the presentation operation. The Vulkan spec states: Each binary semaphore element of the pSignalSemaphores member of any element of pSubmits must be unsignaled when the semaphore signal operation it defines is executed on the device (https://docs.vulkan.org/spec/latest/chapters/cmdbuffers.html#VUID-vkQueueSubmit-pSignalSemaphores-00067)
Помогите плз пофиксить по-быстрому кто шарит как бог в Вулкане, а то сам я дня три искать буду, я уже забыл как я все там делал, года три прошло:
vkWaitForFences(logicalDevice, 1, &inFlightFences[currentFrame], VK_TRUE, UINT64_MAX);
uint32_t imageIndex;
VkResult result = vkAcquireNextImageKHR(logicalDevice, swapChain, UINT64_MAX, imageAvailableSemaphores[currentFrame], VK_NULL_HANDLE, &imageIndex);
if (result == VK_ERROR_OUT_OF_DATE_KHR) {
recreateSwapChain();
return;
}
else if (result != VK_SUCCESS && result != VK_SUBOPTIMAL_KHR) {
throw std::runtime_error("failed to acquire swap chain image!");
}
// Здесь рисуем
if (imagesInFlight[currentFrame] != VK_NULL_HANDLE) {
vkWaitForFences(logicalDevice, 1, &imagesInFlight[currentFrame], VK_TRUE, UINT64_MAX);
}
imagesInFlight[currentFrame] = inFlightFences[currentFrame];
VkSubmitInfo submitInfo{};
submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
VkSemaphore waitSemaphores[] = { imageAvailableSemaphores[currentFrame] };
VkPipelineStageFlags waitStages[] = { VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT };
submitInfo.waitSemaphoreCount = 1;
submitInfo.pWaitSemaphores = waitSemaphores;
submitInfo.pWaitDstStageMask = waitStages;
submitInfo.commandBufferCount = 1;
submitInfo.pCommandBuffers = &commandBuffers[currentFrame];
VkSemaphore signalSemaphores[] = { renderFinishedSemaphores[currentFrame] };
submitInfo.signalSemaphoreCount = 1;
submitInfo.pSignalSemaphores = signalSemaphores;
vkResetFences(logicalDevice, 1, &inFlightFences[currentFrame]);
VK_CHECK_RESULT(vkQueueSubmit(graphicsQueue, 1, &submitInfo, inFlightFences[currentFrame]));
VkPresentInfoKHR presentInfo{};
presentInfo.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
presentInfo.waitSemaphoreCount = 1;
presentInfo.pWaitSemaphores = signalSemaphores;
VkSwapchainKHR swapChains[] = { swapChain };
presentInfo.swapchainCount = 1;
presentInfo.pSwapchains = swapChains;
presentInfo.pImageIndices = &imageIndex;
result = vkQueuePresentKHR(presentQueue, &presentInfo);
if (result == VK_ERROR_OUT_OF_DATE_KHR || result == VK_SUBOPTIMAL_KHR || framebufferResized) {
framebufferResized = false;
recreateSwapChain();
}
else if (result != VK_SUCCESS) {
throw std::runtime_error("failed to present swap chain image!");
}
currentFrame = (currentFrame + 1) % MAX_FRAMES_IN_FLIGHT;MikeNew
Переходи на directx 12 :)