Updating SteamVR SDK From 2.12.1 to 2.12.14

Major notes include:
 * Add struct VREyeTrackingData_t, used with CreateEyeTrackingComponent, and UpdateEyeTrackingComponent for drivers to provide eye tracking input to SteamVR.
 * Synchronize props to upstream SteamVR.
 * Testing with GetSubmitTexture - Do not use - this feature will likely be removed.
 * NewSharedVulkanSemaphore signature is now different, allowing for a counting semaphore.

merged vr_steamvr_rel_to_sdk_release

[git-p4: depot-paths = "//vr/steamvr/sdk_release/": change = 9982682]
diff --git a/bin/androidarm64/libopenvr_api.so b/bin/androidarm64/libopenvr_api.so
index 4fa7a5a..104fd37 100644
--- a/bin/androidarm64/libopenvr_api.so
+++ b/bin/androidarm64/libopenvr_api.so
Binary files differ
diff --git a/bin/linux32/libopenvr_api.so b/bin/linux32/libopenvr_api.so
index 403f222..b04a4c2 100755
--- a/bin/linux32/libopenvr_api.so
+++ b/bin/linux32/libopenvr_api.so
Binary files differ
diff --git a/bin/linux32/libopenvr_api.so.dbg b/bin/linux32/libopenvr_api.so.dbg
index 47db669..56debc9 100755
--- a/bin/linux32/libopenvr_api.so.dbg
+++ b/bin/linux32/libopenvr_api.so.dbg
Binary files differ
diff --git a/bin/linux64/libopenvr_api.so b/bin/linux64/libopenvr_api.so
index cf8e38b..198da62 100755
--- a/bin/linux64/libopenvr_api.so
+++ b/bin/linux64/libopenvr_api.so
Binary files differ
diff --git a/bin/linux64/libopenvr_api.so.dbg b/bin/linux64/libopenvr_api.so.dbg
index 612d7ca..350f2f9 100755
--- a/bin/linux64/libopenvr_api.so.dbg
+++ b/bin/linux64/libopenvr_api.so.dbg
Binary files differ
diff --git a/bin/linuxarm64/libopenvr_api.so b/bin/linuxarm64/libopenvr_api.so
index f214cfa..74b9301 100644
--- a/bin/linuxarm64/libopenvr_api.so
+++ b/bin/linuxarm64/libopenvr_api.so
Binary files differ
diff --git a/bin/linuxarm64/libopenvr_api.so.dbg b/bin/linuxarm64/libopenvr_api.so.dbg
index 7ea65da..ebf869f 100644
--- a/bin/linuxarm64/libopenvr_api.so.dbg
+++ b/bin/linuxarm64/libopenvr_api.so.dbg
Binary files differ
diff --git a/bin/linuxarm64/libopenvr_api_unity.so b/bin/linuxarm64/libopenvr_api_unity.so
index 87a8a3e..d62754c 100644
--- a/bin/linuxarm64/libopenvr_api_unity.so
+++ b/bin/linuxarm64/libopenvr_api_unity.so
Binary files differ
diff --git a/bin/linuxarm64/libopenvr_api_unity.so.dbg b/bin/linuxarm64/libopenvr_api_unity.so.dbg
index 061f325..90cfd40 100644
--- a/bin/linuxarm64/libopenvr_api_unity.so.dbg
+++ b/bin/linuxarm64/libopenvr_api_unity.so.dbg
Binary files differ
diff --git a/bin/win32/openvr_api.dll b/bin/win32/openvr_api.dll
index b2144c0..b17a514 100644
--- a/bin/win32/openvr_api.dll
+++ b/bin/win32/openvr_api.dll
Binary files differ
diff --git a/bin/win32/openvr_api.dll.sig b/bin/win32/openvr_api.dll.sig
index 8c686d7..b6b10c0 100644
--- a/bin/win32/openvr_api.dll.sig
+++ b/bin/win32/openvr_api.dll.sig
Binary files differ
diff --git a/bin/win32/openvr_api.pdb b/bin/win32/openvr_api.pdb
index ef37e3d..eff94a2 100644
--- a/bin/win32/openvr_api.pdb
+++ b/bin/win32/openvr_api.pdb
Binary files differ
diff --git a/bin/win64/openvr_api.dll b/bin/win64/openvr_api.dll
index 2cad051..ab53dc6 100644
--- a/bin/win64/openvr_api.dll
+++ b/bin/win64/openvr_api.dll
Binary files differ
diff --git a/bin/win64/openvr_api.dll.sig b/bin/win64/openvr_api.dll.sig
index 9226bd7..651ebfe 100644
--- a/bin/win64/openvr_api.dll.sig
+++ b/bin/win64/openvr_api.dll.sig
Binary files differ
diff --git a/bin/win64/openvr_api.pdb b/bin/win64/openvr_api.pdb
index 5defa00..e576a0c 100644
--- a/bin/win64/openvr_api.pdb
+++ b/bin/win64/openvr_api.pdb
Binary files differ
diff --git a/headers/openvr.h b/headers/openvr.h
index 8c9e3fd..efa452a 100644
--- a/headers/openvr.h
+++ b/headers/openvr.h
@@ -17,7 +17,7 @@
 {
 	static const uint32_t k_nSteamVRVersionMajor = 2;
 	static const uint32_t k_nSteamVRVersionMinor = 12;
-	static const uint32_t k_nSteamVRVersionBuild = 1;
+	static const uint32_t k_nSteamVRVersionBuild = 14;
 } // namespace vr
 
 // public_vrtypes.h
@@ -104,6 +104,16 @@
 	HmdQuaternionf_t orientation;
 };
 
+struct VREyeTrackingData_t
+{
+	bool bActive;
+	bool bValid;
+	bool bTracked;
+
+	vr::HmdVector3_t vGazeOrigin;  // Ray origin
+	vr::HmdVector3_t vGazeTarget;  // Gaze target (fixation point)
+};
+
 /** Used to return the post-distortion UVs for each color channel.
 * UVs range from 0 to 1 with 0,0 in the upper left corner of the
 * source render target. The 0,0 to 1,1 range covers a single eye. */
@@ -463,6 +473,9 @@
 	Prop_IgnoreMotionForStandby_Bool			= 1053,
 	Prop_ActualTrackingSystemName_String		= 1054, // the literal local driver name in case someone is playing games with prop 1000
 	Prop_AllowCameraToggle_Bool					= 1055, // Shows the Enable/Disable camera option. Hide this for certain headsets if they have the camera tracking (since it's always on)
+	Prop_AllowLightSourceFrequency_Bool			= 1056, // Shows the Anti-Flicker option in camera settings.
+	Prop_SteamRemoteClientID_Uint64				= 1057, // For vrlink
+	Prop_Reserved_1058							= 1058,
 
 	// Properties that are unique to TrackedDeviceClass_HMD
 	Prop_ReportsTimeSinceVSync_Bool				= 2000,
@@ -769,7 +782,7 @@
 	Submit_Reserved2 = 0x08000,
 	Submit_Reserved3 = 0x10000,
 	Submit_Reserved4 = 0x20000,
-
+	Submit_Reserved5 = 0x40000,
 };
 
 /** Data required for passing Vulkan textures to IVRCompositor::Submit.
@@ -936,6 +949,7 @@
 
 	VREvent_TrackingRecordingStarted		= 541,
 	VREvent_TrackingRecordingStopped		= 542,
+	VREvent_SetTrackingRecordingPath		= 543,
 
 	VREvent_Reserved_0560  					= 560, // No data
 	VREvent_Reserved_0561  					= 561, // No data
@@ -1005,8 +1019,8 @@
 	VREvent_FirmwareUpdateFinished			= 1101,
 
 	VREvent_KeyboardClosed					= 1200, // DEPRECATED: Sent only to the overlay it closed for, or globally if it was closed for a scene app
-	VREvent_KeyboardCharInput				= 1201,
-	VREvent_KeyboardDone					= 1202, // Sent when DONE button clicked on keyboard
+	VREvent_KeyboardCharInput				= 1201, // Sent on keyboard input. Warning: event type appears as both global event and overlay event
+	VREvent_KeyboardDone					= 1202, // Sent when DONE button clicked on keyboard. Warning: event type appears as both global event and overlay event
 	VREvent_KeyboardOpened_Global			= 1203, // Sent globally when the keyboard is opened. data.keyboard.overlayHandle is who it was opened for (scene app if k_ulOverlayHandleInvalid)
 	VREvent_KeyboardClosed_Global			= 1204, // Sent globally when the keyboard is closed. data.keyboard.overlayHandle is who it was opened for (scene app if k_ulOverlayHandleInvalid)
 
@@ -3215,6 +3229,8 @@
 	static const char* const k_pch_LastKnown_HMDManufacturer_String = "HMDManufacturer";
 	static const char *const k_pch_LastKnown_HMDModel_String = "HMDModel";
 	static const char* const k_pch_LastKnown_ActualHMDDriver_String = "ActualHMDDriver";
+	static const char* const k_pch_LastKnown_HMDSerialNumber_String = "HMDSerialNumber";
+	static const char* const k_pch_LastKnown_HMDRemoteClientID_String = "RemoteClientID"; // uint64 in string
 
 	//-----------------------------------------------------------------------------
 	// Dismissed warnings
@@ -3448,6 +3464,14 @@
 	VRCompositorError_AlreadySet				= 110,
 };
 
+/** Usage types for retreiving shared textures */
+enum EVRCompositorTextureUsage
+{
+	VRCompositorTextureUsage_Left = Eye_Left,
+	VRCompositorTextureUsage_Right = Eye_Right,
+	VRCompositorTextureUsage_Both,
+};
+
 /** Timing mode passed to SetExplicitTimingMode(); see that function for documentation */
 enum EVRCompositorTimingMode
 {
@@ -3574,6 +3598,10 @@
 	* It is okay to pass NULL for either pose if you only want one of the values. */
 	virtual EVRCompositorError GetLastPoseForTrackedDeviceIndex( TrackedDeviceIndex_t unDeviceIndex, TrackedDevicePose_t *pOutputPose, TrackedDevicePose_t *pOutputGamePose ) = 0;
 
+	/** Get the shared texture to copy into for submitting frames. */
+	virtual EVRCompositorError GetSubmitTexture( Texture_t *pOutTexture, bool *pNeedsFlush, EVRCompositorTextureUsage eUsage,
+		const Texture_t *pTexture, const VRTextureBounds_t *pBounds = 0, EVRSubmitFlags nSubmitFlags = Submit_Default ) = 0;
+
 	/** Updated scene texture to display. If pBounds is NULL the entire texture will be used.  If called from an OpenGL app, consider adding a glFlush after
 	* Submitting both frames to signal the driver to start processing, otherwise it may wait until the command buffer fills up, causing the app to miss frames.
 	*
@@ -3771,7 +3799,7 @@
 	virtual EVRCompositorError GetPosesForFrame( uint32_t unPosePredictionID, VR_ARRAY_COUNT( unPoseArrayCount ) TrackedDevicePose_t* pPoseArray, uint32_t unPoseArrayCount ) = 0;
 };
 
-static const char * const IVRCompositor_Version = "IVRCompositor_028";
+static const char * const IVRCompositor_Version = "IVRCompositor_029";
 
 } // namespace vr
 
@@ -5539,7 +5567,7 @@
 	virtual bool NewSharedVulkanBuffer( uint32_t nSize, uint32_t nUsageFlags, vr::SharedTextureHandle_t *pSharedHandle ) = 0;
 
 	/** Create a new tracked Vulkan Semaphore */
-	virtual bool NewSharedVulkanSemaphore( vr::SharedTextureHandle_t *pSharedHandle ) = 0;
+	virtual bool NewSharedVulkanSemaphore( bool bCounting, vr::SharedTextureHandle_t *pSharedHandle ) = 0;
 
 	/** Grab a reference to hSharedHandle, and optionally generate a new IPC handle if pNewIpcHandle is not nullptr  */
 	virtual bool RefResource( vr::SharedTextureHandle_t hSharedHandle, uint64_t *pNewIpcHandle ) = 0;
@@ -5591,7 +5619,7 @@
 	virtual ~IVRIPCResourceManagerClient() {};
 };
 
-static const char *IVRIPCResourceManagerClient_Version = "IVRIPCResourceManagerClient_001";
+static const char *IVRIPCResourceManagerClient_Version = "IVRIPCResourceManagerClient_002";
 
 }
 // End
diff --git a/headers/openvr_api.cs b/headers/openvr_api.cs
index fcca437..bfaec40 100644
--- a/headers/openvr_api.cs
+++ b/headers/openvr_api.cs
@@ -725,6 +725,11 @@
 	internal _GetLastPoseForTrackedDeviceIndex GetLastPoseForTrackedDeviceIndex;
 
 	[UnmanagedFunctionPointer(CallingConvention.StdCall)]
+	internal delegate EVRCompositorError _GetSubmitTexture(ref Texture_t pOutTexture, [MarshalAs(UnmanagedType.I1)] ref bool pNeedsFlush, EVRCompositorTextureUsage eUsage, ref Texture_t pTexture, ref VRTextureBounds_t pBounds, EVRSubmitFlags nSubmitFlags);
+	[MarshalAs(UnmanagedType.FunctionPtr)]
+	internal _GetSubmitTexture GetSubmitTexture;
+
+	[UnmanagedFunctionPointer(CallingConvention.StdCall)]
 	internal delegate EVRCompositorError _Submit(EVREye eEye, ref Texture_t pTexture, ref VRTextureBounds_t pBounds, EVRSubmitFlags nSubmitFlags);
 	[MarshalAs(UnmanagedType.FunctionPtr)]
 	internal _Submit Submit;
@@ -1998,7 +2003,7 @@
 
 	[UnmanagedFunctionPointer(CallingConvention.StdCall)]
 	[return: MarshalAs(UnmanagedType.I1)]
-	internal delegate bool _NewSharedVulkanSemaphore(ref ulong pSharedHandle);
+	internal delegate bool _NewSharedVulkanSemaphore([MarshalAs(UnmanagedType.I1)] bool bCounting, ref ulong pSharedHandle);
 	[MarshalAs(UnmanagedType.FunctionPtr)]
 	internal _NewSharedVulkanSemaphore NewSharedVulkanSemaphore;
 
@@ -3043,6 +3048,12 @@
 		EVRCompositorError result = FnTable.GetLastPoseForTrackedDeviceIndex(unDeviceIndex,ref pOutputPose,ref pOutputGamePose);
 		return result;
 	}
+	public EVRCompositorError GetSubmitTexture(ref Texture_t pOutTexture,ref bool pNeedsFlush,EVRCompositorTextureUsage eUsage,ref Texture_t pTexture,ref VRTextureBounds_t pBounds,EVRSubmitFlags nSubmitFlags)
+	{
+		pNeedsFlush = false;
+		EVRCompositorError result = FnTable.GetSubmitTexture(ref pOutTexture,ref pNeedsFlush,eUsage,ref pTexture,ref pBounds,nSubmitFlags);
+		return result;
+	}
 	public EVRCompositorError Submit(EVREye eEye,ref Texture_t pTexture,ref VRTextureBounds_t pBounds,EVRSubmitFlags nSubmitFlags)
 	{
 		EVRCompositorError result = FnTable.Submit(eEye,ref pTexture,ref pBounds,nSubmitFlags);
@@ -4578,10 +4589,10 @@
 		bool result = FnTable.NewSharedVulkanBuffer(nSize,nUsageFlags,ref pSharedHandle);
 		return result;
 	}
-	public bool NewSharedVulkanSemaphore(ref ulong pSharedHandle)
+	public bool NewSharedVulkanSemaphore(bool bCounting,ref ulong pSharedHandle)
 	{
 		pSharedHandle = 0;
-		bool result = FnTable.NewSharedVulkanSemaphore(ref pSharedHandle);
+		bool result = FnTable.NewSharedVulkanSemaphore(bCounting,ref pSharedHandle);
 		return result;
 	}
 	public bool RefResource(ulong hSharedHandle,ref ulong pNewIpcHandle)
@@ -4909,6 +4920,9 @@
 	Prop_IgnoreMotionForStandby_Bool = 1053,
 	Prop_ActualTrackingSystemName_String = 1054,
 	Prop_AllowCameraToggle_Bool = 1055,
+	Prop_AllowLightSourceFrequency_Bool = 1056,
+	Prop_SteamRemoteClientID_Uint64 = 1057,
+	Prop_Reserved_1058 = 1058,
 	Prop_ReportsTimeSinceVSync_Bool = 2000,
 	Prop_SecondsFromVsyncToPhotons_Float = 2001,
 	Prop_DisplayFrequency_Float = 2002,
@@ -5136,6 +5150,7 @@
 	Submit_Reserved2 = 32768,
 	Submit_Reserved3 = 65536,
 	Submit_Reserved4 = 131072,
+	Submit_Reserved5 = 262144,
 }
 public enum EVRState
 {
@@ -5235,6 +5250,7 @@
 	VREvent_OverlayDestroyed = 540,
 	VREvent_TrackingRecordingStarted = 541,
 	VREvent_TrackingRecordingStopped = 542,
+	VREvent_SetTrackingRecordingPath = 543,
 	VREvent_Reserved_0560 = 560,
 	VREvent_Reserved_0561 = 561,
 	VREvent_Reserved_0562 = 562,
@@ -5944,6 +5960,12 @@
 	InvalidBounds = 109,
 	AlreadySet = 110,
 }
+public enum EVRCompositorTextureUsage
+{
+	Left = 0,
+	Right = 1,
+	Both = 2,
+}
 public enum EVRCompositorTimingMode
 {
 	Implicit = 0,
@@ -6382,6 +6404,17 @@
 	public HmdVector4_t position;
 	public HmdQuaternionf_t orientation;
 }
+[StructLayout(LayoutKind.Sequential)] public struct VREyeTrackingData_t
+{
+	[MarshalAs(UnmanagedType.I1)]
+	public bool bActive;
+	[MarshalAs(UnmanagedType.I1)]
+	public bool bValid;
+	[MarshalAs(UnmanagedType.I1)]
+	public bool bTracked;
+	public HmdVector3_t vGazeOrigin;
+	public HmdVector3_t vGazeTarget;
+}
 [StructLayout(LayoutKind.Sequential)] public struct DistortionCoordinates_t
 {
 	public float rfRed0; //float[2]
@@ -8006,7 +8039,7 @@
 	public const string IVRApplications_Version = "IVRApplications_007";
 	public const string IVRChaperone_Version = "IVRChaperone_004";
 	public const string IVRChaperoneSetup_Version = "IVRChaperoneSetup_006";
-	public const string IVRCompositor_Version = "IVRCompositor_028";
+	public const string IVRCompositor_Version = "IVRCompositor_029";
 	public const uint k_unVROverlayMaxKeyLength = 128;
 	public const uint k_unVROverlayMaxNameLength = 128;
 	public const uint k_unMaxOverlayCount = 128;
@@ -8257,6 +8290,8 @@
 	public const string k_pch_LastKnown_HMDManufacturer_String = "HMDManufacturer";
 	public const string k_pch_LastKnown_HMDModel_String = "HMDModel";
 	public const string k_pch_LastKnown_ActualHMDDriver_String = "ActualHMDDriver";
+	public const string k_pch_LastKnown_HMDSerialNumber_String = "HMDSerialNumber";
+	public const string k_pch_LastKnown_HMDRemoteClientID_String = "RemoteClientID";
 	public const string k_pch_DismissedWarnings_Section = "DismissedWarnings";
 	public const string k_pch_Input_Section = "input";
 	public const string k_pch_Input_LeftThumbstickRotation_Float = "leftThumbstickRotation";
@@ -8280,7 +8315,7 @@
 	public const uint k_ulInvalidSpatialAnchorHandle = 0;
 	public const string IVRSpatialAnchors_Version = "IVRSpatialAnchors_001";
 	public const string IVRDebug_Version = "IVRDebug_001";
-	public const string IVRIPCResourceManagerClient_Version = "IVRIPCResourceManagerClient_001";
+	public const string IVRIPCResourceManagerClient_Version = "IVRIPCResourceManagerClient_002";
 	public const ulong k_ulDisplayRedirectContainer = 25769803779;
 	public const string IVRProperties_Version = "IVRProperties_001";
 	public const string k_pchPathUserHandRight = "/user/hand/right";
diff --git a/headers/openvr_api.json b/headers/openvr_api.json
index f101802..382e051 100644
--- a/headers/openvr_api.json
+++ b/headers/openvr_api.json
@@ -162,6 +162,9 @@
 	,{"name": "Prop_IgnoreMotionForStandby_Bool","value": "1053"}
 	,{"name": "Prop_ActualTrackingSystemName_String","value": "1054"}
 	,{"name": "Prop_AllowCameraToggle_Bool","value": "1055"}
+	,{"name": "Prop_AllowLightSourceFrequency_Bool","value": "1056"}
+	,{"name": "Prop_SteamRemoteClientID_Uint64","value": "1057"}
+	,{"name": "Prop_Reserved_1058","value": "1058"}
 	,{"name": "Prop_ReportsTimeSinceVSync_Bool","value": "2000"}
 	,{"name": "Prop_SecondsFromVsyncToPhotons_Float","value": "2001"}
 	,{"name": "Prop_DisplayFrequency_Float","value": "2002"}
@@ -386,6 +389,7 @@
 	,{"name": "Submit_Reserved2","value": "32768"}
 	,{"name": "Submit_Reserved3","value": "65536"}
 	,{"name": "Submit_Reserved4","value": "131072"}
+	,{"name": "Submit_Reserved5","value": "262144"}
 ]}
 ,	{"enumname": "vr::EVRState","values": [ 
 	{"name": "VRState_Undefined","value": "-1"}
@@ -483,6 +487,7 @@
 	,{"name": "VREvent_OverlayDestroyed","value": "540"}
 	,{"name": "VREvent_TrackingRecordingStarted","value": "541"}
 	,{"name": "VREvent_TrackingRecordingStopped","value": "542"}
+	,{"name": "VREvent_SetTrackingRecordingPath","value": "543"}
 	,{"name": "VREvent_Reserved_0560","value": "560"}
 	,{"name": "VREvent_Reserved_0561","value": "561"}
 	,{"name": "VREvent_Reserved_0562","value": "562"}
@@ -1157,6 +1162,11 @@
 	,{"name": "VRCompositorError_InvalidBounds","value": "109"}
 	,{"name": "VRCompositorError_AlreadySet","value": "110"}
 ]}
+,	{"enumname": "vr::EVRCompositorTextureUsage","values": [ 
+	{"name": "VRCompositorTextureUsage_Left","value": "0"}
+	,{"name": "VRCompositorTextureUsage_Right","value": "1"}
+	,{"name": "VRCompositorTextureUsage_Both","value": "2"}
+]}
 ,	{"enumname": "vr::EVRCompositorTimingMode","values": [ 
 	{"name": "VRCompositorTimingMode_Implicit","value": "0"}
 	,{"name": "VRCompositorTimingMode_Explicit_RuntimePerformsPostPresentHandoff","value": "1"}
@@ -1485,7 +1495,7 @@
 ,{
 	"constname": "IVRChaperoneSetup_Version","consttype": "const char *const", "constval": "IVRChaperoneSetup_006"}
 ,{
-	"constname": "IVRCompositor_Version","consttype": "const char *const", "constval": "IVRCompositor_028"}
+	"constname": "IVRCompositor_Version","consttype": "const char *const", "constval": "IVRCompositor_029"}
 ,{
 	"constname": "k_unVROverlayMaxKeyLength","consttype": "const uint32_t", "constval": "128"}
 ,{
@@ -1987,6 +1997,10 @@
 ,{
 	"constname": "k_pch_LastKnown_ActualHMDDriver_String","consttype": "const char *const", "constval": "ActualHMDDriver"}
 ,{
+	"constname": "k_pch_LastKnown_HMDSerialNumber_String","consttype": "const char *const", "constval": "HMDSerialNumber"}
+,{
+	"constname": "k_pch_LastKnown_HMDRemoteClientID_String","consttype": "const char *const", "constval": "RemoteClientID"}
+,{
 	"constname": "k_pch_DismissedWarnings_Section","consttype": "const char *const", "constval": "DismissedWarnings"}
 ,{
 	"constname": "k_pch_Input_Section","consttype": "const char *const", "constval": "input"}
@@ -2033,7 +2047,7 @@
 ,{
 	"constname": "IVRDebug_Version","consttype": "const char *const", "constval": "IVRDebug_001"}
 ,{
-	"constname": "IVRIPCResourceManagerClient_Version","consttype": "const char *", "constval": "IVRIPCResourceManagerClient_001"}
+	"constname": "IVRIPCResourceManagerClient_Version","consttype": "const char *", "constval": "IVRIPCResourceManagerClient_002"}
 ,{
 	"constname": "k_ulDisplayRedirectContainer","consttype": "const PropertyContainerHandle_t", "constval": "25769803779"}
 ,{
@@ -2166,6 +2180,12 @@
 ,{"struct": "vr::VRBoneTransform_t","fields": [
 { "fieldname": "position", "fieldtype": "struct vr::HmdVector4_t"},
 { "fieldname": "orientation", "fieldtype": "struct vr::HmdQuaternionf_t"}]}
+,{"struct": "vr::VREyeTrackingData_t","fields": [
+{ "fieldname": "bActive", "fieldtype": "_Bool"},
+{ "fieldname": "bValid", "fieldtype": "_Bool"},
+{ "fieldname": "bTracked", "fieldtype": "_Bool"},
+{ "fieldname": "vGazeOrigin", "fieldtype": "vr::HmdVector3_t"},
+{ "fieldname": "vGazeTarget", "fieldtype": "vr::HmdVector3_t"}]}
 ,{"struct": "vr::DistortionCoordinates_t","fields": [
 { "fieldname": "rfRed", "fieldtype": "float [2]"},
 { "fieldname": "rfGreen", "fieldtype": "float [2]"},
@@ -3754,6 +3774,19 @@
 }
 ,{
 	"classname": "vr::IVRCompositor",
+	"methodname": "GetSubmitTexture",
+	"returntype": "vr::EVRCompositorError",
+	"params": [ 
+{	"paramname": "pOutTexture" ,"paramtype": "struct vr::Texture_t *"},
+{	"paramname": "pNeedsFlush" ,"paramtype": "bool *"},
+{	"paramname": "eUsage" ,"paramtype": "vr::EVRCompositorTextureUsage"},
+{	"paramname": "pTexture" ,"paramtype": "const struct vr::Texture_t *"},
+{	"paramname": "pBounds" ,"paramtype": "const struct vr::VRTextureBounds_t *"},
+{	"paramname": "nSubmitFlags" ,"paramtype": "vr::EVRSubmitFlags"}
+	 ]
+}
+,{
+	"classname": "vr::IVRCompositor",
 	"methodname": "Submit",
 	"returntype": "vr::EVRCompositorError",
 	"params": [ 
@@ -5898,6 +5931,7 @@
 	"methodname": "NewSharedVulkanSemaphore",
 	"returntype": "bool",
 	"params": [ 
+{	"paramname": "bCounting" ,"paramtype": "bool"},
 {	"paramname": "pSharedHandle" ,"paramtype": "vr::SharedTextureHandle_t *"}
 	 ]
 }
diff --git a/headers/openvr_capi.h b/headers/openvr_capi.h
index 5af3e5e..c4b6877 100644
--- a/headers/openvr_capi.h
+++ b/headers/openvr_capi.h
@@ -127,7 +127,7 @@
 static const char * IVRApplications_Version = "IVRApplications_007";
 static const char * IVRChaperone_Version = "IVRChaperone_004";
 static const char * IVRChaperoneSetup_Version = "IVRChaperoneSetup_006";
-static const char * IVRCompositor_Version = "IVRCompositor_028";
+static const char * IVRCompositor_Version = "IVRCompositor_029";
 static const unsigned long k_unVROverlayMaxKeyLength = 128;
 static const unsigned long k_unVROverlayMaxNameLength = 128;
 static const unsigned long k_unMaxOverlayCount = 128;
@@ -378,6 +378,8 @@
 static const char * k_pch_LastKnown_HMDManufacturer_String = "HMDManufacturer";
 static const char * k_pch_LastKnown_HMDModel_String = "HMDModel";
 static const char * k_pch_LastKnown_ActualHMDDriver_String = "ActualHMDDriver";
+static const char * k_pch_LastKnown_HMDSerialNumber_String = "HMDSerialNumber";
+static const char * k_pch_LastKnown_HMDRemoteClientID_String = "RemoteClientID";
 static const char * k_pch_DismissedWarnings_Section = "DismissedWarnings";
 static const char * k_pch_Input_Section = "input";
 static const char * k_pch_Input_LeftThumbstickRotation_Float = "leftThumbstickRotation";
@@ -401,7 +403,7 @@
 static const unsigned long k_ulInvalidSpatialAnchorHandle = 0;
 static const char * IVRSpatialAnchors_Version = "IVRSpatialAnchors_001";
 static const char * IVRDebug_Version = "IVRDebug_001";
-static const char * IVRIPCResourceManagerClient_Version = "IVRIPCResourceManagerClient_001";
+static const char * IVRIPCResourceManagerClient_Version = "IVRIPCResourceManagerClient_002";
 static const unsigned long long k_ulDisplayRedirectContainer = 25769803779;
 static const char * IVRProperties_Version = "IVRProperties_001";
 static const char * k_pchPathUserHandRight = "/user/hand/right";
@@ -585,6 +587,9 @@
 	ETrackedDeviceProperty_Prop_IgnoreMotionForStandby_Bool = 1053,
 	ETrackedDeviceProperty_Prop_ActualTrackingSystemName_String = 1054,
 	ETrackedDeviceProperty_Prop_AllowCameraToggle_Bool = 1055,
+	ETrackedDeviceProperty_Prop_AllowLightSourceFrequency_Bool = 1056,
+	ETrackedDeviceProperty_Prop_SteamRemoteClientID_Uint64 = 1057,
+	ETrackedDeviceProperty_Prop_Reserved_1058 = 1058,
 	ETrackedDeviceProperty_Prop_ReportsTimeSinceVSync_Bool = 2000,
 	ETrackedDeviceProperty_Prop_SecondsFromVsyncToPhotons_Float = 2001,
 	ETrackedDeviceProperty_Prop_DisplayFrequency_Float = 2002,
@@ -815,6 +820,7 @@
 	EVRSubmitFlags_Submit_Reserved2 = 32768,
 	EVRSubmitFlags_Submit_Reserved3 = 65536,
 	EVRSubmitFlags_Submit_Reserved4 = 131072,
+	EVRSubmitFlags_Submit_Reserved5 = 262144,
 } EVRSubmitFlags;
 
 typedef enum EVRState
@@ -916,6 +922,7 @@
 	EVREventType_VREvent_OverlayDestroyed = 540,
 	EVREventType_VREvent_TrackingRecordingStarted = 541,
 	EVREventType_VREvent_TrackingRecordingStopped = 542,
+	EVREventType_VREvent_SetTrackingRecordingPath = 543,
 	EVREventType_VREvent_Reserved_0560 = 560,
 	EVREventType_VREvent_Reserved_0561 = 561,
 	EVREventType_VREvent_Reserved_0562 = 562,
@@ -1661,6 +1668,13 @@
 	EVRCompositorError_VRCompositorError_AlreadySet = 110,
 } EVRCompositorError;
 
+typedef enum EVRCompositorTextureUsage
+{
+	EVRCompositorTextureUsage_VRCompositorTextureUsage_Left = 0,
+	EVRCompositorTextureUsage_VRCompositorTextureUsage_Right = 1,
+	EVRCompositorTextureUsage_VRCompositorTextureUsage_Both = 2,
+} EVRCompositorTextureUsage;
+
 typedef enum EVRCompositorTimingMode
 {
 	EVRCompositorTimingMode_VRCompositorTimingMode_Implicit = 0,
@@ -2070,6 +2084,15 @@
 	struct HmdQuaternionf_t orientation;
 } VRBoneTransform_t;
 
+typedef struct VREyeTrackingData_t
+{
+	bool bActive;
+	bool bValid;
+	bool bTracked;
+	HmdVector3_t vGazeOrigin;
+	HmdVector3_t vGazeTarget;
+} VREyeTrackingData_t;
+
 typedef struct DistortionCoordinates_t
 {
 	float rfRed[2]; //float[2]
@@ -3006,6 +3029,7 @@
 	EVRCompositorError (OPENVR_FNTABLE_CALLTYPE *WaitGetPoses)(struct TrackedDevicePose_t * pRenderPoseArray, uint32_t unRenderPoseArrayCount, struct TrackedDevicePose_t * pGamePoseArray, uint32_t unGamePoseArrayCount);
 	EVRCompositorError (OPENVR_FNTABLE_CALLTYPE *GetLastPoses)(struct TrackedDevicePose_t * pRenderPoseArray, uint32_t unRenderPoseArrayCount, struct TrackedDevicePose_t * pGamePoseArray, uint32_t unGamePoseArrayCount);
 	EVRCompositorError (OPENVR_FNTABLE_CALLTYPE *GetLastPoseForTrackedDeviceIndex)(TrackedDeviceIndex_t unDeviceIndex, struct TrackedDevicePose_t * pOutputPose, struct TrackedDevicePose_t * pOutputGamePose);
+	EVRCompositorError (OPENVR_FNTABLE_CALLTYPE *GetSubmitTexture)(struct Texture_t * pOutTexture, bool * pNeedsFlush, EVRCompositorTextureUsage eUsage, struct Texture_t * pTexture, struct VRTextureBounds_t * pBounds, EVRSubmitFlags nSubmitFlags);
 	EVRCompositorError (OPENVR_FNTABLE_CALLTYPE *Submit)(EVREye eEye, struct Texture_t * pTexture, struct VRTextureBounds_t * pBounds, EVRSubmitFlags nSubmitFlags);
 	EVRCompositorError (OPENVR_FNTABLE_CALLTYPE *SubmitWithArrayIndex)(EVREye eEye, struct Texture_t * pTexture, uint32_t unTextureArrayIndex, struct VRTextureBounds_t * pBounds, EVRSubmitFlags nSubmitFlags);
 	void (OPENVR_FNTABLE_CALLTYPE *ClearLastSubmittedFrame)();
@@ -3297,7 +3321,7 @@
 {
 	bool (OPENVR_FNTABLE_CALLTYPE *NewSharedVulkanImage)(uint32_t nImageFormat, uint32_t nWidth, uint32_t nHeight, bool bRenderable, bool bMappable, bool bComputeAccess, uint32_t unMipLevels, uint32_t unArrayLayerCount, SharedTextureHandle_t * pSharedHandle);
 	bool (OPENVR_FNTABLE_CALLTYPE *NewSharedVulkanBuffer)(uint32_t nSize, uint32_t nUsageFlags, SharedTextureHandle_t * pSharedHandle);
-	bool (OPENVR_FNTABLE_CALLTYPE *NewSharedVulkanSemaphore)(SharedTextureHandle_t * pSharedHandle);
+	bool (OPENVR_FNTABLE_CALLTYPE *NewSharedVulkanSemaphore)(bool bCounting, SharedTextureHandle_t * pSharedHandle);
 	bool (OPENVR_FNTABLE_CALLTYPE *RefResource)(SharedTextureHandle_t hSharedHandle, uint64_t * pNewIpcHandle);
 	bool (OPENVR_FNTABLE_CALLTYPE *UnrefResource)(SharedTextureHandle_t hSharedHandle);
 	bool (OPENVR_FNTABLE_CALLTYPE *GetDmabufFormats)(uint32_t * pOutFormatCount, uint32_t * pOutFormats);
diff --git a/headers/openvr_driver.h b/headers/openvr_driver.h
index f265582..c967c94 100644
--- a/headers/openvr_driver.h
+++ b/headers/openvr_driver.h
@@ -17,7 +17,7 @@
 {
 	static const uint32_t k_nSteamVRVersionMajor = 2;
 	static const uint32_t k_nSteamVRVersionMinor = 12;
-	static const uint32_t k_nSteamVRVersionBuild = 1;
+	static const uint32_t k_nSteamVRVersionBuild = 14;
 } // namespace vr
 
 // public_vrtypes.h
@@ -104,6 +104,16 @@
 	HmdQuaternionf_t orientation;
 };
 
+struct VREyeTrackingData_t
+{
+	bool bActive;
+	bool bValid;
+	bool bTracked;
+
+	vr::HmdVector3_t vGazeOrigin;  // Ray origin
+	vr::HmdVector3_t vGazeTarget;  // Gaze target (fixation point)
+};
+
 /** Used to return the post-distortion UVs for each color channel.
 * UVs range from 0 to 1 with 0,0 in the upper left corner of the
 * source render target. The 0,0 to 1,1 range covers a single eye. */
@@ -463,6 +473,9 @@
 	Prop_IgnoreMotionForStandby_Bool			= 1053,
 	Prop_ActualTrackingSystemName_String		= 1054, // the literal local driver name in case someone is playing games with prop 1000
 	Prop_AllowCameraToggle_Bool					= 1055, // Shows the Enable/Disable camera option. Hide this for certain headsets if they have the camera tracking (since it's always on)
+	Prop_AllowLightSourceFrequency_Bool			= 1056, // Shows the Anti-Flicker option in camera settings.
+	Prop_SteamRemoteClientID_Uint64				= 1057, // For vrlink
+	Prop_Reserved_1058							= 1058,
 
 	// Properties that are unique to TrackedDeviceClass_HMD
 	Prop_ReportsTimeSinceVSync_Bool				= 2000,
@@ -769,7 +782,7 @@
 	Submit_Reserved2 = 0x08000,
 	Submit_Reserved3 = 0x10000,
 	Submit_Reserved4 = 0x20000,
-
+	Submit_Reserved5 = 0x40000,
 };
 
 /** Data required for passing Vulkan textures to IVRCompositor::Submit.
@@ -936,6 +949,7 @@
 
 	VREvent_TrackingRecordingStarted		= 541,
 	VREvent_TrackingRecordingStopped		= 542,
+	VREvent_SetTrackingRecordingPath		= 543,
 
 	VREvent_Reserved_0560  					= 560, // No data
 	VREvent_Reserved_0561  					= 561, // No data
@@ -1005,8 +1019,8 @@
 	VREvent_FirmwareUpdateFinished			= 1101,
 
 	VREvent_KeyboardClosed					= 1200, // DEPRECATED: Sent only to the overlay it closed for, or globally if it was closed for a scene app
-	VREvent_KeyboardCharInput				= 1201,
-	VREvent_KeyboardDone					= 1202, // Sent when DONE button clicked on keyboard
+	VREvent_KeyboardCharInput				= 1201, // Sent on keyboard input. Warning: event type appears as both global event and overlay event
+	VREvent_KeyboardDone					= 1202, // Sent when DONE button clicked on keyboard. Warning: event type appears as both global event and overlay event
 	VREvent_KeyboardOpened_Global			= 1203, // Sent globally when the keyboard is opened. data.keyboard.overlayHandle is who it was opened for (scene app if k_ulOverlayHandleInvalid)
 	VREvent_KeyboardClosed_Global			= 1204, // Sent globally when the keyboard is closed. data.keyboard.overlayHandle is who it was opened for (scene app if k_ulOverlayHandleInvalid)
 
@@ -2797,6 +2811,8 @@
 	static const char* const k_pch_LastKnown_HMDManufacturer_String = "HMDManufacturer";
 	static const char *const k_pch_LastKnown_HMDModel_String = "HMDModel";
 	static const char* const k_pch_LastKnown_ActualHMDDriver_String = "ActualHMDDriver";
+	static const char* const k_pch_LastKnown_HMDSerialNumber_String = "HMDSerialNumber";
+	static const char* const k_pch_LastKnown_HMDRemoteClientID_String = "RemoteClientID"; // uint64 in string
 
 	//-----------------------------------------------------------------------------
 	// Dismissed warnings
@@ -3802,6 +3818,12 @@
 
 		/** Updates a pose component. */
 		virtual EVRInputError UpdatePoseComponent( VRInputComponentHandle_t ulComponent, const HmdMatrix34_t *pMatPoseOffset, double fTimeOffset ) = 0;
+
+		/** Creates an eye tracking component **/
+		virtual EVRInputError CreateEyeTrackingComponent( PropertyContainerHandle_t ulContainer, const char *pchName, VRInputComponentHandle_t *pHandle ) = 0;
+
+		/** Updates an eye tracking component. */
+		virtual EVRInputError UpdateEyeTrackingComponent( VRInputComponentHandle_t ulComponent, const VREyeTrackingData_t *pEyeTrackingData, double fTimeOffset ) = 0;
 	};
 
 	static const char * const IVRDriverInput_Version = "IVRDriverInput_004";
@@ -4240,7 +4262,7 @@
 	virtual bool NewSharedVulkanBuffer( uint32_t nSize, uint32_t nUsageFlags, vr::SharedTextureHandle_t *pSharedHandle ) = 0;
 
 	/** Create a new tracked Vulkan Semaphore */
-	virtual bool NewSharedVulkanSemaphore( vr::SharedTextureHandle_t *pSharedHandle ) = 0;
+	virtual bool NewSharedVulkanSemaphore( bool bCounting, vr::SharedTextureHandle_t *pSharedHandle ) = 0;
 
 	/** Grab a reference to hSharedHandle, and optionally generate a new IPC handle if pNewIpcHandle is not nullptr  */
 	virtual bool RefResource( vr::SharedTextureHandle_t hSharedHandle, uint64_t *pNewIpcHandle ) = 0;
@@ -4292,7 +4314,7 @@
 	virtual ~IVRIPCResourceManagerClient() {};
 };
 
-static const char *IVRIPCResourceManagerClient_Version = "IVRIPCResourceManagerClient_001";
+static const char *IVRIPCResourceManagerClient_Version = "IVRIPCResourceManagerClient_002";
 
 }
 
diff --git a/lib/linuxarm64/libopenvr_api_unity.so b/lib/linuxarm64/libopenvr_api_unity.so
index 061f325..90cfd40 100644
--- a/lib/linuxarm64/libopenvr_api_unity.so
+++ b/lib/linuxarm64/libopenvr_api_unity.so
Binary files differ
diff --git a/samples/bin/androidarm64/libopenvr_api.so b/samples/bin/androidarm64/libopenvr_api.so
index 4fa7a5a..104fd37 100644
--- a/samples/bin/androidarm64/libopenvr_api.so
+++ b/samples/bin/androidarm64/libopenvr_api.so
Binary files differ
diff --git a/samples/bin/linux32/libopenvr_api.so b/samples/bin/linux32/libopenvr_api.so
index 403f222..b04a4c2 100644
--- a/samples/bin/linux32/libopenvr_api.so
+++ b/samples/bin/linux32/libopenvr_api.so
Binary files differ
diff --git a/samples/bin/linux64/libopenvr_api.so b/samples/bin/linux64/libopenvr_api.so
index cf8e38b..198da62 100644
--- a/samples/bin/linux64/libopenvr_api.so
+++ b/samples/bin/linux64/libopenvr_api.so
Binary files differ
diff --git a/samples/bin/linuxarm64/libopenvr_api.so b/samples/bin/linuxarm64/libopenvr_api.so
index f214cfa..74b9301 100644
--- a/samples/bin/linuxarm64/libopenvr_api.so
+++ b/samples/bin/linuxarm64/libopenvr_api.so
Binary files differ
diff --git a/samples/bin/win32/hmd_opencv_sandbox.exe b/samples/bin/win32/hmd_opencv_sandbox.exe
index 0538afd..47b8c6e 100755
--- a/samples/bin/win32/hmd_opencv_sandbox.exe
+++ b/samples/bin/win32/hmd_opencv_sandbox.exe
Binary files differ
diff --git a/samples/bin/win32/openvr_api.dll b/samples/bin/win32/openvr_api.dll
index b2144c0..b17a514 100644
--- a/samples/bin/win32/openvr_api.dll
+++ b/samples/bin/win32/openvr_api.dll
Binary files differ
diff --git a/samples/bin/win64/hmd_opencv_sandbox.exe b/samples/bin/win64/hmd_opencv_sandbox.exe
index a65f009..d4b0427 100755
--- a/samples/bin/win64/hmd_opencv_sandbox.exe
+++ b/samples/bin/win64/hmd_opencv_sandbox.exe
Binary files differ
diff --git a/samples/bin/win64/openvr_api.dll b/samples/bin/win64/openvr_api.dll
index 2cad051..ab53dc6 100644
--- a/samples/bin/win64/openvr_api.dll
+++ b/samples/bin/win64/openvr_api.dll
Binary files differ
diff --git a/samples/helloworldoverlay/openvroverlaycontroller.h b/samples/helloworldoverlay/openvroverlaycontroller.h
index e9698fb..8591616 100644
--- a/samples/helloworldoverlay/openvroverlaycontroller.h
+++ b/samples/helloworldoverlay/openvroverlaycontroller.h
@@ -67,6 +67,7 @@
 private:
 	vr::HmdError m_eCompositorError;
 	vr::HmdError m_eOverlayError;
+	vr::Compositor_OverlaySettings m_overlaySettings;
 	vr::VROverlayHandle_t m_ulOverlayHandle;
     vr::VROverlayHandle_t m_ulOverlayThumbnailHandle;
 
diff --git a/samples/unity_keyboard_sample/Assets/Plugins/openvr_api.cs b/samples/unity_keyboard_sample/Assets/Plugins/openvr_api.cs
index 1d715c1..b13cd3c 100644
--- a/samples/unity_keyboard_sample/Assets/Plugins/openvr_api.cs
+++ b/samples/unity_keyboard_sample/Assets/Plugins/openvr_api.cs
@@ -3242,6 +3242,25 @@
 	public VRControllerAxis_t rAxis3;
 	public VRControllerAxis_t rAxis4;
 }
+[StructLayout(LayoutKind.Sequential)] public struct Compositor_OverlaySettings
+{
+	public uint size;
+	[MarshalAs(UnmanagedType.I1)]
+	public bool curved;
+	[MarshalAs(UnmanagedType.I1)]
+	public bool antialias;
+	public float scale;
+	public float distance;
+	public float alpha;
+	public float uOffset;
+	public float vOffset;
+	public float uScale;
+	public float vScale;
+	public float gridDivs;
+	public float gridWidth;
+	public float gridScale;
+	public HmdMatrix44_t transform;
+}
 [StructLayout(LayoutKind.Sequential)] public struct AppOverrideKeys_t
 {
 	public IntPtr pchKey; // const char *
diff --git a/samples/unity_teleport_sample/Assets/Plugins/openvr_api.cs b/samples/unity_teleport_sample/Assets/Plugins/openvr_api.cs
index 1d715c1..b13cd3c 100644
--- a/samples/unity_teleport_sample/Assets/Plugins/openvr_api.cs
+++ b/samples/unity_teleport_sample/Assets/Plugins/openvr_api.cs
@@ -3242,6 +3242,25 @@
 	public VRControllerAxis_t rAxis3;
 	public VRControllerAxis_t rAxis4;
 }
+[StructLayout(LayoutKind.Sequential)] public struct Compositor_OverlaySettings
+{
+	public uint size;
+	[MarshalAs(UnmanagedType.I1)]
+	public bool curved;
+	[MarshalAs(UnmanagedType.I1)]
+	public bool antialias;
+	public float scale;
+	public float distance;
+	public float alpha;
+	public float uOffset;
+	public float vOffset;
+	public float uScale;
+	public float vScale;
+	public float gridDivs;
+	public float gridWidth;
+	public float gridScale;
+	public HmdMatrix44_t transform;
+}
 [StructLayout(LayoutKind.Sequential)] public struct AppOverrideKeys_t
 {
 	public IntPtr pchKey; // const char *