Module Sarek_vulkan.Sarek_ir_glsl

val current_variants : (string * (string * Sarek_ir_types.elttype list) list) list Stdlib.ref

Current kernel's variant definitions (set during generate)

val helper_vec_param_indices : (string, int list) Stdlib.Hashtbl.t

Helper function vector parameter indices - maps function name to set of parameter indices that are vectors. In GLSL, vectors cannot be passed as function parameters, so these must be filtered out at call sites.

Type Mapping

val mangle_name : string -> string

Mangle OCaml type name to valid GLSL identifier

val glsl_reserved_keywords : string list

GLSL reserved keywords that cannot be used as identifiers

val escape_glsl_name : string -> string

Escape reserved GLSL keywords by adding 'v' suffix (avoids double underscore with _len)

val glsl_type_of_elttype : Sarek_ir_types.elttype -> string

Map Sarek IR element type to GLSL type string

Thread Intrinsics

val glsl_thread_intrinsic : string -> string

Expression Generation

val gen_expr : Stdlib.Buffer.t -> Sarek_ir_types.expr -> unit
val gen_binop : Sarek_ir_types.binop -> string
val gen_unop : Sarek_ir_types.unop -> string
val gen_intrinsic : Stdlib.Buffer.t -> string list -> string -> Sarek_ir_types.expr list -> unit

L-value Generation

val gen_lvalue : Stdlib.Buffer.t -> Sarek_ir_types.lvalue -> unit

Statement Generation

val indent_nested : string -> string

Nested indentation level

val gen_match_pattern : Stdlib.Buffer.t -> string -> string -> string -> string list -> (string -> Sarek_ir_types.elttype list option) -> unit

Generate match case pattern with variable bindings

val gen_var_decl : Stdlib.Buffer.t -> string -> string -> Sarek_ir_types.elttype -> Sarek_ir_types.expr -> unit

Generate variable declaration with optional initialization

val gen_array_decl : Stdlib.Buffer.t -> string -> string -> Sarek_ir_types.elttype -> Sarek_ir_types.expr -> unit

Generate array declaration

val gen_stmt : Stdlib.Buffer.t -> string -> Sarek_ir_types.stmt -> unit

Helper Function Generation

val gen_helper_func : pc_names:string list -> Stdlib.Buffer.t -> Sarek_ir_types.helper_func -> unit

Generate helper function with #undef/#define guards to avoid macro collisions. Push constant macros (e.g., #define max_iter pc.max_iter) would otherwise expand function parameters with the same name, causing syntax errors.

  • parameter pc_names

    Set of push constant names that have macros defined

Kernel Generation

val count_vec_params : Sarek_ir_types.decl list -> int

Count vector parameters for binding assignment

val glsl_header : kernel_name:string -> ?block:(int * int * int) -> unit -> string

Generate GLSL compute shader header.

  • parameter block

    Optional workgroup dimensions (x, y, z). Defaults to 256x1x1.

val gen_buffer_binding : Stdlib.Buffer.t -> int -> Sarek_ir_types.var -> Sarek_ir_types.elttype -> unit

Generate buffer binding for a vector parameter

val gen_push_constants : Stdlib.Buffer.t -> Sarek_ir_types.decl list -> unit
val collect_shared_decls : Sarek_ir_types.stmt -> (string * Sarek_ir_types.elttype * Sarek_ir_types.expr) list

Collect shared array declarations from a statement tree. Returns list of (name, elem_type, size_expr)

val gen_shared_decls : Stdlib.Buffer.t -> (string * Sarek_ir_types.elttype * Sarek_ir_types.expr) list -> unit

Generate shared declarations at module scope

val generate : ?block:(int * int * int) -> Sarek_ir_types.kernel -> string

Generate complete GLSL source for a kernel.

  • parameter block

    Optional workgroup dimensions (x, y, z). Defaults to 256x1x1.

val gen_record_def : Stdlib.Buffer.t -> (string * (string * Sarek_ir_types.elttype) list) -> unit

Generate GLSL record type definition - simple struct without tag

val gen_variant_def : Stdlib.Buffer.t -> (string * (string * Sarek_ir_types.elttype list) list) -> unit

Generate GLSL variant type definition

val generate_with_types : ?block:(int * int * int) -> types:(string * (string * Sarek_ir_types.elttype) list) list -> Sarek_ir_types.kernel -> string

Generate GLSL source with custom type definitions.

  • parameter block

    Optional workgroup dimensions (x, y, z). Defaults to 256x1x1.