On Tue, Nov 7, 2017 at 6:48 AM, Chad Versace <chadvers...@chromium.org> wrote:
> Incremental implementation of VK_EXT_image_drm_format_modifier. > --- > src/intel/vulkan/anv_formats.c | 45 ++++++++++++++++++++++++++++++ > +++++++----- > 1 file changed, 40 insertions(+), 5 deletions(-) > > diff --git a/src/intel/vulkan/anv_formats.c b/src/intel/vulkan/anv_ > formats.c > index dc46fdb5425..d6eeb9d1c45 100644 > --- a/src/intel/vulkan/anv_formats.c > +++ b/src/intel/vulkan/anv_formats.c > @@ -813,6 +813,7 @@ static VkResult > anv_get_image_format_properties( > struct anv_physical_device *physical_device, > const VkPhysicalDeviceImageFormatInfo2KHR *info, > + const VkPhysicalDeviceImageDrmFormatModifierInfoEXT *drm_info, > VkImageFormatProperties *pImageFormatProperties, > VkSamplerYcbcrConversionImageFormatPropertiesKHR > *pYcbcrImageFormatProperties) > { > @@ -826,14 +827,34 @@ anv_get_image_format_properties( > if (format == NULL) > goto unsupported; > > + uint64_t drm_format_mod = DRM_FORMAT_MOD_INVALID; > + if (drm_info) { > + assert(info->tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT); > + drm_format_mod = drm_info->drmFormatModifier; > + } > + > VkFormatFeatureFlags format_feature_flags = > get_image_format_features(devinfo, info->format, format, > info->tiling, > - DRM_FORMAT_MOD_INVALID); > + drm_format_mod); > + > + /* The core Vulkan spec places strict constraints on the image > capabilities > + * advertised here. For example, the core spec requires that > + * maxMipLevels == log2(maxWidth) + 1 > + * when tiling is VK_IMAGE_TILING_OPTIMAL; and requires that > + * maxExtent >= VkPhysicalDeviceLimits::maxImageDimension${N}D. > + * However, the VK_EXT_image_drm_format_modifier specification grants > the > + * implementation the freedom to further restrict the image > capabilities > + * when tiling is VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT. > How about adding one extra paragraph here saying that we choose to only support "simple" 2D images. > + */ > > switch (info->type) { > default: > unreachable("bad VkImageType"); > case VK_IMAGE_TYPE_1D: > + /* We reject 1D images with modifiers due to FUD */ > We could support 1D but meh. Just use a texture buffer instead. > + if (drm_info) > + goto unsupported; > + > maxExtent.width = 16384; > maxExtent.height = 1; > maxExtent.depth = 1; > @@ -848,10 +869,20 @@ anv_get_image_format_properties( > maxExtent.width = 16384; > maxExtent.height = 16384; > maxExtent.depth = 1; > - maxMipLevels = 15; /* log2(maxWidth) + 1 */ > - maxArraySize = 2048; > + > + if (drm_info) { > + maxMipLevels = 1; > + maxArraySize = 1; > + } else { > + maxMipLevels = 15; /* log2(maxWidth) + 1 */ > + maxArraySize = 2048; > + } > break; > case VK_IMAGE_TYPE_3D: > + /* We reject 3D images with modifiers due to FUD */ > I have neither uncertainty nor doubt, but I do have a very healthy helping of fear. :-) Let's just go with a global comment above and drop the ones that make us look like cowards. :-P > + if (drm_info) > + goto unsupported; > + > maxExtent.width = 2048; > maxExtent.height = 2048; > maxExtent.depth = 2048; > @@ -976,7 +1007,7 @@ VkResult anv_GetPhysicalDeviceImageFormatProperties( > .flags = createFlags, > }; > > - return anv_get_image_format_properties(physical_device, &info, > + return anv_get_image_format_properties(physical_device, &info, NULL, > pImageFormatProperties, NULL); > } > > @@ -1009,6 +1040,7 @@ VkResult anv_GetPhysicalDeviceImageFormatPr > operties2KHR( > { > ANV_FROM_HANDLE(anv_physical_device, physical_device, physicalDevice); > const VkPhysicalDeviceExternalImageFormatInfoKHR *external_info = > NULL; > + const VkPhysicalDeviceImageDrmFormatModifierInfoEXT *drm_info = NULL; > VkExternalImageFormatPropertiesKHR *external_props = NULL; > VkSamplerYcbcrConversionImageFormatPropertiesKHR *ycbcr_props = NULL; > VkResult result; > @@ -1019,6 +1051,9 @@ VkResult anv_GetPhysicalDeviceImageFormatPr > operties2KHR( > case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_ > INFO_KHR: > external_info = (const void *) s; > break; > + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_ > MODIFIER_INFO_EXT: > + drm_info = (const void *) s; > + break; > default: > anv_debug_ignored_stype(s->sType); > break; > @@ -1041,7 +1076,7 @@ VkResult anv_GetPhysicalDeviceImageFormatPr > operties2KHR( > } > > result = anv_get_image_format_properties(physical_device, base_info, > - &base_props->imageFormatProperties, ycbcr_props); > + drm_info, &base_props->imageFormatProperties, > ycbcr_props); > if (result != VK_SUCCESS) > goto fail; > > -- > 2.13.0 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev >
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev