Vasara Posted February 19, 2021 Posted February 19, 2021 (edited) Добрый день. При запуске вычислительного шейдера в цикле увеличивается время возврата данных. Чем больше счётчик, тем дольше время возврата данных из памяти. Если шейдер пустой, данные возвращаются несколько минут. Если добавить в шейдер какую либо логику, возврата текстур вообще не дождаться. Так же растёт время выполнения самого шейдера. ptrRenderTarget->enableCompute(); for (int i = 0; i < 50000; i++) { material->renderCompute(Render::PASS_POST, 512, 512); } ptrRenderTarget->disable(); Предполагаю где-то не отпускается какой-то ресурс и происходит переполнение. getImage() вылетает с ошибкой: D3D11Texture::getImage(): can't map 16384x16384 2D texture Рабочий ли вообще такой вариант с циклами или надо выносить в апдейт и там как то всё это обрабатывать? С Уважением Константин. Edited April 11, 2021 by Vasara
sweetluna Posted February 20, 2021 Posted February 20, 2021 Добрый день. Это весь код, что выполняется или опущены какие-то детали? 50к диспатчей 512x512x1 это огромный запрос для GPU, тем более для текстуры 16384x16384. Лично у меня вылезает еще ошибка о нехватке памяти: Direct3D11 error: out of memory D3D11Texture::getImage(): can't create R32U 16383x16383 2D staging texture Обычно так не делают на GPU, советую уменьшить размеры текстуры и работать над меньшими размерами. May RenderDoc/Nsight Graphics/Intel GPA bless you
Vasara Posted February 20, 2021 Author Posted February 20, 2021 (edited) Ничего лишнего, только инициализация текстуры в шейдере. Всё было убрано, чтобы быть уверенным, что с моей стороны нет ошибок. 8 гигов памяти у видеокарты. Если все ресурсы отпускаются правильно, должно работать. Гдето утечка. Я бы грешил на command list, но не помню точно, как это в dx11 сделано. Ошибки памяти нет даже после 1кк итераций с 5 текстурами. ---------------------------------------------------------------- Метод flush() решил проблему. Edited April 11, 2021 by Vasara
Recommended Posts