diff --git a/include/render/pixel_format.h b/include/render/pixel_format.h index f5b67d031..e3882e695 100644 --- a/include/render/pixel_format.h +++ b/include/render/pixel_format.h @@ -25,4 +25,7 @@ bool pixel_format_info_check_stride(const struct wlr_pixel_format_info *info, uint32_t convert_wl_shm_format_to_drm(enum wl_shm_format fmt); enum wl_shm_format convert_drm_format_to_wl_shm(uint32_t fmt); +char *get_drm_format_description(uint32_t format); +char *get_drm_modifier_description(uint64_t modifier); + #endif diff --git a/render/allocator/gbm.c b/render/allocator/gbm.c index 149ff6b9e..4b7841787 100644 --- a/render/allocator/gbm.c +++ b/render/allocator/gbm.c @@ -13,6 +13,7 @@ #include "config.h" #include "render/allocator/gbm.h" #include "render/drm_format_set.h" +#include "render/pixel_format.h" static const struct wlr_buffer_impl buffer_impl; @@ -139,15 +140,13 @@ static struct wlr_gbm_buffer *create_buffer(struct wlr_gbm_allocator *alloc, buffer->dmabuf.modifier = fallback_modifier; } - char *format_name = drmGetFormatName(buffer->dmabuf.format); - char *modifier_name = drmGetFormatModifierName(buffer->dmabuf.modifier); - wlr_log(WLR_DEBUG, "Allocated %dx%d GBM buffer " - "with format %s (0x%08"PRIX32"), modifier %s (0x%016"PRIX64")", + char *format_desc = get_drm_format_description(buffer->dmabuf.format); + char *modifier_desc = get_drm_modifier_description(buffer->dmabuf.modifier); + wlr_log(WLR_DEBUG, "Allocated %dx%d GBM buffer with format %s, modifier %s", buffer->base.width, buffer->base.height, - format_name ? format_name : "", buffer->dmabuf.format, - modifier_name ? modifier_name : "", buffer->dmabuf.modifier); - free(format_name); - free(modifier_name); + format_desc, modifier_desc); + free(format_desc); + free(modifier_desc); return buffer; } diff --git a/render/egl.c b/render/egl.c index 70596c751..04726d930 100644 --- a/render/egl.c +++ b/render/egl.c @@ -11,6 +11,7 @@ #include #include #include "render/egl.h" +#include "render/pixel_format.h" #include "util/env.h" static enum wlr_log_importance egl_log_importance_to_wlr(EGLint type) { @@ -100,10 +101,9 @@ static int get_egl_dmabuf_modifiers(struct wlr_egl *egl, EGLint format, uint64_t **modifiers, EGLBoolean **external_only); static void log_modifier(uint64_t modifier, bool external_only) { - char *mod_name = drmGetFormatModifierName(modifier); - wlr_log(WLR_DEBUG, " %s (0x%016"PRIX64"): ✓ texture %s render", - mod_name ? mod_name : "", modifier, external_only ? "✗" : "✓"); - free(mod_name); + char *mod_desc = get_drm_modifier_description(modifier); + wlr_log(WLR_DEBUG, " %s: ✓ texture %s render", mod_desc, external_only ? "✗" : "✓"); + free(mod_desc); } static void init_dmabuf_formats(struct wlr_egl *egl) { @@ -166,10 +166,9 @@ static void init_dmabuf_formats(struct wlr_egl *egl) { } if (wlr_log_get_verbosity() >= WLR_DEBUG) { - char *fmt_name = drmGetFormatName(fmt); - wlr_log(WLR_DEBUG, " %s (0x%08"PRIX32")", - fmt_name ? fmt_name : "", fmt); - free(fmt_name); + char *fmt_desc = get_drm_format_description(fmt); + wlr_log(WLR_DEBUG, " %s", fmt_desc); + free(fmt_desc); log_modifier(DRM_FORMAT_MOD_INVALID, false); if (modifiers_len == 0) { diff --git a/render/pixel_format.c b/render/pixel_format.c index b83069b81..8ad58ae32 100644 --- a/render/pixel_format.c +++ b/render/pixel_format.c @@ -1,6 +1,9 @@ #include #include +#include +#include #include +#include #include "render/pixel_format.h" static const struct wlr_pixel_format_info pixel_format_info[] = { @@ -211,3 +214,38 @@ bool pixel_format_info_check_stride(const struct wlr_pixel_format_info *fmt, } return true; } + +static char *format_str(const char *fmt, ...) { + va_list args; + va_start(args, fmt); + int len = vsnprintf(NULL, 0, fmt, args); + va_end(args); + if (len < 0) { + return NULL; + } + + char *str = malloc(len + 1); + if (str == NULL) { + return NULL; + } + + va_start(args, fmt); + vsnprintf(str, len + 1, fmt, args); + va_end(args); + + return str; +} + +char *get_drm_format_description(uint32_t format) { + char *name = drmGetFormatName(format); + char *str = format_str("%s (0x%08"PRIX32")", name ? name : "", format); + free(name); + return str; +} + +char *get_drm_modifier_description(uint64_t modifier) { + char *name = drmGetFormatModifierName(modifier); + char *str = format_str("%s (0x%016"PRIX64")", name ? name : "", modifier); + free(name); + return str; +} diff --git a/render/vulkan/pixel_format.c b/render/vulkan/pixel_format.c index 59be20415..e16cc0a46 100644 --- a/render/vulkan/pixel_format.c +++ b/render/vulkan/pixel_format.c @@ -3,7 +3,7 @@ #include #include #include -#include +#include "render/pixel_format.h" #include "render/vulkan.h" static const struct wlr_vk_format formats[] = { @@ -333,12 +333,10 @@ static bool query_modifier_support(struct wlr_vk_device *dev, snprintf(texture_status, sizeof(texture_status), "✓ texture"); } - char *modifier_name = drmGetFormatModifierName(m.drmFormatModifier); - wlr_log(WLR_DEBUG, " DMA-BUF modifier %s " - "(0x%016"PRIX64", %"PRIu32" planes): %s %s", - modifier_name ? modifier_name : "", m.drmFormatModifier, - m.drmFormatModifierPlaneCount, texture_status, render_status); - free(modifier_name); + char *modifier_desc = get_drm_modifier_description(m.drmFormatModifier); + wlr_log(WLR_DEBUG, " DMA-BUF modifier %s: %"PRIu32" planes, %s %s", + modifier_desc, m.drmFormatModifierPlaneCount, texture_status, render_status); + free(modifier_desc); } free(modp.pDrmFormatModifierProperties); @@ -353,10 +351,9 @@ void vulkan_format_props_query(struct wlr_vk_device *dev, return; } - char *format_name = drmGetFormatName(format->drm); - wlr_log(WLR_DEBUG, " %s (0x%08"PRIX32")", - format_name ? format_name : "", format->drm); - free(format_name); + char *format_desc = get_drm_format_description(format->drm); + wlr_log(WLR_DEBUG, " %s", format_desc); + free(format_desc); VkDrmFormatModifierPropertiesListEXT modp = { .sType = VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT, diff --git a/types/output/swapchain.c b/types/output/swapchain.c index 12018a3c9..df33cfb1b 100644 --- a/types/output/swapchain.c +++ b/types/output/swapchain.c @@ -4,9 +4,9 @@ #include #include #include -#include #include "render/drm_format_set.h" +#include "render/pixel_format.h" #include "types/wlr_output.h" static struct wlr_swapchain *create_swapchain(struct wlr_output *output, @@ -24,10 +24,10 @@ static struct wlr_swapchain *create_swapchain(struct wlr_output *output, return NULL; } - char *format_name = drmGetFormatName(format->format); - wlr_log(WLR_DEBUG, "Choosing primary buffer format %s (0x%08"PRIX32") for output '%s'", - format_name ? format_name : "", format->format, output->name); - free(format_name); + char *format_desc = get_drm_format_description(format->format); + wlr_log(WLR_DEBUG, "Choosing primary buffer format %s for output '%s'", + format_desc, output->name); + free(format_desc); if (!allow_modifiers && (format->len != 1 || format->modifiers[0] != DRM_FORMAT_MOD_LINEAR)) { if (!wlr_drm_format_has(format, DRM_FORMAT_MOD_INVALID)) {