Skip to content

Instantly share code, notes, and snippets.

View fredemmott's full-sized avatar

Fred Emmott fredemmott

View GitHub Profile
# Ideal sizes:
#
# https://learn.microsoft.com/en-us/windows/apps/design/style/iconography/app-icon-construction
$sizes = @(16, 20, 24, 30, 32, 36, 48, 60, 64, 72, 80, 96, 128, 256)
$tempFiles = @()
foreach ($size in $sizes) {
$outFile = "AppList.targetsize-$($size).png"
$tempFiles += $outFile

Working on my API layer tool and I think I'm hitting "spec doesn't define either way" behavior, but I'm not certain:

If I set XR_ENABLE_API_LAYERS=XR_LAYER_this_layer_does_not_exist in my environment (to attempt to enable an invalid explicit layer)

  • xrCreateInstance() fails with XR_ERROR_API_LAYER_NOT_PRESENT - this seems correct
  • xrEnumerateApiLayerProperties without an instance succeeds - this feels wrong, but I'm not finding a clear definition of correct behavior here
@fredemmott
fredemmott / shared_recursive_mutex.hpp
Created January 3, 2026 16:13
shared recursive mutex
// Copyright 2026 Fred Emmott <fred@fredemmott.com>
// SPDX-License-Identifier: MIT
#pragma once
#include <shared_mutex>
#include <thread>
#include <unordered_map>
#include "FredEmmott/GUI/assert.hpp"
@fredemmott
fredemmott / Foo.miz\OpenKneeboard.json
Last active July 31, 2025 20:52
Hypothetical DCS mission JSON for OpenKneeboard
{
"blue": {
"mission": {
"replacesDefaultImages": true,
"additionalFiles": [
"openkneeboard/blue-mission.html",
"openkneeboard/blue-mission.pdf"
]
},
"briefing": {
wpr -snapshotconfig heap -name OpenKneeboardApp.exe enable
# your own wprp is optional, both are logged
wpr -start heapsnapshot -start .\OpenKneeboard.wprp -filemode
wpr -singlesnapshot heap $((get-process OpenKneeboardApp).id)
# Wait for leak, then the same again
wpr -singlesnapshot heap $((get-process OpenKneeboardApp).id)
wpr -stop c:\users\fred\trace.etl
wpr -snapshotconfig heap -name OpenKneeboardApp.exe disable
# in wpa, select both snapshots, right click, diff view. Then look at 'added'
struct D3D11Timer {
D3D11Timer() = default;
explicit D3D11Timer(ID3D11Device* device) {
device->GetImmediateContext(mContext.put());
D3D11_QUERY_DESC desc {D3D11_QUERY_TIMESTAMP_DISJOINT};
device->CreateQuery(&desc, mDisjointQuery.put());
desc = {D3D11_QUERY_TIMESTAMP};
device->CreateQuery(&desc, mBeginRenderTimestampQuery.put());
device->CreateQuery(&desc, mEndRenderTimestampQuery.put());
@fredemmott
fredemmott / Program.cs
Created December 13, 2024 14:45
wixsharp-as-script
using System.CommandLine;
using System.Runtime.CompilerServices;
using WixSharp;
using WixToolset.Dtf.WindowsInstaller;
using File = WixSharp.File;
[assembly: InternalsVisibleTo(assemblyName: "XRFrameTools_Installer.aot")] // assembly name + '.aot suffix
void CreateMSI(DirectoryInfo sourceRoot)
@fredemmott
fredemmott / compile-time-string-to-guid.hpp
Created December 11, 2024 03:21
Compile time string-to-GUID
// Copyright 2024 Fred Emmott <fred@fredemmott.com>
// SPDX-License-Identifier: MIT
#pragma once
// Usage:
//
// constexpr GUID TestGuid = "9add179d-b650-4eca-b471-88ab38c2bd46"_guid;
// constexpr GUID TestGuid2 = "{2f896df5-d701-42ea-ab02-cbd50af16516}"_guid;
namespace detail::compile_time_guid {
diff --git a/src/injectables/OpenXRKneeboard.cpp b/src/injectables/OpenXRKneeboard.cpp
index 0c3f6d51..5cdbb322 100644
--- a/src/injectables/OpenXRKneeboard.cpp
+++ b/src/injectables/OpenXRKneeboard.cpp
@@ -50,6 +50,9 @@
#include <openxr/openxr_platform.h>
#include <openxr/openxr_reflection.h>
+// From OpenXR v1.1 SDK for XrPosef_Multiply
+#include "xr_linear.h"