[VULKAN]4. Window Surface

2023. 1. 17. 22:45개발얘기/vulkan

 

 

어제 레데리2 깨느라 새벽 3시에 잤다.

졸음을 참고

오늘 다시 진도를 나간다.. 


오늘은 window surface를 다룬다.

이제 Vulkan 드라이버를 로더로 불러 와서 무언가는 이제 그릴 수 있다.

근데 그 무언가를 어디에 그리는지를 설정해야 한다.

WSI(Window System Integration)

Vulkan은 플랫폼에 구애받지 않는 API이기 때문에 자체적으로 윈도우 시스템과 직접 인터페이스 할 수 없다. 

Vulkan과 윈도우 간의 연결을 설정하려면 WSI 확장판을 사용해야 한다. WSI는 Linux, MS Windows, Android와 같은 다양한 플랫폼에서 프레젠테이션 계층을 통합하기 위한 크로노스 그룹의 확장판 세트이다. WSI는 디스플레이와 응요 프로그램 간의 인터페이스로서 작동하는데, 디스플레이와 응용프로그램이 서로 배타적으로 서로 다른 이미지를 할당받게 하는 방식이다. 

 

창 표면은 실제로 물리적 장치 선택에 영향을 줄 수 있으므로 Instance 생성 직후에 생성해야 한다. 

일부 WSI 확장판은 모든 플랫폼에 유효하지만, 다른 확장은 지정된 실행 환경에만 적용된다. 크로노스 로더는 현재 환경에 적합한 WSI 확장판만 활성화하고 직접 내보낸다. 대부분의 경우 그 선택은 컴파일시 전처리기에 의해 수행된다.

 

다음은 OS별 WSI 확장이다.


VkSurface은 네이티브 플랫폼의 윈도우/화면 매커니즘을 추상화한다. 플랫폼에 구애받지 않지만 생성할 땐 창의 세부정보에 따라 달라지기 전에 구분해야 한다. 기본 플랫폼 기능에 액세스하여 생성 설정값을 채운다. 

 

glfw의 가이드 문서 : https://www.glfw.org/docs/3.3/vulkan_guide.html

 

다음은 window환경 설정이다. 

VkWin32SurfaceCreateInfoKHR createInfo{};
createInfo.sType = VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR;
createInfo.hwnd = glfwGetWin32Window(window);
createInfo.hinstance = GetModuleHandle(nullptr);

- glfwGetWIn32Window(window)로 GLFW 윈도우 객체에서 핸들을 가져온다. 

- getModuleHandle 로 현재 프로세스의 핸들을 가져온다.

 

다음 함수로 표면 객체를 생성한다.

if (vkCreateWin32SurfaceKHR(instance, &createInfo, nullptr, &surface) != VK_SUCCESS) {
    throw std::runtime_error("failed to create window surface!");
}

WSI 확장판 쿼리하기

윈도우 시스템의 모든 장치가 vulkan을 지원하지 않을 수도 있다. 생성된 추상화면 객체를 사용하고 프레젠테이션을 지원할 수 있는 그래픽스 큐를 검색하기 위해 다음 함수를 사용한다.

VkResult vkGetPhysicalDeviceSurfaceSupportKHR(
    VkPhysicalDevice                            physicalDevice,
    uint32_t                                    queueFamilyIndex,
    VkSurfaceKHR                                surface,
    VkBool32*                                   pSupported);

 

pSupported로 지원하는지 여부를 확인하고 queueFamilyIndecx를 저장해 추후에 화면 속성을 쿼리하고 이 큐의 논리개체를 만드는데 사용한다.

 

이외에도 쿼리 함수가 몇개 더있지만 다음의 스왑체인 장에서 다뤄본다.


https://github.com/KhronosGroup/Vulkan-Loader/blob/master/docs/LoaderApplicationInterface.md#wsi-extensions 

처음 만나는 vulkan - 파르민더 싱

'개발얘기 > vulkan' 카테고리의 다른 글

[VULKAN] 3. Device 초기화  (0) 2023.01.16
[VULKAN] 2. Instance 초기화  (2) 2023.01.10
[VULKAN] 1. GLFW 초기화  (0) 2023.01.09
[VULKAN] 0. 시작하기  (2) 2023.01.08