#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
+#include <sys/time.h>
#include <unistd.h>
#include <linux/fb.h>
static Rect screen_rect;
static int color_depth; // bits per pixel
+static Pixmap *pixmap;
+
bool init_gfx()
{
if((dev_fd = open("/dev/fb0", O_RDWR)) == -1) {
return false;
}
+// TODO: uncomment when I find how to use intelfb instead of i915 GRRRR.-
+ fb_vblank vblank;
+ if(ioctl(dev_fd, FBIOGET_VBLANK, &vblank) == -1) {
+// fprintf(stderr, "FBIOGET_VBLANK error: %s\n", strerror(errno));
+ }
+/*
+ else {
+ printf("flags: %x\n", vblank.flags);
+ printf("count: %d\n", vblank.count);
+ printf("beam position: %d, %d\n", vblank.hcount, vblank.vcount);
+ }
+*/
+
+ pixmap = new Pixmap;
+ pixmap->width = screen_rect.width;
+ pixmap->height = screen_rect.height;
+ pixmap->pixels = framebuffer;
+
return true;
}
munmap(framebuffer, FRAMEBUFFER_SIZE(screen_rect.width, screen_rect.height, color_depth));
framebuffer = 0;
+
+ pixmap->pixels = 0;
}
unsigned char *get_framebuffer()
return framebuffer;
}
+Pixmap *get_framebuffer_pixmap()
+{
+ return pixmap;
+}
+
Rect get_screen_size()
{
return screen_rect;
Rect drect = rect;
if(drect.x < screen_rect.x) {
+ drect.width -= screen_rect.x - drect.x;
drect.x = screen_rect.x;
}
if(drect.y < screen_rect.y) {
+ drect.height -= screen_rect.y - drect.y;
drect.y = screen_rect.y;
}
- if(drect.x + drect.width > screen_rect.width) {
+ if(drect.x + drect.width >= screen_rect.x + screen_rect.width) {
drect.width = screen_rect.width - drect.x;
}
- if(drect.y + drect.height > screen_rect.height) {
+ if(drect.y + drect.height >= screen_rect.y + screen_rect.height) {
drect.height = screen_rect.height - drect.y;
}
{
}
+void wait_vsync()
+{
+ unsigned long arg = 0;
+ if(ioctl(dev_fd, FBIO_WAITFORVSYNC, &arg) == -1) {
+// printf("ioctl error %s\n", strerror(errno));
+ }
+}
+
#endif // WINNIE_FBDEV