[video output=day480 member=cmuratori stream_platform=twitch stream_username=handmade_hero project=code title="Debugging Large Texture Support" vod_platform=youtube id=FvNWEIaz9tM annotator=Miblo]
[0:00][Recap and set the stage for the day debugging our large texture implementation][:"asset system" :speech]
[1:27][Refresh our memories on the additional multiple-dispatch slow path for arbitrary sized textures][:"asset system" :speech]
[3:17][Continue to investigate the incorrectness in the multiple-dispatch path][:"asset system"]
[6:40][Try making OpenGLInit() and OpenGLAllocateTexture() use GL_TEXTURE_2D_ARRAY for special textures][:"asset system" :hardware :memory]
[8:49][:Run the game and crash in OpenGLAllocateTexture()][:"asset system" :hardware :memory]
[9:08][Fix OpenGLAllocateTexture() to allocate one slice][:"asset system" :hardware :memory]
[9:27][:Run the game and crash in OpenGLEndFrame()][:"asset system" :hardware :memory]
[9:54][Make OpenGLEndFrame() use a GL_TEXTURE_2D_ARRAY for special textures][:"asset system" :hardware :memory]
[10:19][:Run the game without crashing, but also without seeing any cutscene textures][:"asset system"]
[11:48][Change GameUpdateAndRender() to boot directly into the cutscene]
[13:40][Capture a frame with Nsight and inspect the events][:"asset system" :hardware :rendering :run]
[18:57][Praise NVIDIA for Nsight's event filter][:speech]
[19:35][Continue to check out our glBindTexture events][:"asset system" :hardware :rendering :run]
[21:04][Break in the special texture path in OpenGLEndFrame() successfully][:"asset system" :hardware :rendering :run]
[21:50][Correctly set the working directory][:admin]
[22:40][Check out the glBindTexture event for our GL_TEXTURE_2D_ARRAY][:hardware :rendering :run]
[25:58][Consult the documentation on glTexImage3D[ref
    site=docs.GL
    page=glTexImage3D
    url=http://docs.gl/gl3/glTexImage3D]][:hardware :rendering :research]
[26:14][Make OpenGLAllocateTexture() pass 0 as the level to glTexImage3D()][:hardware :rendering]
[27:29][:Run the game and see imagery][:rendering]
[28:26][Make PushQuad() correctly compute the UV coordinates for special textures][:rendering]
[29:52][:Run the game and see our cutscene texture more correctly, but without :animation or alpha blending][:rendering]
[31:48][Begin to investigate the bug in the alpha blending of large textures][:rendering]
[35:33][Step into PushQuad() and inspect the vertices][:rendering :run]
[39:10][Try making PushQuad() set the TextureIndex of special textures to 0][:rendering]
[40:02][:Run the game to see that that doesn't solve the transparency problem][:rendering]
[41:14][Make OpenGLEndFrame() unbind the GL_TEXTURE_2D_ARRAY][:rendering]
[44:38][:Run the game, see no difference and consider capturing a frame][:rendering]
[45:12][Try skipping the depth peeling altogether when :rendering the cutscene]
[47:15][:Run the game to see that the cutscene layers do get composited, but still without alpha blending][:rendering]
[48:48][Try making RenderLayeredScene() draw the cutscene layers in the opposite order][:rendering]
[50:00][:Run the game to see that this changed the zoom speed, but had no effect on the transparency][:animation :rendering]
[50:53][Revert RenderLayeredScene() to draw the cutscene in the original order][:rendering]
[51:39][Capture a frame of the cutscene, scrub through the events and inspect the shaders][:rendering :run]
[59:14][Toggle on ALLOW_GPU_SRGB][:rendering]
[1:01:30][:Run the game to see that that still works okay, but the cutscene also remains unaffected][:rendering]
[1:04:23][Capture a frame and scrutinise the fragment and vertex shaders][:rendering :run]
[1:10:48][Try making CompileZBiasProgram() hard set the FogAmount and AlphaAmount to known values][:rendering]
[1:11:14][:Run it to see no effect][:rendering]
[1:11:25][Try making CompileZBiasProgram() hard set the SurfaceReflect.a to 0.5][:rendering]
[1:11:42][:Run it to see no alpha blending][:rendering]
[1:14:12][Capture a frame and inspect the draw buffer settings][:rendering :run]
[1:22:40][Remove CompileDepthPeelToLighting() and other cruft from the OpenGL code][:hardware :rendering]
[1:28:01][:Run the game and Renderer Test to see that we didn't bust anything][:hardware :rendering]
[1:29:50][Refrain from binding the OpenGLColor_Emit and OpenGLColor_NPL handle types][:hardware :rendering]
[1:31:50][:Run the game to see that the background colour is now incorrect][:hardware :rendering]
[1:32:57][Remove the NPL samplers from CompilePeelComposite()][:hardware :rendering]
[1:34:50][:Run the game to see that the background colour is correct again, and capture a frame to see our intended single colour target][:rendering]
[1:36:22][Determine to investigate the positional corruption as exhibited by the draw order of the cutscene layers][:rendering :run]
[1:39:45][Make OpenGLEndFrame() call glDrawElementsBaseVertex() directly in the special texture path][:rendering :run]
[1:42:25][:Run it to see that it's looking a little better][:rendering]
[1:42:41][Make RenderLayeredScene() draw the layers in the original order][:rendering]
[1:42:52][:Run it to see that the cutscene plates are now correct, but the alpha blending is still not happening][:rendering]
[1:44:09][Capture a frame and take a closer look at the pixel operations to see that alpha blending was turned off the whole time][:rendering :run]
[1:47:37][Make OpenGLEndFrame() call glEnable() at the end of a depth peel][:rendering]
[1:48:27][:Run the game to see that the cutscene alpha blending works beautifully][:rendering]
[1:52:41][@cemuzunlar][Greatest [~hero Handmade Hero] Episode! A real hands on example of an ordinary day of a graphics programmer]
[1:53:32][Q&A][:speech]
[1:54:18][@frostyninja][Q: Missed what was preventing the parallax movement; could you point that out again real quick? Also is it just me or is the gamma off a little on the cutscenes? It looks a bit washed out to me][:rendering]
[1:55:14][Toggle off ALLOW_GPU_SRGB][:rendering]
[1:56:03][@vateferfout][Q: In the OpenGLAllocateTexture(), in the non-special texture case, you're calling the GetTextureIndexFrom() to mask off the special texture bit, but at this point you know that this bit isn't set, or am I reading this incorrectly?][:memory :rendering]
[1:56:26][@charliekelly_aka_dayman][Q: Do you have the :story for the game all written / thought out or are you still working on it?]
[1:57:03][Wrap it up][:speech]
[/video]
