diff --git a/.github/workflows/android-cts-build.yml b/.github/workflows/android-cts-build.yml
index 8d8c1796..a978e48d 100644
--- a/.github/workflows/android-cts-build.yml
+++ b/.github/workflows/android-cts-build.yml
@@ -19,10 +19,10 @@ jobs:
build-android-cts:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- name: Get modern CMake and Ninja
- uses: lukka/get-cmake@v3.26.4
+ uses: lukka/get-cmake@v3.27.7
- name: set up JDK 11
uses: actions/setup-java@v3
diff --git a/.github/workflows/android-cts-pr.yml b/.github/workflows/android-cts-pr.yml
index 42f53207..34af35a4 100644
--- a/.github/workflows/android-cts-pr.yml
+++ b/.github/workflows/android-cts-pr.yml
@@ -14,10 +14,10 @@ jobs:
build-loader:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- name: Get modern CMake and Ninja
- uses: lukka/get-cmake@v3.26.4
+ uses: lukka/get-cmake@v3.27.7
- name: set up JDK 11
uses: actions/setup-java@v3
diff --git a/.github/workflows/check_clang_format_and_codespell.yml b/.github/workflows/check_clang_format_and_codespell.yml
index b9f22d64..9eb30428 100644
--- a/.github/workflows/check_clang_format_and_codespell.yml
+++ b/.github/workflows/check_clang_format_and_codespell.yml
@@ -12,7 +12,7 @@ jobs:
container:
image: khronosgroup/docker-images:openxr-sdk.20230209
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- run: ./runClangFormat.sh
name: Run clang-format
diff --git a/.github/workflows/gradle-wrapper-validation.yml b/.github/workflows/gradle-wrapper-validation.yml
index db4f9aa0..a020debf 100644
--- a/.github/workflows/gradle-wrapper-validation.yml
+++ b/.github/workflows/gradle-wrapper-validation.yml
@@ -15,5 +15,5 @@ jobs:
name: Validation
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- uses: gradle/wrapper-validation-action@v1
diff --git a/.github/workflows/msvc-build-preset.yml b/.github/workflows/msvc-build-preset.yml
index c427dca1..56501d09 100644
--- a/.github/workflows/msvc-build-preset.yml
+++ b/.github/workflows/msvc-build-preset.yml
@@ -29,10 +29,10 @@ jobs:
VULKAN_SDK_VERSION: "1.1.114.0"
INSTALL_DIR: "${{ github.workspace }}/install"
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- name: Get modern CMake and Ninja
- uses: lukka/get-cmake@v3.26.4
+ uses: lukka/get-cmake@v3.27.7
- name: Add msbuild to PATH
uses: microsoft/setup-msbuild@v1.3
diff --git a/.gitignore b/.gitignore
index fbafc27f..9af0dd0d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -77,3 +77,7 @@ local.properties
# Output artifact
*.aar
*.pom
+clang-format-patches/
+
+# Key stores
+*.jks
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 03df11be..f2d5180d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -21,7 +21,7 @@
# It should contain only definitions that are applicable to the
# entire project and includes for the sub-directories.
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.0...3.16)
project(OPENXR)
find_package(PythonInterp 3)
diff --git a/README.md b/README.md
index f31a052d..41497546 100644
--- a/README.md
+++ b/README.md
@@ -164,6 +164,26 @@ however, this does not allow you to specify arguments with spaces and does not
allow you to set the output filename. A property set this way persists until the
device restarts.
+Interactive self-tests
+----------------------
+
+Some interactive tests are primarily a test of mechanisms within the CTS, rather
+than runtime functionality. These are labeled with the tag `[self_test]` rather
+than `[scenario]`, `[actions]`, or `[composition]`. While it is good to run
+these, and doing so may help troubleshoot failures with tests that build on,
+submission of a CTS results package. Currently, the only self-tests are for the
+PBR/glTF rendering subsystem. They synchronously load very large, artificial
+test assets, originally from the "glTF-Sample-Models" repository, to test
+specific details of the renderer.
+
+To run the self-tests, commands similar to the following can be used:
+
+ conformance_cli "[self_test][interactive]" -G d3d11 --reporter ctsxml::out=interactive_self_test_d3d11.xml
+ conformance_cli "[self_test][interactive]" -G d3d12 --reporter ctsxml::out=interactive_self_test_d3d12.xml
+ conformance_cli "[self_test][interactive]" -G vulkan --reporter ctsxml::out=interactive_self_test_vulkan.xml
+ conformance_cli "[self_test][interactive]" -G vulkan2 --reporter ctsxml::out=interactive_self_test_vulkan2.xml
+ conformance_cli "[self_test][interactive]" -G opengl --reporter ctsxml::out=interactive_self_test_opengl.xml
+
Conformance Submission Package Requirements
-------------------------------------------
diff --git a/changes/conformance/mr.2501.gl.md b/changes/conformance/mr.2501.gl.md
new file mode 100644
index 00000000..3434722b
--- /dev/null
+++ b/changes/conformance/mr.2501.gl.md
@@ -0,0 +1,6 @@
+---
+- issue.1726.gl
+- mr.2758.gl
+---
+- Improvement: Add PBR rendering subsystem for loading and rendering of glTF assets.
+- New test: Interactive (rendering) test of `XR_MSFT_controller_model` as an initial usage of the glTF/PBR rendering.
diff --git a/changes/conformance/mr.2988.gl.md b/changes/conformance/mr.2988.gl.md
new file mode 100644
index 00000000..bd61c8a0
--- /dev/null
+++ b/changes/conformance/mr.2988.gl.md
@@ -0,0 +1 @@
+Improvement: Update configuration for Doxygen source-code documentation generator/extractor.
diff --git a/changes/conformance/mr.2991.gl.md b/changes/conformance/mr.2991.gl.md
new file mode 100644
index 00000000..c6d5e973
--- /dev/null
+++ b/changes/conformance/mr.2991.gl.md
@@ -0,0 +1 @@
+Fix: comment typo in environment source.
diff --git a/specification/Makefile b/specification/Makefile
index c9f16147..8b33904f 100644
--- a/specification/Makefile
+++ b/specification/Makefile
@@ -32,7 +32,7 @@ ifneq (,$(strip $(VERY_STRICT)))
ASCIIDOC := $(ASCIIDOC) --failure-level WARN
endif
-SPECREVISION = 1.0.30
+SPECREVISION = 1.0.31
REVISION_COMPONENTS = $(subst ., ,$(SPECREVISION))
MAJORMINORVER = $(word 1,$(REVISION_COMPONENTS)).$(word 2,$(REVISION_COMPONENTS))
@@ -344,7 +344,6 @@ GITREMARK ?= from git branch: $(GITBRANCH)
ATTRIBOPTS = -a revnumber="$(SPECREVISION)" \
-a revremark="$(SPECREMARK)" \
-a apititle="$(APITITLE)" \
- -a stem=latexmath \
-a config=$(CURDIR)/config \
-a pdf-page-size=$(PAGESIZE) \
-a pdf-stylesdir=config \
diff --git a/specification/registry/xr.xml b/specification/registry/xr.xml
index 7bbddee4..1a0cd301 100644
--- a/specification/registry/xr.xml
+++ b/specification/registry/xr.xml
@@ -131,7 +131,7 @@ maintained in the default branch of the Khronos OpenXR GitHub project.
updates them automatically by processing a line at a time.
-->
// OpenXR current version number.
-#define XR_CURRENT_API_VERSION XR_MAKE_VERSION(1, 0, 30)
+#define XR_CURRENT_API_VERSION XR_MAKE_VERSION(1, 0, 31)
+
+
+
float x
@@ -1707,16 +1711,16 @@ maintained in the default branch of the Khronos OpenXR GitHub project.
XrHandMeshVertexBufferMSFT vertexBuffer
- uint32_t indexBufferKey
- uint32_t indexCapacityInput
- uint32_t indexCountOutput
- uint32_t* indices
+ uint32_t indexBufferKey
+ uint32_t indexCapacityInput
+ uint32_t indexCountOutput
+ uint32_t* indices
- XrTime vertexUpdateTime
- uint32_t vertexCapacityInput
- uint32_t vertexCountOutput
- XrHandMeshVertexMSFT* vertices
+ XrTime vertexUpdateTime
+ uint32_t vertexCapacityInput
+ uint32_t vertexCountOutput
+ XrHandMeshVertexMSFT* vertices
XrVector3f position
@@ -1978,10 +1982,10 @@ maintained in the default branch of the Khronos OpenXR GitHub project.
XrTime updateTime
- XrStructureType type
- void* next
- uint32_t componentCapacityInput
- uint32_t componentCountOutput
+ XrStructureType type
+ void* next
+ uint32_t componentCapacityInput
+ uint32_t componentCountOutput
XrSceneComponentMSFT* components
@@ -2066,23 +2070,23 @@ maintained in the default branch of the Khronos OpenXR GitHub project.
XrStructureType type
- void* next
- uint32_t vertexCapacityInput
- uint32_t vertexCountOutput
+ void* next
+ uint32_t vertexCapacityInput
+ uint32_t vertexCountOutput
XrVector3f* vertices
XrStructureType type
- void* next
- uint32_t indexCapacityInput
- uint32_t indexCountOutput
+ void* next
+ uint32_t indexCapacityInput
+ uint32_t indexCountOutput
uint32_t* indices
XrStructureType type
- void* next
- uint32_t indexCapacityInput
- uint32_t indexCountOutput
+ void* next
+ uint32_t indexCapacityInput
+ uint32_t indexCountOutput
uint16_t* indices
@@ -2103,6 +2107,38 @@ maintained in the default branch of the Khronos OpenXR GitHub project.
const XrDeserializeSceneFragmentMSFT* fragments
+
+
+
+
+ XrSceneMarkerTypeMSFT markerType
+ XrTime lastSeenTime
+ XrOffset2Df center
+ XrExtent2Df size
+
+
+ XrStructureType type
+ const void* next
+ uint32_t sceneMarkerCapacityInput
+ XrSceneMarkerMSFT* sceneMarkers
+
+
+ XrStructureType type
+ const void* next
+ uint32_t markerTypeCount
+ XrSceneMarkerTypeMSFT* markerTypes
+
+
+ XrSceneMarkerQRCodeSymbolTypeMSFT symbolType
+ uint8_t version
+
+
+ XrStructureType type
+ const void* next
+ uint32_t qrCodeCapacityInput
+ XrSceneMarkerQRCodeMSFT* qrCodes
+
+
@@ -2285,6 +2321,11 @@ maintained in the default branch of the Khronos OpenXR GitHub project.
uint32_t modelVersion
XrRenderModelFlagsFB flags
+
+ XrStructureType type
+ void* next
+ XrRenderModelFlagsFB flags
+
XrStructureType type
void* next
@@ -2302,11 +2343,6 @@ maintained in the default branch of the Khronos OpenXR GitHub project.
void* next
XrBool32 supportsRenderModelLoading
-
- XrStructureType type
- void* next
- XrRenderModelFlagsFB flags
-
@@ -3206,8 +3242,31 @@ maintained in the default branch of the Khronos OpenXR GitHub project.
const void* next
XrVirtualKeyboardMETA keyboard
+
+
+
+ XrStructureType type
+ const void* next
+ XrBool32 enabled
+
+
+
+ XrStructureType type
+ const void* next
+ XrHeadsetFitStatusML status
+ XrTime time
+
+
+
+ XrStructureType type
+ const void* next
+ XrEyeCalibrationStatusML status
+
+
+
+
@@ -3846,6 +3905,15 @@ maintained in the default branch of the Khronos OpenXR GitHub project.
+
+
+
+
+
+
+
+
+
@@ -4249,6 +4317,21 @@ maintained in the default branch of the Khronos OpenXR GitHub project.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -5044,6 +5127,24 @@ maintained in the default branch of the Khronos OpenXR GitHub project.
uint8_t* buffer
+
+
+ XrResult xrGetSceneMarkerRawDataMSFT
+ XrSceneMSFT scene
+ const XrUuidMSFT* markerId
+ uint32_t bufferCapacityInput
+ uint32_t* bufferCountOutput
+ uint8_t* buffer
+
+
+ XrResult xrGetSceneMarkerDecodedStringMSFT
+ XrSceneMSFT scene
+ const XrUuidMSFT* markerId
+ uint32_t bufferCapacityInput
+ uint32_t* bufferCountOutput
+ char* buffer
+
+
XrResult xrEnumerateDisplayRefreshRatesFB
@@ -5447,9 +5548,9 @@ maintained in the default branch of the Khronos OpenXR GitHub project.
XrResult xrEnumeratePersistedSpatialAnchorNamesMSFT
XrSpatialAnchorStoreConnectionMSFT spatialAnchorStore
- uint32_t spatialAnchorNamesCapacityInput
- uint32_t* spatialAnchorNamesCountOutput
- XrSpatialAnchorPersistenceNameMSFT* persistedAnchorNames
+ uint32_t spatialAnchorNameCapacityInput
+ uint32_t* spatialAnchorNameCountOutput
+ XrSpatialAnchorPersistenceNameMSFT* spatialAnchorNames
XrResult xrCreateSpatialAnchorFromPersistedNameMSFT
@@ -5786,6 +5887,13 @@ maintained in the default branch of the Khronos OpenXR GitHub project.
XrVirtualKeyboardMETA keyboard
const XrVirtualKeyboardTextContextChangeInfoMETA* changeInfo
+
+
+ XrResult xrEnableUserCalibrationEventsML
+ XrInstance instance
+ const XrUserCalibrationEnableEventsInfoML* enableInfo
+
+
@@ -8391,6 +8499,29 @@ maintained in the default branch of the Khronos OpenXR GitHub project.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -8448,10 +8579,25 @@ maintained in the default branch of the Khronos OpenXR GitHub project.
-
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -11257,13 +11403,6 @@ maintained in the default branch of the Khronos OpenXR GitHub project.
-
-
-
-
-
-
-
@@ -11637,6 +11776,1314 @@ maintained in the default branch of the Khronos OpenXR GitHub project.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/specification/scripts/creflectiongenerator.py b/specification/scripts/creflectiongenerator.py
index 748b56de..37087390 100644
--- a/specification/scripts/creflectiongenerator.py
+++ b/specification/scripts/creflectiongenerator.py
@@ -90,7 +90,8 @@ def _get_structs_for_protect(self, protect=None):
return ret
def endFile(self):
- assert(self.template)
+ assert self.template
+ assert self.registry
file_data = ''
unprotected_structs = self._get_structs_for_protect()
diff --git a/specification/scripts/generator.py b/specification/scripts/generator.py
index 1ec7e08e..4f5019ed 100644
--- a/specification/scripts/generator.py
+++ b/specification/scripts/generator.py
@@ -14,6 +14,7 @@
import shutil
import sys
import tempfile
+from typing import Optional
try:
from pathlib import Path
except ImportError:
@@ -1289,4 +1290,4 @@ def newline(self):
write('', file=self.outFile)
def setRegistry(self, registry):
- self.registry = registry
+ self.registry: Optional["Registry"] = registry
diff --git a/specification/scripts/jinja_helpers.py b/specification/scripts/jinja_helpers.py
index bd01f96b..dcc954ae 100644
--- a/specification/scripts/jinja_helpers.py
+++ b/specification/scripts/jinja_helpers.py
@@ -31,7 +31,7 @@ def _add_to_path():
def _undecorate(name):
"""Undecorate a name by removing the leading Xr and making it lowercase."""
lower = name.lower()
- assert(lower.startswith('xr'))
+ assert lower.startswith('xr')
return lower[2:]
diff --git a/specification/scripts/pdf_chapter_diff.py b/specification/scripts/pdf_chapter_diff.py
index 657dae82..b9431355 100755
--- a/specification/scripts/pdf_chapter_diff.py
+++ b/specification/scripts/pdf_chapter_diff.py
@@ -382,8 +382,8 @@ def fill_pair_gaps(pairs):
new_pages = [new_page for _, new_page in pairs
if new_page is not None]
- assert(orig_pages == sorted(orig_pages))
- assert(new_pages == sorted(new_pages))
+ assert orig_pages == sorted(orig_pages)
+ assert new_pages == sorted(new_pages)
fixed_pairs = []
@@ -452,7 +452,7 @@ def generate_diff_from_pairs(self, pairs):
if __name__ == "__main__":
SPECDIR = Path(__file__).resolve().parent.parent
- assert(SPECDIR.name == "specification")
+ assert SPECDIR.name == "specification"
ORIG = SPECDIR / 'compare-base' / 'openxr.pdf'
NEW = SPECDIR / 'generated' / 'out' / '1.0' / 'openxr.pdf'
DIFFDIR = SPECDIR / 'diffs'
diff --git a/specification/scripts/reserve_extensions.py b/specification/scripts/reserve_extensions.py
index cb3bf8da..abe3dde2 100755
--- a/specification/scripts/reserve_extensions.py
+++ b/specification/scripts/reserve_extensions.py
@@ -30,3 +30,6 @@ def generate_reserved_extensions(vendor: str, first_extension: int, extensions:
""".strip())
print()
+
+if __name__ == "__main__":
+ generate_reserved_extensions()
diff --git a/specification/scripts/spec_tools/algo.py b/specification/scripts/spec_tools/algo.py
index e9dff4a1..cea9a98e 100644
--- a/specification/scripts/spec_tools/algo.py
+++ b/specification/scripts/spec_tools/algo.py
@@ -83,7 +83,7 @@ def longest_common_prefix(strings):
'abc'
"""
- assert(len(strings) > 1)
+ assert len(strings) > 1
a = min(strings)
b = max(strings)
prefix = []
@@ -127,7 +127,7 @@ def longest_common_token_prefix(strings, delimiter='_'):
''
"""
- assert(len(strings) > 1)
+ assert len(strings) > 1
a = min(strings).split(delimiter)
b = max(strings).split(delimiter)
prefix_tokens = []
diff --git a/specification/scripts/spec_tools/attributes.py b/specification/scripts/spec_tools/attributes.py
index 9267247a..63b6cb1a 100644
--- a/specification/scripts/spec_tools/attributes.py
+++ b/specification/scripts/spec_tools/attributes.py
@@ -64,7 +64,7 @@ def __str__(self):
return self.full_reference
def get_human_readable(self, make_param_name=None):
- assert(self.other_param_name)
+ assert self.other_param_name
return _human_readable_deref(self.full_reference, make_param_name=make_param_name)
def __repr__(self):
@@ -97,7 +97,7 @@ def __init__(self, val):
self.member = self.param_ref_parts[0]
def get_human_readable(self, make_param_name=None):
- assert(not self.entirely_extern_sync)
+ assert not self.entirely_extern_sync
return _human_readable_deref(self.full_reference, make_param_name=make_param_name)
@staticmethod
diff --git a/specification/scripts/spec_tools/consistency_tools.py b/specification/scripts/spec_tools/consistency_tools.py
index b15b06bd..cc123c4a 100644
--- a/specification/scripts/spec_tools/consistency_tools.py
+++ b/specification/scripts/spec_tools/consistency_tools.py
@@ -1,6 +1,7 @@
#!/usr/bin/python3 -i
#
# Copyright (c) 2019 Collabora, Ltd.
+# Copyright (c) 2018-2023, The Khronos Group Inc.
#
# SPDX-License-Identifier: Apache-2.0
#
diff --git a/specification/scripts/spec_tools/conventions.py b/specification/scripts/spec_tools/conventions.py
index 8d0f0726..bb862c80 100644
--- a/specification/scripts/spec_tools/conventions.py
+++ b/specification/scripts/spec_tools/conventions.py
@@ -179,7 +179,7 @@ def _implMakeProseList(self, elements, fmt, with_verb, comma_for_two_elts=False,
Do not edit these defaults, override self.makeProseList().
"""
- assert(serial_comma) # did not implement what we did not need
+ assert serial_comma # did not implement what we did not need
if isinstance(fmt, str):
fmt = ProseListFormats.from_string(fmt)
diff --git a/specification/scripts/spec_tools/entity_db.py b/specification/scripts/spec_tools/entity_db.py
index e408c0a6..128f87a6 100644
--- a/specification/scripts/spec_tools/entity_db.py
+++ b/specification/scripts/spec_tools/entity_db.py
@@ -249,7 +249,7 @@ def findEntity(self, entity):
if alias in self._byEntity:
return self.findEntity(alias)
- assert(not "Alias without main entry!")
+ assert not "Alias without main entry!"
return None
@@ -400,7 +400,7 @@ def areAliases(self, first_entity_name, second_entity_name):
alias_set = self._aliasSetsByEntity.get(first_entity_name)
if not alias_set:
# If this assert fails, we have goofed in addAlias
- assert(second_entity_name not in self._aliasSetsByEntity)
+ assert second_entity_name not in self._aliasSetsByEntity
return False
@@ -452,7 +452,7 @@ def addAlias(self, entityName, aliasName):
other_alias_set = self._aliasSetsByEntity.get(entityName)
if alias_set and other_alias_set:
# If this fails, we need to merge sets and update.
- assert(alias_set is other_alias_set)
+ assert alias_set is other_alias_set
if not alias_set:
# Try looking by the other name.
diff --git a/specification/scripts/test_entity_db.py b/specification/scripts/test_entity_db.py
index 76fb6ade..76ac5ae9 100644
--- a/specification/scripts/test_entity_db.py
+++ b/specification/scripts/test_entity_db.py
@@ -20,11 +20,11 @@ def db():
def test_likely_recognized(db):
- assert(db.likelyRecognizedEntity('xrBla'))
- assert(db.likelyRecognizedEntity('XrBla'))
- assert(db.likelyRecognizedEntity('XR_BLA'))
+ assert db.likelyRecognizedEntity('xrBla')
+ assert db.likelyRecognizedEntity('XrBla')
+ assert db.likelyRecognizedEntity('XR_BLA')
def test_db(db):
- assert(db.findEntity('xrCreateInstance'))
- assert(db.findEntity('XRAPI_CALL'))
+ assert db.findEntity('xrCreateInstance')
+ assert db.findEntity('XRAPI_CALL')
diff --git a/specification/scripts/validitygenerator.py b/specification/scripts/validitygenerator.py
index 5b18c112..fee73641 100644
--- a/specification/scripts/validitygenerator.py
+++ b/specification/scripts/validitygenerator.py
@@ -237,7 +237,7 @@ def generateStateValidity(self, validity, command_name):
if begins_states:
for state_name in sorted(begins_states):
end_commands = self.states.get_commands(state_name, StateRelationship.END)
- assert(end_commands)
+ assert end_commands
entry = ValidityEntry(anchor=(state_name, 'beginstate'))
entry += 'flink:{} must: not be called more than once without first successfully calling '.format(
@@ -249,7 +249,7 @@ def generateStateValidity(self, validity, command_name):
if ends_states:
for state_name in sorted(ends_states):
begin_commands = self.states.get_commands(state_name, StateRelationship.BEGIN)
- assert(begin_commands)
+ assert begin_commands
entry = ValidityEntry(anchor=(state_name, 'beginstate'))
entry += 'flink:{} must: only be called after a successful call to '.format(
@@ -262,8 +262,8 @@ def generateStateValidity(self, validity, command_name):
for state_name in sorted(checks_states):
begin_commands = self.states.get_commands(state_name, StateRelationship.BEGIN)
end_commands = self.states.get_commands(state_name, StateRelationship.END)
- assert(begin_commands)
- assert(end_commands)
+ assert begin_commands
+ assert end_commands
begin_command_list = '/'.join('flink:{}'.format(command)
for command in begin_commands)
@@ -746,6 +746,7 @@ def handleRequiredBitmask(self, blockname, param, paramtype, entry):
def isBaseHeaderType(self, typename):
"""Returns true if the type is a struct that is a "base header" type."""
+ assert self.registry
info = self.registry.typedict.get(typename)
if not info:
return False
@@ -759,6 +760,7 @@ def isBaseHeaderType(self, typename):
def createValidationLineForParameter(self, blockname, param, params, typecategory):
"""Make an entire validation entry for a given parameter."""
+ assert self.registry
param_name = getElemName(param)
paramtype = getElemType(param)
see_also = None
@@ -998,17 +1000,17 @@ def makeStructureTypeValidity(self, structname):
Creates VUID named like the member name.
"""
info = self.registry.typedict.get(structname)
- assert(info is not None)
+ assert info is not None
# If this fails (meaning we have something other than a struct in here),
# then the caller is wrong:
# probably passing the wrong value for structname.
members = info.getMembers()
- assert(members)
+ assert members
param = findNamedElem(members, self.structtype_member_name)
# OpenXR gets some structs without a type field in here, so cannot assert
- # assert(param is not None)
+ # assert param is not None
if param is None:
return None
@@ -1026,7 +1028,7 @@ def makeStructureTypeValidity(self, structname):
if child_structs:
if values:
print('The struct: {} has children, it may not have a "values" attribute itself.'.format(structname))
- assert(not values)
+ assert not values
if len(child_structs) > 1:
entry += 'one of the following XrStructureType values: '
entry += ', '.join(self.makeStructureTypeFromName(child)
diff --git a/specification/scripts/xml_consistency.py b/specification/scripts/xml_consistency.py
index dda22c74..60e8f660 100755
--- a/specification/scripts/xml_consistency.py
+++ b/specification/scripts/xml_consistency.py
@@ -1,6 +1,7 @@
#!/usr/bin/python3
#
# Copyright (c) 2019 Collabora, Ltd.
+# Copyright (c) 2018-2023, The Khronos Group Inc.
#
# SPDX-License-Identifier: Apache-2.0
#
@@ -473,7 +474,7 @@ def check_command(self, name, info):
Called from check."""
t = info.elem.find('proto/type')
if t is None:
- self.record_warning("Got a command without a return type?")
+ self.record_error("Got a command without a return type?")
else:
return_type = t.text
if return_type != 'XrResult':
@@ -566,7 +567,7 @@ def check_extension(self, name, info, supported):
"but XML says", ver_from_xml)
else:
if ver_from_xml == '1':
- self.record_warning(
+ self.record_error(
"Cannot find version history in spec text - make sure it has lines starting exactly like '* Revision 1, ....'",
filename=fn)
else:
@@ -601,8 +602,8 @@ def check_extension(self, name, info, supported):
continue
# print(name, item_name)
if not item_name.endswith(vendor):
- self.record_warning("Extension-defined name", item_name,
- "has wrong or missing vendor tag: expected to end with", vendor)
+ self.record_error("Extension-defined name", item_name,
+ "has wrong or missing vendor tag: expected to end with", vendor)
if __name__ == "__main__":
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 0891b294..f94dbf95 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -28,6 +28,12 @@ include(StdFilesystemFlags)
### Dependencies
+set(XR_USE_GRAPHICS_API_OPENGL FALSE)
+set(XR_USE_GRAPHICS_API_OPENGL_ES FALSE)
+set(XR_USE_GRAPHICS_API_VULKAN FALSE)
+set(XR_USE_GRAPHICS_API_D3D11 FALSE)
+set(XR_USE_GRAPHICS_API_D3D12 FALSE)
+
set(OPENGLES_INCOMPATIBLE TRUE)
set(OPENGL_INCOMPATIBLE FALSE)
set(VULKAN_INCOMPATIBLE FALSE)
@@ -58,6 +64,7 @@ if(NOT OPENGL_INCOMPATIBLE)
find_package(OpenGL)
if(OPENGL_FOUND)
+ set(XR_USE_GRAPHICS_API_OPENGL TRUE)
add_definitions(-DXR_USE_GRAPHICS_API_OPENGL)
message(STATUS "Enabling OpenGL support")
elseif(BUILD_ALL_EXTENSIONS)
@@ -69,6 +76,7 @@ if(NOT OPENGLES_INCOMPATIBLE)
find_package(OpenGLES COMPONENTS V3 V2)
find_package(EGL)
if(OPENGLES_FOUND AND EGL_FOUND)
+ set(XR_USE_GRAPHICS_API_OPENGL_ES TRUE)
add_definitions(-DXR_USE_GRAPHICS_API_OPENGL_ES)
message(STATUS "Enabling OpenGL|ES support")
elseif(BUILD_ALL_EXTENSIONS)
@@ -82,6 +90,7 @@ if(NOT VULKAN_INCOMPATIBLE)
find_package(Vulkan)
endif()
if(Vulkan_FOUND)
+ set(XR_USE_GRAPHICS_API_VULKAN TRUE)
add_definitions(-DXR_USE_GRAPHICS_API_VULKAN)
message(STATUS "Enabling Vulkan support")
elseif(BUILD_ALL_EXTENSIONS)
@@ -261,9 +270,9 @@ if(ANDROID)
)
else()
file(GLOB glslc_folders $ENV{VULKAN_SDK}/*)
- find_program(GLSL_COMPILER glslc PATHS ${glslc_folders})
+ find_program(GLSL_COMPILER glslc PATHS ${glslc_folders} HINTS ${Vulkan_GLSLC_EXECUTABLE})
endif()
-find_program(GLSLANG_VALIDATOR glslangValidator)
+find_program(GLSLANG_VALIDATOR glslangValidator HINTS ${Vulkan_GLSLANG_VALIDATOR_EXECUTABLE})
if(GLSL_COMPILER)
message(STATUS "Found glslc: ${GLSL_COMPILER}")
elseif(GLSLANG_VALIDATOR)
@@ -307,7 +316,9 @@ endfunction()
# Not available in MinGW
if(MSVC)
+ set(XR_USE_GRAPHICS_API_D3D11 TRUE)
add_definitions(-DXR_USE_GRAPHICS_API_D3D11)
+ set(XR_USE_GRAPHICS_API_D3D12 TRUE)
add_definitions(-DXR_USE_GRAPHICS_API_D3D12)
endif()
diff --git a/src/cmake/fxc_shader.cmake b/src/cmake/fxc_shader.cmake
new file mode 100644
index 00000000..5d4cfa66
--- /dev/null
+++ b/src/cmake/fxc_shader.cmake
@@ -0,0 +1,32 @@
+# Copyright (c) 2019-2023, The Khronos Group Inc.
+#
+# SPDX-License-Identifier: Apache-2.0
+
+find_program(FXC_EXECUTABLE fxc)
+function(fxc_shader)
+ set(options)
+ set(oneValueArgs INPUT OUTPUT TYPE VARIABLE PROFILE)
+ set(multiValueArgs EXTRA_DEPENDS)
+ cmake_parse_arguments(_fxc "${options}" "${oneValueArgs}"
+ "${multiValueArgs}" ${ARGN})
+ if(FXC_EXECUTABLE)
+ set(_fxc "${FXC_EXECUTABLE}")
+ else()
+ # Hope/assume that it will be in the path at build time
+ set(_fxc "fxc.exe")
+ endif()
+ add_custom_command(
+ OUTPUT "${_fxc_OUTPUT}"
+ BYPRODUCTS "${_fxc_OUTPUT}.pdb"
+ COMMAND
+ "${_fxc}" /nologo "/Fh${_fxc_OUTPUT}"
+ "$<$,$>:/Fd${_fxc_OUTPUT}.pdb>"
+ "/T${_fxc_PROFILE}"
+ "/Vn" "${_fxc_VARIABLE}"
+ $<$:/Od> $<$:/Zss>
+ $<$,$>:/Zi> "${_fxc_INPUT}"
+ MAIN_DEPENDENCY "${_fxc_INPUT}"
+ DEPENDS "${_fxc_INPUT}" ${_fxc_EXTRA_DEPENDS}
+ USES_TERMINAL)
+
+endfunction()
diff --git a/src/cmake/glsl_shader.cmake b/src/cmake/glsl_shader.cmake
new file mode 100644
index 00000000..7fa56360
--- /dev/null
+++ b/src/cmake/glsl_shader.cmake
@@ -0,0 +1,55 @@
+# Copyright (c) 2019-2023, The Khronos Group Inc.
+#
+# SPDX-License-Identifier: Apache-2.0
+
+function(glsl_spv_shader)
+ set(options)
+ set(oneValueArgs INPUT OUTPUT STAGE VARIABLE TARGET_ENV)
+ set(multiValueArgs EXTRA_DEPENDS)
+ cmake_parse_arguments(_glsl_spv "${options}" "${oneValueArgs}"
+ "${multiValueArgs}" ${ARGN})
+
+ if(GLSL_COMPILER)
+ add_custom_command(
+ OUTPUT "${_glsl_spv_OUTPUT}"
+ COMMAND
+ "${GLSL_COMPILER}" #
+ "-mfmt=c" #
+ "-fshader-stage=${_glsl_spv_STAGE}" #
+ "${_glsl_spv_INPUT}" #
+ -o "${_glsl_spv_OUTPUT}" #
+ "--target-env=${_glsl_spv_TARGET_ENV}" #
+ $,$>,-g,> #
+ $,-O0,-O> #
+ MAIN_DEPENDENCY "${_glsl_spv_INPUT}"
+ DEPENDS "${_glsl_spv_INPUT}" ${_glsl_spv_EXTRA_DEPENDS}
+ USES_TERMINAL)
+
+ elseif(GLSLANG_VALIDATOR)
+ # Run glslangValidator if we can find it
+ add_custom_command(
+ OUTPUT "${_glsl_spv_OUTPUT}"
+ COMMAND
+ "${GLSLANG_VALIDATOR}" #
+ -S "${_glsl_spv_STAGE}" #
+ #--nan-clamp #
+ -x # output as hex
+ -o "${_glsl_spv_OUTPUT}" #
+ $<$:-gVS> #
+ $<$:-Od> #
+ $<$:-g0> #
+ "--target-env" "${_glsl_spv_TARGET_ENV}" #
+ "${_glsl_spv_INPUT}" #
+ MAIN_DEPENDENCY "${_glsl_spv_INPUT}"
+ DEPENDS "${_glsl_spv_INPUT}" ${_glsl_spv_EXTRA_DEPENDS}
+ USES_TERMINAL)
+
+ else()
+ # Use the precompiled .spv files
+ get_filename_component(glsl_src_dir "${_glsl_spv_INPUT}" DIRECTORY)
+
+ get_filename_component(glsl_name_we "${_glsl_spv_INPUT}" NAME_WE)
+ set(precompiled_file ${glsl_src_dir}/${glsl_name_we}.spv)
+ configure_file("${precompiled_file}" "${_glsl_spv_OUTPUT}" COPYONLY)
+ endif()
+endfunction()
diff --git a/src/cmake/make_includable.cmake b/src/cmake/make_includable.cmake
new file mode 100644
index 00000000..4002c3a2
--- /dev/null
+++ b/src/cmake/make_includable.cmake
@@ -0,0 +1,26 @@
+# Copyright (c) 2019-2023, The Khronos Group Inc.
+#
+# SPDX-License-Identifier: Apache-2.0
+
+# inspired by: https://stackoverflow.com/a/47801116
+function(make_includable input_file output_file)
+ cmake_parse_arguments(
+ PARSE_ARGV 2 MAKE_INCLUDABLE "" "" "REPLACE")
+
+ file(READ "${input_file}" content)
+
+ # regex replace
+ list(LENGTH MAKE_INCLUDABLE_REPLACE length)
+ while(length GREATER_EQUAL 2)
+ list(GET MAKE_INCLUDABLE_REPLACE 0 find)
+ list(GET MAKE_INCLUDABLE_REPLACE 1 replace)
+ list(REMOVE_AT MAKE_INCLUDABLE_REPLACE 0 1)
+ string(REGEX REPLACE "${find}" "${replace}" content "${content}")
+ list(LENGTH MAKE_INCLUDABLE_REPLACE length)
+ endwhile()
+
+ file(WRITE "${output_file}" "R\"raw_text(\n${content})raw_text\"")
+ # using https://stackoverflow.com/a/65945763
+ # see https://stackoverflow.com/a/56828572 for a different approach
+ set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${input_file}")
+endfunction(make_includable)
diff --git a/src/common/gfxwrapper_opengl.h b/src/common/gfxwrapper_opengl.h
index 3a229833..a8aa7386 100644
--- a/src/common/gfxwrapper_opengl.h
+++ b/src/common/gfxwrapper_opengl.h
@@ -270,12 +270,6 @@ Platform headers / declarations
#define GRAPHICS_API_OPENGL 1
#define OUTPUT_PATH ""
-#if !defined(__USE_GNU)
-// These prototypes are only included when __USE_GNU is defined but that causes other compile errors.
-extern int pthread_setname_np(pthread_t __target_thread, __const char *__name);
-extern int pthread_setaffinity_np(pthread_t thread, size_t cpusetsize, const cpu_set_t *cpuset);
-#endif // !__USE_GNU
-
#elif defined(OS_APPLE_MACOS)
// Apple is still at OpenGL 4.1
diff --git a/src/common/platform_utils.hpp b/src/common/platform_utils.hpp
index 883baef8..0b295f5c 100644
--- a/src/common/platform_utils.hpp
+++ b/src/common/platform_utils.hpp
@@ -212,7 +212,7 @@ inline std::wstring utf8_to_wide(const std::string& utf8Text) {
return {};
}
- // MultiByteToWideChar returns number of chars of the input buffer, regardless of null terminitor
+ // MultiByteToWideChar returns number of chars of the input buffer, regardless of null terminator
wideText.resize(wideLength, 0);
wchar_t* wideString = const_cast(wideText.data()); // mutable data() only exists in c++17
const int length = ::MultiByteToWideChar(CP_UTF8, 0, utf8Text.data(), (int)utf8Text.size(), wideString, wideLength);
@@ -236,7 +236,7 @@ inline std::string wide_to_utf8(const std::wstring& wideText) {
return {};
}
- // WideCharToMultiByte returns number of chars of the input buffer, regardless of null terminitor
+ // WideCharToMultiByte returns number of chars of the input buffer, regardless of null terminator
narrowText.resize(narrowLength, 0);
char* narrowString = const_cast(narrowText.data()); // mutable data() only exists in c++17
const int length =
diff --git a/src/conformance/CMakeLists.txt b/src/conformance/CMakeLists.txt
index 49d2c566..3a68b571 100644
--- a/src/conformance/CMakeLists.txt
+++ b/src/conformance/CMakeLists.txt
@@ -17,6 +17,14 @@
# Author:
#
+add_library(conformance_framework_mikktspace STATIC
+ ${PROJECT_SOURCE_DIR}/src/external/mikktspace/mikktspace.c)
+
+target_include_directories(conformance_framework_mikktspace
+ PUBLIC ${PROJECT_SOURCE_DIR}/src/external/mikktspace)
+set_target_properties(conformance_framework_mikktspace
+ PROPERTIES FOLDER ${CONFORMANCE_TESTS_FOLDER})
+
add_subdirectory(conformance_layer)
add_subdirectory(utilities)
add_subdirectory(framework)
diff --git a/src/conformance/Doxyfile b/src/conformance/Doxyfile
index 9461af39..ab92206e 100644
--- a/src/conformance/Doxyfile
+++ b/src/conformance/Doxyfile
@@ -1,40 +1,56 @@
# Copyright (c) 2019-2023, The Khronos Group Inc.
# SPDX-License-Identifier: Apache-2.0
-QUIET = YES
PROJECT_NAME = "OpenXR CTS Framework"
OUTPUT_DIRECTORY = doc
INPUT = \
framework \
+ framework/pbr \
+ framework/pbr/D3D11 \
+ framework/pbr/D3D12 \
+ framework/pbr/Vulkan \
+ framework/pbr/OpenGL \
+ framework/gltf \
conformance_cli
+ALWAYS_DETAILED_SEC = YES
+
STRIP_FROM_INC_PATH = framework
-PREDEFINED = XRC_DOXYGEN
+JAVADOC_AUTOBRIEF = YES
+
+QT_AUTOBRIEF = YES
+
+BUILTIN_STL_SUPPORT = YES
-SHOW_GROUPED_MEMB_INC = YES
-STRIP_CODE_COMMENTS = NO
-REFERENCED_BY_RELATION = YES
-REFERENCES_RELATION = YES
-ALWAYS_DETAILED_SEC = YES
-WARN_IF_UNDOCUMENTED = NO
EXTRACT_ALL = YES
-HIDE_UNDOC_RELATIONS = NO
+
EXTRACT_STATIC = YES
-INCLUDED_BY_GRAPH = YES
-MACRO_EXPANSION = YES
+CASE_SENSE_NAMES = NO
+SHOW_GROUPED_MEMB_INC = YES
-JAVADOC_AUTOBRIEF = YES
+QUIET = YES
-QT_AUTOBRIEF = YES
+WARN_IF_UNDOCUMENTED = NO
-TAB_SIZE = 4
+STRIP_CODE_COMMENTS = NO
-BUILTIN_STL_SUPPORT = YES
+REFERENCED_BY_RELATION = YES
-CASE_SENSE_NAMES = NO
+REFERENCES_RELATION = YES
GENERATE_LATEX = NO
+
+MACRO_EXPANSION = YES
+
+PREDEFINED = XRC_DOXYGEN \
+ XR_USE_GRAPHICS_API_VULKAN
+
+HIDE_UNDOC_RELATIONS = NO
+
+HAVE_DOT = YES
+
+CALLER_GRAPH = YES
diff --git a/src/conformance/build.gradle b/src/conformance/build.gradle
index 4a4c7060..1abfba0e 100644
--- a/src/conformance/build.gradle
+++ b/src/conformance/build.gradle
@@ -26,6 +26,13 @@ task copyAssets(type: Copy) {
from('conformance_test/composition_examples') {
include '*.png'
}
+ from('conformance_test/gltf_examples') {
+ include '*.png'
+ include '*.glb'
+ }
+ from('conformance_test/pbr_assets') {
+ include '*.png'
+ }
// layer manifests
from('conformance_test/android_assets') {
diff --git a/src/conformance/conformance_layer/Common.h b/src/conformance/conformance_layer/Common.h
index b1b6cb03..21f7c490 100644
--- a/src/conformance/conformance_layer/Common.h
+++ b/src/conformance/conformance_layer/Common.h
@@ -30,7 +30,7 @@
#include
#include
-#include "xr_dependencies.h"
+#include "common/xr_dependencies.h"
#include
#include
#include
diff --git a/src/conformance/conformance_test/CMakeLists.txt b/src/conformance/conformance_test/CMakeLists.txt
index fab414c3..8dbfcef6 100644
--- a/src/conformance/conformance_test/CMakeLists.txt
+++ b/src/conformance/conformance_test/CMakeLists.txt
@@ -18,7 +18,18 @@
file(GLOB LOCAL_HEADERS "*.h")
file(GLOB LOCAL_SOURCE "*.cpp")
file(GLOB ASSETS "composition_examples/*.png"
- "SourceCodePro-Regular.otf")
+ "SourceCodePro-Regular.otf"
+ "gltf_examples/*.glb"
+ "gltf_examples/*.png"
+ "pbr_assets/*.png"
+ "d3d_shaders/*.hlsl")
+file(GLOB VULKAN_SHADERS "vulkan_shaders/*.glsl")
+
+# Check to see if git-lfs is working right
+file(STRINGS gltf_examples/VertexColorTest.glb LFS_CHECK_STRINGS)
+if(LFS_CHECK_STRINGS MATCHES "https://git-lfs[.]github[.]com/spec/v1")
+ message(FATAL_ERROR "Found a git-lfs pointer file instead of the binary file that should replace it. Please install git-lfs, run 'git lfs install', and 'git lfs checkout'")
+endif()
# For including compiled shaders
include_directories(${CMAKE_CURRENT_BINARY_DIR})
diff --git a/src/conformance/conformance_test/conformance_test.cpp b/src/conformance/conformance_test/conformance_test.cpp
index f04ea6f2..eb826d55 100644
--- a/src/conformance/conformance_test/conformance_test.cpp
+++ b/src/conformance/conformance_test/conformance_test.cpp
@@ -14,7 +14,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-#include "openxr/openxr_platform_defines.h"
+#include
#define CATCH_CONFIG_NOSTDOUT
#include "conformance_framework.h"
@@ -37,7 +37,7 @@
#include
#include
-#include "xr_dependencies.h"
+#include "common/xr_dependencies.h"
#include
#include
@@ -194,12 +194,14 @@ namespace
INFO(testCase.testName);
INFO(testTags);
- // readme.md instructions use [interactive] with [actions], [composition], and [scenario]
+ // readme.md instructions use [interactive] with [actions], [composition], and [scenario].
+ // (self_test are not required for submission.)
// Let's ensure that these cover all of the possible test cases.
- const std::array interactiveTestTypes = {
+ const std::array interactiveTestTypes = {
"[actions]",
"[composition]",
"[scenario]",
+ "[self_test]",
};
if (testTags.find("[interactive]") != std::string::npos) {
{
diff --git a/src/conformance/conformance_test/gltf_examples/AlphaBlendModeTest.glb b/src/conformance/conformance_test/gltf_examples/AlphaBlendModeTest.glb
new file mode 100644
index 00000000..3c7e82a2
--- /dev/null
+++ b/src/conformance/conformance_test/gltf_examples/AlphaBlendModeTest.glb
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:688786ffa64990071cfd93c96f29917fddd3d254d3f0e48039d80d3b5ac0d8c7
+size 3017136
diff --git a/src/conformance/conformance_test/gltf_examples/AlphaBlendModeTest.glb.license b/src/conformance/conformance_test/gltf_examples/AlphaBlendModeTest.glb.license
new file mode 100644
index 00000000..18a304e2
--- /dev/null
+++ b/src/conformance/conformance_test/gltf_examples/AlphaBlendModeTest.glb.license
@@ -0,0 +1,3 @@
+SPDX-FileCopyrightText: Copyright 2018 Analytical Graphics, Inc. Model and textures by Ed Mackey.
+
+SPDX-License-Identifier: CC-BY-4.0
diff --git a/src/conformance/conformance_test/gltf_examples/AlphaBlendModeTest.png b/src/conformance/conformance_test/gltf_examples/AlphaBlendModeTest.png
new file mode 100644
index 00000000..ae72e16c
Binary files /dev/null and b/src/conformance/conformance_test/gltf_examples/AlphaBlendModeTest.png differ
diff --git a/src/conformance/conformance_test/gltf_examples/AlphaBlendModeTest.png.license b/src/conformance/conformance_test/gltf_examples/AlphaBlendModeTest.png.license
new file mode 100644
index 00000000..f479a621
--- /dev/null
+++ b/src/conformance/conformance_test/gltf_examples/AlphaBlendModeTest.png.license
@@ -0,0 +1,3 @@
+SPDX-FileCopyrightText: 2023, The Khronos Group Inc.
+
+SPDX-License-Identifier: Apache-2.0
diff --git a/src/conformance/conformance_test/gltf_examples/MetalRoughSpheres.glb b/src/conformance/conformance_test/gltf_examples/MetalRoughSpheres.glb
new file mode 100644
index 00000000..3437cc6b
--- /dev/null
+++ b/src/conformance/conformance_test/gltf_examples/MetalRoughSpheres.glb
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:450c05557b0823a10835e32c05caf77a7b175eba94516555c1c9bb084f563f01
+size 11221356
diff --git a/src/conformance/conformance_test/gltf_examples/MetalRoughSpheres.glb.license b/src/conformance/conformance_test/gltf_examples/MetalRoughSpheres.glb.license
new file mode 100644
index 00000000..e18bff8b
--- /dev/null
+++ b/src/conformance/conformance_test/gltf_examples/MetalRoughSpheres.glb.license
@@ -0,0 +1,3 @@
+SPDX-FileCopyrightText: Copyright 2017 Analytical Graphics, Inc. Model and textures by Ed Mackey.
+
+SPDX-License-Identifier: CC-BY-4.0
diff --git a/src/conformance/conformance_test/gltf_examples/MetalRoughSpheres.png b/src/conformance/conformance_test/gltf_examples/MetalRoughSpheres.png
new file mode 100644
index 00000000..f48b789b
Binary files /dev/null and b/src/conformance/conformance_test/gltf_examples/MetalRoughSpheres.png differ
diff --git a/src/conformance/conformance_test/gltf_examples/MetalRoughSpheres.png.license b/src/conformance/conformance_test/gltf_examples/MetalRoughSpheres.png.license
new file mode 100644
index 00000000..f479a621
--- /dev/null
+++ b/src/conformance/conformance_test/gltf_examples/MetalRoughSpheres.png.license
@@ -0,0 +1,3 @@
+SPDX-FileCopyrightText: 2023, The Khronos Group Inc.
+
+SPDX-License-Identifier: Apache-2.0
diff --git a/src/conformance/conformance_test/gltf_examples/MetalRoughSpheresNoTextures.glb b/src/conformance/conformance_test/gltf_examples/MetalRoughSpheresNoTextures.glb
new file mode 100644
index 00000000..fd3305d5
--- /dev/null
+++ b/src/conformance/conformance_test/gltf_examples/MetalRoughSpheresNoTextures.glb
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5e677f260ec0f366967a6e9545de2f3dab2a160e307b9bcb9d050cd2028f63f8
+size 291316
diff --git a/src/conformance/conformance_test/gltf_examples/MetalRoughSpheresNoTextures.glb.license b/src/conformance/conformance_test/gltf_examples/MetalRoughSpheresNoTextures.glb.license
new file mode 100644
index 00000000..e89b8399
--- /dev/null
+++ b/src/conformance/conformance_test/gltf_examples/MetalRoughSpheresNoTextures.glb.license
@@ -0,0 +1,7 @@
+SPDX-FileCopyrightText: Donated by Kirill Gavrilov for glTF testing. CAD Model generated by Draw Harness script using Open CASCADE Technology.
+
+SPDX-License-Identifier: CC0-1.0
+
+
+
+
diff --git a/src/conformance/conformance_test/gltf_examples/MetalRoughSpheresNoTextures.png b/src/conformance/conformance_test/gltf_examples/MetalRoughSpheresNoTextures.png
new file mode 100644
index 00000000..99b214ca
Binary files /dev/null and b/src/conformance/conformance_test/gltf_examples/MetalRoughSpheresNoTextures.png differ
diff --git a/src/conformance/conformance_test/gltf_examples/MetalRoughSpheresNoTextures.png.license b/src/conformance/conformance_test/gltf_examples/MetalRoughSpheresNoTextures.png.license
new file mode 100644
index 00000000..f479a621
--- /dev/null
+++ b/src/conformance/conformance_test/gltf_examples/MetalRoughSpheresNoTextures.png.license
@@ -0,0 +1,3 @@
+SPDX-FileCopyrightText: 2023, The Khronos Group Inc.
+
+SPDX-License-Identifier: Apache-2.0
diff --git a/src/conformance/conformance_test/gltf_examples/NormalTangentMirrorTest.glb b/src/conformance/conformance_test/gltf_examples/NormalTangentMirrorTest.glb
new file mode 100644
index 00000000..124d30c7
--- /dev/null
+++ b/src/conformance/conformance_test/gltf_examples/NormalTangentMirrorTest.glb
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:705465c5045c113c680be8631e9295db8fe8e6342b0e5f9b094b89d33d9bb12a
+size 2019856
diff --git a/src/conformance/conformance_test/gltf_examples/NormalTangentMirrorTest.glb.license b/src/conformance/conformance_test/gltf_examples/NormalTangentMirrorTest.glb.license
new file mode 100644
index 00000000..e8c85e81
--- /dev/null
+++ b/src/conformance/conformance_test/gltf_examples/NormalTangentMirrorTest.glb.license
@@ -0,0 +1,3 @@
+SPDX-FileCopyrightText: Copyright 2017-2018 Analytical Graphics, Inc. Model and textures by Ed Mackey.
+
+SPDX-License-Identifier: CC-BY-4.0
diff --git a/src/conformance/conformance_test/gltf_examples/NormalTangentMirrorTest.png b/src/conformance/conformance_test/gltf_examples/NormalTangentMirrorTest.png
new file mode 100644
index 00000000..0dd664b1
Binary files /dev/null and b/src/conformance/conformance_test/gltf_examples/NormalTangentMirrorTest.png differ
diff --git a/src/conformance/conformance_test/gltf_examples/NormalTangentMirrorTest.png.license b/src/conformance/conformance_test/gltf_examples/NormalTangentMirrorTest.png.license
new file mode 100644
index 00000000..f479a621
--- /dev/null
+++ b/src/conformance/conformance_test/gltf_examples/NormalTangentMirrorTest.png.license
@@ -0,0 +1,3 @@
+SPDX-FileCopyrightText: 2023, The Khronos Group Inc.
+
+SPDX-License-Identifier: Apache-2.0
diff --git a/src/conformance/conformance_test/gltf_examples/NormalTangentTest.glb b/src/conformance/conformance_test/gltf_examples/NormalTangentTest.glb
new file mode 100644
index 00000000..bc5c33ef
--- /dev/null
+++ b/src/conformance/conformance_test/gltf_examples/NormalTangentTest.glb
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4476f994b8789e0130313f8b24908f50b492bd3df9bfca258bad59c142955281
+size 1921176
diff --git a/src/conformance/conformance_test/gltf_examples/NormalTangentTest.glb.license b/src/conformance/conformance_test/gltf_examples/NormalTangentTest.glb.license
new file mode 100644
index 00000000..e8c85e81
--- /dev/null
+++ b/src/conformance/conformance_test/gltf_examples/NormalTangentTest.glb.license
@@ -0,0 +1,3 @@
+SPDX-FileCopyrightText: Copyright 2017-2018 Analytical Graphics, Inc. Model and textures by Ed Mackey.
+
+SPDX-License-Identifier: CC-BY-4.0
diff --git a/src/conformance/conformance_test/gltf_examples/NormalTangentTest.png b/src/conformance/conformance_test/gltf_examples/NormalTangentTest.png
new file mode 100644
index 00000000..3c063ce5
Binary files /dev/null and b/src/conformance/conformance_test/gltf_examples/NormalTangentTest.png differ
diff --git a/src/conformance/conformance_test/gltf_examples/NormalTangentTest.png.license b/src/conformance/conformance_test/gltf_examples/NormalTangentTest.png.license
new file mode 100644
index 00000000..f479a621
--- /dev/null
+++ b/src/conformance/conformance_test/gltf_examples/NormalTangentTest.png.license
@@ -0,0 +1,3 @@
+SPDX-FileCopyrightText: 2023, The Khronos Group Inc.
+
+SPDX-License-Identifier: Apache-2.0
diff --git a/src/conformance/conformance_test/gltf_examples/TextureSettingsTest.glb b/src/conformance/conformance_test/gltf_examples/TextureSettingsTest.glb
new file mode 100644
index 00000000..72a957e8
--- /dev/null
+++ b/src/conformance/conformance_test/gltf_examples/TextureSettingsTest.glb
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:44013a0602cbbdcaf703905ed47cc6b6fb49f067d7de0e1a0a568a5bbfa9d769
+size 42840
diff --git a/src/conformance/conformance_test/gltf_examples/TextureSettingsTest.glb.license b/src/conformance/conformance_test/gltf_examples/TextureSettingsTest.glb.license
new file mode 100644
index 00000000..e18bff8b
--- /dev/null
+++ b/src/conformance/conformance_test/gltf_examples/TextureSettingsTest.glb.license
@@ -0,0 +1,3 @@
+SPDX-FileCopyrightText: Copyright 2017 Analytical Graphics, Inc. Model and textures by Ed Mackey.
+
+SPDX-License-Identifier: CC-BY-4.0
diff --git a/src/conformance/conformance_test/gltf_examples/TextureSettingsTest.png b/src/conformance/conformance_test/gltf_examples/TextureSettingsTest.png
new file mode 100644
index 00000000..b9f56fe6
Binary files /dev/null and b/src/conformance/conformance_test/gltf_examples/TextureSettingsTest.png differ
diff --git a/src/conformance/conformance_test/gltf_examples/TextureSettingsTest.png.license b/src/conformance/conformance_test/gltf_examples/TextureSettingsTest.png.license
new file mode 100644
index 00000000..f479a621
--- /dev/null
+++ b/src/conformance/conformance_test/gltf_examples/TextureSettingsTest.png.license
@@ -0,0 +1,3 @@
+SPDX-FileCopyrightText: 2023, The Khronos Group Inc.
+
+SPDX-License-Identifier: Apache-2.0
diff --git a/src/conformance/conformance_test/gltf_examples/VertexColorTest.glb b/src/conformance/conformance_test/gltf_examples/VertexColorTest.glb
new file mode 100644
index 00000000..ae9ef79a
--- /dev/null
+++ b/src/conformance/conformance_test/gltf_examples/VertexColorTest.glb
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:58006bdcff8084339da0f6e24400160890638c16dbcb83c362ccaf150e8c6e10
+size 26220
diff --git a/src/conformance/conformance_test/gltf_examples/VertexColorTest.glb.license b/src/conformance/conformance_test/gltf_examples/VertexColorTest.glb.license
new file mode 100644
index 00000000..18a304e2
--- /dev/null
+++ b/src/conformance/conformance_test/gltf_examples/VertexColorTest.glb.license
@@ -0,0 +1,3 @@
+SPDX-FileCopyrightText: Copyright 2018 Analytical Graphics, Inc. Model and textures by Ed Mackey.
+
+SPDX-License-Identifier: CC-BY-4.0
diff --git a/src/conformance/conformance_test/gltf_examples/VertexColorTest.png b/src/conformance/conformance_test/gltf_examples/VertexColorTest.png
new file mode 100644
index 00000000..4f982406
Binary files /dev/null and b/src/conformance/conformance_test/gltf_examples/VertexColorTest.png differ
diff --git a/src/conformance/conformance_test/gltf_examples/VertexColorTest.png.license b/src/conformance/conformance_test/gltf_examples/VertexColorTest.png.license
new file mode 100644
index 00000000..f479a621
--- /dev/null
+++ b/src/conformance/conformance_test/gltf_examples/VertexColorTest.png.license
@@ -0,0 +1,3 @@
+SPDX-FileCopyrightText: 2023, The Khronos Group Inc.
+
+SPDX-License-Identifier: Apache-2.0
diff --git a/src/conformance/conformance_test/pbr_assets/brdf_lut.png b/src/conformance/conformance_test/pbr_assets/brdf_lut.png
new file mode 100644
index 00000000..bb5d52f0
Binary files /dev/null and b/src/conformance/conformance_test/pbr_assets/brdf_lut.png differ
diff --git a/src/conformance/conformance_test/pbr_assets/brdf_lut.png.license b/src/conformance/conformance_test/pbr_assets/brdf_lut.png.license
new file mode 100644
index 00000000..bc07946a
--- /dev/null
+++ b/src/conformance/conformance_test/pbr_assets/brdf_lut.png.license
@@ -0,0 +1,3 @@
+SPDX-FileCopyrightText: 2019-2023, The Khronos Group Inc.
+
+SPDX-License-Identifier: Apache-2.0
diff --git a/src/conformance/conformance_test/readme.md b/src/conformance/conformance_test/readme.md
index f31a052d..41497546 100644
--- a/src/conformance/conformance_test/readme.md
+++ b/src/conformance/conformance_test/readme.md
@@ -164,6 +164,26 @@ however, this does not allow you to specify arguments with spaces and does not
allow you to set the output filename. A property set this way persists until the
device restarts.
+Interactive self-tests
+----------------------
+
+Some interactive tests are primarily a test of mechanisms within the CTS, rather
+than runtime functionality. These are labeled with the tag `[self_test]` rather
+than `[scenario]`, `[actions]`, or `[composition]`. While it is good to run
+these, and doing so may help troubleshoot failures with tests that build on,
+submission of a CTS results package. Currently, the only self-tests are for the
+PBR/glTF rendering subsystem. They synchronously load very large, artificial
+test assets, originally from the "glTF-Sample-Models" repository, to test
+specific details of the renderer.
+
+To run the self-tests, commands similar to the following can be used:
+
+ conformance_cli "[self_test][interactive]" -G d3d11 --reporter ctsxml::out=interactive_self_test_d3d11.xml
+ conformance_cli "[self_test][interactive]" -G d3d12 --reporter ctsxml::out=interactive_self_test_d3d12.xml
+ conformance_cli "[self_test][interactive]" -G vulkan --reporter ctsxml::out=interactive_self_test_vulkan.xml
+ conformance_cli "[self_test][interactive]" -G vulkan2 --reporter ctsxml::out=interactive_self_test_vulkan2.xml
+ conformance_cli "[self_test][interactive]" -G opengl --reporter ctsxml::out=interactive_self_test_opengl.xml
+
Conformance Submission Package Requirements
-------------------------------------------
diff --git a/src/conformance/conformance_test/test_XR_EXT_debug_utils.cpp b/src/conformance/conformance_test/test_XR_EXT_debug_utils.cpp
index 63947d5b..828824b3 100644
--- a/src/conformance/conformance_test/test_XR_EXT_debug_utils.cpp
+++ b/src/conformance/conformance_test/test_XR_EXT_debug_utils.cpp
@@ -20,7 +20,7 @@
#include "conformance_utils.h"
#include "conformance_framework.h"
#include "utilities/throw_helpers.h"
-#include "hex_and_handles.h"
+#include "common/hex_and_handles.h"
#include
#include
diff --git a/src/conformance/conformance_test/test_XR_EXT_plane_detection.cpp b/src/conformance/conformance_test/test_XR_EXT_plane_detection.cpp
index 45119382..34c0448a 100644
--- a/src/conformance/conformance_test/test_XR_EXT_plane_detection.cpp
+++ b/src/conformance/conformance_test/test_XR_EXT_plane_detection.cpp
@@ -22,7 +22,7 @@
#include
#include
#include
-#include
+#include "common/xr_linear.h"
#include
diff --git a/src/conformance/conformance_test/test_XR_KHR_OpenGL_ES_enable.cpp b/src/conformance/conformance_test/test_XR_KHR_OpenGL_ES_enable.cpp
index 2d31abe0..01624d96 100644
--- a/src/conformance/conformance_test/test_XR_KHR_OpenGL_ES_enable.cpp
+++ b/src/conformance/conformance_test/test_XR_KHR_OpenGL_ES_enable.cpp
@@ -19,7 +19,7 @@
#include "conformance_utils.h"
#include "graphics_plugin.h"
#include "matchers.h"
-#include "xr_dependencies.h"
+#include "common/xr_dependencies.h"
#include
diff --git a/src/conformance/conformance_test/test_XR_KHR_OpenGL_enable.cpp b/src/conformance/conformance_test/test_XR_KHR_OpenGL_enable.cpp
index bad989d0..7be84beb 100644
--- a/src/conformance/conformance_test/test_XR_KHR_OpenGL_enable.cpp
+++ b/src/conformance/conformance_test/test_XR_KHR_OpenGL_enable.cpp
@@ -21,10 +21,10 @@
#include "graphics_plugin.h"
#include "matchers.h"
#include "utilities/utils.h"
+#include "common/xr_dependencies.h"
#include
#include
-#include "xr_dependencies.h"
#include
#include
diff --git a/src/conformance/conformance_test/test_XR_KHR_convert_timespec_time.cpp b/src/conformance/conformance_test/test_XR_KHR_convert_timespec_time.cpp
index 9af5aba1..b68c0c66 100644
--- a/src/conformance/conformance_test/test_XR_KHR_convert_timespec_time.cpp
+++ b/src/conformance/conformance_test/test_XR_KHR_convert_timespec_time.cpp
@@ -21,7 +21,7 @@
#include
// Include all dependencies of openxr_platform as configured
-#include "xr_dependencies.h"
+#include "common/xr_dependencies.h"
#include
#ifdef XR_USE_PLATFORM_WIN32
diff --git a/src/conformance/conformance_test/test_XR_KHR_visibility_mask.cpp b/src/conformance/conformance_test/test_XR_KHR_visibility_mask.cpp
index 2fd3a31e..204a0339 100644
--- a/src/conformance/conformance_test/test_XR_KHR_visibility_mask.cpp
+++ b/src/conformance/conformance_test/test_XR_KHR_visibility_mask.cpp
@@ -26,7 +26,7 @@
#include "utilities/Geometry.h"
#include "utilities/types_and_constants.h"
-#include "nonstd/type.hpp"
+#include
#include
#include
diff --git a/src/conformance/conformance_test/test_XR_KHR_vulkan_enable.cpp b/src/conformance/conformance_test/test_XR_KHR_vulkan_enable.cpp
index 3a6cc0f8..2a8622e7 100644
--- a/src/conformance/conformance_test/test_XR_KHR_vulkan_enable.cpp
+++ b/src/conformance/conformance_test/test_XR_KHR_vulkan_enable.cpp
@@ -20,8 +20,8 @@
#include "conformance_utils.h"
#include "graphics_plugin.h"
#include "matchers.h"
+#include "common/xr_dependencies.h"
#include "utilities/types_and_constants.h"
-#include "xr_dependencies.h"
#include
#include
diff --git a/src/conformance/conformance_test/test_XR_KHR_vulkan_enable2.cpp b/src/conformance/conformance_test/test_XR_KHR_vulkan_enable2.cpp
index 6f2b1f62..dfa1cbb8 100644
--- a/src/conformance/conformance_test/test_XR_KHR_vulkan_enable2.cpp
+++ b/src/conformance/conformance_test/test_XR_KHR_vulkan_enable2.cpp
@@ -20,8 +20,8 @@
#include "conformance_utils.h"
#include "graphics_plugin.h"
#include "matchers.h"
+#include "common/xr_dependencies.h"
#include "utilities/types_and_constants.h"
-#include "xr_dependencies.h"
#include
#include
diff --git a/src/conformance/conformance_test/test_XR_KHR_win32_convert_performance_counter_time.cpp b/src/conformance/conformance_test/test_XR_KHR_win32_convert_performance_counter_time.cpp
index fb43b0a2..284cb2b9 100644
--- a/src/conformance/conformance_test/test_XR_KHR_win32_convert_performance_counter_time.cpp
+++ b/src/conformance/conformance_test/test_XR_KHR_win32_convert_performance_counter_time.cpp
@@ -22,7 +22,7 @@
#include
// Include all dependencies of openxr_platform as configured
-#include "xr_dependencies.h"
+#include "common/xr_dependencies.h"
#include
#include
diff --git a/src/conformance/conformance_test/test_XR_MSFT_controller_model.cpp b/src/conformance/conformance_test/test_XR_MSFT_controller_model.cpp
index ce6833fc..8c9aef8c 100644
--- a/src/conformance/conformance_test/test_XR_MSFT_controller_model.cpp
+++ b/src/conformance/conformance_test/test_XR_MSFT_controller_model.cpp
@@ -6,25 +6,43 @@
#include "composition_utils.h"
#include "conformance_framework.h"
#include "conformance_utils.h"
+#include "controller_animation_handler.h"
+#include "gltf.h"
+#include "graphics_plugin.h"
+#include "input_testinputdevice.h"
#include "report.h"
#include "two_call.h"
#include "two_call_struct_metadata.h"
#include "two_call_struct_tests.h"
#include "common/hex_and_handles.h"
+#include "utilities/throw_helpers.h"
+#include "utilities/types_and_constants.h"
#include "utilities/utils.h"
+#include
#include
#include
+#include
#include
+#include
+#include
#include
-#include
+#include
+#include
+#include