{"$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/transcript.schema.json", "id": "wwdc2026-357", "language": "eng", "source": "https://developer.apple.com/videos/play/wwdc2026/357", "wordCount": 3353, "segments": [{"start": 7.0, "text": "Hi, I'm David Srour, Engineer with the Metal Ecosystem Team."}, {"start": 12.0, "text": "We're at a moment where coding agents"}, {"start": 14.0, "text": "are fundamentally changing how software gets built."}, {"start": 18.0, "text": "Game porting is no different."}, {"start": 20.0, "text": "What used to take months of manual platform work"}, {"start": 23.0, "text": "can now happen in a fraction of the time"}, {"start": 26.0, "text": "with the right agent workflow."}, {"start": 28.0, "text": "The lineup of games on Apple platforms keeps growing,"}, {"start": 32.0, "text": "and they look and play great,"}, {"start": 34.0, "text": "thanks to Apple silicon, beautiful displays, and immersive audio."}, {"start": 39.0, "text": "Many of these games were able to come to the platform much more quickly,"}, {"start": 44.0, "text": "with the help of the Game Porting Toolkit."}, {"start": 48.0, "text": "And now, Game Porting Toolkit 4 brings you new agentic skills,"}, {"start": 53.0, "text": "that give your coding agent the expertise it needs"}, {"start": 57.0, "text": "to port your game to Apple platforms far faster"}, {"start": 60.0, "text": "and with better quality than ever before."}, {"start": 63.0, "text": "Today I'll show you exactly how."}, {"start": 66.0, "text": "In a typical porting workflow,"}, {"start": 69.0, "text": "you've got to scope out the work,"}, {"start": 71.0, "text": "get a build going and convert your shaders,"}, {"start": 74.0, "text": "bring up the renderer,"}, {"start": 76.0, "text": "remap all your inputs,"}, {"start": 78.0, "text": "add polish for a native platform feel,"}, {"start": 82.0, "text": "and optimize for performance."}, {"start": 85.0, "text": "This takes time."}, {"start": 87.0, "text": "But with Game Porting Toolkit 4, agentic skills take the stage."}, {"start": 92.0, "text": "And can get you there a lot faster by bridging"}, {"start": 96.0, "text": "knowledge gaps in porting to the platform,"}, {"start": 98.0, "text": "improving the quality of the agent's work,"}, {"start": 101.0, "text": "and reducing the guidance it needs from you."}, {"start": 105.0, "text": "The toolkit includes:"}, {"start": 107.0, "text": "Expert skills that provide technical guidance."}, {"start": 110.0, "text": "And workflow skills that provide a structured approach."}, {"start": 115.0, "text": "And tying it all together is the porting assistant agent."}, {"start": 119.0, "text": "It orchestrates the porting methodology"}, {"start": 122.0, "text": "so you can focus on the decisions that matter."}, {"start": 126.0, "text": "Expert skills increase the odds that the agent will output optimal code."}, {"start": 132.0, "text": "It does this by"}, {"start": 133.0, "text": "providing platform knowledge,"}, {"start": 136.0, "text": "applying best practices,"}, {"start": 138.0, "text": "and flagging common porting anti-patterns."}, {"start": 141.0, "text": "That means less time debugging and a solid foundation"}, {"start": 145.0, "text": "for everything that comes after."}, {"start": 148.0, "text": "The porting assistant ensures the relevant skills are used"}, {"start": 152.0, "text": "at the right time."}, {"start": 154.0, "text": "During execution, all planned milestones"}, {"start": 157.0, "text": "automatically load the necessary expert skills"}, {"start": 160.0, "text": "without relying on whether the model decides to use them or not."}, {"start": 165.0, "text": "Validation checks each skill's anti-patterns and best practices,"}, {"start": 170.0, "text": "and compares against ground truth captures from the evaluation environment."}, {"start": 177.0, "text": "The agent stores what it learns across milestones,"}, {"start": 180.0, "text": "so nothing gets lost between sessions."}, {"start": 183.0, "text": "To show you how this works, I'm going to port Microsoft's MiniEngine,"}, {"start": 188.0, "text": "a D3D12 open-source engine, from Windows to macOS."}, {"start": 193.0, "text": "Here's how I'll break this up."}, {"start": 195.0, "text": "First, I'll show you the porting assistant,"}, {"start": 198.0, "text": "how it plans and executes."}, {"start": 200.0, "text": "Then I'll dive into the expert skills,"}, {"start": 203.0, "text": "seeing them in action during the actual port."}, {"start": 206.0, "text": "I am using Claude Code for everything today."}, {"start": 209.0, "text": "Let's get into it."}, {"start": 211.0, "text": "The skills and assistant are provided as a plugin"}, {"start": 215.0, "text": "from the Game Porting Toolkit marketplace on GitHub."}, {"start": 219.0, "text": "You will first add the marketplace."}, {"start": 222.0, "text": "And then install the plugin."}, {"start": 224.0, "text": "All the skills are now installed and ready to be used."}, {"start": 229.0, "text": "You're now ready to work with the porting assistant."}, {"start": 232.0, "text": "If you're unsure what to do, just ask the assistant."}, {"start": 236.0, "text": "It'll be able to guide you through its structured workflow."}, {"start": 241.0, "text": "The first step the agent asks for, is to run a discovery."}, {"start": 246.0, "text": "Let's look at the workflow in more detail."}, {"start": 249.0, "text": "At a high level, the porting assistant workflow goes through three stages."}, {"start": 255.0, "text": "The discover workflow skill looks at your codebase,"}, {"start": 259.0, "text": "grabs reference captures from the evaluation environment,"}, {"start": 263.0, "text": "and asks you questions about your preferences."}, {"start": 267.0, "text": "Next, you and the assistant plan milestone goals,"}, {"start": 270.0, "text": "since porting a whole title is usually too big for one session."}, {"start": 276.0, "text": "For each milestone, the agent executes the necessary changes"}, {"start": 281.0, "text": "and you bring your expertise to guide it along the way."}, {"start": 286.0, "text": "Following execution comes validation —"}, {"start": 289.0, "text": "a multi-point checklist the agent uses"}, {"start": 292.0, "text": "to check the changes that were made in the session."}, {"start": 296.0, "text": "The validation workflow helps keep the port moving forward."}, {"start": 301.0, "text": "It checks that the app launches properly,"}, {"start": 304.0, "text": "runs Metal validation on API usage and shaders,"}, {"start": 309.0, "text": "confirms visual correctness with screen captures,"}, {"start": 314.0, "text": "compares against ground truth references,"}, {"start": 317.0, "text": "reviews the code against known anti-patterns from the used skills,"}, {"start": 323.0, "text": "checks for memory issues, and more."}, {"start": 326.0, "text": "This phase is a great place to work with the agent to address last concerns"}, {"start": 331.0, "text": "or issues that come up with each milestone."}, {"start": 335.0, "text": "So that's the porting assistant and its workflow."}, {"start": 339.0, "text": "I went through this same process,"}, {"start": 341.0, "text": "discovery and planning for our MiniEngine project,"}, {"start": 345.0, "text": "and got a comprehensive porting plan."}, {"start": 348.0, "text": "Goals and milestones with expert skills mapped to each."}, {"start": 352.0, "text": "Every goal breaks down into milestones that I can start working through."}, {"start": 358.0, "text": "Let's go through some of the main goals."}, {"start": 361.0, "text": "I need a window so I can start drawing content."}, {"start": 365.0, "text": "Then bring up the renderer with Metal 4 to get the scene on screen."}, {"start": 369.0, "text": "Add game controller support so I can move around."}, {"start": 373.0, "text": "And integrate MetalFX for upscaling."}, {"start": 377.0, "text": "Let's see how the expert skills guide the agent through each goal"}, {"start": 381.0, "text": "with domain expertise and best practices."}, {"start": 385.0, "text": "Right now the app builds and runs, but there's nothing on screen."}, {"start": 390.0, "text": "I need a window to show actual content."}, {"start": 394.0, "text": "I tell the agent to set up the window."}, {"start": 396.0, "text": "And it loads the skills that it'll need."}, {"start": 400.0, "text": "For the windowing and frame pacing milestone,"}, {"start": 403.0, "text": "the agent actually needs several skills working together to create a window,"}, {"start": 408.0, "text": "drive the render loop, map D3D12's swap chain model,"}, {"start": 412.0, "text": "and get the pacing right."}, {"start": 415.0, "text": "The window skill provides expertise in window creation and lifecycle."}, {"start": 420.0, "text": "Translating to Metal maps the swap chain concepts."}, {"start": 426.0, "text": "Presenting drawables covers frame pacing best practices."}, {"start": 430.0, "text": "And the metal-cpp skill teaches correct Metal object lifetime patterns."}, {"start": 436.0, "text": "These skills cover a lot of ground for this milestone."}, {"start": 440.0, "text": "Usually the difficulty is in ensuring that all the best practices are followed"}, {"start": 445.0, "text": "rather than some."}, {"start": 447.0, "text": "For the window itself,"}, {"start": 450.0, "text": "the skills set up Metal display link for the render loop,"}, {"start": 454.0, "text": "handle lifecycle events like focus changes and fullscreen,"}, {"start": 459.0, "text": "and configure the layer's resolution and color space optimally for games."}, {"start": 465.0, "text": "For presentation,"}, {"start": 466.0, "text": "they provide guidance to leverage"}, {"start": 468.0, "text": "direct-to-display presentation for lower latency,"}, {"start": 472.0, "text": "manage drawable lifetimes to avoid stuttering,"}, {"start": 477.0, "text": "and keep textures resident so the GPU can properly access them."}, {"start": 482.0, "text": "This will help you avoid common pitfalls that can lead to broken window behavior,"}, {"start": 487.0, "text": "dropped frames, or blank output."}, {"start": 491.0, "text": "And here's the result from working with the porting agent."}, {"start": 494.0, "text": "A smooth color clear animation."}, {"start": 497.0, "text": "The Metal HUD shows steady frame pacing"}, {"start": 500.0, "text": "and I can be sure that presentation is solid"}, {"start": 503.0, "text": "before starting rendering work."}, {"start": 506.0, "text": "Milestone complete."}, {"start": 508.0, "text": "Time to bring up the renderer."}, {"start": 510.0, "text": "I'm targeting lighting, shadows, SSAO, and tone mapping for first playable."}, {"start": 517.0, "text": "Metal 4 takes the API to the next level"}, {"start": 520.0, "text": "with explicit memory management and a new command structure."}, {"start": 525.0, "text": "The skills bridge the gaps in current models,"}, {"start": 527.0, "text": "and carry porting expertise from real-world experience."}, {"start": 533.0, "text": "I planned three goals with the assistant."}, {"start": 535.0, "text": "Scene rendering, which includes the depth, shadow, and color passes."}, {"start": 541.0, "text": "A subset of the post-processing pipeline,"}, {"start": 544.0, "text": "porting SSAO for better visual quality and tone mapping to get pixels on screen."}, {"start": 551.0, "text": "Finally, dynamic lighting to complete the scene."}, {"start": 555.0, "text": "I'll demonstrate how the skills guide the agent through each goal,"}, {"start": 558.0, "text": "starting with rendering the scene."}, {"start": 561.0, "text": "Scene rendering has three milestones:"}, {"start": 564.0, "text": "GPU resources, shader pipelines, and command encoding."}, {"start": 569.0, "text": "The resources skill covers GPU memory, textures, and render targets."}, {"start": 576.0, "text": "The shader pipeline and converter skills wire the HLSL shaders"}, {"start": 581.0, "text": "through Metal's binding model."}, {"start": 583.0, "text": "And the synchronization skill provides"}, {"start": 585.0, "text": "the synchronization patterns between passes."}, {"start": 589.0, "text": "To render the scene with Metal 4,"}, {"start": 592.0, "text": "the agent needs to manage GPU resources"}, {"start": 595.0, "text": "in ways specific to the API."}, {"start": 598.0, "text": "The skill teaches which storage modes to use,"}, {"start": 602.0, "text": "including options specific to Apple silicon's tile architecture."}, {"start": 607.0, "text": "In Metal 4, constants are passed through buffers."}, {"start": 611.0, "text": "The skill provides the recommended allocation pattern for this."}, {"start": 617.0, "text": "And it ensures all resources are registered"}, {"start": 620.0, "text": "in a residency set for GPU access."}, {"start": 624.0, "text": "I'll demonstrate with an example."}, {"start": 627.0, "text": "The skill teaches the agent to register resources in a residency set before use,"}, {"start": 634.0, "text": "much earlier in the application."}, {"start": 636.0, "text": "This ensures every resource is accessible when the GPU needs it."}, {"start": 643.0, "text": "Without the skill, the agent doesn't know this step is needed"}, {"start": 646.0, "text": "and just gets something compiled."}, {"start": 649.0, "text": "The GPU cannot read from the texture as expected, causing incorrect results."}, {"start": 655.0, "text": "To connect the existing shaders to Metal,"}, {"start": 658.0, "text": "the agent needs the shader pipeline and converter skills."}, {"start": 662.0, "text": "The skill guides the agent in creating pipeline states with Metal 4's compiler."}, {"start": 669.0, "text": "It teaches the encoding rules for descriptor tables."}, {"start": 673.0, "text": "It handles the translation of D3D12 root signatures"}, {"start": 677.0, "text": "through the Metal shader converter runtime."}, {"start": 681.0, "text": "And it provides Metal 4's argument buffer layout model."}, {"start": 685.0, "text": "Let's look at an example."}, {"start": 688.0, "text": "The skill teaches the agent to query argument buffer offsets"}, {"start": 692.0, "text": "from the Metal shader converter runtime."}, {"start": 695.0, "text": "This ensures they match what the shader expects."}, {"start": 699.0, "text": "Without the skill, the agent copies MiniEngine's pattern"}, {"start": 703.0, "text": "of calculating offsets with index times size."}, {"start": 707.0, "text": "But when using Metal shader converter, the layout might be different."}, {"start": 711.0, "text": "So those offsets are wrong."}, {"start": 713.0, "text": "No error, just incorrect rendering."}, {"start": 716.0, "text": "To synchronize GPU work correctly, the agent needs the synchronization skill."}, {"start": 722.0, "text": "Metal 4 uses fully explicit synchronization,"}, {"start": 726.0, "text": "giving you precise control over resource dependencies."}, {"start": 731.0, "text": "Multiple encoders within a command buffer need proper barriers between them."}, {"start": 738.0, "text": "D3D12 and Metal 4 use different barrier models,"}, {"start": 742.0, "text": "and the skill maps between them."}, {"start": 745.0, "text": "It also provides stage mapping tables"}, {"start": 748.0, "text": "since D3D12 states don't translate directly."}, {"start": 753.0, "text": "I'll demonstrate."}, {"start": 754.0, "text": "The skill teaches the agent to map D3D12 states"}, {"start": 758.0, "text": "to Metal 4's producer-consumer model."}, {"start": 761.0, "text": "The agent implements correct synchronization from the start."}, {"start": 766.0, "text": "Without the skill, the agent resorts to broad blanket barriers"}, {"start": 770.0, "text": "at encoder boundaries."}, {"start": 773.0, "text": "This may work for simple cases,"}, {"start": 775.0, "text": "but can silently break"}, {"start": 777.0, "text": "as the rendering pipeline grows more complex."}, {"start": 781.0, "text": "I have the first GPU workload running."}, {"start": 785.0, "text": "The agent validates the output against the evaluation environment"}, {"start": 789.0, "text": "and confirms all three geometry passes match."}, {"start": 793.0, "text": "Can't present yet without post processing, but I know it's on the right track."}, {"start": 799.0, "text": "Time to get pixels on screen."}, {"start": 801.0, "text": "The post-processing pipeline introduces compute dispatches"}, {"start": 805.0, "text": "for the SSAO and tone-mapping passes."}, {"start": 810.0, "text": "Post processing has two parts."}, {"start": 813.0, "text": "The SSAO chain, a series of compute dispatches"}, {"start": 817.0, "text": "that need correct resource setup and synchronization."}, {"start": 821.0, "text": "And tone mapping, which transitions from compute back to render."}, {"start": 826.0, "text": "The same rendering skills as before are leveraged for both."}, {"start": 831.0, "text": "These same skills now also act as guardrails."}, {"start": 836.0, "text": "The synchronization skill catches barrier configurations"}, {"start": 841.0, "text": "that don't account for how Apple silicon's tile memory works."}, {"start": 846.0, "text": "The resources skill provides safe defaults"}, {"start": 849.0, "text": "for resources not yet bound during incremental porting."}, {"start": 854.0, "text": "And the shader converter skill catches data alignment mismatches"}, {"start": 858.0, "text": "between the engine and its shaders."}, {"start": 861.0, "text": "I'll demonstrate."}, {"start": 864.0, "text": "The skill teaches the agent"}, {"start": 865.0, "text": "to leverage Metal shader converter's reflection"}, {"start": 868.0, "text": "to query the actual parameter count from the shader."}, {"start": 873.0, "text": "The layout matches and everything aligns."}, {"start": 877.0, "text": "Without the skill,"}, {"start": 879.0, "text": "the agent carries over the engine's original 5 root parameters."}, {"start": 884.0, "text": "But Metal shader converter determines the layout"}, {"start": 887.0, "text": "from the HLSL shader, which only declares 4."}, {"start": 892.0, "text": "That mismatch shifts the sampler table to the wrong offset."}, {"start": 897.0, "text": "I got first light!"}, {"start": 899.0, "text": "This is always a rewarding milestone."}, {"start": 902.0, "text": "But something is off."}, {"start": 904.0, "text": "I can clearly see SSAO working on the drapes, that's encouraging."}, {"start": 910.0, "text": "But the overall lighting is wrong"}, {"start": 911.0, "text": "and textures on the wall surfaces are visibly stretched."}, {"start": 916.0, "text": "Let's debug this!"}, {"start": 918.0, "text": "Normally I'd capture a frame in Xcode and diagnose the issue."}, {"start": 923.0, "text": "But until now, an agent couldn't do that on its own."}, {"start": 927.0, "text": "But macOS 27 introduces new command-line tools"}, {"start": 932.0, "text": "which support fully autonomous agent workflows:"}, {"start": 936.0, "text": "gpucapture for capturing a GPU frame, and gpudebug for analyzing it."}, {"start": 942.0, "text": "Let's see how the agent leverages these new tools with the GPU debugging skill."}, {"start": 949.0, "text": "I first describe the visual symptoms I observed."}, {"start": 952.0, "text": "The agent loads the debugging rendering issues skill."}, {"start": 956.0, "text": "It provides a structured methodology to go from symptoms to root causes."}, {"start": 962.0, "text": "With the application running, the agent leverages the gpucapture tool"}, {"start": 967.0, "text": "to capture a GPU trace."}, {"start": 974.0, "text": "Now it's leveraging gpudebug tool to inspect the capture."}, {"start": 979.0, "text": "It can examine anything you'd normally check in Xcode,"}, {"start": 983.0, "text": "resource bindings,"}, {"start": 984.0, "text": "constants, resource contents, and data flow through the pipeline."}, {"start": 990.0, "text": "It's tracing where things diverge from the evaluation environment."}, {"start": 996.0, "text": "The agent identifies the problem,"}, {"start": 998.0, "text": "and implements a fix."}, {"start": 1001.0, "text": "The structured debugging approach means it didn't waste time guessing."}, {"start": 1005.0, "text": "It narrowed down to the problem systematically."}, {"start": 1010.0, "text": "And here's the corrected build of MiniEngine after the agent's fix."}, {"start": 1014.0, "text": "The lighting and texture maps now match the expected output."}, {"start": 1020.0, "text": "During validation, the agent uses the GPU tools again"}, {"start": 1024.0, "text": "to carefully check a frame capture."}, {"start": 1028.0, "text": "The agent matches the dispatch calls and pipelines"}, {"start": 1031.0, "text": "against my original trace from the evaluation environment."}, {"start": 1036.0, "text": "It checks all details, including the dispatch dimensions."}, {"start": 1041.0, "text": "Doing such validations manually for every milestone is usually tedious."}, {"start": 1046.0, "text": "It requires loading multiple captures"}, {"start": 1049.0, "text": "and comparing a large amount of data side-by-side."}, {"start": 1052.0, "text": "With the new tools provided in macOS 27,"}, {"start": 1055.0, "text": "the agent can handle this on its own much more quickly."}, {"start": 1060.0, "text": "The final goal is dynamic lights."}, {"start": 1062.0, "text": "128 point and spot lights, computed through a light culling pass."}, {"start": 1068.0, "text": "Most of the compute infrastructure is already working,"}, {"start": 1071.0, "text": "but there are new challenges with mixed resource types"}, {"start": 1074.0, "text": "and new synchronization patterns."}, {"start": 1078.0, "text": "Dynamic lights need a compute-based light culling pass"}, {"start": 1082.0, "text": "that mixes buffers and textures,"}, {"start": 1085.0, "text": "along with new GPU resources for the light data."}, {"start": 1088.0, "text": "The shader converter and synchronization skills handle the culling pass"}, {"start": 1093.0, "text": "while the resources skill covers the light data."}, {"start": 1098.0, "text": "Even with the compute infrastructure in place,"}, {"start": 1101.0, "text": "the skills flag issues specific to this milestone."}, {"start": 1105.0, "text": "The residency pattern from earlier pays off once again"}, {"start": 1110.0, "text": "and new light resources are made GPU-accessible automatically."}, {"start": 1115.0, "text": "The sync skill catches invalid render stage flags"}, {"start": 1119.0, "text": "the agent set on compute encoders."}, {"start": 1122.0, "text": "And the shader converter skill ensures correct binding for mixed resource types."}, {"start": 1129.0, "text": "And there's our first playable."}, {"start": 1131.0, "text": "The Sponza scene is properly lit with directional and dynamic lighting."}, {"start": 1137.0, "text": "The app uses all the rendering features that were ported using Metal 4."}, {"start": 1143.0, "text": "That's first playable done."}, {"start": 1145.0, "text": "Let's keep going and add some more features to MiniEngine."}, {"start": 1149.0, "text": "Keyboard and mouse have been fine so far,"}, {"start": 1152.0, "text": "but let's add gamepad support for better camera control."}, {"start": 1157.0, "text": "I prompt the agent to add controller support,"}, {"start": 1160.0, "text": "and it loads the game controller skill."}, {"start": 1163.0, "text": "The controller skill covers GCController discovery,"}, {"start": 1167.0, "text": "the input model, and porting from Windows APIs."}, {"start": 1172.0, "text": "On Windows, XInput provides a fixed controller layout."}, {"start": 1176.0, "text": "The skill teaches the agent to check what each controller actually supports instead."}, {"start": 1183.0, "text": "Same idea for inputs."}, {"start": 1185.0, "text": "Rather than hardcoding a button map,"}, {"start": 1187.0, "text": "the skill has the agent query what's actually available"}, {"start": 1191.0, "text": "on the connected device."}, {"start": 1194.0, "text": "And controllers can show up or disappear at any time."}, {"start": 1198.0, "text": "The skill provides the right discovery and disconnect patterns"}, {"start": 1202.0, "text": "so the agent handles that gracefully."}, {"start": 1206.0, "text": "Gamepad is working."}, {"start": 1208.0, "text": "Device discovery, thumbstick mapping, connect/disconnect events,"}, {"start": 1213.0, "text": "everything is properly handled."}, {"start": 1216.0, "text": "This makes navigating the scene a lot smoother."}, {"start": 1221.0, "text": "Let's push further by integrating MetalFX features."}, {"start": 1225.0, "text": "I will be adding two distinct features of MetalFX."}, {"start": 1230.0, "text": "Upscaling renders at a lower resolution and reconstructs a higher quality image."}, {"start": 1236.0, "text": "Done right, it can match or exceed native quality."}, {"start": 1242.0, "text": "Frame interpolation doubles the effective frame rate"}, {"start": 1245.0, "text": "by generating every other frame, at the cost of some input latency."}, {"start": 1250.0, "text": "Both are about getting more out of less."}, {"start": 1255.0, "text": "To learn more, check out \"Go further with Metal 4 games.\""}, {"start": 1260.0, "text": "I ask the agent to add upscaling and frame interpolation."}, {"start": 1264.0, "text": "And it loads both expert MetalFX skills."}, {"start": 1269.0, "text": "MetalFX has two milestones:"}, {"start": 1272.0, "text": "temporal upscaling and frame interpolation."}, {"start": 1275.0, "text": "Each milestone leverages a separate skill that targets that feature."}, {"start": 1280.0, "text": "The upscaling skill guides the first."}, {"start": 1283.0, "text": "The frame interpolation skill handles the second."}, {"start": 1287.0, "text": "The upscaling skill handles a lot of the tricky integration work."}, {"start": 1291.0, "text": "It configures jitter correctly in pixel space."}, {"start": 1295.0, "text": "Without it, the agent would likely use normalized values"}, {"start": 1299.0, "text": "that effectively disable temporal accumulation."}, {"start": 1303.0, "text": "It sets up motion vectors with the right scale and conventions,"}, {"start": 1307.0, "text": "avoiding the ghosting you'd get from a naive setup."}, {"start": 1311.0, "text": "It provides a good starting MIP bias for the scale factor,"}, {"start": 1315.0, "text": "giving you a solid base to tune from."}, {"start": 1319.0, "text": "And it provides the history reprojection setup"}, {"start": 1323.0, "text": "so the scaler can accumulate detail across frames."}, {"start": 1328.0, "text": "The frame interpolation skill handles the full integration."}, {"start": 1332.0, "text": "It sets up a dedicated present thread"}, {"start": 1335.0, "text": "to keep presentation separate from rendering."}, {"start": 1338.0, "text": "Without it, the agent might present from the render thread,"}, {"start": 1342.0, "text": "leading to uneven frame spacing."}, {"start": 1345.0, "text": "It configures precise timing so interpolated"}, {"start": 1350.0, "text": "and rendered frames are evenly spaced."}, {"start": 1354.0, "text": "And it gets the presentation order right so the interpolated frames"}, {"start": 1358.0, "text": "are properly interleaved with the synthesized ones."}, {"start": 1362.0, "text": "Here's both features running together, upscaling plus frame interpolation."}, {"start": 1368.0, "text": "The Metal HUD shows that the temporal upscaler"}, {"start": 1372.0, "text": "and the interpolator are both in use."}, {"start": 1376.0, "text": "macOS 27 extends the Metal HUD features"}, {"start": 1380.0, "text": "to help debug and validate the integration."}, {"start": 1384.0, "text": "Using the Metal HUD, you can now ensure"}, {"start": 1386.0, "text": "that your MetalFX integration is behaving as expected."}, {"start": 1392.0, "text": "The upscaler's exposure parameter is displayed"}, {"start": 1395.0, "text": "so you can ensure it is properly fed to the API."}, {"start": 1400.0, "text": "You can also look at jitter sequence information"}, {"start": 1403.0, "text": "to ensure they are properly set up."}, {"start": 1405.0, "text": "Out of range jitters are marked in red"}, {"start": 1408.0, "text": "and a scatter plot helps you visualize their positions."}, {"start": 1413.0, "text": "Now, let's look at the overrides options."}, {"start": 1416.0, "text": "These will help you debug your integration"}, {"start": 1419.0, "text": "to get a better sense of what might be going wrong."}, {"start": 1423.0, "text": "You're now able to visualize the exposure of your scene as observed by MetalFX."}, {"start": 1430.0, "text": "The jitter plot option will display the scatter plot in the HUD."}, {"start": 1435.0, "text": "Both the jitter multipliers"}, {"start": 1438.0, "text": "and motion vector scales can be overridden."}, {"start": 1441.0, "text": "These overrides take effect while the application is running,"}, {"start": 1445.0, "text": "helping you tweak jitter multipliers"}, {"start": 1447.0, "text": "or motion vector scales to debug upscaling issues."}, {"start": 1452.0, "text": "Looking at an incorrect integration,"}, {"start": 1455.0, "text": "I can observe wobbling artifacts while the camera is in motion."}, {"start": 1459.0, "text": "When looking at the motion vectors information in the HUD,"}, {"start": 1463.0, "text": "I see that the X-scale axis is negated."}, {"start": 1467.0, "text": "Let's make it positive in the overrides panel."}, {"start": 1473.0, "text": "And the motion wobbles are now fixed."}, {"start": 1478.0, "text": "Now in the rendered output,"}, {"start": 1480.0, "text": "some blurriness appears on the textured objects."}, {"start": 1484.0, "text": "I'll tune the jitter multipliers to improve visual quality."}, {"start": 1490.0, "text": "Here is a side by side comparison before and after tuning the jitter multipliers."}, {"start": 1499.0, "text": "If the HUD overrides fix the output, that tells you where the bug is."}, {"start": 1503.0, "text": "You trace it back to the logic"}, {"start": 1505.0, "text": "that calculates your jitter or motion vector values"}, {"start": 1508.0, "text": "and fix the source."}, {"start": 1511.0, "text": "To recap, the new agentic skills in Game Porting Toolkit 4"}, {"start": 1516.0, "text": "accelerate bringing your game to Apple platforms."}, {"start": 1520.0, "text": "The porting assistant provides a structured approach"}, {"start": 1523.0, "text": "to using both expert and workflow skills."}, {"start": 1527.0, "text": "The skills combine knowledge and best practices"}, {"start": 1530.0, "text": "to get the features in your game up and running."}, {"start": 1534.0, "text": "The assistant also helps create comprehensive porting plans"}, {"start": 1538.0, "text": "with clear milestones."}, {"start": 1542.0, "text": "I demonstrated the skills"}, {"start": 1543.0, "text": "by porting Microsoft's MiniEngine as a native Mac app."}, {"start": 1549.0, "text": "Now it uses Metal 4 to render the same features"}, {"start": 1552.0, "text": "as the original application."}, {"start": 1556.0, "text": "I also showed how the new gpudebug tool enables the agent to analyze frame traces."}, {"start": 1564.0, "text": "And the skills help out with a variety of porting tasks,"}, {"start": 1567.0, "text": "ranging from windowing, game controllers, to MetalFX."}, {"start": 1573.0, "text": "I was able to use the skills and workflows"}, {"start": 1576.0, "text": "in the Game Porting Toolkit 4 to port,"}, {"start": 1579.0, "text": "troubleshoot, and tune the MiniEngine from PC to Mac"}, {"start": 1584.0, "text": "in a fraction of the time it would have taken"}, {"start": 1586.0, "text": "to do this work manually."}, {"start": 1589.0, "text": "I let the skills do the heavy lifting,"}, {"start": 1592.0, "text": "while I focused on other things:"}, {"start": 1594.0, "text": "making the architectural decisions, reviewing the agent's output,"}, {"start": 1599.0, "text": "and providing important context about the game."}, {"start": 1603.0, "text": "The skills handled all the platform knowledge."}, {"start": 1607.0, "text": "Before I wrap up,"}, {"start": 1608.0, "text": "I'll demonstrate the porting agent's work on one last codebase."}, {"start": 1613.0, "text": "I pointed the porting assistant at Godot,"}, {"start": 1616.0, "text": "a production engine with an existing Metal 3 backend,"}, {"start": 1619.0, "text": "and asked it to add Metal 4 alongside it."}, {"start": 1623.0, "text": "Following the same workflow, using the same skills,"}, {"start": 1626.0, "text": "and validating against ground truths and best practices."}, {"start": 1630.0, "text": "It's still a collaborative effort,"}, {"start": 1632.0, "text": "but the skills sped things up significantly."}, {"start": 1636.0, "text": "It was up and running in a few days."}, {"start": 1639.0, "text": "This demonstrates that the skills scale beyond small engines"}, {"start": 1643.0, "text": "to production-grade projects."}, {"start": 1646.0, "text": "To get started, download and install the skills."}, {"start": 1650.0, "text": "Try them out on your game's code base."}, {"start": 1653.0, "text": "Invoke the porting assistant,"}, {"start": 1655.0, "text": "and let it guide you through the porting process."}, {"start": 1658.0, "text": "You can find the skills"}, {"start": 1659.0, "text": "at the Game Porting Toolkit GitHub repository."}, {"start": 1664.0, "text": "I can't wait to see how these skills help you bring amazing games"}, {"start": 1668.0, "text": "to the Apple ecosystem."}, {"start": 1670.0, "text": "Thank you for watching."}]}