[options]
girs_directories = ["../gir-files", "../gst-gir-files"]
library = "GstGL"
version = "1.0"
min_cfg_version = "1.14"
work_mode = "normal"
concurrency = "send+sync"
generate_safety_asserts = true
single_version_file = true
generate_display_trait = false
trust_return_value_nullability = true

external_libraries = [
    "GLib",
    "GObject",
    "Gst",
    "GstBase",
    "GstVideo",
]

generate = [
    "GstGL.GLBaseFilter",
    "GstGL.GLBaseMemoryAllocator",
    "GstGL.GLBaseSrc",
    "GstGL.GLBufferPool",
    "GstGL.GLConfigCaveat",
    "GstGL.GLConfigSurfaceType",
    "GstGL.GLContextError",
    "GstGL.GLFormat",
    "GstGL.GLMemoryAllocator",
    "GstGL.GLQueryType",
    "GstGL.GLSLError",
    "GstGL.GLSLVersion",
    "GstGL.GLStereoDownmix",
    "GstGL.GLTextureTarget",
    "GstGL.GLUploadReturn",
    "GstGL.GLWindowError",
]

manual = [
    "GLib.Error",
    "GLib.Thread",
    "GObject.Object",
    "GObject.Value",
    "Gst.AllocationParams",
    "Gst.Allocator",
    "Gst.BufferPool",
    "Gst.Context",
    "Gst.Element",
    "Gst.FlowReturn",
    "Gst.Memory",
    "Gst.Object",
    "Gst.PadDirection",
    "GstBase.BaseSrc",
    "GstBase.BaseTransform",
    "GstBase.PushSrc",
    "GstGL.GLBaseMemory",
    "GstGL.GLMemory",
    "GstVideo.VideoAlignment",
    "GstVideo.VideoInfo",
    "GstVideo.VideoMultiviewFlags",
    "GstVideo.VideoMultiviewMode",
    "GstVideo.VideoOverlay",
]

[[object]]
name = "Gst.Buffer"
status = "manual"
ref_mode = "ref"

[[object]]
name = "Gst.Caps"
status = "manual"
ref_mode = "ref"

[[object]]
name = "Gst.Query"
status = "manual"
ref_mode = "ref"

[[object]]
name = "Gst.Structure"
status = "manual"
ref_mode = "ref"

[[object]]
name = "GstGL.*"
status = "generate"
    [[object.function]]
    name = "buffer_add_gl_sync_meta"
    manual = true
    [[object.function]]
    name = "buffer_add_gl_sync_meta_full"
    manual = true
    [[object.function]]
    name = "context_get_gl_display"
    manual = true
    [[object.function]]
    name = "context_set_gl_display"
    manual = true
    [[object.function]]
    name = "gl_sync_meta_api_get_type"
    manual = true
    [[object.function]]
    name = "gl_handle_context_query"
    manual = true
    [[object.function]]
    name = "gl_handle_set_context"
    manual = true

    # gir has issues with the inout annotation
    [[object.function]]
    name = "gl_ensure_element_data"
    ignore = true

    # These need manual bindings
    [[object.function]]
    name = "buffer_pool_config_get_gl_allocation_params"
    ignore = true
    [[object.function]]
    name = "buffer_pool_config_set_gl_allocation_params"
    ignore = true
    [[object.function]]
    name = "buffer_pool_config_get_gl_min_free_queue_size"
    ignore = true
    [[object.function]]
    name = "buffer_pool_config_set_gl_min_free_queue_size"
    ignore = true

    # Needs manual binding to be an extension on gst_video::VideoAffineTransformationMeta
    [[object.function]]
    name = "gl_get_affine_transformation_meta_as_ndc"
    ignore = true
    [[object.function]]
    name = "gl_set_affine_transformation_meta_from_ndc"
    ignore = true

    # Needs manual binding to be an extension on gst_video::VideoInfo
    [[object.function]]
    name = "gl_get_plane_data_size"
    ignore = true
    [[object.function]]
    name = "gl_get_plane_start"
    ignore = true

    # Needs manual binding
    [[object.function]]
    name = "gl_insert_debug_marker"
    ignore = true

    # Needs manual binding around `[[f32;4];4]`
    [[object.function]]
    name = "gl_multiply_matrix4"
    ignore = true

    # Should be a method on GLContextExtManual
    [[object.function]]
    name = "gl_sized_gl_format_from_gl_format_type"
    ignore = true

    # Should be method on GLTextureTarget and/or Value
    [[object.function]]
    name = "gl_value_get_texture_target_mask"
    ignore = true

    # This needs to return a value
    # target_mask is a bitwise mask of the GLTextureTarget enum
    [[object.function]]
    name = "gl_value_set_texture_target_from_mask"
    ignore = true

    # This needs more checks like target != GLTextureTarget::None
    # and a value that's already initialized as a string.
    # Could become GLTextureTarget::to_value() maybe.
    [[object.function]]
    name = "gl_value_set_texture_target"
    ignore = true

    # Should be a method/constructor on GLSLVersion
    [[object.function]]
    name = "gl_version_to_glsl_version"
    ignore = true

    # ffi constant is ignored
    [[object.constant]]
    name = "GL_COLOR_CONVERT_FORMATS"
    ignore = true
    [[object.constant]]
    name = "GL_COLOR_CONVERT_EXT_FORMATS"
    ignore = true
    [[object.constant]]
    name = "GL_MEMORY_VIDEO_FORMATS_STR"
    ignore = true
    [[object.constant]]
    name = "GL_MEMORY_VIDEO_EXT_FORMATS"
    ignore = true

    # the below need manual bindings
    [[object.function]]
    name = "is_gl_base_memory"
    ignore = true
    [[object.function]]
    name = "is_gl_buffer"
    ignore = true
    [[object.function]]
    name = "is_gl_memory"
    ignore = true
    [[object.function]]
    name = "is_gl_memory_pbo"
    ignore = true
    [[object.function]]
    name = "is_gl_renderbuffer"
    ignore = true

    # duplicate of gst_gl_stereo_downmix_get_type
    [[object.function]]
    name = "gl_stereo_downmix_mode_get_type"
    ignore = true

[[object]]
name = "GstGL.GLAllocationParams"
status = "generate"

    [[object.function]]
    name = "free_data"
    # Function should only be called by subclasses from
    # an overridden `free` vfunc.
    ignore = true

    [[object.function]]
    name = "copy_data"
        [[object.function.parameter]]
        name = "src"
        const = true

[[object]]
name = "GstGL.GLAPI"
status = "generate"
    [[object.member]]
    name = "none"
    ignore = true
    [[object.member]]
    name = "any"
    ignore = true

[[object]]
name = "GstGL.GLBuffer"
status = "manual"
ref_mode = "ref"

[[object]]
name = "GstGL.GLColorConvert"
status = "generate"
final_type = true
    [[object.function]]
    name = "set_caps"
        [object.function.return]
        bool_return_is_error = "Failed to set caps"

    [[object.function]]
    name = "decide_allocation"
    # correct mutability
    ignore = true

    [[object.function]]
    name = "fixate_caps"
    # correct reference ownership
    ignore = true

    [[object.function]]
    name = "perform"
    # transfer gst::Buffer not reference
    ignore = true

[[object]]
name = "GstGL.GLContext"
status = "generate"
manual_traits = ["GLContextExtManual"]

    [[object.function]]
    name = "new_wrapped"
    # input handle
    manual = true

    [[object.function]]
    name = "get_gl_context"
    # return handle
    manual = true

    [[object.function]]
    name = "get_current_gl_context"
    # return handle
    manual = true

    [[object.function]]
    name = "get_proc_address"
    manual = true

    [[object.function]]
    name = "default_get_proc_address"
    ignore = true

    [[object.function]]
    name = "get_proc_address_with_platform"
    manual = true

    [[object.function]]
    name = "thread_add"
    manual = true

    [[object.function]]
    name = "get_thread"
    # glib::Thread not found in `glib`
    ignore = true

    [[object.function]]
    name = "get_gl_context_for_thread"
    # glib::Thread not found in `glib`
    ignore = true

    [[object.function]]
    name = "error_quark"
    # bad error domain definition in gir
    ignore = true

    [[object.function]]
    name = "activate"
        [object.function.return]
        bool_return_is_error = "Failed to activate OpenGL context"

    [[object.function]]
    name = "set_window"
        [object.function.return]
        bool_return_is_error = "Failed to set window"

[[object]]
name = "GstGL.GLDisplay"
status = "generate"

    [[object.function]]
    name = "find_window"
    # unimplemented pointer
    ignore = true

    [[object.function]]
    name = "get_handle"
    # return handle
    manual = true

    [[object.function]]
    name = "get_gl_context_for_thread"
    # require object lock
    manual = true

    [[object.function]]
    name = "create_context"
    # require object lock
    manual = true

    [[object.function]]
    name = "add_context"
    # require object lock
    manual = true

    [[object.function]]
    name = "remove_context"
    # require object lock
    manual = true

    [[object.function]]
    name = "remove_window"
        [object.function.return]
        bool_return_is_error = "Failed to remove window"

    [[object.function]]
    name = "create_window"
        [object.function.return]
        nullable_return_is_error = "Failed to create window"

    [[object.function]]
    name = "ensure_context"
    # inout parameter
    manual = true

[[object]]
name = "GstGL.GLDisplayType"
status = "generate"
    [[object.member]]
    name = "none"
    ignore = true
    [[object.member]]
    name = "any"
    ignore = true

[[object]]
name = "GstGL.GLFilter"
status = "generate"

    [[object.function]]
    name = "add_rgba_pad_templates"
    # Automatically called if
    # GLFilterImpl::ADD_RGBA_PAD_TEMPLATES is true
    ignore = true

    [[object.function]]
    pattern = "render_to_target\\w*"
        [[object.function.parameter]]
        pattern = "input|output"
        const = true

    [[object.function]]
    name = "render_to_target"
        [object.function.return]
        bool_return_is_error = "`func` returned `false`"

    [[object.function]]
    name = "filter_texture"
        [object.function.return]
        bool_return_is_error = "Failed to transform texture"

[[object]]
name = "GstGL.GLFramebuffer"
status = "generate"
manual_traits = ["GLFramebufferExtManual"]

    [[object.function]]
    name = "attach"
    # attachment_point parameter unchecked
    unsafe = true

    [[object.function]]
    name = "draw_to_texture"
    manual = true

[[object]]
name = "GstGL.GLOverlayCompositor"
status = "generate"
final_type = true

    [[object.function]]
    name = "upload_overlays"
    # correct mutability
    ignore = true

    [[object.property]]
    name = "yinvert"
    version = "1.16"

[[object]]
name = "GstGL.GLPlatform"
status = "generate"
    [[object.member]]
    name = "none"
    ignore = true
    [[object.member]]
    name = "any"
    ignore = true

[[object]]
name = "GstGL.GLQuery"
status = "manual"
ref_mode = "ref"

[[object]]
name = "GstGL.GLShader"
status = "generate"
final_type = true

    [[object.function]]
    name = "attach"
        [object.function.return]
        bool_return_is_error = "Failed to attach stage to shader"

    [[object.function]]
    name = "attach_unlocked"
        [object.function.return]
        bool_return_is_error = "Failed to attach stage to shader"

    [[object.function]]
    name = "set_uniform_matrix_2fv"
    # array with size
    ignore = true

    [[object.function]]
    name = "set_uniform_matrix_2x3fv"
    # array with size
    ignore = true

    [[object.function]]
    name = "set_uniform_matrix_2x4fv"
    # array with size
    ignore = true

    [[object.function]]
    name = "set_uniform_matrix_3fv"
    # array with size
    ignore = true

    [[object.function]]
    name = "set_uniform_matrix_3x2fv"
    # array with size
    ignore = true

    [[object.function]]
    name = "set_uniform_matrix_3x4fv"
    # array with size
    ignore = true

    [[object.function]]
    name = "set_uniform_matrix_4fv"
    # array with size
    ignore = true

    [[object.function]]
    name = "set_uniform_matrix_4x2fv"
    # array with size
    ignore = true

    [[object.function]]
    name = "set_uniform_matrix_4x3fv"
    # array with size
    ignore = true

[[object]]
name = "GstGL.GLSLProfile"
status = "generate"
    [[object.member]]
    name = "none"
    ignore = true
    [[object.member]]
    name = "any"
    ignore = true

[[object]]
name = "GstGL.GLSLStage"
status = "generate"
final_type = true

    [[object.function]]
    name = "set_strings"
        [object.function.return]
        bool_return_is_error = "Failed to attach stage to set strings"

[[object]]
name = "GstGL.GLUpload"
status = "generate"
final_type = true

    [[object.function]]
    name = "set_caps"
        [object.function.return]
        bool_return_is_error = "Failed to set caps"

    [[object.function]]
    name = "perform_with_buffer"
    # Result<Buffer, GLUploadReturn>
    ignore = true

    [[object.function]]
    name = "propose_allocation"
    # fix mutability
    ignore = true

[[object]]
name = "GstGL.GLVideoAllocationParams"
status = "generate"

    [[object.function]]
    name = "free_data"
    # Function should only be called by subclasses from
    # an overridden `free` vfunc.
    ignore = true

    [[object.function]]
    name = "copy_data"
        [[object.function.parameter]]
        name = "src_vid"
        const = true

[[object]]
name = "GstGL.GLViewConvert"
status = "generate"
final_type = true

    [[object.function]]
    name = "set_caps"
        [object.function.return]
        bool_return_is_error = "Failed to set caps"

    [[object.function]]
    name = "fixate_caps"
    # correct reference ownership
    ignore = true

    [[object.function]]
    name = "get_output"
    # Result<Buffer, FlowReturn>
    ignore = true

    [[object.function]]
    name = "submit_input_buffer"
    # Buffer ownership transfer
    ignore = true

[[object]]
name = "GstGL.GLWindow"
status = "generate"

    [[object.function]]
    name = "get_window_handle"
    # return native handle
    ignore = true

    [[object.function]]
    name = "send_message"
        # callback
    ignore = true

    [[object.function]]
    name = "send_message_async"
    # callback
    ignore = true

    [[object.function]]
    name = "set_close_callback"
    # callback
    ignore = true

    [[object.function]]
    name = "set_draw_callback"
    # callback
    ignore = true

    [[object.function]]
    name = "set_render_rectangle"
        [object.function.return]
        bool_return_is_error = "Failed to set the specified region"

    [[object.function]]
    name = "set_resize_callback"
    # callback
    ignore = true

    [[object.function]]
    name = "set_window_handle"
    # handle
    ignore = true

    [[object.function]]
    name = "get_display"
    # handle
    ignore = true

    [[object.function]]
    name = "error_quark"
    # bad error domain definition in gir
    ignore = true
