# framebuffer(2)

    NAME
        fb_info, fb_map - direct framebuffer access

    SYNOPSIS
        void montauk::fb_info(montauk::abi::FbInfo* info);
        void* montauk::fb_map();

    DESCRIPTION
        These syscalls allow userspace programs to access the linear
        framebuffer directly for graphical output.

       fb_info
        Fills in an FbInfo structure with the framebuffer geometry:

            montauk::abi::FbInfo fb;
            montauk::fb_info(&fb);
            // fb.width, fb.height, fb.pitch, fb.bpp

        The pitch is the number of bytes per scanline (may be larger
        than width * 4 due to alignment). bpp is always 32.

       fb_map
        Maps the physical framebuffer into the process address space at
        a fixed virtual address (0x50000000) and returns that address.

            uint32_t* pixels = (uint32_t*)montauk::fb_map();

        Each pixel is a 32-bit value in 0xAARRGGBB format (blue in the
        low byte). Writing to this memory directly updates the screen.

    PIXEL FORMAT
            Bits 31-24:  Alpha (unused, typically 0xFF)
            Bits 23-16:  Red
            Bits 15-8:   Green
            Bits 7-0:    Blue

        Example: red = 0x00FF0000, green = 0x0000FF00, blue = 0x000000FF

    EXAMPLE
        Fill the screen with blue:

            montauk::abi::FbInfo fb;
            montauk::fb_info(&fb);
            uint32_t* pixels = (uint32_t*)montauk::fb_map();

            for (uint64_t y = 0; y < fb.height; y++) {
                uint32_t* row = (uint32_t*)((uint8_t*)pixels + y * fb.pitch);
                for (uint64_t x = 0; x < fb.width; x++) {
                    row[x] = 0x000000FF;
                }
            }

    NOTES
        After mapping, the cursor overlay is not composited. Programs
        that use the framebuffer take full control of screen output.

        Only one mapping per process is supported. Calling fb_map()
        multiple times returns the same address.

    SEE ALSO
        syscalls(2), malloc(3)

Back to Documentation Index