On Thu, Sep 8, 2011 at 3:41 PM, Chia-I Wu <olva...@gmail.com> wrote: > On Thu, Sep 8, 2011 at 3:11 PM, Benjamin Franzke > <benjaminfran...@googlemail.com> wrote: >> First thanks for taking this on. >> >> There are some things I'd like to have addtionally/differently: >> >> Supported shm formats are exposed via a "format" event as well >> (like the supported drm formats), so the config creation logic is the >> same for drm and shm, and I think it can remain in native_wayland.c >> >> We need roundtrips to check that we get at least one supported format. >> >> I've attached two patches (heavily based on your last two) that do this, >> are you ok with using them? > That is great. Sure. > > I've noted two minor issues or typos, fixed by the attached patch. > One is that param_premultiplied_alpha can be set in the common code > and only when the display has both HAS_ARGB32 and HAS_PREMUL_ARGB32. After the change, we do not even need param_premultiplied_alpha. > The other is that we should not claim PIPE_FORMAT_B8G8R8A8_UNORM > without HAS_ARGB32. If it looks good to you, I will commit an updated > version of your patches.
>> 2011/9/8 Chia-I Wu <olva...@gmail.com>: >>> From: Chia-I Wu <o...@lunarg.com> >>> >>> When wl_drm is avaiable and enabled, handle "format" events and return >>> configs for the supported formats. Otherwise, assume all formats of >>> wl_shm are supported. >>> --- >>> .../state_trackers/egl/wayland/native_drm.c | 70 >>> +++++++++++++++++++- >>> .../state_trackers/egl/wayland/native_shm.c | 41 +++++++++++- >>> .../state_trackers/egl/wayland/native_wayland.c | 28 +------- >>> .../state_trackers/egl/wayland/native_wayland.h | 4 +- >>> 4 files changed, 113 insertions(+), 30 deletions(-) >>> >>> diff --git a/src/gallium/state_trackers/egl/wayland/native_drm.c >>> b/src/gallium/state_trackers/egl/wayland/native_drm.c >>> index 05c32f4..facab32 100644 >>> --- a/src/gallium/state_trackers/egl/wayland/native_drm.c >>> +++ b/src/gallium/state_trackers/egl/wayland/native_drm.c >>> @@ -58,6 +58,11 @@ struct wayland_drm_display { >>> int fd; >>> char *device_name; >>> boolean authenticated; >>> + >>> + /* supported formats */ >>> + boolean argb32; >>> + boolean argb32_pre; >>> + boolean xrgb32; >>> }; >>> >>> static INLINE struct wayland_drm_display * >>> @@ -77,8 +82,8 @@ wayland_drm_display_destroy(struct native_display *ndpy) >>> wl_drm_destroy(drmdpy->wl_drm); >>> if (drmdpy->device_name) >>> FREE(drmdpy->device_name); >>> - if (drmdpy->base.config) >>> - FREE(drmdpy->base.config); >>> + if (drmdpy->base.configs) >>> + FREE(drmdpy->base.configs); >>> if (drmdpy->base.own_dpy) >>> wl_display_destroy(drmdpy->base.dpy); >>> >>> @@ -124,6 +129,50 @@ wayland_create_drm_buffer(struct wayland_display >>> *display, >>> width, height, wsh.stride, format); >>> } >>> >>> +static boolean >>> +wayland_drm_display_add_configs(struct wayland_drm_display *drmdpy) >>> +{ >>> + struct wayland_config *configs; >>> + enum pipe_format formats[2]; >>> + int i, num_formats = 0; >>> + >>> + /* >>> + * Only argb32 counts here. If we make (!argbb32 && argb32_pre) count, >>> we >>> + * will not be able to support the case where >>> + * native_present_control::premultiplied_alpha is FALSE. >>> + */ >>> + if (drmdpy->argb32) >>> + formats[num_formats++] = PIPE_FORMAT_B8G8R8A8_UNORM; >>> + >>> + if (drmdpy->xrgb32) >>> + formats[num_formats++] = PIPE_FORMAT_B8G8R8X8_UNORM; >>> + >>> + if (!num_formats) >>> + return FALSE; >>> + >>> + configs = CALLOC(num_formats, sizeof(*configs)); >>> + if (!configs) >>> + return FALSE; >>> + >>> + for (i = 0; i < num_formats; i++) { >>> + struct native_config *nconf = &configs[i].base; >>> + >>> + nconf->buffer_mask = >>> + (1 << NATIVE_ATTACHMENT_FRONT_LEFT) | >>> + (1 << NATIVE_ATTACHMENT_BACK_LEFT); >>> + >>> + nconf->color_format = formats[i]; >>> + >>> + nconf->window_bit = TRUE; >>> + nconf->pixmap_bit = TRUE; >>> + } >>> + >>> + drmdpy->base.configs = configs; >>> + drmdpy->base.num_configs = num_formats; >>> + >>> + return TRUE; >>> +} >>> + >>> static void >>> drm_handle_device(void *data, struct wl_drm *drm, const char *device) >>> { >>> @@ -148,7 +197,19 @@ drm_handle_device(void *data, struct wl_drm *drm, >>> const char *device) >>> static void >>> drm_handle_format(void *data, struct wl_drm *drm, uint32_t format) >>> { >>> - /* TODO */ >>> + struct wayland_drm_display *drmdpy = data; >>> + >>> + switch (format) { >>> + case WL_DRM_FORMAT_ARGB32: >>> + drmdpy->argb32 = TRUE; >>> + break; >>> + case WL_DRM_FORMAT_PREMULTIPLIED_ARGB32: >>> + drmdpy->argb32_pre = TRUE; >>> + break; >>> + case WL_DRM_FORMAT_XRGB32: >>> + drmdpy->xrgb32 = TRUE; >>> + break; >>> + } >>> } >>> >>> static void >>> @@ -191,6 +252,9 @@ wayland_drm_display_init_screen(struct native_display >>> *ndpy) >>> if (!drmdpy->authenticated) >>> return FALSE; >>> >>> + if (!wayland_drm_display_add_configs(drmdpy)) >>> + return FALSE; >>> + >>> drmdpy->base.base.screen = >>> drmdpy->event_handler->new_drm_screen(&drmdpy->base.base, >>> NULL, drmdpy->fd); >>> diff --git a/src/gallium/state_trackers/egl/wayland/native_shm.c >>> b/src/gallium/state_trackers/egl/wayland/native_shm.c >>> index 598df9f..5882e74 100644 >>> --- a/src/gallium/state_trackers/egl/wayland/native_shm.c >>> +++ b/src/gallium/state_trackers/egl/wayland/native_shm.c >>> @@ -63,8 +63,8 @@ wayland_shm_display_destroy(struct native_display *ndpy) >>> { >>> struct wayland_shm_display *shmdpy = wayland_shm_display(ndpy); >>> >>> - if (shmdpy->base.config) >>> - FREE(shmdpy->base.config); >>> + if (shmdpy->base.configs) >>> + FREE(shmdpy->base.configs); >>> if (shmdpy->base.own_dpy) >>> wl_display_destroy(shmdpy->base.dpy); >>> >>> @@ -111,6 +111,40 @@ wayland_create_shm_buffer(struct wayland_display >>> *display, >>> } >>> >>> static boolean >>> +wayland_shm_display_add_configs(struct wayland_shm_display *shmdpy) >>> +{ >>> + struct wayland_config *configs; >>> + enum pipe_format formats[2]; >>> + int i, num_formats = 0; >>> + >>> + /* assume all formats are supported */ >>> + formats[num_formats++] = PIPE_FORMAT_B8G8R8A8_UNORM; >>> + formats[num_formats++] = PIPE_FORMAT_B8G8R8X8_UNORM; >>> + >>> + configs = CALLOC(num_formats, sizeof(*configs)); >>> + if (!configs) >>> + return FALSE; >>> + >>> + for (i = 0; i < num_formats; i++) { >>> + struct native_config *nconf = &configs[i].base; >>> + >>> + nconf->buffer_mask = >>> + (1 << NATIVE_ATTACHMENT_FRONT_LEFT) | >>> + (1 << NATIVE_ATTACHMENT_BACK_LEFT); >>> + >>> + nconf->color_format = formats[i]; >>> + >>> + nconf->window_bit = TRUE; >>> + nconf->pixmap_bit = TRUE; >>> + } >>> + >>> + shmdpy->base.configs = configs; >>> + shmdpy->base.num_configs = num_formats; >>> + >>> + return TRUE; >>> +} >>> + >>> +static boolean >>> wayland_shm_display_init_screen(struct native_display *ndpy) >>> { >>> struct wayland_shm_display *shmdpy = wayland_shm_display(ndpy); >>> @@ -128,6 +162,9 @@ wayland_shm_display_init_screen(struct native_display >>> *ndpy) >>> if (!shmdpy->wl_shm) >>> return FALSE; >>> >>> + if (!wayland_shm_display_add_configs(shmdpy)) >>> + return FALSE; >>> + >>> winsys = wayland_create_sw_winsys(shmdpy->base.dpy); >>> if (!winsys) >>> return FALSE; >>> diff --git a/src/gallium/state_trackers/egl/wayland/native_wayland.c >>> b/src/gallium/state_trackers/egl/wayland/native_wayland.c >>> index 29c9b46..14cc908 100644 >>> --- a/src/gallium/state_trackers/egl/wayland/native_wayland.c >>> +++ b/src/gallium/state_trackers/egl/wayland/native_wayland.c >>> @@ -44,31 +44,11 @@ wayland_display_get_configs (struct native_display >>> *ndpy, int *num_configs) >>> const struct native_config **configs; >>> int i; >>> >>> - if (!display->config) { >>> - struct native_config *nconf; >>> - display->config = CALLOC(2, sizeof(*display->config)); >>> - if (!display->config) >>> - return NULL; >>> - >>> - for (i = 0; i < 2; ++i) { >>> - nconf = &display->config[i].base; >>> - >>> - nconf->buffer_mask = >>> - (1 << NATIVE_ATTACHMENT_FRONT_LEFT) | >>> - (1 << NATIVE_ATTACHMENT_BACK_LEFT); >>> - >>> - nconf->window_bit = TRUE; >>> - nconf->pixmap_bit = TRUE; >>> - } >>> - >>> - display->config[0].base.color_format = PIPE_FORMAT_B8G8R8A8_UNORM; >>> - display->config[1].base.color_format = PIPE_FORMAT_B8G8R8X8_UNORM; >>> - } >>> - >>> - configs = MALLOC(2 * sizeof(*configs)); >>> + configs = MALLOC(display->num_configs * sizeof(*configs)); >>> if (configs) { >>> - configs[0] = &display->config[0].base; >>> - configs[1] = &display->config[1].base; >>> + for (i = 0; i < display->num_configs; i++) { >>> + configs[i] = &display->configs[i].base; >>> + } >>> if (num_configs) >>> *num_configs = 2; >>> } >>> diff --git a/src/gallium/state_trackers/egl/wayland/native_wayland.h >>> b/src/gallium/state_trackers/egl/wayland/native_wayland.h >>> index 5390f2f..93e670b 100644 >>> --- a/src/gallium/state_trackers/egl/wayland/native_wayland.h >>> +++ b/src/gallium/state_trackers/egl/wayland/native_wayland.h >>> @@ -39,10 +39,12 @@ struct wayland_surface; >>> struct wayland_display { >>> struct native_display base; >>> >>> - struct wayland_config *config; >>> struct wl_display *dpy; >>> boolean own_dpy; >>> >>> + struct wayland_config *configs; >>> + int num_configs; >>> + >>> struct wl_buffer *(*create_buffer)(struct wayland_display *display, >>> struct wayland_surface *surface, >>> enum native_attachment attachment); >>> -- >>> 1.7.5.4 >>> >>> >> > > > > -- > o...@lunarg.com > -- o...@lunarg.com _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev