mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-02 14:36:41 +00:00
265 lines
21 KiB
C
265 lines
21 KiB
C
/* GStreamer
|
|
* Copyright (C) 2011 David Hoyt <dhoyt@hoytsoft.org>
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Library General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2 of the License, or (at your option) any later version.
|
|
*
|
|
* This library 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
|
|
* Library General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Library General Public
|
|
* License along with this library; if not, write to the
|
|
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
|
|
* Boston, MA 02110-1301, USA.
|
|
*/
|
|
|
|
#ifndef __DIRECTX_DX_H__
|
|
#define __DIRECTX_DX_H__
|
|
|
|
#include <glib.h>
|
|
#include <gmodule.h>
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
#define WM_DIRECTX WM_USER + 500
|
|
|
|
#define DIRECTX_VERSION_UNKNOWN 0
|
|
|
|
#define DIRECTX_VERSION_ENCODE_FULL(major, minor, micro) ( \
|
|
((major) * 10000) \
|
|
+ ((minor) * 100) \
|
|
+ ((micro) * 1))
|
|
|
|
#define DIRECTX_VERSION_ENCODE(major) \
|
|
DIRECTX_VERSION_ENCODE_FULL(major, 0, 0)
|
|
|
|
typedef enum
|
|
{
|
|
DIRECTX_UNKNOWN = DIRECTX_VERSION_UNKNOWN,
|
|
DIRECTX_9 = DIRECTX_VERSION_ENCODE(9),
|
|
DIRECTX_10 = DIRECTX_VERSION_ENCODE(10),
|
|
DIRECTX_10_1 = DIRECTX_VERSION_ENCODE_FULL(10, 1, 0),
|
|
DIRECTX_11 = DIRECTX_VERSION_ENCODE(11)
|
|
} DirectXVersion;
|
|
|
|
#define DIRECTX_API(version, initialization_function, module_test, symbol_test, i18n_key, description) \
|
|
static DirectXAPIComponent DIRECTX_ ## version ## _DIRECT3D_COMPONENT = { \
|
|
NULL /*api*/ \
|
|
, FALSE /*initialized*/ \
|
|
, NULL /*initialize*/ \
|
|
, NULL /*module*/ \
|
|
, NULL /*module_name*/ \
|
|
, NULL /*private_data*/ \
|
|
}; \
|
|
static DirectXAPIComponent DIRECTX_ ## version ## _DIRECTINPUT_COMPONENT = { \
|
|
NULL /*api*/ \
|
|
, FALSE /*initialized*/ \
|
|
, NULL /*initialize*/ \
|
|
, NULL /*module*/ \
|
|
, NULL /*module_name*/ \
|
|
, NULL /*private_data*/ \
|
|
}; \
|
|
static DirectXAPIComponent DIRECTX_ ## version ## _DIRECTSOUND_COMPONENT = { \
|
|
NULL /*api*/ \
|
|
, FALSE /*initialized*/ \
|
|
, NULL /*initialize*/ \
|
|
, NULL /*module*/ \
|
|
, NULL /*module_name*/ \
|
|
, NULL /*private_data*/ \
|
|
}; \
|
|
static DirectXAPIComponent DIRECTX_ ## version ## _DIRECTWRITE_COMPONENT = { \
|
|
NULL /*api*/ \
|
|
, FALSE /*initialized*/ \
|
|
, NULL /*initialize*/ \
|
|
, NULL /*module*/ \
|
|
, NULL /*module_name*/ \
|
|
, NULL /*private_data*/ \
|
|
}; \
|
|
static DirectXAPIComponent DIRECTX_ ## version ## _DIRECT2D_COMPONENT = { \
|
|
NULL /*api*/ \
|
|
, FALSE /*initialized*/ \
|
|
, NULL /*initialize*/ \
|
|
, NULL /*module*/ \
|
|
, NULL /*module_name*/ \
|
|
, NULL /*private_data*/ \
|
|
}; \
|
|
static DirectXAPIComponent DIRECTX_ ## version ## _DIRECTCOMPUTE_COMPONENT = { \
|
|
NULL /*api*/ \
|
|
, FALSE /*initialized*/ \
|
|
, NULL /*initialize*/ \
|
|
, NULL /*module*/ \
|
|
, NULL /*module_name*/ \
|
|
, NULL /*private_data*/ \
|
|
}; \
|
|
static DirectXAPI DIRECTX_ ## version ## _API = { \
|
|
version \
|
|
, module_test "." G_MODULE_SUFFIX \
|
|
, symbol_test \
|
|
, i18n_key \
|
|
, description \
|
|
, FALSE \
|
|
, initialization_function \
|
|
, &DIRECTX_ ## version ## _DIRECT3D_COMPONENT \
|
|
, &DIRECTX_ ## version ## _DIRECTINPUT_COMPONENT \
|
|
, &DIRECTX_ ## version ## _DIRECTSOUND_COMPONENT \
|
|
, &DIRECTX_ ## version ## _DIRECTWRITE_COMPONENT \
|
|
, &DIRECTX_ ## version ## _DIRECT2D_COMPONENT \
|
|
, &DIRECTX_ ## version ## _DIRECTCOMPUTE_COMPONENT \
|
|
, {NULL, NULL, NULL} /*reserved*/ \
|
|
}; \
|
|
static void G_GNUC_UNUSED init_directx_ ## version ## _supported_api(void) { \
|
|
DirectXAPI* api; \
|
|
api = &DIRECTX_ ## version ## _API; \
|
|
api->d3d->api = api; \
|
|
api->dinput->api = api; \
|
|
api->dsound->api = api; \
|
|
api->dwrite->api = api; \
|
|
api->d2d->api = api; \
|
|
api->dcompute->api = api; \
|
|
directx_add_supported_api(api); \
|
|
}
|
|
|
|
#define INITIALIZE_SUPPORTED_DIRECTX_API(version) \
|
|
init_directx_ ## version ## _supported_api();
|
|
|
|
#define DIRECTX_COMPONENT_INIT(component) \
|
|
{ \
|
|
if (component != NULL && component->initialize != NULL && !component->initialized) { \
|
|
component->initialize(component, DIRECTX_COMPONENT_DATA(component)); \
|
|
} \
|
|
}
|
|
|
|
#define DIRECTX_OPEN_COMPONENT_MODULE(component, component_module_name) \
|
|
{ \
|
|
GModule* lib; \
|
|
if (component && component->module == NULL && (lib = g_module_open(component_module_name "." G_MODULE_SUFFIX, G_MODULE_BIND_LAZY)) != NULL) { \
|
|
component->module_name = component_module_name "." G_MODULE_SUFFIX; \
|
|
component->module = lib; \
|
|
} \
|
|
}
|
|
|
|
#define DIRECTX_OPEN_COMPONENT_SYMBOL(component, dispatch_table_type, component_symbol_name) \
|
|
{ \
|
|
gpointer symbol; \
|
|
if (component && component->module && g_module_symbol(component->module, #component_symbol_name, &symbol)) { \
|
|
((dispatch_table_type*)component->vtable)->component_symbol_name = symbol; \
|
|
} \
|
|
}
|
|
|
|
#define DIRECTX_CALL_COMPONENT_SYMBOL(component, dispatch_table_type, component_symbol_name, ...) \
|
|
(((dispatch_table_type*)component->vtable)->component_symbol_name(__VA_ARGS__))
|
|
|
|
|
|
/* Borrowed from GST_FUNCTION */
|
|
#ifndef DIRECTX_FUNCTION
|
|
#if defined (__GNUC__) || (defined (_MSC_VER) && _MSC_VER >= 1300)
|
|
# define DIRECTX_FUNCTION ((const char*) (__FUNCTION__))
|
|
#elif defined (__STDC__) && defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
|
|
# define DIRECTX_FUNCTION ((const char*) (__func__))
|
|
#else
|
|
# define DIRECTX_FUNCTION ((const char*) ("???"))
|
|
#endif
|
|
#endif
|
|
|
|
#define DIRECTX_DEBUG(...) (directx_log_debug(__FILE__, DIRECTX_FUNCTION, __LINE__, __VA_ARGS__))
|
|
#define DIRECTX_WARNING(...) (directx_log_warning(__FILE__, DIRECTX_FUNCTION, __LINE__, __VA_ARGS__))
|
|
#define DIRECTX_ERROR(...) (directx_log_error(__FILE__, DIRECTX_FUNCTION, __LINE__, __VA_ARGS__))
|
|
|
|
#define DIRECTX_COMPONENT_API(component) (component->api)
|
|
#define DIRECTX_COMPONENT_DATA(component) (component->private_data)
|
|
#define DIRECTX_SET_COMPONENT_DATA(component, data) (component->private_data = data)
|
|
#define DIRECTX_SET_COMPONENT_INIT(component, init_function) (component->initialize = init_function)
|
|
#define DIRECTX_SET_COMPONENT_DISPATCH_TABLE(component, dispatch_table) (component->vtable = dispatch_table)
|
|
#define DIRECTX_VERSION_IS_UNKNOWN(version) (version == DIRECTX_VERSION_UNKNOWN)
|
|
#define DIRECTX_SUPPORTED_API_IS_LAST(lib) (lib == NULL || lib->version == DIRECTX_VERSION_UNKNOWN || lib->module_name == NULL)
|
|
|
|
typedef struct _DirectXInitParams DirectXInitParams;
|
|
typedef struct _DirectXAPI DirectXAPI;
|
|
typedef struct _DirectXAPIComponent DirectXAPIComponent;
|
|
|
|
/* Function pointers */
|
|
typedef void (*DirectXInitializationFunction) (const DirectXAPI* api);
|
|
typedef void (*DirectXLogFunction) (const gchar* file, const gchar* function, gint line, const gchar* format, va_list args); /* vprintf-style logging function */
|
|
|
|
struct _DirectXInitParams
|
|
{
|
|
DirectXLogFunction log_debug;
|
|
DirectXLogFunction log_warning;
|
|
DirectXLogFunction log_error;
|
|
};
|
|
|
|
struct _DirectXAPI
|
|
{
|
|
gint version;
|
|
const gchar* module_test;
|
|
const gchar* symbol_test;
|
|
const gchar* i18n_key;
|
|
const gchar* description;
|
|
gboolean initialized;
|
|
DirectXInitializationFunction initialize;
|
|
DirectXAPIComponent* d3d;
|
|
DirectXAPIComponent* dinput;
|
|
DirectXAPIComponent* dsound;
|
|
DirectXAPIComponent* dwrite;
|
|
DirectXAPIComponent* d2d;
|
|
DirectXAPIComponent* dcompute;
|
|
gpointer reserved[3];
|
|
};
|
|
|
|
#define DIRECTX_D3D(api) (api->d3d)
|
|
#define DIRECTX_DINPUT(api) (api->dinput)
|
|
#define DIRECTX_DSOUND(api) (api->dsound)
|
|
#define DIRECTX_DWRITE(api) (api->dwrite)
|
|
#define DIRECTX_D2D(api) (api->d2d)
|
|
#define DIRECTX_DCOMPUTE(api) (api->dcompute)
|
|
|
|
#define DIRECTX_D3D_COMPONENT_DATA(api) (DIRECTX_COMPONENT_DATA(DIRECTX_D3D(api)))
|
|
#define DIRECTX_DINPUT_COMPONENT_DATA(api) (DIRECTX_COMPONENT_DATA(DIRECTX_DINPUT(api)))
|
|
#define DIRECTX_DSOUND_COMPONENT_DATA(api) (DIRECTX_COMPONENT_DATA(DIRECTX_DSOUND(api)))
|
|
#define DIRECTX_DWRITE_COMPONENT_DATA(api) (DIRECTX_COMPONENT_DATA(DIRECTX_DWRITE(api)))
|
|
#define DIRECTX_D2D_COMPONENT_DATA(api) (DIRECTX_COMPONENT_DATA(DIRECTX_D2D(api)))
|
|
#define DIRECTX_DCOMPUTE_COMPONENT_DATA(api) (DIRECTX_COMPONENT_DATA(DIRECTX_DCOMPUTE(api)))
|
|
|
|
/* DirectX component function table */
|
|
typedef void (*DirectXComponentInitializeFunction) (DirectXAPIComponent* d3d, gpointer data);
|
|
struct _DirectXAPIComponent
|
|
{
|
|
DirectXAPI* api;
|
|
gboolean initialized;
|
|
DirectXComponentInitializeFunction initialize;
|
|
|
|
GModule* module;
|
|
const gchar* module_name;
|
|
|
|
gpointer vtable;
|
|
|
|
gpointer private_data;
|
|
};
|
|
|
|
gboolean directx_initialize (DirectXInitParams* init_params);
|
|
gboolean directx_is_initialized (void);
|
|
|
|
gboolean directx_is_supported (void);
|
|
|
|
void directx_log_debug(const gchar* file, const gchar* function, gint line, const gchar * format, ...);
|
|
void directx_log_warning(const gchar* file, const gchar* function, gint line, const gchar * format, ...);
|
|
void directx_log_error(const gchar* file, const gchar* function, gint line, const gchar * format, ...);
|
|
|
|
GList* directx_get_supported_apis (void);
|
|
gint32 directx_get_supported_api_count (void);
|
|
gboolean directx_add_supported_api (DirectXAPI* api);
|
|
|
|
DirectXAPI* directx_get_best_available_api (void);
|
|
gboolean directx_initialize_best_available_api (void);
|
|
gboolean directx_best_available_api_is_initialized (void);
|
|
|
|
gboolean directx_api_initialize (DirectXAPI* api);
|
|
gboolean directx_api_is_initialized (const DirectXAPI* api);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __DIRECTX_DX_H__ */
|