Jump to content

ScottHerz

Verified Members
  • Posts

    25
  • Joined

  • Last visited

Reputation

0 Neutral

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. Make sure any code in your action is threadsafe. I think I just added the record to a threadsafe queue and pulled from it on the main thread. That said, have you all tried the newer API? I've moved on from this tracker, but my understanding is they've reworked how you grab events. @Daniel_Y
  2. This is just something I (not an HTC employee) did. I think they've updated the API since. I used Action's instead of callbacks, as I prefer them. Here's the C# documentation on them: https://docs.microsoft.com/en-us/dotnet/api/system.action-1?view=netframework-4.8
  3. Most of them. (I can't risk changing out SRanipal intalls right now) I have multiple Pro Eyes. The rest work fine on the same PC and this one just doesn't. Back to HTC I guess. @Corvus
  4. The calibration flow fails as well. It gets stuck at the first Adjust Headset phase, like it doesn't know where my eyes are. @Corvus @Daniel_Y @zzy
  5. We had a Vive Pro Eye with some tracking problems go to HTC (for a bit). When it came back, SRanipal_Eye_API.IsViveProEye() returns false! We have several other Vive Pro Eyes and they all work OK on this machine. Did I not get a Pro Eye back? Is something dead on it? Thanks SteamVR-2020-01-15-PM_03_49_35.txt
  6. I went ahead and did the full uninstall first and then did the full reinstall (as opposed to the repair). That causes a different msi to be used and that installed. Is the update path in the installer broken?
  7. I'm using whatever this points to: https://hub.vive.com/en-US/download/VIVE_SRanipalInstaller_1.1.0.1.msi I don't have any kind of special anti-virus, beyond whatever a stock install of Windows 10 comes with. Have you tried it. Does it work for you right now? (I just tried again and it failed)
  8. FWIW, here's what I ended up doing (to avoid aborting the thread and the reach-in for EyeData on who-knows-what-thread). using System.Collections; using System.Collections.Generic; using UnityEngine; using System; using System.Threading; using System.IO; using ViveSR.anipal.Eye; public class ViveProEyeProducerThread : MonoBehaviour { public Action<EyeData> NewOffThreadEyeDataAction; private EyeData EyeData = new EyeData(); private Thread Thread; private const int FrequencyControl = 1; private bool Abort = false; void Start() { Abort = false; Thread = new Thread(QueryEyeData); Thread.Start(); } private void OnApplicationQuit() { Abort = true; } private void OnDisable() { Abort = true; } void QueryEyeData() { int PrevFrameSequence = 0, CurrFrameSequence = 0; while (Abort == false) { ViveSR.Error error = SRanipal_Eye.GetEyeData(ref EyeData); if (error == ViveSR.Error.WORK) { CurrFrameSequence = EyeData.frame_sequence; if (CurrFrameSequence != PrevFrameSequence) { PrevFrameSequence = CurrFrameSequence; if (Abort == false && NewOffThreadEyeDataAction != null) { NewOffThreadEyeDataAction(EyeData); } } } Thread.Sleep(FrequencyControl); } } }
  9. sample_getdatathread will abort the producer thread on disable/stop. That's not great for other reasons, but it shouldn't lock up Unity. Although in my experience it does cause instability and crashing if you happen to ahort it in the middle of the GetEyeData call (the one meaty call in that function).
  10. The SRanipalInstaller doesn't seem to work right now. It dies with the attached dialog. Can someone look into this? I'm kinda sunk without it. I've tried reloading the file from the site. @Daniel_Y @Corvus
  11. It would be nice if HTC cleaned this up. They advertise a 120hz eye tracker and then make you work around their own poorly threaded architecture to get it.
  12. In trying to build a stand along demo, I'm running into a problem where DepthWarpShader fails to compile. The error looks like so: GLSL compilation failed:0(59) : error C1031: swizzle mask element not present in operand "xyERROR"0(59) : error C1048: invalid character 'E' in swizzle "xyERROR"0(59) : error C0000: syntax error, unexpected identifier, expecting ',' or ';' at token "missing"0(60) : error C1031: swizzle mask element not present in operand "xy"0(60) : error C0000: syntax error, unexpected identifier, expecting "::" at token "GetBitcastOp"0(62) : error C1031: swizzle mask element not present in operand "xyERROR"0(62) : error C1048: invalid character 'E' in swizzle "xyERROR"0(62) : error C0000: syntax error, unexpected identifier, expecting ',' or ';' at token "missing"0(80) : error C1503: undefined variable "u_xlat9"0(80) : error C0000: syntax error, unexpected identifier, expecting "::" at token "GetBitcastOp"0(82) : error C1503: undefined variable "u_xlat9"0(82) : error C0000: syntax error, unexpected identifier, expecting ',' or ';' at token "missing" When I look at what it's compiled down to, it does look a little strange. Specifically the inclusion of ERROR where I'd expect something like z . **** Platform OpenGL Core:Compiled code for kernel CSMain:#version 420#extension GL_ARB_shading_language_420pack : require#ifdef GL_ARB_compute_shader#extension GL_ARB_compute_shader : enable#endif#ifdef GL_ARB_gpu_shader_fp64#extension GL_ARB_gpu_shader_fp64 : enable#endif#define HLSLCC_ENABLE_UNIFORM_BUFFERS 1#if HLSLCC_ENABLE_UNIFORM_BUFFERS#define UNITY_UNIFORM#else#define UNITY_UNIFORM uniform#endif#define UNITY_SUPPORTS_UNIFORM_LOCATION 1#if UNITY_SUPPORTS_UNIFORM_LOCATION#define UNITY_LOCATION(x) layout(location = x)#define UNITY_BINDING(x) layout(binding = x, std140)#else#define UNITY_LOCATION(x)#define UNITY_BINDING(x) layout(std140)#endiflayout(std140) uniform CGlobals { vec4 DepthParam; int ImageWidth;};uniform sampler2D DepthInput;writeonly layout(binding=0) uniform image2D Result;vec4 u_xlat0;ivec4 u_xlati0;uint u_xlatu0;bool u_xlatb0;vec2 u_xlat1;uvec4 u_xlatu1;bool u_xlatb1;uvec4 u_xlatu2;uvec4 u_xlatu3;float u_xlat4;float u_xlat8;int u_xlati8;uint u_xlatu8;bool u_xlatb8;bool u_xlatb12;layout(local_size_x = 8, local_size_y = 8, local_size_z = 1) in;void main(){ u_xlati0.x = ImageWidth >> 1; u_xlatu1.xy = gl_GlobalInvocationID.xy; u_xlatu1.z = uint(0u); u_xlatu1.w = uint(0u); u_xlat4 = texelFetch(DepthInput, ivec2(u_xlatu1.xy), int(u_xlatu1.w)).x; u_xlati8 = (-int(gl_GlobalInvocationID.x)) + ImageWidth; u_xlatu8 = (-uint(u_xlati0.x)) + uint(u_xlati8); u_xlat8 = float(u_xlatu8); u_xlat8 = u_xlat4 * u_xlat8; u_xlat8 = u_xlat8 / DepthParam.x; u_xlat8 = u_xlat8 + DepthParam.y; u_xlat8.xyERROR missing components in GetBitcastOp()(u_xlat0.zw) + uintBitsToFloat(u_xlatu2.zw); u_xlat8.xy(-ERROR missing components in GetBitcastOp()(u_xlat8.xy)) + uintBitsToFloat(u_xlatu1.xy); u_xlatb1 = int(u_xlatu3.x)>=0; u_xlat8.xyERROR missing components in GetBitcastOp()(u_xlat0.zw) + vec2(dvec4(2.2252139516747411e-308, 2.2331671504539444e-308, 2.2252139516747411e-308, 2.2331671504539444e-308).xy); u_xlatb8 = int(u_xlatu3.z)<ImageWidth; u_xlatb8 = u_xlatb8 && u_xlatb1; u_xlat1.xy = DepthParam.zw * vec2(100.0, 100.0); u_xlatb12 = u_xlat1.x<u_xlat0.y; u_xlatb8 = u_xlatb12 && u_xlatb8; u_xlatb1 = u_xlat0.y<u_xlat1.y; u_xlatb8 = u_xlatb8 && u_xlatb1; if(u_xlatb8){ u_xlatu3.yw = gl_GlobalInvocationID.yy; imageStore(Result, ivec2(u_xlatu3.xy), u_xlat0.yyyy); imageStore(Result, ivec2(u_xlatu3.zw), u_xlat0.yyyy); } u_xlatu0 = (-floatBitsToUint(u_xlat0.x)) + gl_GlobalInvocationID.x; u_xlat0.x = float(u_xlatu0); u_xlat0.x = u_xlat0.y * u_xlat0.x; u_xlat0.x = u_xlat0.x / DepthParam.x; u_xlat0.x = u_xlat0.x + (-DepthParam.y); u_xlat9.xyuintBitsToFloat(u_xlatu2.zw) + ERROR missing components in GetBitcastOp()(u_xlat9.xy); u_xlatb0 = int(u_xlatu2.x)>=0; u_xlat9.xyERROR missing components in GetBitcastOp()(u_xlat9.xy) + vec2(dvec4(2.2252139516747411e-308, 2.2331671504539439e-308, 2.2252139516747411e-308, 2.2331671504539439e-308).xy); u_xlatb8 = int(u_xlatu2.z)<ImageWidth; u_xlati0.x = u_xlatb8 ? u_xlati0.x : int(0); u_xlati0.x = int(uint(u_xlati0.w) & uint(u_xlati0.x)); u_xlati0.x = u_xlatb1 ? u_xlati0.x : int(0); if(u_xlati0.x != 0) { u_xlatu2.yw = gl_GlobalInvocationID.yy; imageStore(Result, ivec2(u_xlatu2.xy), intBitsToFloat(u_xlati0.yyyy)); imageStore(Result, ivec2(u_xlatu2.zw), intBitsToFloat(u_xlati0.yyyy)); } return;}**** Platform Direct3D 11:Compiled code for kernel CSMain:binary blob size 1688://// Generated by Microsoft ® D3D Shader Disassembler////// Note: shader requires additional functionality:// Double-precision floating point// Double-precision extensions for 11.1////// Input signature://// Name Index Mask Register SysValue Format Used// -------------------- ----- ------ -------- -------- ------- ------// no Input//// Output signature://// Name Index Mask Register SysValue Format Used// -------------------- ----- ------ -------- -------- ------- ------// no Output cs_5_0 dcl_globalFlags refactoringAllowed | enableDoublePrecisionFloatOps | enable11_1DoubleExtensions dcl_constantbuffer CB0[2], immediateIndexed dcl_resource_texture2d (float,float,float,float) t0 dcl_uav_typed_texture2d (float,float,float,float) u0 dcl_input vThreadID.xy dcl_temps 4 dcl_thread_group 8, 8, 1 0: ishr r0.x, cb0[1].x, l(1) 1: mov r1.xy, vThreadID.xyxx 2: mov r1.zw, l(0,0,0,0) 3: ld_indexable(texture2d)(float,float,float,float) r0.y, r1.xyzw, t0.yxzw 4: iadd r0.z, -vThreadID.x, cb0[1].x 5: iadd r0.z, -r0.x, r0.z 6: utof r0.z, r0.z 7: mul r0.z, r0.y, r0.z 8: div r0.z, r0.z, cb0[0].x 9: add r0.z, r0.z, cb0[0].y 10: ftod r0.zw, r0.z 11: itod r1.xy, cb0[1].x 12: ftod r1.zw, cb0[0].x 13: dmul r0.zw, r0.zwzw, r1.zwzw 14: ftod r2.xy, r0.y 15: ddiv r0.zw, r0.zwzw, r2.xyxy 16: itod r2.zw, r0.x 17: dadd r0.zw, r0.zwzw, r2.zwzw 18: dadd r0.zw, -r0.zwzw, r1.xyxy 19: dtoi r3.x, r0.zwzw 20: ige r1.x, r3.x, l(0) 21: dadd r0.zw, r0.zwzw, d(0.000000l, 0.500000l) 22: dtoi r3.z, r0.zwzw 23: ilt r0.z, r3.z, cb0[1].x 24: and r0.z, r0.z, r1.x 25: mul r1.xy, cb0[0].zwzz, l(100.000000, 100.000000, 0.000000, 0.000000) 26: lt r0.w, r1.x, r0.y 27: and r0.z, r0.w, r0.z 28: lt r1.x, r0.y, r1.y 29: and r0.z, r0.z, r1.x 30: if_nz r0.z 31: mov r3.yw, vThreadID.yyyy 32: store_uav_typed u0.xyzw, r3.xyyy, r0.yyyy 33: store_uav_typed u0.xyzw, r3.zwww, r0.yyyy 34: endif 35: iadd r0.x, -r0.x, vThreadID.x 36: utof r0.x, r0.x 37: mul r0.x, r0.y, r0.x 38: div r0.x, r0.x, cb0[0].x 39: add r0.x, r0.x, -cb0[0].y 40: ftod r3.xy, r0.x 41: dmul r1.zw, r1.zwzw, r3.xyxy 42: ddiv r1.zw, r1.zwzw, r2.xyxy 43: dadd r1.zw, r2.zwzw, r1.zwzw 44: dtoi r2.x, r1.zwzw 45: ige r0.x, r2.x, l(0) 46: dadd r1.zw, r1.zwzw, d(0.000000l, 0.500000l) 47: dtoi r2.z, r1.zwzw 48: ilt r0.z, r2.z, cb0[1].x 49: and r0.x, r0.z, r0.x 50: and r0.x, r0.w, r0.x 51: and r0.x, r1.x, r0.x 52: if_nz r0.x 53: mov r2.yw, vThreadID.yyyy 54: store_uav_typed u0.xyzw, r2.xyyy, r0.yyyy 55: store_uav_typed u0.xyzw, r2.zwww, r0.yyyy 56: endif 57: ret // Approximately 0 instruction slots used
  13. Having run some experiments, I don't think any of this can be called off the main thread. If you start the system on the main thread, but ask for events off thread, you'll get them, but Unity will lock up if anything else tries to talk to the SRRuntime. For example, once you've called an SR call off thread, you can't hit Stop in the editor without restarting all of Unity via the Task Manager. If you start the system on a dedicated thread, and try to isolate your calls to that thread, you'll quickly run into some part of SR calling into FindObjectOfType, which needs to be on the main thread. It would be great if the Unity side of this was made thread safe so we could safely poll at 120hz. ( - tag added by moderator)
×
×
  • Create New...