AMM1AK
> А каким образом?
Сейчас перечитал и понял, что не правильно понял твой вопрос.
В таком случае я вижу только один вариант, linked list на атомиках. Если у тебя овердроу не сильно большой, то поидее будет не сильный оверхед.
Знаешь как линкедлист делается на атомиках?
MrShoor
Да видел примеры. R32ui image надо дополнительно. Перед чтением пишем 1, после записи возвращаем 0. Хотим читать, ждём пока не будет 0.. оно?)
AMM1AK
> Перед чтением пишем 1, после записи возвращаем 0. Хотим читать, ждём пока не будет 0.. оно?)
Если ты про спинлок, то его тоже можно через atomicCompSwap
while (true) { if ( atomicCompSwap( thread_data[fragcoord.xy], 0, thread_id)) continue; //делаешь то что тебе надо thread_data[fragcoord.xy] = 0; break; }
Но я говорил про несколько другое, про линкед листы (как например в Order Independent Transparency)
MrShoor
> Но я говорил про несколько другое, про линкед листы (как например в Order Independent Transparency)
Так там идея в том, что для каждого фрагмента выделяется свой кусок в ssbo и фрагмент уже работает с ним. А у меня как раз прикол в том, что пачка фрагментов с одинаковыми координатами должны работать с одним куском в ssbo.. отсюда и затык..
А имедж на атомиках у меня и так есть, там как раз и хранится индекс для чтения из ssbo.
По сути, как oit, только для каждого фрагмента лист длинной 1 элемент, который и надо перезаписывать.
AMM1AK
Если овердров не большой, то поидее спинлок выше должен неплохо сработать
Есть ли в OpenGL возможность слить текстуры в одну (не наложить друг на друга, а создать большую из маленьких)? Будут ли подобные проблемы если я буду использовать DX или Vulkan? Точнее есть ли в них подобные реализации?
Mirrel
> Есть ли в OpenGL возможность слить текстуры в одну (не наложить друг на друга, а создать большую из маленьких)?
Есть. Создаешь большую, вызываешь glTexSubImage2D для своих маленьких изображений с нужными координатами.
> Будут ли подобные проблемы если я буду использовать DX или Vulkan? Точнее есть ли в них подобные реализации?
Есть. Действовать точно так же как и в случае с OpenGL. Только вызывать вместо glTexSubImage2D надо будет ID3D11DeviceContext::UpdateSubresource. В случае с DX12/Vulkan нужно будет еще промежуточный буфер создать, и из него уже звать CopyTextureRegion/vkCmdCopyBufferToImage
MrShoor
> В случае с DX12/Vulkan нужно будет еще промежуточный буфер создать, и из него уже звать CopyTextureRegion/vkCmdCopyBufferToImage
Можно и напрямую из имэджа в имэдж:
https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html… opyImage.html
https://learn.microsoft.com/en-us/windows/win32/api/d3d12/nf-d3d1… textureregion
HolyDel
> Можно и напрямую из имэджа в имэдж:
Ну в любом случае придется создать промежуточный имейдж/буфер
Благодарю, буду так же рассматривать и этот вариант.
Я видел как создаётся FBO и данные записываются в текстуру. Ну и ещё, лично я, выводил в буфер экрана, не выводя изображения, считывал данные.
Какой метод будет лучше использовать?
Mirrel
Хочешь конкретно ты что?
innuendo
слить текстуры в одну (не наложить друг на друга, а создать большую из маленьких)
А по сути, я хочу сделать диалог. Чтоб я мог вывести любую часть диалога, насколько длинным бы он не был. И не тратить на это много времени, рисуя каждый символ. Закинуть весь текст в текстуру и выводить текстуру по координатам.
А, ну и да, чтоб я потом много времени на шейдеры не тратил, чтоб переделать данную функциональность. Желательно чтоб одинаково работало как в "устаревшем" OpenGL, так и с использованием шейдеров.
Точнее, чтоб я, как минимум, произведённые вычисления мог применить к шейдерам (это будет уже моя проблема).
MrShoor
> while (true) {
> if (atomicCompSwap(thread_data[fragcoord.xy], 0, thread_id)) continue;
> //делаешь то что тебе надо
> thread_data[fragcoord.xy] = 0;
> break;
> }
Какой-то очень умный код, а почему не так?:
while (atomicCompSwap( thread_data[fragcoord.xy], 0, thread_id)) { /* spinlock */ } //делаешь то что тебе надо thread_data[fragcoord.xy] = 0;
Имбирная Ведьмочка
да, это то же самое посути