One other comment (that I don't know what patch to make it on): I think we want to disallow the MUTABLE_FORMAT create bit with at least the CCS modifier. Also, the CCS modifier needs to only be usable with CCS-supported formats. You may have already thought of those two things but I wanted to get it out of my brain.
--Jason On Tue, Nov 7, 2017 at 12:38 PM, Jason Ekstrand <ja...@jlekstrand.net> wrote: > > > 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_GetPhysicalDeviceImageForm >> atProperties2KHR( >> { >> 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_GetPhysicalDeviceImageForm >> atProperties2KHR( >> 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_GetPhysicalDeviceImageForm >> atProperties2KHR( >> } >> >> 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