Handmade Hero»Episode Guide
Looking for GPU Performance Issues
?
?

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)
0:02Welcome to the stream
🗩
0:02Welcome to the stream
🗩
0:02Welcome to the stream
🗩
0:14A few words on RenderDoc's crash message yesterday, with praise for their tech support, and plans to enable the game to fail gracefully when launched with incorrect parameters
🗩
0:14A few words on RenderDoc's crash message yesterday, with praise for their tech support, and plans to enable the game to fail gracefully when launched with incorrect parameters
🗩
0:14A few words on RenderDoc's crash message yesterday, with praise for their tech support, and plans to enable the game to fail gracefully when launched with incorrect parameters
🗩
3:48Launch Handmade Hero in RenderDoc
🏃
3:48Launch Handmade Hero in RenderDoc
🏃
3:48Launch Handmade Hero in RenderDoc
🏃
4:13Set the wrong Working Directory in RenderDoc
🗹
4:13Set the wrong Working Directory in RenderDoc
🗹
4:13Set the wrong Working Directory in RenderDoc
🗹
4:34Crash RenderDoc upon launching Handmade Hero
🏃
4:34Crash RenderDoc upon launching Handmade Hero
🏃
4:34Crash RenderDoc upon launching Handmade Hero
🏃
6:12Launch Handmade Hero in RemedyBG with the Working Directory set wrong
🏃
6:12Launch Handmade Hero in RemedyBG with the Working Directory set wrong
🏃
6:12Launch Handmade Hero in RemedyBG with the Working Directory set wrong
🏃
7:15Hit our assertion in GetFontInfo()
🏃
7:15Hit our assertion in GetFontInfo()
🏃
7:15Hit our assertion in GetFontInfo()
🏃
7:39Make GetFontInfo() additionally assert that the Asset's Type is HHAAsset_None
7:39Make GetFontInfo() additionally assert that the Asset's Type is HHAAsset_None
7:39Make GetFontInfo() additionally assert that the Asset's Type is HHAAsset_None
8:34Hit our TextureIndex assertion in PushQuad()
🏃
8:34Hit our TextureIndex assertion in PushQuad()
🏃
8:34Hit our TextureIndex assertion in PushQuad()
🏃
9:55Enable all our asset Get*() functions to handle the absence of assets
9:55Enable all our asset Get*() functions to handle the absence of assets
9:55Enable all our asset Get*() functions to handle the absence of assets
16:43Run successfully with our incorrect Working Directory
🏃
16:43Run successfully with our incorrect Working Directory
🏃
16:43Run successfully with our incorrect Working Directory
🏃
17:13Enable AllocateGameAssets() to issue a warning notification when no assets were available
17:13Enable AllocateGameAssets() to issue a warning notification when no assets were available
17:13Enable AllocateGameAssets() to issue a warning notification when no assets were available
23:17Crash RemedyBG apparently on a jump-to-zero
🏃
23:17Crash RemedyBG apparently on a jump-to-zero
🏃
23:17Crash RemedyBG apparently on a jump-to-zero
🏃
23:58Create jump_to_zero_crash.cpp
23:58Create jump_to_zero_crash.cpp
23:58Create jump_to_zero_crash.cpp
25:07Run jump_to_zero to find that RemedyBG is fine with it
🏃
25:07Run jump_to_zero to find that RemedyBG is fine with it
🏃
25:07Run jump_to_zero to find that RemedyBG is fine with it
🏃
25:48Run Handmade Hero successfully with our new warning code
🏃
25:48Run Handmade Hero successfully with our new warning code
🏃
25:48Run Handmade Hero successfully with our new warning code
🏃
26:38Introduce Win32ErrorMessage()
26:38Introduce Win32ErrorMessage()
26:38Introduce Win32ErrorMessage()
28:31Run and close cleanly
🏃
28:31Run and close cleanly
🏃
28:31Run and close cleanly
🏃
28:44Make Win32ErrorMessage() print out an error message1
28:44Make Win32ErrorMessage() print out an error message1
28:44Make Win32ErrorMessage() print out an error message1
34:16Run and close with our warning box
🏃
34:16Run and close with our warning box
🏃
34:16Run and close with our warning box
🏃
34:39Fix the MBoxType in Win32ErrorMessage()2
34:39Fix the MBoxType in Win32ErrorMessage()2
34:39Fix the MBoxType in Win32ErrorMessage()2
35:46Run and close with our warning box
🏃
35:46Run and close with our warning box
🏃
35:46Run and close with our warning box
🏃
35:51Temporarily try making AllocateGameAssets() produce a Fatal error
35:51Temporarily try making AllocateGameAssets() produce a Fatal error
35:51Temporarily try making AllocateGameAssets() produce a Fatal error
36:17Run and close with our error box
🏃
36:17Run and close with our error box
🏃
36:17Run and close with our error box
🏃
36:29Make WinMainCRTStartup() emit errors using Win32ErrorMessage()
36:29Make WinMainCRTStartup() emit errors using Win32ErrorMessage()
36:29Make WinMainCRTStartup() emit errors using Win32ErrorMessage()
38:58Run and close with our warning box
🏃
38:58Run and close with our warning box
🏃
38:58Run and close with our warning box
🏃
39:06Run unsuccessfully with the correct Working Directory
🏃
39:06Run unsuccessfully with the correct Working Directory
🏃
39:06Run unsuccessfully with the correct Working Directory
🏃
41:16We've got a saucy bean
🗩
41:16We've got a saucy bean
🗩
41:16We've got a saucy bean
🗩
42:12Fix GetBitmap() to correctly set the TextureHandle
42:12Fix GetBitmap() to correctly set the TextureHandle
42:12Fix GetBitmap() to correctly set the TextureHandle
43:45Run successfully
🏃
43:45Run successfully
🏃
43:45Run successfully
🏃
44:02Run in RenderDoc with the wrong Working Directory
🏃
44:02Run in RenderDoc with the wrong Working Directory
🏃
44:02Run in RenderDoc with the wrong Working Directory
🏃
44:25Crash RenderDoc post-exit
🏃
44:25Crash RenderDoc post-exit
🏃
44:25Crash RenderDoc post-exit
🏃
45:40Run in RenderDoc with the correct Working Directory, noting that we sometimes miss 60 FPS
🏃
45:40Run in RenderDoc with the correct Working Directory, noting that we sometimes miss 60 FPS
🏃
45:40Run in RenderDoc with the correct Working Directory, noting that we sometimes miss 60 FPS
🏃
46:54Capture a frame in RenderDoc and see that it took 35590 µs
🏃
46:54Capture a frame in RenderDoc and see that it took 35590 µs
🏃
46:54Capture a frame in RenderDoc and see that it took 35590 µs
🏃
48:48Look at our four Colour Passes, and plan to submit vertices economically
🏃
48:48Look at our four Colour Passes, and plan to submit vertices economically
🏃
48:48Look at our four Colour Passes, and plan to submit vertices economically
🏃
51:37Make OpenGLInit() disable RequestVSync
51:37Make OpenGLInit() disable RequestVSync
51:37Make OpenGLInit() disable RequestVSync
52:40Find that our frame time hovers around 14 ms per frame
🏃
52:40Find that our frame time hovers around 14 ms per frame
🏃
52:40Find that our frame time hovers around 14 ms per frame
🏃
53:27Reacquaint ourselves with our render dispatch in OpenGLEndFrame()
📖
53:27Reacquaint ourselves with our render dispatch in OpenGLEndFrame()
📖
53:27Reacquaint ourselves with our render dispatch in OpenGLEndFrame()
📖
55:31Understanding glMapBuffer()3
📖
55:31Understanding glMapBuffer()3
📖
55:31Understanding glMapBuffer()3
📖
57:57Nsight rendering time: 14ms to 18ms / frame
🏃
57:57Nsight rendering time: 14ms to 18ms / frame
🏃
57:57Nsight rendering time: 14ms to 18ms / frame
🏃
59:37Scrub through Events to see that glDrawArrays takes 1.27ms
🏃
59:37Scrub through Events to see that glDrawArrays takes 1.27ms
🏃
59:37Scrub through Events to see that glDrawArrays takes 1.27ms
🏃
1:00:35Scrutinise ResolveMultisample() with a view to speeding it up
📖
1:00:35Scrutinise ResolveMultisample() with a view to speeding it up
📖
1:00:35Scrutinise ResolveMultisample() with a view to speeding it up
📖
1:05:00Make CompileResolveMultisample() bake the SampleCount in to the shader, to hopefully permit the loop to be unrolled
1:05:00Make CompileResolveMultisample() bake the SampleCount in to the shader, to hopefully permit the loop to be unrolled
1:05:00Make CompileResolveMultisample() bake the SampleCount in to the shader, to hopefully permit the loop to be unrolled
1:08:03Find that it actually works
🏃
1:08:03Find that it actually works
🏃
1:08:03Find that it actually works
🏃
1:08:19Make CompileResolveMultisample() bake InvSampleCount in to the shader, and slightly reorganise it
1:08:19Make CompileResolveMultisample() bake InvSampleCount in to the shader, and slightly reorganise it
1:08:19Make CompileResolveMultisample() bake InvSampleCount in to the shader, and slightly reorganise it
1:12:35Find that that made no difference to the frame time, and that UpdateAndRenderEntities() takes a while
🏃
1:12:35Find that that made no difference to the frame time, and that UpdateAndRenderEntities() takes a while
🏃
1:12:35Find that that made no difference to the frame time, and that UpdateAndRenderEntities() takes a while
🏃
1:14:04Temporarily Disable DrawGroundCover()
1:14:04Temporarily Disable DrawGroundCover()
1:14:04Temporarily Disable DrawGroundCover()
1:14:37Find that Game Update takes less of the total time, but we are not hitting 60 FPS
🏃
1:14:37Find that Game Update takes less of the total time, but we are not hitting 60 FPS
🏃
1:14:37Find that Game Update takes less of the total time, but we are not hitting 60 FPS
🏃
1:17:11Disable HANDMADE_SLOW
1:17:11Disable HANDMADE_SLOW
1:17:11Disable HANDMADE_SLOW
1:18:23Find that Debug Collation takes a lot of the total time
🏃
1:18:23Find that Debug Collation takes a lot of the total time
🏃
1:18:23Find that Debug Collation takes a lot of the total time
🏃
1:18:46Compile out some of the debug system if HANDMADE_SLOW is off
1:18:46Compile out some of the debug system if HANDMADE_SLOW is off
1:18:46Compile out some of the debug system if HANDMADE_SLOW is off
1:20:43See the debug UI
🏃
1:20:43See the debug UI
🏃
1:20:43See the debug UI
🏃
1:21:07Instead compile out that part of the debug system if HANDMADE_SLOW is on, and rearrange the code to fix compile errors
1:21:07Instead compile out that part of the debug system if HANDMADE_SLOW is on, and rearrange the code to fix compile errors
1:21:07Instead compile out that part of the debug system if HANDMADE_SLOW is on, and rearrange the code to fix compile errors
1:23:33Find that lots of the debug system is absent
🏃
1:23:33Find that lots of the debug system is absent
🏃
1:23:33Find that lots of the debug system is absent
🏃
1:24:06Compile out timing if HANDMADE_SLOW is off
1:24:06Compile out timing if HANDMADE_SLOW is off
1:24:06Compile out timing if HANDMADE_SLOW is off
1:25:05Still see jerkiness with debug collation off
🏃
1:25:05Still see jerkiness with debug collation off
🏃
1:25:05Still see jerkiness with debug collation off
🏃
1:26:09Compile in our frame marker in all situations
1:26:09Compile in our frame marker in all situations
1:26:09Compile in our frame marker in all situations
1:26:45See that our frame time is well below 16ms, but we are not actually seeing 60 FPS
🏃
1:26:45See that our frame time is well below 16ms, but we are not actually seeing 60 FPS
🏃
1:26:45See that our frame time is well below 16ms, but we are not actually seeing 60 FPS
🏃
1:27:22Nsight rendering time: 10ms to 14ms / frame
🏃
1:27:22Nsight rendering time: 10ms to 14ms / frame
🏃
1:27:22Nsight rendering time: 10ms to 14ms / frame
🏃
1:29:07Capture a frame in Nsight to see that glDrawArrays remains by far the most expensive call
🏃
1:29:07Capture a frame in Nsight to see that glDrawArrays remains by far the most expensive call
🏃
1:29:07Capture a frame in Nsight to see that glDrawArrays remains by far the most expensive call
🏃
1:33:47Hard set SampleCount to 1 in CompileResolveMultisample()
1:33:47Hard set SampleCount to 1 in CompileResolveMultisample()
1:33:47Hard set SampleCount to 1 in CompileResolveMultisample()
1:34:44Nsight rendering time: 4ms / frame
🏃
1:34:44Nsight rendering time: 4ms / frame
🏃
1:34:44Nsight rendering time: 4ms / frame
🏃
1:35:03Capture a frame in Nsight to find that the resolve and draw calls take similar times
🏃
1:35:03Capture a frame in Nsight to find that the resolve and draw calls take similar times
🏃
1:35:03Capture a frame in Nsight to find that the resolve and draw calls take similar times
🏃
1:36:09Understanding multisampling
🗩
1:36:09Understanding multisampling
🗩
1:36:09Understanding multisampling
🗩
1:37:47See our crispy lines, without multisampling
🏃
1:37:47See our crispy lines, without multisampling
🏃
1:37:47See our crispy lines, without multisampling
🏃
1:38:31Research multisampling in GLSL4,5,6,7,8
📖
1:38:31Research multisampling in GLSL4,5,6,7,8
📖
1:38:31Research multisampling in GLSL4,5,6,7,8
📖
1:45:42Spec out our desired fast path in CompileResolveMultisample(), based on there being only one sample in a multisample
1:45:42Spec out our desired fast path in CompileResolveMultisample(), based on there being only one sample in a multisample
1:45:42Spec out our desired fast path in CompileResolveMultisample(), based on there being only one sample in a multisample
1:48:00See nothing
🏃
1:48:00See nothing
🏃
1:48:00See nothing
🏃
1:48:04Revert CompileResolveMultisample()
1:48:04Revert CompileResolveMultisample()
1:48:04Revert CompileResolveMultisample()
1:50:08See everything
🏃
1:50:08See everything
🏃
1:50:08See everything
🏃
1:50:10Spec out our desired fast path in CompileResolveMultisample() again
1:50:10Spec out our desired fast path in CompileResolveMultisample() again
1:50:10Spec out our desired fast path in CompileResolveMultisample() again
1:51:40See nothing
🏃
1:51:40See nothing
🏃
1:51:40See nothing
🏃
1:51:52Cut out the else and the if(1) in CompileResolveMultisample()
1:51:52Cut out the else and the if(1) in CompileResolveMultisample()
1:51:52Cut out the else and the if(1) in CompileResolveMultisample()
1:52:41Find that the if(1) was the problem, somehow
🏃
1:52:41Find that the if(1) was the problem, somehow
🏃
1:52:41Find that the if(1) was the problem, somehow
🏃
1:53:08Reinsert the if(1) in CompileResolveMultisample()
1:53:08Reinsert the if(1) in CompileResolveMultisample()
1:53:08Reinsert the if(1) in CompileResolveMultisample()
1:53:30Capture a frame in Nsight, but still see no error message
🏃
1:53:30Capture a frame in Nsight, but still see no error message
🏃
1:53:30Capture a frame in Nsight, but still see no error message
🏃
1:55:24Enable HANDMADE_SLOW
1:55:24Enable HANDMADE_SLOW
1:55:24Enable HANDMADE_SLOW
1:55:46Trigger a fragment shader error: implicit cast from "int" to "bool"
🏃
1:55:46Trigger a fragment shader error: implicit cast from "int" to "bool"
🏃
1:55:46Trigger a fragment shader error: implicit cast from "int" to "bool"
🏃
1:56:21Change the if(1) to if(true) in CompileResolveMultisample()
1:56:21Change the if(1) to if(true) in CompileResolveMultisample()
1:56:21Change the if(1) to if(true) in CompileResolveMultisample()
1:57:20See our standard output
🏃
1:57:20See our standard output
🏃
1:57:20See our standard output
🏃
1:57:29Trigger our non-multisampled fast path in CompileResolveMultisample()
1:57:29Trigger our non-multisampled fast path in CompileResolveMultisample()
1:57:29Trigger our non-multisampled fast path in CompileResolveMultisample()
1:57:34See our crispy edges
🏃
1:57:34See our crispy edges
🏃
1:57:34See our crispy edges
🏃
1:57:47Make a note to ask GPU people about our fast path
1:57:47Make a note to ask GPU people about our fast path
1:57:47Make a note to ask GPU people about our fast path
1:58:28Q&A
🗩
1:58:28Q&A
🗩
1:58:28Q&A
🗩
1:59:13nxsy Q: textureSamples(sampler)?9
🗪
1:59:13nxsy Q: textureSamples(sampler)?9
🗪
1:59:13nxsy Q: textureSamples(sampler)?9
🗪
2:00:27Brian Q: You can have Windows automatically capture crash dumps for you. Check if this key exists: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps and, if so, it will automatically capture dumps to %LOCALAPPDATA%\CrashDumps. You can read more10
🗪
2:00:27Brian Q: You can have Windows automatically capture crash dumps for you. Check if this key exists: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps and, if so, it will automatically capture dumps to %LOCALAPPDATA%\CrashDumps. You can read more10
🗪
2:00:27Brian Q: You can have Windows automatically capture crash dumps for you. Check if this key exists: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps and, if so, it will automatically capture dumps to %LOCALAPPDATA%\CrashDumps. You can read more10
🗪
2:03:47aaronnickovich Q: The Watch page11 has no more scheduled appearances. When will you be streaming next?
🗪
2:03:47aaronnickovich Q: The Watch page11 has no more scheduled appearances. When will you be streaming next?
🗪
2:03:47aaronnickovich Q: The Watch page11 has no more scheduled appearances. When will you be streaming next?
🗪
2:04:14blazeitfury Q: You should switch to Linux
🗪
2:04:14blazeitfury Q: You should switch to Linux
🗪
2:04:14blazeitfury Q: You should switch to Linux
🗪
2:05:41rationalcoder Q: Someone had asked whether or not that would optimize anything since the GPU has to execute both branches
🗪
2:05:41rationalcoder Q: Someone had asked whether or not that would optimize anything since the GPU has to execute both branches
🗪
2:05:41rationalcoder Q: Someone had asked whether or not that would optimize anything since the GPU has to execute both branches
🗪
2:07:34bulmanator Q: I’m not sure if you were joking when you said to ask, but if you have the time and feel like it I would 100% be down to see lectures from you about the rest of the animation system like you did with skinning
🗪
2:07:34bulmanator Q: I’m not sure if you were joking when you said to ask, but if you have the time and feel like it I would 100% be down to see lectures from you about the rest of the animation system like you did with skinning
🗪
2:07:34bulmanator Q: I’m not sure if you were joking when you said to ask, but if you have the time and feel like it I would 100% be down to see lectures from you about the rest of the animation system like you did with skinning
🗪
2:09:26philliptrudeau Q: I think that putting it under "Chat" made it less clickable. Also, flashy thumbnails are really important
🗪
2:09:26philliptrudeau Q: I think that putting it under "Chat" made it less clickable. Also, flashy thumbnails are really important
🗪
2:09:26philliptrudeau Q: I think that putting it under "Chat" made it less clickable. Also, flashy thumbnails are really important
🗪
2:11:20blazeitfury Q: My girlfriend watches and tells you most of the things you said about Linux are old school issues
🗪
2:11:20blazeitfury Q: My girlfriend watches and tells you most of the things you said about Linux are old school issues
🗪
2:11:20blazeitfury Q: My girlfriend watches and tells you most of the things you said about Linux are old school issues
🗪
2:16:13aaronnickovich I have an Arch Linux machine. Its dependencies are now broken and will take weeks to get working again
🗪
2:16:13aaronnickovich I have an Arch Linux machine. Its dependencies are now broken and will take weeks to get working again
🗪
2:16:13aaronnickovich I have an Arch Linux machine. Its dependencies are now broken and will take weeks to get working again
🗪
2:18:37ivereadthesequel Q: Casey please dispel the myth that molly123 and I are the same person. rupan3 has a crazy conspiracy going on I can't shake
🗪
2:18:37ivereadthesequel Q: Casey please dispel the myth that molly123 and I are the same person. rupan3 has a crazy conspiracy going on I can't shake
🗪
2:18:37ivereadthesequel Q: Casey please dispel the myth that molly123 and I are the same person. rupan3 has a crazy conspiracy going on I can't shake
🗪
2:19:01pythno Q: For what reason do you like Linux if it breaks all the time?
🗪
2:19:01pythno Q: For what reason do you like Linux if it breaks all the time?
🗪
2:19:01pythno Q: For what reason do you like Linux if it breaks all the time?
🗪
2:23:12Wrap it up
🗩
2:23:12Wrap it up
🗩
2:23:12Wrap it up
🗩