Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

raspberry pi #3

Closed
xboxones1 opened this issue Jun 2, 2022 · 16 comments
Closed

raspberry pi #3

xboxones1 opened this issue Jun 2, 2022 · 16 comments

Comments

@xboxones1
Copy link

Предложенный патч для raspberry pi никак не повлиял на сборку кода, ошибка в Timer.cpp. Попробовал заменить из репы ptitSeb, версия без вулкана собралась и работает, а вот версия с вулканом собралась, но не работает, ошибка сегментирования.

Running Run Serious Sam TFE Classic (Lock 60fps)
STUBBED: load window icon in /home/user/SeriousSamClassic-VK/SamTFE/Sources/SeriousSam/MainWindow.cpp, line 172.
STUBBED: Need SDL invisible window or something in /home/user/SeriousSamClassic-VK/SamTFE/Sources/SeriousSam/MainWindow.cpp, line 353.
STUBBED: !!! FIXME: get the code back in from Ryan's original port. in /home/user/SeriousSamClassic-VK/SamTFE/Sources/Engine/Base/Stream.cpp, line 928.
STUBBED: Report actual SDL device name? in /home/user/SeriousSamClassic-VK/SamTFE/Sources/Engine/Sound/SoundLibrary.cpp, line 269.
STUBBED: co-opt the existing T-buffer support for multisampling? in /home/user/SeriousSamClassic-VK/SamTFE/Sources/Engine/Graphics/SDL/SDLOpenGL.cpp, line 113.
./run_game.sh: строка 13: 23434 Ошибка сегментирования                   "./SeriousSam"
@tx00100xt
Copy link
Owner

tx00100xt commented Jun 2, 2022

Желательно взглянуть на лог сборки с патчем где-нибудь на pastebin.
И на лог игры при старте игры с vulkan, он тут: .local/share/Serious Engine/serioussam/SeriousSam.log
И желательно запустить с gdb, будет видно где происходит сегфолт.
Информации из консоли явно недостаточно.

@tx00100xt
Copy link
Owner

Чтобы не использовать Timer.cpp из ptitSeb вот патч. (вложение rpi4.patch.txt). Если с ним соберется то сделаю commit.
Понять что не так с первым патчем можно только увидел лог сборки. Не забываем указывать -DRPI4=TRUE при сборке

@xboxones1
Copy link
Author

xboxones1 commented Jun 2, 2022

Нет с этим патчем тоже не собирается. Лог сборки где-то сохраняется? (Пробовал выводить в файл, но там минимум информации)
При сборке скопировал:

[ 46%] Building CXX object CMakeFiles/Engine.dir/Engine/Base/Timer.cpp.o
/home/user/SeriousSamClassic-VK/SamTFE/Sources/Engine/Base/Timer.cpp:97:4: error: #error Please implement for your platform/compiler.
   97 |   #error Please implement for your platform/compiler.
      |    ^~~~~
/home/user/SeriousSamClassic-VK/SamTFE/Sources/Engine/Base/Timer.cpp:146:6: error: #error "Unsupported compiler"
  146 | #    error "Unsupported compiler"
      |      ^~~~~
[ 47%] Building CXX object CMakeFiles/Entities.dir/Entities/Pendulum.cpp.o
/home/user/SeriousSamClassic-VK/SamTFE/Sources/Engine/Base/Timer.cpp: In function ‘__int64 ReadTSC()’:
/home/user/SeriousSamClassic-VK/SamTFE/Sources/Engine/Base/Timer.cpp:99:1: warning: no return statement in function returning non-void [-Wreturn-type]
   99 | }
      | ^
[ 47%] Building CXX object CMakeFiles/Entities.dir/Entities/Pipebomb.cpp.o
make[2]: *** [CMakeFiles/Engine.dir/build.make:539: CMakeFiles/Engine.dir/Engine/Base/Timer.cpp.o] Ошибка 1
make[2]: *** Ожидание завершения заданий…
[ 47%] Building CXX object CMakeFiles/Entities.dir/Entities/PlayerActionMarker.cpp.o
make[1]: *** [CMakeFiles/Makefile2:261: CMakeFiles/Engine.dir/all] Ошибка 2
make[1]: *** Ожидание завершения заданий…


@tx00100xt
Copy link
Owner

tx00100xt commented Jun 2, 2022

97 | #error Please implement for your platform/compiler.
146 | # error "Unsupported compiler"

Значит не сработал ключ -DRPI4=TRUE,
Патчи то сделал, а место для второй переменной в build-linux64.sh забыл добавить.
Надо в build-linux64.sh строчку:

cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo .. $1

заменить на

cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo .. $1 $2

и попробовать собрать с первым патчем а потом со вторым.

@xboxones1
Copy link
Author

С первым патчем ошибка:

/home/user/SeriousSamClassic-VK/SamTFE/Sources/Engine/Base/Timer.cpp: In function ‘void cpu_rdtsc(uint64_t*)’:
/home/user/SeriousSamClassic-VK/SamTFE/Sources/Engine/Base/Timer.cpp:164:25: error: ‘сс’ was not declared in this scope
  164 |     *result = (uint64_t)сс;
      |                         ^~
make[2]: *** [CMakeFiles/Engine.dir/build.make:539: CMakeFiles/Engine.dir/Engine/Base/Timer.cpp.o] Ошибка 1
make[2]: *** Ожидание завершения заданий…
[ 46%] Building CXX object CMakeFiles/Entities.dir/Entities/ModelHolder.cpp.o
[ 46%] Building CXX object CMakeFiles/Entities.dir/Entities/MovingBrush.cpp.o
make[1]: *** [CMakeFiles/Makefile2:261: CMakeFiles/Engine.dir/all] Ошибка 2
make[1]: *** Ожидание завершения заданий…

Он скорее всего актуален для armhf.

Со вторым собралось без проблем, но опять же вываливается в Ошибку сегментирования

@tx00100xt
Copy link
Owner

tx00100xt commented Jun 2, 2022

Лучше бы конечно с первым патчем.
Компилятор ругается что "cc" вне зоне видимости

А сегфолт происходит, потому что vulkan не запускается, и идет попытка запуска в режиме OpenGL
с неправильным созданием окна для OpenGL

Vulkan: Suitable physical device is present.
Vulkan error: Can't create VkDevice.
Vulkan error: Init Driver Vulkan Error!
Нельзя установить требуемый режим дисплея!

Trying recovery mode 0...
Starting display mode: 640x480xdesktop (Оконный режим)
Multimonitor is not supported on this platform.
SDL: CreateWindow with flag (SDL_WINDOW_VULKAN) Done.
OpenGL context creation: The specified window isn't an OpenGL window

Это я профиксирую, а вот почему не создаётся VkDevice, это уже другой вопрос

@tx00100xt
Copy link
Owner

tx00100xt commented Jun 2, 2022

С первым патчем ошибка:

Ясно - сс написано по русски :). Я подсветил синтаксис и увидел что все сс на английском а

*result = (uint64_t)сс;

на русском. Да и такое бывает.
То есть надо просто прописать в этом месте точно английские сс, и попробовать снова

Сегфолт должен исчезнуть f0f520d

@xboxones1
Copy link
Author

[ 41%] Building CXX object CMakeFiles/Entities.dir/Entities/Fishman.cpp.o
{стандартный ввод}: Сообщения ассемблера:
{стандартный ввод}:106: Ошибка: неизвестная мнемоника «mcr» — «mcr p15,0,x2,c9,c12,2»
{стандартный ввод}:113: Ошибка: неизвестная мнемоника «mcr» — «mcr p15,0,x3,c9,c12,0»
{стандартный ввод}:117: Ошибка: неизвестная мнемоника «mcr» — «mcr p15,0,x2,c9,c12,1»
{стандартный ввод}:128: Ошибка: неизвестная мнемоника «mrc» — «mrc p15,0,x1,c9,c13,0»
{стандартный ввод}:1003: Ошибка: неизвестная мнемоника «mcr» — «mcr p15,0,x1,c9,c12,2»
{стандартный ввод}:1010: Ошибка: неизвестная мнемоника «mcr» — «mcr p15,0,x2,c9,c12,0»
{стандартный ввод}:1014: Ошибка: неизвестная мнемоника «mcr» — «mcr p15,0,x1,c9,c12,1»
{стандартный ввод}:1025: Ошибка: неизвестная мнемоника «mrc» — «mrc p15,0,x0,c9,c13,0»
/home/user/SeriousSamClassic-VK/SamTFE/Sources/Engine/Base/Stream.cpp: In member function ‘virtual void CTFileStream::Read_t(void*, SLONG)’:
/home/user/SeriousSamClassic-VK/SamTFE/Sources/Engine/Base/Stream.cpp:1040:8: warning: ignoring return value of ‘size_t fread(void*, size_t, size_t, FILE*)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
 1040 |   fread(pvBuffer, slSize, 1, fstrm_pFile);
      |   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
make[2]: *** [CMakeFiles/Engine.dir/build.make:539: CMakeFiles/Engine.dir/Engine/Base/Timer.cpp.o] Ошибка 1
make[2]: *** Ожидание завершения заданий…

@tx00100xt
Copy link
Owner

tx00100xt commented Jun 2, 2022

Понятно, тогда добавлю второй патч следующим коммитом.
Готово c8b8907 tx00100xt/SeriousSamClassic@f4e66dc

@xboxones1
Copy link
Author

Да, теперь запускается, но на vulkan не переключается.

@tx00100xt
Copy link
Owner

Ошибка в логе

Vulkan error: Init Driver Vulkan Error!
Нельзя установить требуемый режим дисплея!

вот здесь стопорится vkCreateDevice

Для того чтобы было больше информации нужно собрать с SVK_ENABLE_VALIDATION 1 и посмотреть что в логе игры.
Проще сделать так, в файле SamTFE/Sources/Engine/Graphics/Gfx_Vulkan.cpp заменить

#ifndef NDEBUG
#define SVK_ENABLE_VALIDATION 1
#else
#define SVK_ENABLE_VALIDATION 0
#endif // !NDEBUG

на

#ifndef NDEBUG
#define SVK_ENABLE_VALIDATION 1
#else
#define SVK_ENABLE_VALIDATION 1
#endif // !NDEBUG

Пересобрать, запустить игру, а здесь прикрепить лог игры.

@tx00100xt
Copy link
Owner

tx00100xt commented Jun 2, 2022

Вроде ничего нового.

Новое есть. Уже тут ошибка

Vulkan error: Can't create instance.

Что раньше, чем vkCreateDevice.

Vulkan Validation layer: loader_validate_layers: Layer 2 does not exist in the list of available layers

надо строчку

gl_VkLayers[2] = "VK_LAYER_MANGOHUD_overlay";

в Gfx_Vulkan.cpp закомментировать при SVK_ENABLE_VALIDATION 1, и

gl_VkLayers.New(3);

на пару строк вверху заменить на

gl_VkLayers.New(2);

тогда не должно обрываться на создании vkCreateInstance.

Я добавил код для вывода ошибки при вызове vkCreateDevice f92e991
Теперь в логе игры должна прописаться возвращаемая ошибка.
И убрал VK_LAYER_MANGOHUD_overlay из validation layers 95c69ce
Можно пересобрать и посмотреть на результат, Вывод с SVK_ENABLE_VALIDATION 1 должен по идее быть информативным. Потом выставить SVK_ENABLE_VALIDATION 0 и посмотреть что выдаст в лог vkCreateDevice
Если будет видна возвращаемая ошибка https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCreateDevice.html то от этого уже можно будет отталкиваться.

@tx00100xt
Copy link
Owner

Из vulkan.txt видно, что установлены два драйвера

driverName = llvmpipe
driverName = V3DV Mesa

У меня тоже установлено два драйвера RADV и AMDVLK.
Я могу запустить SeriousSam с любым из них.
$ VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/radeon_icd.x86_64.json
(RADV)
или
$ VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/amd_icd64.json
(AMDVLK)
С обоими драйверами SeriousSam работает одинаково хорошо. В новой версии драйвера еще проще

AMD_VULKAN_ICD=RADV или AMD_VULKAN_ICD=AMDVLK

Посмотреть какой драйвер запускается по дефолту можно просто
$ VK_INSTANCE_LAYERS=VK_LAYER_MESA_overlay vkcube
Mesa overlay покажет информацию.

Далее смотрим vulkan.txt и видим

Device Extensions: count = 67

для llvmpipe

Device Extensions: count = 44

для V3DV Mesa

Смотрим VALIDATION.0.log или VALIDATION.1.log

Vulkan: --- found 44 device extensions ---

Делаем вывод что выбрался V3DV Mesa

Смотрим ошибку VkCreateDevice в VALIDATION.0.log или VALIDATION.1.log

Vulkan error: VK_ERROR_FEATURE_NOT_PRESENT!

https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCreateDevice.html#_description

If any requested feature is not supported, vkCreateDevice must return VK_ERROR_FEATURE_NOT_PRESENT
Support for features can be checked by querying vkGetPhysicalDeviceFeatures.

Смотрим SvkUtils.cpp, BOOL SvkMain::PickPhysicalDevice()
Видим вызов vkGetPhysicalDeviceFeatures(physDevice, &gl_VkPhFeatures);
Устройств два, VALIDATION.0.log

Vulkan: Physical Devices Count: 2

Потом видим что глобальная структура gl_VkPhFeatures не используется в Gfx_Vulkan.cpp vkCreateDevice
а видим фиксированные

VkPhysicalDeviceFeatures features = {};
features.samplerAnisotropy = VK_TRUE;
features.depthBounds = VK_TRUE;

createInfo.pEnabledFeatures = &features;

Смотрим опять vulkan.txt
для llvmpipe

VkPhysicalDeviceFeatures:
samplerAnisotropy = true
depthBounds = false

для V3DV Mesa

VkPhysicalDeviceFeatures:
samplerAnisotropy = true
depthBounds = false

Решение:
Первое(универсальное) - создать структуру VkDeviceCreateInfo createInfo с использованием gl_VkPhFeatures, тут следует учесть количество Device, и немного переписать код.
Второе - прописать VkPhysicalDeviceFeatures для Rsperry Pi из vulkaminfo для V3DV.

Первый вариант я сделаю попозже, когда появиться время. Патч для второго варианта приложен.
Думаю теперь vkCreateDevice отработает корректно.
rpi4_vilkan_features.patch.txt

@xboxones1
Copy link
Author

xboxones1 commented Jun 5, 2022

Vulkan заработал, но производительноть к сожалению хуже чем на OpenGL. Я думал будет наоборот куда веселее, но в любом случае круто.

@tx00100xt
Copy link
Owner

По разному бывает. Конкретно у меня на встройке Vega7 на windows тоже медленней, а на linux одинаково, что vulkan - что opengl. А кто-то в теме linux.org.ru написал что на rx580 vulkan у него гораздо быстрей чем opengl на SeriousSam.

Я пока не буду закрывать issue, когда доделаю нормальное определение VkPhysicalDeviceFeatures - закрою

@tx00100xt
Copy link
Owner

Готово, сделал универсальный вариант 40bfc9a

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants