1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
|
/********************************************************************************/ /**
\file OVR_CAPI_Vk.h
\brief Vulkan specific structures used by the CAPI interface.
\copyright Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved.
************************************************************************************/
#ifndef OVR_CAPI_Vk_h
#define OVR_CAPI_Vk_h
#include "OVR_CAPI.h"
#include "OVR_Version.h"
#if !defined(OVR_EXPORTING_CAPI)
//-----------------------------------------------------------------------------------
// ***** Vulkan Specific
/// Get a list of Vulkan vkInstance extensions required for VR.
///
/// Returns a list of strings delimited by a single space identifying Vulkan extensions that must
/// be enabled in order for the VR runtime to support Vulkan-based applications. The returned
/// list reflects the current runtime version and the GPU the VR system is currently connected to.
///
/// \param[in] luid Specifies the luid for the relevant GPU, which is returned from ovr_Create.
/// \param[in] extensionNames is a character buffer which will receive a list of extension name
/// strings, separated by a single space char between each extension.
/// \param[in] inoutExtensionNamesSize indicates on input the capacity of extensionNames in chars.
/// On output it returns the number of characters written to extensionNames,
/// including the terminating 0 char. In the case of this function returning
/// ovrError_InsufficientArraySize, the required inoutExtensionNamesSize is returned.
///
/// \return Returns an ovrResult indicating success or failure. In the case of failure, use
/// ovr_GetLastErrorInfo to get more information. Returns ovrError_InsufficientArraySize in
/// the case that inoutExtensionNameSize didn't have enough space, in which case
/// inoutExtensionNameSize will return the required inoutExtensionNamesSize.
///
/// <b>Example code</b>
/// \code{.cpp}
/// char extensionNames[4096];
/// uint32_t extensionNamesSize = sizeof(extensionNames);
/// ovr_GetInstanceExtensionsVk(luid, extensionsnames, &extensionNamesSize);
///
/// uint32_t extensionCount = 0;
/// const char* extensionNamePtrs[256];
/// for(const char* p = extensionNames; *p; ++p) {
/// if((p == extensionNames) || (p[-1] == ' ')) {
/// extensionNamePtrs[extensionCount++] = p;
/// if (p[-1] == ' ')
/// p[-1] = '\0';
/// }
/// }
///
/// VkInstanceCreateInfo info = { ... };
/// info.enabledExtensionCount = extensionCount;
/// info.ppEnabledExtensionNames = extensionNamePtrs;
/// [...]
/// \endcode
///
OVR_PUBLIC_FUNCTION(ovrResult)
ovr_GetInstanceExtensionsVk(
ovrGraphicsLuid luid,
char* extensionNames,
uint32_t* inoutExtensionNamesSize);
/// Get a list of Vulkan vkDevice extensions required for VR.
///
/// Returns a list of strings delimited by a single space identifying Vulkan extensions that must
/// be enabled in order for the VR runtime to support Vulkan-based applications. The returned
/// list reflects the current runtime version and the GPU the VR system is currently connected to.
///
/// \param[in] luid Specifies the luid for the relevant GPU, which is returned from ovr_Create.
/// \param[in] extensionNames is a character buffer which will receive a list of extension name
/// strings, separated by a single space char between each extension.
/// \param[in] inoutExtensionNamesSize indicates on input the capacity of extensionNames in chars.
/// On output it returns the number of characters written to extensionNames,
/// including the terminating 0 char. In the case of this function returning
/// ovrError_InsufficientArraySize, the required inoutExtensionNamesSize is returned.
///
/// \return Returns an ovrResult indicating success or failure. In the case of failure, use
/// ovr_GetLastErrorInfo to get more information. Returns ovrError_InsufficientArraySize in
/// the case that inoutExtensionNameSize didn't have enough space, in which case
/// inoutExtensionNameSize will return the required inoutExtensionNamesSize.
///
OVR_PUBLIC_FUNCTION(ovrResult)
ovr_GetDeviceExtensionsVk(
ovrGraphicsLuid luid,
char* extensionNames,
uint32_t* inoutExtensionNamesSize);
/// Find VkPhysicalDevice matching ovrGraphicsLuid
///
/// \param[in] session Specifies an ovrSession previously returned by ovr_Create.
/// \param[in] luid Specifies the luid returned from ovr_Create.
/// \param[in] instance Specifies a VkInstance to search for matching luids in.
/// \param[out] out_physicalDevice Returns the VkPhysicalDevice matching the instance and luid.
///
/// \return Returns an ovrResult indicating success or failure. In the case of failure, use
/// ovr_GetLastErrorInfo to get more information.
///
/// \note This function enumerates the current physical devices and returns the one matching the
/// luid. It must be called at least once prior to any ovr_CreateTextureSwapChainVk or
/// ovr_CreateMirrorTextureWithOptionsVk calls, and the instance must remain valid for the lifetime
/// of the returned objects. It is assumed the VkDevice created by the application will be for the
/// returned physical device.
///
OVR_PUBLIC_FUNCTION(ovrResult)
ovr_GetSessionPhysicalDeviceVk(
ovrSession session,
ovrGraphicsLuid luid,
VkInstance instance,
VkPhysicalDevice* out_physicalDevice);
/// Select VkQueue to block on till rendering is complete
///
/// \param[in] session Specifies an ovrSession previously returned by ovr_Create.
/// \param[in] queue Specifies a VkQueue to add a VkFence operation to and wait on.
///
/// \return Returns an ovrResult indicating success or failure. In the case of failure, use
/// ovr_GetLastErrorInfo to get more information.
///
/// \note The queue may be changed at any time but only the value at the time ovr_SubmitFrame
/// is called will be used. ovr_SetSynchronizationQueueVk must be called with a valid VkQueue
/// created on the same VkDevice the texture sets were created on prior to the first call to
/// ovr_SubmitFrame. An internally created VkFence object will be signalled by the completion
/// of operations on queue and waited on to synchronize the VR compositor.
///
OVR_PUBLIC_FUNCTION(ovrResult) ovr_SetSynchronizationQueueVk(ovrSession session, VkQueue queue);
// Backwards compatibility for the original typoed version
#define ovr_SetSynchonizationQueueVk ovr_SetSynchronizationQueueVk
// Define OVR_PREVIEW_DEPRECATION to generate warnings for upcoming API deprecations
#if defined(OVR_PREVIEW_DEPRECATION)
#pragma deprecated("ovr_SetSynchonizationQueueVk")
#endif
/// Create Texture Swap Chain suitable for use with Vulkan
///
/// \param[in] session Specifies an ovrSession previously returned by ovr_Create.
/// \param[in] device Specifies the application's VkDevice to create resources with.
/// \param[in] desc Specifies requested texture properties. See notes for more info
/// about texture format.
/// \param[out] out_TextureSwapChain Returns the created ovrTextureSwapChain, which will be valid
/// upon a successful return value, else it will be NULL.
/// This texture chain must be eventually destroyed via ovr_DestroyTextureSwapChain
/// before destroying the session with ovr_Destroy.
///
/// \return Returns an ovrResult indicating success or failure. In the case of failure, use
/// ovr_GetLastErrorInfo to get more information.
///
/// \note The texture format provided in \a desc should be thought of as the format the
/// distortion-compositor will use for the ShaderResourceView when reading the contents
/// of the texture. To that end, it is highly recommended that the application
/// requests texture swapchain formats that are in sRGB-space
/// (e.g. OVR_FORMAT_R8G8B8A8_UNORM_SRGB) as the compositor does sRGB-correct rendering.
/// As such, the compositor relies on the GPU's hardware sampler to do the sRGB-to-linear
/// conversion. If the application still prefers to render to a linear format (e.g.
/// OVR_FORMAT_R8G8B8A8_UNORM) while handling the linear-to-gamma conversion via
/// SPIRV code, then the application must still request the corresponding sRGB format and
/// also use the \a ovrTextureMisc_DX_Typeless flag in the ovrTextureSwapChainDesc's
/// Flag field. This will allow the application to create a RenderTargetView that is the
/// desired linear format while the compositor continues to treat it as sRGB. Failure to
/// do so will cause the compositor to apply unexpected gamma conversions leading to
/// gamma-curve artifacts. The \a ovrTextureMisc_DX_Typeless flag for depth buffer formats
/// (e.g. OVR_FORMAT_D32_FLOAT) is ignored as they are always
/// converted to be typeless.
///
/// \see ovr_GetTextureSwapChainLength
/// \see ovr_GetTextureSwapChainCurrentIndex
/// \see ovr_GetTextureSwapChainDesc
/// \see ovr_GetTextureSwapChainBufferVk
/// \see ovr_DestroyTextureSwapChain
///
OVR_PUBLIC_FUNCTION(ovrResult)
ovr_CreateTextureSwapChainVk(
ovrSession session,
VkDevice device,
const ovrTextureSwapChainDesc* desc,
ovrTextureSwapChain* out_TextureSwapChain);
/// Get a specific VkImage within the chain
///
/// \param[in] session Specifies an ovrSession previously returned by ovr_Create.
/// \param[in] chain Specifies an ovrTextureSwapChain previously returned by
/// ovr_CreateTextureSwapChainVk
/// \param[in] index Specifies the index within the chain to retrieve.
/// Must be between 0 and length (see ovr_GetTextureSwapChainLength),
/// or may pass -1 to get the buffer at the CurrentIndex location (saving a
/// call to GetTextureSwapChainCurrentIndex).
/// \param[out] out_Image Returns the VkImage retrieved.
///
/// \return Returns an ovrResult indicating success or failure. In the case of failure, use
/// ovr_GetLastErrorInfo to get more information.
///
OVR_PUBLIC_FUNCTION(ovrResult)
ovr_GetTextureSwapChainBufferVk(
ovrSession session,
ovrTextureSwapChain chain,
int index,
VkImage* out_Image);
/// Create Mirror Texture which is auto-refreshed to mirror Rift contents produced by this
/// application.
///
/// A second call to ovr_CreateMirrorTextureWithOptionsVk for a given ovrSession before destroying
/// the first one is not supported and will result in an error return.
///
/// \param[in] session Specifies an ovrSession previously returned by ovr_Create.
/// \param[in] device Specifies the VkDevice to create resources with.
/// \param[in] desc Specifies requested texture properties. See notes for more info
/// about texture format.
/// \param[out] out_MirrorTexture Returns the created ovrMirrorTexture, which will be
/// valid upon a successful return value, else it will be NULL.
/// This texture must be eventually destroyed via ovr_DestroyMirrorTexture before
/// destroying the session with ovr_Destroy.
///
/// \return Returns an ovrResult indicating success or failure. In the case of failure, use
/// ovr_GetLastErrorInfo to get more information.
///
/// \note The texture format provided in \a desc should be thought of as the format the
/// compositor will use for the VkImageView when writing into mirror texture. To that end,
/// it is highly recommended that the application requests a mirror texture format that is
/// in sRGB-space (e.g. OVR_FORMAT_R8G8B8A8_UNORM_SRGB) as the compositor does sRGB-correct
/// rendering. If however the application wants to still read the mirror texture as a
/// linear format (e.g. OVR_FORMAT_R8G8B8A8_UNORM) and handle the sRGB-to-linear conversion
/// in SPIRV code, then it is recommended the application still requests an sRGB format and
/// also use the \a ovrTextureMisc_DX_Typeless flag in the ovrMirrorTextureDesc's
/// Flags field. This will allow the application to bind a ShaderResourceView that is a
/// linear format while the compositor continues to treat is as sRGB. Failure to do so will
/// cause the compositor to apply unexpected gamma conversions leading to
/// gamma-curve artifacts.
///
/// <b>Example code</b>
/// \code{.cpp}
/// ovrMirrorTexture mirrorTexture = nullptr;
/// ovrMirrorTextureDesc mirrorDesc = {};
/// mirrorDesc.Format = OVR_FORMAT_R8G8B8A8_UNORM_SRGB;
/// mirrorDesc.Width = mirrorWindowWidth;
/// mirrorDesc.Height = mirrorWindowHeight;
/// ovrResult result = ovr_CreateMirrorTextureWithOptionsVk(session, vkDevice, &mirrorDesc,
/// &mirrorTexture);
/// [...]
/// // Destroy the texture when done with it.
/// ovr_DestroyMirrorTexture(session, mirrorTexture);
/// mirrorTexture = nullptr;
/// \endcode
///
/// \see ovr_GetMirrorTextureBufferVk
/// \see ovr_DestroyMirrorTexture
///
OVR_PUBLIC_FUNCTION(ovrResult)
ovr_CreateMirrorTextureWithOptionsVk(
ovrSession session,
VkDevice device,
const ovrMirrorTextureDesc* desc,
ovrMirrorTexture* out_MirrorTexture);
/// Get a the underlying mirror VkImage
///
/// \param[in] session Specifies an ovrSession previously returned by ovr_Create.
/// \param[in] mirrorTexture Specifies an ovrMirrorTexture previously returned by
/// ovr_CreateMirrorTextureWithOptionsVk
/// \param[out] out_Image Returns the VkImage pointer retrieved.
///
/// \return Returns an ovrResult indicating success or failure. In the case of failure, use
/// ovr_GetLastErrorInfo to get more information.
///
/// <b>Example code</b>
/// \code{.cpp}
/// VkImage mirrorImage = VK_NULL_HANDLE;
/// ovr_GetMirrorTextureBufferVk(session, mirrorTexture, &mirrorImage);
/// ...
/// vkCmdBlitImage(commandBuffer, mirrorImage, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
/// presentImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ®ion, VK_FILTER_LINEAR);
/// ...
/// vkQueuePresentKHR(queue, &presentInfo);
/// \endcode
///
OVR_PUBLIC_FUNCTION(ovrResult)
ovr_GetMirrorTextureBufferVk(
ovrSession session,
ovrMirrorTexture mirrorTexture,
VkImage* out_Image);
#endif // !defined(OVR_EXPORTING_CAPI)
#endif // OVR_CAPI_Vk_h
|