Skip to content

Commit b3d1d12

Browse files
committed
Fix cross-reference paths in Synchronization tutorial chapters
Update all xref links to use absolute paths prefixed with 'Synchronization/' instead of relative paths. Correct image references to use absolute paths starting with '/images/'. This ensures proper navigation between chapters and correct image rendering across the Synchronization tutorial series.
1 parent 7be8457 commit b3d1d12

35 files changed

Lines changed: 52 additions & 52 deletions

en/Synchronization/Anatomy_of_a_Dependency/01_introduction.adoc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
Every Vulkan operation, from a simple color clear to a complex ray-traced reflections pass, lives and breathes by the dependencies we define. In this chapter, we take a deep dive into the core mechanics of how data actually moves through the Vulkan pipeline and why synchronization is about much more than just "setting a bitmask."
77

8-
image::../../../images/rendering_pipeline_flowchart.png[Rendering Pipeline Flowchart, width=600, alt="Flowchart showing the stages of a modern Vulkan rendering pipeline"]
8+
image::/images/rendering_pipeline_flowchart.png[Rendering Pipeline Flowchart, width=600, alt="Flowchart showing the stages of a modern Vulkan rendering pipeline"]
99

1010
To truly master synchronization, we first need to break down what happens when the GPU processes your commands. We often talk about the GPU as a "massive parallel processor," but what does that mean for data integrity? We'll start by deconstructing the fundamental differences between **Execution Dependencies** (the "when" of GPU work) and **Memory Dependencies** (the "where" and "visibility" of data).
1111

@@ -22,4 +22,4 @@ By the end of this chapter, you’ll have a clear understanding of the "handshak
2222

2323
== Navigation
2424

25-
Previous: xref:../introduction.adoc[Introduction] | Next: xref:02_execution_vs_memory.adoc[Execution vs. Memory Dependencies]
25+
Previous: xref:Synchronization/introduction.adoc[Introduction] | Next: xref:Synchronization/Anatomy_of_a_Dependency/02_execution_vs_memory.adoc[Execution vs. Memory Dependencies]

en/Synchronization/Anatomy_of_a_Dependency/02_execution_vs_memory.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,4 +58,4 @@ For our textures and vertex buffers, we use `DeviceLocal` memory for maximum per
5858

5959
== Navigation
6060

61-
Previous: xref:01_introduction.adoc[Introduction] | Next: xref:03_sync2_advantage.adoc[The Synchronization 2 Advantage]
61+
Previous: xref:Synchronization/Anatomy_of_a_Dependency/01_introduction.adoc[Introduction] | Next: xref:Synchronization/Anatomy_of_a_Dependency/03_sync2_advantage.adoc[The Synchronization 2 Advantage]

en/Synchronization/Anatomy_of_a_Dependency/03_sync2_advantage.adoc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ Notice the problem? The `srcStageMask` and `dstStageMask` were passed as argumen
2929

3030
This led to "over-synchronization." By merging the stages at the function level, you were inadvertently telling the GPU to wait for *all* the source stages to finish before *any* of the destination stages could start. You were creating a bottleneck where one didn't need to exist.
3131

32-
image::{imagesdir}/sync2_problem_over_sync.svg[Legacy Synchronization Log Jam, width=600, align="center"]
32+
image::/images/sync2_problem_over_sync.svg[Legacy Synchronization Log Jam, width=600, align="center"]
3333

3434
== The "Chain of Intent": Unification with vk::DependencyInfo
3535

@@ -56,7 +56,7 @@ vk::DependencyInfo dependencyInfo{
5656
commandBuffer.pipelineBarrier2(dependencyInfo);
5757
----
5858

59-
image::{imagesdir}/sync2_solution_granular.svg[Synchronization 2 Granular Control, width=600, align="center"]
59+
image::/images/sync2_solution_granular.svg[Synchronization 2 Granular Control, width=600, align="center"]
6060

6161
This is a massive win for human readability. When you look at that `imageBarrier` block, you see a complete "handshake." You know exactly what work is finishing (`src`) and exactly what work is waiting (`dst`). There's no need to hunt through function arguments or global variables to find the other half of the dependency.
6262

@@ -192,4 +192,4 @@ In the next section, we'll dive deeper into how to pick the right stages and fla
192192

193193
== Navigation
194194

195-
Previous: xref:02_execution_vs_memory.adoc[Execution vs. Memory Dependencies] | Next: xref:04_refined_pipeline_stages.adoc[Refined Pipeline Stages]
195+
Previous: xref:Synchronization/Anatomy_of_a_Dependency/02_execution_vs_memory.adoc[Execution vs. Memory Dependencies] | Next: xref:Synchronization/Anatomy_of_a_Dependency/04_refined_pipeline_stages.adoc[Refined Pipeline Stages]

en/Synchronization/Anatomy_of_a_Dependency/04_refined_pipeline_stages.adoc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ In the previous sections, we saw how Synchronization 2 unifies the API. But the
99

1010
When you use an overly broad stage mask, you create what’s known as a **Pipeline Bubble**. Modern GPUs are designed to keep as many specialized hardware units—the rasterizers, the compute cores, the fixed-function blit engines—busy as possible. If you tell the GPU to wait at `eAllCommands`, you are essentially draining the entire pipeline. The GPU must wait until every previous operation is completely finished before it can start even the smallest part of the next operation.
1111

12-
image::../../../images/vulkan_pipeline_block_diagram.png[Vulkan Pipeline Block Diagram, width=800, alt="A block diagram of the Vulkan graphics pipeline showing its various stages"]
12+
image::/images/vulkan_pipeline_block_diagram.png[Vulkan Pipeline Block Diagram, width=800, alt="A block diagram of the Vulkan graphics pipeline showing its various stages"]
1313

1414
With Synchronization 2, we can be far more surgical. If you're only interested in ensuring that a compute shader has finished writing to a storage buffer before a fragment shader reads it, you can target `eComputeShader` and `eFragmentShader` specifically. This allows other parts of the GPU, like the geometry engine or the rasterizer, to keep working on independent tasks.
1515

@@ -56,4 +56,4 @@ Next, we'll take these foundational concepts and apply them to the most common s
5656

5757
== Navigation
5858

59-
Previous: xref:03_sync2_advantage.adoc[The Synchronization 2 Advantage] | Next: xref:../Pipeline_Barriers_Transitions/01_introduction.adoc[Pipeline Barriers and Transitions - Introduction]
59+
Previous: xref:Synchronization/Anatomy_of_a_Dependency/03_sync2_advantage.adoc[The Synchronization 2 Advantage] | Next: xref:Synchronization/Pipeline_Barriers_Transitions/01_introduction.adoc[Pipeline Barriers and Transitions - Introduction]

en/Synchronization/Async_Compute_Overlap/01_introduction.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,4 @@ By the end of this chapter, you'll be able to move your engine from a serial seq
2525

2626
== Navigation
2727

28-
Previous: xref:../Frame_in_Flight/03_resource_lifetimes.adoc[Resource Lifetimes] | Next: xref:02_maximizing_throughput.adoc[Maximizing Throughput]
28+
Previous: xref:Synchronization/Frame_in_Flight/03_resource_lifetimes.adoc[Resource Lifetimes] | Next: xref:Synchronization/Async_Compute_Overlap/02_maximizing_throughput.adoc[Maximizing Throughput]

en/Synchronization/Async_Compute_Overlap/02_maximizing_throughput.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,4 +65,4 @@ In the next section, we'll see a concrete implementation of this pattern: async
6565

6666
== Navigation
6767

68-
Previous: xref:01_introduction.adoc[Introduction] | Next: xref:03_async_post_processing.adoc[Async Post-Processing]
68+
Previous: xref:Synchronization/Async_Compute_Overlap/01_introduction.adoc[Introduction] | Next: xref:Synchronization/Async_Compute_Overlap/03_async_post_processing.adoc[Async Post-Processing]

en/Synchronization/Async_Compute_Overlap/03_async_post_processing.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,4 +67,4 @@ In the final section of this chapter, we'll look at how to identify and eliminat
6767

6868
== Navigation
6969

70-
Previous: xref:02_maximizing_throughput.adoc[Maximizing Throughput] | Next: xref:04_bubble_problem.adoc[The Bubble Problem]
70+
Previous: xref:Synchronization/Async_Compute_Overlap/02_maximizing_throughput.adoc[Maximizing Throughput] | Next: xref:Synchronization/Async_Compute_Overlap/04_bubble_problem.adoc[The Bubble Problem]

en/Synchronization/Async_Compute_Overlap/04_bubble_problem.adoc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ A "bubble" in the GPU timeline is a period where some units are idle because the
77

88
To find these, we use hardware profilers like **NVIDIA Nsight Graphics**, **AMD Radeon GPU Profiler**, or even the **LunarG Synchronization Validation** layer. In a profiler, a bubble looks like a gap in the timeline where the Graphics or Compute rows are empty while the other is busy.
99

10-
image::../../../images/vulkan_simplified_pipeline.svg[Vulkan Simplified Pipeline, width=400, alt="Simplified diagram of the Vulkan pipeline used to illustrate where bubbles can occur"]
10+
image::/images/vulkan_simplified_pipeline.svg[Vulkan Simplified Pipeline, width=400, alt="Simplified diagram of the Vulkan pipeline used to illustrate where bubbles can occur"]
1111

1212
== Common Causes of Bubbles
1313

@@ -27,4 +27,4 @@ By systematically finding and eliminating these bubbles, you move from a rendere
2727

2828
== Navigation
2929

30-
Previous: xref:03_async_post_processing.adoc[Async Post-Processing] | Next: xref:../Transfer_Queues_Streaming/01_introduction.adoc[Transfer Queues & Asset Streaming Sync]
30+
Previous: xref:Synchronization/Async_Compute_Overlap/03_async_post_processing.adoc[Async Post-Processing] | Next: xref:Synchronization/Transfer_Queues_Streaming/01_introduction.adoc[Transfer Queues & Asset Streaming Sync]

en/Synchronization/Dynamic_Rendering_Sync/01_introduction.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,4 @@ By the end of this chapter, you'll be able to confidently architect a high-perfo
2424

2525
== Navigation
2626

27-
Previous: xref:../Transfer_Queues_Streaming/03_staging_sync.adoc[Staging Synchronization] | Next: xref:02_subpass_replacement.adoc[Subpass Replacement]
27+
Previous: xref:Synchronization/Transfer_Queues_Streaming/03_staging_sync.adoc[Staging Synchronization] | Next: xref:Synchronization/Dynamic_Rendering_Sync/02_subpass_replacement.adoc[Subpass Replacement]

en/Synchronization/Dynamic_Rendering_Sync/02_subpass_replacement.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,4 +60,4 @@ This explicit approach is what allowed us to easily add **Forward+ Lighting** to
6060

6161
== Navigation
6262

63-
Previous: xref:01_introduction.adoc[Introduction] | Next: xref:03_local_read_sync.adoc[Local Read Sync]
63+
Previous: xref:Synchronization/Dynamic_Rendering_Sync/01_introduction.adoc[Introduction] | Next: xref:Synchronization/Dynamic_Rendering_Sync/03_local_read_sync.adoc[Local Read Sync]

0 commit comments

Comments
 (0)