[video output=day244 member=cmuratori stream_platform=twitch stream_username=handmade_hero project=code title="Finishing Asynchronous Texture Downloads" vod_platform=youtube id=SWtV8B3rssw annotator=Miblo] [0:55][Build and run the game and note that our textures don't get downloaded] [1:32][Set the stage for the day with some thoughts on writing software from scratch and the occasional need to use systems which are black boxes] [5:15][Debugger: Take a stroll through our new OpenGL code] [9:08][win32_handmade.cpp: Make Win32InitOpenGL return an HGLRC] [12:20][Debugger: Step into Win32InitOpenGL and consider creating the OpenGL context outside of the queue] [13:46][win32_handmade.cpp: Claim the Window as a CS_OWNDC] [14:25][Debugger: Step into Win32CreateOpenGLContextForWorkerThread] [15:20][Explain what is happening in the debugger while two threads are initialising OpenGL] [19:14][win32_handmade.cpp: Assert if wglMakeCurrent fails] [19:52][Run the game and note that we never hit that assertion] [20:33][Debugger: Step through Win32AllocateTexture] [21:48][handmade_asset.cpp: Set FinalizeOperation to FinalizeAsset_Bitmap] [22:32][win32_handmade.cpp: Put in the pointers to AllocateTexture and DeallocateTexture] [23:05][Debugger: Step through Win32AllocateTexture and see the game correctly rendering in hardware] [26:06]["I don't know how that ended up working"][quote 397] [26:38][Mention the fact that there's no synchronisation between the texture downloading and the rendering, and describe our goal with regard to failure cases] [33:16][handmade_opengl.cpp: Explain the importance of gamma correction] [36:13][handmade_opengl.cpp: Explain why there are two separate enables for sRGB] [38:20][Internet: Consult the OpenGL docs[ref site=OpenGL page="WGL_ARB_pixel_format" url=https://www.opengl.org/registry/specs/ARB/wgl_pixel_format.txt][ref site="OpenGL" page="ARB_framebuffer_sRGB" url="https://www.opengl.org/registry/specs/ARB/framebuffer_sRGB.txt"]] [45:04][win32_handmade.cpp: typedef these WINAPI wgl_ functions and enable the extensions in Win32InitOpenGL] [1:08:48][Q&A][:speech] [1:09:10][@yoonfan][Don't you have a race condition according to the C11 and C++11 memory models when you set the texture handle from the worker thread and read it on the rendering thread without any synchronization? I think you need to use an atomic operation or the compiler could mess up the generated code] [1:10:43][@cubercaleb][Why don't you render directly to the backbuffer at Molly?] [1:14:20][@brokenopcode][FYI, no you can't change pixel format once it's been set. Need to create a temp window & context, get the wgl*arb function pointers, then destroy context & window and create new window and context with wgl*arb. Very annoying but that's how it works on windows as far as I know] [1:15:09][@Zamar037][Will we be back to the debug code and finish it up after this, or have we finished it now?] [1:15:23][@cubercaleb][Thanks for the in depth explanation. Will you be going over modern GL later?] [1:17:15][@garryjohanson][Apparently in DirectX 12 you can select a separate context for different GPUs] [1:18:10][@gasto5][Where did you upload the 4coder videos?] [1:18:33][@d7samurai][Yes, D3D11, too] [1:18:58][@cubercaleb][Couldn't you also use a PBO for streaming in textures?] [1:20:35][Wrap it up][:speech] [/video]