summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Bruguier <nicolas.bruguier@supersonicimagine.fr>2008-11-29 14:08:05 +0100
committerNicolas Bruguier <nicolas.bruguier@supersonicimagine.fr>2008-11-29 14:08:05 +0100
commit5798c6f3d83e53ccbf67ec0fdf2692fda76477bc (patch)
treeca3d52903beaece70f866ac62402fdaf45f66524
parentbfe2dff7ac768d40f7af5f0c2f99c3a1cc5b8db7 (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.h4
-rw-r--r--src/glx/glitz_glx_context.c24
-rw-r--r--src/glx/glitz_glx_info.c14
-rw-r--r--src/glx/glitz_glxint.h2
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)