Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Vulkan custom allocator

Vulkan custom allocator

Страницы: 1 2 Следующая »
DimichПостоялецwww10 ноя. 201811:26#0
В спеках пишут, что нельзя 2 раза делать vkMapMemory на один VkDeviceMemory, вопрос: а как тогда делать аллокатор? Я пробовал читать исходники с GPUopen, но нихрена не понял, а статей по этому поводу очень мало.
DimichПостоялецwww10 ноя. 201811:34#1
Немного уточнения, nvidia говорит, что надо на стороне приложения брать сразу целый гиг(допустим), потом его раздавать ресурсам, в тех статьях, что я читал, пишут, что надо для этого свой RefCounter делать, вроде логично, но если я буду лочить целый гигабайт памяти даже с флагом host cached, это не будет ппц как медленно? Или тут размер вообще не влияет?

Правка: 10 ноя. 2018 11:35

DimichПостоялецwww10 ноя. 201811:37#2
Хотя есть мысль лочить один раз, потом только vkInvalidateMappedMemoryRanges, но я нигде не видел такого упоминания, хз, будет ли это вообще работать.
/A\Постоялецwww10 ноя. 201811:56#3
Ты каждый кадр собрался гонять 1 Гб по шине?
Обычно создаешь staging buffer и через него копируешь данные в гпу память.
Мапить можно 1 раз.
DimichПостоялецwww10 ноя. 201811:58#4
Я собирался мапить, когда просыпается поток стриминга. Т.е. можно забить и делать через vkInvalidateMappedMemoryRanges?
DimichПостоялецwww10 ноя. 201812:01#5
Кстати, у меня на GeForce есть отдельная очередь чисто для трансфера, а как с этим на AMD?
/A\Постоялецwww10 ноя. 201813:02#6
Dimich
> а как с этим на AMD?
http://www.vulkan.gpuinfo.org/
судя по этим данным у АМД можно даже делать презент из трансфер очереди, но стоит ли заморачиваться?

> Т.е. можно забить и делать через vkInvalidateMappedMemoryRanges?
Ты уверен, что правильно разобрался как работает vkInvalidateMappedMemoryRanges ?
На всех гпу что я видел есть coherent host visible memory для которой не нужно ничего вызывать - все изменения сразу видны, ну разве что после барьера/ивента/фенса.

DimichПостоялецwww10 ноя. 201813:12#7
/A\
> все изменения сразу видны, ну разве что после барьера/ивента/фенса.
Во, ну т.е. надо же как-то контролировать, что данные попали в vram, а как?
DimichПостоялецwww10 ноя. 201813:15#8
Я пробовал читать vkspec, но блин, кто придумал 1800 страниц пихать в один html? У меня всё тупить начинает, когда пытаюсь его открыть.
/A\Постоялецwww10 ноя. 201813:16#9
Dimich
> У меня всё тупить начинает, когда пытаюсь его открыть.
https://renderdoc.org/vkspec_chunked/index.html
DimichПостоялецwww10 ноя. 201813:18#10
О, прикольно, спасибо.
/A\Постоялецwww10 ноя. 201813:18#11
Dimich
> Во, ну т.е. надо же как-то контролировать, что данные попали в vram, а как?
Если по простому, то: также как ты переиспользуешь команд буферы переиспользуй и память, подождал фенс - записал в память, отправил команды, ждешь другой фенс пока гпу читает память.
DimichПостоялецwww10 ноя. 201813:21#12
Фенс на vkCmdCopyBuffer?
/A\Постоялецwww10 ноя. 201813:28#13
Как все плохо то)
VkFence  fences[2];
VkCommandBuffer  commands[2];
VkBuffer  stagingBuffers[2];
VkBuffer  gpuBuffers[2];
void*  mappedMemory[2];

for (int frameId = 0;; frameId = (frameId + 1) & 1)
{
  vkWaitForFences( dev, 1, &fences[frameId], ~0ull );

  // write data to staging buffer
  memcpy( mappedMemory[frameId], ... );

  vkBeginCommandBuffer( commands[frameId], ... );

  vkCmdCopyBuffer( commands[frameId], stagingBuffers[frameId], gpuBuffers[frameId], ... );

  vkEndCommandBuffer( commands[frameId] );

  vkQueueSubmit( ..., fences[frameId] );
}
DimichПостоялецwww10 ноя. 201813:38#14
Не, ну я примерно так и думал)
Страницы: 1 2 Следующая »

/ Форум / Программирование игр / Графика

2001—2018 © GameDev.ru — Разработка игр