Conversation
📝 WalkthroughWalkthroughThis change introduces comprehensive new public APIs across the codebase's major subsystems: capture protocol and IPC layer interfaces, Vulkan dispatch/hooks for WSI and swapchain management, input and UI frameworks, rendering pipeline infrastructure (shader compilation, texture loading, filter chains), and configuration/utility foundations. Predominantly header-only additions establishing public API surfaces for a major architectural refactor. Changes
Estimated code review effort🎯 4 (Complex) | ⏱️ ~90 minutes Possibly related PRs
Suggested labels
Poem
🚥 Pre-merge checks | ✅ 1 | ❌ 2❌ Failed checks (2 warnings)
✅ Passed checks (1 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing touches
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
PR Compliance Guide 🔍Below is a summary of compliance checks for this PR:
Compliance status legend🟢 - Fully Compliant🟡 - Partial Compliant 🔴 - Not Compliant ⚪ - Requires Further Human Verification 🏷️ - Compliance label |
|||||||||||||||||||||||
PR Code Suggestions ✨No code suggestions found for the PR. |
There was a problem hiding this comment.
Actionable comments posted: 0
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
src/render/chain/semantic_binder.hpp (1)
33-40: Guard against zero dimensions to prevent infinity values.If
widthorheightis 0, the inverse calculations produceinf, which can cause undefined shader behavior or rendering artifacts.🔧 Suggested fix
[[nodiscard]] inline auto make_size_vec4(uint32_t width, uint32_t height) -> SizeVec4 { + // Clamp to at least 1 to avoid division by zero producing inf + const auto w = std::max(width, 1U); + const auto h = std::max(height, 1U); return { - .width = static_cast<float>(width), - .height = static_cast<float>(height), - .inv_width = 1.0F / static_cast<float>(width), - .inv_height = 1.0F / static_cast<float>(height), + .width = static_cast<float>(w), + .height = static_cast<float>(h), + .inv_width = 1.0F / static_cast<float>(w), + .inv_height = 1.0F / static_cast<float>(h), }; }Alternatively, add an assertion (
assert(width > 0 && height > 0)) if zero-size is a programming error that should never occur.src/capture/capture_protocol.hpp (1)
71-81: Missingstatic_assertforCaptureFrameMetadata.All other IPC message structs have a
static_assertto verify their size for wire format stability.CaptureFrameMetadataappears to be missing one, which could lead to undetected ABI mismatches if the struct layout changes.Suggested fix
struct CaptureFrameMetadata { CaptureMessageType type = CaptureMessageType::frame_metadata; uint32_t width = 0; uint32_t height = 0; VkFormat format = VK_FORMAT_UNDEFINED; uint32_t stride = 0; uint32_t offset = 0; uint64_t modifier = 0; uint64_t frame_number = 0; }; + +static_assert(sizeof(CaptureFrameMetadata) == 40);
🧹 Nitpick comments (10)
src/input/compositor_server.hpp (1)
13-21: Consider usingstd::variantor documenting field validity per event type.The
InputEventstruct uses a flat layout where certain fields are only meaningful for specific event types (e.g.,code/pressedfor key events,x/yfor motion,value/horizontalfor axis). While this is a common pattern for efficiency, consider adding a brief comment noting which fields apply to whichInputEventType, or using a variant for stronger type safety.📝 Optional: Add field-validity documentation
/// `@brief` Normalized input event for compositor injection. +/// Fields used per type: +/// - key: code, pressed +/// - pointer_motion: x, y +/// - pointer_button: code, pressed +/// - pointer_axis: value, horizontal struct InputEvent { InputEventType type; uint32_t code; bool pressed; double x, y; double value; bool horizontal; };docs/project_policies.md (1)
280-289: Good addition - consider explicit error documentation guidance.The new docstring policy appropriately distinguishes public API contracts from implementation comments (C.7) and provides clear, concise guidelines. The scope limitation to "exported/public declarations only" maintains consistency with the minimal-comment philosophy.
Since the project uses
tl::expected<T, Error>throughout (Section A.1), consider adding explicit guidance for documenting error cases:📝 Suggested addition after line 288
- Use `@return` for non-`void`; describe what it represents and any special cases. +- For functions returning `Result<T>` or `ResultPtr<T>`, document expected error codes in `@return`. - Do not restate types, avoid jargon, and keep one symbol per docstring.Example:
/// `@brief` Loads a shader module from the specified file path. /// `@param` path Absolute path to the SPIR-V shader file. /// `@return` Compiled shader module on success, or ErrorCode::FILE_NOT_FOUND / ErrorCode::SHADER_COMPILE_FAILED. [[nodiscard]] auto load_shader(const std::filesystem::path& path) -> Result<ShaderModule>;src/util/unique_fd.hpp (1)
56-57: Consider adding[[nodiscard]]torelease().Discarding the return value of
release()would leak the file descriptor since ownership is transferred to the caller. Adding[[nodiscard]]would catch accidental misuse at compile time.Suggested change
/// `@brief` Releases ownership and returns the raw descriptor. - int release() { return std::exchange(m_fd, -1); } + [[nodiscard]] int release() { return std::exchange(m_fd, -1); }src/util/serializer.hpp (1)
138-141: Consider distinguishingtellg()failure from empty file.
tellg()returns-1on error (e.g., if the file couldn't be read), but the current check treats bothsize == 0andsize < 0the same way—returning an empty vector. This could mask I/O errors as successful empty reads.Suggested improvement
const auto size = file.tellg(); + if (size < 0) { + return make_error<std::vector<char>>(ErrorCode::file_read_failed, + "Failed to determine file size: " + path.string()); + } - if (size <= 0) { + if (size == 0) { return std::vector<char>{}; }src/render/texture/texture_loader.hpp (1)
70-71: Consider returningResult<uint32_t>fromfind_memory_type.If no suitable memory type is found, returning a raw
uint32_tcould lead to undefined behavior when used. AResult<uint32_t>would allow proper error propagation.♻️ Suggested signature change
- [[nodiscard]] auto find_memory_type(uint32_t type_filter, vk::MemoryPropertyFlags properties) - -> uint32_t; + [[nodiscard]] auto find_memory_type(uint32_t type_filter, vk::MemoryPropertyFlags properties) + -> Result<uint32_t>;src/render/chain/pass.hpp (2)
112-114: Parenthesization differs fromfitmode offset calculation.In
fillmode (lines 112-113), the cast toint32_thappens before the division, whereas infitmode (lines 93-94), the subtraction result is cast first, then divided. For symmetry and consistency, consider matching the parenthesization pattern.♻️ Suggested fix for consistency
- result.offset_x = static_cast<int32_t>(target_width - result.width) / 2; - result.offset_y = static_cast<int32_t>(target_height - result.height) / 2; + result.offset_x = static_cast<int32_t>((target_width - result.width) / 2); + result.offset_y = static_cast<int32_t>((target_height - result.height) / 2);
129-130: Same parenthesization inconsistency inintegermode.This has the same pattern as the
fillmode offset calculation.♻️ Suggested fix for consistency
- result.offset_x = static_cast<int32_t>(target_width - result.width) / 2; - result.offset_y = static_cast<int32_t>(target_height - result.height) / 2; + result.offset_x = static_cast<int32_t>((target_width - result.width) / 2); + result.offset_y = static_cast<int32_t>((target_height - result.height) / 2);src/util/config.hpp (1)
39-47: Consider usingstd::filesystem::pathfor path fields.
Config::Pathsusesstd::stringwhilePathOverrides(inpaths.hpp) usesstd::filesystem::path. For consistency and to avoid unnecessary conversions when calling functions likeoverrides_from_config, consider usingstd::filesystem::pathhere as well.src/capture/vk_layer/wsi_virtual.hpp (1)
73-94: Consider adding docstrings to remaining public methods for consistency.Several public methods (
get_surface_capabilities,get_surface_formats,get_surface_present_modes,get_surface_support,create_swapchain,get_swapchain_images,acquire_next_image) lack@briefdocumentation while other methods in the same class have them. For API surface consistency and maintainability, consider documenting these as well.src/capture/vk_layer/vk_capture.hpp (1)
46-48: Remove redundant inline comment.Line 47 has a redundant comment that duplicates the
@briefon line 46. Consider removing it to avoid documentation drift.Suggested fix
/// `@brief` Device-level sync state independent of swapchain lifecycle. -// Device-level sync state (independent of swapchain lifecycle) struct DeviceSyncState {
📜 Review details
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (37)
docs/project_policies.mdsrc/capture/capture_protocol.hppsrc/capture/capture_receiver.hppsrc/capture/compositor/compositor_capture.hppsrc/capture/vk_layer/ipc_socket.hppsrc/capture/vk_layer/vk_capture.hppsrc/capture/vk_layer/vk_dispatch.hppsrc/capture/vk_layer/vk_hooks.hppsrc/capture/vk_layer/wsi_virtual.hppsrc/input/compositor_server.hppsrc/input/input_forwarder.hppsrc/render/backend/vulkan_backend.hppsrc/render/backend/vulkan_debug.hppsrc/render/backend/vulkan_error.hppsrc/render/chain/filter_chain.hppsrc/render/chain/filter_pass.hppsrc/render/chain/frame_history.hppsrc/render/chain/framebuffer.hppsrc/render/chain/output_pass.hppsrc/render/chain/pass.hppsrc/render/chain/preset_parser.hppsrc/render/chain/semantic_binder.hppsrc/render/shader/retroarch_preprocessor.hppsrc/render/shader/shader_runtime.hppsrc/render/shader/slang_reflect.hppsrc/render/texture/texture_loader.hppsrc/ui/imgui_layer.hppsrc/util/config.hppsrc/util/error.hppsrc/util/job_system.hppsrc/util/logging.hppsrc/util/paths.hppsrc/util/profiling.hppsrc/util/queues.hppsrc/util/serializer.hppsrc/util/unique_fd.hppsrc/util/util.hpp
🧰 Additional context used
🧠 Learnings (48)
📓 Common learnings
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: docs/project_policies.md:0-0
Timestamp: 2026-01-07T07:20:57.073Z
Learning: Testing scope: Only non-GPU logic tested initially. In scope: utility functions, configuration parsing, error handling, pipeline graph logic. Out of scope: Vulkan initialization, GPU resource management, rendering, capture layer.
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: openspec/project.md:0-0
Timestamp: 2025-12-29T15:44:30.520Z
Learning: Applies to openspec/src/capture/vk_layer/**/*.{cpp,hpp} : Capture layer (vk_layer/) MUST use raw Vulkan C API, not vulkan-hpp
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: docs/project_policies.md:0-0
Timestamp: 2026-01-07T07:20:57.073Z
Learning: Applies to docs/src/render/**/*.{cpp,hpp} : Application code MUST use vulkan-hpp (C++ bindings), NOT raw Vulkan C API. Use `vk::` types (e.g., `vk::Instance`, `vk::Device`). Do not use raw C handles like `VkInstance`, `VkDevice`. Required configuration: `#define VULKAN_HPP_NO_EXCEPTIONS`, `#define VULKAN_HPP_DISPATCH_LOADER_DYNAMIC 1`, `#include <vulkan/vulkan.hpp>`.
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: docs/project_policies.md:0-0
Timestamp: 2026-01-07T07:20:57.073Z
Learning: Applies to docs/src/render/**/*.cpp : Main thread owns: Vulkan instance, device, swapchain lifecycle; queue submission; window events and user input; job coordination. Main thread MUST NOT: block on I/O, perform heavy computation (>1ms), allocate memory in per-frame code paths.
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: openspec/project.md:0-0
Timestamp: 2025-12-29T15:44:30.520Z
Learning: Applies to openspec/src/capture/vk_layer/**/*.{cpp,hpp} : Do not perform blocking operations or file I/O in capture layer performance-critical paths (e.g., vkQueuePresentKHR)
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: openspec/project.md:0-0
Timestamp: 2025-12-29T15:44:30.520Z
Learning: Vulkan capture layer is the primary frame capture method, intercepting rendered frames before presentation for zero-copy access
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: docs/project_policies.md:0-0
Timestamp: 2026-01-07T07:20:57.073Z
Learning: Applies to docs/src/capture/vk_layer/**/*.{cpp,hpp} : Capture layer exception: The Vulkan capture layer (`src/capture/vk_layer/`) is exempt and MUST use the raw Vulkan C API because layer dispatch tables require C function pointers and the layer must intercept C API calls.
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: docs/project_policies.md:0-0
Timestamp: 2026-01-07T07:20:57.073Z
Learning: Applies to docs/src/capture/vk_layer/**/*.{cpp,hpp} : Vulkan capture layer threading: Hooks execute in calling thread (usually render thread). No blocking in hooks, especially `vkQueuePresentKHR` hot path. Use atomics or locks for thread-safe layer state.
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: openspec/project.md:0-0
Timestamp: 2025-12-29T15:44:30.520Z
Learning: Applies to openspec/src/render/**/*.{cpp,hpp} : Application code MUST use vulkan-hpp with `VULKAN_HPP_NO_EXCEPTIONS` and dynamic dispatch
📚 Learning: 2026-01-07T07:20:57.073Z
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: docs/project_policies.md:0-0
Timestamp: 2026-01-07T07:20:57.073Z
Learning: Applies to docs/**/*.{cpp,hpp} : Code commenting policy: Code explains what, comments explain why (only when non-obvious). Forbidden patterns: narration comments restating what code does; LLM-style justifications of standard practices; step-by-step tutorials; inline explanations of current line. Required comments: non-obvious constraints (API requirements), workarounds, invariants, section dividers in files >200 lines.
Applied to files:
docs/project_policies.md
📚 Learning: 2026-01-07T07:20:57.073Z
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: docs/project_policies.md:0-0
Timestamp: 2026-01-07T07:20:57.073Z
Learning: Applies to docs/**/*.{cpp,hpp} : Use top-level namespace `goggles`. Use module namespaces `goggles::<module>` (e.g., `goggles::capture`, `goggles::render`). Use sub-module namespaces `goggles::<module>::<submodule>`. Never use `using namespace` in headers. Prefer explicit namespace qualification or scoped `using` declarations.
Applied to files:
docs/project_policies.mdsrc/util/logging.hppsrc/util/util.hppsrc/render/chain/frame_history.hppsrc/capture/compositor/compositor_capture.hpp
📚 Learning: 2026-01-07T07:20:57.073Z
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: docs/project_policies.md:0-0
Timestamp: 2026-01-07T07:20:57.073Z
Learning: Applies to docs/**/*.{cpp,hpp} : Use standard spdlog severity levels: trace, debug, info, warn, error, critical. Define project-specific logging macros (`GOGGLES_LOG_TRACE`, `GOGGLES_LOG_DEBUG`, etc.) wrapping spdlog.
Applied to files:
docs/project_policies.mdsrc/util/logging.hpp
📚 Learning: 2026-01-07T07:20:57.073Z
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: docs/project_policies.md:0-0
Timestamp: 2026-01-07T07:20:57.073Z
Learning: Applies to docs/**/*.{cpp,hpp} : Mark factory functions with `[[nodiscard]]`. Document ownership in function comments when non-obvious. Use move semantics for transferring ownership (prefer `std::move` over copying).
Applied to files:
docs/project_policies.mdsrc/util/paths.hppsrc/capture/compositor/compositor_capture.hpp
📚 Learning: 2026-01-07T07:20:57.073Z
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: docs/project_policies.md:0-0
Timestamp: 2026-01-07T07:20:57.073Z
Learning: Applies to docs/**/*.cpp : No raw `new`/`delete` in application code. Prefer `std::unique_ptr` for exclusive ownership. Use `std::shared_ptr` only when multiple owners genuinely needed or object lifetime extends beyond single scope. Prefer `std::make_unique`/`std::make_shared` over explicit `new`.
Applied to files:
docs/project_policies.md
📚 Learning: 2026-01-07T07:20:57.073Z
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: docs/project_policies.md:0-0
Timestamp: 2026-01-07T07:20:57.073Z
Learning: Applies to docs/**/*.{cpp,hpp} : Banned error handling patterns: No `bool` returns for operations that can fail in multiple ways. No `-1`/`0`/`nullptr` as error indicators. No ignored return values - mark all result-returning functions with `[[nodiscard]]`.
Applied to files:
docs/project_policies.mdsrc/util/error.hpp
📚 Learning: 2026-01-07T07:20:57.073Z
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: docs/project_policies.md:0-0
Timestamp: 2026-01-07T07:20:57.073Z
Learning: Applies to docs/**/*.{cpp,hpp} : All resources must be managed via RAII. Wrap Vulkan objects in RAII types. Use RAII wrappers for file handles and sockets. No manual cleanup in destructors unless encapsulated in RAII.
Applied to files:
docs/project_policies.mdsrc/render/backend/vulkan_error.hppsrc/render/backend/vulkan_debug.hpp
📚 Learning: 2025-12-29T15:44:30.520Z
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: openspec/project.md:0-0
Timestamp: 2025-12-29T15:44:30.520Z
Learning: Applies to openspec/src/**/*.{cpp,hpp} : Never use raw `new` or `delete`; enforce strict RAII for all resources
Applied to files:
docs/project_policies.md
📚 Learning: 2026-01-07T07:20:57.073Z
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: docs/project_policies.md:0-0
Timestamp: 2026-01-07T07:20:57.073Z
Learning: Applies to docs/src/render/**/*.cpp : Per-frame code paths on main thread MUST NOT: perform dynamic memory allocations (`new`, `malloc`, `std::make_shared`); use blocking synchronization primitives (`std::mutex`, `std::condition_variable`); exceed 8ms CPU time budget (excluding GPU sync).
Applied to files:
docs/project_policies.mdsrc/render/shader/shader_runtime.hpp
📚 Learning: 2026-01-07T07:20:57.073Z
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: docs/project_policies.md:0-0
Timestamp: 2026-01-07T07:20:57.073Z
Learning: Applies to docs/**/*.{cpp,hpp} : All fallible operations must return `tl::expected<T, Error>` from martinmoene/expected-lite library. No exceptions for expected failures (file I/O, resource creation, parsing). Exceptions allowed only for programming errors (assertions, contract violations).
Applied to files:
docs/project_policies.mdsrc/util/error.hpp
📚 Learning: 2026-01-07T07:20:57.073Z
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: docs/project_policies.md:0-0
Timestamp: 2026-01-07T07:20:57.073Z
Learning: Applies to docs/**/*.hpp : Header guidelines: Use `#pragma once` instead of include guards. Minimize includes and forward-declare types when possible. Include order: (1) Corresponding header, (2) C++ standard library, (3) Third-party libraries, (4) Project headers (other modules), (5) Project headers (same module). Sort alphabetically within each group.
Applied to files:
docs/project_policies.md
📚 Learning: 2026-01-07T07:20:57.073Z
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: docs/project_policies.md:0-0
Timestamp: 2026-01-07T07:20:57.073Z
Learning: Applies to docs/**/*.cpp : No silent failures. Every error must be either handled or propagated upward. Log errors exactly once at subsystem boundaries (capture → pipeline). Do not log the same error at every level of the call stack. Prefer monadic operations (`.and_then()`, `.or_else()`, `.transform()`) for chaining.
Applied to files:
docs/project_policies.md
📚 Learning: 2026-01-07T07:20:57.073Z
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: docs/project_policies.md:0-0
Timestamp: 2026-01-07T07:20:57.073Z
Learning: Applies to docs/**/*.cpp : Use `spdlog` as the project-wide logging library. No `std::cout`, `std::cerr`, or `printf` for subsystem logging (only for main app output).
Applied to files:
src/util/logging.hpp
📚 Learning: 2025-12-29T15:44:30.520Z
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: openspec/project.md:0-0
Timestamp: 2025-12-29T15:44:30.520Z
Learning: Applies to openspec/**/*.hpp : Organize namespaces as `goggles` with sub-modules like `goggles::capture`, `goggles::render`; never use `using namespace` in headers
Applied to files:
src/util/logging.hppsrc/util/util.hppsrc/render/chain/frame_history.hppsrc/capture/compositor/compositor_capture.hpp
📚 Learning: 2026-01-07T07:20:57.073Z
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: docs/project_policies.md:0-0
Timestamp: 2026-01-07T07:20:57.073Z
Learning: Applies to docs/**/*.cpp : Initialize logger once at application startup for console output (development) or file output (optional). For capture layer, initialize logger lazily on first `vkCreateInstance` hook.
Applied to files:
src/util/logging.hppsrc/capture/vk_layer/vk_dispatch.hppsrc/capture/vk_layer/vk_hooks.hpp
📚 Learning: 2026-01-07T07:20:57.073Z
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: docs/project_policies.md:0-0
Timestamp: 2026-01-07T07:20:57.073Z
Learning: Applies to docs/src/capture/vk_layer/**/*.{cpp,hpp} : Vulkan capture layer logging constraints: Use only `error` and `critical` levels. No file I/O or blocking operations in hot paths. Prefix all logs with `[goggles_vklayer]`. Never log in `vkQueuePresentKHR` hot path.
Applied to files:
src/util/logging.hppsrc/render/backend/vulkan_error.hppsrc/capture/vk_layer/wsi_virtual.hppsrc/render/backend/vulkan_debug.hppsrc/capture/vk_layer/vk_dispatch.hppsrc/capture/vk_layer/vk_hooks.hppsrc/capture/vk_layer/vk_capture.hppsrc/util/error.hpp
📚 Learning: 2026-01-07T07:20:57.073Z
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: docs/project_policies.md:0-0
Timestamp: 2026-01-07T07:20:57.073Z
Learning: Applies to docs/**/*.cpp : Error handling macros: Use `VK_TRY` for vk::Result early return in Vulkan code. Use `GOGGLES_TRY` for Result<T> propagation (both as statement and expression). Use `GOGGLES_MUST` for internal invariants that should never fail. Use manual pattern for destructors/cleanup functions where propagation is impossible.
Applied to files:
src/render/backend/vulkan_error.hppsrc/render/backend/vulkan_debug.hppsrc/util/error.hpp
📚 Learning: 2026-01-07T07:20:57.073Z
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: docs/project_policies.md:0-0
Timestamp: 2026-01-07T07:20:57.073Z
Learning: Applies to docs/src/render/**/*.{cpp,hpp} : All vulkan-hpp calls returning `vk::Result` must be explicitly checked. Prohibited pattern: `static_cast<void>(device.waitIdle())`. Use macro `VK_TRY(call, ErrorCode, "message")` for vk::Result early return or manual pattern with error handling.
Applied to files:
src/render/backend/vulkan_error.hppsrc/render/backend/vulkan_debug.hppsrc/util/error.hpp
📚 Learning: 2026-01-07T07:20:57.073Z
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: docs/project_policies.md:0-0
Timestamp: 2026-01-07T07:20:57.073Z
Learning: Applies to docs/src/render/**/*.{cpp,hpp} : Application code MUST use vulkan-hpp (C++ bindings), NOT raw Vulkan C API. Use `vk::` types (e.g., `vk::Instance`, `vk::Device`). Do not use raw C handles like `VkInstance`, `VkDevice`. Required configuration: `#define VULKAN_HPP_NO_EXCEPTIONS`, `#define VULKAN_HPP_DISPATCH_LOADER_DYNAMIC 1`, `#include <vulkan/vulkan.hpp>`.
Applied to files:
src/render/backend/vulkan_error.hppsrc/render/chain/pass.hppsrc/render/texture/texture_loader.hppsrc/render/backend/vulkan_backend.hppsrc/render/shader/shader_runtime.hppsrc/capture/vk_layer/wsi_virtual.hppsrc/render/backend/vulkan_debug.hppsrc/capture/vk_layer/vk_dispatch.hppsrc/capture/vk_layer/vk_hooks.hppsrc/util/error.hppsrc/render/chain/preset_parser.hpp
📚 Learning: 2026-01-07T07:20:57.073Z
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: docs/project_policies.md:0-0
Timestamp: 2026-01-07T07:20:57.073Z
Learning: Applies to docs/src/render/**/*.{cpp,hpp} : Vulkan resource management: Follow RAII guidelines. Use `vk::Unique*` only for appropriate resource types. Call `device.waitIdle()` or wait on fences before destroying GPU-async resources. Store creation info with resources for debugging/recreation. Never leak Vulkan objects. Member ordering: declare in reverse destruction order (device before instance).
Applied to files:
src/render/backend/vulkan_error.hppsrc/render/chain/pass.hppsrc/render/chain/filter_pass.hppsrc/render/texture/texture_loader.hppsrc/render/chain/framebuffer.hppsrc/render/backend/vulkan_backend.hppsrc/render/shader/shader_runtime.hppsrc/capture/vk_layer/wsi_virtual.hppsrc/render/backend/vulkan_debug.hppsrc/capture/vk_layer/vk_dispatch.hppsrc/capture/vk_layer/vk_hooks.hppsrc/render/chain/output_pass.hppsrc/capture/vk_layer/vk_capture.hpp
📚 Learning: 2025-12-29T15:44:30.520Z
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: openspec/project.md:0-0
Timestamp: 2025-12-29T15:44:30.520Z
Learning: Applies to openspec/src/render/**/*.{cpp,hpp} : Application code MUST use vulkan-hpp with `VULKAN_HPP_NO_EXCEPTIONS` and dynamic dispatch
Applied to files:
src/render/backend/vulkan_error.hppsrc/render/chain/pass.hppsrc/render/shader/shader_runtime.hppsrc/render/backend/vulkan_debug.hppsrc/capture/vk_layer/vk_dispatch.hppsrc/util/error.hpp
📚 Learning: 2026-01-07T07:20:57.073Z
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: docs/project_policies.md:0-0
Timestamp: 2026-01-07T07:20:57.073Z
Learning: Applies to docs/src/render/**/*.{cpp,hpp} : RAII handle guidelines for Vulkan resources: Use `vk::Unique*` only for appropriate resource types: Instance, Device, Surface (long-lived singletons); Swapchain, Pipelines, Layouts (created once). Use plain `vk::` handles for command buffers (pooled lifetime), per-frame sync primitives (reused), and imported external images (requires explicit sync).
Applied to files:
src/render/backend/vulkan_error.hppsrc/util/unique_fd.hppsrc/render/chain/pass.hppsrc/render/texture/texture_loader.hppsrc/render/chain/framebuffer.hppsrc/render/backend/vulkan_backend.hppsrc/capture/vk_layer/wsi_virtual.hppsrc/render/backend/vulkan_debug.hppsrc/capture/vk_layer/vk_dispatch.hppsrc/capture/vk_layer/vk_hooks.hppsrc/capture/vk_layer/vk_capture.hpp
📚 Learning: 2026-01-07T07:20:57.073Z
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: docs/project_policies.md:0-0
Timestamp: 2026-01-07T07:20:57.073Z
Learning: Applies to docs/src/capture/vk_layer/**/*.{cpp,hpp} : Capture layer exception: The Vulkan capture layer (`src/capture/vk_layer/`) is exempt and MUST use the raw Vulkan C API because layer dispatch tables require C function pointers and the layer must intercept C API calls.
Applied to files:
src/render/backend/vulkan_error.hppsrc/capture/capture_protocol.hppsrc/ui/imgui_layer.hppsrc/capture/compositor/compositor_capture.hppsrc/capture/vk_layer/wsi_virtual.hppsrc/render/backend/vulkan_debug.hppsrc/capture/vk_layer/vk_dispatch.hppsrc/capture/vk_layer/vk_hooks.hppsrc/capture/vk_layer/ipc_socket.hppsrc/capture/vk_layer/vk_capture.hpp
📚 Learning: 2025-12-29T15:44:30.520Z
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: openspec/project.md:0-0
Timestamp: 2025-12-29T15:44:30.520Z
Learning: Applies to openspec/src/render/**/*.{cpp,hpp} : Use `vk::Unique*` for long-lived Vulkan resources; use plain handles for per-frame/GPU-async resources
Applied to files:
src/render/backend/vulkan_error.hppsrc/render/chain/pass.hppsrc/render/texture/texture_loader.hppsrc/render/chain/framebuffer.hppsrc/render/backend/vulkan_backend.hppsrc/render/shader/shader_runtime.hppsrc/capture/vk_layer/wsi_virtual.hppsrc/render/backend/vulkan_debug.hppsrc/capture/vk_layer/vk_dispatch.hppsrc/render/chain/output_pass.hppsrc/capture/vk_layer/vk_capture.hpp
📚 Learning: 2026-01-07T07:20:57.073Z
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: docs/project_policies.md:0-0
Timestamp: 2026-01-07T07:20:57.073Z
Learning: Applies to docs/**/*.{cpp,hpp} : All real-time inter-thread communication MUST use `goggles::util::SPSCQueue` for fixed producer-consumer pairs (wait-free guarantee). Never use MPMC queues in latency-critical paths. Operations must be non-blocking (`try_push`, `try_pop`). Use pointer passing with pre-allocated buffers.
Applied to files:
src/util/queues.hpp
📚 Learning: 2025-12-29T15:44:30.520Z
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: openspec/project.md:0-0
Timestamp: 2025-12-29T15:44:30.520Z
Learning: Applies to openspec/src/**/*.{cpp,hpp} : Use inter-thread communication via `goggles::util::SPSCQueue` (lock-free SPSC queue) for task parallelism
Applied to files:
src/util/queues.hppsrc/util/job_system.hpp
📚 Learning: 2026-01-07T07:20:57.073Z
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: docs/project_policies.md:0-0
Timestamp: 2026-01-07T07:20:57.073Z
Learning: Applies to docs/**/*.{cpp,hpp} : Never use raw `int` file descriptors when possible. Use `goggles::util::UniqueFd` for all owned file descriptors. Raw `int` acceptable only at uncontrollable boundaries (syscall returns, IPC receive). Wrap immediately after receive. API boundaries may use `int` with clear documentation.
Applied to files:
src/util/unique_fd.hppsrc/util/error.hpp
📚 Learning: 2025-12-29T15:44:30.520Z
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: openspec/project.md:0-0
Timestamp: 2025-12-29T15:44:30.520Z
Learning: Applies to openspec/src/**/*.{cpp,hpp} : Use `std::unique_ptr` as the default for exclusive ownership; `std::shared_ptr` only when necessary
Applied to files:
src/util/unique_fd.hpp
📚 Learning: 2026-01-07T07:20:57.073Z
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: docs/project_policies.md:0-0
Timestamp: 2026-01-07T07:20:57.073Z
Learning: Testing scope: Only non-GPU logic tested initially. In scope: utility functions, configuration parsing, error handling, pipeline graph logic. Out of scope: Vulkan initialization, GPU resource management, rendering, capture layer.
Applied to files:
src/render/chain/pass.hppsrc/render/backend/vulkan_backend.hppsrc/capture/vk_layer/wsi_virtual.hppsrc/capture/vk_layer/vk_dispatch.hpp
📚 Learning: 2026-01-07T07:20:57.073Z
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: docs/project_policies.md:0-0
Timestamp: 2026-01-07T07:20:57.073Z
Learning: Applies to docs/src/render/**/*.cpp : Main thread owns: Vulkan instance, device, swapchain lifecycle; queue submission; window events and user input; job coordination. Main thread MUST NOT: block on I/O, perform heavy computation (>1ms), allocate memory in per-frame code paths.
Applied to files:
src/render/chain/pass.hppsrc/render/backend/vulkan_backend.hppsrc/capture/vk_layer/wsi_virtual.hppsrc/capture/vk_layer/vk_hooks.hppsrc/capture/vk_layer/vk_capture.hpp
📚 Learning: 2025-12-29T15:44:30.520Z
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: openspec/project.md:0-0
Timestamp: 2025-12-29T15:44:30.520Z
Learning: Applies to openspec/src/capture/vk_layer/**/*.{cpp,hpp} : Do not perform blocking operations or file I/O in capture layer performance-critical paths (e.g., vkQueuePresentKHR)
Applied to files:
src/render/chain/pass.hppsrc/capture/capture_protocol.hppsrc/render/backend/vulkan_backend.hppsrc/ui/imgui_layer.hppsrc/capture/compositor/compositor_capture.hppsrc/capture/vk_layer/wsi_virtual.hppsrc/capture/vk_layer/vk_dispatch.hppsrc/capture/vk_layer/vk_hooks.hppsrc/capture/vk_layer/ipc_socket.hppsrc/capture/vk_layer/vk_capture.hpp
📚 Learning: 2025-12-29T15:44:30.520Z
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: openspec/project.md:0-0
Timestamp: 2025-12-29T15:44:30.520Z
Learning: The main thread owns all global Vulkan objects (Instance, Device) and is solely responsible for queue submissions
Applied to files:
src/render/chain/pass.hppsrc/capture/vk_layer/vk_dispatch.hppsrc/capture/vk_layer/vk_capture.hpp
📚 Learning: 2025-12-29T15:44:30.520Z
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: openspec/project.md:0-0
Timestamp: 2025-12-29T15:44:30.520Z
Learning: Vulkan capture layer is the primary frame capture method, intercepting rendered frames before presentation for zero-copy access
Applied to files:
src/render/chain/pass.hppsrc/render/backend/vulkan_backend.hppsrc/ui/imgui_layer.hppsrc/capture/compositor/compositor_capture.hppsrc/capture/vk_layer/wsi_virtual.hppsrc/capture/vk_layer/vk_dispatch.hppsrc/capture/vk_layer/vk_hooks.hppsrc/capture/vk_layer/ipc_socket.hppsrc/capture/vk_layer/vk_capture.hpp
📚 Learning: 2026-01-07T07:20:57.073Z
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: docs/project_policies.md:0-0
Timestamp: 2026-01-07T07:20:57.073Z
Learning: Applies to docs/src/capture/vk_layer/**/*.{cpp,hpp} : Vulkan capture layer threading: Hooks execute in calling thread (usually render thread). No blocking in hooks, especially `vkQueuePresentKHR` hot path. Use atomics or locks for thread-safe layer state.
Applied to files:
src/render/chain/pass.hppsrc/render/backend/vulkan_backend.hppsrc/ui/imgui_layer.hppsrc/capture/vk_layer/wsi_virtual.hppsrc/capture/vk_layer/vk_dispatch.hppsrc/capture/vk_layer/vk_hooks.hppsrc/capture/vk_layer/ipc_socket.hppsrc/capture/vk_layer/vk_capture.hpp
📚 Learning: 2025-12-29T15:44:30.520Z
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: openspec/project.md:0-0
Timestamp: 2025-12-29T15:44:30.520Z
Learning: Applies to openspec/src/capture/vk_layer/**/*.{cpp,hpp} : Capture layer (vk_layer/) MUST use raw Vulkan C API, not vulkan-hpp
Applied to files:
src/capture/capture_protocol.hppsrc/ui/imgui_layer.hppsrc/capture/compositor/compositor_capture.hppsrc/capture/vk_layer/wsi_virtual.hppsrc/render/backend/vulkan_debug.hppsrc/capture/vk_layer/vk_dispatch.hppsrc/capture/vk_layer/vk_hooks.hppsrc/capture/vk_layer/ipc_socket.hppsrc/capture/vk_layer/vk_capture.hpp
📚 Learning: 2026-01-07T07:20:57.073Z
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: docs/project_policies.md:0-0
Timestamp: 2026-01-07T07:20:57.073Z
Learning: Applies to docs/**/*.cpp : Configuration loading: Read once at startup (no hot-reload initially). Validate all values after parsing. Provide defaults for all optional values. Fail fast on invalid config (do not silently ignore).
Applied to files:
src/util/config.hpp
📚 Learning: 2026-01-07T07:20:57.073Z
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: docs/project_policies.md:0-0
Timestamp: 2026-01-07T07:20:57.073Z
Learning: Applies to docs/**/*.cpp : All concurrent processing MUST use the project's central job system (`goggles::util::JobSystem`). Phase 1: BS::thread_pool. Phase 2: Taskflow. Direct use of `std::thread` or `std::jthread` for pipeline work is PROHIBITED. Exception: External integration code (networking, IPC) outside real-time path may use `std::jthread` with RAII.
Applied to files:
src/util/job_system.hpp
📚 Learning: 2025-12-29T15:44:30.520Z
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: openspec/project.md:0-0
Timestamp: 2025-12-29T15:44:30.520Z
Learning: Default to single-threaded render loop on main thread; use central job system (goggles::util::JobSystem) for any task parallelism
Applied to files:
src/util/job_system.hppsrc/render/backend/vulkan_backend.hpp
📚 Learning: 2026-01-07T07:20:57.073Z
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: docs/project_policies.md:0-0
Timestamp: 2026-01-07T07:20:57.073Z
Learning: Applies to docs/src/render/**/*.cpp : Single-threaded render loop on main thread by default. Render backend (`goggles::render`) runs on main thread. Pipeline execution runs on main thread. Job system for non-render work on worker threads. Threading introduced only when profiling justifies it (main thread CPU consistently >8ms).
Applied to files:
src/util/job_system.hppsrc/render/backend/vulkan_backend.hppsrc/render/chain/frame_history.hppsrc/render/shader/shader_runtime.hpp
📚 Learning: 2026-01-07T07:20:57.073Z
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: docs/project_policies.md:0-0
Timestamp: 2026-01-07T07:20:57.073Z
Learning: Applies to docs/**/*.{cpp,hpp} : Object initialization policy: Use factory pattern `static auto create(...) -> ResultPtr<T>` for: (1) Manager/singleton objects (VulkanBackend, FilterChain), (2) Objects owning multiple interdependent resources, (3) Objects where uninitialized state causes undefined behavior. Banned pattern: No two-phase initialization (no constructor + `init()`).
Applied to files:
src/render/backend/vulkan_backend.hpp
📚 Learning: 2025-12-29T15:44:30.520Z
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: openspec/project.md:0-0
Timestamp: 2025-12-29T15:44:30.520Z
Learning: Support RetroArch shader format for wide compatibility
Applied to files:
src/render/shader/retroarch_preprocessor.hppsrc/render/chain/semantic_binder.hpp
📚 Learning: 2025-12-29T15:44:30.520Z
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: openspec/project.md:0-0
Timestamp: 2025-12-29T15:44:30.520Z
Learning: The shader pipeline is a multi-pass model designed for compatibility with RetroArch shader semantics
Applied to files:
src/render/shader/retroarch_preprocessor.hppsrc/render/shader/shader_runtime.hppsrc/render/chain/semantic_binder.hpp
📚 Learning: 2025-12-29T15:44:30.520Z
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: openspec/project.md:0-0
Timestamp: 2025-12-29T15:44:30.520Z
Learning: Applies to openspec/**/*.{cpp,hpp} : Use `snake_case` for file names (e.g., `shader_runtime.hpp`)
Applied to files:
src/render/shader/shader_runtime.hpp
📚 Learning: 2026-01-07T07:20:57.073Z
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: docs/project_policies.md:0-0
Timestamp: 2026-01-07T07:20:57.073Z
Learning: Applies to docs/**/*.hpp : Define a lightweight `Error` struct with `ErrorCode` enum, `std::string message`, and optional `std::source_location loc` in the `goggles` namespace.
Applied to files:
src/util/error.hpp
📚 Learning: 2026-01-07T07:20:57.073Z
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: docs/project_policies.md:0-0
Timestamp: 2026-01-07T07:20:57.073Z
Learning: Applies to docs/**/*.{cpp,hpp} : Type naming: Classes/Structs use `PascalCase` (e.g., `VulkanBackend`, `ShaderPass`). Enums use `PascalCase` for type and `snake_case` for enumerators (e.g., `enum class ErrorCode { ok, file_not_found }`). Type aliases use `PascalCase` (e.g., `using ShaderHandle = uint32_t;`).
Applied to files:
src/util/error.hppsrc/render/chain/preset_parser.hpp
📚 Learning: 2025-12-29T15:44:30.520Z
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: openspec/project.md:0-0
Timestamp: 2025-12-29T15:44:30.520Z
Learning: Applies to openspec/src/**/*.{cpp,hpp} : All fallible operations MUST return `tl::expected<T, Error>` for error handling
Applied to files:
src/util/error.hpp
📚 Learning: 2025-12-29T15:44:30.520Z
Learnt from: CR
Repo: K1ngst0m/Goggles PR: 0
File: openspec/project.md:0-0
Timestamp: 2025-12-29T15:44:30.520Z
Learning: Applies to openspec/src/**/*.{cpp,hpp} : Exceptions are only for unrecoverable programming errors; use `tl::expected` for recoverable errors
Applied to files:
src/util/error.hpp
🧬 Code graph analysis (10)
src/render/shader/slang_reflect.hpp (1)
src/render/chain/filter_pass.hpp (2)
nodiscard(91-93)nodiscard(101-103)
src/util/config.hpp (2)
src/render/chain/pass.hpp (1)
nodiscard(60-156)src/util/error.hpp (1)
nodiscard(54-58)
src/util/job_system.hpp (1)
src/util/job_system.cpp (4)
thread_count(34-39)thread_count(34-34)ensure_initialized(41-45)ensure_initialized(41-41)
src/render/chain/frame_history.hpp (1)
src/render/chain/filter_chain.hpp (1)
extent(98-98)
src/render/shader/retroarch_preprocessor.hpp (2)
src/render/chain/filter_pass.hpp (2)
nodiscard(91-93)nodiscard(101-103)src/render/chain/semantic_binder.hpp (14)
nodiscard(28-28)nodiscard(29-29)nodiscard(33-40)nodiscard(54-56)nodiscard(67-69)nodiscard(99-99)nodiscard(102-108)nodiscard(110-110)nodiscard(112-112)nodiscard(114-114)nodiscard(116-116)nodiscard(118-118)nodiscard(120-122)nodiscard(129-135)
src/input/input_forwarder.hpp (1)
src/util/error.hpp (4)
nodiscard(54-58)nodiscard(61-63)nodiscard(66-70)nodiscard(73-109)
src/render/chain/filter_chain.hpp (1)
src/render/chain/filter_pass.hpp (9)
nodiscard(91-93)nodiscard(101-103)cmd(57-57)frame_index(116-116)name(81-83)name(81-81)name(86-88)name(86-86)name(94-94)
src/capture/vk_layer/vk_hooks.hpp (1)
src/capture/vk_layer/vk_hooks.cpp (32)
Goggles_CreateInstance(33-120)Goggles_CreateInstance(33-35)Goggles_DestroyInstance(122-133)Goggles_DestroyInstance(122-123)Goggles_CreateDevice(218-365)Goggles_CreateDevice(218-221)Goggles_DestroyDevice(367-381)Goggles_DestroyDevice(367-367)Goggles_CreateXlibSurfaceKHR(387-401)Goggles_CreateXlibSurfaceKHR(387-390)Goggles_CreateXcbSurfaceKHR(403-417)Goggles_CreateXcbSurfaceKHR(403-406)Goggles_CreateWaylandSurfaceKHR(419-432)Goggles_CreateWaylandSurfaceKHR(419-421)Goggles_DestroySurfaceKHR(434-446)Goggles_DestroySurfaceKHR(434-435)Goggles_GetPhysicalDeviceSurfaceCapabilitiesKHR(448-463)Goggles_GetPhysicalDeviceSurfaceCapabilitiesKHR(448-450)Goggles_GetPhysicalDeviceSurfaceFormatsKHR(465-480)Goggles_GetPhysicalDeviceSurfaceFormatsKHR(465-467)Goggles_GetPhysicalDeviceSurfacePresentModesKHR(482-498)Goggles_GetPhysicalDeviceSurfacePresentModesKHR(482-484)Goggles_GetPhysicalDeviceSurfaceSupportKHR(500-520)Goggles_GetPhysicalDeviceSurfaceSupportKHR(500-503)Goggles_GetPhysicalDeviceSurfaceCapabilities2KHR(522-538)Goggles_GetPhysicalDeviceSurfaceCapabilities2KHR(522-524)Goggles_CreateSwapchainKHR(573-603)Goggles_CreateSwapchainKHR(573-576)Goggles_DestroySwapchainKHR(605-624)Goggles_DestroySwapchainKHR(605-606)Goggles_GetSwapchainImagesKHR(626-640)Goggles_GetSwapchainImagesKHR(626-628)
src/capture/vk_layer/ipc_socket.hpp (3)
src/capture/capture_receiver.hpp (1)
data(76-77)src/util/serializer.hpp (2)
data(19-22)data(19-19)src/render/backend/vulkan_backend.hpp (1)
frame_ready_fd(96-97)
src/capture/vk_layer/vk_capture.hpp (2)
src/capture/vk_layer/vk_dispatch.hpp (7)
device(121-121)device(126-126)device(128-128)device(132-132)device(137-137)queue(130-130)queue(135-135)src/capture/vk_layer/wsi_virtual.hpp (7)
device(82-83)device(85-85)device(92-94)swapchain(87-87)swapchain(89-89)swapchain(91-91)swapchain(96-96)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
- GitHub Check: Static Analysis (clang-tidy)
- GitHub Check: Build and Test (test preset)
✏️ Tip: You can disable this entire section by setting review_details to false in your review settings.
PR Type
Documentation
Description
Adds comprehensive Doxygen docstrings to public API declarations
Converts informal comments to structured
@brief,@param,@returnformatImproves code clarity for library users and IDE documentation
Updates project policies to formalize docstring standards
Diagram Walkthrough
File Walkthrough
37 files
Add docstrings to protocol structs and constantsDocument receiver class and public methodsAdd docstring and delete specifiers to stub classDocument socket client class and methodsDocument capture manager and related structsDocument dispatch table structs and tracker classDocument all Vulkan layer hook entry pointsDocument WSI virtualization classes and methodsDocument compositor server class and input methodsDocument input forwarder class and methodsDocument renderer class and public methodsDocument debug messenger classImprove VK_TRY macro documentationDocument filter chain class and structsDocument filter pass class and configDocument frame history class methodsDocument framebuffer class methodsDocument output pass classDocument pass interface and viewport calculationDocument preset parser and config structsDocument semantic binding structs and methodsDocument shader preprocessor classDocument shader runtime classDocument reflection structs and functionsDocument texture loader classDocument ImGui layer class and methodsDocument config structs and functionsDocument error types and macrosDocument job system class methodsDocument logging initialization functionsConvert block comments to docstringsDocument profiling macrosDocument SPSC queue class and methodsDocument binary reader/writer classesDocument file descriptor wrapper classReplace stub with umbrella header docstringAdd section C.8 formalizing docstring standardsSummary by CodeRabbit
New Features
Improvements
✏️ Tip: You can customize this high-level summary in your review settings.