ernie-renderer 0.2.0.dev3__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.
- {ernie_renderer-0.2.0.dev3 → ernie_renderer-0.2.0.dev7}/.dockerignore +2 -1
- ernie_renderer-0.2.0.dev7/.github/scripts/coverage_badge.py +37 -0
- {ernie_renderer-0.2.0.dev3 → ernie_renderer-0.2.0.dev7}/.github/workflows/ci.yml +119 -17
- {ernie_renderer-0.2.0.dev3 → ernie_renderer-0.2.0.dev7}/.gitignore +4 -2
- {ernie_renderer-0.2.0.dev3 → ernie_renderer-0.2.0.dev7}/.pre-commit-config.yaml +2 -0
- {ernie_renderer-0.2.0.dev3 → ernie_renderer-0.2.0.dev7}/CMakeLists.txt +17 -1
- {ernie_renderer-0.2.0.dev3 → ernie_renderer-0.2.0.dev7}/CMakePresets.json +24 -0
- {ernie_renderer-0.2.0.dev3 → ernie_renderer-0.2.0.dev7}/PKG-INFO +3 -3
- {ernie_renderer-0.2.0.dev3 → ernie_renderer-0.2.0.dev7}/README.md +2 -2
- {ernie_renderer-0.2.0.dev3 → ernie_renderer-0.2.0.dev7}/cmake/ErniePackaging.cmake +2 -0
- {ernie_renderer-0.2.0.dev3 → ernie_renderer-0.2.0.dev7}/cmake/ErnieTesting.cmake +6 -0
- ernie_renderer-0.2.0.dev7/cmake/third_party/dlpack.cmake +17 -0
- ernie_renderer-0.2.0.dev7/cmake/third_party/glm.cmake +20 -0
- ernie_renderer-0.2.0.dev7/cmake/third_party/json.cmake +14 -0
- ernie_renderer-0.2.0.dev7/cmake/third_party/tracy.cmake +29 -0
- ernie_renderer-0.2.0.dev7/docs/README.md +7 -0
- ernie_renderer-0.2.0.dev7/docs/index.md +1 -0
- ernie_renderer-0.2.0.dev7/docs/requirements.txt +1 -0
- ernie_renderer-0.2.0.dev7/ernie/core/CMakeLists.txt +27 -0
- ernie_renderer-0.2.0.dev7/ernie/core/disk_cache.cpp +94 -0
- ernie_renderer-0.2.0.dev7/ernie/core/disk_cache.h +59 -0
- ernie_renderer-0.2.0.dev7/ernie/core/linear_algebra.h +125 -0
- ernie_renderer-0.2.0.dev7/ernie/core/log.cpp +65 -0
- ernie_renderer-0.2.0.dev7/ernie/core/log.h +40 -0
- ernie_renderer-0.2.0.dev7/ernie/core/mapped_file.cpp +96 -0
- ernie_renderer-0.2.0.dev7/ernie/core/mapped_file.h +39 -0
- ernie_renderer-0.2.0.dev7/ernie/core/math.h +84 -0
- ernie_renderer-0.2.0.dev7/ernie/core/noise.cpp +160 -0
- ernie_renderer-0.2.0.dev7/ernie/core/noise.h +87 -0
- ernie_renderer-0.2.0.dev7/ernie/core/numbers.h +41 -0
- ernie_renderer-0.2.0.dev7/ernie/core/parallel.h +38 -0
- ernie_renderer-0.2.0.dev7/ernie/core/profile.h +45 -0
- ernie_renderer-0.2.0.dev7/ernie/core/profile_report.cpp +242 -0
- ernie_renderer-0.2.0.dev7/ernie/core/profile_report.h +110 -0
- ernie_renderer-0.2.0.dev7/ernie/core/profiler.cpp +189 -0
- ernie_renderer-0.2.0.dev7/ernie/core/profiler.h +125 -0
- ernie_renderer-0.2.0.dev7/ernie/core/random.h +126 -0
- ernie_renderer-0.2.0.dev7/ernie/core/tensor.cpp +330 -0
- ernie_renderer-0.2.0.dev7/ernie/core/tensor.h +249 -0
- ernie_renderer-0.2.0.dev7/ernie/core/version.cpp +37 -0
- ernie_renderer-0.2.0.dev7/ernie/core/version.h +26 -0
- ernie_renderer-0.2.0.dev7/ernie/core/worker_pool.h +97 -0
- {ernie_renderer-0.2.0.dev3 → ernie_renderer-0.2.0.dev7}/ernie/device/vulkan_devices.cpp +4 -4
- ernie_renderer-0.2.0.dev7/ernie/physics/CMakeLists.txt +14 -0
- ernie_renderer-0.2.0.dev7/ernie/physics/astronomy.cpp +142 -0
- ernie_renderer-0.2.0.dev7/ernie/physics/astronomy.h +110 -0
- ernie_renderer-0.2.0.dev7/ernie/physics/atmosphere.cpp +451 -0
- ernie_renderer-0.2.0.dev7/ernie/physics/atmosphere.h +330 -0
- ernie_renderer-0.2.0.dev7/ernie/physics/cloud.cpp +580 -0
- ernie_renderer-0.2.0.dev7/ernie/physics/cloud.h +223 -0
- ernie_renderer-0.2.0.dev7/ernie/physics/constants.h +26 -0
- ernie_renderer-0.2.0.dev7/ernie/physics/reflectance_library.cpp +48 -0
- ernie_renderer-0.2.0.dev7/ernie/physics/reflectance_library.h +47 -0
- ernie_renderer-0.2.0.dev7/ernie/physics/reflectance_table.h +5596 -0
- ernie_renderer-0.2.0.dev7/ernie/physics/regolith.cpp +302 -0
- ernie_renderer-0.2.0.dev7/ernie/physics/regolith.h +160 -0
- ernie_renderer-0.2.0.dev7/ernie/physics/scattering.cpp +371 -0
- ernie_renderer-0.2.0.dev7/ernie/physics/scattering.h +284 -0
- ernie_renderer-0.2.0.dev7/ernie/physics/solar.cpp +38 -0
- ernie_renderer-0.2.0.dev7/ernie/physics/solar.h +30 -0
- ernie_renderer-0.2.0.dev7/ernie/physics/solar_table.h +3069 -0
- ernie_renderer-0.2.0.dev7/ernie/physics/spectrum.cpp +546 -0
- ernie_renderer-0.2.0.dev7/ernie/physics/spectrum.h +270 -0
- ernie_renderer-0.2.0.dev7/ernie/test/CMakeLists.txt +65 -0
- ernie_renderer-0.2.0.dev7/ernie/test/core/disk_cache_test.cpp +65 -0
- ernie_renderer-0.2.0.dev7/ernie/test/core/linear_algebra_test.cpp +52 -0
- ernie_renderer-0.2.0.dev7/ernie/test/core/log_test.cpp +35 -0
- ernie_renderer-0.2.0.dev7/ernie/test/core/mapped_file_test.cpp +41 -0
- ernie_renderer-0.2.0.dev7/ernie/test/core/math_test.cpp +55 -0
- ernie_renderer-0.2.0.dev7/ernie/test/core/noise_test.cpp +85 -0
- ernie_renderer-0.2.0.dev7/ernie/test/core/parallel_test.cpp +29 -0
- ernie_renderer-0.2.0.dev7/ernie/test/core/profile_report_test.cpp +120 -0
- ernie_renderer-0.2.0.dev7/ernie/test/core/profiler_test.cpp +62 -0
- ernie_renderer-0.2.0.dev7/ernie/test/core/random_test.cpp +140 -0
- ernie_renderer-0.2.0.dev7/ernie/test/core/tensor_test.cpp +236 -0
- ernie_renderer-0.2.0.dev7/ernie/test/core/version_test.cpp +26 -0
- ernie_renderer-0.2.0.dev7/ernie/test/core/worker_pool_test.cpp +69 -0
- ernie_renderer-0.2.0.dev7/ernie/test/physics/astronomy_test.cpp +66 -0
- ernie_renderer-0.2.0.dev7/ernie/test/physics/atmosphere_test.cpp +239 -0
- ernie_renderer-0.2.0.dev7/ernie/test/physics/cloud_test.cpp +201 -0
- ernie_renderer-0.2.0.dev7/ernie/test/physics/reflectance_library_test.cpp +50 -0
- ernie_renderer-0.2.0.dev7/ernie/test/physics/regolith_test.cpp +110 -0
- ernie_renderer-0.2.0.dev7/ernie/test/physics/scattering_test.cpp +266 -0
- ernie_renderer-0.2.0.dev7/ernie/test/physics/solar_test.cpp +47 -0
- ernie_renderer-0.2.0.dev7/ernie/test/physics/spectrum_test.cpp +178 -0
- ernie_renderer-0.2.0.dev7/mkdocs.yml +21 -0
- ernie_renderer-0.2.0.dev3/ernie/core/CMakeLists.txt +0 -5
- ernie_renderer-0.2.0.dev3/ernie/core/version.cpp +0 -12
- ernie_renderer-0.2.0.dev3/ernie/core/version.h +0 -14
- ernie_renderer-0.2.0.dev3/ernie/physics/CMakeLists.txt +0 -3
- ernie_renderer-0.2.0.dev3/ernie/test/CMakeLists.txt +0 -29
- ernie_renderer-0.2.0.dev3/ernie/test/core/version_test.cpp +0 -14
- {ernie_renderer-0.2.0.dev3 → ernie_renderer-0.2.0.dev7}/.clang-format +0 -0
- {ernie_renderer-0.2.0.dev3 → ernie_renderer-0.2.0.dev7}/.clang-tidy +0 -0
- {ernie_renderer-0.2.0.dev3 → ernie_renderer-0.2.0.dev7}/.gersemirc +0 -0
- {ernie_renderer-0.2.0.dev3 → ernie_renderer-0.2.0.dev7}/.gitattributes +0 -0
- {ernie_renderer-0.2.0.dev3 → ernie_renderer-0.2.0.dev7}/.github/scripts/install-lavapipe-windows.sh +0 -0
- {ernie_renderer-0.2.0.dev3 → ernie_renderer-0.2.0.dev7}/Dockerfile +0 -0
- {ernie_renderer-0.2.0.dev3 → ernie_renderer-0.2.0.dev7}/LICENSE +0 -0
- {ernie_renderer-0.2.0.dev3 → ernie_renderer-0.2.0.dev7}/cmake/third_party/googletest.cmake +0 -0
- {ernie_renderer-0.2.0.dev3 → ernie_renderer-0.2.0.dev7}/cmake/third_party/nanobind.cmake +0 -0
- {ernie_renderer-0.2.0.dev3 → ernie_renderer-0.2.0.dev7}/cmake/third_party/volk.cmake +0 -0
- {ernie_renderer-0.2.0.dev3 → ernie_renderer-0.2.0.dev7}/cmake/third_party/vulkan_headers.cmake +0 -0
- {ernie_renderer-0.2.0.dev3 → ernie_renderer-0.2.0.dev7}/ernie/CMakeLists.txt +0 -0
- {ernie_renderer-0.2.0.dev3 → ernie_renderer-0.2.0.dev7}/ernie/app/CMakeLists.txt +0 -0
- {ernie_renderer-0.2.0.dev3 → ernie_renderer-0.2.0.dev7}/ernie/app/main.cpp +0 -0
- {ernie_renderer-0.2.0.dev3 → ernie_renderer-0.2.0.dev7}/ernie/device/CMakeLists.txt +0 -0
- {ernie_renderer-0.2.0.dev3 → ernie_renderer-0.2.0.dev7}/ernie/device/vulkan_devices.h +0 -0
- {ernie_renderer-0.2.0.dev3 → ernie_renderer-0.2.0.dev7}/ernie/graph/CMakeLists.txt +0 -0
- {ernie_renderer-0.2.0.dev3 → ernie_renderer-0.2.0.dev7}/ernie/io/CMakeLists.txt +0 -0
- {ernie_renderer-0.2.0.dev3 → ernie_renderer-0.2.0.dev7}/ernie/python/CMakeLists.txt +0 -0
- {ernie_renderer-0.2.0.dev3 → ernie_renderer-0.2.0.dev7}/ernie/python/ernie/__init__.py +0 -0
- {ernie_renderer-0.2.0.dev3 → ernie_renderer-0.2.0.dev7}/ernie/python/module.cpp +0 -0
- {ernie_renderer-0.2.0.dev3 → ernie_renderer-0.2.0.dev7}/ernie/render/CMakeLists.txt +0 -0
- {ernie_renderer-0.2.0.dev3 → ernie_renderer-0.2.0.dev7}/ernie/scene/CMakeLists.txt +0 -0
- {ernie_renderer-0.2.0.dev3 → ernie_renderer-0.2.0.dev7}/ernie/test/device/vulkan_devices_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev3 → ernie_renderer-0.2.0.dev7}/ernie/test/python/test_package.py +0 -0
- {ernie_renderer-0.2.0.dev3 → ernie_renderer-0.2.0.dev7}/pyproject.toml +0 -0
|
@@ -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
|
|
@@ -213,10 +306,17 @@ jobs:
|
|
|
213
306
|
|
|
214
307
|
# DEB, RPM and TGZ of the ernie program, built on manylinux_2_34 so they run on glibc 2.34 or later.
|
|
215
308
|
packages:
|
|
309
|
+
name: packages (${{ matrix.arch }})
|
|
216
310
|
needs: version
|
|
217
|
-
runs-on:
|
|
311
|
+
runs-on: ${{ matrix.runner }}
|
|
218
312
|
timeout-minutes: 30
|
|
219
|
-
|
|
313
|
+
strategy:
|
|
314
|
+
fail-fast: false
|
|
315
|
+
matrix:
|
|
316
|
+
include:
|
|
317
|
+
- { arch: x86_64, runner: ubuntu-24.04 }
|
|
318
|
+
- { arch: aarch64, runner: ubuntu-24.04-arm }
|
|
319
|
+
container: quay.io/pypa/manylinux_2_34_${{ matrix.arch }}
|
|
220
320
|
steps:
|
|
221
321
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
222
322
|
- name: Version
|
|
@@ -234,7 +334,7 @@ jobs:
|
|
|
234
334
|
cd build/package && cpack -G "DEB;RPM;TGZ"
|
|
235
335
|
- uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
|
|
236
336
|
with:
|
|
237
|
-
name: packages-linux
|
|
337
|
+
name: packages-linux-${{ matrix.arch }}
|
|
238
338
|
path: |
|
|
239
339
|
build/package/packages/*.deb
|
|
240
340
|
build/package/packages/*.rpm
|
|
@@ -242,35 +342,37 @@ jobs:
|
|
|
242
342
|
|
|
243
343
|
# Each package installed on a clean distribution, where the program must find lavapipe.
|
|
244
344
|
package-test:
|
|
245
|
-
name: package-test (${{ matrix.image }})
|
|
345
|
+
name: package-test (${{ matrix.image }}, ${{ matrix.arch }})
|
|
246
346
|
needs: packages
|
|
247
|
-
runs-on: ubuntu-24.04
|
|
347
|
+
runs-on: ${{ matrix.arch == 'aarch64' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }}
|
|
248
348
|
timeout-minutes: 15
|
|
249
349
|
strategy:
|
|
250
350
|
fail-fast: false
|
|
251
351
|
matrix:
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
- { image: "ubuntu:24.04", kind: deb }
|
|
255
|
-
- { image: "debian:12", kind: deb }
|
|
256
|
-
- { image: "rockylinux/rockylinux:9", kind: rpm }
|
|
352
|
+
arch: [x86_64, aarch64]
|
|
353
|
+
image: ["ubuntu:22.04", "ubuntu:24.04", "debian:12", "rockylinux/rockylinux:9"]
|
|
257
354
|
container: ${{ matrix.image }}
|
|
258
355
|
steps:
|
|
259
356
|
- uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
|
|
260
357
|
with:
|
|
261
|
-
name: packages-linux
|
|
358
|
+
name: packages-linux-${{ matrix.arch }}
|
|
262
359
|
- name: Install
|
|
263
|
-
if: matrix.
|
|
360
|
+
if: ${{ !startsWith(matrix.image, 'rockylinux') }}
|
|
264
361
|
run: |
|
|
265
362
|
apt-get update
|
|
266
363
|
apt-get install -y --no-install-recommends ./*.deb mesa-vulkan-drivers
|
|
267
364
|
- name: Install
|
|
268
|
-
if: matrix.
|
|
269
|
-
run: dnf install -y ./*.rpm
|
|
365
|
+
if: ${{ startsWith(matrix.image, 'rockylinux') }}
|
|
366
|
+
run: dnf install -y ./*.rpm
|
|
367
|
+
# Rocky 9 has no lavapipe for aarch64, so there the program is only run, not given a device.
|
|
368
|
+
- name: Install lavapipe
|
|
369
|
+
if: ${{ startsWith(matrix.image, 'rockylinux') && matrix.arch == 'x86_64' }}
|
|
370
|
+
run: dnf install -y mesa-vulkan-drivers
|
|
270
371
|
- name: Run
|
|
271
|
-
run:
|
|
272
|
-
|
|
273
|
-
|
|
372
|
+
run: ernie --version
|
|
373
|
+
- name: List devices
|
|
374
|
+
if: ${{ !(startsWith(matrix.image, 'rockylinux') && matrix.arch == 'aarch64') }}
|
|
375
|
+
run: ernie --devices | grep -i llvmpipe
|
|
274
376
|
|
|
275
377
|
# The ernie program's image, built from source; pushed to GHCR from main (dev) and release tags.
|
|
276
378
|
docker:
|
|
@@ -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 ".
|
|
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.
|
|
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
|
[](https://github.com/alexmaietta/ernie/actions/workflows/ci.yml)
|
|
19
|
+
[](https://alexmaietta.github.io/ernie/coverage/)
|
|
19
20
|
[](https://github.com/alexmaietta/ernie/releases)
|
|
20
21
|
[](https://pypi.org/project/ernie-renderer/)
|
|
21
22
|
[](https://alexmaietta.github.io/ernie/)
|
|
@@ -109,8 +110,7 @@ sudo dnf install ./ernie-*.rpm
|
|
|
109
110
|
The `ernie` program is also published as a Docker image.
|
|
110
111
|
|
|
111
112
|
```sh
|
|
112
|
-
docker run --rm --gpus all -v "$PWD:/out" ghcr.io/alexmaietta/ernie
|
|
113
|
-
--demo demo_atmosphere_earth --viewer null --output /out/earth.png
|
|
113
|
+
docker run --rm --gpus all -v "$PWD:/out" ghcr.io/alexmaietta/ernie --demo demo_atmosphere_earth --viewer null --output /out/earth.png
|
|
114
114
|
```
|
|
115
115
|
|
|
116
116
|
### Build from source
|
|
@@ -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
|
[](https://github.com/alexmaietta/ernie/actions/workflows/ci.yml)
|
|
4
|
+
[](https://alexmaietta.github.io/ernie/coverage/)
|
|
4
5
|
[](https://github.com/alexmaietta/ernie/releases)
|
|
5
6
|
[](https://pypi.org/project/ernie-renderer/)
|
|
6
7
|
[](https://alexmaietta.github.io/ernie/)
|
|
@@ -94,8 +95,7 @@ sudo dnf install ./ernie-*.rpm
|
|
|
94
95
|
The `ernie` program is also published as a Docker image.
|
|
95
96
|
|
|
96
97
|
```sh
|
|
97
|
-
docker run --rm --gpus all -v "$PWD:/out" ghcr.io/alexmaietta/ernie
|
|
98
|
-
--demo demo_atmosphere_earth --viewer null --output /out/earth.png
|
|
98
|
+
docker run --rm --gpus all -v "$PWD:/out" ghcr.io/alexmaietta/ernie --demo demo_atmosphere_earth --viewer null --output /out/earth.png
|
|
99
99
|
```
|
|
100
100
|
|
|
101
101
|
### Build from source
|
|
@@ -9,6 +9,8 @@ set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "${PROJECT_DESCRIPTION}")
|
|
|
9
9
|
set(CPACK_PACKAGE_HOMEPAGE_URL "https://github.com/alexmaietta/ernie")
|
|
10
10
|
set(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE")
|
|
11
11
|
set(CPACK_PACKAGE_DIRECTORY "${PROJECT_BINARY_DIR}/packages")
|
|
12
|
+
# Archives named for their architecture, so x86_64 and aarch64 tarballs can sit side by side.
|
|
13
|
+
set(CPACK_SYSTEM_NAME "${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}")
|
|
12
14
|
set(CPACK_COMPONENTS_ALL app)
|
|
13
15
|
set(CPACK_ARCHIVE_COMPONENT_INSTALL ON)
|
|
14
16
|
set(CPACK_DEB_COMPONENT_INSTALL ON)
|
|
@@ -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 @@
|
|
|
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
|