std::variant
> uint index = atomicCompSwap(selBuffer[customIndex].counter, 0, 0xffffffff);
> if(index == 0) {
> // Мы получили блокировку
> index = atomicAdd(selBuffer[0].counter, 1) + 1;
> atomicExchange(selBuffer[customIndex].counter, index);
В этом месте как минимум две инструкции, которые дважды во времени обращаются к selBuffer[customIndex]. Таким образом атомарность не обеспечить ;)
totoro
> Таким образом атомарность не обеспечить ;)
Тогда чтоб гарантировать атомарность, нужно сразу записывать итоговое значение в atomicCompSwap, а не в два этапа.
// 1. Пытаемся атомарно захватить ячейку, записывая в неё временный маркер (0xffffffff)
uint index = atomicCompSwap(selBuffer[customIndex].counter, 0, 0xffffffff);
if (index == 0) {
// 2. Если захватили успешно, вычисляем новый индекс
uint newIndex = atomicAdd(selBuffer[0].counter, 1) + 1;
// 3. Атомарно записываем итоговый индекс (вместо 0xffffffff)
uint oldValue = atomicCompSwap(selBuffer[customIndex].counter, 0xffffffff, newIndex);
// 4. Проверяем, что никто не испортил значение (если да — это ошибка логики)
if (oldValue != 0xffffffff) {
// Это не должно происходить, если логика корректна
return; // или какая-то обработка ошибки
}
index = newIndex;
} else {
// 5. Если ячейка уже занята, читаем её значение (с барьерами)
for (int i = 0; i < 3; i++) {
index = atomicAdd(selBuffer[customIndex].counter, 0);
if (index != 0xffffffff) break;
memoryBarrier();
}
if (index == 0xffffffff) return; // не удалось прочитать
}std::variant
> Пытаемся атомарно захватить ячейку
У меня именно так и сделано
Как на АМД включить dual-issue?
Обещают что будет 2х к производительности ALU и во всех спеках указываются FLOPS с учетом dual-issue.
Кто знает, по какой причине может происходить вот это вот:
???
Что я делаю. Я делаю несколько FBO, рисую в каждую текстуру отдельно. Потом эти текстуры накладываю друг на друга. Откуда может взяться этот отпечаток? Почему он не везде? (хотя есть заметные изменения в других местах, например на буквах видно).
Это может происходить по той причине, что накладываемая текстура может оказаться не прозрачной в этих местах?
На скрине не вижу куда смотреть.
Может прозрачность криво интерполируется
1 frag / 2 deaths, "прямоугольников" не должно быть.
"Проблему" решил. Если просто выводить масштабированием, то вот эти зазоры появляются. Вывожу в текстуру без масштабирования, потом вывожу саму текстуру уже с масштабированием.
Блин, а вот без лишних телодвижений это как-то решить можно?
Mirrel
ClampToEdge поставь
/A\, благодарю, проверю!
Не помогло... :(
Mirrel
У тебя фон закрашивается синим, а это щели между полигонами?
Такие проблемы были на интеле даже в оноайн картах.
Есть invariant в шейдере, если они разные. Либо растянуть полигон на полпикселя.
MrShoor бы подсказал, но его захейтил Мирель.
И MrShoor ушёл в лес.
/A\, фон чёрный. Остальное в Nes тайлами забито. Там где выделяется, это спрайты.
> Либо растянуть полигон на полпикселя.
да, знакомо... древнейшая проблема, попробую.
Mirrel
Процентов 90 что это https://gamedev.ru/flame/forum/?id=280941
Dmitry_Milk
Что вообще за каргокульт углов Эйлера, я никогда ими не пользовался
Рендерферма кроликов, ты вообще о чем?