19682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall/*
29682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * SDL - Simple DirectMedia Layer
39682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * CELL BE Support for PS3 Framebuffer
49682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * Copyright (C) 2008, 2009 International Business Machines Corporation
59682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *
69682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * This library is free software; you can redistribute it and/or modify it
79682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * under the terms of the GNU Lesser General Public License as published
89682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * by the Free Software Foundation; either version 2.1 of the License, or
99682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * (at your option) any later version.
109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *
119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * This library is distributed in the hope that it will be useful, but
129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * WITHOUT ANY WARRANTY; without even the implied warranty of
139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * Lesser General Public License for more details.
159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *
169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * You should have received a copy of the GNU Lesser General Public
179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * License along with this library; if not, write to the Free Software
189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * USA
209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *
219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *  Martin Lowinski  <lowinski [at] de [dot] ibm [ibm] com>
229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *  Dirk Herrendoerfer <d.herrendoerfer [at] de [dot] ibm [dot] com>
239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *  SPE code based on research by:
249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *  Rene Becker
259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *  Thimo Emmerich
269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall */
279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include "SDL_config.h"
299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include "../SDL_sysvideo.h"
309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include "SDL_mouse.h"
319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include "SDL_mutex.h"
329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include "spulibs/spu_common.h"
339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <libspe2.h>
359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <pthread.h>
369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <linux/types.h>
379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <linux/fb.h>
389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <asm/ps3fb.h>
399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <linux/vt.h>
409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <termios.h>
419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#ifndef _SDL_ps3video_h
439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define _SDL_ps3video_h
449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall/* Debugging
469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * 0: No debug messages
479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * 1: Video debug messages
489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * 2: SPE debug messages
499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * 3: Memory adresses
509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall */
519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define DEBUG_LEVEL 0
529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#ifdef DEBUG_LEVEL
549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define deprintf( level, fmt, args... ) \
559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    do \
569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall{ \
579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    if ( (unsigned)(level) <= DEBUG_LEVEL ) \
589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    { \
599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        fprintf( stdout, fmt, ##args ); \
609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        fflush( stdout ); \
619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    } \
629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall} while ( 0 )
639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#else
649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define deprintf( level, fmt, args... )
659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#endif
669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall/* Framebuffer device */
689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define PS3_DEV_FB "/dev/fb0"
699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall/* Hidden "this" pointer for the video functions */
719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define _THIS   SDL_VideoDevice * this
729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall/* SPU thread data */
749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Halltypedef struct spu_data {
759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    spe_context_ptr_t ctx;
769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    pthread_t thread;
779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    spe_program_handle_t program;
789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    char * program_name;
799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    unsigned int booted;
809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    unsigned int keepalive;
819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    unsigned int entry;
829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    int error_code;
839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    void * argp;
849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall} spu_data_t;
859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall/* Private video driver data needed for Cell support */
879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallstruct SDL_PrivateVideoData
889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall{
899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    const char * const fb_dev_name; /* FB-device name */
909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    int fb_dev_fd; /* Descriptor-handle for fb_dev_name */
919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    uint8_t * frame_buffer; /* mmap'd access to fbdev */
929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    /* SPE threading stuff */
949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    spu_data_t * fb_thread_data;
959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    spu_data_t * scaler_thread_data;
969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    spu_data_t * converter_thread_data;
979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    /* screeninfo (from linux/fb.h) */
999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    struct fb_fix_screeninfo fb_finfo;
1009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    struct fb_var_screeninfo fb_vinfo;
1019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    struct fb_var_screeninfo fb_orig_vinfo;
1029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    /* screeninfo (from asm/ps3fb.h) */
1049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    struct ps3fb_ioctl_res res;
1059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    unsigned int double_buffering;
1079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    uint32_t real_width;      // real width of screen
1089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    uint32_t real_height;     // real height of screen
1099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    uint32_t s_fb_pixel_size;   // 32:  4  24:  3  16:  2  15:  2
1119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    uint32_t fb_bits_per_pixel;   // 32: 32  24: 24  16: 16  15: 15
1129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    uint32_t config_count;
1149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    uint32_t s_input_line_length;   // precalculated: input_width * fb_pixel_size
1169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    uint32_t s_bounded_input_width; // width of input (bounded by writeable width)
1179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    uint32_t s_bounded_input_height;// height of input (bounded by writeable height)
1189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    uint32_t s_bounded_input_width_offset;  // offset from the left side (used for centering)
1199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    uint32_t s_bounded_input_height_offset; // offset from the upper side (used for centering)
1209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    uint32_t s_writeable_width; // width of screen which is writeable
1219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    uint32_t s_writeable_height;    // height of screen which is writeable
1229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    uint8_t * s_center[2]; // where to begin writing our image (centered?)
1249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    uint32_t s_center_index;
1259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    volatile void * s_pixels __attribute__((aligned(128)));
1279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    /* Framebuffer data */
1299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    volatile struct fb_writer_parms_t * fb_parms __attribute__((aligned(128)));
1309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall};
1319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define fb_dev_name     (this->hidden->fb_dev_name)
1339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define fb_dev_fd       (this->hidden->fb_dev_fd)
1349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define frame_buffer       (this->hidden->frame_buffer)
1359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define fb_thread_data      (this->hidden->fb_thread_data)
1369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define scaler_thread_data      (this->hidden->scaler_thread_data)
1379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define converter_thread_data      (this->hidden->converter_thread_data)
1389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define fb_parms           (this->hidden->fb_parms)
1399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define SDL_nummodes		(this->hidden->SDL_nummodes)
1409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define SDL_modelist		(this->hidden->SDL_modelist)
1419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define SDL_videomode		(this->hidden->SDL_videomode)
1429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define fb_finfo        (this->hidden->fb_finfo)
1439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define fb_vinfo        (this->hidden->fb_vinfo)
1449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define fb_orig_vinfo   (this->hidden->fb_orig_vinfo)
1459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define res             (this->hidden->res)
1469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define double_buffering (this->hidden->double_buffering)
1479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define real_width      (this->hidden->real_width)
1489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define real_height     (this->hidden->real_height)
1499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define s_fb_pixel_size   (this->hidden->s_fb_pixel_size)
1509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define fb_bits_per_pixel (this->hidden->fb_bits_per_pixel)
1519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define config_count (this->hidden->config_count)
1529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define s_input_line_length (this->hidden->s_input_line_length)
1539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define s_bounded_input_width (this->hidden->s_bounded_input_width)
1549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define s_bounded_input_height (this->hidden->s_bounded_input_height)
1559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define s_bounded_input_width_offset (this->hidden->s_bounded_input_width_offset)
1569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define s_bounded_input_height_offset (this->hidden->s_bounded_input_height_offset)
1579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define s_writeable_width (this->hidden->s_writeable_width)
1589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define s_writeable_height (this->hidden->s_writeable_height)
1599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define s_center          (this->hidden->s_center)
1609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define s_center_index    (this->hidden->s_center_index)
1619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define s_pixels           (this->hidden->s_pixels)
1629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#endif /* _SDL_ps3video_h */
1649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
166