Image to Three.js Model
img2threejs/img2threejs
Rebuilds the object in a reference image as a procedural, animation-ready Three.js model written entirely in code, using staged sculpting with quality checks.
ALWAYS use when working with AGFX fences, frames-in-flight pacing, queue signal/wait, resource-state barriers, or the barrier "agglomerate" flag.
$ npx skills add AmelieHeinrich/agfx --skill agfx-synchronization -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install AmelieHeinrich/agfx agfx-synchronization --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/AmelieHeinrich/agfx.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/agfx-synchronization .claude/skills/agfx-synchronization && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "agfx-synchronization" agent skill from https://github.com/AmelieHeinrich/agfx/tree/main/.claude/skills/agfx-synchronization into .claude/skills/agfx-synchronization/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agfx-synchronization", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/AmelieHeinrich/agfx/tree/main/.claude/skills/agfx-synchronizationType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add AmelieHeinrich/agfx --skill agfx-synchronization -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install AmelieHeinrich/agfx agfx-synchronization --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/AmelieHeinrich/agfx.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/agfx-synchronization .agents/skills/agfx-synchronization && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "agfx-synchronization" agent skill from https://github.com/AmelieHeinrich/agfx/tree/main/.claude/skills/agfx-synchronization into .agents/skills/agfx-synchronization/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agfx-synchronization", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add AmelieHeinrich/agfx --skill agfx-synchronization -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install AmelieHeinrich/agfx agfx-synchronization --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/AmelieHeinrich/agfx.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/agfx-synchronization .cursor/skills/agfx-synchronization && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "agfx-synchronization" agent skill from https://github.com/AmelieHeinrich/agfx/tree/main/.claude/skills/agfx-synchronization into .cursor/skills/agfx-synchronization/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agfx-synchronization", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/AmelieHeinrich/agfx.git --path .claude/skills/agfx-synchronization--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add AmelieHeinrich/agfx --skill agfx-synchronization -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install AmelieHeinrich/agfx agfx-synchronization --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/AmelieHeinrich/agfx.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/agfx-synchronization .gemini/skills/agfx-synchronization && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "agfx-synchronization" agent skill from https://github.com/AmelieHeinrich/agfx/tree/main/.claude/skills/agfx-synchronization into .gemini/skills/agfx-synchronization/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agfx-synchronization", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install AmelieHeinrich/agfx agfx-synchronizationInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add AmelieHeinrich/agfx --skill agfx-synchronization -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/AmelieHeinrich/agfx.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/agfx-synchronization .github/skills/agfx-synchronization && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "agfx-synchronization" agent skill from https://github.com/AmelieHeinrich/agfx/tree/main/.claude/skills/agfx-synchronization into .github/skills/agfx-synchronization/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agfx-synchronization", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add AmelieHeinrich/agfx --skill agfx-synchronization -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install AmelieHeinrich/agfx agfx-synchronization --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/AmelieHeinrich/agfx.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/agfx-synchronization .opencode/skills/agfx-synchronization && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "agfx-synchronization" agent skill from https://github.com/AmelieHeinrich/agfx/tree/main/.claude/skills/agfx-synchronization into .opencode/skills/agfx-synchronization/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agfx-synchronization", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
agfx-synchronizationALWAYS use when working with AGFX fences, frames-in-flight pacing, queue signal/wait, resource-state barriers, or the barrier "agglomerate" flag.
Agfx Synchronization is an agent skill from AmelieHeinrich/agfx. ALWAYS use when working with AGFX fences, frames-in-flight pacing, queue signal/wait, resource-state barriers, or the barrier "agglomerate" flag. Trigger for agfxFenceCreate/Wait/Signal/GetCompletedValue, agfxCommandQueueSignal/Wait, agfxCommandBufferTextureBarrier/MemoryBarrier, agfxComputePassTextureUAVBarrier/BufferUAVBarrier, agfxResourceState transitions, "GPU/CPU sync", "drain the GPU", "frames in flight", "hazard tracking", agglomerate flag, resize/HDR-toggle-before-recreate ordering. Do NOT trigger for…
Its SKILL.md is about 3.6k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Game Development. The licence is MIT.
Read from SKILL.md and the folder at commit d8ad38b. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are cpp).
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Agfx Synchronization loads about 3.6k tokens when it runs. Until then it costs about 207 tokens; SKILL.md has 1,448 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from AmelieHeinrich/agfx at commit d8ad38b, republished under its MIT licence (© AmelieHeinrich). 1,448 words, ~3,629 tokens.
.claude/skills/agfx-synchronization/SKILL.md (or your agent's skills folder).AGFX exposes one fence type (agfxFence) used identically for CPU↔GPU and GPU↔GPU synchronization, and two barrier APIs: state transitions (agfxCommandBufferTextureBarrier for textures, agfxCommandBufferMemoryBarrier for buffers and acceleration structures) and UAV hazard barriers (agfxComputePassTextureUAVBarrier/BufferUAVBarrier). The tricky part is that AGFX's Metal backend has no per-resource hazard tracking the way D3D12 and Vulkan do — barriers on Metal are stage-based and get merged into a single pending barrier, controlled by the agglomerate parameter. Getting agglomerate wrong is the single most common cross-platform bug in AGFX code: it looks completely correct on D3D12 and Vulkan (both ignore the flag and always emit the transition immediately) while producing missing barriers or corrupted output on Metal.
agfxCommandBufferMemoryBarrier takes no resource argument at all — unlike the texture barrier, it isn't scoped to one buffer or acceleration structure. Buffers and acceleration structures have no "layout" to transition (only textures do), so on D3D12 this is a global memory barrier, on Vulkan a global VkMemoryBarrier2, and on Metal it merges into the same stage-based tracker textures use; there is nothing more specific to scope it to on any backend. Calling it once orders all prior GPU access in oldState against all subsequent access in newState — if you used to barrier two buffers that transition in lockstep (e.g. an indirect bundle's commands + count buffers, see agfx-mdi), that's now one call, not two identical ones back-to-back.
The second thing to internalize is barrier scope. Metal 4 distinguishes barriers that order work against prior encoders from barriers that order work within the current encoder, and they are not interchangeable — using the wrong one produces a barrier that silently orders nothing. The two AGFX barrier APIs map onto that split: state transitions are cross-encoder, UAV barriers are intra-encoder. Pick by where the producer and consumer actually live, not by which call is more convenient.
Owns:
agfxFenceCreate/Destroy/Wait/Signal/GetCompletedValueagfxCommandQueueSignal/agfxCommandQueueWait (GPU-side queue signal/wait)kFramesInFlight)agfxCommandBufferTextureBarrier/agfxCommandBufferMemoryBarrier and the agglomerate flag's Metal-vs-everyone-else semanticsagfxComputePassTextureUAVBarrier/agfxComputePassBufferUAVBarrier (UAV read/write hazard barriers within a compute pass)Doesn't own:
agfx-presentation-and-swapchainagfxRenderPassBegin) → agfx-render-targets-and-passes (though the barriers to reach those states are documented here)agfxCommandBufferAliasingBarrier, placement heaps, and resource creation/residency/destruction → agfx-resources (the aliasing barrier obeys every rule here, including agglomerate, but is meaningless outside a heap)Read agfx/agfx.h's agfxCommandBufferTextureBarrier doc comment carefully — it's the authoritative explanation of agglomerate. agfx_demo/agfx_demo_main.cpp's drainGPU lambda and per-frame fence-slot logic is the reference frame-pacing implementation; deferred_renderer.cpp shows barrier usage across a full G-buffer/SSAO/shadow/lighting pipeline.
Don't block on every frame — only block when about to reuse a command-buffer slot whose GPU work may still be in flight:
agfxCommandBuffer* commandBuffers[kFramesInFlight];
agfxFence* frameFence = agfxFenceCreate(device);
uint64_t fenceValue = 0;
uint64_t slotFenceValues[kFramesInFlight] = {};
// Each frame:
uint32_t frameSlot = (uint32_t)(frameIndex % kFramesInFlight);
agfxFenceWait(frameFence, slotFenceValues[frameSlot], UINT64_MAX); // block only if that slot hasn't finished
agfxCommandBufferReset(commandBuffers[frameSlot]);
agfxCommandBufferBegin(commandBuffers[frameSlot]);
// ... record + submit ...
agfxCommandQueueSubmit(queue, &commandBuffers[frameSlot], 1);
agfxSwapChainPresent(swapChain);
slotFenceValues[frameSlot] = ++fenceValue;
agfxCommandQueueSignal(queue, frameFence, fenceValue); // GPU signals this value once this frame's work completes
frameIndex++;Every agfxCommandQueueSignal call must use a fresh monotonically increasing value — reusing a value (or signaling out of order) means a later wait can be satisfied by an earlier, unrelated signal.
Any operation that destroys or recreates a resource an in-flight (submitted but not yet completed) command buffer might still reference — swap chain resize, HDR toggle, shared G-buffer/depth target resize — must fully drain first:
auto drainGPU = [&]() {
agfxCommandQueueSignal(queue, frameFence, ++fenceValue);
agfxFenceWait(frameFence, fenceValue, UINT64_MAX);
};
// Before: swap chain resize, swap chain recreation (HDR toggle), shared render target resize
drainGPU();
agfxSwapChainResize(device, swapChain, newWidth, newHeight);Skipping this drain is a use-after-free/GPU-fault waiting to happen: the old resource can be destroyed while a previously-submitted, still-executing command buffer references it.
agglomerate barrier flagagfxCommandBufferTextureBarrier/agfxCommandBufferMemoryBarrier take an agglomerate bool with backend-divergent meaning:
agglomerate = true merges this transition's producer/consumer stages into a single pending barrier, flushed automatically at the start of the next agfxComputePassBegin/agfxRenderPassBegin — or immediately, if a pass is already open when the call is made. agglomerate = false is a no-op on Metal — the barrier is silently dropped, not emitted some other way.vkCmdPipelineBarrier2 on Vulkan).Rule of thumb:
PIXEL_SHADER_RESOURCE to DEPTH_WRITE before a shadow pass) → pass true, so Metal actually tracks the hazard.false. Presentable drawables need no explicit barrier on Metal (the display server/compositor handles it), but D3D12 and Vulkan still require the transition (on Vulkan it's a real layout transition to/from PRESENT_SRC_KHR), which happens unconditionally regardless of the flag — see agfx-presentation-and-swapchain.// Ordinary transition: track the hazard on Metal
agfxCommandBufferTextureBarrier(cmd, depthTexture, AGFX_RESOURCE_STATE_PIXEL_SHADER_RESOURCE, AGFX_RESOURCE_STATE_DEPTH_WRITE, 0, 0, /*agglomerate=*/true);
// Present-adjacent transition: no-op on Metal, unconditional on D3D12/Vulkan
agfxCommandBufferTextureBarrier(cmd, backBuffer, AGFX_RESOURCE_STATE_PRESENT, AGFX_RESOURCE_STATE_RENDER_TARGET, 0, 0, /*agglomerate=*/false);Both agfxRenderPassBegin and agfxComputePassBegin flush any pending agglomerated barriers automatically — you don't need (and can't) manually flush them. Calling a transition barrier while a pass is already open also works: the backend flushes it inline against the open encoder. This is what makes a mid-pass transition (e.g. a copy into a buffer, then a dispatch that reads it, both inside one compute pass) actually order correctly.
Transitions out of a read-only state are real barriers. A PIXEL_SHADER_RESOURCE → UNORDERED_ACCESS or INDIRECT_ARGUMENT → UNORDERED_ACCESS transition is a write-after-read hazard: the readers must finish before the new writer starts. The backend derives the "wait for" stages from whoever read the resource when the old state writes nothing (and symmetrically, the "must wait" stages from whoever writes when the new state only writes, e.g. RENDER_TARGET). Don't skip these on the assumption that "nothing wrote it, so there's nothing to synchronize" — that reasoning is what leaves a GPU-driven pass overwriting buffers the previous frame is still reading.
agfx_d3d12.cpp/agfx_vulkan.cpp, if editing a backend)Vulkan maps both barrier APIs onto vkCmdPipelineBarrier2: the texture barrier is a VkImageMemoryBarrier2 (with oldLayout = UNDEFINED when the old state is PRESENT, since a freshly acquired swap chain image is genuinely undefined), the memory barrier a global VkMemoryBarrier2. Resources are created VK_SHARING_MODE_CONCURRENT across the graphics/compute/transfer queue families, so every barrier uses VK_QUEUE_FAMILY_IGNORED and no queue-family ownership transfers ever exist — matching D3D12's queue-agnostic model. AGFX fences are timeline semaphores (agfxNativeGetVkSemaphore exposes the raw handle).
D3D12 Enhanced Barriers (not legacy ResourceBarrier) are a hard requirement, checked once at device creation via D3D12_FEATURE_D3D12_OPTIONS12.EnhancedBarriersSupported — there is no legacy fallback path. agfxCommandBufferTextureBarrier emits a D3D12_BARRIER_TYPE_TEXTURE barrier (real D3D12_BARRIER_LAYOUT transition); agfxCommandBufferMemoryBarrier emits a D3D12_BARRIER_TYPE_GLOBAL barrier (no layout, since buffers/AS don't have one). One enhanced-barrier quirk to know before touching this code: a global barrier rejects AccessBefore=COMMON paired with a non-COMMON AccessAfter (texture/buffer-scoped barriers allow it freely) — agfxCommandBufferMemoryBarrier clamps AccessAfter to COMMON in that case, which loses no real ordering since the Sync scope (not Access) is what actually creates the GPU wait, and COMMON access already implies full visibility. See notes/BARRIER_REWORK.md for the full migration rationale and the state→(Sync, Access, Layout) mapping tables.
agfxComputePassTextureUAVBarrier/BufferUAVBarrier order dispatches within one open encoder. They are separate from the state-transition barriers above and are needed even when the resource state itself doesn't change:
agfxComputePass* pass = agfxComputePassBegin(cmd, "Cull + Prepare");
// dispatch A writes the buffer
agfxComputePassDispatch(pass, groupsX, groupsY, 1);
agfxComputePassBufferUAVBarrier(pass, buffer); // A completes before B reads it
// dispatch B reads what A wrote
agfxComputePassDispatch(pass, groupsX2, groupsY2, 1);
agfxComputePassEnd(pass);A UAV barrier is only meaningful between two dispatches in the same pass. Placing one at the end of a pass, expecting it to order the next pass's work, does nothing — it is an intra-encoder barrier and there is no subsequent work in that encoder for it to apply to. Cross-pass hazards are the state-transition barriers' job:
// WRONG: orders nothing. The consumer is in the next encoder.
agfxComputePassDispatch(pass, gx, gy, 1);
agfxComputePassTextureUAVBarrier(pass, texture);
agfxComputePassEnd(pass);
// RIGHT: a state transition between the passes, with agglomerate = true.
agfxComputePassDispatch(pass, gx, gy, 1);
agfxComputePassEnd(pass);
agfxCommandBufferTextureBarrier(cmd, texture,
AGFX_RESOURCE_STATE_UNORDERED_ACCESS, AGFX_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE, mip, 0, /*agglomerate=*/true);A mip-chain generator that runs one pass per mip is the canonical example of the second shape: each mip is written by one pass's dispatch and read by the next pass's, so the whole chain rides on agglomerated transitions, not UAV barriers. See agfx_demo/agfx_mipgen.cpp.
agglomerate = false for an ordinary transition. It is documented as a no-op on Metal and the barrier vanishes entirely. Reserve false for the swap chain PRESENT↔RENDER_TARGET pair only. A whole dependency chain built from false barriers runs correctly on D3D12 and Vulkan and has zero synchronization on Metal.agfxCommandQueueSignal. Values must be strictly monotonic; a stale value lets a later wait pass immediately.agfxCommandBufferTextureBarrier takes explicit mip/layer parameters, or AGFX_SUBRESOURCE_ALL_MIPS/AGFX_SUBRESOURCE_ALL_LAYERS to target every mip/layer at once. Use per-subresource barriers (not "all") when only a specific mip is being written (e.g. mip-chain generation writing one mip at a time from the previous), otherwise other subresources get unnecessarily serialized.
© AmelieHeinrich, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .claude/skills/agfx-synchronization of AmelieHeinrich/agfx.
Open the folder on GitHubat commit d8ad38b
Agfx Synchronization next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Agfx Synchronization this skillAmelieHeinrich/agfx | 146 | — | ~3.6k | Automated safety check: Pass | MIT | |
| Image to Three.js Modelimg2threejs/img2threejs | 18k | 1 repos | ~8.2k | Automated safety check: Pass | Apache-2.0 | |
| Web CloneJane-xiaoer/claude-skill-web-clone | 1k | 1 repos | ~2.7k | Automated safety check: Pass | MIT | |
| Threejs Game Directormajidmanzarpour/threejs-game-skills | 2.5k | — | ~2.2k | Automated safety check: Pass | MIT | |
| Game Asset Generatorhtdt/godogen | 7.1k | — | ~2.8k | Automated safety check: Pass | MIT | |
| Threejs Gameplay Systemsvalkor-ai/loom | 1.2k | 1 repos | ~1.4k | Automated safety check: Pass | Apache-2.0 |
img2threejs/img2threejs
Rebuilds the object in a reference image as a procedural, animation-ready Three.js model written entirely in code, using staged sculpting with quality checks.
Jane-xiaoer/claude-skill-web-clone
网站复刻 / 克隆方法论。USE WHEN 用户说 复刻网站、克隆网站、clone website、抄个站、仿站、 照着这个站做一个、reproduce site、还原某个网页效果、把这个站搬下来改成我的、 复刻某个交互/WebGL/Canvas/Three.js 效果。提供「先拿真源码 → 判路径 → 逆向拆解 → 搭工程 → 替换内容」的可移植决策树,覆盖静态站 /…
majidmanzarpour/threejs-game-skills
Entrypoint for building, upgrading, and finishing Three.js browser games.
htdt/godogen
Generates game art from text prompts: PNG images, GLB 3D models, rigged characters, animations and sprites, with background removal.
valkor-ai/loom
Build and iterate playable Three.js game systems: starter scaffold, architecture, design briefs, core loops, level and encounter design, entities, input, camera, collision and physics, scoring…
CyberAgentGameEntertainment/NovaShader
Execute C with Unity APIs when existing uloop tools cannot inspect or edit enough.
AmelieHeinrich/agfx
ALWAYS use when porting an existing D3D11 engine or renderer to AGFX — translating ID3D11Device/DeviceContext/InputLayout/state-object code to agfxDevice/agfxCommandBuffer/agfxRenderPipeline calls…
AmelieHeinrich/agfx
ALWAYS use when porting an existing D3D12 engine or renderer to AGFX — translating ID3D12Device/CommandList/PipelineState/RootSignature/DescriptorHeap code to…
AmelieHeinrich/agfx
ALWAYS use when porting an existing OpenGL (or OpenGL ES) engine or renderer to AGFX — translating glGenTextures/glBindTexture/glBufferData/glUseProgram/FBO code to…
AmelieHeinrich/agfx
ALWAYS use when porting an existing Vulkan engine or renderer to AGFX — translating VkDevice/VkCommandBuffer/VkPipeline/VkDescriptorSet/VkRenderPass code to…
AmelieHeinrich/agfx
ALWAYS use when creating, resizing, or presenting through an agfxSwapChain in AGFX — window/layer handle setup, HDR toggling, vsync, resize handling, or back buffer acquire/present.
AmelieHeinrich/agfx
ALWAYS use when creating agfxRenderTarget or agfxRenderPass objects in AGFX, or wiring up color/depth attachments, load/store ops, viewport/scissor, or draw calls within a render pass.
Categories
ALWAYS use when working with AGFX fences, frames-in-flight pacing, queue signal/wait, resource-state barriers, or the barrier "agglomerate" flag. Agfx Synchronization is an agent skill from AmelieHeinrich/agfx. ALWAYS use when working with AGFX fences, frames-in-flight pacing, queue signal/wait, resource-state barriers, or the barrier "agglomerate" flag.
Agfx Synchronization fits situations like: working with AGFX fences; frames-in-flight pacing; queue signal/wait; resource-state barriers.
Run `npx skills add AmelieHeinrich/agfx --skill agfx-synchronization -a claude-code`. Or copy the skill folder (.claude/skills/agfx-synchronization in AmelieHeinrich/agfx) into .claude/skills/agfx-synchronization in your project. Claude Code loads it when a task matches its description.
Run `npx skills add AmelieHeinrich/agfx --skill agfx-synchronization -a codex`. Or copy the skill folder (.claude/skills/agfx-synchronization in AmelieHeinrich/agfx) into .agents/skills/agfx-synchronization in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add AmelieHeinrich/agfx --skill agfx-synchronization -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/agfx-synchronization, .gemini/skills/agfx-synchronization, .github/skills/agfx-synchronization and .opencode/skills/agfx-synchronization in your project.
SKILL.md names no scripts, command-line tools or credentials: Agfx Synchronization is instructions for the agent only.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Agfx Synchronization is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.6k tokens (SKILL.md is roughly 15k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Agfx Synchronization: Image to Three.js Model (img2threejs/img2threejs, 18k stars), Web Clone (Jane-xiaoer/claude-skill-web-clone, 1k stars), Threejs Game Director (majidmanzarpour/threejs-game-skills, 2.5k stars) and Game Asset Generator (htdt/godogen, 7.1k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
AmelieHeinrich (a GitHub user) maintains it in AmelieHeinrich/agfx, which has 146 GitHub stars. The repository holds 8 skills in this directory. The repository was last updated on September 27, 2026.
Source: AmelieHeinrich/agfx on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.