Skip to content

Commit e366b7b

Browse files
committed
Fix crash when HAM extension isn't available.
1 parent 445b06d commit e366b7b

File tree

3 files changed

+52
-43
lines changed

3 files changed

+52
-43
lines changed

XR_APILAYER_MBUCCHIA_toolkit/factories.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,8 @@ namespace toolkit {
129129
uint32_t renderWidth,
130130
uint32_t renderHeight,
131131
uint32_t displayWidth,
132-
uint32_t displayHeight);
132+
uint32_t displayHeight,
133+
bool hasVisibilityMask);
133134

134135

135136
bool IsDeviceSupportingFP16(std::shared_ptr<IDevice> device);

XR_APILAYER_MBUCCHIA_toolkit/layer.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -774,7 +774,8 @@ namespace {
774774
renderWidth,
775775
renderHeight,
776776
m_displayWidth,
777-
m_displayHeight);
777+
m_displayHeight,
778+
!m_isOpenComposite && m_hasVisibilityMaskKHR);
778779

779780
// Register intercepted events.
780781
m_graphicsDevice->registerSetRenderTargetEvent(

XR_APILAYER_MBUCCHIA_toolkit/vrs.cpp

Lines changed: 48 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)