/* Copyright (C) 2007-2013 Stefan Seyfried License: GPL This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . private functions for the fbaccel class (only used in CFrameBuffer) */ #ifndef __fbaccel__ #define __fbaccel__ #include #include #include #include #include #include "fb_generic.h" #if HAVE_SPARK_HARDWARE #define PARTIAL_BLIT 1 #endif #if HAVE_COOL_HARDWARE /* not needed -- if you don't want acceleration, don't call CFbAccel ;) */ #define USE_NEVIS_GXA 1 #endif class CFbAccel : public CFrameBuffer { public: CFbAccel(); ~CFbAccel(); void paintBoxRel(const int x, const int y, const int dx, const int dy, const fb_pixel_t col, int radius, int type); virtual void paintRect(const int x, const int y, const int dx, const int dy, const fb_pixel_t col); }; class CFbAccelSTi : public OpenThreads::Thread, public CFbAccel { private: void run(void); void blit(void); void _blit(void); bool blit_thread; bool blit_pending; OpenThreads::Condition blit_cond; OpenThreads::Mutex blit_mutex; fb_pixel_t *backbuffer; #ifdef PARTIAL_BLIT struct { int xs; int ys; int xe; int ye; } to_blit; uint32_t last_xres; #endif public: CFbAccelSTi(); ~CFbAccelSTi(); void init(const char * const); int setMode(unsigned int xRes, unsigned int yRes, unsigned int bpp); void paintRect(const int x, const int y, const int dx, const int dy, const fb_pixel_t col); void blit2FB(void *fbbuff, uint32_t width, uint32_t height, uint32_t xoff, uint32_t yoff, uint32_t xp, uint32_t yp, bool transp); void waitForIdle(const char *func = NULL); void mark(int x, int y, int dx, int dy); fb_pixel_t * getBackBufferPointer() const; void setBlendMode(uint8_t); void setBlendLevel(int); }; class CFbAccelCS : public CFbAccel { private: fb_pixel_t lastcol; int devmem_fd; /* to access the GXA register we use /dev/mem */ unsigned int smem_start; /* as aquired from the fbdev, the framebuffers physical start address */ volatile uint8_t *gxa_base; /* base address for the GXA's register access */ void add_gxa_sync_marker(void); void setupGXA(void); void setColor(fb_pixel_t col); void run(void); fb_pixel_t *backbuffer; public: CFbAccelCS(); ~CFbAccelCS(); void init(const char * const); int setMode(unsigned int xRes, unsigned int yRes, unsigned int bpp); void paintPixel(int x, int y, const fb_pixel_t col); void paintRect(const int x, const int y, const int dx, const int dy, const fb_pixel_t col); void paintLine(int xa, int ya, int xb, int yb, const fb_pixel_t col); void blit2FB(void *fbbuff, uint32_t width, uint32_t height, uint32_t xoff, uint32_t yoff, uint32_t xp, uint32_t yp, bool transp); void waitForIdle(const char *func = NULL); fb_pixel_t * getBackBufferPointer() const; void setBlendMode(uint8_t); void setBlendLevel(int); }; class CFbAccelGLFB : public OpenThreads::Thread, public CFbAccel { private: void run(void); void blit(void); void _blit(void); bool blit_thread; bool blit_pending; OpenThreads::Condition blit_cond; OpenThreads::Mutex blit_mutex; fb_pixel_t *backbuffer; public: CFbAccelGLFB(); ~CFbAccelGLFB(); void init(const char * const); int setMode(unsigned int xRes, unsigned int yRes, unsigned int bpp); void blit2FB(void *fbbuff, uint32_t width, uint32_t height, uint32_t xoff, uint32_t yoff, uint32_t xp, uint32_t yp, bool transp); fb_pixel_t * getBackBufferPointer() const; }; class CFbAccelTD : public CFbAccel { private: fb_pixel_t lastcol; void setColor(fb_pixel_t col); fb_pixel_t *backbuffer; public: CFbAccelTD(); ~CFbAccelTD(); void init(const char * const); int setMode(unsigned int xRes, unsigned int yRes, unsigned int bpp); void paintPixel(int x, int y, const fb_pixel_t col); void paintRect(const int x, const int y, const int dx, const int dy, const fb_pixel_t col); void paintHLineRel(int x, int dx, int y, const fb_pixel_t col) { paintLine(x, y, x + dx, y, col); }; void paintVLineRel(int x, int y, int dy, const fb_pixel_t col) { paintLine(x, y, x, y + dy, col); }; void paintLine(int xa, int ya, int xb, int yb, const fb_pixel_t col); void blit2FB(void *fbbuff, uint32_t width, uint32_t height, uint32_t xoff, uint32_t yoff, uint32_t xp, uint32_t yp, bool transp); void waitForIdle(const char *func = NULL); void setBlendMode(uint8_t); void setBlendLevel(int); }; #endif