/A\
freesoft
> Да. Но речь не об этом
Как не об этом? На дескопе всегда есть две отдельных графических очереди? На мобилках этого нет к примеру.
/A\
В Вулкане есть понятие "семейство очередей". Ну типа, тип очереди.
Очередей одного типа (семейства) может быть > 1.
Иллюстрация:
// определение в vulkan_core.h
typedef struct VkQueueFamilyProperties {
VkQueueFlags queueFlags;
uint32_t queueCount; // искомое поле - вот столько очередей такого-то семейства
uint32_t timestampValidBits;
VkExtent3D minImageTransferGranularity;
} VkQueueFamilyProperties;
...
// тут запрашиваем данные по очередям устройства
uint32_t queueFamilyCount = 0;
vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, nullptr);
std::vector<VkQueueFamilyProperties> queueFamilies(queueFamilyCount);
vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, queueFamilies.data());
...
VkDeviceQueueCreateInfo queueCreateInfo{};
queueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
queueCreateInfo.queueFamilyIndex = graphicsFamily;
queueCreateInfo.queueCount = например 2, но не больше, чем нам сказали в предыдущем вызове
queueCreateInfo.pQueuePriorities = queuePriority;На дескопе всегда есть две отдельных графических очереди?
Скорее всего нет. На интересных мне картах - есть.
Тут встает вопрос, на чем мы хотим работать.
По моим данным, более-менее качественные драйвера, поддерживающие например Вулкан 1.2 - это Nvidia Turing. На них этих очередей как у дурака фантиков. Например очередей копирования на RTX2060 - 6 штук, графических очереди 2, по 1 видео-кодирования/декодирования, 2 очереди вычислений. На моделях поновее всё ещё лучше.
Всё что раньше (Pascal) формально поддерживает например те же массивы текстур, а фактически валится в необъяснимые ошибки, или ведет себя не по документации.
Возвращаясь к вашему комментарию, что очереди достаточно одной.
Я ловил следующую ошибку Validations Layer:
validation layer: Validation Error: [ UNASSIGNED-Threading-MultipleThreads-Write ] Object 0: handle = 0x277d47dd840, type = VK_OBJECT_TYPE_QUEUE; | MessageID = 0xa05b236e | vkQueueSubmit(): THREADING ERROR : object of type VkQueue is simultaneously used in current thread 9808 and thread 15192
Я думаю что правы и вы и я. На мобилках скорей всего этой проблемы нету, потому что и очередь одна.
На десктопе это вот так на данной конкретной карте. Я сделал как намекнули в ошибке - разделил очереди. Да, возможно, если вставить синхронизацию, ошибка уйдёт. Я это честно не осилил. Синхронизация в вулкане это треш (хотя возможно там хватит обычного мютекса, не уверен).
Да, это теперь где-то не запустится.
На другой версии драйвера и на другой карте ошибка может уйти либо поменяться.
Вот такая вот радость разработки на Вулкане.
freesoft
Достаточно в мьютекс обернуть работу с очередями, там несколько функций всего.
А оверхэд от нескольких очередей намного больше. NV говорят что нужно по одной очереди каждого типа и только для async copy можно 2.
А зачем они тогда нужны во множественном числе?
freesoft
> А зачем они тогда нужны во множественном числе?
Если 2 программы одновременно что-то рисуют, то у них все равно будет 2 очереди, так что почему бы одной программе не дать несколько.
Queue family соответствует хардварной очереди, которая одна, а все остальное это софтварная обертка, которая внутри синхронизируется чтобы записать в одну очередь.
/A\
Есть у меня сомнения что очереди хардаарные
freesoft
Сравнивал мапинг в память и обычное чтение ?
innuendo
> Есть у меня сомнения что очереди хардаарные
В схемах GPU есть Async Compute Engine, который как раз распределяет задачи из компьют очереди.
У Mali есть прям очереди в счетчиках производительности, но на мобилках они немного другие, там отдельно VS, FS и CS очередь.
/A\
Тебя сильно волнует как там в железке ? Если пишешь под конкретное железо то да
Стриминг текстурного массива как лучше ?
А кака было ? :)
innuendo
> Какие ваши варианты ?
Я сначала сделал VT в классическом виде (как в Rage). Потом усовершенствовал технологию, чтобы не паковать все в одну текстуру. В итоге у меня получились такие лимиты: макс. количество текстур 131072, макс. размер текстуры 8192x8192 (могут быть необязательно квадратными, но степень двойки обязательна), размер физического кеша 16k x 8k для каждого: albedo/normal/metallic/roughness. Ограничение, все карты должны быть одинакового размера. Например если albedo 4096х2048, то и metallic/roughness такие же.
0xc0de
Все карты одинакового размера ? Это нехорошо
0xc0de
А какие форматы текстур если не секрет ?
0xc0de
Ну а сам стриминг как? Readback from gPU?