записать значение в Z-buffer, а потом если оно записано (до этого там находилась большая глубина) атомарно записать в color buffer. Если это делать из нескольких потоков, то все может сломаться
софтварные растеризаторы растеризуют один примитив в несколько потоков, такой ситуации не возникает
Я думал бахнуть атомик bool на операцию чтения-записи из глубины и цвета. Сколько пикселей на экране, столько и атомиков. Каждый тред при попытке записать что-то входит в спинлок, ожидая пока предыдущий проверит глубину и запишет. Норм подход?
звучит жутко, но кто тебя остановит? )
Хотелось бы конечно побенчить чтобы сравнить с другими методами но я конечно же не буду 🤌🏻
Не, ну тут надо остановить, слишком страшно звучит
Ладно-ладно, я переночевал эту идею и сам уже думаю, что фигню какую-то придумал🤣
Тебе надо будет заалайнить по длине кешлинии чтобы убрать false-sharing, и твои булы превращаются в 8-байт; Либо тебе нужно убедиться, что разные потоки работают с пикселями далеко друг от друга.
да я уже подумал зря я взялся за такой подход: моя изначальная идея была распределять между потоками работу по растеризации отдельных объектов. Но тогда возникает вопрос с race condition при обращении к depth и color. Теперь я, как посоветовал Тимур, между потоками буду распределять работу по растеризации пикселей для каждого объекта. Тогда все ядра будут заняты и не нужно будет спинлоки мутить
но насчет аллайна по кешлиниям хорошая идея.
пиксели тоже сурово слишком, тайлами самое то будет
Обсуждают сегодня