diff options
author | Vasiliy Ulyanov <v.ulyanov@samsung.com> | 2015-06-22 09:45:32 +0300 |
---|---|---|
committer | SeokYeon Hwang <syeon.hwang@samsung.com> | 2015-06-23 23:38:44 +0900 |
commit | d4e51d96856d2e719d3ebcd68cdf7bfd21b064bb (patch) | |
tree | 2ab2c7a1abc88de090a0a6bf674dbd125a3ecc98 /hw/yagl | |
parent | 57c7db70c767669beb5ed98ef6264285dac41f9b (diff) | |
download | qemu-d4e51d96856d2e719d3ebcd68cdf7bfd21b064bb.tar.gz qemu-d4e51d96856d2e719d3ebcd68cdf7bfd21b064bb.tar.bz2 qemu-d4e51d96856d2e719d3ebcd68cdf7bfd21b064bb.zip |
YaGL: add prefered CGL pixel format attributes
Some apps may require a more strict EGL configuration (e.g. for
msaa). Hence we need to specify the corresponding attributes in
CGLChoosePixelFormat. The old attributes are now used as a
fallback in case no suitable prefered format is found.
Change-Id: Id8369978b88e0c35b218d1f73f5d3c8ad0741858
Signed-off-by: Vasiliy Ulyanov <v.ulyanov@samsung.com>
Diffstat (limited to 'hw/yagl')
-rw-r--r-- | hw/yagl/yagl_drivers/egl_cgl/yagl_egl_cgl.c | 86 |
1 files changed, 79 insertions, 7 deletions
diff --git a/hw/yagl/yagl_drivers/egl_cgl/yagl_egl_cgl.c b/hw/yagl/yagl_drivers/egl_cgl/yagl_egl_cgl.c index 8e242556a6..3baf505f03 100644 --- a/hw/yagl/yagl_drivers/egl_cgl/yagl_egl_cgl.c +++ b/hw/yagl/yagl_drivers/egl_cgl/yagl_egl_cgl.c @@ -47,6 +47,36 @@ # define kCGLOGLPVersion_Legacy 0x1000 #endif +static const CGLPixelFormatAttribute prefered_pixel_format_legacy_attrs[] = +{ + kCGLPFAAccelerated, + kCGLPFAMinimumPolicy, + kCGLPFAColorSize, 32, + kCGLPFAAlphaSize, 8, + kCGLPFADepthSize, 24, + kCGLPFAStencilSize, 8, + kCGLPFAMultisample, + kCGLPFASampleBuffers, 1, + kCGLPFASamples, 4, + kCGLPFAPBuffer, + 0 +}; + +static const CGLPixelFormatAttribute prefered_pixel_format_3_2_core_attrs[] = +{ + kCGLPFAAccelerated, + kCGLPFAMinimumPolicy, + kCGLPFAColorSize, 32, + kCGLPFAAlphaSize, 8, + kCGLPFADepthSize, 24, + kCGLPFAStencilSize, 8, + kCGLPFAMultisample, + kCGLPFASampleBuffers, 1, + kCGLPFASamples, 4, + kCGLPFAOpenGLProfile, kCGLOGLPVersion_3_2_Core, + 0 +}; + static const CGLPixelFormatAttribute pixel_format_legacy_attrs[] = { kCGLPFAAccelerated, @@ -96,6 +126,26 @@ static const char *gl_3_2_check_funcs[] = "glVertexAttribDivisor" }; +static CGLError yagl_egl_cgl_choose_pixel_format(const CGLPixelFormatAttribute prefered_attrs[], + const CGLPixelFormatAttribute fallback_attrs[], + CGLPixelFormatObj *pix, + int *n) +{ + CGLError error; + + YAGL_LOG_FUNC_ENTER(yagl_egl_cgl_choose_pixel_format, NULL); + + error = CGLChoosePixelFormat(prefered_attrs, pix, n); + + if (error || !pix) { + YAGL_LOG_WARN("CGLChoosePixelFormat: no suitable prefered format found (%s)", + CGLErrorString(error)); + return CGLChoosePixelFormat(fallback_attrs, pix, n); + } + + return error; +} + static bool yagl_egl_cgl_get_gl_version(struct yagl_egl_cgl *egl_cgl, yagl_gl_version *version) { @@ -195,7 +245,9 @@ static struct yagl_egl_native_config EGLNativeDisplayType dpy, int *num_configs) { + struct yagl_egl_cgl *egl_cgl = (struct yagl_egl_cgl*)driver; struct yagl_egl_native_config *cfg = NULL; + CGLError error; YAGL_LOG_FUNC_ENTER(yagl_egl_cgl_config_enum, "%p", dpy); @@ -221,7 +273,25 @@ static struct yagl_egl_native_config cfg->min_swap_interval = 0; cfg->native_visual_id = 0; cfg->native_visual_type = EGL_NONE; - cfg->samples_per_pixel = 0; + + if (egl_cgl->base.gl_version >= yagl_gl_3_2) { + error = CGLDescribePixelFormat(egl_cgl->pixel_format_3_2_core, + 0, + kCGLPFASamples, + &cfg->samples_per_pixel); + } else { + error = CGLDescribePixelFormat(egl_cgl->pixel_format_legacy, + 0, + kCGLPFASamples, + &cfg->samples_per_pixel); + } + + if (error) { + YAGL_LOG_WARN("CGLDescribePixelFormat(kCGLPFASamples) failed: %s", + CGLErrorString(error)); + cfg->samples_per_pixel = 0; + } + cfg->stencil_size = 8; cfg->transparent_type = EGL_NONE; cfg->trans_red_val = 0; @@ -468,9 +538,10 @@ struct yagl_egl_driver *yagl_egl_driver_create(void *display) goto fail; } - error = CGLChoosePixelFormat(pixel_format_legacy_attrs, - &egl_cgl->pixel_format_legacy, - &n); + error = yagl_egl_cgl_choose_pixel_format(prefered_pixel_format_legacy_attrs, + pixel_format_legacy_attrs, + &egl_cgl->pixel_format_legacy, + &n); if (error) { YAGL_LOG_ERROR("CGLChoosePixelFormat failed for legacy attrs: %s", CGLErrorString(error)); @@ -483,9 +554,10 @@ struct yagl_egl_driver *yagl_egl_driver_create(void *display) } if (egl_cgl->base.gl_version >= yagl_gl_3_2) { - error = CGLChoosePixelFormat(pixel_format_3_2_core_attrs, - &egl_cgl->pixel_format_3_2_core, - &n); + error = yagl_egl_cgl_choose_pixel_format(prefered_pixel_format_3_2_core_attrs, + pixel_format_3_2_core_attrs, + &egl_cgl->pixel_format_3_2_core, + &n); if (error) { YAGL_LOG_ERROR("CGLChoosePixelFormat failed for 3_2_core attrs: %s", CGLErrorString(error)); |