Попробовал собрать. Пришлось скорректировать инициализацию целых типов:
diff --git a/SamTFE/Sources/Engine/Graphics/Gfx_Vulkan.cpp b/SamTFE/Sources/Engine/Graphics/Gfx_Vulkan.cpp
index af0a1da..8aca18f 100755
--- a/SamTFE/Sources/Engine/Graphics/Gfx_Vulkan.cpp
+++ b/SamTFE/Sources/Engine/Graphics/Gfx_Vulkan.cpp
@@ -437,9 +437,9 @@ void SvkMain::Reset_Vulkan()
gl_VkPhFeatures = {};
gl_VkPhSurfCapabilities = {};
- gl_VkQueueFamGraphics = VK_NULL_HANDLE;
- gl_VkQueueFamTransfer = VK_NULL_HANDLE;
- gl_VkQueueFamPresent = VK_NULL_HANDLE;
+ gl_VkQueueFamGraphics = 0;
+ gl_VkQueueFamTransfer = 0;
+ gl_VkQueueFamPresent = 0;
gl_VkQueueGraphics = VK_NULL_HANDLE;
gl_VkQueueTransfer = VK_NULL_HANDLE;
gl_VkQueuePresent = VK_NULL_HANDLE;
Без ресурсов выдал сообщение, что не хватает файла. См. вложение. Скопировал ресурсы. Запускается.
Закомментировал оба вызова SDL_SetWindowBrightness.
Дальше меню игра не уходит, опять чего-то не хватает, см. второе вложение. Но дело не в этом. Не вижу изменений яркости. SDL ведь не знает, меню у меня, или я уже выбрал какой-то пункт. То есть меню должно быть ярче? Вот это не понятно.
Нашел, где выбирается формат поверхности. Вот код. CPrintF - это я добавил для отладки.
vkGetPhysicalDeviceSurfaceFormatsKHR(physDevice, gl_VkSurface, &formatsCount, &gl_VkPhSurfFormats[0]);
vkGetPhysicalDeviceSurfacePresentModesKHR(physDevice, gl_VkSurface, &presentModesCount, &gl_VkPhSurfPresentModes[0]);
// now select preferred settings
gl_VkSurfColorFormat = VK_FORMAT_UNDEFINED;
CPrintF("Vulkan: formatsCount: %d\n", formatsCount);
for (uint32_t j = 0; j < formatsCount; j++)
{
CPrintF("Vulkan: gl_VkPhSurfFormats.format: %d\n", gl_VkPhSurfFormats[j].format);
CPrintF("Vulkan: gl_VkPhSurfFormats.colorSpace: %d\n", gl_VkPhSurfFormats[j].colorSpace);
if (gl_VkPhSurfFormats[j].format == VK_FORMAT_R8G8B8A8_UNORM)
{
gl_VkSurfColorFormat = gl_VkPhSurfFormats[j].format;
gl_VkSurfColorSpace = gl_VkPhSurfFormats[j].colorSpace;
break;
}
}
CPrintF("Vulkan: gl_VkSurfColorFormat: %d\n", gl_VkSurfColorFormat);
///...
if (gl_VkSurfColorFormat == VK_FORMAT_UNDEFINED)
{
gl_VkSurfColorFormat = gl_VkPhSurfFormats[0].format;
gl_VkSurfColorSpace = gl_VkPhSurfFormats[0].colorSpace;
}
У меня выводит 2 формата: 44 и 50.
VK_FORMAT_B8G8R8A8_UNORM = 44,
VK_FORMAT_B8G8R8A8_SRGB = 50,
для каждого VK_COLOR_SPACE_SRGB_NONLINEAR_KHR
gl_VkSurfColorFormat, соответственно, остаётся 0. Далее для такого случая выбирается 0й элемент. Вулкан требует, что бы минимум один формат поддерживался. То есть такой вариант запасного случая выглядит разумно.
Потом вспомнил, что у меня используется
https://github.com/GPUOpen-Drivers/AMDVLKЗапустил с драйвером Mesa
$ AMD_VULKAN_ICD=RADV ./SeriousSam
Вот теперь цвета неестественны и ярки. В логе всё те же цифры, но в обратном порядке: 50 и 44. То есть выбирается VK_FORMAT_B8G8R8A8_SRGB.
Если же к проверке gl_VkPhSurfFormats[j].format == VK_FORMAT_R8G8B8A8_UNORM добавить VK_FORMAT_B8G8R8A8_UNORM, то цвета как и положено. Не знаю, какие ещё следует добавить форматы UNORM из
https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/VkFormat.htmlна всякий случай патч с исправлением и отлидочными вызовами.
diff --git a/SamTFE/Sources/Engine/Graphics/ViewPort.cpp b/SamTFE/Sources/Engine/Graphics/ViewPort.cpp
index 8cda71e..4bac5a0 100644
--- a/SamTFE/Sources/Engine/Graphics/ViewPort.cpp
+++ b/SamTFE/Sources/Engine/Graphics/ViewPort.cpp
@@ -231,7 +231,6 @@ void CViewPort::OpenCanvas(void)
_pGfx->gl_SvkMain->CreateSwapchain(0, 0); // SDL_Vulkan_GetDrawableSize in SvkSwapchain.cpp
CPrintF("Vulkan: Create Swapchain Done.\nVulkan: === Ready to Render ===\n");
extern __attribute__ ((visibility("default"))) SDL_Window * _hwndMain;
- int r = SDL_SetWindowBrightness(_hwndMain, 0.5f); // Brightness 0.0f - 1.0f // hack for normal Brightness
}
// is it required?
// if (_pGfx->gl_eCurrentAPI == GAT_VK ) SetAsRenderTarget_Vulkan(this);
@@ -319,7 +318,6 @@ void CViewPort::Resize(void)
_pGfx->gl_SvkMain->RecreateSwapchain(0, 0); // SDL_Vulkan_GetDrawableSize in SvkSwapchain.cpp
CPrintF("Vulkan: ReCreate Swapchain Done.\nVulkan: === Ready to Render ===\n");
extern __attribute__ ((visibility("default"))) SDL_Window * _hwndMain;
- int r = SDL_SetWindowBrightness(_hwndMain, 0.5f); // Brightness 0.0f - 1.0f // hack for normal Brightness
}
#endif // SE1_VULKAN
}
diff --git a/SamTFE/Sources/Engine/Graphics/Vulkan/SvkUtils.cpp b/SamTFE/Sources/Engine/Graphics/Vulkan/SvkUtils.cpp
index b3cea2d..0f7c36d 100755
--- a/SamTFE/Sources/Engine/Graphics/Vulkan/SvkUtils.cpp
+++ b/SamTFE/Sources/Engine/Graphics/Vulkan/SvkUtils.cpp
@@ -347,6 +347,8 @@ BOOL SvkMain::PickPhysicalDevice()
VK_CHECKERROR(r)
ASSERT(physDeviceCount > 0);
+ CPrintF("Vulkan: Physical Devices Count: %d\n", physDeviceCount);
+
for (uint32_t i = 0; i < physDeviceCount; i++)
{
VkPhysicalDevice physDevice = physDevices[i];
@@ -385,9 +387,15 @@ BOOL SvkMain::PickPhysicalDevice()
// now select preferred settings
gl_VkSurfColorFormat = VK_FORMAT_UNDEFINED;
+ CPrintF("Vulkan: formatsCount: %d\n", formatsCount);
+
for (uint32_t j = 0; j < formatsCount; j++)
{
- if (gl_VkPhSurfFormats[j].format == VK_FORMAT_R8G8B8A8_UNORM)
+ CPrintF("Vulkan: gl_VkPhSurfFormats.format: %d\n", gl_VkPhSurfFormats[j].format);
+ CPrintF("Vulkan: gl_VkPhSurfFormats.colorSpace: %d\n", gl_VkPhSurfFormats[j].colorSpace);
+
+ if (gl_VkPhSurfFormats[j].format == VK_FORMAT_R8G8B8A8_UNORM ||
+ gl_VkPhSurfFormats[j].format == VK_FORMAT_B8G8R8A8_UNORM)
{
gl_VkSurfColorFormat = gl_VkPhSurfFormats[j].format;
gl_VkSurfColorSpace = gl_VkPhSurfFormats[j].colorSpace;
@@ -395,6 +403,8 @@ BOOL SvkMain::PickPhysicalDevice()
}
}
+ CPrintF("Vulkan: gl_VkSurfColorFormat: %d\n", gl_VkSurfColorFormat);
+
extern INDEX gfx_vk_iPresentMode;
VkPresentModeKHR preferredPresentMode;