Exemplo n.º 1
0
static glitz_status_t
_glitz_glx_query_formats_using_fbconfigs (glitz_glx_screen_info_t *screen_info)
{
    glitz_glx_static_proc_address_list_t *glx = &screen_info->glx;
    Display				 *display;
    glitz_int_drawable_format_t		 format;
    GLXFBConfig				 *fbconfigs;
    int					 i, num_configs;

    display = screen_info->display_info->display;

    fbconfigs = glx->get_fbconfigs (display, screen_info->screen,
				    &num_configs);
    if (!fbconfigs)
    {
	/* fbconfigs are not supported, falling back to visuals */
	screen_info->glx_feature_mask &= ~GLITZ_GLX_FEATURE_FBCONFIG_MASK;
	screen_info->glx_feature_mask &= ~GLITZ_GLX_FEATURE_PBUFFER_MASK;

	return GLITZ_STATUS_NOT_SUPPORTED;
    }

    for (i = 0; i < num_configs; i++)
    {
	int value;
	XVisualInfo* vinfo;

	if ((glx->get_fbconfig_attrib (display, fbconfigs[i],
				       GLX_RENDER_TYPE, &value) != 0) ||
	    (!(value & GLX_RGBA_BIT)))
	    continue;

	/* Stereo is not supported yet */
	glx->get_fbconfig_attrib (display, fbconfigs[i], GLX_STEREO, &value);
	if (value != 0)
	    continue;

	glx->get_fbconfig_attrib (display, fbconfigs[i],
				  GLX_DRAWABLE_TYPE, &value);
	if (!((value & GLX_WINDOW_BIT) || (value & GLX_PBUFFER_BIT)))
	    continue;
	
	vinfo = glx->get_visual_from_fbconfig (display, fbconfigs[i]);
	if (vinfo)
	{
	    format.d.depth = vinfo->depth;
	    XFree(vinfo);
	}
	
	format.types = 0;
	if (value & GLX_WINDOW_BIT)
	    format.types |= GLITZ_DRAWABLE_TYPE_WINDOW_MASK;

	if (value & GLX_PBUFFER_BIT)
	    format.types |= GLITZ_DRAWABLE_TYPE_PBUFFER_MASK;

	format.d.id           = 0;
	format.d.color.fourcc = GLITZ_FOURCC_RGB;

	glx->get_fbconfig_attrib (display, fbconfigs[i], GLX_FBCONFIG_ID,
				  &value);
	format.u.uval = value;

	glx->get_fbconfig_attrib (display, fbconfigs[i], GLX_RED_SIZE, &value);
	format.d.color.red_size = (unsigned short) value;
	glx->get_fbconfig_attrib (display, fbconfigs[i], GLX_GREEN_SIZE,
				  &value);
	format.d.color.green_size = (unsigned short) value;
	glx->get_fbconfig_attrib (display, fbconfigs[i], GLX_BLUE_SIZE,
				  &value);
	format.d.color.blue_size = (unsigned short) value;
	glx->get_fbconfig_attrib (display, fbconfigs[i], GLX_ALPHA_SIZE,
				  &value);
	format.d.color.alpha_size = (unsigned short) value;
	glx->get_fbconfig_attrib (display, fbconfigs[i], GLX_DEPTH_SIZE,
				  &value);
	format.d.depth_size = (unsigned short) value;
	glx->get_fbconfig_attrib (display, fbconfigs[i], GLX_STENCIL_SIZE,
				  &value);
	format.d.stencil_size = (unsigned short) value;
	glx->get_fbconfig_attrib (display, fbconfigs[i], GLX_DOUBLEBUFFER,
				  &value);
	format.d.doublebuffer = (value)? 1: 0;
	glx->get_fbconfig_attrib (display, fbconfigs[i], GLX_Y_INVERTED_EXT,
				  &value);
	format.d.scanline_order = (value) ? 
				  GLITZ_PIXEL_SCANLINE_ORDER_BOTTOM_UP : 
				  GLITZ_PIXEL_SCANLINE_ORDER_TOP_DOWN;
	glx->get_fbconfig_attrib (display, fbconfigs[i], GLX_CONFIG_CAVEAT,
				  &value);
	switch (value) {
	case GLX_SLOW_VISUAL_EXT:
	case GLX_NON_CONFORMANT_VISUAL_EXT:
	    format.caveat = 1;
	    break;
	default:
	    format.caveat = 0;
	    break;
	}

	if (screen_info->glx_feature_mask & GLITZ_GLX_FEATURE_MULTISAMPLE_MASK)
	{
	    glx->get_fbconfig_attrib (display, fbconfigs[i],
				      GLX_SAMPLE_BUFFERS_ARB, &value);
	    if (value)
	    {
		glx->get_fbconfig_attrib (display, fbconfigs[i],
					  GLX_SAMPLES_ARB, &value);
		format.d.samples = (unsigned short) (value > 1)? value: 1;
		if (format.d.samples > 1)
		{
		    if (!(screen_info->glx_feature_mask &
			  GLITZ_GLX_FEATURE_PBUFFER_MULTISAMPLE_MASK))
			format.types &= ~GLITZ_DRAWABLE_TYPE_PBUFFER_MASK;
		}
	    }
	    else
		format.d.samples = 1;
	}
	else
	    format.d.samples = 1;

	_glitz_add_format (screen_info, &format);
    }

    if (fbconfigs)
	XFree (fbconfigs);

    return GLITZ_STATUS_SUCCESS;
}
static glitz_status_t
_glitz_wgl_query_formats_using_pixel_format (glitz_wgl_screen_info_t *screen_info)
{
    glitz_int_drawable_format_t format;
    int i, num_pixel_formats;
    int question, answer;
    glitz_wgl_static_proc_address_list_t *wgl = &screen_info->wgl;

    question = WGL_NUMBER_PIXEL_FORMATS_ARB;
    if (!wgl->get_pixel_format_attrib_iv (screen_info->root_dc, 0, 0, 1,
					  &question, &num_pixel_formats)) {
	/* wglGetPixelFormatAttribivARB didn't work, fall back to
	 * DescribePixelFormat.
	 */
	screen_info->wgl_feature_mask &= ~GLITZ_WGL_FEATURE_PIXEL_FORMAT_MASK;
	return GLITZ_STATUS_NOT_SUPPORTED;
    }

    for (i = 1; i <= num_pixel_formats; i++) {
	format.d.id = 0;
	format.types = 0;
	format.d.color.fourcc = GLITZ_FOURCC_RGB;

#define ASK_QUESTION(q,a) (question=(q),wgl->get_pixel_format_attrib_iv (screen_info->root_dc, i, 0, 1, &question,(a)))

	if (!ASK_QUESTION(WGL_SUPPORT_OPENGL_ARB, &answer)
	    || !answer)
	    continue;

	if (!ASK_QUESTION(WGL_PIXEL_TYPE_ARB, &answer)
	    || answer != WGL_TYPE_RGBA_ARB)
	    continue;

	if (!ASK_QUESTION(WGL_ACCELERATION_ARB, &answer))
	    continue;
	if (answer == WGL_NO_ACCELERATION_ARB)
	    format.caveat = 2;
	else if (answer == WGL_GENERIC_ACCELERATION_ARB)
	    format.caveat = 1;
	else
	    format.caveat = 0;

	/* Stereo is not supported yet */
	if (!ASK_QUESTION(WGL_STEREO_ARB, &answer)
	    || answer != 0)
	    continue;

	if (!ASK_QUESTION(WGL_DRAW_TO_WINDOW_ARB, &answer))
	    continue;
	format.types |= answer ? GLITZ_DRAWABLE_TYPE_WINDOW_MASK : 0;

	if (!ASK_QUESTION(WGL_DRAW_TO_PBUFFER_ARB, &answer))
	    continue;
	format.types |= answer ? GLITZ_DRAWABLE_TYPE_PBUFFER_MASK : 0;

	if (!(format.types & (GLITZ_DRAWABLE_TYPE_WINDOW_MASK |
			      GLITZ_DRAWABLE_TYPE_PBUFFER_MASK)))
	    continue;

	if (!ASK_QUESTION(WGL_RED_BITS_ARB, &answer))
	    continue;
	format.d.color.red_size = (unsigned short) answer;

	if (!ASK_QUESTION(WGL_GREEN_BITS_ARB, &answer))
	    continue;
	format.d.color.green_size = (unsigned short) answer;

	if (!ASK_QUESTION(WGL_BLUE_BITS_ARB, &answer))
	    continue;
	format.d.color.blue_size = (unsigned short) answer;

	if (!ASK_QUESTION(WGL_ALPHA_BITS_ARB, &answer))
	    continue;
	format.d.color.alpha_size = (unsigned short) answer;

	if (!ASK_QUESTION(WGL_DEPTH_BITS_ARB, &answer))
	    continue;
	format.d.depth_size = (unsigned short) answer;

	if (!ASK_QUESTION(WGL_STENCIL_BITS_ARB, &answer))
	    continue;
	format.d.stencil_size = (unsigned short) answer;

	if (!ASK_QUESTION(WGL_DOUBLE_BUFFER_ARB, &answer))
	    continue;
	format.d.doublebuffer = (answer) ? 1: 0;

	format.d.samples = 1;
	if (screen_info->wgl_feature_mask & GLITZ_WGL_FEATURE_MULTISAMPLE_MASK) {
	    if (!ASK_QUESTION(WGL_SAMPLE_BUFFERS_ARB, &answer))
		continue;

	    if (answer) {
		if (!ASK_QUESTION(WGL_SAMPLES_ARB, &answer))
		    continue;
		format.d.samples = (unsigned short) answer;
	    }
	}

	_glitz_add_format (screen_info, &format, i);
    }

    return GLITZ_STATUS_SUCCESS;
}
Exemplo n.º 3
0
static void
_glitz_glx_query_formats (glitz_glx_screen_info_t *screen_info)
{
    Display			*display;
    glitz_int_drawable_format_t format;
    XVisualInfo			visual_templ;
    XVisualInfo			*visuals;
    int				i, num_visuals;

    display = screen_info->display_info->display;

    visual_templ.screen = screen_info->screen;
    visuals = XGetVisualInfo (display, VisualScreenMask,
			      &visual_templ, &num_visuals);

    /* No pbuffers without fbconfigs */
    format.types          = GLITZ_DRAWABLE_TYPE_WINDOW_MASK;
    format.d.id           = 0;
    format.d.color.fourcc = GLITZ_FOURCC_RGB;

    for (i = 0; i < num_visuals; i++)
    {
	int value;

	if ((glXGetConfig (display, &visuals[i], GLX_USE_GL, &value) != 0) ||
	    (value == 0))
	    continue;

	glXGetConfig (display, &visuals[i], GLX_RGBA, &value);
	if (value == 0)
	    continue;

	/* Stereo is not supported yet */
	glXGetConfig (display, &visuals[i], GLX_STEREO, &value);
	if (value != 0)
	    continue;

	format.d.depth = visuals[i].depth;
	glXGetConfig (display, &visuals[i], GLX_RED_SIZE, &value);
	format.d.color.red_size = (unsigned short) value;
	glXGetConfig (display, &visuals[i], GLX_GREEN_SIZE, &value);
	format.d.color.green_size = (unsigned short) value;
	glXGetConfig (display, &visuals[i], GLX_BLUE_SIZE, &value);
	format.d.color.blue_size = (unsigned short) value;
	glXGetConfig (display, &visuals[i], GLX_ALPHA_SIZE, &value);
	format.d.color.alpha_size = (unsigned short) value;
	glXGetConfig (display, &visuals[i], GLX_DEPTH_SIZE, &value);
	format.d.depth_size = (unsigned short) value;
	glXGetConfig (display, &visuals[i], GLX_STENCIL_SIZE, &value);
	format.d.stencil_size = (unsigned short) value;
	glXGetConfig (display, &visuals[i], GLX_DOUBLEBUFFER, &value);
	format.d.doublebuffer = (value) ? 1: 0;
	glXGetConfig (display, &visuals[i], GLX_Y_INVERTED_EXT, &value);
	format.d.scanline_order = (value) ? 
				  GLITZ_PIXEL_SCANLINE_ORDER_BOTTOM_UP : 
				  GLITZ_PIXEL_SCANLINE_ORDER_TOP_DOWN;
	
	if (screen_info->glx_feature_mask &
	    GLITZ_GLX_FEATURE_VISUAL_RATING_MASK)
	{
	    glXGetConfig (display, &visuals[i], GLX_VISUAL_CAVEAT_EXT, &value);
	    switch (value) {
	    case GLX_SLOW_VISUAL_EXT:
	    case GLX_NON_CONFORMANT_VISUAL_EXT:
		format.caveat = 1;
		break;
	    default:
		format.caveat = 0;
		break;
	    }
	}
	else
	    format.caveat = 0;

	if (screen_info->glx_feature_mask & GLITZ_GLX_FEATURE_MULTISAMPLE_MASK)
	{
	    glXGetConfig (display, &visuals[i], GLX_SAMPLE_BUFFERS_ARB,
			  &value);
	    if (value)
	    {
		glXGetConfig (display, &visuals[i], GLX_SAMPLES_ARB, &value);
		format.d.samples = (unsigned short) (value > 1)? value: 1;
	    }
	    else
		format.d.samples = 1;
	}
	else
	    format.d.samples = 1;

	format.u.uval = visuals[i].visualid;

	_glitz_add_format (screen_info, &format);
    }

    if (visuals)
	XFree (visuals);
}
static glitz_bool_t
_glitz_wgl_query_formats (glitz_wgl_screen_info_t *screen_info)
{
    glitz_int_drawable_format_t format;
    int i, num_pixel_formats;
    PIXELFORMATDESCRIPTOR pfd;

    pfd.nSize = sizeof (PIXELFORMATDESCRIPTOR);
    pfd.nVersion = 1;

    num_pixel_formats =
	DescribePixelFormat (screen_info->root_dc, 1,
			     sizeof (PIXELFORMATDESCRIPTOR), &pfd);

    if (!num_pixel_formats)
	return 0;

    for (i = 1; i <= num_pixel_formats; i++) {
	format.d.id = 0;
	format.caveat = 0;
	format.types = 0;

	if (!DescribePixelFormat (screen_info->root_dc, i,
				  sizeof (PIXELFORMATDESCRIPTOR), &pfd))
	{
	    continue;
	}

#ifdef DEBUG
        printf ("Pixel format %d Flags: 0x%08x\n", i, pfd.dwFlags);
#endif

	if (!((pfd.dwFlags & PFD_DRAW_TO_WINDOW) &&
	      (pfd.dwFlags & PFD_SUPPORT_OPENGL)))
	    continue;

	if (pfd.iPixelType != PFD_TYPE_RGBA)
	    continue;

	if (pfd.dwFlags & (PFD_NEED_PALETTE |
			   PFD_NEED_SYSTEM_PALETTE |
			   PFD_STEREO))
	    continue;

#ifndef USE_MESA
	/* Can't use the Windows software implementation as glitz
	 * unconditionally requires OpenGL 1.2, and it's only 1.1.
	 */
	if (pfd.dwFlags & PFD_GENERIC_FORMAT)
	    continue;
#endif

	format.types = GLITZ_DRAWABLE_TYPE_WINDOW_MASK;

	format.d.color.red_size = pfd.cRedBits;
	format.d.color.green_size = pfd.cGreenBits;
	format.d.color.blue_size = pfd.cBlueBits;
	format.d.color.alpha_size = pfd.cAlphaBits;
	format.d.color.fourcc = GLITZ_FOURCC_RGB;

	format.d.depth_size = pfd.cDepthBits;
	format.d.stencil_size = pfd.cStencilBits;

	format.d.doublebuffer = (pfd.dwFlags & PFD_DOUBLEBUFFER) != 0;

	format.d.samples = 1;

	_glitz_add_format (screen_info, &format, i);
    }

    return 0;
}