ernie-renderer 0.2.0.dev5__tar.gz → 0.2.0.dev7__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of ernie-renderer might be problematic. Click here for more details.

Files changed (118) hide show
  1. {ernie_renderer-0.2.0.dev5 → ernie_renderer-0.2.0.dev7}/.dockerignore +2 -1
  2. ernie_renderer-0.2.0.dev7/.github/scripts/coverage_badge.py +37 -0
  3. {ernie_renderer-0.2.0.dev5 → ernie_renderer-0.2.0.dev7}/.github/workflows/ci.yml +93 -0
  4. {ernie_renderer-0.2.0.dev5 → ernie_renderer-0.2.0.dev7}/.gitignore +4 -2
  5. {ernie_renderer-0.2.0.dev5 → ernie_renderer-0.2.0.dev7}/.pre-commit-config.yaml +2 -0
  6. {ernie_renderer-0.2.0.dev5 → ernie_renderer-0.2.0.dev7}/CMakeLists.txt +17 -1
  7. {ernie_renderer-0.2.0.dev5 → ernie_renderer-0.2.0.dev7}/CMakePresets.json +24 -0
  8. {ernie_renderer-0.2.0.dev5 → ernie_renderer-0.2.0.dev7}/PKG-INFO +2 -1
  9. {ernie_renderer-0.2.0.dev5 → ernie_renderer-0.2.0.dev7}/README.md +1 -0
  10. {ernie_renderer-0.2.0.dev5 → ernie_renderer-0.2.0.dev7}/cmake/ErnieTesting.cmake +6 -0
  11. ernie_renderer-0.2.0.dev7/cmake/third_party/dlpack.cmake +17 -0
  12. ernie_renderer-0.2.0.dev7/cmake/third_party/glm.cmake +20 -0
  13. ernie_renderer-0.2.0.dev7/cmake/third_party/json.cmake +14 -0
  14. ernie_renderer-0.2.0.dev7/cmake/third_party/tracy.cmake +29 -0
  15. ernie_renderer-0.2.0.dev7/docs/README.md +7 -0
  16. ernie_renderer-0.2.0.dev7/docs/index.md +1 -0
  17. ernie_renderer-0.2.0.dev7/docs/requirements.txt +1 -0
  18. ernie_renderer-0.2.0.dev7/ernie/core/CMakeLists.txt +27 -0
  19. ernie_renderer-0.2.0.dev7/ernie/core/disk_cache.cpp +94 -0
  20. ernie_renderer-0.2.0.dev7/ernie/core/disk_cache.h +59 -0
  21. ernie_renderer-0.2.0.dev7/ernie/core/linear_algebra.h +125 -0
  22. ernie_renderer-0.2.0.dev7/ernie/core/log.cpp +65 -0
  23. ernie_renderer-0.2.0.dev7/ernie/core/log.h +40 -0
  24. ernie_renderer-0.2.0.dev7/ernie/core/mapped_file.cpp +96 -0
  25. ernie_renderer-0.2.0.dev7/ernie/core/mapped_file.h +39 -0
  26. ernie_renderer-0.2.0.dev7/ernie/core/math.h +84 -0
  27. ernie_renderer-0.2.0.dev7/ernie/core/noise.cpp +160 -0
  28. ernie_renderer-0.2.0.dev7/ernie/core/noise.h +87 -0
  29. ernie_renderer-0.2.0.dev7/ernie/core/numbers.h +41 -0
  30. ernie_renderer-0.2.0.dev7/ernie/core/parallel.h +38 -0
  31. ernie_renderer-0.2.0.dev7/ernie/core/profile.h +45 -0
  32. ernie_renderer-0.2.0.dev7/ernie/core/profile_report.cpp +242 -0
  33. ernie_renderer-0.2.0.dev7/ernie/core/profile_report.h +110 -0
  34. ernie_renderer-0.2.0.dev7/ernie/core/profiler.cpp +189 -0
  35. ernie_renderer-0.2.0.dev7/ernie/core/profiler.h +125 -0
  36. ernie_renderer-0.2.0.dev7/ernie/core/random.h +126 -0
  37. ernie_renderer-0.2.0.dev7/ernie/core/tensor.cpp +330 -0
  38. ernie_renderer-0.2.0.dev7/ernie/core/tensor.h +249 -0
  39. ernie_renderer-0.2.0.dev7/ernie/core/version.cpp +37 -0
  40. ernie_renderer-0.2.0.dev7/ernie/core/version.h +26 -0
  41. ernie_renderer-0.2.0.dev7/ernie/core/worker_pool.h +97 -0
  42. {ernie_renderer-0.2.0.dev5 → ernie_renderer-0.2.0.dev7}/ernie/device/vulkan_devices.cpp +4 -4
  43. ernie_renderer-0.2.0.dev7/ernie/physics/CMakeLists.txt +14 -0
  44. ernie_renderer-0.2.0.dev7/ernie/physics/astronomy.cpp +142 -0
  45. ernie_renderer-0.2.0.dev7/ernie/physics/astronomy.h +110 -0
  46. ernie_renderer-0.2.0.dev7/ernie/physics/atmosphere.cpp +451 -0
  47. ernie_renderer-0.2.0.dev7/ernie/physics/atmosphere.h +330 -0
  48. ernie_renderer-0.2.0.dev7/ernie/physics/cloud.cpp +580 -0
  49. ernie_renderer-0.2.0.dev7/ernie/physics/cloud.h +223 -0
  50. ernie_renderer-0.2.0.dev7/ernie/physics/constants.h +26 -0
  51. ernie_renderer-0.2.0.dev7/ernie/physics/reflectance_library.cpp +48 -0
  52. ernie_renderer-0.2.0.dev7/ernie/physics/reflectance_library.h +47 -0
  53. ernie_renderer-0.2.0.dev7/ernie/physics/reflectance_table.h +5596 -0
  54. ernie_renderer-0.2.0.dev7/ernie/physics/regolith.cpp +302 -0
  55. ernie_renderer-0.2.0.dev7/ernie/physics/regolith.h +160 -0
  56. ernie_renderer-0.2.0.dev7/ernie/physics/scattering.cpp +371 -0
  57. ernie_renderer-0.2.0.dev7/ernie/physics/scattering.h +284 -0
  58. ernie_renderer-0.2.0.dev7/ernie/physics/solar.cpp +38 -0
  59. ernie_renderer-0.2.0.dev7/ernie/physics/solar.h +30 -0
  60. ernie_renderer-0.2.0.dev7/ernie/physics/solar_table.h +3069 -0
  61. ernie_renderer-0.2.0.dev7/ernie/physics/spectrum.cpp +546 -0
  62. ernie_renderer-0.2.0.dev7/ernie/physics/spectrum.h +270 -0
  63. ernie_renderer-0.2.0.dev7/ernie/test/CMakeLists.txt +65 -0
  64. ernie_renderer-0.2.0.dev7/ernie/test/core/disk_cache_test.cpp +65 -0
  65. ernie_renderer-0.2.0.dev7/ernie/test/core/linear_algebra_test.cpp +52 -0
  66. ernie_renderer-0.2.0.dev7/ernie/test/core/log_test.cpp +35 -0
  67. ernie_renderer-0.2.0.dev7/ernie/test/core/mapped_file_test.cpp +41 -0
  68. ernie_renderer-0.2.0.dev7/ernie/test/core/math_test.cpp +55 -0
  69. ernie_renderer-0.2.0.dev7/ernie/test/core/noise_test.cpp +85 -0
  70. ernie_renderer-0.2.0.dev7/ernie/test/core/parallel_test.cpp +29 -0
  71. ernie_renderer-0.2.0.dev7/ernie/test/core/profile_report_test.cpp +120 -0
  72. ernie_renderer-0.2.0.dev7/ernie/test/core/profiler_test.cpp +62 -0
  73. ernie_renderer-0.2.0.dev7/ernie/test/core/random_test.cpp +140 -0
  74. ernie_renderer-0.2.0.dev7/ernie/test/core/tensor_test.cpp +236 -0
  75. ernie_renderer-0.2.0.dev7/ernie/test/core/version_test.cpp +26 -0
  76. ernie_renderer-0.2.0.dev7/ernie/test/core/worker_pool_test.cpp +69 -0
  77. ernie_renderer-0.2.0.dev7/ernie/test/physics/astronomy_test.cpp +66 -0
  78. ernie_renderer-0.2.0.dev7/ernie/test/physics/atmosphere_test.cpp +239 -0
  79. ernie_renderer-0.2.0.dev7/ernie/test/physics/cloud_test.cpp +201 -0
  80. ernie_renderer-0.2.0.dev7/ernie/test/physics/reflectance_library_test.cpp +50 -0
  81. ernie_renderer-0.2.0.dev7/ernie/test/physics/regolith_test.cpp +110 -0
  82. ernie_renderer-0.2.0.dev7/ernie/test/physics/scattering_test.cpp +266 -0
  83. ernie_renderer-0.2.0.dev7/ernie/test/physics/solar_test.cpp +47 -0
  84. ernie_renderer-0.2.0.dev7/ernie/test/physics/spectrum_test.cpp +178 -0
  85. ernie_renderer-0.2.0.dev7/mkdocs.yml +21 -0
  86. ernie_renderer-0.2.0.dev5/ernie/core/CMakeLists.txt +0 -5
  87. ernie_renderer-0.2.0.dev5/ernie/core/version.cpp +0 -12
  88. ernie_renderer-0.2.0.dev5/ernie/core/version.h +0 -14
  89. ernie_renderer-0.2.0.dev5/ernie/physics/CMakeLists.txt +0 -3
  90. ernie_renderer-0.2.0.dev5/ernie/test/CMakeLists.txt +0 -29
  91. ernie_renderer-0.2.0.dev5/ernie/test/core/version_test.cpp +0 -14
  92. {ernie_renderer-0.2.0.dev5 → ernie_renderer-0.2.0.dev7}/.clang-format +0 -0
  93. {ernie_renderer-0.2.0.dev5 → ernie_renderer-0.2.0.dev7}/.clang-tidy +0 -0
  94. {ernie_renderer-0.2.0.dev5 → ernie_renderer-0.2.0.dev7}/.gersemirc +0 -0
  95. {ernie_renderer-0.2.0.dev5 → ernie_renderer-0.2.0.dev7}/.gitattributes +0 -0
  96. {ernie_renderer-0.2.0.dev5 → ernie_renderer-0.2.0.dev7}/.github/scripts/install-lavapipe-windows.sh +0 -0
  97. {ernie_renderer-0.2.0.dev5 → ernie_renderer-0.2.0.dev7}/Dockerfile +0 -0
  98. {ernie_renderer-0.2.0.dev5 → ernie_renderer-0.2.0.dev7}/LICENSE +0 -0
  99. {ernie_renderer-0.2.0.dev5 → ernie_renderer-0.2.0.dev7}/cmake/ErniePackaging.cmake +0 -0
  100. {ernie_renderer-0.2.0.dev5 → ernie_renderer-0.2.0.dev7}/cmake/third_party/googletest.cmake +0 -0
  101. {ernie_renderer-0.2.0.dev5 → ernie_renderer-0.2.0.dev7}/cmake/third_party/nanobind.cmake +0 -0
  102. {ernie_renderer-0.2.0.dev5 → ernie_renderer-0.2.0.dev7}/cmake/third_party/volk.cmake +0 -0
  103. {ernie_renderer-0.2.0.dev5 → ernie_renderer-0.2.0.dev7}/cmake/third_party/vulkan_headers.cmake +0 -0
  104. {ernie_renderer-0.2.0.dev5 → ernie_renderer-0.2.0.dev7}/ernie/CMakeLists.txt +0 -0
  105. {ernie_renderer-0.2.0.dev5 → ernie_renderer-0.2.0.dev7}/ernie/app/CMakeLists.txt +0 -0
  106. {ernie_renderer-0.2.0.dev5 → ernie_renderer-0.2.0.dev7}/ernie/app/main.cpp +0 -0
  107. {ernie_renderer-0.2.0.dev5 → ernie_renderer-0.2.0.dev7}/ernie/device/CMakeLists.txt +0 -0
  108. {ernie_renderer-0.2.0.dev5 → ernie_renderer-0.2.0.dev7}/ernie/device/vulkan_devices.h +0 -0
  109. {ernie_renderer-0.2.0.dev5 → ernie_renderer-0.2.0.dev7}/ernie/graph/CMakeLists.txt +0 -0
  110. {ernie_renderer-0.2.0.dev5 → ernie_renderer-0.2.0.dev7}/ernie/io/CMakeLists.txt +0 -0
  111. {ernie_renderer-0.2.0.dev5 → ernie_renderer-0.2.0.dev7}/ernie/python/CMakeLists.txt +0 -0
  112. {ernie_renderer-0.2.0.dev5 → ernie_renderer-0.2.0.dev7}/ernie/python/ernie/__init__.py +0 -0
  113. {ernie_renderer-0.2.0.dev5 → ernie_renderer-0.2.0.dev7}/ernie/python/module.cpp +0 -0
  114. {ernie_renderer-0.2.0.dev5 → ernie_renderer-0.2.0.dev7}/ernie/render/CMakeLists.txt +0 -0
  115. {ernie_renderer-0.2.0.dev5 → ernie_renderer-0.2.0.dev7}/ernie/scene/CMakeLists.txt +0 -0
  116. {ernie_renderer-0.2.0.dev5 → ernie_renderer-0.2.0.dev7}/ernie/test/device/vulkan_devices_test.cpp +0 -0
  117. {ernie_renderer-0.2.0.dev5 → ernie_renderer-0.2.0.dev7}/ernie/test/python/test_package.py +0 -0
  118. {ernie_renderer-0.2.0.dev5 → ernie_renderer-0.2.0.dev7}/pyproject.toml +0 -0
@@ -3,4 +3,5 @@ build
3
3
  dist
4
4
  .deps
5
5
  .venv
6
- docs/requirements
6
+ requirements
7
+ site
@@ -0,0 +1,37 @@
1
+ # SPDX-License-Identifier: BSD-3-Clause
2
+ """Writes a shields.io endpoint badge and a job summary from gcovr's JSON summary."""
3
+
4
+ import json
5
+ import os
6
+ import sys
7
+ from pathlib import Path
8
+
9
+
10
+ def badge_colour(percent: float) -> str:
11
+ if percent >= 80.0:
12
+ return "brightgreen"
13
+ if percent >= 70.0:
14
+ return "green"
15
+ if percent >= 60.0:
16
+ return "yellow"
17
+ return "red"
18
+
19
+
20
+ def main(report: Path) -> None:
21
+ summary = json.loads((report / "summary.json").read_text())
22
+ lines = summary["line_percent"]
23
+ branches = summary["branch_percent"]
24
+ badge = {
25
+ "schemaVersion": 1,
26
+ "label": "coverage",
27
+ "message": f"{lines:.1f}%",
28
+ "color": badge_colour(lines),
29
+ }
30
+ (report / "badge.json").write_text(json.dumps(badge))
31
+ if step_summary := os.environ.get("GITHUB_STEP_SUMMARY"):
32
+ with open(step_summary, "a") as out:
33
+ out.write(f"### Coverage\n\nLines {lines:.1f}%, branches {branches:.1f}%\n")
34
+
35
+
36
+ if __name__ == "__main__":
37
+ main(Path(sys.argv[1]))
@@ -156,6 +156,99 @@ jobs:
156
156
  - name: Test
157
157
  run: ctest --preset ci -j4
158
158
 
159
+ # Line and branch coverage of the C++ library from every test on Linux and lavapipe.
160
+ coverage:
161
+ needs: version
162
+ runs-on: ubuntu-24.04
163
+ timeout-minutes: 60
164
+ env:
165
+ ERNIE_TEST_REQUIRE_VULKAN: "1"
166
+ steps:
167
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
168
+ - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
169
+ with:
170
+ python-version: "3.12"
171
+ - run: python -m pip install nanobind ninja pytest gcovr
172
+ - uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
173
+ with:
174
+ path: |
175
+ .deps/*-src
176
+ .deps/*-subbuild
177
+ key: deps-${{ runner.os }}-${{ hashFiles('cmake/third_party/**') }}
178
+ - name: Install lavapipe
179
+ run: |
180
+ sudo apt-get update
181
+ sudo apt-get install -y mesa-vulkan-drivers libvulkan1
182
+ icd=$(find /usr/share/vulkan/icd.d -name 'lvp_icd*.json' | head -n1)
183
+ echo "VK_DRIVER_FILES=$icd" >> "$GITHUB_ENV"
184
+ echo "VK_ICD_FILENAMES=$icd" >> "$GITHUB_ENV"
185
+ - name: Configure
186
+ run: >
187
+ cmake --preset coverage
188
+ "-DPython_EXECUTABLE=$(python -c 'import sys; print(sys.executable)')"
189
+ -DERNIE_TEST_PYTHON=python
190
+ - name: Build
191
+ run: cmake --build --preset coverage --parallel 4
192
+ - name: Test
193
+ run: ctest --preset coverage -j4
194
+ - name: Report
195
+ run: |
196
+ mkdir -p coverage
197
+ gcovr --root . --filter 'ernie/' --exclude 'ernie/test/' --exclude '.*_table\.h' \
198
+ --object-directory build/coverage \
199
+ --html-details coverage/index.html --json-summary coverage/summary.json --print-summary
200
+ python .github/scripts/coverage_badge.py coverage
201
+ - uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
202
+ with:
203
+ name: coverage
204
+ path: coverage
205
+ retention-days: 14
206
+
207
+ # The documentation, built strictly so broken links and warnings fail.
208
+ docs:
209
+ runs-on: ubuntu-24.04
210
+ timeout-minutes: 10
211
+ steps:
212
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
213
+ - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
214
+ with:
215
+ python-version: "3.12"
216
+ - run: python -m pip install -r docs/requirements.txt
217
+ - run: mkdocs build --strict
218
+ - uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
219
+ with:
220
+ name: docs
221
+ path: site
222
+ retention-days: 14
223
+
224
+ # The project site on GitHub Pages, from main: the docs, with the coverage report and its badge
225
+ # under coverage/.
226
+ pages:
227
+ needs: [lint, test, docs, coverage]
228
+ if: github.event_name == 'push' && github.ref == 'refs/heads/main'
229
+ runs-on: ubuntu-24.04
230
+ timeout-minutes: 10
231
+ permissions:
232
+ pages: write
233
+ id-token: write
234
+ environment:
235
+ name: github-pages
236
+ url: ${{ steps.deploy.outputs.page_url }}
237
+ steps:
238
+ - uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
239
+ with:
240
+ name: docs
241
+ path: site
242
+ - uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
243
+ with:
244
+ name: coverage
245
+ path: site/coverage
246
+ - uses: actions/upload-pages-artifact@fc324d3547104276b827a68afc52ff2a11cc49c9 # v5.0.0
247
+ with:
248
+ path: site
249
+ - id: deploy
250
+ uses: actions/deploy-pages@368f82528645a54fb793d4d04e342629a3f51346 # v5.0.1
251
+
159
252
  wheel:
160
253
  name: wheel (${{ matrix.platform }})
161
254
  needs: version
@@ -1,9 +1,11 @@
1
- # Local design documents
2
- docs/requirements/
1
+ # Local design documents and tools, not yet part of the repository
2
+ /requirements/
3
+ /tools/
3
4
 
4
5
  # Build output and fetched dependencies
5
6
  build/
6
7
  dist/
8
+ site/
7
9
  .deps/
8
10
  *.egg-info/
9
11
  __pycache__/
@@ -16,6 +16,8 @@ repos:
16
16
  hooks:
17
17
  - id: clang-format
18
18
  types_or: [c++, c]
19
+ # Data tables written by tools/, kept exactly as generated.
20
+ exclude: _table\.h$
19
21
 
20
22
  - repo: https://github.com/astral-sh/ruff-pre-commit
21
23
  rev: v0.17.1
@@ -1,5 +1,9 @@
1
1
  # SPDX-License-Identifier: BSD-3-Clause
2
2
  cmake_minimum_required(VERSION 3.21)
3
+ # Extracted downloads get the time they were extracted, so they rebuild when they change.
4
+ if(POLICY CMP0135)
5
+ cmake_policy(SET CMP0135 NEW)
6
+ endif()
3
7
 
4
8
  project(
5
9
  Ernie
@@ -10,7 +14,7 @@ project(
10
14
  )
11
15
 
12
16
  # Pre-release suffix such as .dev12, written by CI.
13
- set(ERNIE_VERSION_SUFFIX ".dev5" CACHE STRING "Pre-release suffix of Ernie's version")
17
+ set(ERNIE_VERSION_SUFFIX ".dev7" CACHE STRING "Pre-release suffix of Ernie's version")
14
18
  set(ERNIE_VERSION "${PROJECT_VERSION}${ERNIE_VERSION_SUFFIX}")
15
19
 
16
20
  option(ERNIE_BUILD_TESTS "Build Ernie's tests" OFF)
@@ -18,6 +22,8 @@ option(ERNIE_BUILD_PYTHON "Build Ernie's Python module" OFF)
18
22
  option(ERNIE_BUILD_APP "Build the ernie program" ON)
19
23
  option(ERNIE_WARNINGS_AS_ERRORS "Treat compiler warnings as errors" OFF)
20
24
  option(ERNIE_ASSERTS "Keep assertions in optimised builds" OFF)
25
+ option(ERNIE_TRACY "Send profiling zones to the Tracy profiler too" OFF)
26
+ option(ERNIE_COVERAGE "Instrument Ernie for code coverage (GCC or Clang)" OFF)
21
27
 
22
28
  get_property(ernie_multi_config GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
23
29
  if(PROJECT_IS_TOP_LEVEL AND NOT ernie_multi_config AND NOT CMAKE_BUILD_TYPE)
@@ -34,6 +40,10 @@ if(ERNIE_BUILD_PYTHON)
34
40
  set(CMAKE_POSITION_INDEPENDENT_CODE ON)
35
41
  endif()
36
42
 
43
+ include(cmake/third_party/glm.cmake)
44
+ include(cmake/third_party/dlpack.cmake)
45
+ include(cmake/third_party/json.cmake)
46
+ include(cmake/third_party/tracy.cmake)
37
47
  include(cmake/third_party/vulkan_headers.cmake)
38
48
  include(cmake/third_party/volk.cmake)
39
49
 
@@ -68,6 +78,12 @@ if(ERNIE_ASSERTS)
68
78
  INTERFACE $<IF:$<CXX_COMPILER_ID:MSVC>,/UNDEBUG,-UNDEBUG>
69
79
  )
70
80
  endif()
81
+ if(ERNIE_COVERAGE)
82
+ # Unoptimised, so every line maps to its own counters; atomic, as ParallelFor's threads share
83
+ # them.
84
+ target_compile_options(ernie_build_options INTERFACE --coverage -fprofile-update=atomic -O0 -g)
85
+ target_link_options(ernie_build_options INTERFACE --coverage)
86
+ endif()
71
87
 
72
88
  add_subdirectory(ernie)
73
89
 
@@ -32,6 +32,19 @@
32
32
  "FETCHCONTENT_BASE_DIR": "${sourceDir}/.deps"
33
33
  }
34
34
  },
35
+ {
36
+ "name": "coverage",
37
+ "displayName": "Coverage",
38
+ "description": "Instrumented for code coverage, as CI measures it, in build/coverage",
39
+ "inherits": "dev",
40
+ "binaryDir": "${sourceDir}/build/coverage",
41
+ "cacheVariables": {
42
+ "CMAKE_BUILD_TYPE": "Debug",
43
+ "ERNIE_COVERAGE": "ON",
44
+ "ERNIE_WARNINGS_AS_ERRORS": "ON",
45
+ "FETCHCONTENT_BASE_DIR": "${sourceDir}/.deps"
46
+ }
47
+ },
35
48
  {
36
49
  "name": "package",
37
50
  "displayName": "Packages",
@@ -57,6 +70,10 @@
57
70
  "name": "ci",
58
71
  "configurePreset": "ci"
59
72
  },
73
+ {
74
+ "name": "coverage",
75
+ "configurePreset": "coverage"
76
+ },
60
77
  {
61
78
  "name": "package",
62
79
  "configurePreset": "package"
@@ -76,6 +93,13 @@
76
93
  "output": {
77
94
  "outputOnFailure": true
78
95
  }
96
+ },
97
+ {
98
+ "name": "coverage",
99
+ "configurePreset": "coverage",
100
+ "output": {
101
+ "outputOnFailure": true
102
+ }
79
103
  }
80
104
  ]
81
105
  }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ernie-renderer
3
- Version: 0.2.0.dev5
3
+ Version: 0.2.0.dev7
4
4
  Summary: Efficient Renderer for Natural and Interplanetary Environments: a physically based, spectral Vulkan ray tracer
5
5
  Author: Alex Maietta
6
6
  License-Expression: BSD-3-Clause
@@ -16,6 +16,7 @@ Description-Content-Type: text/markdown
16
16
  > 🚧 **This project is in active beta development.** This means the API is unstable, features may be added or removed, and breaking changes are likely to occur frequently and without notice as the design is refined.
17
17
 
18
18
  [![CI](https://github.com/alexmaietta/ernie/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/alexmaietta/ernie/actions/workflows/ci.yml)
19
+ [![Coverage](https://img.shields.io/endpoint?url=https%3A%2F%2Falexmaietta.github.io%2Fernie%2Fcoverage%2Fbadge.json)](https://alexmaietta.github.io/ernie/coverage/)
19
20
  [![Release](https://img.shields.io/github/v/release/alexmaietta/ernie?include_prereleases&sort=semver&color=orange)](https://github.com/alexmaietta/ernie/releases)
20
21
  [![PyPI](https://img.shields.io/pypi/v/ernie-renderer?color=3775A9&logo=pypi&logoColor=white)](https://pypi.org/project/ernie-renderer/)
21
22
  [![Docs](https://img.shields.io/badge/docs-latest-8A2BE2)](https://alexmaietta.github.io/ernie/)
@@ -1,6 +1,7 @@
1
1
  > 🚧 **This project is in active beta development.** This means the API is unstable, features may be added or removed, and breaking changes are likely to occur frequently and without notice as the design is refined.
2
2
 
3
3
  [![CI](https://github.com/alexmaietta/ernie/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/alexmaietta/ernie/actions/workflows/ci.yml)
4
+ [![Coverage](https://img.shields.io/endpoint?url=https%3A%2F%2Falexmaietta.github.io%2Fernie%2Fcoverage%2Fbadge.json)](https://alexmaietta.github.io/ernie/coverage/)
4
5
  [![Release](https://img.shields.io/github/v/release/alexmaietta/ernie?include_prereleases&sort=semver&color=orange)](https://github.com/alexmaietta/ernie/releases)
5
6
  [![PyPI](https://img.shields.io/pypi/v/ernie-renderer?color=3775A9&logo=pypi&logoColor=white)](https://pypi.org/project/ernie-renderer/)
6
7
  [![Docs](https://img.shields.io/badge/docs-latest-8A2BE2)](https://alexmaietta.github.io/ernie/)
@@ -9,6 +9,12 @@ set(ERNIE_TEST_TIMEOUT_unit 10)
9
9
  set(ERNIE_TEST_TIMEOUT_gpu 60)
10
10
  set(ERNIE_TEST_TIMEOUT_accuracy 120)
11
11
  set(ERNIE_TEST_TIMEOUT_python 120)
12
+ # Unoptimised, instrumented coverage builds run several times slower.
13
+ if(ERNIE_COVERAGE)
14
+ foreach(label unit gpu accuracy python)
15
+ math(EXPR ERNIE_TEST_TIMEOUT_${label} "${ERNIE_TEST_TIMEOUT_${label}} * 10")
16
+ endforeach()
17
+ endif()
12
18
 
13
19
  # Adds the gtest executable ernie_tests_<name> and registers its tests as ernie.<name>.<test>.
14
20
  function(ernie_add_test_suite name)
@@ -0,0 +1,17 @@
1
+ # SPDX-License-Identifier: BSD-3-Clause
2
+ set(ERNIE_DEP_VERSION_dlpack v1.3 CACHE STRING "Tag of DLPack to fetch")
3
+ mark_as_advanced(ERNIE_DEP_VERSION_dlpack)
4
+
5
+ include(FetchContent)
6
+ FetchContent_Declare(
7
+ dlpack
8
+ GIT_REPOSITORY https://github.com/dmlc/dlpack.git
9
+ GIT_TAG ${ERNIE_DEP_VERSION_dlpack}
10
+ GIT_SHALLOW TRUE
11
+ SOURCE_SUBDIR no-build
12
+ )
13
+ FetchContent_MakeAvailable(dlpack)
14
+
15
+ # The tensor exchange header, nothing to build.
16
+ add_library(ernie_dlpack INTERFACE)
17
+ target_include_directories(ernie_dlpack SYSTEM INTERFACE "${dlpack_SOURCE_DIR}/include")
@@ -0,0 +1,20 @@
1
+ # SPDX-License-Identifier: BSD-3-Clause
2
+ set(ERNIE_DEP_VERSION_glm 1.0.3 CACHE STRING "Tag of glm to fetch")
3
+ mark_as_advanced(ERNIE_DEP_VERSION_glm)
4
+
5
+ set(GLM_BUILD_LIBRARY OFF)
6
+ set(GLM_BUILD_TESTS OFF)
7
+ set(GLM_BUILD_INSTALL OFF)
8
+
9
+ include(FetchContent)
10
+ FetchContent_Declare(
11
+ glm
12
+ GIT_REPOSITORY https://github.com/g-truc/glm.git
13
+ GIT_TAG ${ERNIE_DEP_VERSION_glm}
14
+ GIT_SHALLOW TRUE
15
+ )
16
+ FetchContent_MakeAvailable(glm)
17
+
18
+ add_library(ernie_glm INTERFACE)
19
+ target_include_directories(ernie_glm SYSTEM INTERFACE "${glm_SOURCE_DIR}")
20
+ target_compile_definitions(ernie_glm INTERFACE GLM_FORCE_DEPTH_ZERO_TO_ONE)
@@ -0,0 +1,14 @@
1
+ # SPDX-License-Identifier: BSD-3-Clause
2
+ set(ERNIE_DEP_VERSION_json v3.12.0 CACHE STRING "Release of nlohmann/json to fetch")
3
+ mark_as_advanced(ERNIE_DEP_VERSION_json)
4
+
5
+ # The release's single-include archive, without the repository's tests and history.
6
+ include(FetchContent)
7
+ FetchContent_Declare(
8
+ nlohmann_json
9
+ URL https://github.com/nlohmann/json/releases/download/${ERNIE_DEP_VERSION_json}/include.zip
10
+ )
11
+ FetchContent_MakeAvailable(nlohmann_json)
12
+
13
+ add_library(ernie_json INTERFACE)
14
+ target_include_directories(ernie_json SYSTEM INTERFACE "${nlohmann_json_SOURCE_DIR}/single_include")
@@ -0,0 +1,29 @@
1
+ # SPDX-License-Identifier: BSD-3-Clause
2
+ set(ERNIE_DEP_VERSION_tracy v0.14.1 CACHE STRING "Tag of Tracy to fetch")
3
+ mark_as_advanced(ERNIE_DEP_VERSION_tracy)
4
+
5
+ # Ernie's profiling zones also go to Tracy when ERNIE_TRACY is on; otherwise this is empty.
6
+ add_library(ernie_tracy INTERFACE)
7
+ if(NOT ERNIE_TRACY)
8
+ return()
9
+ endif()
10
+
11
+ # Collect only while a profiler is connected, so a profiling build runs at full speed until then.
12
+ set(TRACY_ENABLE ON CACHE BOOL "" FORCE)
13
+ set(TRACY_ON_DEMAND ON CACHE BOOL "" FORCE)
14
+
15
+ include(FetchContent)
16
+ FetchContent_Declare(
17
+ tracy
18
+ GIT_REPOSITORY https://github.com/wolfpld/tracy.git
19
+ GIT_TAG ${ERNIE_DEP_VERSION_tracy}
20
+ GIT_SHALLOW TRUE
21
+ )
22
+ FetchContent_MakeAvailable(tracy)
23
+ set_target_properties(
24
+ TracyClient
25
+ PROPERTIES POSITION_INDEPENDENT_CODE ON COMPILE_WARNING_AS_ERROR OFF
26
+ )
27
+
28
+ target_link_libraries(ernie_tracy INTERFACE Tracy::TracyClient)
29
+ target_compile_definitions(ernie_tracy INTERFACE ERNIE_TRACY=1)
@@ -0,0 +1,7 @@
1
+ # Docs
2
+
3
+ ```sh
4
+ python -m pip install -r docs/requirements.txt
5
+ mkdocs serve # live preview at http://127.0.0.1:8000
6
+ mkdocs build # static site in site/
7
+ ```
@@ -0,0 +1 @@
1
+ # Ernie
@@ -0,0 +1 @@
1
+ mkdocs==1.6.1
@@ -0,0 +1,27 @@
1
+ # SPDX-License-Identifier: BSD-3-Clause
2
+ add_library(
3
+ ernie_core
4
+ STATIC
5
+ disk_cache.cpp
6
+ log.cpp
7
+ mapped_file.cpp
8
+ noise.cpp
9
+ profile_report.cpp
10
+ profiler.cpp
11
+ tensor.cpp
12
+ version.cpp
13
+ )
14
+ target_include_directories(ernie_core PUBLIC "${PROJECT_SOURCE_DIR}")
15
+ target_link_libraries(
16
+ ernie_core
17
+ PUBLIC ernie_glm ernie_dlpack ernie_tracy
18
+ PRIVATE ernie_json ernie_build_options
19
+ )
20
+ find_package(Threads REQUIRED)
21
+ target_link_libraries(ernie_core PUBLIC Threads::Threads)
22
+ set_source_files_properties(
23
+ version.cpp
24
+ PROPERTIES
25
+ COMPILE_DEFINITIONS
26
+ "ERNIE_VERSION_STRING=\"${ERNIE_VERSION}\";ERNIE_BUILD_TYPE=\"$<CONFIG>\""
27
+ )
@@ -0,0 +1,94 @@
1
+ // SPDX-License-Identifier: BSD-3-Clause
2
+ /// @file disk_cache.cpp
3
+ /// @brief Cache folder lookup and cache key hashing.
4
+ #include "ernie/core/disk_cache.h"
5
+
6
+ #include <cstdio>
7
+ #include <cstdlib>
8
+ #include <fstream>
9
+ #include <random>
10
+ #include <system_error>
11
+
12
+ namespace ernie {
13
+
14
+ std::optional<std::filesystem::path> CacheDirectory(const char* variable, std::string_view folder) {
15
+ namespace fs = std::filesystem;
16
+ if (const char* own = std::getenv(variable)) {
17
+ const std::string_view value(own);
18
+ if (value.empty() || value == "0") {
19
+ return std::nullopt;
20
+ }
21
+ return fs::path(value);
22
+ }
23
+ if (const char* xdg = std::getenv("XDG_CACHE_HOME"); xdg != nullptr && *xdg != '\0') {
24
+ return fs::path(xdg) / "ernie" / folder;
25
+ }
26
+ #if defined(_WIN32)
27
+ if (const char* local = std::getenv("LOCALAPPDATA"); local != nullptr && *local != '\0') {
28
+ return fs::path(local) / "ernie" / folder;
29
+ }
30
+ #else
31
+ if (const char* home = std::getenv("HOME"); home != nullptr && *home != '\0') {
32
+ return fs::path(home) / ".cache" / "ernie" / folder;
33
+ }
34
+ #endif
35
+ return std::nullopt;
36
+ }
37
+
38
+ void CacheKey::Add(std::string_view text) {
39
+ const std::uint64_t size = text.size();
40
+ Bytes(&size, sizeof(size));
41
+ Bytes(text.data(), text.size());
42
+ }
43
+
44
+ std::string CacheKey::Hex() const {
45
+ char text[33];
46
+ std::snprintf(text, sizeof(text), "%016llx%016llx", static_cast<unsigned long long>(hashes_[0]),
47
+ static_cast<unsigned long long>(hashes_[1]));
48
+ return text;
49
+ }
50
+
51
+ void CacheKey::Bytes(const void* data, std::size_t size) {
52
+ const auto* bytes = static_cast<const unsigned char*>(data);
53
+ for (std::uint64_t& hash : hashes_) {
54
+ for (std::size_t i = 0; i < size; ++i) {
55
+ hash = (hash ^ bytes[i]) * 0x100000001b3ull;
56
+ }
57
+ }
58
+ }
59
+
60
+ std::optional<std::vector<float>> ReadCachedFloats(const std::filesystem::path& path,
61
+ std::size_t count) {
62
+ std::ifstream in(path, std::ios::binary);
63
+ std::vector<float> values(count);
64
+ const auto bytes = static_cast<std::streamsize>(count * sizeof(float));
65
+ if (in.read(reinterpret_cast<char*>(values.data()), bytes) &&
66
+ in.peek() == std::ifstream::traits_type::eof()) {
67
+ return values;
68
+ }
69
+ return std::nullopt;
70
+ }
71
+
72
+ void WriteCachedFloats(const std::filesystem::path& path, std::span<const float> values) {
73
+ namespace fs = std::filesystem;
74
+ fs::path partial = path;
75
+ partial += ".part" + std::to_string(std::random_device{}());
76
+ std::error_code error;
77
+ fs::create_directories(path.parent_path(), error);
78
+ {
79
+ std::ofstream out(partial, std::ios::binary);
80
+ out.write(reinterpret_cast<const char*>(values.data()),
81
+ static_cast<std::streamsize>(values.size_bytes()));
82
+ if (!out) {
83
+ error = std::make_error_code(std::errc::io_error);
84
+ }
85
+ }
86
+ if (!error) {
87
+ fs::rename(partial, path, error);
88
+ }
89
+ if (error) {
90
+ fs::remove(partial, error);
91
+ }
92
+ }
93
+
94
+ } // namespace ernie
@@ -0,0 +1,59 @@
1
+ // SPDX-License-Identifier: BSD-3-Clause
2
+ /// @file disk_cache.h
3
+ /// @brief Cache folders and keys for caches kept between runs.
4
+ #pragma once
5
+
6
+ #include <array>
7
+ #include <cstddef>
8
+ #include <cstdint>
9
+ #include <filesystem>
10
+ #include <optional>
11
+ #include <span>
12
+ #include <string>
13
+ #include <string_view>
14
+ #include <vector>
15
+
16
+ namespace ernie {
17
+
18
+ /// @brief Finds where one of Ernie's caches keeps its files.
19
+ /// @param variable An environment variable naming the folder; empty
20
+ /// or "0" disables the cache.
21
+ /// @param folder The subfolder of the user's cache folder used
22
+ /// when `variable` is unset (`$XDG_CACHE_HOME/ernie`,
23
+ /// `~/.cache/ernie`, `%LOCALAPPDATA%\ernie`).
24
+ /// @return The folder, or nothing when the cache is disabled.
25
+ std::optional<std::filesystem::path> CacheDirectory(const char* variable, std::string_view folder);
26
+
27
+ /// @brief A 128-bit key over everything a cache entry depends on.
28
+ /// Two 64-bit FNV-1a hashes from different seeds; each piece is
29
+ /// length-prefixed.
30
+ class CacheKey {
31
+ public:
32
+ /// @brief Mixes a piece of text into the key.
33
+ /// @param text The piece to add.
34
+ void Add(std::string_view text);
35
+
36
+ /// @return The key as 32 hex digits, for a file name.
37
+ std::string Hex() const;
38
+
39
+ private:
40
+ void Bytes(const void* data, std::size_t size);
41
+
42
+ std::array<std::uint64_t, 2> hashes_{0xcbf29ce484222325ull, 0x84222325cbf29ce4ull};
43
+ };
44
+
45
+ /// @brief Reads a cache file of floats.
46
+ /// @param path The file.
47
+ /// @param count How many floats it must hold.
48
+ /// @return The floats, or nothing if the file is missing or holds a different amount.
49
+ std::optional<std::vector<float>> ReadCachedFloats(const std::filesystem::path& path,
50
+ std::size_t count);
51
+
52
+ /// @brief Writes a cache file of floats so that no reader ever sees part of it: written beside it,
53
+ /// then renamed over it. Failures leave no file behind and are otherwise ignored, since a cache
54
+ /// can always be rebuilt.
55
+ /// @param path The file; its folder is created if needed.
56
+ /// @param values The floats.
57
+ void WriteCachedFloats(const std::filesystem::path& path, std::span<const float> values);
58
+
59
+ } // namespace ernie