Перейти к содержанию
    

Как наибыстрейше вывести на экран точку?

Есть специалисты в области 3D?

На видео кубик, в коде я включил использование при визуализации Z-буфера.

Первые кадры визуализируются нормально, потом же кубик постепенно "растворяется".  Скажу сразу - нормали  у меня от балды (не понял пока, как расчитывать их), это заметно по тому, как по разному освещаются полигоны одной грани, но мне пока терпимо.

Так вот, а могут ли неправильные нормали давать такой эффект? Или это только проблемы Z-буфера? Или еще чего-то?

 

https://cloud.mail.ru/public/DGUX/TZoRw7stw

Пардон, правильное видео тут https://cloud.mail.ru/public/4h2M/DeoFPhWme

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поборол таки и 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).

 

Как так? Функция видна в одном месте проекта, но не видна в другом, хотя в обоих местах библиотека подключена одинаково....
    

 

 

Изменено пользователем Salamander

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

 

и

 


#ifdef __cplusplus
}
#endif /* __cplusplus */

в 3д хедер.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вроде все нормально.

Но немного глючит 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);
		}

ЗДЕСЬ БРЕЙКПОИНТ

если наставить брейкпоинтов и спокойно шагать, никаких артефактов не наблюдается. Если работать в обычном режиме - артефакты.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Надо ли HAL_DMA2D_Init повторять?
На заданый вопрос не отвечу, HAL не использовал.

Что у Вас возвращает HAL_DMA2D_PollForTransfer ?

Изменено пользователем GenaSPB

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для такого объёма данных (1024 на 600, да ещё и 32 бит) 10 мсек таймаут маловат.  Даже без оглядки на контроллер, а просто исходя из пропускной способности sdram. Ваш таймаут намекает на 100 fps, а это круто. У вас скорее всего меньше. Поставьте 100 мсек, медленнее работать не будет, да и вас, в случае чего, ожиданием не утомит. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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? Как то можно переделать библиотеку, чтобы использовать это преимущество для прироста скорости?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но вот у меня проц с double precision. Что дает этот double precision?


DP даёт больший допустимый диапазон чисел.

Как то можно переделать библиотеку, чтобы использовать это преимущество для прироста скорости?


DP не недостаток и не преимущество.
Т.е. вы не увидели, что, тупо, алгоритмическая оптимизация итальянцу не знакома... (из циклов неизменные фрагменты кто выносил? ;-) )

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, Obam сказал:

DP даёт больший допустимый диапазон чисел.

Не только. Ещё бОльшую точность.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Зачем жеж так, сразу-то все козыри...

PS: полагаю, сделав всё без "плавучки", ТС нам рассказывал бы про "истинную мощь" CM4F.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 часов назад, Salamander сказал:

Что дает этот double precision?

Ну почитайте про него)) Информация не секретная) Грубо: он позволяет аппаратно считать числа в формате double, это если смотреть с точки зрения Си. И делает это быстрее, чем программная реализация. Наличие сопроцессора одинарной точности никак не ускоряет операции с числами двойной точности. Это для справки.

8 часов назад, Salamander сказал:

Как то можно переделать библиотеку, чтобы использовать это преимущество для прироста скорости?

Как я понял, теперь вы можете взять его "оригинальную" библиотеку без литер f в конце чисел, и оно будет работать чуть быстрее, чем работало на CM4F. Но этого делать не надо, т.к. код всё равно там неоптимизированный. Я не знаю, что может дать double для вычисления графики... Я с ней сильно не работал, но предположу со своего делетантского взгляда, что всё можно сделать и в целых числах, а уж с ними полноценно работает всё, начиная с CM3.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 hours ago, Obam said:

Т.е. вы не увидели, что, тупо, алгоритмическая оптимизация итальянцу не знакома..

Как, не увидел?

Увидел. Ведь

9 hours ago, Obam said:

из циклов неизменные фрагменты кто выносил?

Я ведь их выносил.

 

А итальянец не дурак - он хитрец, на видео у него довольно-таки быстрый рендеринг. Значит библиотека, что он выложил, не последней версии. А нормальную он зажал

4 hours ago, MrBearManul said:

теперь вы можете взять его "оригинальную" библиотеку без литер f в конце чисел,

А зачем брать оригинальную, если

4 hours ago, MrBearManul said:

т.к. код всё равно там неоптимизированный.

А мой код оптимизированный - неизменяемые фрагменты из цикла убрал, с излишними вызовами функций разобрался.

Если я свою доработанную библиотеку возьму и уберу из нее f - будет толк?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 часа назад, Salamander сказал:

Если я свою доработанную библиотеку возьму и уберу из нее f - будет толк?

Сравните за сколько тактов занимают арифметические операции с разными типами данных на разных сопроцессорах. Я ответа не знаю, т.к. не работал с CM7F. Но в целом, зачем переходить на double? Вам разрешающей способности float не хватает?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А итальянец не дурак - он хитрец, на видео у него довольно-таки быстрый рендеринг.


Мало вам отечественных "пионэров". Ну нельзя настолько видеороликам доверять... Вы присказку про надпись на заборе знаете?... Вот-вот, а там дрова.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

29.01.2021 в 23:47, Obam сказал:

DP даёт больший допустимый диапазон чисел.

Чет тут столько хвалебных од этому DP, а что он дает в реальной задаче, например здесь? Тут реально требуется такая точность, что ее невозможно получить в SP? Или вся суть, что автор библиотеки понатыкал везде double вместо float, или каким-либо образом это не задефайнил, чтоб можно было легко переключить в любой режим? Так причем тут блок в МК - тут просто говнокод тогда и не более того...

Изменено пользователем mantech

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...