mirror of
https://gitlab.freedesktop.org/wlroots/wlroots.git
synced 2026-02-05 04:06:11 -05:00
vulkan: make use of new pixel_format_is_ycbcr function
This commit is contained in:
parent
7ca85d7a21
commit
8f2ef81666
5 changed files with 20 additions and 27 deletions
|
|
@ -86,7 +86,6 @@ struct wlr_vk_format {
|
|||
uint32_t drm;
|
||||
VkFormat vk;
|
||||
VkFormat vk_srgb; // sRGB version of the format, or 0 if nonexistent
|
||||
bool is_ycbcr;
|
||||
};
|
||||
|
||||
extern const VkImageUsageFlags vulkan_render_usage, vulkan_shm_tex_usage, vulkan_dma_tex_usage;
|
||||
|
|
@ -125,6 +124,7 @@ void vulkan_format_props_query(struct wlr_vk_device *dev,
|
|||
const struct wlr_vk_format_modifier_props *vulkan_format_props_find_modifier(
|
||||
const struct wlr_vk_format_props *props, uint64_t mod, bool render);
|
||||
void vulkan_format_props_finish(struct wlr_vk_format_props *props);
|
||||
bool vulkan_format_is_ycbcr(const struct wlr_vk_format *format);
|
||||
|
||||
struct wlr_vk_pipeline_layout_key {
|
||||
enum wlr_scale_filter_mode filter_mode;
|
||||
|
|
|
|||
|
|
@ -822,12 +822,13 @@ static void render_pass_add_texture(struct wlr_render_pass *wlr_pass,
|
|||
}
|
||||
|
||||
enum wlr_color_encoding color_encoding = options->color_encoding;
|
||||
if (texture->format->is_ycbcr && color_encoding == WLR_COLOR_ENCODING_NONE) {
|
||||
bool is_ycbcr = vulkan_format_is_ycbcr(texture->format);
|
||||
if (is_ycbcr && color_encoding == WLR_COLOR_ENCODING_NONE) {
|
||||
color_encoding = WLR_COLOR_ENCODING_BT601;
|
||||
}
|
||||
|
||||
enum wlr_color_range color_range = options->color_range;
|
||||
if (texture->format->is_ycbcr && color_range == WLR_COLOR_RANGE_NONE) {
|
||||
if (is_ycbcr && color_range == WLR_COLOR_RANGE_NONE) {
|
||||
color_range = WLR_COLOR_RANGE_LIMITED;
|
||||
}
|
||||
|
||||
|
|
@ -837,7 +838,7 @@ static void render_pass_add_texture(struct wlr_render_pass *wlr_pass,
|
|||
.source = WLR_VK_SHADER_SOURCE_TEXTURE,
|
||||
.layout = {
|
||||
.ycbcr = {
|
||||
.format = texture->format->is_ycbcr ? texture->format : NULL,
|
||||
.format = is_ycbcr ? texture->format : NULL,
|
||||
.encoding = color_encoding,
|
||||
.range = color_range,
|
||||
},
|
||||
|
|
|
|||
|
|
@ -182,37 +182,30 @@ static const struct wlr_vk_format formats[] = {
|
|||
{
|
||||
.drm = DRM_FORMAT_UYVY,
|
||||
.vk = VK_FORMAT_B8G8R8G8_422_UNORM,
|
||||
.is_ycbcr = true,
|
||||
},
|
||||
{
|
||||
.drm = DRM_FORMAT_YUYV,
|
||||
.vk = VK_FORMAT_G8B8G8R8_422_UNORM,
|
||||
.is_ycbcr = true,
|
||||
},
|
||||
{
|
||||
.drm = DRM_FORMAT_NV12,
|
||||
.vk = VK_FORMAT_G8_B8R8_2PLANE_420_UNORM,
|
||||
.is_ycbcr = true,
|
||||
},
|
||||
{
|
||||
.drm = DRM_FORMAT_NV16,
|
||||
.vk = VK_FORMAT_G8_B8R8_2PLANE_422_UNORM,
|
||||
.is_ycbcr = true,
|
||||
},
|
||||
{
|
||||
.drm = DRM_FORMAT_YUV420,
|
||||
.vk = VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM,
|
||||
.is_ycbcr = true,
|
||||
},
|
||||
{
|
||||
.drm = DRM_FORMAT_YUV422,
|
||||
.vk = VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM,
|
||||
.is_ycbcr = true,
|
||||
},
|
||||
{
|
||||
.drm = DRM_FORMAT_YUV444,
|
||||
.vk = VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM,
|
||||
.is_ycbcr = true,
|
||||
},
|
||||
// 3PACK16 formats split the memory in three 16-bit words, so they have an
|
||||
// inverted channel order compared to DRM formats.
|
||||
|
|
@ -220,27 +213,22 @@ static const struct wlr_vk_format formats[] = {
|
|||
{
|
||||
.drm = DRM_FORMAT_P010,
|
||||
.vk = VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16,
|
||||
.is_ycbcr = true,
|
||||
},
|
||||
{
|
||||
.drm = DRM_FORMAT_P210,
|
||||
.vk = VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16,
|
||||
.is_ycbcr = true,
|
||||
},
|
||||
{
|
||||
.drm = DRM_FORMAT_P012,
|
||||
.vk = VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16,
|
||||
.is_ycbcr = true,
|
||||
},
|
||||
{
|
||||
.drm = DRM_FORMAT_P016,
|
||||
.vk = VK_FORMAT_G16_B16R16_2PLANE_420_UNORM,
|
||||
.is_ycbcr = true,
|
||||
},
|
||||
{
|
||||
.drm = DRM_FORMAT_Q410,
|
||||
.vk = VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16,
|
||||
.is_ycbcr = true,
|
||||
},
|
||||
#endif
|
||||
// TODO: add DRM_FORMAT_NV24/VK_FORMAT_G8_B8R8_2PLANE_444_UNORM (requires
|
||||
|
|
@ -446,7 +434,7 @@ static bool query_modifier_support(struct wlr_vk_device *dev,
|
|||
// check that specific modifier for render usage
|
||||
const char *errmsg = "unknown error";
|
||||
if ((m.drmFormatModifierTilingFeatures & render_features) == render_features &&
|
||||
!props->format.is_ycbcr) {
|
||||
!vulkan_format_is_ycbcr(&props->format)) {
|
||||
struct wlr_vk_format_modifier_props p = {0};
|
||||
bool supported = false;
|
||||
if (query_modifier_usage_support(dev, props->format.vk,
|
||||
|
|
@ -477,7 +465,7 @@ static bool query_modifier_support(struct wlr_vk_device *dev,
|
|||
// check that specific modifier for texture usage
|
||||
errmsg = "unknown error";
|
||||
VkFormatFeatureFlags features = dma_tex_features;
|
||||
if (props->format.is_ycbcr) {
|
||||
if(vulkan_format_is_ycbcr(&props->format)) {
|
||||
features |= ycbcr_tex_features;
|
||||
}
|
||||
if ((m.drmFormatModifierTilingFeatures & features) == features) {
|
||||
|
|
@ -522,7 +510,7 @@ static bool query_modifier_support(struct wlr_vk_device *dev,
|
|||
|
||||
void vulkan_format_props_query(struct wlr_vk_device *dev,
|
||||
const struct wlr_vk_format *format) {
|
||||
if (format->is_ycbcr && !dev->sampler_ycbcr_conversion) {
|
||||
if (vulkan_format_is_ycbcr(format) && !dev->sampler_ycbcr_conversion) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -551,7 +539,7 @@ void vulkan_format_props_query(struct wlr_vk_device *dev,
|
|||
char shm_texture_status[256];
|
||||
const char *errmsg = "unknown error";
|
||||
if ((fmtp.formatProperties.optimalTilingFeatures & shm_tex_features) == shm_tex_features &&
|
||||
!format->is_ycbcr && format_info != NULL) {
|
||||
!vulkan_format_is_ycbcr(format) && format_info != NULL) {
|
||||
VkImageFormatProperties ifmtp;
|
||||
bool supported = false, has_mutable_srgb = false;
|
||||
if (query_shm_support(dev, format->vk, format->vk_srgb, &ifmtp, &errmsg)) {
|
||||
|
|
@ -621,3 +609,7 @@ const struct wlr_vk_format_modifier_props *vulkan_format_props_find_modifier(
|
|||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
bool vulkan_format_is_ycbcr(const struct wlr_vk_format *format) {
|
||||
return pixel_format_is_ycbcr(format->drm);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1630,8 +1630,8 @@ static bool init_blend_to_output_layouts(struct wlr_vk_renderer *renderer) {
|
|||
static bool pipeline_layout_key_equals(
|
||||
const struct wlr_vk_pipeline_layout_key *a,
|
||||
const struct wlr_vk_pipeline_layout_key *b) {
|
||||
assert(!a->ycbcr.format || a->ycbcr.format->is_ycbcr);
|
||||
assert(!b->ycbcr.format || b->ycbcr.format->is_ycbcr);
|
||||
assert(!a->ycbcr.format || vulkan_format_is_ycbcr(a->ycbcr.format));
|
||||
assert(!b->ycbcr.format || vulkan_format_is_ycbcr(b->ycbcr.format));
|
||||
|
||||
if (a->filter_mode != b->filter_mode) {
|
||||
return false;
|
||||
|
|
|
|||
|
|
@ -297,7 +297,7 @@ struct wlr_vk_texture_view *vulkan_texture_get_or_create_view(struct wlr_vk_text
|
|||
.components.r = VK_COMPONENT_SWIZZLE_IDENTITY,
|
||||
.components.g = VK_COMPONENT_SWIZZLE_IDENTITY,
|
||||
.components.b = VK_COMPONENT_SWIZZLE_IDENTITY,
|
||||
.components.a = texture->has_alpha || texture->format->is_ycbcr
|
||||
.components.a = texture->has_alpha || vulkan_format_is_ycbcr(texture->format)
|
||||
? VK_COMPONENT_SWIZZLE_IDENTITY
|
||||
: VK_COMPONENT_SWIZZLE_ONE,
|
||||
.subresourceRange = (VkImageSubresourceRange){
|
||||
|
|
@ -311,7 +311,7 @@ struct wlr_vk_texture_view *vulkan_texture_get_or_create_view(struct wlr_vk_text
|
|||
};
|
||||
|
||||
VkSamplerYcbcrConversionInfo ycbcr_conversion_info;
|
||||
if (texture->format->is_ycbcr) {
|
||||
if (vulkan_format_is_ycbcr(texture->format)) {
|
||||
assert(pipeline_layout->ycbcr.conversion != VK_NULL_HANDLE);
|
||||
ycbcr_conversion_info = (VkSamplerYcbcrConversionInfo){
|
||||
.sType = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO,
|
||||
|
|
@ -355,7 +355,7 @@ struct wlr_vk_texture_view *vulkan_texture_get_or_create_view(struct wlr_vk_text
|
|||
|
||||
static void texture_set_format(struct wlr_vk_texture *texture,
|
||||
const struct wlr_vk_format *format, bool has_mutable_srgb) {
|
||||
assert(!(format->is_ycbcr && has_mutable_srgb));
|
||||
assert(!(vulkan_format_is_ycbcr(format) && has_mutable_srgb));
|
||||
|
||||
texture->format = format;
|
||||
texture->using_mutable_srgb = has_mutable_srgb;
|
||||
|
|
@ -366,7 +366,7 @@ static void texture_set_format(struct wlr_vk_texture *texture,
|
|||
texture->has_alpha = pixel_format_has_alpha(format->drm);
|
||||
} else {
|
||||
// We don't have format info for multi-planar formats
|
||||
assert(texture->format->is_ycbcr);
|
||||
assert(vulkan_format_is_ycbcr(texture->format));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -378,7 +378,7 @@ static struct wlr_texture *vulkan_texture_from_pixels(
|
|||
|
||||
const struct wlr_vk_format_props *fmt =
|
||||
vulkan_format_props_from_drm(renderer->dev, drm_fmt);
|
||||
if (fmt == NULL || fmt->format.is_ycbcr) {
|
||||
if (fmt == NULL || vulkan_format_is_ycbcr(&fmt->format)) {
|
||||
char *format_name = drmGetFormatName(drm_fmt);
|
||||
wlr_log(WLR_ERROR, "Unsupported pixel format %s (0x%08"PRIX32")",
|
||||
format_name, drm_fmt);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue