[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[tyndur-devel] [PATCH v2] + cdi: video-Header
Signed-off-by: Alexander Siol <alex@xxxxxxxxxx>
---
src/modules/cdi/include/cdi.h | 1 +
src/modules/cdi/include/cdi/vesa.h | 118 ++++++++++++++
src/modules/cdi/include/cdi/video.h | 297 +++++++++++++++++++++++++++++++++++
3 files changed, 416 insertions(+), 0 deletions(-)
create mode 100644 src/modules/cdi/include/cdi/vesa.h
create mode 100644 src/modules/cdi/include/cdi/video.h
diff --git a/src/modules/cdi/include/cdi.h b/src/modules/cdi/include/cdi.h
index 7bcf9e4..fee8976 100644
--- a/src/modules/cdi/include/cdi.h
+++ b/src/modules/cdi/include/cdi.h
@@ -26,6 +26,7 @@ typedef enum {
CDI_NETWORK = 1,
CDI_STORAGE = 2,
CDI_SCSI = 3,
+ CDI_VIDEO = 4,
} cdi_device_type_t;
struct cdi_driver;
diff --git a/src/modules/cdi/include/cdi/vesa.h b/src/modules/cdi/include/cdi/vesa.h
new file mode 100644
index 0000000..1f0eaaa
--- /dev/null
+++ b/src/modules/cdi/include/cdi/vesa.h
@@ -0,0 +1,118 @@
+/*
+ * Copyright (c) 2008-2009 Mathias Gottschlag, Janosch Graef, Alexander Siol
+ *
+ * This program is free software. It comes without any warranty, to
+ * the extent permitted by applicable law. You can redistribute it
+ * and/or modify it under the terms of the Do What The Fuck You Want
+ * To Public License, Version 2, as published by Sam Hocevar. See
+ * http://sam.zoy.org/projects/COPYING.WTFPL for more details.
+ */
+
+#ifndef _CDI_VESA_H_
+#define _CDI_VESA_H_
+
+#include <stdint.h>
+#include <cdi/lists.h>
+#include <cdi/video.h>
+
+/**
+ * Allgemeiner VESA / VBE Informationsblock, wird verwendet um Informationen
+ * ueber vorhande Faehigkeiten und Modi der Grafikkarte zu erhalten.
+ */
+struct cdi_video_vesa_info_block {
+ char signature[4];
+ char version[2];
+ uint32_t oemname;
+ uint32_t capabilities;
+ uint32_t modeptr;
+ uint16_t videomem;
+ // VBE 2.0
+ uint16_t oemversion;
+ uint32_t vendornameptr;
+ uint32_t productnameptr;
+ uint32_t revisionptr;
+ uint16_t modes[111];
+ uint8_t oem[256];
+} __attribute__ ((packed));
+
+/**
+ * VBE Modus-Informationsblock.
+ * Enthaelt Infos ueber den speziellen Modus.
+ */
+struct cdi_video_vesa_mode_info {
+ uint16_t modeattr;
+ uint8_t windowattra;
+ uint8_t windowattrb;
+ uint16_t windowgran;
+ uint16_t windowsize;
+ uint16_t startsega;
+ uint16_t startsegb;
+ uint32_t posfunc;
+ uint16_t scanline;
+
+ uint16_t width;
+ uint16_t height;
+ uint8_t charwidth;
+ uint8_t charheight;
+ uint8_t planecount;
+ uint8_t depth;
+ uint8_t banks;
+ uint8_t type;
+ uint8_t banksize;
+ uint8_t imagepages;
+ uint8_t reserved;
+ // VBE v1.2+
+ uint8_t redmasksize;
+ uint8_t redfieldpos;
+ uint8_t greenmasksize;
+ uint8_t greenfieldpos;
+ uint8_t bluemasksize;
+ uint8_t bluefieldpos;
+ uint8_t resmasksize;
+ uint8_t resfieldsize;
+ uint8_t dircolormode;
+ // VBE v2.0
+ uint32_t linearfb;
+ uint32_t offscreenmem;
+ uint32_t offscreensize;
+
+ char reserved2[206];
+} __attribute__ ((packed));
+
+/**
+ * CDI-Video-Mode mit Erweiterung um VESA/VBE-Modusnummer
+ */
+struct cdi_video_vesa_mode {
+ struct cdi_video_displaymode mode;
+ uint16_t vesamode;
+};
+
+/**
+ * Liest den allgemeinen VESA/VBE-Informationsblock aus und uebergibt einen
+ * Pointer auf diesen, ruft fuer jeden gefundenen Modus einen
+ * Callback auf.
+ * @param vesainfo Zeiger auf Infoblock-Zeiger
+ * @param mode_callback Zeiger auf Modus-Callback-Funktion
+ * @return 0 bei Erfolg, -1 im Fehlerfall
+ */
+int cdi_video_vesa_initialize
+ (struct cdi_video_vesa_info_block **vesainfo,
+ void (*mode_callback)(int modenum, struct cdi_video_vesa_mode_info *mode));
+
+/**
+ * Liefert Informationen zu einem spezifischen Modus
+ * @param modenum Die Modusnummer - fuer gueltige Nummern siehe den allgemeinen
+ * Infoblock
+ * @return Zeiger auf Modus-Informationsblock. 0 bei Fehler.
+ */
+struct cdi_video_vesa_mode_info* cdi_video_vesa_get_mode(int modenum);
+
+/**
+ * Setzt den Modus via int10
+ * @param modenum Die Modusnummer - fuer gueltige Nummern siehe den allgemeinen
+ * Infoblock
+ * @return 0 bei Erfolg, -1 im Fehlerfall
+ */
+int cdi_video_vesa_change_mode(int modenum);
+
+#endif
diff --git a/src/modules/cdi/include/cdi/video.h b/src/modules/cdi/include/cdi/video.h
new file mode 100644
index 0000000..727e476
--- /dev/null
+++ b/src/modules/cdi/include/cdi/video.h
@@ -0,0 +1,297 @@
+/*
+ * Copyright (c) 2007-2009 Mathias Gottschlag, Janosch Graef, Alexander Siol
+ *
+ * This program is free software. It comes without any warranty, to
+ * the extent permitted by applicable law. You can redistribute it
+ * and/or modify it under the terms of the Do What The Fuck You Want
+ * To Public License, Version 2, as published by Sam Hocevar. See
+ * http://sam.zoy.org/projects/COPYING.WTFPL for more details.
+ */
+
+#ifndef _CDI_VIDEO_H_
+#define _CDI_VIDEO_H_
+
+#include "cdi.h"
+#include "cdi/lists.h"
+
+/**
+ * Modus fuer Anzeigen
+ */
+struct cdi_video_displaymode {
+ unsigned int width;
+ unsigned int height;
+ unsigned int depth; // In BPP
+ int refreshrate; // Vsync in Hz, 0 fuer Irrelevant/Automatisch
+};
+
+enum cdi_video_bitmap_usage_hint {
+ CDI_VIDEO_PRIO_HIGH,
+ CDI_VIDEO_PRIO_NORMAL,
+ CDI_VIDEO_PRIO_LOW,
+};
+
+struct cdi_video_pixel_format {
+ uint8_t bpp;
+ uint8_t red_bits;
+ uint8_t red_offset;
+ uint8_t green_bits;
+ uint8_t green_offset;
+ uint8_t blue_bits;
+ uint8_t blue_offset;
+ uint8_t alpha_bits;
+ uint8_t alpha_offset;
+};
+
+struct cdi_video_bitmap {
+ /// Aufloesung des Bitmaps - Breite
+ int width;
+ /// Aufloesung des Bitmaps - Hoehe
+ int height;
+ /// Verwendetes Pixelformat
+ struct cdi_video_pixel_format format;
+
+ /// Zeilenlaenge in Bytes. Achtung, muss nicht width * bpp sein!
+ int pitch;
+
+ /// Das Geraet zu dem das Bitmap gehoert.
+ struct cdi_video_device* device;
+
+ /// 1 wenn im VRAM, 0 wenn im RAM
+ int in_vram;
+
+ /// Addresse (ggf. im VRAM)
+ int* pixeldata;
+};
+
+enum cdi_video_raster_op {
+ CDI_VIDEO_ROP_COPY,
+ CDI_VIDEO_ROP_OR,
+ CDI_VIDEO_ROP_AND,
+ CDI_VIDEO_ROP_XOR,
+ // TODO: Erweitern
+};
+
+struct cdi_video_device {
+ /// CDI-Geraet
+ struct cdi_device dev;
+
+ /// Liste der Bildschirme
+ cdi_list_t displays;
+
+ /// Aktuelle RasterOP (fuer Software-Helfer noetig)
+ enum cdi_video_raster_op raster_op;
+
+ /// Daten zur Moduswiederherstellung
+ void* restore_data;
+
+ /// Pointer zum Beginn des (gemappten) VRAM
+ void* vram;
+
+ /// Groesse des VRAM
+ size_t vram_size;
+};
+
+/**
+ * Eine benutzbare Anzeige - Geraet, Modus, verfuegbare Modi und der Frontbuffer
+ */
+struct cdi_video_display {
+ /// Videogeraet, dem dieser Bildschirm angehoert
+ struct cdi_video_device* device;
+
+ /// Momentaner Modus
+ struct cdi_video_displaymode* mode;
+
+ /// Liste mit verfuegbaren Modi
+ cdi_list_t modes;
+
+ /// Zeichenbuffer fuer Display
+ struct cdi_video_bitmap* frontbuffer;
+};
+
+/**
+ * Speichert eine Farbe in jeweils 8-bit ARGB.
+ */
+struct cdi_video_color {
+ uint8_t alpha;
+ uint8_t red;
+ uint8_t green;
+ uint8_t blue;
+};
+
+struct cdi_video_driver {
+ /// CDI-Treiber
+ struct cdi_driver drv;
+
+ // Basis-Funktionen
+ /**
+ * Sichert die aktiven Modi der Displays zur spaeteren Wiederherstellung
+ * @param device Das zu sichernde Device
+ * @return 0 = Erfolg; -1 = Fehlschlag
+ */
+ int (*driver_save)(struct cdi_video_device* device);
+
+ /**
+ * Stellt den gesicherten Zustand wieder her.
+ * @param device Das Device das wiederherstellen soll
+ * @return 0 = Erfolg; -1 = Fehlschlag
+ */
+ int (*driver_restore)(struct cdi_video_device* device);
+
+
+
+ // Anzeigenkontrolle
+
+ /**
+ * Setzt die Aufloesung eines Bildschirms
+ * @param display Bildschirm
+ * @param mode Modus
+ * @return 0 = Erfolg; -1 = Fehlschlag
+ */
+ int (*display_set_mode)
+ (struct cdi_video_device* device, struct cdi_video_display* display,
+ struct cdi_video_displaymode* mode);
+
+
+
+ // Bitmap-Funktionen
+
+ /**
+ * Erstellt ein Bitmap
+ * @param device Das Geraet auf dem das Bitmap liegt
+ * @param width Breite des Bitmaps
+ * @param height Hoehe des Bitmaps
+ * @param data Pixeldaten, oder 0, wenn keine Initialisierung gewuenscht ist
+ * @return Zeiger auf die neue Bitmap
+ */
+ struct cdi_video_bitmap* (*bitmap_create)
+ (struct cdi_video_device* device, unsigned int width,
+ unsigned int height, void* data);
+
+ /**
+ * Loescht ein Bitmap
+ * @param bitmap Zu loeschendes Bitmap
+ */
+ void (*bitmap_destroy)
+ (struct cdi_video_bitmap* bitmap);
+
+ /**
+ * Setzt den Gebrauchsmodus eines Bitmaps (bestimmt zB, ob ein Bitmap gecacht wird)
+ * @param device Videogeraet
+ * @param bitmap Betroffenes Bitmap
+ * @param hint Hinweis auf die Prioritaet des Bitmaps
+ */
+ void (*bitmap_set_usage_hint)
+ (struct cdi_video_device* device, struct cdi_video_bitmap* bitmap,
+ enum cdi_video_bitmap_usage_hint hint);
+
+
+
+ // Zeichen-Funktionen
+
+ /**
+ * Setzt den Raster-Op fuer die folgenden Zeichenfunktionen.
+ * Der Raster-Op bestimmt, auf welche Art Grafik gezeichnet wird.
+ * @param target Bitmap auf das gezeichnet werden soll
+ * @param rop Raster-Op
+ */
+ void (*set_raster_op)
+ (struct cdi_video_device* device, enum cdi_video_raster_op rop);
+
+ /**
+ * Zeichnet eine Linie
+ * @param target Bitmap auf das gezeichnet wird
+ * @param x1 X-Koordinate des Anfangs
+ * @param y1 Y-Koordinate des Anfangs
+ * @param x1 X-Koordinate des Endpunktes
+ * @param y1 Y-Koordinate des Endpunktes
+ * @param color Farbe der Linie
+ */
+ void (*draw_line)
+ (struct cdi_video_bitmap* target, unsigned int x1, unsigned int y1,
+ unsigned int x2, unsigned int y2, struct cdi_video_color* color);
+
+ /**
+ * Zeichnet ein Rechteck
+ * @param target Bitmap auf das gezeichnet wird
+ * @param x X-Koordinate
+ * @param y Y-Koordinate
+ * @param width Breite
+ * @param height Hoehe
+ * @param color Farbe des Rechtecks
+ */
+ void (*draw_rectangle)
+ (struct cdi_video_bitmap* target, unsigned int x, unsigned int y,
+ unsigned int width, unsigned int height, struct cdi_video_color* color);
+
+ /**
+ * Zeichnet eine Ellipse
+ * @param target Bitmap auf das gezeichnet wird
+ * @param x X-Koordinate
+ * @param y Y-Koordinate
+ * @param width Breite
+ * @param height Hoehe
+ * @param color Farbe der Ellipse
+ */
+ void (*draw_ellipse)
+ (struct cdi_video_bitmap* target, unsigned int x, unsigned int y,
+ unsigned int width, unsigned int height, struct cdi_video_color* color);
+
+ /**
+ * Zeichnet ein Bitmap
+ * @param target Bitmap auf das gezeichnet wird
+ * @param bitmap Zu zeichnendes Bitmap
+ * @param x X-Koordinate
+ * @param y Y-Koordinate
+ * @note Es wird nur so viel kopiert wie das Zielbitmap aufnehmen kann
+ */
+ void (*draw_bitmap)
+ (struct cdi_video_bitmap* target, struct cdi_video_bitmap* bitmap,
+ unsigned int x, unsigned int y);
+
+ /**
+ * Zeichnet einen Teil einer Bitmap
+ * @param target Bitmap auf das gezeichnet wird
+ * @param bitmap Zu zeichnendes Bitmap
+ * @param x X-Koordinate (Ziel)
+ * @param y Y-Koordinate (Ziel)
+ * @param srcx X-Koordinate (Quelle)
+ * @param srcy Y-Koordinate (Quelle)
+ * @param width Breite
+ * @param height Hoehe
+ */
+ void (*draw_bitmap_part)
+ (struct cdi_video_bitmap* target, struct cdi_video_bitmap* bitmap,
+ unsigned int x, unsigned int y, unsigned int srcx, unsigned int srcy,
+ unsigned int width, unsigned int height);
+
+ /**
+ * Zeichnet einen Punkt
+ * @param target Display, auf dem gezeichnet wird
+ * @param x X-Koordinate (Ziel)
+ * @param y Y-Koordinate (Ziel)
+ * @param color Zeiger auf die zu verwendende Farbe
+ * @note Sollte Sparsam eingesetzt werden, Viele Punkte so zeichnen ist
+ * meistens sehr langsam.
+ */
+ void (*draw_dot)
+ (struct cdi_video_bitmap* target, unsigned int x, unsigned int y,
+ struct cdi_video_color* color);
+};
+
+/**
+ * Initialisiert die Datenstrukturen fuer einen Grafikkartentreiber
+ */
+void cdi_video_driver_init(struct cdi_video_driver* driver);
+
+/**
+ * Deinitialisiert die Datenstrukturen fuer einen Grafikkartentreiber
+ */
+void cdi_video_driver_destroy(struct cdi_video_driver* driver);
+
+/**
+ * Registiert einen Grafikkartentreiber
+ */
+void cdi_video_driver_register(struct cdi_video_driver* driver);
+
+
+#endif
--
1.6.0.4