diff options
Diffstat (limited to 'src/gallium/state_trackers/egl/android/native_android.cpp')
-rw-r--r-- | src/gallium/state_trackers/egl/android/native_android.cpp | 162 |
1 files changed, 110 insertions, 52 deletions
diff --git a/src/gallium/state_trackers/egl/android/native_android.cpp b/src/gallium/state_trackers/egl/android/native_android.cpp index 450eae3868..a584d54db4 100644 --- a/src/gallium/state_trackers/egl/android/native_android.cpp +++ b/src/gallium/state_trackers/egl/android/native_android.cpp @@ -34,7 +34,13 @@ extern "C" { #include "egllog.h" + +/* see get_drm_screen_name */ +#include <xf86drm.h> +#include <radeon_drm.h> +#include "radeon/drm/radeon_drm_public.h" } + #include "util/u_memory.h" #include "util/u_inlines.h" #include "util/u_format.h" @@ -157,12 +163,12 @@ import_buffer(struct android_display *adpy, const struct pipe_resource *templ, if (templ->bind & PIPE_BIND_RENDER_TARGET) { if (!screen->is_format_supported(screen, templ->format, - templ->target, 0, PIPE_BIND_RENDER_TARGET, 0)) + templ->target, 0, PIPE_BIND_RENDER_TARGET)) LOGW("importing unsupported buffer as render target"); } if (templ->bind & PIPE_BIND_SAMPLER_VIEW) { if (!screen->is_format_supported(screen, templ->format, - templ->target, 0, PIPE_BIND_SAMPLER_VIEW, 0)) + templ->target, 0, PIPE_BIND_SAMPLER_VIEW)) LOGW("importing unsupported buffer as sampler view"); } @@ -399,7 +405,7 @@ android_display_create_window_surface(struct native_display *ndpy, LOGW("native window format 0x%x != config format 0x%x", format, nconf->color_format); if (!adpy->base.screen->is_format_supported(adpy->base.screen, - format, PIPE_TEXTURE_2D, 0, PIPE_BIND_RENDER_TARGET, 0)) { + format, PIPE_TEXTURE_2D, 0, PIPE_BIND_RENDER_TARGET)) { LOGE("and the native window cannot be used as a render target"); return NULL; } @@ -452,7 +458,7 @@ android_display_init_configs(struct native_display *ndpy) color_format = get_pipe_format(native_formats[i]); if (color_format == PIPE_FORMAT_NONE || !adpy->base.screen->is_format_supported(adpy->base.screen, - color_format, PIPE_TEXTURE_2D, 0, PIPE_BIND_RENDER_TARGET, 0)) { + color_format, PIPE_TEXTURE_2D, 0, PIPE_BIND_RENDER_TARGET)) { LOGI("skip unsupported native format 0x%x", native_formats[i]); continue; } @@ -461,8 +467,6 @@ android_display_init_configs(struct native_display *ndpy) aconf->base.buffer_mask = 1 << NATIVE_ATTACHMENT_BACK_LEFT; aconf->base.color_format = color_format; aconf->base.window_bit = TRUE; - if (!adpy->use_drm) - aconf->base.slow_config = TRUE; aconf->base.native_visual_type = native_formats[i]; } @@ -470,66 +474,94 @@ android_display_init_configs(struct native_display *ndpy) return TRUE; } +static const char * +get_drm_screen_name(int fd, drmVersionPtr version) +{ + const char *name = version->name; + + if (name && !strcmp(name, "radeon")) { + int chip_id; + struct drm_radeon_info info; + + memset(&info, 0, sizeof(info)); + info.request = RADEON_INFO_DEVICE_ID; + info.value = pointer_to_intptr(&chip_id); + if (drmCommandWriteRead(fd, DRM_RADEON_INFO, &info, sizeof(info)) != 0) + return NULL; + + name = is_r3xx(chip_id) ? "r300" : "r600"; + } + + return name; +} + static boolean -android_display_init(struct native_display *ndpy) +android_display_init_drm(struct native_display *ndpy) { struct android_display *adpy = android_display(ndpy); const hw_module_t *mod; int fd, err; - boolean force_sw; - char value[PROPERTY_VALUE_MAX]; - - if (property_get("debug.mesa.software", value, NULL)) - force_sw = (atoi(value) != 0); - else - force_sw = debug_get_bool_option("EGL_SOFTWARE", FALSE); - /* try DRM first */ - if (!force_sw) { - err = hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &mod); - if (!err) { - const gralloc_module_t *gr = (gralloc_module_t *) mod; + err = hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &mod); + if (!err) { + const gralloc_module_t *gr = (gralloc_module_t *) mod; - err = -EINVAL; - if (gr->perform) - err = gr->perform(gr, GRALLOC_MODULE_PERFORM_GET_DRM_FD, &fd); + err = -EINVAL; + if (gr->perform) + err = gr->perform(gr, GRALLOC_MODULE_PERFORM_GET_DRM_FD, &fd); + } + if (!err && fd >= 0) { + drmVersionPtr version; + const char *name; + + version = drmGetVersion(fd); + if (version) { + name = get_drm_screen_name(fd, version); + if (name) { + adpy->base.screen = + adpy->event_handler->new_drm_screen(&adpy->base, name, fd); + } + drmFreeVersion(version); } - if (!err && fd >= 0) { - adpy->base.screen = - adpy->event_handler->new_drm_screen(&adpy->base, "i915", fd); - if (adpy->base.screen) - adpy->use_drm = TRUE; + else { + _eglLog(_EGL_WARNING, "invalid fd %d", fd); + err = -EINVAL; } if (adpy->base.screen) - LOGI("using DRM screen"); - else - LOGE("failed to create DRM screen"); + adpy->use_drm = TRUE; } - /* try SW screen */ - if (!adpy->base.screen) { - struct sw_winsys *ws = android_create_sw_winsys(); + if (adpy->base.screen) { + LOGI("using DRM screen"); + return TRUE; + } + else { + LOGE("failed to create DRM screen"); + return FALSE; + } +} - if (ws) { - adpy->base.screen = - adpy->event_handler->new_sw_screen(&adpy->base, ws); - } +static boolean +android_display_init_sw(struct native_display *ndpy) +{ + struct android_display *adpy = android_display(ndpy); + struct sw_winsys *ws; - if (adpy->base.screen) - LOGI("using SW screen"); - else - LOGE("failed to create SW screen"); + ws = android_create_sw_winsys(); + if (ws) { + adpy->base.screen = + adpy->event_handler->new_sw_screen(&adpy->base, ws); } if (adpy->base.screen) { - if (!android_display_init_configs(&adpy->base)) { - adpy->base.screen->destroy(adpy->base.screen); - adpy->base.screen = NULL; - } + LOGI("using SW screen"); + return TRUE; + } + else { + LOGE("failed to create SW screen"); + return FALSE; } - - return (adpy->base.screen != NULL); } static void @@ -603,9 +635,11 @@ static struct native_display_buffer android_display_buffer = { static struct android_display * android_display_create(struct native_event_handler *event_handler, - void *user_data) + boolean use_sw, void *user_data) { struct android_display *adpy; + char value[PROPERTY_VALUE_MAX]; + boolean force_sw; adpy = CALLOC_STRUCT(android_display); if (!adpy) @@ -614,7 +648,23 @@ android_display_create(struct native_event_handler *event_handler, adpy->event_handler = event_handler; adpy->base.user_data = user_data; - if (!android_display_init(&adpy->base)) { + if (property_get("debug.mesa.software", value, NULL)) + force_sw = (atoi(value) != 0); + else + force_sw = debug_get_bool_option("EGL_SOFTWARE", FALSE); + + if (force_sw || use_sw) + android_display_init_sw(&adpy->base); + else + android_display_init_drm(&adpy->base); + + if (!adpy->base.screen) { + FREE(adpy); + return NULL; + } + + if (!android_display_init_configs(&adpy->base)) { + adpy->base.screen->destroy(adpy->base.screen); FREE(adpy); return NULL; } @@ -629,19 +679,27 @@ android_display_create(struct native_event_handler *event_handler, return adpy; } +static struct native_event_handler *android_event_handler; + +static void +native_set_event_handler(struct native_event_handler *event_handler) +{ + android_event_handler = event_handler; +} + static struct native_display * -native_create_display(void *dpy, struct native_event_handler *event_handler, - void *user_data) +native_create_display(void *dpy, boolean use_sw, void *user_data) { struct android_display *adpy; - adpy = android_display_create(event_handler, user_data); + adpy = android_display_create(android_event_handler, use_sw, user_data); return (adpy) ? &adpy->base : NULL; } static const struct native_platform android_platform = { "Android", /* name */ + native_set_event_handler, native_create_display }; |