[video member=cmuratori stream_platform=twitch stream_username=handmade_hero project=code title="Multiple Software Render Targets" vod_platform=youtube id=NROKpZtyj_o annotator=Miblo] [0:57][Recap and set the stage for the day] [1:31][Debugger: Step into OpenGLRenderCommands() and inspect the Header] [2:23][handmade_render_group.cpp: Make PushRenderElement_() correctly compute the Entry->Offset] [3:51][Run the game and see how we're doing] [4:45][handmade_world_mode.cpp: Make AddStandardRoom() only generate one room, run the game and again assess our situation] [5:38][handmade_render_group.cpp: Ensure that PushRenderElement_() is correctly setting the Offset] [6:27][Run the game and see our baseline] [6:30][handmade_render_group.cpp: Tweak how BeginAggregateSortKey() and EndAggregateSortKey() work] [11:04][handmade_world_mode.cpp: Revert AddPlayer() to pushing the player sprites in logical order] [11:41][Run the game and identify that the head can still be sorted incorrectly when we have a cycle] [14:12][handmade_world_mode.cpp: Make AddStandardRoom() generate multiple rooms] [14:42][Run the game and find that we're now not getting those blinking tree bugs] [16:03][Run the game and consult the profiler] [17:20][build.bat: Switch to -O2, run the game and again consult the profiler] [19:24][Run the game and demo the problem with alpha blending] [20:52][handmade_entity.cpp: Make UpdateAndRenderEntities() draw the traversables in red] [21:25][Run the game and demo the alpha blending problem] [22:06][handmade_entity.cpp: Make UpdateAndRenderEntities() draw the traversables half as wide as normal] [22:36][Run the game and most clearly demo the alpha blending problem] [23:50][handmade_render.cpp: Consider introducing the notion of a coherent block for SortEntries() to use] [25:56][Run the game and toggle between the software and hardware renderers] [27:24][Blackboard: Multiple Render Targets] [31:46][handmade_render.cpp: Make SoftwareRenderCommands() take a TempArena, take a renamed FinalOutputTarget and reserve a second OutputTarget] [36:59]["Oh, we VirtualAlloc'd that. Wow, aren't we fancy!"][quote 511] [37:14][handmade_render.cpp: Make SoftwareRenderCommands() pass to PushSize() a call to AlignNoClear(16) in order to align it to 16-byte boundaries] [37:41][Run the game and see nothing on the screen] [37:59][handmade_render.cpp: Make SoftwareRenderCommands() copy the pixels from the OutputTarget in the FinalOutputTarget] [38:49][Run the game and see that we've made our renderer slower] [39:03][Blackboard: What SoftwareRenderCommands() is now doing] [39:37][handmade_render.cpp: Consider enabling SoftwareRenderCommands() to render to multiple render targets] [41:41][handmade_render_group.h: Add a RenderTargetIndex to the render_entry_cliprect struct] [43:14][handmade_render_group.cpp: Make PushClipRect() take a RenderTargetIndex in order that it can specify the RenderTarget to which it wants to render] [44:55][handmade_debug.h: Add RenderTarget to the debug_state struct] [45:21][handmade_render_group.cpp: Make PushClipRect() set RenderTargetIndex] [46:11][handmade_platform.h: Add MaxRenderTargetIndex to the game_render_commands struct] [46:34][handmade_render.cpp: Make SoftwareRenderCommands() clone the render buffers based on that RenderTargetCount] [49:53][handmade_render.h: Change OutputTarget to be a RenderTargets array in the tile_render_work struct] [50:21][handmade_render.cpp: Make RenderCommandsToBitmap() take a RenderTargets array] [52:54][handmade_debug.cpp: Make DEBUGBegin set the RenderTarget to 1] [53:33][Run the game and watch the debug information disappear into that other RenderTarget] [54:07][Q&A] [54:51][@popcorn][Next week?] [56:11][@necktrox][A bit unrelated to the project, but what do you think about the Rust language?] [56:39][@billdstrong][So when do we think we will be ready for the new graphics assets? I'm excited] [57:26][@sn0uk][Can you explain what this game is?] [59:16][@Miblo][Is writing to that other currently invisible render target much / any less computationally expensive than also sending it to the display?] [1:00:50][@soysaucethekid][With multiple rendering targets, are there other effects you can do other than the alpha blending?] [1:02:04][@necktrox][Are you going to support shaders and, if so, will you try to support multiple render targets in the shaders?] [1:04:02][@pandnh4][Are you excited to get an AArch64 toolchain up and running to get this thing to run on a Raspberry Pi 3?] [1:04:37][@lord_marshall_][Are you still working full time? Why only stream one hour a night?] [1:04:50][@se24vad][How would you go about rendering huge tilemaps? Some batching techniques, or any tips?] [1:06:05][@billdstrong][Would that be a good technique to use to create an overhead map?] [1:07:16][insobot Soa and aos questions can be made with as minimal interference in timing the host operating] [1:07:37][Close down] [/video]