[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[tyndur-devel] [PATCH 1/6] + cdi: video-Header
Signed-off-by: Alexander Siol <alex@xxxxxxxxxx>
---
src/modules/cdi/include/cdi.h | 1 +
src/modules/cdi/include/cdi/vesa.h | 92 ++++++++++++
src/modules/cdi/include/cdi/video.h | 274 +++++++++++++++++++++++++++++++++++
3 files changed, 367 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..f8ff636
--- /dev/null
+++ b/src/modules/cdi/include/cdi/vesa.h
@@ -0,0 +1,92 @@
+/*
+ * 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>
+
+/**
+ * VESA information block, used to get information about the card like video
+ * modes
+ */
+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));
+
+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));
+
+struct cdi_video_vesa_mode {
+ struct cdi_video_displaymode mode;
+ uint16_t vesamode;
+};
+
+struct cdi_video_vesa_info_block cdi_vesa_infoblock;
+
+int cdi_video_vesa_initialize
+ (struct cdi_video_vesa_info_block **vesainfo,
+ void (*mode_callback)(int modenum, struct cdi_video_vesa_mode_info *mode));
+
+struct cdi_video_vesa_mode_info* cdi_video_vesa_get_mode(int modenum);
+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..c42dbfe
--- /dev/null
+++ b/src/modules/cdi/include/cdi/video.h
@@ -0,0 +1,274 @@
+/*
+ * 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"
+
+struct cdi_video_displaymode {
+ unsigned int width;
+ unsigned int height;
+ unsigned int depth;
+ int refreshrate; // 0 für Irrelevant
+};
+
+enum cdi_video_bitmap_usage_hint {
+ CDI_VIDEO_PRIO_HIGH,
+ CDI_VIDEO_PRIO_NORMAL,
+ CDI_VIDEO_PRIO_LOW,
+};
+
+struct cdi_video_pixel_format {
+ char bpp;
+ uint32_t red_bits, red_offset;
+ uint32_t green_bits, green_offset;
+ uint32_t blue_bits, blue_offset;
+ uint32_t alpha_bits, alpha_offset;
+};
+
+struct cdi_video_bitmap {
+ int width;
+ int height;
+ struct cdi_video_pixel_format format;
+ int pitch;
+
+ struct cdi_video_device *device;
+
+ /// 1 wenn im VRAM, 0 wenn im RAM
+ int in_vram;
+
+ /// Addresse
+ 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;
+};
+
+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;
+};
+
+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 width Breite des Bitmaps
+ * @param height Hoehe des Bitmaps
+ * @param data Pixeldaten, oder 0, wenn das Bitmap vom Treiber beschrieben wird
+ */
+ 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_device *device, 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 Priorität 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 für die folgenden Zeichenfunktionen.
+ * Der Raster-Op bestimmt, auf welche Art Grafik gezeichnet wird.
+ * @param display Display, auf das gezeichnet wird
+ * @param rop Raster-Op
+ * @note Kann nur angewendet werden wenn der Bildschirm aktiviert ist
+ */
+ void (*set_raster_op)
+ (struct cdi_video_device *device, enum cdi_video_raster_op rop);
+
+ /**
+ * Zeichnet eine Linie
+ * @param display Display, 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
+ * @note Kann nur angewendet werden wenn der Bildschirm aktiviert ist
+ */
+
+ 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 display Display, 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 display Display, 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 display Display, 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 display Display, 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 display Display, auf dem gezeichnet wird
+ * @param x X-Koordinate (Ziel)
+ * @param y Y-Koordinate (Ziel)
+ * @note Kann nur angewendet werden wenn der Bildschirm aktiviert ist
+ */
+ 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