| 1188 | //----------------------KHR DISPLAY-------------------------- |
| 1189 | #ifdef VK_USE_PLATFORM_DISPLAY_KHR |
| 1190 | static VkSurfaceKHR AppCreateDisplaySurface(AppInstance &inst, VkPhysicalDevice phys_device) { |
| 1191 | auto all_display_props = GetVector<VkDisplayPropertiesKHR>("vkGetPhysicalDeviceDisplayPropertiesKHR", |
| 1192 | vkGetPhysicalDeviceDisplayPropertiesKHR, phys_device); |
| 1193 | if (all_display_props.size() == 0) return VK_NULL_HANDLE; |
| 1194 | |
| 1195 | auto all_plane_props = GetVector<VkDisplayPlanePropertiesKHR>("vkGetPhysicalDeviceDisplayPlanePropertiesKHR", |
| 1196 | vkGetPhysicalDeviceDisplayPlanePropertiesKHR, phys_device); |
| 1197 | if (all_plane_props.size() == 0) THROW_VK_ERR("No display plane properties for physical device.", VK_ERROR_UNKNOWN); |
| 1198 | |
| 1199 | // Always use the first plane |
| 1200 | const uint32_t plane_index = 0; |
| 1201 | const auto &plane_props = all_plane_props[plane_index]; |
| 1202 | |
| 1203 | auto supported_displays = GetVector<VkDisplayKHR>("vkGetDisplayPlaneSupportedDisplaysKHR", |
| 1204 | vkGetDisplayPlaneSupportedDisplaysKHR, phys_device, plane_index); |
| 1205 | if (supported_displays.size() == 0) THROW_VK_ERR("No display supported by the display plane.", VK_ERROR_UNKNOWN); |
| 1206 | |
| 1207 | const VkDisplayKHR display = plane_props.currentDisplay != VK_NULL_HANDLE ? plane_props.currentDisplay : supported_displays[0]; |
| 1208 | |
| 1209 | auto all_mode_props = |
| 1210 | GetVector<VkDisplayModePropertiesKHR>("vkGetDisplayModePropertiesKHR", vkGetDisplayModePropertiesKHR, phys_device, display); |
| 1211 | if (all_mode_props.size() == 0) THROW_VK_ERR("No display modes reported for display.", VK_ERROR_UNKNOWN); |
| 1212 | |
| 1213 | const auto &mode_props = all_mode_props[0]; |
| 1214 | const VkDisplayModeKHR mode = mode_props.displayMode; |
| 1215 | |
| 1216 | VkDisplayPlaneCapabilitiesKHR plane_caps{}; |
| 1217 | VkResult result = vkGetDisplayPlaneCapabilitiesKHR(phys_device, mode, plane_index, &plane_caps); |
| 1218 | if (result != VK_SUCCESS) THROW_VK_ERR("vkGetDisplayPlaneCapabilitiesKHR", result); |
| 1219 | |
| 1220 | VkDisplaySurfaceCreateInfoKHR createInfo; |
| 1221 | createInfo.sType = VK_STRUCTURE_TYPE_DISPLAY_SURFACE_CREATE_INFO_KHR; |
| 1222 | createInfo.pNext = NULL; |
| 1223 | createInfo.flags = 0; |
| 1224 | createInfo.displayMode = mode; |
| 1225 | createInfo.planeIndex = plane_index; |
| 1226 | createInfo.planeStackIndex = plane_props.currentStackIndex; |
| 1227 | createInfo.transform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR; |
| 1228 | createInfo.globalAlpha = 1.0f; |
| 1229 | for (uint32_t i = 0; i < 32; ++i) { |
| 1230 | if ((plane_caps.supportedAlpha & (1 << i)) != 0) { |
| 1231 | createInfo.alphaMode = static_cast<VkDisplayPlaneAlphaFlagBitsKHR>(1 << i); |
| 1232 | break; |
| 1233 | } |
| 1234 | } |
| 1235 | createInfo.imageExtent = mode_props.parameters.visibleRegion; |
| 1236 | |
| 1237 | VkSurfaceKHR surface; |
| 1238 | VkResult err = vkCreateDisplayPlaneSurfaceKHR(inst.instance, &createInfo, NULL, &surface); |
| 1239 | if (err) THROW_VK_ERR("vkCreateDisplayPlaneSurfaceKHR", err); |
| 1240 | return surface; |
| 1241 | } |
| 1242 | #endif // VK_USE_PLATFORM_DISPLAY_KHR |
| 1243 | |
| 1244 | //----------------------------------------------------------- |
nothing calls this directly
no test coverage detected