egl/wayland: use bitset.h for formats bit set

Currently only 7 formats are supported, but we don't want the 16 limit
(it's an `unsigned`) to hit us by surprise :]

Let's use bitset.h's BITSET magic to allow us to have any number of
formats, with a static assert to make sure we don't forget to update it.

Signed-off-by: Eric Engestrom <eric.engestrom@intel.com>
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
This commit is contained in:
Eric Engestrom 2018-11-27 12:27:45 +00:00
parent d5f63990b4
commit fbf7c38da3
2 changed files with 19 additions and 11 deletions

View file

@ -81,6 +81,9 @@ struct zwp_linux_dmabuf_v1;
#include "eglsync.h" #include "eglsync.h"
#include "util/u_vector.h" #include "util/u_vector.h"
#include "util/bitset.h"
#define EGL_DRI2_MAX_FORMATS 8
struct wl_buffer; struct wl_buffer;
@ -232,7 +235,7 @@ struct dri2_egl_display
struct zwp_linux_dmabuf_v1 *wl_dmabuf; struct zwp_linux_dmabuf_v1 *wl_dmabuf;
struct u_vector *wl_modifiers; struct u_vector *wl_modifiers;
bool authenticated; bool authenticated;
unsigned formats; BITSET_DECLARE(formats, EGL_DRI2_MAX_FORMATS);
uint32_t capabilities; uint32_t capabilities;
char *device_name; char *device_name;
#endif #endif

View file

@ -114,6 +114,10 @@ static const struct dri2_wl_visual {
}, },
}; };
static_assert(ARRAY_SIZE(dri2_wl_visuals) <= EGL_DRI2_MAX_FORMATS,
"dri2_egl_display::formats is not large enough for "
"the formats in dri2_wl_visuals");
static int static int
dri2_wl_visual_idx_from_config(struct dri2_egl_display *dri2_dpy, dri2_wl_visual_idx_from_config(struct dri2_egl_display *dri2_dpy,
const __DRIconfig *config) const __DRIconfig *config)
@ -487,7 +491,7 @@ get_back_bo(struct dri2_egl_surface *dri2_surf)
num_modifiers = u_vector_length(&dri2_dpy->wl_modifiers[visual_idx]); num_modifiers = u_vector_length(&dri2_dpy->wl_modifiers[visual_idx]);
/* Substitute dri image format if server does not support original format */ /* Substitute dri image format if server does not support original format */
if (!(dri2_dpy->formats & (1 << visual_idx))) if (!BITSET_TEST(dri2_dpy->formats, visual_idx))
linear_dri_image_format = dri2_wl_visuals[visual_idx].alt_dri_image_format; linear_dri_image_format = dri2_wl_visuals[visual_idx].alt_dri_image_format;
/* These asserts hold, as long as dri2_wl_visuals[] is self-consistent and /* These asserts hold, as long as dri2_wl_visuals[] is self-consistent and
@ -495,8 +499,8 @@ get_back_bo(struct dri2_egl_surface *dri2_surf)
* of bugs. * of bugs.
*/ */
assert(linear_dri_image_format != __DRI_IMAGE_FORMAT_NONE); assert(linear_dri_image_format != __DRI_IMAGE_FORMAT_NONE);
assert(dri2_dpy->formats & assert(BITSET_TEST(dri2_dpy->formats,
(1 << dri2_wl_visual_idx_from_dri_image_format(linear_dri_image_format))); dri2_wl_visual_idx_from_dri_image_format(linear_dri_image_format)));
/* There might be a buffer release already queued that wasn't processed */ /* There might be a buffer release already queued that wasn't processed */
wl_display_dispatch_queue_pending(dri2_dpy->wl_dpy, dri2_surf->wl_queue); wl_display_dispatch_queue_pending(dri2_dpy->wl_dpy, dri2_surf->wl_queue);
@ -1106,7 +1110,7 @@ dri2_wl_create_wayland_buffer_from_image(_EGLDriver *drv,
if (visual_idx == -1) if (visual_idx == -1)
goto bad_format; goto bad_format;
if (!(dri2_dpy->formats & (1u << visual_idx))) if (!BITSET_TEST(dri2_dpy->formats, visual_idx))
goto bad_format; goto bad_format;
buffer = create_wl_buffer(dri2_dpy, NULL, image); buffer = create_wl_buffer(dri2_dpy, NULL, image);
@ -1196,7 +1200,7 @@ drm_handle_format(void *data, struct wl_drm *drm, uint32_t format)
if (visual_idx == -1) if (visual_idx == -1)
return; return;
dri2_dpy->formats |= (1u << visual_idx); BITSET_SET(dri2_dpy->formats, visual_idx);
} }
static void static void
@ -1245,7 +1249,7 @@ dmabuf_handle_modifier(void *data, struct zwp_linux_dmabuf_v1 *dmabuf,
modifier_lo == (DRM_FORMAT_MOD_INVALID & 0xffffffff)) modifier_lo == (DRM_FORMAT_MOD_INVALID & 0xffffffff))
return; return;
dri2_dpy->formats |= (1u << visual_idx); BITSET_SET(dri2_dpy->formats, visual_idx);
mod = u_vector_add(&dri2_dpy->wl_modifiers[visual_idx]); mod = u_vector_add(&dri2_dpy->wl_modifiers[visual_idx]);
*mod = combine_u32_into_u64(modifier_hi, modifier_lo); *mod = combine_u32_into_u64(modifier_hi, modifier_lo);
@ -1346,7 +1350,7 @@ dri2_wl_add_configs_for_visuals(_EGLDriver *drv, _EGLDisplay *disp)
for (unsigned j = 0; j < ARRAY_SIZE(dri2_wl_visuals); j++) { for (unsigned j = 0; j < ARRAY_SIZE(dri2_wl_visuals); j++) {
struct dri2_egl_config *dri2_conf; struct dri2_egl_config *dri2_conf;
if (!(dri2_dpy->formats & (1u << j))) if (!BITSET_TEST(dri2_dpy->formats, j))
continue; continue;
dri2_conf = dri2_add_config(disp, dri2_dpy->driver_configs[i], dri2_conf = dri2_add_config(disp, dri2_dpy->driver_configs[i],
@ -1374,7 +1378,7 @@ dri2_wl_add_configs_for_visuals(_EGLDriver *drv, _EGLDisplay *disp)
alt_dri_image_format = dri2_wl_visuals[c].alt_dri_image_format; alt_dri_image_format = dri2_wl_visuals[c].alt_dri_image_format;
s = dri2_wl_visual_idx_from_dri_image_format(alt_dri_image_format); s = dri2_wl_visual_idx_from_dri_image_format(alt_dri_image_format);
if (s == -1 || !(dri2_dpy->formats & (1 << s))) if (s == -1 || !BITSET_TEST(dri2_dpy->formats, s))
continue; continue;
/* Visual s works for the Wayland server, and c can be converted into s /* Visual s works for the Wayland server, and c can be converted into s
@ -2008,7 +2012,7 @@ shm_handle_format(void *data, struct wl_shm *shm, uint32_t format)
if (visual_idx == -1) if (visual_idx == -1)
return; return;
dri2_dpy->formats |= (1u << visual_idx); BITSET_SET(dri2_dpy->formats, visual_idx);
} }
static const struct wl_shm_listener shm_listener = { static const struct wl_shm_listener shm_listener = {
@ -2115,7 +2119,8 @@ dri2_initialize_wayland_swrast(_EGLDriver *drv, _EGLDisplay *disp)
if (roundtrip(dri2_dpy) < 0 || dri2_dpy->wl_shm == NULL) if (roundtrip(dri2_dpy) < 0 || dri2_dpy->wl_shm == NULL)
goto cleanup; goto cleanup;
if (roundtrip(dri2_dpy) < 0 || dri2_dpy->formats == 0) if (roundtrip(dri2_dpy) < 0 || !BITSET_TEST_RANGE(dri2_dpy->formats,
0, EGL_DRI2_MAX_FORMATS))
goto cleanup; goto cleanup;
dri2_dpy->driver_name = strdup("swrast"); dri2_dpy->driver_name = strdup("swrast");