• OctoMY API
  • OctoMY API Reference
  • eval::internal Namespace
  • eval::internal Namespace

    namespace eval::internal

    Functions

    bool codegenNativeSlotIsPackable(eval::Type t)
    int codegenSlotTotalFloatWidth(const eval::internal::CodegenSlot &s)
    bool compileUnitToSpirv(eval::internal::GlslLane lane, const QVector<eval::internal::CodegenSlot> &inputs, const QVector<eval::internal::CodegenSlot> &outputs, const QStringList &expressions, const QString &prelude, QByteArray *spirv, QString *diagnostic, int *blamedOutput = nullptr, int *blamedElement = nullptr)
    int glslProbeParseCount()

    Function Documentation

    bool internal::codegenNativeSlotIsPackable(eval::Type t)

    `SUP-49` step 4 — does the native emitter have a slot case for t?

    The native lane and the SPIR-V lane share `slotFloatWidth`, so widening a type there widens the offsets BOTH lanes hand out — and the native emitter only reads what it has a case for. A type this table widens and `Codegen::emit`'s prologue does not reconstruct would read too few floats and shift every later slot down the buffer: silently, and into plausible numbers rather than an error.

    So the emitter's case list is stated once, here, and `Graph::compile` refuses `Backend::Native` for a slot it does not cover. `isUnsupported` cannot stand in for this — it walks the expression AST and never sees the SLOT types, which is the same blind spot §SUR-69 and §SUR-71 each cost a defect to find. `testEvalUnit::nativeSlotEmissionMatchesTheAbiWidth` asks the generated C++ rather than this predicate, because a predicate cannot see a defect in the code it describes.

    int internal::codegenSlotTotalFloatWidth(const eval::internal::CodegenSlot &s)

    `Int64`/`Uint64` are NOT listed, and the reason is the ruling rather than the mechanism: `int64_t` does not appear in the GLSL 4.60 specification at all — it is `GL_ARB_gpu_shader_int64` — so [§SUL-9a](../../../../content/doc/internal/specs/spirv-unified-lowering/index.md) puts it outside the set this project implements. The `default` branch would round-trip one through a `float` and lose every bit past the 24th, which is the silent degradation §SUT-3a forbids.

    The double vector and matrix shapes are absent for a different reason: they are core GLSL and they are implemented on the SPIR-V lane, but this emitter has no `DV3`/`DM3` C++ type to reconstruct them into. `Codegen::isUnsupported` already refuses an expression of that type; this makes the SLOT refusal explicit instead of leaving it to that coincidence.

    bool internal::compileUnitToSpirv(eval::internal::GlslLane lane, const QVector<eval::internal::CodegenSlot> &inputs, const QVector<eval::internal::CodegenSlot> &outputs, const QStringList &expressions, const QString &prelude, QByteArray *spirv, QString *diagnostic, int *blamedOutput = nullptr, int *blamedElement = nullptr)

    `SUP-5` — the compile half, shared by the interpreter lane and the GPU lane. See the header for why it is split rather than duplicated.

    int internal::glslProbeParseCount()

    Everything else is deliberately unresolved rather than approximated.

    `EbtInt64`/`EbtUint64` land here, and that is correct rather than a gap: §SUR-66 records the owner's ruling that `int64_t` does not appear in GLSL 4.60 — it is `GL_ARB_gpu_shader_int64` — so it is outside the set this project implements. Sampler, image, struct and float16 types land here too; none can cross the flat float ABI, and returning `Void` makes the caller decline with glslang's own words rather than inventing a shape.