kgi_display_t

Data of a KGI display are:

        kgi_u_t         revision;

        kgi_ascii_t     vendor[KGI_MAX_VENDOR_STRING];
        kgi_ascii_t     model[KGI_MAX_VENDOR_STRING];

        kgi_u32_t       flags;

        kgi_u_t         mode_size;

        kgi_mode_t      *mode;

        kgi_u_t id;

        kgi_u_t graphic;

        struct kgi_display_s *prev;

        struct kgi_device_s             *focus;

The methods of a KGI display are:

        kgi_display_refcount_fn         *IncRefcount;

        kgi_display_refcount_fn         *DecRefcount;

        kgi_display_check_mode_fn       *CheckMode;

        kgi_display_set_mode_fn         *SetMode;

        kgi_display_set_mode_fn         *UnsetMode;

        kgi_display_command_fn          *Command;

kgi_register_display()

A display must register itself to offer its services to the KgiDevice.

kgi_s_t kgi_register_display(

 /* Comment: the preinitialized display to register */
 kgi_display_t *dpy,

 /* Comment: the suggested id for the display */
 kgi_u_t id
);

A registration typically occur when loading a display module. The display must be initialized before registration: at least one KgiImage must be defined and the display resources must be described.

For example, for the FreeBSD native VESA display:

        dpy->revision = KGI_DISPLAY_REVISION;
        snprintf(dpy->vendor, KGI_MAX_VENDOR_STRING, "KGI FreeBSD");
        snprintf(dpy->model, KGI_MAX_VENDOR_STRING, "dpysw");

No specific flag and the display mode specific area is sizeof(vidsw_mode_t) long.

        dpy->flags = 0;
        dpy->mode_size = sizeof(vidsw_mode_t);

with (dpm is mandatory here IIRC):

typedef struct vidsw_mode_s {

        kgi_dot_port_mode_t dpm;

        video_info_t mode_info;
        video_info_t oldmode_info;

} vidsw_mode_t;

The display methods are then initialized with yet not device focused:

        mode = &sc->mode;

        dpy->mode = mode;
        dpy->id = -1;
        dpy->graphic = 0;
        dpy->IncRefcount = dpysw_inc_refcount;
        dpy->DecRefcount = dpysw_dec_refcount;

        dpy->CheckMode = dpysw_check_mode;
        dpy->SetMode = dpysw_set_mode;
        dpy->UnsetMode = dpysw_unset_mode;
        dpy->Command = dpysw_display_command;

        dpy->focus = NULL;

        mode->revision          = KGI_MODE_REVISION;
        mode->dev_mode          = NULL;
        mode->images            = 1;
        mode->img[0].out        = NULL;
        mode->img[0].flags      = KGI_IF_TEXT16;
        mode->img[0].virt.x     = adp->va_info.vi_width;
        mode->img[0].virt.y     = adp->va_info.vi_height;
        mode->img[0].size.x     = adp->va_info.vi_width;
        mode->img[0].size.y     = adp->va_info.vi_height;
        mode->img[0].frames     = 1;
        mode->img[0].tluts      = 0;
        mode->img[0].aluts      = 0;
        mode->img[0].ilutm      = 0;
        mode->img[0].alutm      = 0;
        mode->img[0].fam        = 0;
        mode->img[0].cam        = 0;

The framebuffer resource is described that way:

        fb->meta                = dpy;
        fb->type                = KGI_RT_MMIO_FRAME_BUFFER;
        fb->prot                = KGI_PF_APP_RWS | KGI_PF_LIB_RWS | KGI_PF_DRV_RWS;
        fb->name                = "Frame buffer";
        fb->access              = 8 + 16 + 32 + 64;
        fb->align               = 8 + 16;
        fb->win.size            = (kgi_size_t)adp->va_window_size;
        fb->win.virt            = (kgi_virt_addr_t)adp->va_window;
        fb->win.bus             = (kgi_bus_addr_t)0;
        fb->win.phys            = (kgi_phys_addr_t)adp->va_mem_base;
        fb->size                = (kgi_size_t)adp->va_mem_size;
        fb->offset              = 0;
        fb->SetOffset           = dpysw_set_offset;

kgi_unregister_display()

void    kgi_unregister_display(

 /* Comment: the display to unregister */
 kgi_display_t *dpy
);

kgi_display_registered()

kgi_display_registered shall be used to know if a display id is already bound to a registered display.

kgi_s_t kgi_display_registered(

 /* Comment: the display id */
 kgi_u_t id
);

Returns KGI_EOK if bound, KGI_ENODEV otherwise.

KgiDisplayAPI (last edited 2008-06-17 21:37:41 by localhost)