Handmade Hero»Episode Guide
Asynchronous Ground Chunk Composition
?
?

Keyboard Navigation

Global Keys

[, < / ], > Jump to previous / next episode
W, K, P / S, J, N Jump to previous / next marker
t / T Toggle theatre / SUPERtheatre mode
V Revert filter to original state Y Select link (requires manual Ctrl-c)

Menu toggling

q Quotes r References f Filter y Link c Credits

In-Menu Movement

a
w
s
d
h j k l


Quotes and References Menus

Enter Jump to timecode

Quotes, References and Credits Menus

o Open URL (in new tab)

Filter Menu

x, Space Toggle category and focus next
X, ShiftSpace Toggle category and focus previous
v Invert topics / media as per focus

Filter and Link Menus

z Toggle filter / linking mode

Credits Menu

Enter Open URL (in new tab)
2:40Run the game and identify our slight problem
2:40Run the game and identify our slight problem
2:40Run the game and identify our slight problem
4:22Why we couldn't generate the ground chunks on a separate thread
4:22Why we couldn't generate the ground chunks on a separate thread
4:22Why we couldn't generate the ground chunks on a separate thread
6:47handmade.h: Allow PushSize_ to take an Alignment
6:47handmade.h: Allow PushSize_ to take an Alignment
6:47handmade.h: Allow PushSize_ to take an Alignment
8:15Introduce AlignmentMask
8:15Introduce AlignmentMask
8:15Introduce AlignmentMask
10:13Blackboard: Turning a power of 2 into a mask
10:13Blackboard: Turning a power of 2 into a mask
10:13Blackboard: Turning a power of 2 into a mask
13:03Set the AlignmentOffset based on the AlignmentMask
13:03Set the AlignmentOffset based on the AlignmentMask
13:03Set the AlignmentOffset based on the AlignmentMask
16:47Go over PushSize_ one more time
16:47Go over PushSize_ one more time
16:47Go over PushSize_ one more time
17:57Debugger: Step through PushSize_
17:57Debugger: Step through PushSize_
17:57Debugger: Step through PushSize_
18:48handmade.h: Add ## __VA__ARGS to these Push* definitions
18:48handmade.h: Add ## __VA__ARGS to these Push* definitions
18:48handmade.h: Add ## __VA__ARGS to these Push* definitions
20:58handmade.cpp: Pass 16 to this PushSize call and run the game
20:58handmade.cpp: Pass 16 to this PushSize call and run the game
20:58handmade.cpp: Pass 16 to this PushSize call and run the game
21:57Consider queueing up all of FillGroundChunk
21:57Consider queueing up all of FillGroundChunk
21:57Consider queueing up all of FillGroundChunk
23:16Turn off TiledRenderGroupToOutput
23:16Turn off TiledRenderGroupToOutput
23:16Turn off TiledRenderGroupToOutput
23:40handmade_render_group.cpp: Switch to the player's camera and walk around
23:40handmade_render_group.cpp: Switch to the player's camera and walk around
23:40handmade_render_group.cpp: Switch to the player's camera and walk around
24:12On leaving part of what we're doing synchronous
24:12On leaving part of what we're doing synchronous
24:12On leaving part of what we're doing synchronous
25:48Provide a temporary storage area to enable the background task to work without the data getting overwritten
25:48Provide a temporary storage area to enable the background task to work without the data getting overwritten
25:48Provide a temporary storage area to enable the background task to work without the data getting overwritten
27:11handmade.h: Introduce GroundChunkArenas
27:11handmade.h: Introduce GroundChunkArenas
27:11handmade.h: Introduce GroundChunkArenas
28:55Introduce task_with_memory
28:55Introduce task_with_memory
28:55Introduce task_with_memory
29:58handmade.cpp: Create a bunch of Tasks which each create a SubArena
29:58handmade.cpp: Create a bunch of Tasks which each create a SubArena
29:58handmade.cpp: Create a bunch of Tasks which each create a SubArena
31:47Look at how FillGroundChunk works
31:47Look at how FillGroundChunk works
31:47Look at how FillGroundChunk works
32:28handmade.h: Make it implicit in task_with_memory that the memory is temporary
32:28handmade.h: Make it implicit in task_with_memory that the memory is temporary
32:28handmade.h: Make it implicit in task_with_memory that the memory is temporary
33:08handmade.cpp: Implement BeginTaskWithMemory and EndTaskWithMemory
33:08handmade.cpp: Implement BeginTaskWithMemory and EndTaskWithMemory
33:08handmade.cpp: Implement BeginTaskWithMemory and EndTaskWithMemory
34:10Do FillGroundChunk if BeginTaskWithMemory is true
34:10Do FillGroundChunk if BeginTaskWithMemory is true
34:10Do FillGroundChunk if BeginTaskWithMemory is true
36:01Write BeginTaskWithMemory
36:01Write BeginTaskWithMemory
36:01Write BeginTaskWithMemory
38:48Put TiledRenderGroupToOutput on the background threads
38:48Put TiledRenderGroupToOutput on the background threads
38:48Put TiledRenderGroupToOutput on the background threads
40:13handmade_render_group.cpp: Introduce RenderGroupToOutput as a non-tiled version
40:13handmade_render_group.cpp: Introduce RenderGroupToOutput as a non-tiled version
40:13handmade_render_group.cpp: Introduce RenderGroupToOutput as a non-tiled version
42:21handmade.cpp: Call RenderGroupToOutput
42:21handmade.cpp: Call RenderGroupToOutput
42:21handmade.cpp: Call RenderGroupToOutput
44:27handmade_intrinsics.h: #define CompletePreviousWritesBeforeFutureWrites
44:27handmade_intrinsics.h: #define CompletePreviousWritesBeforeFutureWrites
44:27handmade_intrinsics.h: #define CompletePreviousWritesBeforeFutureWrites
45:20handmade.cpp: Clean up
45:20handmade.cpp: Clean up
45:20handmade.cpp: Clean up
45:51Do AllocateRenderGroup from &Task->Arena
45:51Do AllocateRenderGroup from &Task->Arena
45:51Do AllocateRenderGroup from &Task->Arena
46:55Introduce fill_ground_chunk_work
46:55Introduce fill_ground_chunk_work
46:55Introduce fill_ground_chunk_work
47:51Put fill_ground_chunk_work into PLATFORM_WORK_QUEUE_CALLBACK
47:51Put fill_ground_chunk_work into PLATFORM_WORK_QUEUE_CALLBACK
47:51Put fill_ground_chunk_work into PLATFORM_WORK_QUEUE_CALLBACK
48:30Put fill_ground_chunk_work into FillGroundChunk and fill it out at the end
48:30Put fill_ground_chunk_work into FillGroundChunk and fill it out at the end
48:30Put fill_ground_chunk_work into FillGroundChunk and fill it out at the end
49:14Call PlatformAddEntry
49:14Call PlatformAddEntry
49:14Call PlatformAddEntry
49:54handmade.h: Implement GetArenaSizeRemaining
49:54handmade.h: Implement GetArenaSizeRemaining
49:54handmade.h: Implement GetArenaSizeRemaining
51:38Introduce GetAlignmentOffset
51:38Introduce GetAlignmentOffset
51:38Introduce GetAlignmentOffset
52:57Calculate that Result in GetArenaSizeRemaining and clean up
52:57Calculate that Result in GetArenaSizeRemaining and clean up
52:57Calculate that Result in GetArenaSizeRemaining and clean up
54:25handmade.cpp: Cast GetArenaSizeRemaining to uint32 in FillGroundChunk
54:25handmade.cpp: Cast GetArenaSizeRemaining to uint32 in FillGroundChunk
54:25handmade.cpp: Cast GetArenaSizeRemaining to uint32 in FillGroundChunk
56:12handmade.h: Implement SubArena
56:12handmade.h: Implement SubArena
56:12handmade.h: Implement SubArena
58:41Walk through our new functionality
58:41Walk through our new functionality
58:41Walk through our new functionality
1:00:00Debugger: Start stepping through the code
1:00:00Debugger: Start stepping through the code
1:00:00Debugger: Start stepping through the code
1:04:52Debugger: NextInHash is not valid
1:04:52Debugger: NextInHash is not valid
1:04:52Debugger: NextInHash is not valid
1:05:52handmade.h: Put the += Size in the correct spot in PushSize_
1:05:52handmade.h: Put the += Size in the correct spot in PushSize_
1:05:52handmade.h: Put the += Size in the correct spot in PushSize_
1:06:26Debugger: Identify that MaxPushBufferSize needs to take PushStruct into account
1:06:26Debugger: Identify that MaxPushBufferSize needs to take PushStruct into account
1:06:26Debugger: Identify that MaxPushBufferSize needs to take PushStruct into account
1:06:47handmade_render_group.cpp: Conditionally set MaxPushBufferSize in AllocateRenderGroup
1:06:47handmade_render_group.cpp: Conditionally set MaxPushBufferSize in AllocateRenderGroup
1:06:47handmade_render_group.cpp: Conditionally set MaxPushBufferSize in AllocateRenderGroup
1:08:00Debugger: Continue stepping through and note that the TempCount is 2
1:08:00Debugger: Continue stepping through and note that the TempCount is 2
1:08:00Debugger: Continue stepping through and note that the TempCount is 2
1:08:38handmade.cpp: Set Task->BeingUsed = true in BeginTaskWithMemory
1:08:38handmade.cpp: Set Task->BeingUsed = true in BeginTaskWithMemory
1:08:38handmade.cpp: Set Task->BeingUsed = true in BeginTaskWithMemory
1:08:52Run the game successfully
1:08:52Run the game successfully
1:08:52Run the game successfully
1:09:32handmade_render_group.cpp: Reenable the debug camera
1:09:32handmade_render_group.cpp: Reenable the debug camera
1:09:32handmade_render_group.cpp: Reenable the debug camera
1:11:13Q&A
🗩
1:11:13Q&A
🗩
1:11:13Q&A
🗩
1:12:02nicstop If one of the task_with_memory, which has several task_with_memory in front of it, calls EndTaskWithMemory first, will the stuff in front of it be screwed up? Or is this case not possible? Because I have a feeling that I don't understand something
🗪
1:12:02nicstop If one of the task_with_memory, which has several task_with_memory in front of it, calls EndTaskWithMemory first, will the stuff in front of it be screwed up? Or is this case not possible? Because I have a feeling that I don't understand something
🗪
1:12:02nicstop If one of the task_with_memory, which has several task_with_memory in front of it, calls EndTaskWithMemory first, will the stuff in front of it be screwed up? Or is this case not possible? Because I have a feeling that I don't understand something
🗪
1:12:28Blackboard: What goes in the arenas and how they work
1:12:28Blackboard: What goes in the arenas and how they work
1:12:28Blackboard: What goes in the arenas and how they work
1:14:49poohshoes We already had memory reserved for the GroundBuffers. Why couldn't we just use that memory for the threaded stuff?
🗪
1:14:49poohshoes We already had memory reserved for the GroundBuffers. Why couldn't we just use that memory for the threaded stuff?
🗪
1:14:49poohshoes We already had memory reserved for the GroundBuffers. Why couldn't we just use that memory for the threaded stuff?
🗪
1:16:10connorgroove What are the lines on the screen?
🗪
1:16:10connorgroove What are the lines on the screen?
🗪
1:16:10connorgroove What are the lines on the screen?
🗪
1:16:58win32_handmade.cpp: Set OffsetX and OffsetY to 0 in Win32DisplayBufferInWindow for now
1:16:58win32_handmade.cpp: Set OffsetX and OffsetY to 0 in Win32DisplayBufferInWindow for now
1:16:58win32_handmade.cpp: Set OffsetX and OffsetY to 0 in Win32DisplayBufferInWindow for now
1:19:29noxy_key So you've basically constructed a task pool for ground chunks to run on another thread. Can you use this mechanism for other types of tasks as well?
🗪
1:19:29noxy_key So you've basically constructed a task pool for ground chunks to run on another thread. Can you use this mechanism for other types of tasks as well?
🗪
1:19:29noxy_key So you've basically constructed a task pool for ground chunks to run on another thread. Can you use this mechanism for other types of tasks as well?
🗪
1:19:49poohshoes Why not put the stuff at the top of the transient arena (i.e. ground chunk bitmaps) into the permanent storage?
🗪
1:19:49poohshoes Why not put the stuff at the top of the transient arena (i.e. ground chunk bitmaps) into the permanent storage?
🗪
1:19:49poohshoes Why not put the stuff at the top of the transient arena (i.e. ground chunk bitmaps) into the permanent storage?
🗪
1:20:09ankut Why does it flash magenta once in a while? Is it because we're drawing without the work being finished?
🗪
1:20:09ankut Why does it flash magenta once in a while? Is it because we're drawing without the work being finished?
🗪
1:20:09ankut Why does it flash magenta once in a while? Is it because we're drawing without the work being finished?
🗪
1:20:40Wrap things up
🗩
1:20:40Wrap things up
🗩
1:20:40Wrap things up
🗩