Skip to content

Commit 2010daa

Browse files
committed
hello_xr: Be sure to load extension functions with getInstanceProcAddr
1 parent 1ff5316 commit 2010daa

3 files changed

Lines changed: 34 additions & 8 deletions

File tree

src/tests/hello_xr/graphicsplugin_d3d11.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,9 +137,13 @@ struct D3D11GraphicsPlugin : public IGraphicsPlugin {
137137
std::vector<std::string> GetInstanceExtensions() const override { return {XR_KHR_D3D11_ENABLE_EXTENSION_NAME}; }
138138

139139
void InitializeDevice(XrInstance instance, XrSystemId systemId) override {
140+
PFN_xrGetD3D11GraphicsRequirementsKHR pfnGetD3D11GraphicsRequirementsKHR = nullptr;
141+
CHECK_XRCMD(xrGetInstanceProcAddr(instance, "xrGetD3D11GraphicsRequirementsKHR",
142+
reinterpret_cast<PFN_xrVoidFunction*>(&pfnGetD3D11GraphicsRequirementsKHR)));
143+
140144
// Create the D3D11 device for the adapter associated with the system.
141145
XrGraphicsRequirementsD3D11KHR graphicsRequirements{XR_TYPE_GRAPHICS_REQUIREMENTS_D3D11_KHR};
142-
CHECK_XRCMD(xrGetD3D11GraphicsRequirementsKHR(instance, systemId, &graphicsRequirements));
146+
CHECK_XRCMD(pfnGetD3D11GraphicsRequirementsKHR(instance, systemId, &graphicsRequirements));
143147
const ComPtr<IDXGIAdapter1> adapter = GetAdapter(graphicsRequirements.adapterLuid);
144148

145149
// Create a list of feature levels which are both supported by the OpenXR runtime and this application.

src/tests/hello_xr/graphicsplugin_opengl.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,13 @@ struct OpenGLGraphicsPlugin : public IGraphicsPlugin {
7878
}
7979

8080
void InitializeDevice(XrInstance instance, XrSystemId systemId) override {
81+
// Extension function must be loaded by name
82+
PFN_xrGetOpenGLGraphicsRequirementsKHR pfnGetOpenGLGraphicsRequirementsKHR = nullptr;
83+
CHECK_XRCMD(xrGetInstanceProcAddr(instance, "xrGetOpenGLGraphicsRequirementsKHR",
84+
reinterpret_cast<PFN_xrVoidFunction*>(&pfnGetOpenGLGraphicsRequirementsKHR)));
85+
8186
XrGraphicsRequirementsOpenGLKHR graphicsRequirements{XR_TYPE_GRAPHICS_REQUIREMENTS_OPENGL_KHR};
82-
CHECK_XRCMD(xrGetOpenGLGraphicsRequirementsKHR(instance, systemId, &graphicsRequirements));
87+
CHECK_XRCMD(pfnGetOpenGLGraphicsRequirementsKHR(instance, systemId, &graphicsRequirements));
8388

8489
// Initialize the gl extensions. Note we have to open a window.
8590
ksDriverInstance driverInstance{};

src/tests/hello_xr/graphicsplugin_vulkan.cpp

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1120,14 +1120,23 @@ struct VulkanGraphicsPlugin : public IGraphicsPlugin {
11201120

11211121
void InitializeDevice(XrInstance instance, XrSystemId systemId) override {
11221122
// Create the Vulkan device for the adapter associated with the system.
1123+
// Extension function must be loaded by name
1124+
PFN_xrGetVulkanGraphicsRequirementsKHR pfnGetVulkanGraphicsRequirementsKHR = nullptr;
1125+
CHECK_XRCMD(xrGetInstanceProcAddr(instance, "xrGetVulkanGraphicsRequirementsKHR",
1126+
reinterpret_cast<PFN_xrVoidFunction*>(&pfnGetVulkanGraphicsRequirementsKHR)));
1127+
1128+
PFN_xrGetVulkanInstanceExtensionsKHR pfnGetVulkanInstanceExtensionsKHR = nullptr;
1129+
CHECK_XRCMD(xrGetInstanceProcAddr(instance, "xrGetVulkanInstanceExtensionsKHR",
1130+
reinterpret_cast<PFN_xrVoidFunction*>(&pfnGetVulkanInstanceExtensionsKHR)));
1131+
11231132
XrGraphicsRequirementsVulkanKHR graphicsRequirements{XR_TYPE_GRAPHICS_REQUIREMENTS_VULKAN_KHR};
1124-
CHECK_XRCMD(xrGetVulkanGraphicsRequirementsKHR(instance, systemId, &graphicsRequirements));
1133+
CHECK_XRCMD(pfnGetVulkanGraphicsRequirementsKHR(instance, systemId, &graphicsRequirements));
11251134

11261135
uint32_t extensionNamesSize = 0;
1127-
CHECK_XRCMD(xrGetVulkanInstanceExtensionsKHR(instance, systemId, 0, &extensionNamesSize, nullptr));
1136+
CHECK_XRCMD(pfnGetVulkanInstanceExtensionsKHR(instance, systemId, 0, &extensionNamesSize, nullptr));
11281137
std::vector<char> extensionNames(extensionNamesSize);
11291138
CHECK_XRCMD(
1130-
xrGetVulkanInstanceExtensionsKHR(instance, systemId, extensionNamesSize, &extensionNamesSize, &extensionNames[0]));
1139+
pfnGetVulkanInstanceExtensionsKHR(instance, systemId, extensionNamesSize, &extensionNamesSize, &extensionNames[0]));
11311140

11321141
std::vector<const char*> extensions = ParseExtensionString(&extensionNames[0]);
11331142
extensions.push_back("VK_EXT_debug_report");
@@ -1167,7 +1176,11 @@ struct VulkanGraphicsPlugin : public IGraphicsPlugin {
11671176
debugInfo.pUserData = this;
11681177
CHECK_VKCMD(vkCreateDebugReportCallbackEXT(m_vkInstance, &debugInfo, nullptr, &m_vkDebugReporter));
11691178

1170-
CHECK_XRCMD(xrGetVulkanGraphicsDeviceKHR(instance, systemId, m_vkInstance, &m_vkPhysicalDevice));
1179+
PFN_xrGetVulkanGraphicsDeviceKHR pfnGetVulkanGraphicsDeviceKHR = nullptr;
1180+
CHECK_XRCMD(xrGetInstanceProcAddr(instance, "xrGetVulkanGraphicsDeviceKHR",
1181+
reinterpret_cast<PFN_xrVoidFunction*>(&pfnGetVulkanGraphicsDeviceKHR)));
1182+
1183+
CHECK_XRCMD(pfnGetVulkanGraphicsDeviceKHR(instance, systemId, m_vkInstance, &m_vkPhysicalDevice));
11711184

11721185
VkDeviceQueueCreateInfo queueInfo{VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO};
11731186
float queuePriorities = 0;
@@ -1187,10 +1200,14 @@ struct VulkanGraphicsPlugin : public IGraphicsPlugin {
11871200
}
11881201
}
11891202

1203+
PFN_xrGetVulkanDeviceExtensionsKHR pfnGetVulkanDeviceExtensionsKHR = nullptr;
1204+
CHECK_XRCMD(xrGetInstanceProcAddr(instance, "xrGetVulkanDeviceExtensionsKHR",
1205+
reinterpret_cast<PFN_xrVoidFunction*>(&pfnGetVulkanDeviceExtensionsKHR)));
1206+
11901207
uint32_t deviceExtensionNamesSize = 0;
1191-
CHECK_XRCMD(xrGetVulkanDeviceExtensionsKHR(instance, systemId, 0, &deviceExtensionNamesSize, nullptr));
1208+
CHECK_XRCMD(pfnGetVulkanDeviceExtensionsKHR(instance, systemId, 0, &deviceExtensionNamesSize, nullptr));
11921209
std::vector<char> deviceExtensionNames(deviceExtensionNamesSize);
1193-
CHECK_XRCMD(xrGetVulkanDeviceExtensionsKHR(instance, systemId, deviceExtensionNamesSize, &deviceExtensionNamesSize,
1210+
CHECK_XRCMD(pfnGetVulkanDeviceExtensionsKHR(instance, systemId, deviceExtensionNamesSize, &deviceExtensionNamesSize,
11941211
&deviceExtensionNames[0]));
11951212
std::vector<const char*> deviceExtensions = ParseExtensionString(&deviceExtensionNames[0]);
11961213

0 commit comments

Comments
 (0)