{"id":12898,"date":"2026-02-26T09:58:03","date_gmt":"2026-02-26T17:58:03","guid":{"rendered":"https:\/\/devblogs.microsoft.com\/directx\/?p=12898"},"modified":"2026-02-26T10:09:24","modified_gmt":"2026-02-26T18:09:24","slug":"fence-barriers-fine-grained-gpu-synchronization-in-direct3d-12","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/directx\/fence-barriers-fine-grained-gpu-synchronization-in-direct3d-12\/","title":{"rendered":"Fence Barriers: Fine-Grained GPU Synchronization in Direct3D 12"},"content":{"rendered":"<h2 dir=\"auto\" data-line=\"2\">Introducing Fence Barriers<\/h2>\n<p class=\"code-line\" dir=\"auto\" data-line=\"2\">We are excited to share the preview release of\u00a0<strong>Fence Barriers (Tier-1)<\/strong>, a new capability now available in AgilitySDK 1.719-preview (<a href=\"https:\/\/devblogs.microsoft.com\/directx\/directx12agility\/\">https:\/\/devblogs.microsoft.com\/directx\/directx12agility\/)<\/a>. Fence Barriers expand on Enhanced Barriers to provide support for signaling and waiting on fences\u00a0<em>during<\/em>\u00a0command buffer execution. This provides more flexibility to synchronize between more distant dependencies in the command stream and allows for real-time dependencies between the GPU timeline and CPU timeline.<\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"4\"><strong>This preview exposes Tier-1 Fence Barriers<\/strong>, which supports:<\/p>\n<ul class=\"code-line\" dir=\"auto\" data-line=\"6\">\n<li class=\"code-line\" dir=\"auto\" data-line=\"6\"><code>SignalBarrier<\/code> &#8211; Signals a fence when a barrier has completed execution.<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"7\"><code>WaitBarrier<\/code> &#8211; Waits for one or more fences to be signaled before issuing a dependent barrier.\n<ul class=\"code-line\" dir=\"auto\" data-line=\"8\">\n<li class=\"code-line\" dir=\"auto\" data-line=\"8\">Tier-1 supports only Command List Scoped fences signaled earlier in the same command buffer execution context.<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"9\">Provides a cleaner, more expressive option over split barriers.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p class=\"code-line\" dir=\"auto\" data-line=\"11\">Looking ahead,\u00a0<strong>Tier-2<\/strong> (<span data-olk-copy-source=\"MessageBody\">in-development<\/span>) will expand\u00a0<code>WaitBarrier\u00a0<\/code>support to include fences signaled by the CPU or other GPU queues, supporting more sophisticated CPU\/GPU and cross-queue rendering scenarios.<\/p>\n<p dir=\"auto\" data-line=\"11\">See the updated <a href=\"https:\/\/github.com\/microsoft\/DirectX-Specs\/blob\/master\/d3d\/D3D12EnhancedBarriers.md\">EnhancedBarriers spec<\/a> for details on FenceBarriers.<\/p>\n<h3 id=\"split-barrier-replacement-example\" class=\"code-line\" dir=\"auto\" data-line=\"13\">Split Barrier Replacement Example<\/h3>\n<pre><code>\/\/ Create a command list scoped fence\r\nComPtr&lt;ID3D12Fence&gt; pScopedFence;\r\npDevice-&gt;CreateFence(0, D3D12_FENCE_FLAG_ALLOW_COMMAND_LIST_BARRIERS, \r\n                     IID_PPV_ARGS(&amp;pScopedFence));\r\n\r\n\/\/ Initiate split barrier - begins layout transition without blocking\r\npCommandList-&gt;SignalBarrier(pScopedFence, 1, \/* barrier group *\/);\r\n\r\n\/\/ Do other independent work here...\r\n\r\n\/\/ Complete split barrier - wait for layout transition to finish\r\npCommandList-&gt;WaitBarrier(pScopedFence, 1, \/* barrier group *\/);\r\n\r\n\/\/ Now safe to use the resource<\/code><\/pre>\n<h2 id=\"cross-queue-synchronization-with-signalbarrier\" class=\"code-line\" dir=\"auto\" data-line=\"32\">Cross-Queue Synchronization<\/h2>\n<p class=\"code-line\" dir=\"auto\" data-line=\"34\">Tier-1 supports using\u00a0<code>SignalBarrier<\/code>\u00a0to improve work coordination across GPU queues. A compute queue can signal a fence after completing barrier operations, and a direct queue can then use traditional queue-level\u00a0<code>Wait<\/code>\u00a0(not\u00a0<code>WaitBarrier<\/code>) or poll the fence from the CPU.\u00a0<code>WaitBarrier<\/code>\u00a0in Tier-1 only works with Command List Scoped Fences\u2014Tier-2 will add\u00a0<code>WaitBarrier<\/code>\u00a0support for cross-queue scenarios.<\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"36\">When synchronizing across queues or with the CPU, use the\u00a0<code>D3D12_BARRIER_ACCESS_GLOBAL<\/code>\u00a0access bit for proper cache coherency. See the specification for details.<\/p>\n<h2 id=\"getting-started\" class=\"code-line\" dir=\"auto\" data-line=\"38\">Getting Started<\/h2>\n<p class=\"code-line\" dir=\"auto\" data-line=\"40\">Check for Fence Barriers support using\u00a0<code>CheckFeatureSupport<\/code>\u00a0with\u00a0<code>D3D12_FEATURE_FENCE_BARRIERS<\/code>.<\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"42\">See the specification for complete feature detection code and detailed requirements.<\/p>\n<h2 id=\"tier-2-fence-barriers\" class=\"code-line\" dir=\"auto\" data-line=\"47\">Tier-2 Fence Barriers<\/h2>\n<p class=\"code-line\" dir=\"auto\" data-line=\"49\">While this preview focuses on Fence Barriers Tier-1, Tier-2 is actively in development. Tier-2 requires driver support for native fences and OS kernel support for user mode submission (in development).<\/p>\n<h3 id=\"what-tier-2-will-bring\" class=\"code-line\" dir=\"auto\" data-line=\"51\">What Tier-2 Will Bring<\/h3>\n<ul class=\"code-line\" dir=\"auto\" data-line=\"53\">\n<li class=\"code-line\" dir=\"auto\" data-line=\"53\">\n<p class=\"code-line\" dir=\"auto\" data-line=\"53\">Full Cross-Queue\u00a0<code>WaitBarrier<\/code>\u00a0Support &#8211; Tier-1 restricts\u00a0<code>WaitBarrier<\/code>\u00a0usage with fences that have both\u00a0<code>D3D12_FENCE_FLAG_ALLOW_COMMAND_LIST_BARRIERS<\/code>\u00a0and\u00a0<code>D3D12_FENCE_FLAG_ALLOW_QUEUE_AND_CPU_SYNC<\/code>\u00a0flags set. Tier-2 removes this restriction, enabling seamless\u00a0<code>WaitBarrier<\/code>\u00a0operations across all queue types with any fence created with\u00a0<code>D3D12_FENCE_FLAG_ALLOW_COMMAND_LIST_BARRIERS<\/code>.<\/p>\n<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"55\">\n<p class=\"code-line\" dir=\"auto\" data-line=\"55\">Enhanced CPU\/GPU Synchronization &#8211; While Tier-1 focuses on Command List Scoped Fences, Tier-2 will provide full CPU\/GPU synchronization capabilities through\u00a0<code>WaitBarrier<\/code>, making it easier to coordinate work between the CPU and GPU timelines.<\/p>\n<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"57\">\n<p class=\"code-line\" dir=\"auto\" data-line=\"57\">Advanced Hardware Features &#8211; Tier-2 requires kernel and driver support for user mode submission queues and native fences (sometimes referred to as &#8220;Hardware Scheduling Stage 3&#8221;), which enables more efficient fence operations at the hardware level.<\/p>\n<\/li>\n<\/ul>\n<h2 id=\"preview-driver-support\" class=\"code-line\" dir=\"auto\" data-line=\"59\">Windows Version and Driver Support<\/h2>\n<p class=\"code-line\" dir=\"auto\" data-line=\"61\"><span class=\"markp2lkennnq\" data-markjs=\"true\" data-ogac=\"\" data-ogab=\"\" data-ogsc=\"\" data-ogsb=\"\" data-olk-copy-source=\"MessageBody\">Fence Barriers Tier-1 is supported on all Windows 11 release builds with the necessary driver updates.<\/span><\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"61\">Fence Barriers Tier-1 is supported in <u><span data-ogsc=\"blue\"><a title=\"Original URL: https:\/\/www.amd.com\/en\/resources\/support-articles\/release-notes\/RN-RAD-MS-AGILITY-SDK-25-30-21-01.html. Click or tap if you trust this link.\" href=\"https:\/\/nam06.safelinks.protection.outlook.com\/?url=https%3A%2F%2Fwww.amd.com%2Fen%2Fresources%2Fsupport-articles%2Frelease-notes%2FRN-RAD-MS-AGILITY-SDK-25-30-21-01.html&amp;data=05%7C02%7CBill.Kristiansen%40microsoft.com%7C14b8cea183e846bcb24c08de6b37fd53%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C639066085404794963%7CUnknown%7CTWFpbGZsb3d8eyJFbXB0eU1hcGkiOnRydWUsIlYiOiIwLjAuMDAwMCIsIlAiOiJXaW4zMiIsIkFOIjoiTWFpbCIsIldUIjoyfQ%3D%3D%7C0%7C%7C%7C&amp;sdata=BCFPG6ZzERsq6crwwjBWidWROxAW3%2FjWpCaC0mDKfI4%3D&amp;reserved=0\" data-auth=\"NotApplicable\" data-linkindex=\"2\" data-ogsc=\"\">AMD Software: AgilitySDK Developer Preview Edition 25.30.21.01<\/a><\/span><\/u> and on Intel GPUs using the latest public drivers. Other GPU vendors are planning to support Tier-1 fence barriers soon.<\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"65\">We encourage you to experiment with Fence Barriers in your projects and share your feedback.<\/p>\n<p class=\"code-line code-active-line\" dir=\"auto\" data-line=\"67\">Thanks!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introducing Fence Barriers We are excited to share the preview release of\u00a0Fence Barriers (Tier-1), a new capability now available in AgilitySDK 1.719-preview (https:\/\/devblogs.microsoft.com\/directx\/directx12agility\/). Fence Barriers expand on Enhanced Barriers to provide support for signaling and waiting on fences\u00a0during\u00a0command buffer execution. This provides more flexibility to synchronize between more distant dependencies in the command stream and [&hellip;]<\/p>\n","protected":false},"author":2473,"featured_media":12651,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-12898","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-directx"],"acf":[],"blog_post_summary":"<p>Introducing Fence Barriers We are excited to share the preview release of\u00a0Fence Barriers (Tier-1), a new capability now available in AgilitySDK 1.719-preview (https:\/\/devblogs.microsoft.com\/directx\/directx12agility\/). Fence Barriers expand on Enhanced Barriers to provide support for signaling and waiting on fences\u00a0during\u00a0command buffer execution. This provides more flexibility to synchronize between more distant dependencies in the command stream and [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/directx\/wp-json\/wp\/v2\/posts\/12898","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/directx\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/directx\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/directx\/wp-json\/wp\/v2\/users\/2473"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/directx\/wp-json\/wp\/v2\/comments?post=12898"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/directx\/wp-json\/wp\/v2\/posts\/12898\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/directx\/wp-json\/wp\/v2\/media\/12651"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/directx\/wp-json\/wp\/v2\/media?parent=12898"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/directx\/wp-json\/wp\/v2\/categories?post=12898"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/directx\/wp-json\/wp\/v2\/tags?post=12898"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}