Search
lxdream.org :: lxdream/src/display.h
lxdream 0.9.1
released Jun 29
Download Now
filename src/display.h
changeset 681:1755a126b109
prev674:377d987db8f2
next700:4650d0c7f6f9
author nkeynes
date Sat Jun 14 11:54:15 2008 +0000 (15 years ago)
permissions -rw-r--r--
last change Change colour params to float
Convert background processing over to scene structure (fixes some depth issues as well)
Add color unclamp when supported
file annotate diff log raw
nkeynes@144
     1
/**
nkeynes@561
     2
 * $Id$
nkeynes@144
     3
 *
nkeynes@144
     4
 * The PC side of the video support (responsible for actually displaying / 
nkeynes@144
     5
 * rendering frames)
nkeynes@144
     6
 *
nkeynes@144
     7
 * Copyright (c) 2005 Nathan Keynes.
nkeynes@144
     8
 *
nkeynes@144
     9
 * This program is free software; you can redistribute it and/or modify
nkeynes@144
    10
 * it under the terms of the GNU General Public License as published by
nkeynes@144
    11
 * the Free Software Foundation; either version 2 of the License, or
nkeynes@144
    12
 * (at your option) any later version.
nkeynes@144
    13
 *
nkeynes@144
    14
 * This program is distributed in the hope that it will be useful,
nkeynes@144
    15
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
nkeynes@144
    16
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
nkeynes@144
    17
 * GNU General Public License for more details.
nkeynes@144
    18
 */
nkeynes@144
    19
nkeynes@144
    20
#ifndef dream_video_H
nkeynes@144
    21
#define dream_video_H
nkeynes@144
    22
nkeynes@669
    23
#define GL_GLEXT_PROTOTYPES 1
nkeynes@669
    24
nkeynes@144
    25
#include <stdint.h>
nkeynes@144
    26
#include <glib.h>
nkeynes@540
    27
#include "lxdream.h"
nkeynes@540
    28
#ifdef APPLE_BUILD
nkeynes@540
    29
#include <OpenGL/gl.h>
nkeynes@540
    30
#include <OpenGL/glext.h>
nkeynes@540
    31
#else
nkeynes@327
    32
#include <GL/gl.h>
nkeynes@540
    33
#include <GL/glext.h>
nkeynes@540
    34
#endif
nkeynes@144
    35
nkeynes@144
    36
#ifdef __cplusplus
nkeynes@144
    37
extern "C" {
nkeynes@144
    38
#endif
nkeynes@144
    39
nkeynes@144
    40
/**
nkeynes@477
    41
 * Supported colour formats. Note that BGRA4444 is only ever used for texture
nkeynes@144
    42
 * rendering (it's not valid for display purposes).
nkeynes@144
    43
 */
nkeynes@477
    44
#define COLFMT_BGRA1555  0
nkeynes@144
    45
#define COLFMT_RGB565    1
nkeynes@477
    46
#define COLFMT_BGRA4444  2
nkeynes@144
    47
#define COLFMT_YUV422    3 /* 8-bit YUV (texture source only) */
nkeynes@477
    48
#define COLFMT_BGR888    4 /* 24-bit BGR */
nkeynes@477
    49
#define COLFMT_BGRA8888  5
nkeynes@144
    50
#define COLFMT_INDEX4    6 /* 4 bit indexed colour (texture source only) */
nkeynes@144
    51
#define COLFMT_INDEX8    7 /* 8-bit indexed colour (texture source only) */
nkeynes@477
    52
#define COLFMT_BGR0888   8 /* 32-bit BGR */
nkeynes@477
    53
#define COLFMT_RGB888    9 /* 24-bit RGB (ie GL native) */
nkeynes@327
    54
nkeynes@327
    55
struct colour_format {
nkeynes@327
    56
    GLint type, format, int_format;
nkeynes@327
    57
    int bpp;
nkeynes@327
    58
};
nkeynes@327
    59
extern struct colour_format colour_formats[];
nkeynes@144
    60
nkeynes@162
    61
extern int colour_format_bytes[];
nkeynes@162
    62
nkeynes@352
    63
/**
nkeynes@352
    64
 * Structure to hold pixel data held in GL buffers.
nkeynes@352
    65
 */
nkeynes@477
    66
struct render_buffer {
nkeynes@352
    67
    uint32_t width;
nkeynes@352
    68
    uint32_t height;
nkeynes@144
    69
    uint32_t rowstride;
nkeynes@674
    70
    uint32_t colour_format;
nkeynes@352
    71
    sh4addr_t address; /* Address buffer was rendered to, or -1 for unrendered */
nkeynes@352
    72
    uint32_t size; /* Size of buffer in bytes, must be width*height*bpp */
nkeynes@477
    73
    gboolean inverted;/* True if the buffer is upside down */
nkeynes@674
    74
    uint32_t scale;
nkeynes@424
    75
    unsigned int buf_id; /* driver-specific buffer id, if applicable */
nkeynes@352
    76
    gboolean flushed; /* True if the buffer has been flushed to vram */
nkeynes@477
    77
};
nkeynes@144
    78
nkeynes@144
    79
/**
nkeynes@352
    80
 * Structure to hold pixel data stored in pvr2 vram, as opposed to data in
nkeynes@352
    81
 * GL buffers.
nkeynes@352
    82
 */
nkeynes@477
    83
struct frame_buffer {
nkeynes@352
    84
    uint32_t width;
nkeynes@352
    85
    uint32_t height;
nkeynes@352
    86
    uint32_t rowstride;
nkeynes@674
    87
    uint32_t colour_format;
nkeynes@352
    88
    sh4addr_t address;
nkeynes@352
    89
    uint32_t size; /* Size of buffer in bytes, must be width*height*bpp */
nkeynes@477
    90
    gboolean inverted;/* True if the buffer is upside down */
nkeynes@502
    91
    unsigned char *data;
nkeynes@477
    92
};
nkeynes@352
    93
nkeynes@352
    94
/**
nkeynes@352
    95
 * Core video driver - exports function to setup a GL context, as well as handle
nkeynes@352
    96
 * keyboard input and display resultant output.
nkeynes@144
    97
 */
nkeynes@144
    98
typedef struct display_driver {
nkeynes@144
    99
    char *name;
nkeynes@144
   100
    /**
nkeynes@144
   101
     * Initialize the driver. This is called only once at startup time, and
nkeynes@144
   102
     * is guaranteed to be called before any other methods.
nkeynes@144
   103
     * @return TRUE if the driver was successfully initialized, otherwise
nkeynes@144
   104
     * FALSE.
nkeynes@144
   105
     */
nkeynes@144
   106
    gboolean (*init_driver)(void);
nkeynes@144
   107
nkeynes@144
   108
    /**
nkeynes@144
   109
     * Cleanly shutdown the driver. Normally only called at system shutdown
nkeynes@144
   110
     * time.
nkeynes@144
   111
     */
nkeynes@144
   112
    void (*shutdown_driver)(void);
nkeynes@144
   113
nkeynes@144
   114
    /**
nkeynes@144
   115
     * Given a particular keysym, return the keycode associated with it.
nkeynes@144
   116
     * @param keysym The keysym to be resolved, ie "Tab"
nkeynes@144
   117
     * @return the display-specific keycode, or 0 if the keysym cannot
nkeynes@144
   118
     * be resolved.
nkeynes@144
   119
     */
nkeynes@144
   120
    uint16_t (*resolve_keysym)( const gchar *keysym );
nkeynes@144
   121
nkeynes@144
   122
    /**
nkeynes@608
   123
     * Given a native system keycode, convert it to a dreamcast keyboard code.
nkeynes@608
   124
     */
nkeynes@608
   125
    uint16_t (*convert_to_dckeysym)( uint16_t keycode );
nkeynes@608
   126
nkeynes@608
   127
    /**
nkeynes@614
   128
     * Given a device-specific event code, return the corresponding keysym.
nkeynes@614
   129
     * The string should be newly allocated (caller will free)
nkeynes@614
   130
     */
nkeynes@614
   131
    gchar *(*get_keysym_for_keycode)( uint16_t keycode );
nkeynes@614
   132
nkeynes@614
   133
    /**
nkeynes@352
   134
     * Create a render target with the given width and height.
nkeynes@144
   135
     */
nkeynes@352
   136
    render_buffer_t (*create_render_buffer)( uint32_t width, uint32_t height );
nkeynes@144
   137
nkeynes@144
   138
    /**
nkeynes@352
   139
     * Destroy the specified render buffer and release any associated
nkeynes@352
   140
     * resources.
nkeynes@144
   141
     */
nkeynes@352
   142
    void (*destroy_render_buffer)( render_buffer_t buffer );
nkeynes@352
   143
nkeynes@144
   144
    /**
nkeynes@352
   145
     * Set the current rendering target to the specified buffer.
nkeynes@144
   146
     */
nkeynes@352
   147
    gboolean (*set_render_target)( render_buffer_t buffer );
nkeynes@352
   148
nkeynes@352
   149
    /**
nkeynes@477
   150
     * Load the supplied frame buffer into the given render buffer.
nkeynes@477
   151
     * Included here to allow driver-specific optimizations.
nkeynes@352
   152
     */
nkeynes@477
   153
    void (*load_frame_buffer)( frame_buffer_t frame, render_buffer_t render );
nkeynes@352
   154
nkeynes@352
   155
    /**
nkeynes@352
   156
     * Display a single frame using a previously rendered GL buffer.
nkeynes@352
   157
     */
nkeynes@669
   158
    void (*display_render_buffer)( render_buffer_t buffer );
nkeynes@144
   159
nkeynes@144
   160
    /**
nkeynes@144
   161
     * Display a single blanked frame using a fixed colour for the
nkeynes@477
   162
     * entire frame (specified in BGR888 format). 
nkeynes@144
   163
     */
nkeynes@669
   164
    void (*display_blank)( uint32_t rgb );
nkeynes@144
   165
nkeynes@144
   166
    /**
nkeynes@352
   167
     * Copy the image data from the GL buffer to the target memory buffer,
nkeynes@352
   168
     * using the format etc from the buffer. This may force a glFinish()
nkeynes@352
   169
     * but does not invalidate the buffer.
nkeynes@477
   170
     * @param target buffer to fill with image data, which must be large enough
nkeynes@477
   171
     *  to accomodate the image.
nkeynes@477
   172
     * @param buffer Render buffer to read from.
nkeynes@477
   173
     * @param rowstride rowstride of the target data
nkeynes@477
   174
     * @param format colour format to output the data in.
nkeynes@144
   175
     */
nkeynes@477
   176
    gboolean (*read_render_buffer)( unsigned char *target, render_buffer_t buffer,
nkeynes@477
   177
				    int rowstride, int format );
nkeynes@352
   178
nkeynes@144
   179
} *display_driver_t;
nkeynes@144
   180
nkeynes@531
   181
display_driver_t get_display_driver_by_name( const char *name );
nkeynes@370
   182
gboolean display_set_driver( display_driver_t driver );
nkeynes@144
   183
nkeynes@144
   184
extern uint32_t pvr2_frame_counter;
nkeynes@144
   185
nkeynes@144
   186
extern display_driver_t display_driver;
nkeynes@144
   187
nkeynes@144
   188
extern struct display_driver display_gtk_driver;
nkeynes@681
   189
extern struct display_driver display_osx_driver;
nkeynes@144
   190
extern struct display_driver display_null_driver;
nkeynes@144
   191
nkeynes@144
   192
/****************** Input methods **********************/
nkeynes@144
   193
nkeynes@614
   194
typedef void (*input_key_callback_t)( void *data, uint32_t value, uint32_t pressure, gboolean isKeyDown );
nkeynes@144
   195
nkeynes@608
   196
/**
nkeynes@608
   197
 * Callback to receive mouse input events
nkeynes@608
   198
 * @param data pointer passed in at the time the hook was registered
nkeynes@608
   199
 * @param buttons bitmask of button states, where bit 0 is button 0 (left), bit 1 is button
nkeynes@608
   200
 * 1 (middle), bit 2 is button 2 (right) and so forth.
nkeynes@608
   201
 * @param x Horizontal movement since the last invocation (in relative mode) or window position 
nkeynes@608
   202
 * (in absolute mode).
nkeynes@608
   203
 * @param y Vertical movement since the last invocation (in relative mode) or window position
nkeynes@608
   204
 * (in absolute mode).
nkeynes@608
   205
 */
nkeynes@608
   206
typedef void (*input_mouse_callback_t)( void *data, uint32_t buttons, int32_t x, int32_t y );
nkeynes@608
   207
nkeynes@144
   208
gboolean input_register_key( const gchar *keysym, input_key_callback_t callback,
nkeynes@144
   209
			     void *data, uint32_t value );
nkeynes@144
   210
nkeynes@451
   211
void input_unregister_key( const gchar *keysym, input_key_callback_t callback,
nkeynes@451
   212
			   void *data, uint32_t value );
nkeynes@144
   213
nkeynes@608
   214
/**
nkeynes@608
   215
 * Register a hook to receive all input events
nkeynes@608
   216
 */
nkeynes@608
   217
gboolean input_register_hook( input_key_callback_t callback, void *data );
nkeynes@608
   218
void input_unregister_hook( input_key_callback_t callback, void *data );
nkeynes@608
   219
nkeynes@608
   220
/**
nkeynes@608
   221
 * Register a mouse event hook.
nkeynes@608
   222
 * @param relative TRUE if the caller wants relative mouse movement, FALSE for
nkeynes@608
   223
 * absolute mouse positioning. It's not generally possible to receive both at the same time.
nkeynes@608
   224
 */
nkeynes@608
   225
gboolean input_register_mouse_hook( gboolean relative, input_mouse_callback_t callback, void *data );
nkeynes@608
   226
void input_unregister_mouse_hook( input_mouse_callback_t callback, void *data );
nkeynes@608
   227
nkeynes@144
   228
gboolean input_is_key_valid( const gchar *keysym );
nkeynes@144
   229
nkeynes@144
   230
gboolean input_is_key_registered( const gchar *keysym );
nkeynes@144
   231
nkeynes@614
   232
uint16_t input_keycode_to_dckeysym( uint16_t keycode );
nkeynes@144
   233
nkeynes@614
   234
/********************** Display/Input methods ***********************/
nkeynes@614
   235
nkeynes@614
   236
/**
nkeynes@614
   237
 * Auxilliary input driver - provides input separate to and in addition to the
nkeynes@614
   238
 * core UI/display. (primarily used for joystick devices)
nkeynes@614
   239
 */
nkeynes@614
   240
typedef struct input_driver {
nkeynes@614
   241
    const char *id; /* Short identifier to display in the UI for the device (eg "JS0" ) */
nkeynes@614
   242
nkeynes@614
   243
    /**
nkeynes@614
   244
     * Given a particular keysym, return the keycode associated with it.
nkeynes@614
   245
     * @param keysym The keysym to be resolved, ie "Tab"
nkeynes@614
   246
     * @return the display-specific keycode, or 0 if the keysym cannot
nkeynes@614
   247
     * be resolved.
nkeynes@614
   248
     */
nkeynes@614
   249
    uint16_t (*resolve_keysym)( struct input_driver *driver, const gchar *keysym );
nkeynes@614
   250
nkeynes@614
   251
    /**
nkeynes@614
   252
     * Given a device-specific event code, convert it to a dreamcast keyboard code.
nkeynes@614
   253
     * This is only required for actual keyboard devices, other devices should just
nkeynes@614
   254
     * leave this method NULL.
nkeynes@614
   255
     */
nkeynes@614
   256
    uint16_t (*convert_to_dckeysym)( struct input_driver *driver, uint16_t keycode );
nkeynes@614
   257
nkeynes@614
   258
    /**
nkeynes@614
   259
     * Given a device-specific event code, return the corresponding keysym.
nkeynes@614
   260
     * The string should be newly allocated (caller will free)
nkeynes@614
   261
     */
nkeynes@614
   262
    gchar *(*get_keysym_for_keycode)( struct input_driver *driver, uint16_t keycode );
nkeynes@614
   263
nkeynes@614
   264
    /**
nkeynes@614
   265
     * Destroy the input driver.
nkeynes@614
   266
     */
nkeynes@614
   267
    void (*destroy)( struct input_driver *driver );
nkeynes@614
   268
nkeynes@614
   269
} *input_driver_t;       
nkeynes@614
   270
nkeynes@614
   271
/**
nkeynes@614
   272
 * Register a new input driver (which must have a unique name)
nkeynes@614
   273
 * @param driver the driver to register
nkeynes@614
   274
 * @param max_keycode the highest possible keycode reported by the device
nkeynes@614
   275
 * @return TRUE on success, FALSE on failure (eg driver already registed).
nkeynes@614
   276
 */
nkeynes@614
   277
gboolean input_register_device( input_driver_t driver, uint16_t max_keycode );
nkeynes@614
   278
nkeynes@614
   279
/**
nkeynes@615
   280
 * Determine if the system has an input driver with the given unique ID.
nkeynes@615
   281
 * @param id driver id to check
nkeynes@615
   282
 * @return TRUE if the device exists, otherwise FALSE
nkeynes@615
   283
 */
nkeynes@615
   284
gboolean input_has_device( const gchar *id );
nkeynes@615
   285
nkeynes@615
   286
/**
nkeynes@614
   287
 * Unregister an input driver.
nkeynes@614
   288
 * @param driver the driver to unregister
nkeynes@614
   289
 * If the driver is not in fact registered, this function has no effect.
nkeynes@614
   290
 */
nkeynes@614
   291
void input_unregister_device( input_driver_t driver );
nkeynes@614
   292
nkeynes@614
   293
/**
nkeynes@614
   294
 * Called from the UI to indicate that the emulation window is focused (ie
nkeynes@614
   295
 * able to receive input). This method is used to gate non-UI input devices -
nkeynes@614
   296
 * when the display is not focused, all input events will be silently ignored.
nkeynes@614
   297
 */
nkeynes@614
   298
void display_set_focused( gboolean has_focus );
nkeynes@614
   299
nkeynes@614
   300
void input_event_keydown( input_driver_t input, uint16_t keycode, uint32_t pressure );
nkeynes@614
   301
nkeynes@614
   302
void input_event_keyup( input_driver_t input, uint16_t keycode, uint32_t pressure );
nkeynes@144
   303
nkeynes@608
   304
void input_event_mouse( uint32_t buttons, int32_t x_axis, int32_t y_axis );
nkeynes@144
   305
nkeynes@614
   306
nkeynes@614
   307
typedef void (*display_keysym_callback_t)( void *data, const gchar *keysym );
nkeynes@614
   308
nkeynes@614
   309
/**
nkeynes@614
   310
 * Set the keysym hook function (normally used by the UI to receive non-UI
nkeynes@614
   311
 * input events during configuration.
nkeynes@614
   312
 */
nkeynes@614
   313
void input_set_keysym_hook( display_keysym_callback_t hook, void *data );
nkeynes@614
   314
nkeynes@614
   315
nkeynes@144
   316
nkeynes@144
   317
#ifdef __cplusplus
nkeynes@144
   318
}
nkeynes@144
   319
#endif
nkeynes@144
   320
#endif
.