diff options
author | Nicolas Bruguier <nicolas.bruguier@supersonicimagine.fr> | 2008-11-29 14:08:05 +0100 |
---|---|---|
committer | Nicolas Bruguier <nicolas.bruguier@supersonicimagine.fr> | 2008-11-29 14:08:05 +0100 |
commit | 5798c6f3d83e53ccbf67ec0fdf2692fda76477bc (patch) | |
tree | ca3d52903beaece70f866ac62402fdaf45f66524 | |
parent | bfe2dff7ac768d40f7af5f0c2f99c3a1cc5b8db7 (diff) |
[glx] Add glitz_glx_set_render_type method.
Add glitz_glx_set_render_type method to specifies whether rendering is to be
done with a direct connection to the graphics system if possible or through
the X server.
It can be set with LIBGL_ALWAYS_INDIRECT, but this method provide
multi-threading programs to have both context in same time.
-rw-r--r-- | src/glx/glitz-glx.h | 4 | ||||
-rw-r--r-- | src/glx/glitz_glx_context.c | 24 | ||||
-rw-r--r-- | src/glx/glitz_glx_info.c | 14 | ||||
-rw-r--r-- | src/glx/glitz_glxint.h | 2 |
4 files changed, 35 insertions, 9 deletions
diff --git a/src/glx/glitz-glx.h b/src/glx/glitz-glx.h index 01f50b4..adab13b 100644 --- a/src/glx/glitz-glx.h +++ b/src/glx/glitz-glx.h @@ -43,6 +43,10 @@ glitz_glx_init (const char *gl_library); void glitz_glx_fini (void); +void +glitz_glx_set_render_type (Display *display, + int screen, + glitz_bool_t direct); /* glitz_glx_format.c */ diff --git a/src/glx/glitz_glx_context.c b/src/glx/glitz_glx_context.c index 6510061..7fb2344 100644 --- a/src/glx/glitz_glx_context.c +++ b/src/glx/glitz_glx_context.c @@ -37,7 +37,8 @@ static void _glitz_glx_context_create (glitz_glx_screen_info_t *screen_info, XID visualid, GLXContext share_list, - glitz_glx_context_t *context) + glitz_glx_context_t *context, + glitz_bool_t direct) { int vis_info_count, i; XVisualInfo *vis_infos; @@ -51,7 +52,7 @@ _glitz_glx_context_create (glitz_glx_screen_info_t *screen_info, context->context = glXCreateContext (screen_info->display_info->display, &vis_infos[i], share_list, - GLITZ_GL_TRUE); + direct); context->id = visualid; context->fbconfig = (GLXFBConfig) 0; @@ -62,7 +63,8 @@ static void _glitz_glx_context_create_using_fbconfig (glitz_glx_screen_info_t *screen_info, XID fbconfigid, GLXContext share_list, - glitz_glx_context_t *context) + glitz_glx_context_t *context, + glitz_bool_t direct) { GLXFBConfig *fbconfigs; int i, n_fbconfigs; @@ -90,13 +92,13 @@ _glitz_glx_context_create_using_fbconfig (glitz_glx_screen_info_t *screen_info, if (vinfo) { context->context = glXCreateContext (screen_info->display_info->display, - vinfo, share_list, GLITZ_GL_TRUE); + vinfo, share_list, direct); XFree (vinfo); } else if (glx->create_new_context) context->context = glx->create_new_context (screen_info->display_info->display, fbconfigs[i], GLX_RGBA_TYPE, share_list, - GLITZ_GL_TRUE); + direct); if (context->context) context->fbconfig = fbconfigs[i]; @@ -128,12 +130,14 @@ _glitz_glx_create_context (void *abstract_drawable, _glitz_glx_context_create_using_fbconfig (screen_info, format_id, screen_info->root_context, - context); + context, + !screen_info->indirect); else _glitz_glx_context_create (screen_info, format_id, screen_info->root_context, - context); + context, + !screen_info->indirect); return (glitz_context_t *) context; } @@ -260,12 +264,14 @@ glitz_glx_context_get (glitz_glx_screen_info_t *screen_info, _glitz_glx_context_create_using_fbconfig (screen_info, format_id, screen_info->root_context, - context); + context, + !screen_info->indirect); else _glitz_glx_context_create (screen_info, format_id, screen_info->root_context, - context); + context, + !screen_info->indirect); if (!screen_info->root_context) screen_info->root_context = context->context; diff --git a/src/glx/glitz_glx_info.c b/src/glx/glitz_glx_info.c index d7275eb..928fd7b 100644 --- a/src/glx/glitz_glx_info.c +++ b/src/glx/glitz_glx_info.c @@ -517,6 +517,7 @@ glitz_glx_screen_info_get (Display *display, glitz_program_map_init (&screen_info->program_map); screen_info->root_context = (GLXContext) 0; + screen_info->indirect = 0; screen_info->glx_feature_mask = 0; if (glXQueryExtension (display, &error_base, &event_base)) { @@ -577,3 +578,16 @@ glitz_glx_fini (void) _glitz_glx_thread_info_destroy (info); } slim_hidden_def(glitz_glx_fini); + +void +glitz_glx_set_render_type (Display *display, + int screen, + glitz_bool_t direct) +{ + glitz_glx_screen_info_t *screen_info; + + screen_info = glitz_glx_screen_info_get (display, screen); + + screen_info->indirect = !direct; +} +slim_hidden_def(glitz_glx_set_render_type); diff --git a/src/glx/glitz_glxint.h b/src/glx/glitz_glxint.h index 38ef6fd..3f2240e 100644 --- a/src/glx/glitz_glxint.h +++ b/src/glx/glitz_glxint.h @@ -103,6 +103,7 @@ struct _glitz_glx_screen_info_t { glitz_glx_context_info_t context_stack[GLITZ_CONTEXT_STACK_SIZE]; int context_stack_size; GLXContext root_context; + glitz_bool_t indirect; unsigned long glx_feature_mask; glitz_gl_float_t glx_version; glitz_glx_static_proc_address_list_t glx; @@ -197,6 +198,7 @@ glitz_glx_copy_sub_buffer (void *abstract_drawable, slim_hidden_proto(glitz_glx_init) slim_hidden_proto(glitz_glx_fini) +slim_hidden_proto(glitz_glx_set_render_type) slim_hidden_proto(glitz_glx_find_window_format) slim_hidden_proto(glitz_glx_find_pbuffer_format) slim_hidden_proto(glitz_glx_find_drawable_format_for_visual) |