Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 27 additions & 1 deletion src/Backends/DRMBackend.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -709,7 +709,33 @@ static uint32_t pick_plane_format( const struct wlr_drm_format_set *formats, uin
result = fmt;
}
}
return result;

// Ensure we can use that format on the Vulkan device
VkFormat vkFmt = DRMFormatToVulkan(result, false);
VkDrmFormatModifierPropertiesListEXT modifierPropList = {
.sType = VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT,
};
VkFormatProperties2 formatProps = {
.sType = VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2,
.pNext = &modifierPropList,
};

g_device.vk.GetPhysicalDeviceFormatProperties2( g_device.physDev(), vkFmt, &formatProps );

if ( modifierPropList.drmFormatModifierCount == 0 )
return DRM_FORMAT_INVALID;

std::vector<VkDrmFormatModifierPropertiesEXT> modifierProps(modifierPropList.drmFormatModifierCount);
modifierPropList.pDrmFormatModifierProperties = modifierProps.data();
g_device.vk.GetPhysicalDeviceFormatProperties2( g_device.physDev(), vkFmt, &formatProps );

for ( size_t j = 0; j < modifierProps.size(); j++ ) {
const VkFormatFeatureFlags neededFeatures = VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
if ( ( modifierProps[j].drmFormatModifierTilingFeatures & neededFeatures ) == neededFeatures )
return result;
}

return DRM_FORMAT_INVALID;
}

/* Pick a primary plane that can be connected to the chosen CRTC. */
Expand Down