NativeWindowSdl.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. // Copyright (C) 2009-2023, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #include <AnKi/Core/NativeWindowSdl.h>
  6. #include <AnKi/Util/Logger.h>
  7. #if ANKI_GR_BACKEND_VULKAN
  8. # include <SDL_vulkan.h>
  9. #endif
  10. namespace anki {
  11. Error NativeWindow::newInstance(const NativeWindowInitInfo& initInfo, NativeWindow*& nativeWindow)
  12. {
  13. NativeWindowSdl* sdlwin = static_cast<NativeWindowSdl*>(initInfo.m_allocCallback(
  14. initInfo.m_allocCallbackUserData, nullptr, sizeof(NativeWindowSdl), alignof(NativeWindowSdl)));
  15. callConstructor(*sdlwin);
  16. const Error err = sdlwin->init(initInfo);
  17. if(err)
  18. {
  19. callDestructor(*sdlwin);
  20. initInfo.m_allocCallback(initInfo.m_allocCallbackUserData, sdlwin, 0, 0);
  21. nativeWindow = nullptr;
  22. return err;
  23. }
  24. else
  25. {
  26. nativeWindow = sdlwin;
  27. return Error::kNone;
  28. }
  29. }
  30. void NativeWindow::deleteInstance(NativeWindow* window)
  31. {
  32. if(window)
  33. {
  34. NativeWindowSdl* self = static_cast<NativeWindowSdl*>(window);
  35. AllocAlignedCallback callback = self->m_pool.getAllocationCallback();
  36. void* userData = self->m_pool.getAllocationCallbackUserData();
  37. callDestructor(*self);
  38. callback(userData, self, 0, 0);
  39. }
  40. }
  41. void NativeWindow::setWindowTitle(CString title)
  42. {
  43. NativeWindowSdl* self = static_cast<NativeWindowSdl*>(this);
  44. SDL_SetWindowTitle(self->m_window, title.cstr());
  45. }
  46. NativeWindowSdl::~NativeWindowSdl()
  47. {
  48. if(m_window)
  49. {
  50. SDL_DestroyWindow(m_window);
  51. }
  52. SDL_QuitSubSystem(kInitSubsystems);
  53. SDL_Quit();
  54. }
  55. Error NativeWindowSdl::init(const NativeWindowInitInfo& init)
  56. {
  57. m_pool.init(init.m_allocCallback, init.m_allocCallbackUserData);
  58. if(SDL_Init(kInitSubsystems) != 0)
  59. {
  60. ANKI_CORE_LOGE("SDL_Init() failed: %s", SDL_GetError());
  61. return Error::kFunctionFailed;
  62. }
  63. #if ANKI_GR_BACKEND_VULKAN
  64. if(SDL_Vulkan_LoadLibrary(nullptr))
  65. {
  66. ANKI_CORE_LOGE("SDL_Vulkan_LoadLibrary() failed: %s", SDL_GetError());
  67. return Error::kFunctionFailed;
  68. }
  69. #endif
  70. //
  71. // Set GL attributes
  72. //
  73. ANKI_CORE_LOGI("Creating SDL window. SDL version %u.%u", SDL_MAJOR_VERSION, SDL_MINOR_VERSION);
  74. //
  75. // Create window
  76. //
  77. U32 flags = 0;
  78. #if ANKI_GR_BACKEND_GL
  79. flags |= SDL_WINDOW_OPENGL;
  80. #elif ANKI_GR_BACKEND_VULKAN
  81. flags |= SDL_WINDOW_VULKAN;
  82. #endif
  83. SDL_SetHint(SDL_HINT_ALLOW_TOPMOST, "0");
  84. if(init.m_fullscreenDesktopRez)
  85. {
  86. #if ANKI_OS_WINDOWS
  87. if(init.m_exclusiveFullscreen)
  88. {
  89. flags |= SDL_WINDOW_FULLSCREEN_DESKTOP;
  90. }
  91. #elif ANKI_OS_LINUX
  92. flags |= SDL_WINDOW_FULLSCREEN_DESKTOP;
  93. #else
  94. # error See file
  95. #endif
  96. // Alter the window size
  97. SDL_DisplayMode mode;
  98. if(SDL_GetDesktopDisplayMode(0, &mode))
  99. {
  100. ANKI_CORE_LOGE("SDL_GetDesktopDisplayMode() failed: %s", SDL_GetError());
  101. return Error::kFunctionFailed;
  102. }
  103. m_width = mode.w;
  104. m_height = mode.h;
  105. }
  106. else
  107. {
  108. m_width = init.m_width;
  109. m_height = init.m_height;
  110. }
  111. m_window =
  112. SDL_CreateWindow(&init.m_title[0], SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, m_width, m_height, flags);
  113. if(m_window == nullptr)
  114. {
  115. ANKI_CORE_LOGE("SDL_CreateWindow() failed");
  116. return Error::kFunctionFailed;
  117. }
  118. // Final check
  119. {
  120. int w, h;
  121. SDL_GetWindowSize(m_window, &w, &h);
  122. ANKI_ASSERT(m_width == U32(w) && m_height == U32(h));
  123. }
  124. ANKI_CORE_LOGI("SDL window created");
  125. return Error::kNone;
  126. }
  127. } // end namespace anki