[← Home](../README.md) · [Graphics](README.md) # GfxBase — Graphics Library Global State ## Overview `graphics.library` is the core drawing library in AmigaOS. It manages all display output, drawing primitives, font rendering, and custom chip programming. `GfxBase` — the library base — contains the system's display state, chip revision info, system copper lists, and the display mode database. ```mermaid flowchart TD subgraph "GfxBase — Global Graphics State" AV["ActiView
(current display)"] COP["copinit
(system copper list)"] CHIP["ChipRevBits0
(OCS/ECS/AGA detection)"] FONTS["TextFonts
(system font list)"] MODES["ModesList
(display mode database)"] VBF["VBlankFrequency
(50=PAL, 60=NTSC)"] end APP["Application"] -->|"OpenLibrary"| GFX["graphics.library"] GFX --> AV GFX --> COP GFX --> CHIP AV -->|"MakeVPort / MrgCop /
LoadView"| HW["Custom Chips
(Agnus/Denise)"] style GFX fill:#e8f4fd,stroke:#2196f3,color:#333 style HW fill:#c8e6c9,stroke:#2e7d32,color:#333 ``` --- ## struct GfxBase (Key Fields) ```c /* graphics/gfxbase.h — NDK39 */ struct GfxBase { struct Library LibNode; struct View *ActiView; /* currently active View */ struct copinit *copinit; /* system copper list initialization */ LONG *cia; /* CIA base (deprecated) */ LONG *blitter; /* blitter base (deprecated) */ UWORD *LOFlist; /* long-frame copper list pointer */ UWORD *SHFlist; /* short-frame copper list (interlace) */ struct bltnode *blthd; /* blitter queue head */ struct bltnode *blttl; /* blitter queue tail */ struct bltnode *bsblthd; struct bltnode *bsblttl; struct Interrupt vbsrv; /* vertical blank server chain */ struct Interrupt timsrv; /* timer server chain */ struct Interrupt bltsrv; /* blitter-done server chain */ struct List TextFonts; /* system font list */ struct TextFont *DefaultFont; /* default system font (topaz.8) */ UWORD Modes; /* current display mode bits */ BYTE VBlankFrequency; /* 50 (PAL) or 60 (NTSC) */ BYTE DisplayFlags; /* PAL/NTSC/GENLOCK flags */ UWORD NormalDisplayColumns; /* default display width */ UWORD NormalDisplayRows; /* default display height */ UWORD MaxDisplayColumn; UWORD MaxDisplayRow; UWORD ChipRevBits0; /* chip revision flags — see below */ /* ... many more fields ... */ struct MonitorSpec *monitor_id; struct List MonitorList; /* installed monitors */ struct List ModesList; /* display mode database */ UBYTE MemType; /* memory type flags */ /* OS 3.x additions */ APTR ChunkyToPlanarPtr; /* c2p conversion routine pointer */ }; ``` --- ## Chip Revision Detection The `ChipRevBits0` field identifies which chipset generation is present — essential for FPGA cores that need to report their emulated chipset level: ```c /* graphics/gfxbase.h */ #define GFXB_BIG_BLITS 0 /* big blitter (ECS Agnus — 1MB chip) */ #define GFXB_HR_AGNUS 0 /* hi-res Agnus (same bit as above) */ #define GFXB_HR_DENISE 1 /* ECS Denise (SuperHires, scan-doubling) */ #define GFXB_AA_ALICE 2 /* AGA Alice (A1200/A4000) */ #define GFXB_AA_LISA 3 /* AGA Lisa (A1200/A4000) */ #define GFXB_AA_MLISA 4 /* AGA modified Lisa */ #define GFXF_BIG_BLITS (1<<0) #define GFXF_HR_AGNUS (1<<0) #define GFXF_HR_DENISE (1<<1) #define GFXF_AA_ALICE (1<<2) #define GFXF_AA_LISA (1<<3) #define GFXF_AA_MLISA (1<<4) ``` ### Detecting the Chipset ```c struct GfxBase *GfxBase = (struct GfxBase *) OpenLibrary("graphics.library", 0); if (GfxBase->ChipRevBits0 & GFXF_AA_ALICE) { /* AGA chipset (A1200/A4000) */ /* 8-bit planar, 256 colors, 24-bit palette */ } else if (GfxBase->ChipRevBits0 & GFXF_HR_DENISE) { /* ECS chipset (A3000/A600) */ /* SuperHires, productivity modes, scan-doubler */ } else if (GfxBase->ChipRevBits0 & GFXF_HR_AGNUS) { /* ECS Agnus with OCS Denise (A500+/A2000 upgraded) */ /* 1 MB Chip RAM support, but no ECS display features */ } else { /* OCS chipset (original A500/A1000/A2000) */ /* 512 KB Chip RAM, 4096 color palette */ } ``` | Bits Set | Chipset | Systems | |---|---|---| | None | OCS | A500, A1000, A2000 | | `HR_AGNUS` | ECS Agnus only | A500+ (Fat Agnus upgrade) | | `HR_AGNUS + HR_DENISE` | Full ECS | A600, A3000 | | `AA_ALICE + AA_LISA` | AGA | A1200, A4000, CD32 | --- ## PAL vs NTSC Detection ```c if (GfxBase->VBlankFrequency == 50) { /* PAL: 50 Hz, 312 lines/field, 625 total (interlaced) */ /* Standard resolution: 320×256 */ } else /* 60 */ { /* NTSC: 60 Hz, 262 lines/field, 525 total (interlaced) */ /* Standard resolution: 320×200 */ } /* DisplayFlags also has the info: */ if (GfxBase->DisplayFlags & PAL) /* PAL system */ if (GfxBase->DisplayFlags & NTSC) /* NTSC system */ ``` --- ## The Display Pipeline ```mermaid flowchart TD subgraph "Application" VP["ViewPort
(one per screen)"] end subgraph "GfxBase Pipeline" MV["MakeVPort(view, vp)
→ build copper instructions
for this viewport"] MC["MrgCop(view)
→ merge all viewport copper
into single list"] LV["LoadView(view)
→ install merged copper list
into hardware"] end subgraph "Hardware" COP["Copper DMA
executes copper list"] CHIPS["Custom Chips
display image"] end VP --> MV --> MC --> LV --> COP --> CHIPS style MV fill:#fff9c4,stroke:#f9a825,color:#333 style MC fill:#fff9c4,stroke:#f9a825,color:#333 style LV fill:#fff9c4,stroke:#f9a825,color:#333 ``` ### Key Display Functions | Function | Purpose | |---|---| | `MakeVPort(view, vp)` | Generate copper instructions for one ViewPort | | `MrgCop(view)` | Merge all ViewPort copper lists into unified system list | | `LoadView(view)` | Install the merged copper list into the hardware (LOF/SHF) | | `WaitTOF()` | Wait for top of frame (vertical blank) — used to sync display updates | | `WaitBOVP(vp)` | Wait for the beam to pass a specific ViewPort | --- ## Blitter Queue GfxBase maintains a queue of pending Blitter operations (`blthd`/`blttl`). When an application calls `BltBitMap`, the operation may be queued and executed asynchronously by the Blitter interrupt: ```c /* Start a blit — may be queued: */ BltBitMap(srcBM, sx, sy, dstBM, dx, dy, w, h, 0xC0, 0xFF, NULL); /* Wait for ALL pending blits to complete: */ WaitBlit(); /* Or use OwnBlitter/DisownBlitter for exclusive access: */ OwnBlitter(); /* blocks until blitter is free, then locks it */ /* ... direct blitter register access ... */ DisownBlitter(); /* release for other tasks */ ``` --- ## System Fonts ```c /* Get the default system font: */ struct TextFont *sysFont = GfxBase->DefaultFont; Printf("System font: %s, size %d\n", sysFont->tf_Message.mn_Node.ln_Name, sysFont->tf_YSize); /* Enumerate all loaded fonts: */ struct Node *node; for (node = GfxBase->TextFonts.lh_Head; node->ln_Succ; node = node->ln_Succ) { Printf("Font: %s\n", node->ln_Name); } ``` --- ## References - NDK39: `graphics/gfxbase.h` - ADCD 2.1: graphics.library autodocs - See also: [views.md](views.md) — View/ViewPort construction - See also: [copper.md](copper/copper.md) — Copper coprocessor - See also: [display_modes.md](display_modes.md) — display mode database