Intermediate Graphics Library (IGL) is a cross-platform library that commands the GPU. It provides a single low-level cross-platform interface on top of various graphics APIs (e.g. OpenGL, Metal and Vulkan).
This report summarizes scanner evidence for facebook/igl, a C++ project with 3,238 GitHub stars. SynthScan examined 278,639 lines of code across 1334 source files, recording 609 pattern matches distributed across 10 syntactic categories. The legacy adjusted pattern signal is 2.3 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 586 finding(s).
Are imports declared and package/API names verified? 11 finding(s).
Are wrappers, guards, and repeated structures necessary? 31 finding(s).
Which changes need focused human review? 609 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 609 distinct pattern matches across 10 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | shell/openxr/XrPlatform.h | 21 | COMMENT | |
| LOW | shell/openxr/XrComposition.h | 1 | /* | COMMENT |
| LOW | shell/openxr/XrApp.h | 1 | /* | COMMENT |
| LOW | shell/openxr/XrLog.h | 21 | #else | COMMENT |
| LOW | shell/openxr/mobile/XrApp.cpp | 21 | COMMENT | |
| LOW | shell/openxr/mobile/AndroidMain.cpp | 21 | #ifdef ATTACH_DEBUGGER | COMMENT |
| LOW | shell/openxr/mobile/opengl/XrAppImplGLES.cpp | 1 | /* | COMMENT |
| LOW | shell/shared/extension/SymbolFactoryLoader.cpp | 1 | /* | COMMENT |
| LOW | shell/shared/extension/SymbolFactoryLoader.cpp | 21 | #endif | COMMENT |
| LOW | shell/shared/input/InputDispatcher.h | 1 | /* | COMMENT |
| LOW | shell/shared/platform/PresentationRateController.h | 21 | /// The rate named by PresentationRateRequest::hz. | COMMENT |
| LOW | shell/shared/platform/PresentationRateController.h | 61 | /// The outcome of the most recent request, plus what is presenting right now. | COMMENT |
| LOW | shell/shared/platform/PresentationRateController.h | 101 | [[nodiscard]] virtual PresentationRateCapabilities getCapabilities() const noexcept = 0; | COMMENT |
| LOW | shell/shared/platform/TickSourceRateBackend.h | 21 | /// and naming the refusal when it cannot deliver one — lives here rather than once per | COMMENT |
| LOW | shell/shared/platform/TickSourceRateBackend.h | 41 | COMMENT | |
| LOW | shell/shared/platform/TickSourceRateBackend.cpp | 121 | const float rounded = std::round(ratio); | COMMENT |
| LOW | shell/shared/platform/FrameDividerRateBackend.h | 21 | struct DisplayRates { | COMMENT |
| LOW | shell/shared/platform/FrameDividerRateBackend.h | 41 | struct FrameDivider { | COMMENT |
| LOW | shell/shared/platform/Factory.cpp | 1 | /* | COMMENT |
| LOW | shell/shared/platform/apple/PresentationRateApple.mm | 1 | /* | COMMENT |
| LOW | shell/shared/platform/apple/PresentationRateApple.h | 21 | COMMENT | |
| LOW | shell/shared/platform/mac/DisplayLinkRatePacer.h | 21 | /// at the display's rate; only the frame does not. | COMMENT |
| LOW | shell/shared/platform/mac/DisplayLinkRatePacer.h | 41 | /// per display-link callback and nowhere else. A divisor that changed since the last | COMMENT |
| LOW | shell/shared/platform/android/PresentationRateAndroid.h | 21 | /// | COMMENT |
| LOW | shell/shared/platform/android/PlatformAndroid.cpp | 1 | /* | COMMENT |
| LOW | shell/shared/fileLoader/FileLoader.cpp | 1 | /* | COMMENT |
| LOW | shell/shared/fileLoader/win/FileLoaderWin.cpp | 1 | /* | COMMENT |
| LOW | shell/shared/fileLoader/win/FileLoaderWin.cpp | 101 | // @fb-only | COMMENT |
| LOW | shell/shared/fileLoader/win/FileLoaderWin.cpp | 121 | // @fb-only | COMMENT |
| LOW | shell/shared/fileLoader/linux/FileLoaderLinux.cpp | 161 | // @fb-only | COMMENT |
| LOW | shell/shared/fileLoader/linux/FileLoaderLinux.cpp | 181 | // @fb-only | COMMENT |
| LOW | shell/shared/fileLoader/linux/FileLoaderLinux.cpp | 201 | // @fb-only | COMMENT |
| LOW | shell/shared/fileLoader/android/FileLoaderAndroid.cpp | 21 | COMMENT | |
| LOW | shell/shared/fileLoader/android/FileLoaderAndroid.cpp | 41 | // @fb-only | COMMENT |
| LOW | shell/shared/renderSession/RenderSession.cpp | 1 | /* | COMMENT |
| LOW | shell/shared/profiling/IglPerfetto.h | 41 | /// TrackEvent category. The buffer is held in memory and flushed to | COMMENT |
| LOW | shell/shared/imageLoader/ImageLoader.cpp | 1 | /* | COMMENT |
| LOW | shell/shared/imageLoader/ImageLoader.cpp | 21 | #include <IGLU/texture_loader/xtc1/TextureLoaderFactory.h> | COMMENT |
| LOW | shell/shared/testShell/TestShell.cpp | 1 | /* | COMMENT |
| LOW | shell/ios/ViewController.mm | 21 | #import <shell/shared/input/InputDispatcher.h> | COMMENT |
| LOW | shell/ios/ViewController.mm | 41 | COMMENT | |
| LOW | shell/ios/RenderSessionController.mm | 21 | COMMENT | |
| LOW | shell/ios/RenderSessionController.mm | 121 | } | COMMENT |
| LOW | shell/ios/AppDelegate.mm | 21 | #import <UIKit/UITabBarItem.h> | COMMENT |
| LOW | shell/ios/AppDelegate.mm | 81 | #if IGL_BACKEND_WEBGPU | COMMENT |
| LOW | shell/mac/ViewController.mm | 21 | #import <AppKit/NSOpenGLView.h> | COMMENT |
| LOW | shell/mac/ViewController.mm | 41 | #include <shell/shared/platform/apple/PresentationRateApple.h> | COMMENT |
| LOW | shell/mac/ViewController.mm | 221 | // After a resize, sessions that built their framebuffer once would keep attachments of the old | COMMENT |
| LOW | shell/mac/ViewController.mm | 461 | // @fb-only | COMMENT |
| LOW | shell/mac/ViewController.mm | 741 | // @fb-only | COMMENT |
| LOW | shell/mac/DisplayLinkRatePacing.h | 21 | /// for the callback to consult, a rate backend installed on the platform, and a teardown | COMMENT |
| LOW | shell/mac/AppDelegate.mm | 141 | // @fb-only | COMMENT |
| LOW | shell/android/jni/TinyRenderer.cpp | 21 | #include <igl/opengl/egl/PlatformDevice.h> | COMMENT |
| LOW | shell/android/jni/TinyRenderer.cpp | 701 | // Ask the compositor for the panel's best mode once, here, rather than once per request. | COMMENT |
| LOW | shell/android/jni/Jni.cpp | 1 | /* | COMMENT |
| LOW | shell/android/jni/TinyRenderer.h | 1 | /* | COMMENT |
| LOW | shell/android/jni/TinyRenderer.h | 41 | float displayMaxRefreshRateHz = 0.0f); | COMMENT |
| LOW | shell/android/jni/TinyRenderer.h | 61 | COMMENT | |
| LOW | shell/windows/common/GlfwShell.cpp | 1 | /* | COMMENT |
| LOW | shell/windows/common/GlfwShell.h | 21 | #if IGL_ANGLE | COMMENT |
| 474 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/slang/glsl2slang.py | 1422 | def declaration_or_expression(self, tokens: list[Token]) -> str: | CODE |
| LOW⚡ | tools/slang/glsl2slang_test.py | 66 | def test_vector_comparisons_become_operators(self) -> None: | CODE |
| LOW⚡ | tools/slang/glsl2slang_test.py | 72 | def test_products_follow_the_matrix_rule(self) -> None: | CODE |
| LOW⚡ | tools/slang/glsl2slang_test.py | 82 | def test_compound_matrix_product(self) -> None: | CODE |
| LOW⚡ | tools/slang/glsl2slang_test.py | 86 | def test_truncating_matrix_constructor_becomes_a_cast(self) -> None: | CODE |
| LOW⚡ | tools/slang/glsl2slang_test.py | 90 | def test_block_member_matrices(self) -> None: | CODE |
| LOW⚡ | tools/slang/glsl2slang_test.py | 96 | def test_uniform_block_and_sampler(self) -> None: | CODE |
| LOW⚡ | tools/slang/glsl2slang_test.py | 111 | def test_unnamed_block_members_get_an_instance(self) -> None: | CODE |
| LOW⚡ | tools/slang/glsl2slang_test.py | 119 | def test_loose_uniforms_gather_into_a_buffer(self) -> None: | CODE |
| LOW⚡ | tools/slang/glsl2slang_test.py | 128 | def test_storage_buffer_atomics(self) -> None: | CODE |
| LOW | tools/slang/glsl2slang_test.py | 146 | def test_rejects_textures_the_abi_lacks(self) -> None: | CODE |
| LOW | tools/slang/glsl2slang_test.py | 160 | def test_stages_share_a_program_in_namespaces(self) -> None: | CODE |
| LOW | tools/slang/glsl2slang_test.py | 184 | def test_rejects_frag_color_with_declared_outputs(self) -> None: | CODE |
| LOW | tools/slang/glsl2slang_test.py | 193 | def test_compute_builtins_and_shared_memory(self) -> None: | CODE |
| LOW | tools/slang/glsl2slang_test.py | 218 | def test_keeps_comments_and_preprocessor_lines(self) -> None: | CODE |
| LOW⚡ | tools/slang/glsl2slang_test.py | 230 | def test_drops_version_and_precision(self) -> None: | CODE |
| LOW⚡ | tools/slang/glsl2slang_test.py | 237 | def test_unclosed_array_is_a_conversion_error(self) -> None: | CODE |
| LOW⚡ | tools/slang/glsl2slang_test.py | 241 | def test_assignments_need_a_name(self) -> None: | CODE |
| LOW⚡ | tools/slang/glsl2slang_test.py | 245 | def test_reflect_reports_a_failing_tool(self) -> None: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tools/slang/glsl2slang.py | 39 | # --------------------------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/slang/glsl2slang.py | 107 | # --------------------------------------------------------------------------------------------- | STRING |
| MEDIUM | tools/slang/glsl2slang.py | 207 | # --------------------------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/slang/glsl2slang.py | 521 | # --------------------------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/slang/glsl2slang.py | 845 | # --------------------------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/slang/glsl2slang.py | 909 | # --------------------------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/slang/glsl2slang.py | 1182 | # --------------------------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/slang/glsl2slang.py | 1484 | # --------------------------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/slang/glsl2slang.py | 1767 | # --------------------------------------------------------------------------------------------- | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/slang/glsl2slang.py | 66 | CODE | |
| LOW | tools/slang/glsl2slang.py | 873 | CODE | |
| LOW | tools/slang/glsl2slang.py | 1154 | CODE | |
| LOW | tools/slang/glsl2slang.py | 1703 | CODE | |
| LOW | tools/slang/glsl2slang.py | 1824 | CODE | |
| LOW | tools/slang/glsl2slang.py | 430 | CODE | |
| LOW | tools/slang/glsl2slang.py | 450 | CODE | |
| LOW | tools/slang/glsl2slang.py | 966 | CODE | |
| LOW | tools/slang/glsl2slang.py | 1227 | CODE | |
| LOW | tools/slang/generate_slang.py | 346 | CODE | |
| LOW | tools/slang/generate_slang.py | 421 | CODE | |
| LOW | tools/slang/generate_slang.py | 726 | CODE | |
| LOW | tools/slang/generate_slang.py | 265 | CODE | |
| LOW | third-party/bootstrap.py | 161 | CODE | |
| LOW | third-party/bootstrap.py | 244 | CODE | |
| LOW | third-party/bootstrap.py | 383 | CODE | |
| LOW | third-party/bootstrap.py | 570 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | deploy_content.py | 21 | except FileExistsError: | CODE |
| HIGH | third-party/bootstrap.py | 278 | except: | CODE |
| HIGH | third-party/bootstrap.py | 310 | except: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | deploy_deps.py | 8 | CODE | |
| LOW | deploy_content.py | 8 | CODE | |
| LOW | deploy_content.py | 11 | CODE | |
| LOW | tools/slang/glsl2slang.py | 28 | CODE | |
| LOW | tools/slang/generate_slang.py | 28 | CODE | |
| LOW | docs/source/_extensions/style.py | 6 | CODE | |
| LOW | third-party/bootstrap.py | 22 | CODE | |
| LOW | third-party/bootstrap.py | 26 | CODE | |
| LOW | third-party/bootstrap.py | 48 | CODE | |
| LOW | third-party/deps/patches/glew.py | 4 | CODE | |
| LOW | IGLU/imgui/compile_shaders.py | 9 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | samples/wasm/igl.html | 84 | // application robust, you may want to override this behavior before shipping! | COMMENT |
| MEDIUM | src/igl/Common.h | 300 | // Other sizes utilize a libc memcpy() implementation. It's not a universal function and expects to | COMMENT |
| MEDIUM | src/igl/glslang/GlslCompiler.cpp | 86 | // This is robust to glslang adding fields to glslang_spv_options_t: a positional aggregate | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/igl/metal/Texture.mm | 286 | // TODO: implement manual mip generation for required formats (e.g. RGBA32Float) | COMMENT |
| LOW | src/igl/metal/Texture.mm | 305 | // TODO: implement via gpuResourceID | COMMENT |
| LOW | src/igl/metal/Buffer.mm | 153 | // TODO: implement via gpuResourceID | COMMENT |
| LOW | src/igl/vulkan/VulkanHelpers.c | 396 | // TODO: implement for other platforms | COMMENT |
| LOW | src/igl/opengl/egl/Context.cpp | 139 | // TODO: Handle error | COMMENT |
| LOW | src/igl/opengl/glx/Context.cpp | 22 | return 0; // TODO: implement error handling | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | shell/renderSessions/CopyOperationsSession.cpp | 312 | // Step 1: Buffer-to-buffer copy (once) | COMMENT |
| LOW | shell/renderSessions/CopyOperationsSession.cpp | 323 | // Step 2: Render the triangle using the DESTINATION buffer (the copied one) | COMMENT |
| LOW | shell/renderSessions/CopyOperationsSession.cpp | 344 | // Step 3: Framebuffer readback -- read rendered pixels and log first pixel color | COMMENT |
| LOW | src/igl/NameHandle.h | 108 | * This way when we need to check if a uniform exists or if it matches another | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | shell/renderSessions/CopyOperationsSession.cpp | 312 | // Step 1: Buffer-to-buffer copy (once) | COMMENT |
| LOW | shell/renderSessions/CopyOperationsSession.cpp | 323 | // Step 2: Render the triangle using the DESTINATION buffer (the copied one) | COMMENT |
| LOW | shell/renderSessions/CopyOperationsSession.cpp | 344 | // Step 3: Framebuffer readback -- read rendered pixels and log first pixel color | COMMENT |