Запуск вычислительного шейдера в цикле.


photo

Recommended Posts

Добрый день.

При запуске вычислительного шейдера в цикле увеличивается время возврата данных.

Чем больше счётчик, тем дольше время возврата данных из памяти. Если шейдер пустой, данные возвращаются несколько минут.

Если добавить в шейдер какую либо логику, возврата текстур вообще не дождаться.

Так же растёт время выполнения самого шейдера.

	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

Рабочий ли вообще такой вариант с циклами или надо выносить в апдейт и там как то всё это обрабатывать?

С Уважением Константин.

Link to post

Добрый день.

Это весь код, что выполняется или опущены какие-то детали? 50к диспатчей 512x512x1 это огромный запрос для GPU, тем более для текстуры 16384x16384.

Лично у меня вылезает еще ошибка о нехватке памяти:
Direct3D11 error: out of memory
D3D11Texture::getImage(): can't create R32U 16383x16383 2D staging texture

Обычно так не делают на GPU, советую уменьшить размеры текстуры и работать над меньшими размерами.
 

Link to post

Ничего лишнего, только инициализация текстуры в шейдере. Всё было убрано, чтобы быть уверенным, что с моей стороны нет ошибок. 8 гигов памяти у видеокарты. Если все ресурсы отпускаются правильно, должно работать. Гдето утечка. Я бы грешил на command list, но не помню точно, как это в dx11 сделано.

Ошибки памяти нет даже после 1кк итераций с 5 текстурами.

Edited by Vasara
Link to post