# Session Log — 2026-07-12 ## RHI Global Context Refactor Reviewed the user's staged changes to the Vulkan RHI backend. The changes encompassed: ### Global Context Adoption - RHI functions no longer take allocator parameters - `_G_RHI_CONTEXT` provides `allocator` (user-facing objects) and `tmp` (short-lived temporaries) - `prRhiInit(void)` / `prRhiDestroy(void)` manage the global context ### KTX Texture Bug Fix - Original implementation only copied mip level 0 - Fixed to iterate all mip levels using `ktxTexture_GetImageOffset()` - Final layout changed from `VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL` to `VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL` ### Frame-by-Frame Command Batching Pattern - Commands that run every frame avoid arena allocation - Use stack arrays with while-loop to batch operations in fixed-size chunks - Applied to: `prRhiCmdBindDescriptorSets`, `prRhiCmdBindVertexBuffers`, `prRhiCmdCopyBufferToImage` ### API Simplifications - `prRhiCreateCommandPool`: removed desc parameter, uses `device->queue_family_index` - `prRhiFreeCommandBuffers`: removed count parameter, uses `wpArrayCount` - `prRhiAllocateDescriptorSet`: changed `u32 variable_count` to `WpU32Array variable_descriptor_counts` - `prRhiCmdBindVertexBuffers`: changed raw pointer + count to `WpU64Array` ### New Pipeline Configuration - Added `polygon_mode`, `cull_mode`, `front_face` to rasterization - Added `depth_test_enable`, `depth_write_enable`, `depth_compare_op` - Added `vertex_shader_entry_point`, `fragment_shader_entry_point` (not hardcoded to "main") - Added `line_width`, `multisample_count` ### Code Style Updates - All Vulkan info structs use C99 designated initializers - Removed unnecessary type casts on opaque struct handles - Added braces to all single-line if statements - Braces rule moved from prism-rhi skill to AGENTS.md formatting section ## Documentation Updates - Updated `prism-rhi` skill with all new conventions - Updated `AGENTS.md` with frame-by-frame batching pattern - Moved braces rule to `AGENTS.md` (not RHI-specific)