@@ -128,11 +128,12 @@ namespace {
128128 uint32_t displayWidth,
129129 uint32_t displayHeight,
130130 uint32_t tileSize,
131- uint32_t tileRateMax)
131+ uint32_t tileRateMax,
132+ bool hasVisibilityMask)
132133 : m_openXR(openXR), m_configManager(configManager), m_device(graphicsDevice), m_eyeTracker(eyeTracker),
133134 m_renderWidth (renderWidth), m_renderHeight(renderHeight),
134135 m_renderRatio(float (renderWidth) / renderHeight), m_tileSize(tileSize), m_tileRateMax(tileRateMax),
135- m_actualRenderWidth(renderWidth) {
136+ m_actualRenderWidth(renderWidth), m_hasVisibilityMask(hasVisibilityMask) {
136137 createRenderResources (m_renderWidth, m_renderHeight);
137138
138139 // Set initial projection center
@@ -162,47 +163,49 @@ namespace {
162163
163164 void beginSession (XrSession session) override {
164165 // Create HAM buffers.
165- for (uint32_t i = 0 ; i < ViewCount; i++) {
166- XrVisibilityMaskKHR mask{XR_TYPE_VISIBILITY_MASK_KHR};
167- if (XR_FAILED (m_openXR.xrGetVisibilityMaskKHR (session,
168- XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO,
169- i,
170- XR_VISIBILITY_MASK_TYPE_HIDDEN_TRIANGLE_MESH_KHR,
171- &mask))) {
172- break ;
173- }
166+ if (m_hasVisibilityMask) {
167+ for (uint32_t i = 0 ; i < ViewCount; i++) {
168+ XrVisibilityMaskKHR mask{XR_TYPE_VISIBILITY_MASK_KHR};
169+ if (XR_FAILED (m_openXR.xrGetVisibilityMaskKHR (session,
170+ XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO,
171+ i,
172+ XR_VISIBILITY_MASK_TYPE_HIDDEN_TRIANGLE_MESH_KHR,
173+ &mask))) {
174+ break ;
175+ }
174176
175- if (!mask.indexCountOutput ) {
176- break ;
177- }
177+ if (!mask.indexCountOutput ) {
178+ break ;
179+ }
178180
179- std::vector<XrVector2f> rawVertices (mask.vertexCountOutput );
180- std::vector<uint32_t > rawIndices (mask.indexCountOutput );
181-
182- mask.indexCapacityInput = (uint32_t )rawIndices.size ();
183- mask.indices = rawIndices.data ();
184- mask.vertexCapacityInput = (uint32_t )rawVertices.size ();
185- mask.vertices = rawVertices.data ();
186- CHECK_XRCMD (m_openXR.xrGetVisibilityMaskKHR (session,
187- XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO,
188- i,
189- XR_VISIBILITY_MASK_TYPE_HIDDEN_TRIANGLE_MESH_KHR,
190- &mask));
191-
192- std::vector<SimpleMeshVertex> vertices (mask.vertexCountOutput );
193- for (uint32_t j = 0 ; j < vertices.size (); j++) {
194- vertices[j].Position = {rawVertices[j].x , rawVertices[j].y , -1 .0f };
195- vertices[j].Color = {(float )m_shadingRates[SHADING_RATE_CULL],
196- (float )m_shadingRates[SHADING_RATE_CULL],
197- (float )m_shadingRates[SHADING_RATE_CULL]};
198- }
181+ std::vector<XrVector2f> rawVertices (mask.vertexCountOutput );
182+ std::vector<uint32_t > rawIndices (mask.indexCountOutput );
183+
184+ mask.indexCapacityInput = (uint32_t )rawIndices.size ();
185+ mask.indices = rawIndices.data ();
186+ mask.vertexCapacityInput = (uint32_t )rawVertices.size ();
187+ mask.vertices = rawVertices.data ();
188+ CHECK_XRCMD (m_openXR.xrGetVisibilityMaskKHR (session,
189+ XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO,
190+ i,
191+ XR_VISIBILITY_MASK_TYPE_HIDDEN_TRIANGLE_MESH_KHR,
192+ &mask));
193+
194+ std::vector<SimpleMeshVertex> vertices (mask.vertexCountOutput );
195+ for (uint32_t j = 0 ; j < vertices.size (); j++) {
196+ vertices[j].Position = {rawVertices[j].x , rawVertices[j].y , -1 .0f };
197+ vertices[j].Color = {(float )m_shadingRates[SHADING_RATE_CULL],
198+ (float )m_shadingRates[SHADING_RATE_CULL],
199+ (float )m_shadingRates[SHADING_RATE_CULL]};
200+ }
199201
200- std::vector<uint16_t > indices (mask.indexCountOutput );
201- for (uint32_t j = 0 ; j < indices.size (); j++) {
202- indices[j] = rawIndices[j];
203- }
202+ std::vector<uint16_t > indices (mask.indexCountOutput );
203+ for (uint32_t j = 0 ; j < indices.size (); j++) {
204+ indices[j] = rawIndices[j];
205+ }
204206
205- m_HAM[i] = m_device->createSimpleMesh (vertices, indices, " VRS HAM" );
207+ m_HAM[i] = m_device->createSimpleMesh (vertices, indices, " VRS HAM" );
208+ }
206209 }
207210
208211 m_session = session;
@@ -1039,6 +1042,8 @@ namespace {
10391042 std::mutex m_renderScalesLock;
10401043 float m_filterScale{0 .51f };
10411044
1045+ bool m_hasVisibilityMask{false };
1046+
10421047 // This is valid for D3D11 only (single-threaded).
10431048 struct {
10441049 bool isActive{false };
@@ -1119,7 +1124,8 @@ namespace toolkit::graphics {
11191124 uint32_t renderWidth,
11201125 uint32_t renderHeight,
11211126 uint32_t displayWidth,
1122- uint32_t displayHeight) {
1127+ uint32_t displayHeight,
1128+ bool hasVisibilityMask) {
11231129 try {
11241130 uint32_t tileSize = 0 ;
11251131 uint32_t tileRateMax = 0 ;
@@ -1184,7 +1190,8 @@ namespace toolkit::graphics {
11841190 displayWidth,
11851191 displayHeight,
11861192 tileSize,
1187- tileRateMax);
1193+ tileRateMax,
1194+ hasVisibilityMask);
11881195
11891196 } catch (FeatureNotSupported&) {
11901197 return nullptr ;
0 commit comments