Salamander 2 14 января, 2021 Опубликовано 14 января, 2021 · Жалоба Есть специалисты в области 3D? На видео кубик, в коде я включил использование при визуализации Z-буфера. Первые кадры визуализируются нормально, потом же кубик постепенно "растворяется". Скажу сразу - нормали у меня от балды (не понял пока, как расчитывать их), это заметно по тому, как по разному освещаются полигоны одной грани, но мне пока терпимо. Так вот, а могут ли неправильные нормали давать такой эффект? Или это только проблемы Z-буфера? Или еще чего-то? https://cloud.mail.ru/public/DGUX/TZoRw7stw Пардон, правильное видео тут https://cloud.mail.ru/public/4h2M/DeoFPhWme Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Salamander 2 16 января, 2021 Опубликовано 16 января, 2021 (изменено) · Жалоба Поборол таки и Z-буфер и нормали.... Непонятным пока остается то что запись через DMA2D идет нормально, а вот через *(__IO uint32_t*)(adr + (x + y * 1024)*3)=color- с артефактами.... Пытаюсь теперь интегрировать этот код не в основную программу, а внутрь функций toochGFX - странные проблемы.....Тут уже вопросы к знатокам KEIL файл dsp3d.c - добавлен в проект #include <dsp3d.h> - добавлено в main.c Все работает. Беру другой файл, сгенерированный системой touchgfx - mainscreenview.cpp добавляю в него #include <dsp3d.h> вызываю в тексте dsp3D_renderGouraud(dsp3dModel2) (просто одна из функций файла dsp3d.c) Проект компилируется, но не линкуется Error: L6218E: Undefined symbol dsp3D_renderGouraud(float*) (referred from mainscreenview.o). Как так? Функция видна в одном месте проекта, но не видна в другом, хотя в обоих местах библиотека подключена одинаково.... Изменено 16 января, 2021 пользователем Salamander Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 16 января, 2021 Опубликовано 16 января, 2021 · Жалоба #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ и #ifdef __cplusplus } #endif /* __cplusplus */ в 3д хедер. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Salamander 2 25 января, 2021 Опубликовано 25 января, 2021 · Жалоба Вроде все нормально. Но немного глючит DMA2D. У меня последовательно осуществляется несколько посылок информации через DMA2D, то есть есть несколько вот таких конструкций (с отличиями), идущих друг за другом hdma2d.Init.Mode = DMA2D_R2M; hdma2d.Init.ColorMode = DMA2D_OUTPUT_ARGB8888; hdma2d.Init.OutputOffset =0; HAL_DMA2D_Init(&hdma2d); if(HAL_DMA2D_Start(&hdma2d, 0xFFFFFFFF, 0xD0400000, 1024, 600) == HAL_OK) { HAL_DMA2D_PollForTransfer(&hdma2d, 10); } Вот текст функции HAL_DMA2D_PollForTransfer Это выше моих сил.... Скажите - эта функция дожидается окончания передачи? Программа идет дальше после окончания передачи или сразу же после запуска копирования? HAL_StatusTypeDef HAL_DMA2D_PollForTransfer(DMA2D_HandleTypeDef *hdma2d, uint32_t Timeout) { uint32_t tickstart; uint32_t layer_start; __IO uint32_t isrflags = 0x0U; /* Polling for DMA2D transfer */ if((hdma2d->Instance->CR & DMA2D_CR_START) != 0U) { /* Get tick */ tickstart = HAL_GetTick(); while(__HAL_DMA2D_GET_FLAG(hdma2d, DMA2D_FLAG_TC) == 0U) { isrflags = READ_REG(hdma2d->Instance->ISR); if ((isrflags & (DMA2D_FLAG_CE|DMA2D_FLAG_TE)) != 0U) { if ((isrflags & DMA2D_FLAG_CE) != 0U) { hdma2d->ErrorCode |= HAL_DMA2D_ERROR_CE; } if ((isrflags & DMA2D_FLAG_TE) != 0U) { hdma2d->ErrorCode |= HAL_DMA2D_ERROR_TE; } /* Clear the transfer and configuration error flags */ __HAL_DMA2D_CLEAR_FLAG(hdma2d, DMA2D_FLAG_CE | DMA2D_FLAG_TE); /* Change DMA2D state */ hdma2d->State = HAL_DMA2D_STATE_ERROR; /* Process unlocked */ __HAL_UNLOCK(hdma2d); return HAL_ERROR; } /* Check for the Timeout */ if(Timeout != HAL_MAX_DELAY) { if(((HAL_GetTick() - tickstart ) > Timeout)||(Timeout == 0U)) { /* Update error code */ hdma2d->ErrorCode |= HAL_DMA2D_ERROR_TIMEOUT; /* Change the DMA2D state */ hdma2d->State = HAL_DMA2D_STATE_TIMEOUT; /* Process unlocked */ __HAL_UNLOCK(hdma2d); return HAL_TIMEOUT; } } } } /* Polling for CLUT loading (foreground or background) */ layer_start = hdma2d->Instance->FGPFCCR & DMA2D_FGPFCCR_START; layer_start |= hdma2d->Instance->BGPFCCR & DMA2D_BGPFCCR_START; if (layer_start != 0U) { /* Get tick */ tickstart = HAL_GetTick(); while(__HAL_DMA2D_GET_FLAG(hdma2d, DMA2D_FLAG_CTC) == 0U) { isrflags = READ_REG(hdma2d->Instance->ISR); if ((isrflags & (DMA2D_FLAG_CAE|DMA2D_FLAG_CE|DMA2D_FLAG_TE)) != 0U) { if ((isrflags & DMA2D_FLAG_CAE) != 0U) { hdma2d->ErrorCode |= HAL_DMA2D_ERROR_CAE; } if ((isrflags & DMA2D_FLAG_CE) != 0U) { hdma2d->ErrorCode |= HAL_DMA2D_ERROR_CE; } if ((isrflags & DMA2D_FLAG_TE) != 0U) { hdma2d->ErrorCode |= HAL_DMA2D_ERROR_TE; } /* Clear the CLUT Access Error, Configuration Error and Transfer Error flags */ __HAL_DMA2D_CLEAR_FLAG(hdma2d, DMA2D_FLAG_CAE | DMA2D_FLAG_CE | DMA2D_FLAG_TE); /* Change DMA2D state */ hdma2d->State= HAL_DMA2D_STATE_ERROR; /* Process unlocked */ __HAL_UNLOCK(hdma2d); return HAL_ERROR; } /* Check for the Timeout */ if(Timeout != HAL_MAX_DELAY) { if(((HAL_GetTick() - tickstart ) > Timeout)||(Timeout == 0U)) { /* Update error code */ hdma2d->ErrorCode |= HAL_DMA2D_ERROR_TIMEOUT; /* Change the DMA2D state */ hdma2d->State= HAL_DMA2D_STATE_TIMEOUT; /* Process unlocked */ __HAL_UNLOCK(hdma2d); return HAL_TIMEOUT; } } } } /* Clear the transfer complete and CLUT loading flags */ __HAL_DMA2D_CLEAR_FLAG(hdma2d, DMA2D_FLAG_TC|DMA2D_FLAG_CTC); /* Change DMA2D state */ hdma2d->State = HAL_DMA2D_STATE_READY; /* Process unlocked */ __HAL_UNLOCK(hdma2d); return HAL_OK; } По тексту функции вроде бы должна дожидаться. ПО факту: HAL_DMA2D_Init(&hdma2d); if(HAL_DMA2D_Start(&hdma2d, 0xFFFFFFFF, 0xD0400000, 1024, 600) == HAL_OK) { HAL_DMA2D_PollForTransfer(&hdma2d, 10); } ЗДЕСЬ БРЕЙКПОИНТ HAL_DMA2D_Init(&hdma2d); if(HAL_DMA2D_Start(&hdma2d, 0xFFFFFFFF, 0xD0400000, 1024, 600) == HAL_OK) { HAL_DMA2D_PollForTransfer(&hdma2d, 10); } ЗДЕСЬ БРЕЙКПОИНТ HAL_DMA2D_Init(&hdma2d); if(HAL_DMA2D_Start(&hdma2d, 0xFFFFFFFF, 0xD0400000, 1024, 600) == HAL_OK) { HAL_DMA2D_PollForTransfer(&hdma2d, 10); } ЗДЕСЬ БРЕЙКПОИНТ если наставить брейкпоинтов и спокойно шагать, никаких артефактов не наблюдается. Если работать в обычном режиме - артефакты. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 25 января, 2021 Опубликовано 25 января, 2021 (изменено) · Жалоба Надо ли HAL_DMA2D_Init повторять? На заданый вопрос не отвечу, HAL не использовал. Что у Вас возвращает HAL_DMA2D_PollForTransfer ? Изменено 25 января, 2021 пользователем GenaSPB Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 25 января, 2021 Опубликовано 25 января, 2021 · Жалоба Для такого объёма данных (1024 на 600, да ещё и 32 бит) 10 мсек таймаут маловат. Даже без оглядки на контроллер, а просто исходя из пропускной способности sdram. Ваш таймаут намекает на 100 fps, а это круто. У вас скорее всего меньше. Поставьте 100 мсек, медленнее работать не будет, да и вас, в случае чего, ожиданием не утомит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Salamander 2 29 января, 2021 Опубликовано 29 января, 2021 · Жалоба On 1/26/2021 at 12:07 AM, MementoMori said: 10 мсек таймаут маловат Точно. Поставил 200 мсек - артефакты сильно поубавились, но не до конца. On 1/25/2021 at 11:55 PM, GenaSPB said: Что у Вас возвращает HAL_DMA2D_PollForTransfer ? Всегда возвращает 0. Я флажок поставил на значение, отличное от нуля - ни разу не сработал. Кстати, попробовал запустить эту потеху на STM32H743 - fps был 8-9, стал 17-20. За счет одной лишь тактовой частоты наверное. Ответьте на такой вопрос - в течение всей этой темы мы оптимизировали библиотеку с учетом того, что имевшийся у меня F746 имел single precision. Но вот у меня проц с double precision. Что дает этот double precision? Как то можно переделать библиотеку, чтобы использовать это преимущество для прироста скорости? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 38 29 января, 2021 Опубликовано 29 января, 2021 · Жалоба Но вот у меня проц с double precision. Что дает этот double precision? DP даёт больший допустимый диапазон чисел. Как то можно переделать библиотеку, чтобы использовать это преимущество для прироста скорости? DP не недостаток и не преимущество. Т.е. вы не увидели, что, тупо, алгоритмическая оптимизация итальянцу не знакома... (из циклов неизменные фрагменты кто выносил? ;-) ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 243 29 января, 2021 Опубликовано 29 января, 2021 · Жалоба 2 часа назад, Obam сказал: DP даёт больший допустимый диапазон чисел. Не только. Ещё бОльшую точность. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 38 30 января, 2021 Опубликовано 30 января, 2021 · Жалоба Зачем жеж так, сразу-то все козыри... PS: полагаю, сделав всё без "плавучки", ТС нам рассказывал бы про "истинную мощь" CM4F. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrBearManul 0 30 января, 2021 Опубликовано 30 января, 2021 · Жалоба 8 часов назад, Salamander сказал: Что дает этот double precision? Ну почитайте про него)) Информация не секретная) Грубо: он позволяет аппаратно считать числа в формате double, это если смотреть с точки зрения Си. И делает это быстрее, чем программная реализация. Наличие сопроцессора одинарной точности никак не ускоряет операции с числами двойной точности. Это для справки. 8 часов назад, Salamander сказал: Как то можно переделать библиотеку, чтобы использовать это преимущество для прироста скорости? Как я понял, теперь вы можете взять его "оригинальную" библиотеку без литер f в конце чисел, и оно будет работать чуть быстрее, чем работало на CM4F. Но этого делать не надо, т.к. код всё равно там неоптимизированный. Я не знаю, что может дать double для вычисления графики... Я с ней сильно не работал, но предположу со своего делетантского взгляда, что всё можно сделать и в целых числах, а уж с ними полноценно работает всё, начиная с CM3. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Salamander 2 30 января, 2021 Опубликовано 30 января, 2021 · Жалоба 9 hours ago, Obam said: Т.е. вы не увидели, что, тупо, алгоритмическая оптимизация итальянцу не знакома.. Как, не увидел? Увидел. Ведь 9 hours ago, Obam said: из циклов неизменные фрагменты кто выносил? Я ведь их выносил. А итальянец не дурак - он хитрец, на видео у него довольно-таки быстрый рендеринг. Значит библиотека, что он выложил, не последней версии. А нормальную он зажал 4 hours ago, MrBearManul said: теперь вы можете взять его "оригинальную" библиотеку без литер f в конце чисел, А зачем брать оригинальную, если 4 hours ago, MrBearManul said: т.к. код всё равно там неоптимизированный. А мой код оптимизированный - неизменяемые фрагменты из цикла убрал, с излишними вызовами функций разобрался. Если я свою доработанную библиотеку возьму и уберу из нее f - будет толк? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrBearManul 0 30 января, 2021 Опубликовано 30 января, 2021 · Жалоба 3 часа назад, Salamander сказал: Если я свою доработанную библиотеку возьму и уберу из нее f - будет толк? Сравните за сколько тактов занимают арифметические операции с разными типами данных на разных сопроцессорах. Я ответа не знаю, т.к. не работал с CM7F. Но в целом, зачем переходить на double? Вам разрешающей способности float не хватает? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 38 30 января, 2021 Опубликовано 30 января, 2021 · Жалоба А итальянец не дурак - он хитрец, на видео у него довольно-таки быстрый рендеринг. Мало вам отечественных "пионэров". Ну нельзя настолько видеороликам доверять... Вы присказку про надпись на заборе знаете?... Вот-вот, а там дрова. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 31 января, 2021 Опубликовано 31 января, 2021 (изменено) · Жалоба 29.01.2021 в 23:47, Obam сказал: DP даёт больший допустимый диапазон чисел. Чет тут столько хвалебных од этому DP, а что он дает в реальной задаче, например здесь? Тут реально требуется такая точность, что ее невозможно получить в SP? Или вся суть, что автор библиотеки понатыкал везде double вместо float, или каким-либо образом это не задефайнил, чтоб можно было легко переключить в любой режим? Так причем тут блок в МК - тут просто говнокод тогда и не более того... Изменено 31 января, 2021 пользователем mantech Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться