Stage 4 Vulkan groundwork. Before this, RenderBackendOps.current() unconditionally
returned GlRenderBackendOps.INSTANCE with a 'Stage 3-prep' comment. Under Vulkan
the GL impl is still harmless (its methods all short-circuit on OptimizeToggles
and the GL mixins never fire), but the interface lied about the active backend.
- New misc/optimize/vulkan/VulkanRenderBackendOps: singleton, no-op stub, all
*Supported() return false, cache/map methods do nothing. This is the skeleton
the Stage 4 items (persistent VkPipelineCache, VulkanRenderPass state cache)
will grow into.
- RenderBackendOps.current() inspects RenderSystem.getDevice().getClass().getName()
and returns VulkanRenderBackendOps for com.mojang.blaze3d.vulkan.* devices,
GlRenderBackendOps otherwise. Class-name check (not instanceof) so this method
itself does not force linking of GlDevice/VulkanDevice.
- Wrapped getDevice() in try/catch: unit tests call current() before RenderSystem
has a device and previously took the GL path; now they still do via the fallback.
Doc: Stage 4 kickoff entry in the changelog.
DEV_GUIDE.md — единый справочник разработчика (сборка, правила ≤200/≤4, пакеты, модули/HUD/команды/миксины/рендер/тесты). Объединён из DEV_GUIDE.md+DEVELOPMENT.md 2026-09-23.
api/addons.md — API аддонов (lovisual:addon, жизненный цикл, что может аддон). Публичный API можно ломать свободно при рефакторинге (KISS > совместимость).
TODO.md в корне — план фаз (сейчас 8.5/9.1/9.2/10/11).