Skip to content

multiwindow/gg: add cross-platform multiwindow services and lifecycle safety #6088

multiwindow/gg: add cross-platform multiwindow services and lifecycle safety

multiwindow/gg: add cross-platform multiwindow services and lifecycle safety #6088

Workflow file for this run

name: CI Windows MSVC
on:
push:
branches:
- master
- 'smoke/**'
paths-ignore:
- 'vlib/v3/**'
- '**.md'
- '**.yml'
- '!**.bat'
- '!**/windows_ci_msvc.yml'
- 'cmd/tools/**'
- '!cmd/tools/builders/**.v'
pull_request:
paths-ignore:
- 'vlib/v3/**'
- '**.md'
- '**.yml'
- '!**.bat'
- '!**/windows_ci_msvc.yml'
- '!**/windows-install-sqlite.bat'
- 'cmd/tools/**'
- '!cmd/tools/builders/**.v'
concurrency:
group: windows-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
cancel-in-progress: true
jobs:
msvc-windows:
runs-on: windows-2022
timeout-minutes: 90
env:
VFLAGS: -cc msvc
VTEST_SHOW_LONGEST_BY_RUNTIME: 3
VTEST_SHOW_LONGEST_BY_COMPTIME: 3
VTEST_SHOW_LONGEST_BY_TOTALTIME: 3
steps:
- uses: actions/checkout@v7
- name: Install OpenSSL
run: |
choco install openssl -y --no-progress
# choco's openssl package (Win64OpenSSL installer under the hood)
# deploys to `C:\Program Files\OpenSSL\`, matching
# ecdsa.c.v/rsa_pss.c.v's SECOND `#flag windows` fallback path --
# NOT the first one (`...OpenSSL-Win64\...`), confirmed by an
# actual CI run after guessing wrong the first time.
$opensslBin = 'C:\Program Files\OpenSSL\bin'
if (-not (Test-Path $opensslBin)) {
throw "OpenSSL bin directory not found at $opensslBin after choco install"
}
Add-Content -Path $env:GITHUB_PATH -Value $opensslBin
# ecdsa.c.v/rsa_pss.c.v use the unqualified `#flag -lcrypto`,
# which MSVC's linker (unlike gcc/tcc/clang's own `-l` convention,
# which implies a `lib` prefix automatically) passes straight
# through as a literal `crypto.lib` reference. This OpenSSL
# package only ships `libcrypto.lib` (confirmed via a real CI
# failure: `LNK1104: cannot open file 'crypto.lib'`) -- V's own
# `#flag` mechanism has no compiler-specific gating that can
# special-case MSVC here (only OS-name gates and one hardcoded
# `mingw` case are ever actually selected at build time, verified
# by reading vlib/v/builder/cflags.v's get_os_cflags()), so fix
# it here instead: alias the file under the name MSVC expects.
# A plain copy is safe -- a Windows import library doesn't embed
# its own filename.
$libDir = 'C:\Program Files\OpenSSL\lib\VC\x64\MD'
Copy-Item -Path (Join-Path $libDir 'libcrypto.lib') -Destination (Join-Path $libDir 'crypto.lib')
Write-Host "OpenSSL install:"
Get-ChildItem $libDir
- uses: ilammy/msvc-dev-cmd@v1
with:
arch: x64
- name: Verify MSVC tools
run: |
where.exe cl.exe
where.exe link.exe
where.exe dumpbin.exe
$headers = @($env:INCLUDE -split ';' | Where-Object { $_ -and $_.Trim().Length -gt 0 } | ForEach-Object { Join-Path $_ 'd3d11.h' } | Where-Object { Test-Path $_ })
if ($headers.Count -eq 0) {
throw 'd3d11.h not found in INCLUDE; Windows SDK is not visible to the D3D11 multiwindow lane'
}
Write-Host "Found d3d11.h at $($headers[0])"
- name: Build
run: |
echo %VFLAGS%
echo $VFLAGS
.\makev.bat -msvc
.\v.exe symlink
- name: Pkg-config regressions (MSVC dynamic isolation)
run: |
$tests = @(
'vlib\v\pkgconfig\pkgconfig_static_test.v'
'vlib\v\checker\pkgconfig_static_mode_test.v'
'vlib\v\checker\pkgconfig_cross_compile_test.v'
'vlib\v\builder\pkgconfig_link_segment_test.v'
)
foreach ($test in $tests) {
.\v.exe -cc msvc -no-retry-compilation test $test
if ($LASTEXITCODE -ne 0) {
throw "pkg-config regression failed for $test with exit code $LASTEXITCODE"
}
}
- name: Legacy gg import multiwindow isolation
run: v -cc msvc test vlib/gg/legacy_import_multiwindow_isolation_test.v
- name: Prepare multiwindow Job Object watchdog
shell: pwsh
run: |
$source = Join-Path $env:RUNNER_TEMP 'multiwindow_ci_watchdog.v'
$runner = Join-Path $env:RUNNER_TEMP 'multiwindow_ci_watchdog.exe'
@'
module main
import gg.testdata.multiwindow_probe_watchdog
import os
import time
fn main() {
run_ci_watchdog() or {
eprintln(err.msg())
exit(1)
}
}
fn run_ci_watchdog() ! {
if os.args.len < 4 {
return error('usage: multiwindow_ci_watchdog timeout-seconds expected-final-line executable [args...]')
}
timeout_seconds := os.args[1].int()
if timeout_seconds <= 0 {
return error('multiwindow CI watchdog timeout must be positive')
}
expected_final_line := os.args[2]
gate_path := os.join_path(os.temp_dir(), 'multiwindow_ci_gate_${os.getpid()}_${time.now().unix_nano()}')
defer {
os.rm(gate_path) or {}
}
result := multiwindow_probe_watchdog.run(
executable: os.args[3]
args: os.args[4..]
timeout: timeout_seconds * time.second
start_file: gate_path
)!
if result.stdout != '' {
print(result.stdout)
}
if result.stderr != '' {
eprint(result.stderr)
}
if result.timed_out {
return error('multiwindow CI child timed out after ${timeout_seconds} seconds')
}
if !result.reaped {
return error('multiwindow CI child leader was not reaped')
}
if !result.confinement_empty {
return error('multiwindow CI child process confinement is not empty')
}
if result.forced_cleanup {
return error('multiwindow CI child required forced cleanup')
}
if result.exit_code != 0 {
return error('multiwindow CI child exited with ${result.exit_code}')
}
if expected_final_line == '-' {
return
}
mut actual_final_line := ''
for line in result.stdout.split_into_lines() {
if line.trim_space() != '' {
actual_final_line = line.trim_space()
}
}
if actual_final_line != expected_final_line {
return error('multiwindow CI final record mismatch: expected `${expected_final_line}`, got `${actual_final_line}`')
}
}
'@ | Set-Content -Encoding utf8 $source
.\v.exe -cc msvc -o $runner $source
if ($LASTEXITCODE -ne 0) {
throw "multiwindow watchdog compile failed with exit code $LASTEXITCODE"
}
- name: Multiwindow D3D11 WARP regressions and runtime probes
shell: pwsh
env:
VFLAGS: -cc msvc -d gg_multiwindow_d3d11_warp
VGG_MULTIWINDOW_RUNTIME_PROBES: '1'
VGG_MULTIWINDOW_RUNTIME_BACKEND: win32
VGG_MULTIWINDOW_EXAMPLE_UNATTENDED: win32
V_MULTIWINDOW_PROBE_BACKEND: win32
run: |
$runner = Join-Path $env:RUNNER_TEMP 'multiwindow_ci_watchdog.exe'
$vexe = (Resolve-Path .\v.exe).Path
$interactive = Join-Path $env:RUNNER_TEMP 'gg_multiwindow.exe'
$runtime = Join-Path $env:RUNNER_TEMP 'gg_multiwindow_render_runtime.exe'
.\v.exe -cc msvc -d gg_multiwindow -d sokol_d3d11 -d gg_multiwindow_d3d11_warp -subsystem console -o $interactive examples/gg/multiwindow.v
if ($LASTEXITCODE -ne 0) {
throw "interactive multiwindow example compile failed with exit code $LASTEXITCODE"
}
.\v.exe -cc msvc -d gg_multiwindow -d sokol_d3d11 -d gg_multiwindow_d3d11_warp -subsystem console -o $runtime examples/gg/multiwindow_render_runtime.v
if ($LASTEXITCODE -ne 0) {
throw "runtime multiwindow example compile failed with exit code $LASTEXITCODE"
}
$tests = @(
'vlib/x/multiwindow/event_sequence_exhaustion_test.v',
'vlib/x/multiwindow/event_terminal_delivery_test.v',
'vlib/x/multiwindow/internal_fault_matrix_test.v',
'vlib/x/multiwindow/multiwindow_test.v',
'vlib/x/multiwindow/native_operation_proof_test.v',
'vlib/x/multiwindow/render_scheduler_test.v',
'vlib/x/multiwindow/render_target_lease_test.v',
'vlib/x/multiwindow/teardown_contract_test.v',
'vlib/x/multiwindow/win32_render_metrics_test.v',
'vlib/gg/multiwindow_api_d_gg_multiwindow_test.v',
'vlib/gg/multiwindow_buffer_cleanup_d_gg_multiwindow_test.v',
'vlib/gg/multiwindow_render_fault_matrix_d_gg_multiwindow_test.v',
'vlib/gg/multiwindow_render_runtime_contract_test.v',
'vlib/gg/frame_pacing_test.v',
'vlib/gg/draw_fns_api_test.v',
'vlib/gg/draw_rect_empty_test.v'
)
foreach ($test in $tests) {
& $runner 300 '-' $vexe '-cc' 'msvc' '-d' 'gg_multiwindow' '-d' 'sokol_d3d11' '-d' 'gg_multiwindow_d3d11_warp' 'test' $test
if ($LASTEXITCODE -ne 0) {
throw "multiwindow D3D11 WARP test '$test' failed with exit code $LASTEXITCODE"
}
}
& $runner 120 '{"example":"multiwindow_render_runtime","status":"PASS","cleanup":"complete"}' $runtime
if ($LASTEXITCODE -ne 0) {
throw "multiwindow D3D11 WARP runtime example failed with exit code $LASTEXITCODE"
}
& $runner 120 '{"example":"multiwindow","status":"PASS","cleanup":"complete"}' $interactive
if ($LASTEXITCODE -ne 0) {
throw "interactive multiwindow D3D11 WARP example failed with exit code $LASTEXITCODE"
}
- name: All code is formatted
run: v -silent test-cleancode
- name: Test -cc msvc works
run: v -no-retry-compilation run examples/hello_world.v
- name: Install dependencies
run: |
v retry -- v setup-freetype
.\.github\workflows\windows-install-sqlite.bat
- name: v doctor
run: |
v doctor
- name: Verify `v test` works
run: |
echo $VFLAGS
v cmd/tools/test_if_v_test_system_works.v
./cmd/tools/test_if_v_test_system_works
- name: Test pure V math module
run: v -silent -exclude @vlib/math/*.c.v test vlib/math/
- name: Test fasthttp module
run: v -silent test vlib/fasthttp/
- name: Self tests
run: v -silent test-self vlib
- name: Test v->js
run: v -o hi.js examples/js_hello_world.v && node hi.js
- name: Test v binaries
run: v build-vbinaries
- name: Build examples
run: v build-examples
- name: Compile and run the veb example (fasthttp) and check its HTML
run: v run .github/workflows/veb_example_windows_smoke.v
- name: v2 self compilation
run: v -o v2.exe cmd/v && .\v2.exe -o v3.exe cmd/v
msvc-multiwindow:
runs-on: windows-2022
timeout-minutes: 70
env:
VFLAGS: -cc msvc
VTEST_SHOW_LONGEST_BY_RUNTIME: 3
VTEST_SHOW_LONGEST_BY_COMPTIME: 3
VTEST_SHOW_LONGEST_BY_TOTALTIME: 3
steps:
- uses: actions/checkout@v7
- uses: ilammy/msvc-dev-cmd@v1
with:
arch: x64
- name: Verify MSVC tools
run: |
where.exe cl.exe
where.exe link.exe
where.exe dumpbin.exe
$headers = @($env:INCLUDE -split ';' | Where-Object { $_ -and $_.Trim().Length -gt 0 } | ForEach-Object { Join-Path $_ 'd3d11.h' } | Where-Object { Test-Path $_ })
if ($headers.Count -eq 0) {
throw 'd3d11.h not found in INCLUDE; Windows SDK is not visible to the D3D11 multiwindow lane'
}
Write-Host "Found d3d11.h at $($headers[0])"
- name: Build
run: |
echo %VFLAGS%
echo $VFLAGS
.\makev.bat -msvc
.\v.exe symlink
- name: Legacy gg import multiwindow isolation
run: v -cc msvc test vlib/gg/legacy_import_multiwindow_isolation_test.v
- name: Public gg Win32 services no-flag contract
run: v -cc msvc test vlib/gg/multiwindow_win32_public_services_contract_windows_test.v
- name: Win32 W3 native/public GREEN contracts
shell: pwsh
run: |
.\.github\workflows\run_multiwindow_win32_w3_green.ps1 -Compiler msvc `
-ExpectedCompositeSha256 '836c1d52c3042f8ec85d0c64489f1b0d1ead8ffafcfdb2a06f567a9b52e2785f' `
-ExpectedRunnerSha256 '9326948a5be280164fb5c6706295b2c35facae252b2ea1c11e26c5a9129cf955'
- name: Package 2 native Win32 RED matrix
shell: pwsh
run: .\.github\workflows\run_multiwindow_win32_package2_red.ps1 -Compiler msvc
- name: Win32 W4 clipboard contracts
shell: pwsh
env:
VFLAGS: ''
run: |
.\.github\workflows\run_multiwindow_win32_w4.ps1 `
-Compiler msvc `
-Expectation Green `
-ExpectedOracleSha256 '804e8cbc5f5f7c390e90736d54a60d65d19b649a94afa4915bd9cb4e95c4e04d' `
-ExpectedNativeTestSha256 '1796d8221d14f9bc40c74e163d797b50f4eeb09a67aee0c4703834880354ef66' `
-ExpectedPublicTestSha256 'd08eafb919ae97b185fc480c22f6d990973396152e9a0b3a01035c3e9a30275c' `
-ExpectedNoOptProbeSha256 '288f148ca15b6694481f117c03be5f80c4045baf76d3b0e90db61b5e0596741c' `
-ExpectedServiceBackendSha256 '8ad39d63360446ef7049c726544200780eff61ff39917830f7024243dfd363be' `
-ExpectedEventDeliverySha256 'd38c868f574c02fc46e047da25e770e5b9f672500d796694b5ef35bf042cdae0' `
-ExpectedWin32BackendSha256 '57b7e02241fb3624ffde0619cf99441b0ae91cc112734cffb29433adbfe7b191' `
-ExpectedWin32ServiceBackendSha256 'faaf67be3e0381ea8a0e7a753b477b7965dde6e655f83f220eca036da19c5df6' `
-ExpectedWin32ServiceNativeSha256 '2ffc93e245a43c4a557fd7cc66ebcdda8874b9783ec3050ba754657a97efd033' `
-ExpectedRedSurfaceSha256 'fe7fa76370ee25883e4da25e72b339daeba9d1b47ff70b8b56b0ada87a0027c6' `
-ExpectedGreenSurfaceSha256 '703041609ba8ed459c785d567bba74e2b90470eb73c6edf99982ab24cf68ccd9' `
-ExpectedRunnerSha256 '9a38a51e00f609a3e04dbace876028c35bff3cd1a02326c1af40798374ea137a'
- name: Win32 W5 raw-input A0 preflight
shell: pwsh
run: |
.\.github\workflows\run_multiwindow_win32_w5_a0.ps1 -Compiler msvc `
-ExpectedHeaderSha256 '9decdc2e825c91da2b9d2ce0c98cb8ccdad5c4800a690863d166135eb188e916' `
-ExpectedMainSha256 '5f30869ae97f680032e622273ea69986d612cc82cad2adf53e4c3b1415154301' `
-ExpectedTupleSha256 '99ef24bf101dc83543f26f86cb23a80c82607e0f1b35c32e9dbb431368ecc7c4' `
-ExpectedRunnerSha256 'ce4da58e24730899f970a7566dc65d82eb0c07d38f74efcaeeb02c450a011b68'
- name: Win32 W5 raw-input A1 public GREEN
shell: pwsh
env:
VFLAGS: ''
run: |
.\.github\workflows\run_multiwindow_win32_w5_a1.ps1 -Compiler msvc `
-Expectation Green `
-ExpectedTestSha256 '005d3f7c7668bd18d593ba5f42e94cf247058c5f61ca46ce6d6a42bac03b5000' `
-ExpectedOracleSha256 '7362f17f06ea6b0ab5a64c74abf2407a0e284cbace2c10809a5235d406d16461' `
-ExpectedTupleSha256 '16739d9b8b73d9615ba3037c9e18219d6bf1271ef1d2f7dba4b2f2e53b1efac5' `
-ExpectedA0HeaderSha256 '9decdc2e825c91da2b9d2ce0c98cb8ccdad5c4800a690863d166135eb188e916' `
-ExpectedA0MainSha256 '5f30869ae97f680032e622273ea69986d612cc82cad2adf53e4c3b1415154301' `
-ExpectedA0TupleSha256 '99ef24bf101dc83543f26f86cb23a80c82607e0f1b35c32e9dbb431368ecc7c4' `
-ExpectedA0RunnerSha256 'ce4da58e24730899f970a7566dc65d82eb0c07d38f74efcaeeb02c450a011b68' `
-ExpectedGgFacadeSha256 'e5a944c1bb86bf9af11bfc9d1d137566ac6659d5f56ddabd08cdb49792afbb46' `
-ExpectedGgNoFlagSha256 'ad528c64cf18bce9415dd0e50513fb87d8d0b58c8ac4a99025a5c8955e7d9549' `
-ExpectedGgServiceTypesSha256 '9f17334ba5e5aff51f26d55476c83878856a8494a890aa64ee6434a52c1ecfeb' `
-ExpectedAppSha256 'af32eec55c119907a8bbf544842131018d36d3887347e26486e067a79d78a946' `
-ExpectedTypesSha256 '0a9058ba7928945e24284c867eb6182336ea3b1d41e1337786c71105b1fe93b3' `
-ExpectedBackendSha256 'dcd0f088c235ae030f8bbc9ab63082c38d93f6f1194373e74d8dcb454d100a3f' `
-ExpectedServiceApiSha256 'd8b9d64eb66246338b0d3543c94f267eb1eaf9ad591af1d2b3a1c43de072e45e' `
-ExpectedServiceTypesSha256 'cd8326b81201727618e758d79970b7a77223fd6418e18afda44a526a3b0b4267' `
-ExpectedServiceRegistrySha256 '51c62ab847fadb8be9904b82d6360ee2f6d85825ead7b7072fad0e76e315a71e' `
-ExpectedEventDeliverySha256 'd38c868f574c02fc46e047da25e770e5b9f672500d796694b5ef35bf042cdae0' `
-ExpectedPublicRoutingSurfaceSha256 '7ac684e9a0c0307cbb213b212672910dd335462caa3e9a6058cee2460cdc641d' `
-ExpectedServiceBackendSha256 '8ad39d63360446ef7049c726544200780eff61ff39917830f7024243dfd363be' `
-ExpectedEventDispatchSha256 '7ef6c7cbd34511d6c19c1a3a269b46876db791b9412bb88e3a8d4dcd543bfd4e' `
-ExpectedWin32BackendSha256 '57b7e02241fb3624ffde0619cf99441b0ae91cc112734cffb29433adbfe7b191' `
-ExpectedWin32BackendHelpersSha256 'ba0021ce46731b25d540a68bf7c7832c7302a7343a90e1398df91cc5e409754d' `
-ExpectedWin32ServiceBackendSha256 'faaf67be3e0381ea8a0e7a753b477b7965dde6e655f83f220eca036da19c5df6' `
-ExpectedWin32ServiceNativeSha256 '2ffc93e245a43c4a557fd7cc66ebcdda8874b9783ec3050ba754657a97efd033' `
-ExpectedGreenProductionSurfaceSha256 'c1796663110d256b5ba6bc59e3ea0d2ec28863ab2c8b697dd8ee39882afe0928' `
-ExpectedRunnerSha256 'cd62bc7a7b47f53651ad259cf66613a450577cb6abbbf959556fb9942223c40a'
- name: Prepare multiwindow Job Object watchdog
shell: pwsh
run: |
$source = Join-Path $env:RUNNER_TEMP 'multiwindow_ci_watchdog.v'
$runner = Join-Path $env:RUNNER_TEMP 'multiwindow_ci_watchdog.exe'
@'
module main
import gg.testdata.multiwindow_probe_watchdog
import os
import time
fn main() {
run_ci_watchdog() or {
eprintln(err.msg())
exit(1)
}
}
fn run_ci_watchdog() ! {
if os.args.len < 4 {
return error('usage: multiwindow_ci_watchdog timeout-seconds expected-final-line executable [args...]')
}
timeout_seconds := os.args[1].int()
if timeout_seconds <= 0 {
return error('multiwindow CI watchdog timeout must be positive')
}
expected_final_line := os.args[2]
gate_path := os.join_path(os.temp_dir(), 'multiwindow_ci_gate_${os.getpid()}_${time.now().unix_nano()}')
defer {
os.rm(gate_path) or {}
}
result := multiwindow_probe_watchdog.run(
executable: os.args[3]
args: os.args[4..]
timeout: timeout_seconds * time.second
start_file: gate_path
)!
if result.stdout != '' {
print(result.stdout)
}
if result.stderr != '' {
eprint(result.stderr)
}
if result.timed_out {
return error('multiwindow CI child timed out after ${timeout_seconds} seconds')
}
if !result.reaped {
return error('multiwindow CI child leader was not reaped')
}
if !result.confinement_empty {
return error('multiwindow CI child process confinement is not empty')
}
if result.forced_cleanup {
return error('multiwindow CI child required forced cleanup')
}
if result.exit_code != 0 {
return error('multiwindow CI child exited with ${result.exit_code}')
}
if expected_final_line == '-' {
return
}
mut actual_final_line := ''
for line in result.stdout.split_into_lines() {
if line.trim_space() != '' {
actual_final_line = line.trim_space()
}
}
if actual_final_line != expected_final_line {
return error('multiwindow CI final record mismatch: expected `${expected_final_line}`, got `${actual_final_line}`')
}
}
'@ | Set-Content -Encoding utf8 $source
.\v.exe -cc msvc -o $runner $source
if ($LASTEXITCODE -ne 0) {
throw "multiwindow watchdog compile failed with exit code $LASTEXITCODE"
}
- name: Multiwindow D3D11 WARP regressions and runtime probes
shell: pwsh
env:
VFLAGS: -cc msvc -d gg_multiwindow_d3d11_warp
VGG_MULTIWINDOW_RUNTIME_PROBES: '1'
VGG_MULTIWINDOW_RUNTIME_BACKEND: win32
VGG_MULTIWINDOW_EXAMPLE_UNATTENDED: win32
V_MULTIWINDOW_PROBE_BACKEND: win32
run: |
$runner = Join-Path $env:RUNNER_TEMP 'multiwindow_ci_watchdog.exe'
$vexe = (Resolve-Path .\v.exe).Path
$interactive = Join-Path $env:RUNNER_TEMP 'gg_multiwindow.exe'
$runtime = Join-Path $env:RUNNER_TEMP 'gg_multiwindow_render_runtime.exe'
.\v.exe -cc msvc -d gg_multiwindow -d sokol_d3d11 -d gg_multiwindow_d3d11_warp -subsystem console -o $interactive examples/gg/multiwindow.v
if ($LASTEXITCODE -ne 0) {
throw "interactive multiwindow example compile failed with exit code $LASTEXITCODE"
}
.\v.exe -cc msvc -d gg_multiwindow -d sokol_d3d11 -d gg_multiwindow_d3d11_warp -subsystem console -o $runtime examples/gg/multiwindow_render_runtime.v
if ($LASTEXITCODE -ne 0) {
throw "runtime multiwindow example compile failed with exit code $LASTEXITCODE"
}
$publicServicesTestFile = 'vlib/gg/multiwindow_win32_public_services_contract_windows_test.v'
$publicServicesTests = @(
'test_win32_public_hwnd_borrow_route_red',
'test_win32_public_conditional_focus_refusal_is_not_a_capability_error_red',
'test_win32_public_partial_focus_is_never_reported_as_success_red',
'test_win32_public_controls_publish_observed_state_red'
)
$tests = @(
'vlib/x/multiwindow/event_sequence_exhaustion_test.v',
'vlib/x/multiwindow/event_terminal_delivery_test.v',
'vlib/x/multiwindow/internal_fault_matrix_test.v',
'vlib/x/multiwindow/multiwindow_test.v',
'vlib/x/multiwindow/native_operation_proof_test.v',
'vlib/x/multiwindow/render_scheduler_test.v',
'vlib/x/multiwindow/render_target_lease_test.v',
'vlib/x/multiwindow/teardown_contract_test.v',
'vlib/x/multiwindow/win32_render_metrics_test.v',
'vlib/x/multiwindow/service_native_win32_readback_d3d11_contract_test.v',
'vlib/gg/multiwindow_api_d_gg_multiwindow_test.v',
'vlib/gg/multiwindow_buffer_cleanup_d_gg_multiwindow_test.v',
'vlib/gg/multiwindow_render_fault_matrix_d_gg_multiwindow_test.v',
'vlib/gg/multiwindow_render_runtime_contract_test.v',
'vlib/gg/frame_pacing_test.v',
'vlib/gg/draw_fns_api_test.v',
'vlib/gg/draw_rect_empty_test.v'
)
foreach ($test in $tests) {
$diagnosticSubsystem = @()
if ($test -eq 'vlib/gg/multiwindow_render_runtime_contract_test.v') {
$diagnosticSubsystem = @('-subsystem', 'console')
}
& $runner 300 '-' $vexe '-cc' 'msvc' '-d' 'gg_multiwindow' '-d' 'sokol_d3d11' '-d' 'gg_multiwindow_d3d11_warp' @diagnosticSubsystem 'test' $test
if ($LASTEXITCODE -ne 0) {
throw "multiwindow D3D11 WARP test '$test' failed with exit code $LASTEXITCODE"
}
}
foreach ($serviceTest in $publicServicesTests) {
& $runner 300 '-' $vexe '-cc' 'msvc' '-d' 'gg_multiwindow' '-d' 'sokol_d3d11' '-d' 'gg_multiwindow_d3d11_warp' '-subsystem' 'console' 'test' '-run-only' $serviceTest $publicServicesTestFile
if ($LASTEXITCODE -ne 0) {
throw "multiwindow D3D11 WARP public Win32 service test '$serviceTest' failed with exit code $LASTEXITCODE"
}
}
& $runner 120 '{"example":"multiwindow_render_runtime","status":"PASS","cleanup":"complete"}' $runtime
if ($LASTEXITCODE -ne 0) {
throw "multiwindow D3D11 WARP runtime example failed with exit code $LASTEXITCODE"
}
& $runner 120 '{"example":"multiwindow","status":"PASS","cleanup":"complete"}' $interactive
if ($LASTEXITCODE -ne 0) {
throw "interactive multiwindow D3D11 WARP example failed with exit code $LASTEXITCODE"
}