From 12d78144f6918221da2fc951afd5f55fcbec31c7 Mon Sep 17 00:00:00 2001
From: Jakob Bornecrantz <jakob@collabora.com>
Date: Sat, 30 May 2020 11:58:06 +0100
Subject: [PATCH] st/oxr: Verify XrViewConfigurationType in
 xrEnumerateEnvironmentBlendModes

---
 doc/changes/state_trackers/mr.359.1.md      |  2 ++
 src/xrt/state_trackers/oxr/oxr_api_system.c | 31 +++++++++++++++++++++
 2 files changed, 33 insertions(+)
 create mode 100644 doc/changes/state_trackers/mr.359.1.md

diff --git a/doc/changes/state_trackers/mr.359.1.md b/doc/changes/state_trackers/mr.359.1.md
new file mode 100644
index 000000000..9fefbca1f
--- /dev/null
+++ b/doc/changes/state_trackers/mr.359.1.md
@@ -0,0 +1,2 @@
+OpenXR: Verify that the XrViewConfigurationType is supported by the system as
+required by the OpenXR spec in xrEnumerateEnvironmentBlendModes.
diff --git a/src/xrt/state_trackers/oxr/oxr_api_system.c b/src/xrt/state_trackers/oxr/oxr_api_system.c
index 7a593d0af..e21ff4b5a 100644
--- a/src/xrt/state_trackers/oxr/oxr_api_system.c
+++ b/src/xrt/state_trackers/oxr/oxr_api_system.c
@@ -101,6 +101,23 @@ oxr_xrEnumerateViewConfigurations(
 	    viewConfigurationTypeCountOutput, viewConfigurationTypes);
 }
 
+static XrResult
+check_view_config_type(struct oxr_logger *log,
+                       struct oxr_instance *inst,
+                       XrViewConfigurationType view_conf)
+{
+	// These are always valid.
+	if (view_conf == XR_VIEW_CONFIGURATION_TYPE_PRIMARY_MONO ||
+	    view_conf == XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO) {
+		return XR_SUCCESS;
+	}
+
+	return oxr_error(
+	    log, XR_ERROR_VALIDATION_FAILURE,
+	    "(viewConfigurationType == 0x%08x) invalid view configuration type",
+	    view_conf);
+}
+
 XrResult
 oxr_xrEnumerateEnvironmentBlendModes(
     XrInstance instance,
@@ -112,10 +129,24 @@ oxr_xrEnumerateEnvironmentBlendModes(
 {
 	struct oxr_instance *inst;
 	struct oxr_logger log;
+	XrResult ret;
 	OXR_VERIFY_INSTANCE_AND_INIT_LOG(&log, instance, inst,
 	                                 "xrEnumerateEnvironmentBlendModes");
 	OXR_VERIFY_SYSTEM_AND_GET(&log, inst, systemId, sys);
 
+	ret = check_view_config_type(&log, inst, viewConfigurationType);
+	if (ret != XR_SUCCESS) {
+		return ret;
+	}
+
+	if (viewConfigurationType != sys->view_config_type) {
+		return oxr_error(&log,
+		                 XR_ERROR_VIEW_CONFIGURATION_TYPE_UNSUPPORTED,
+		                 "(viewConfigurationType == 0x%08x) "
+		                 "unsupported view configuration type",
+		                 viewConfigurationType);
+	}
+
 	return oxr_system_enumerate_blend_modes(
 	    &log, sys, viewConfigurationType, environmentBlendModeCapacityInput,
 	    environmentBlendModeCountOutput, environmentBlendModes);