Search
lxdream.org :: lxdream/src/display.h
lxdream 0.9.1
released Jun 29
Download Now
filename src/display.h
changeset 863:a5e5310061e2
prev850:28782ebbd01d
next1010:a506a2f66180
author nkeynes
date Wed Nov 05 10:05:08 2008 +0000 (15 years ago)
permissions -rw-r--r--
last change Fix (extremely boneheaded) failure to convert pc to physical address before
storing in the translation cache (in other words, the translation cache was
effectively disabled for MMU code). MMU code is now about 3 times faster...
view annotate diff log raw
     1 /**
     2  * $Id$
     3  *
     4  * The PC side of the video support (responsible for actually displaying / 
     5  * rendering frames)
     6  *
     7  * Copyright (c) 2005 Nathan Keynes.
     8  *
     9  * This program is free software; you can redistribute it and/or modify
    10  * it under the terms of the GNU General Public License as published by
    11  * the Free Software Foundation; either version 2 of the License, or
    12  * (at your option) any later version.
    13  *
    14  * This program is distributed in the hope that it will be useful,
    15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    17  * GNU General Public License for more details.
    18  */
    20 #ifndef lxdream_display_H
    21 #define lxdream_display_H 1
    23 #define GL_GLEXT_PROTOTYPES 1
    25 #include <stdint.h>
    26 #include <stdio.h>
    27 #include <glib.h>
    28 #include "lxdream.h"
    29 #include "gettext.h"
    30 #ifdef APPLE_BUILD
    31 #include <OpenGL/gl.h>
    32 #include <OpenGL/glext.h>
    33 #else
    34 #include <GL/gl.h>
    35 #include <GL/glext.h>
    36 #endif
    38 #ifdef __cplusplus
    39 extern "C" {
    40 #endif
    42 /**
    43  * Supported colour formats. Note that BGRA4444 is only ever used for texture
    44  * rendering (it's not valid for display purposes).
    45  */
    46 #define COLFMT_BGRA1555  0
    47 #define COLFMT_RGB565    1
    48 #define COLFMT_BGRA4444  2
    49 #define COLFMT_YUV422    3 /* 8-bit YUV (texture source only) */
    50 #define COLFMT_BGR888    4 /* 24-bit BGR */
    51 #define COLFMT_BGRA8888  5
    52 #define COLFMT_INDEX4    6 /* 4 bit indexed colour (texture source only) */
    53 #define COLFMT_INDEX8    7 /* 8-bit indexed colour (texture source only) */
    54 #define COLFMT_BGR0888   8 /* 32-bit BGR */
    55 #define COLFMT_RGB888    9 /* 24-bit RGB (ie GL native) */
    57 /**
    58  * The standard display size (for the purposes of mouse inputs, etc, is 640x480 -
    59  * events should be adjusted accordingly if this is not the actual window size.
    60  */ 
    61 #define DISPLAY_WIDTH 640
    62 #define DISPLAY_HEIGHT 480
    64 struct colour_format {
    65     GLint type, format, int_format;
    66     int bpp;
    67 };
    68 extern struct colour_format colour_formats[];
    70 extern int colour_format_bytes[];
    72 /**
    73  * Structure to hold pixel data held in GL buffers.
    74  */
    75 struct render_buffer {
    76     uint32_t width;
    77     uint32_t height;
    78     uint32_t rowstride;
    79     uint32_t colour_format;
    80     sh4addr_t address; /* Address buffer was rendered to, or -1 for unrendered */
    81     uint32_t size; /* Size of buffer in bytes, must be width*height*bpp */
    82     gboolean inverted;/* True if the buffer is upside down */
    83     uint32_t scale;
    84     GLuint tex_id;    /* texture bound to render buffer, if any (0 = none). 
    85                        * The render buffer does not own the texture */
    86     unsigned int buf_id; /* driver-specific buffer id, if applicable */
    87     gboolean flushed; /* True if the buffer has been flushed to vram */
    88 };
    90 /**
    91  * Structure to hold pixel data stored in pvr2 vram, as opposed to data in
    92  * GL buffers.
    93  */
    94 struct frame_buffer {
    95     uint32_t width;
    96     uint32_t height;
    97     uint32_t rowstride;
    98     uint32_t colour_format;
    99     sh4addr_t address;
   100     uint32_t size; /* Size of buffer in bytes, must be width*height*bpp */
   101     gboolean inverted;/* True if the buffer is upside down */
   102     unsigned char *data;
   103 };
   105 struct display_capabilities {
   106     int stencil_bits; /* 0 = no stencil buffer */
   107 };
   109 /**
   110  * Core video driver - exports function to setup a GL context, as well as handle
   111  * keyboard input and display resultant output.
   112  */
   113 typedef struct display_driver {
   114     char *name;
   115     /**
   116      * Short (<60 chars) description of the driver. This should be marked for
   117      * localization.
   118      */
   119     char *description;
   120     /**
   121      * Initialize the driver. This is called only once at startup time, and
   122      * is guaranteed to be called before any other methods.
   123      * @return TRUE if the driver was successfully initialized, otherwise
   124      * FALSE.
   125      */
   126     gboolean (*init_driver)(void);
   128     /**
   129      * Cleanly shutdown the driver. Normally only called at system shutdown
   130      * time.
   131      */
   132     void (*shutdown_driver)(void);
   134     /**
   135      * Given a particular keysym, return the keycode associated with it.
   136      * @param keysym The keysym to be resolved, ie "Tab"
   137      * @return the display-specific keycode, or 0 if the keysym cannot
   138      * be resolved.
   139      */
   140     uint16_t (*resolve_keysym)( const gchar *keysym );
   142     /**
   143      * Given a native system keycode, convert it to a dreamcast keyboard code.
   144      */
   145     uint16_t (*convert_to_dckeysym)( uint16_t keycode );
   147     /**
   148      * Given a device-specific event code, return the corresponding keysym.
   149      * The string should be newly allocated (caller will free)
   150      */
   151     gchar *(*get_keysym_for_keycode)( uint16_t keycode );
   153     /**
   154      * Create a render target with the given width and height. If a texture ID
   155      * is supplied (non-zero), the render buffer writes its output to that texture.
   156      * @param tex_id 0 or a valid GL texture name which must have been initialized to
   157      * the correct dimensions. 
   158      */
   159     render_buffer_t (*create_render_buffer)( uint32_t width, uint32_t height, GLuint tex_id );
   161     /**
   162      * Destroy the specified render buffer and release any associated
   163      * resources.
   164      */
   165     void (*destroy_render_buffer)( render_buffer_t buffer );
   167     /**
   168      * Set the current rendering target to the specified buffer.
   169      */
   170     gboolean (*set_render_target)( render_buffer_t buffer );
   172     /**
   173      * Complete rendering and clear the current rendering target. If the 
   174      * buffer has a bound texture, it will be updated if necessary.
   175      */
   176     void (*finish_render)( render_buffer_t buffer );
   178     /**
   179      * Load the supplied frame buffer into the given render buffer.
   180      * Included here to allow driver-specific optimizations.
   181      */
   182     void (*load_frame_buffer)( frame_buffer_t frame, render_buffer_t render );
   184     /**
   185      * Display a single frame using a previously rendered GL buffer.
   186      */
   187     void (*display_render_buffer)( render_buffer_t buffer );
   189     /**
   190      * Display a single blanked frame using a fixed colour for the
   191      * entire frame (specified in BGR888 format). 
   192      */
   193     void (*display_blank)( uint32_t rgb );
   195     /**
   196      * Copy the image data from the GL buffer to the target memory buffer,
   197      * using the format etc from the buffer. This may force a glFinish()
   198      * but does not invalidate the buffer.
   199      * @param target buffer to fill with image data, which must be large enough
   200      *  to accomodate the image.
   201      * @param buffer Render buffer to read from.
   202      * @param rowstride rowstride of the target data
   203      * @param format colour format to output the data in.
   204      */
   205     gboolean (*read_render_buffer)( unsigned char *target, render_buffer_t buffer,
   206             int rowstride, int format );
   208     struct display_capabilities capabilities;
   209 } *display_driver_t;
   211 /**
   212  * Print the configured video drivers to the output stream, one to a line.
   213  */
   214 void print_display_drivers( FILE *out );
   215 display_driver_t get_display_driver_by_name( const char *name );
   216 gboolean display_set_driver( display_driver_t driver );
   218 extern uint32_t pvr2_frame_counter;
   220 extern display_driver_t display_driver;
   222 extern struct display_driver display_gtk_driver;
   223 extern struct display_driver display_osx_driver;
   224 extern struct display_driver display_null_driver;
   226 /****************** Input methods **********************/
   228 #define MAX_MOUSE_BUTTONS 32
   230 typedef void (*input_key_callback_t)( void *data, uint32_t value, uint32_t pressure, gboolean isKeyDown );
   232 /**
   233  * Callback to receive mouse input events
   234  * @param data pointer passed in at the time the hook was registered
   235  * @param buttons bitmask of button states, where bit 0 is button 0 (left), bit 1 is button
   236  * 1 (middle), bit 2 is button 2 (right) and so forth.
   237  * @param x Horizontal movement since the last invocation (in relative mode) or window position 
   238  * (in absolute mode).
   239  * @param y Vertical movement since the last invocation (in relative mode) or window position
   240  * (in absolute mode).
   241  * @param absolute If TRUE, x and y are the current window coordinates 
   242  *  of the mouse cursor. Otherwise, x and y are deltas from the previous mouse position.
   243  */
   244 typedef void (*input_mouse_callback_t)( void *data, uint32_t buttons, int32_t x, int32_t y, gboolean absolute );
   246 gboolean input_register_key( const gchar *keysym, input_key_callback_t callback,
   247                              void *data, uint32_t value );
   249 void input_unregister_key( const gchar *keysym, input_key_callback_t callback,
   250                            void *data, uint32_t value );
   252 /**
   253  * Register a hook to receive all keyboard input events
   254  */
   255 gboolean input_register_keyboard_hook( input_key_callback_t callback, void *data );
   256 void input_unregister_keyboard_hook( input_key_callback_t callback, void *data );
   258 /**
   259  * Register a mouse event hook.
   260  * @param relative TRUE if the caller wants relative mouse movement, FALSE for
   261  * absolute mouse positioning. It's not generally possible to receive both at the same time.
   262  */
   263 gboolean input_register_mouse_hook( gboolean relative, input_mouse_callback_t callback, void *data );
   264 void input_unregister_mouse_hook( input_mouse_callback_t callback, void *data );
   266 gboolean input_is_key_valid( const gchar *keysym );
   268 gboolean input_is_key_registered( const gchar *keysym );
   270 uint16_t input_keycode_to_dckeysym( uint16_t keycode );
   272 /********************** Display/Input methods ***********************/
   274 /**
   275  * Auxilliary input driver - provides input separate to and in addition to the
   276  * core UI/display. (primarily used for joystick devices)
   277  */
   278 typedef struct input_driver {
   279     const char *id; /* Short identifier to display in the UI for the device (eg "JS0" ) */
   281     /**
   282      * Given a particular keysym, return the keycode associated with it.
   283      * @param keysym The keysym to be resolved, ie "Tab"
   284      * @return the display-specific keycode, or 0 if the keysym cannot
   285      * be resolved.
   286      */
   287     uint16_t (*resolve_keysym)( struct input_driver *driver, const gchar *keysym );
   289     /**
   290      * Given a device-specific event code, convert it to a dreamcast keyboard code.
   291      * This is only required for actual keyboard devices, other devices should just
   292      * leave this method NULL.
   293      */
   294     uint16_t (*convert_to_dckeysym)( struct input_driver *driver, uint16_t keycode );
   296     /**
   297      * Given a device-specific event code, return the corresponding keysym.
   298      * The string should be newly allocated (caller will free)
   299      */
   300     gchar *(*get_keysym_for_keycode)( struct input_driver *driver, uint16_t keycode );
   302     /**
   303      * Destroy the input driver.
   304      */
   305     void (*destroy)( struct input_driver *driver );
   307 } *input_driver_t;       
   309 extern struct input_driver system_mouse_driver;
   311 /**
   312  * Register a new input driver (which must have a unique name)
   313  * @param driver the driver to register
   314  * @param max_keycode the highest possible keycode reported by the device
   315  * @return TRUE on success, FALSE on failure (eg driver already registed).
   316  */
   317 gboolean input_register_device( input_driver_t driver, uint16_t max_keycode );
   319 /**
   320  * Determine if the system has an input driver with the given unique ID.
   321  * @param id driver id to check
   322  * @return TRUE if the device exists, otherwise FALSE
   323  */
   324 gboolean input_has_device( const gchar *id );
   326 /**
   327  * Unregister an input driver.
   328  * @param driver the driver to unregister
   329  * If the driver is not in fact registered, this function has no effect.
   330  */
   331 void input_unregister_device( input_driver_t driver );
   333 /**
   334  * Called from the UI to indicate that the emulation window is focused (ie
   335  * able to receive input). This method is used to gate non-UI input devices -
   336  * when the display is not focused, all input events will be silently ignored.
   337  */
   338 void display_set_focused( gboolean has_focus );
   340 void input_event_keydown( input_driver_t input, uint16_t keycode, uint32_t pressure );
   342 void input_event_keyup( input_driver_t input, uint16_t keycode, uint32_t pressure );
   344 /**
   345  * Receive an input mouse down event. Normally these should be absolute events when
   346  * the mouse is not grabbed, and relative when it is.
   347  * @param button the button pressed, where 0 == first button
   348  * @param x_axis The relative or absolute position of the mouse cursor on the X axis
   349  * @param y_axis The relative or absolute position of the mouse cursor on the Y axis
   350  * @param absolute If TRUE, x_axis and y_axis are the current window coordinates 
   351  *  of the mouse cursor. Otherwise, x_axis and y_axis are deltas from the previous mouse position.
   352  */
   353 void input_event_mousedown( uint16_t button, int32_t x_axis, int32_t y_axis, gboolean absolute );
   355 /**
   356  * Receive an input mouse up event. Normally these should be absolute events when
   357  * the mouse is not grabbed, and relative when it is.
   358  * @param button the button released, where 0 == first button
   359  * @param x_axis The relative or absolute position of the mouse cursor on the X axis
   360  * @param y_axis The relative or absolute position of the mouse cursor on the Y axis
   361  * @param absolute If TRUE, x_axis and y_axis are the current window coordinates 
   362  *  of the mouse cursor. Otherwise, x_axis and y_axis are deltas from the previous mouse position.
   363  */
   364 void input_event_mouseup( uint16_t button, int32_t x_axis, int32_t y_axis, gboolean absolute );
   366 /**
   367  * Receive an input mouse motion event. Normally these should be absolute events when
   368  * the mouse is not grabbed, and relative when it is.
   369  * @param x_axis The relative or absolute position of the mouse cursor on the X axis
   370  * @param y_axis The relative or absolute position of the mouse cursor on the Y axis
   371  * @param absolute If TRUE, x_axis and y_axis are the current window coordinates 
   372  *  of the mouse cursor. Otherwise, x_axis and y_axis are deltas from the previous mouse position.
   373  */
   374 void input_event_mousemove( int32_t x_axis, int32_t y_axis, gboolean absolute );
   376 /**
   377  * Given a keycode and the originating input driver, return the corresponding 
   378  * keysym. The caller is responsible for freeing the string.
   379  * @return a newly allocated string, or NULL of the keycode is unresolvable.
   380  */
   381 gchar *input_keycode_to_keysym( input_driver_t driver, uint16_t keycode );
   383 typedef void (*display_keysym_callback_t)( void *data, const gchar *keysym );
   385 /**
   386  * Set the keysym hook function (normally used by the UI to receive non-UI
   387  * input events during configuration.
   388  */
   389 void input_set_keysym_hook( display_keysym_callback_t hook, void *data );
   393 #ifdef __cplusplus
   394 }
   395 #endif
   396 #endif /* !lxdream_display_H */
.