mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-03 18:00:10 +01:00
anv,vulkan: Move drm_format_mod to vk_image
Even though we can't really do the parsing on behalf of the driver (it's too complicated), storing it in the vk_image lets us provide a common implementation of vkGetImageDrmFormatModifierPropertiesEXT(). It'll also be useful in the next few commits for swapchain images. Reviewed-by: Iago Toral Quiroga <itoral@igalia.com> Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12023>
This commit is contained in:
parent
0f2afa0abc
commit
def2cb9808
5 changed files with 57 additions and 38 deletions
|
|
@ -71,7 +71,7 @@ image_aspect_to_binding(struct anv_image *image, VkImageAspectFlags aspect)
|
|||
/* We don't advertise DISJOINT for modifiers with aux, and therefore we
|
||||
* don't handle queries of the modifier's "aux plane" here.
|
||||
*/
|
||||
assert(!isl_drm_modifier_has_aux(image->drm_format_mod));
|
||||
assert(!isl_drm_modifier_has_aux(image->vk.drm_format_mod));
|
||||
|
||||
plane = aspect - VK_IMAGE_ASPECT_MEMORY_PLANE_0_BIT_EXT;
|
||||
} else {
|
||||
|
|
@ -482,7 +482,7 @@ add_aux_state_tracking_buffer(struct anv_device *device,
|
|||
enum anv_image_memory_binding binding =
|
||||
ANV_IMAGE_MEMORY_BINDING_PLANE_0 + plane;
|
||||
|
||||
if (image->drm_format_mod != DRM_FORMAT_MOD_INVALID)
|
||||
if (image->vk.drm_format_mod != DRM_FORMAT_MOD_INVALID)
|
||||
binding = ANV_IMAGE_MEMORY_BINDING_PRIVATE;
|
||||
|
||||
/* We believe that 256B alignment may be sufficient, but we choose 4K due to
|
||||
|
|
@ -687,8 +687,8 @@ add_aux_surface_if_supported(struct anv_device *device,
|
|||
enum anv_image_memory_binding binding =
|
||||
ANV_IMAGE_MEMORY_BINDING_PLANE_0 + plane;
|
||||
|
||||
if (image->drm_format_mod != DRM_FORMAT_MOD_INVALID &&
|
||||
!isl_drm_modifier_has_aux(image->drm_format_mod))
|
||||
if (image->vk.drm_format_mod != DRM_FORMAT_MOD_INVALID &&
|
||||
!isl_drm_modifier_has_aux(image->vk.drm_format_mod))
|
||||
binding = ANV_IMAGE_MEMORY_BINDING_PRIVATE;
|
||||
|
||||
result = add_surface(device, image, &image->planes[plane].aux_surface,
|
||||
|
|
@ -897,8 +897,8 @@ check_memory_bindings(const struct anv_device *device,
|
|||
if (anv_surface_is_valid(&plane->aux_surface)) {
|
||||
enum anv_image_memory_binding binding = primary_binding;
|
||||
|
||||
if (image->drm_format_mod != DRM_FORMAT_MOD_INVALID &&
|
||||
!isl_drm_modifier_has_aux(image->drm_format_mod))
|
||||
if (image->vk.drm_format_mod != DRM_FORMAT_MOD_INVALID &&
|
||||
!isl_drm_modifier_has_aux(image->vk.drm_format_mod))
|
||||
binding = ANV_IMAGE_MEMORY_BINDING_PRIVATE;
|
||||
|
||||
/* Display hardware requires that the aux surface start at
|
||||
|
|
@ -915,7 +915,7 @@ check_memory_bindings(const struct anv_device *device,
|
|||
if (plane->fast_clear_memory_range.size > 0) {
|
||||
enum anv_image_memory_binding binding = primary_binding;
|
||||
|
||||
if (image->drm_format_mod != DRM_FORMAT_MOD_INVALID)
|
||||
if (image->vk.drm_format_mod != DRM_FORMAT_MOD_INVALID)
|
||||
binding = ANV_IMAGE_MEMORY_BINDING_PRIVATE;
|
||||
|
||||
/* We believe that 256B alignment may be sufficient, but we choose 4K
|
||||
|
|
@ -957,14 +957,14 @@ check_drm_format_mod(const struct anv_device *device,
|
|||
const struct anv_image *image)
|
||||
{
|
||||
/* Image must have a modifier if and only if it has modifier tiling. */
|
||||
assert((image->drm_format_mod != DRM_FORMAT_MOD_INVALID) ==
|
||||
assert((image->vk.drm_format_mod != DRM_FORMAT_MOD_INVALID) ==
|
||||
(image->vk.tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT));
|
||||
|
||||
if (image->drm_format_mod == DRM_FORMAT_MOD_INVALID)
|
||||
if (image->vk.drm_format_mod == DRM_FORMAT_MOD_INVALID)
|
||||
return VK_SUCCESS;
|
||||
|
||||
const struct isl_drm_modifier_info *isl_mod_info =
|
||||
isl_drm_modifier_get_info(image->drm_format_mod);
|
||||
isl_drm_modifier_get_info(image->vk.drm_format_mod);
|
||||
|
||||
/* Driver must support the modifier. */
|
||||
assert(isl_drm_modifier_get_score(&device->info, isl_mod_info->modifier));
|
||||
|
|
@ -1291,11 +1291,11 @@ anv_image_create(VkDevice _device,
|
|||
}
|
||||
|
||||
assert(isl_mod_info);
|
||||
assert(image->vk.drm_format_mod == DRM_FORMAT_MOD_INVALID);
|
||||
image->vk.drm_format_mod = isl_mod_info->modifier;
|
||||
}
|
||||
|
||||
image->needs_set_tiling = wsi_info && wsi_info->scanout;
|
||||
image->drm_format_mod = isl_mod_info ? isl_mod_info->modifier :
|
||||
DRM_FORMAT_MOD_INVALID;
|
||||
|
||||
for (int i = 0; i < ANV_IMAGE_MEMORY_BINDING_END; ++i) {
|
||||
image->bindings[i] = (struct anv_image_binding) {
|
||||
|
|
@ -1406,10 +1406,10 @@ anv_image_from_swapchain(VkDevice device,
|
|||
VkImageDrmFormatModifierListCreateInfoEXT local_modifier_info = {
|
||||
.sType = VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT,
|
||||
.drmFormatModifierCount = 1,
|
||||
.pDrmFormatModifiers = &swapchain_image->drm_format_mod,
|
||||
.pDrmFormatModifiers = &swapchain_image->vk.drm_format_mod,
|
||||
};
|
||||
|
||||
if (swapchain_image->drm_format_mod != DRM_FORMAT_MOD_INVALID)
|
||||
if (swapchain_image->vk.drm_format_mod != DRM_FORMAT_MOD_INVALID)
|
||||
__vk_append_struct(&local_create_info, &local_modifier_info);
|
||||
|
||||
assert(swapchain_image->vk.image_type == local_create_info.imageType);
|
||||
|
|
@ -1846,7 +1846,7 @@ void anv_GetImageSubresourceLayout(
|
|||
unreachable("bad VkImageAspectFlags");
|
||||
}
|
||||
|
||||
if (mem_plane == 1 && isl_drm_modifier_has_aux(image->drm_format_mod)) {
|
||||
if (mem_plane == 1 && isl_drm_modifier_has_aux(image->vk.drm_format_mod)) {
|
||||
assert(image->n_planes == 1);
|
||||
/* If the memory binding differs between primary and aux, then the
|
||||
* returned offset will be incorrect.
|
||||
|
|
@ -1887,21 +1887,6 @@ void anv_GetImageSubresourceLayout(
|
|||
}
|
||||
}
|
||||
|
||||
VkResult anv_GetImageDrmFormatModifierPropertiesEXT(
|
||||
VkDevice device,
|
||||
VkImage _image,
|
||||
VkImageDrmFormatModifierPropertiesEXT* pProperties)
|
||||
{
|
||||
ANV_FROM_HANDLE(anv_image, image, _image);
|
||||
|
||||
assert(pProperties->sType ==
|
||||
VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT);
|
||||
|
||||
pProperties->drmFormatModifier = image->drm_format_mod;
|
||||
|
||||
return VK_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* This function returns the assumed isl_aux_state for a given VkImageLayout.
|
||||
* Because Vulkan image layouts don't map directly to isl_aux_state enums, the
|
||||
|
|
@ -1962,7 +1947,7 @@ anv_layout_to_aux_state(const struct intel_device_info * const devinfo,
|
|||
assert(image->vk.aspects == VK_IMAGE_ASPECT_COLOR_BIT);
|
||||
|
||||
enum isl_aux_state aux_state =
|
||||
isl_drm_modifier_get_default_aux_state(image->drm_format_mod);
|
||||
isl_drm_modifier_get_default_aux_state(image->vk.drm_format_mod);
|
||||
|
||||
switch (aux_state) {
|
||||
default:
|
||||
|
|
|
|||
|
|
@ -3961,12 +3961,6 @@ struct anv_image {
|
|||
*/
|
||||
bool needs_set_tiling;
|
||||
|
||||
/**
|
||||
* Must be DRM_FORMAT_MOD_INVALID unless tiling is
|
||||
* VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT.
|
||||
*/
|
||||
uint64_t drm_format_mod;
|
||||
|
||||
/**
|
||||
* Image has multi-planar format and was created with
|
||||
* VK_IMAGE_CREATE_DISJOINT_BIT.
|
||||
|
|
|
|||
|
|
@ -1184,7 +1184,7 @@ transition_color_buffer(struct anv_cmd_buffer *cmd_buffer,
|
|||
final_layout != VK_IMAGE_LAYOUT_PREINITIALIZED);
|
||||
const struct isl_drm_modifier_info *isl_mod_info =
|
||||
image->vk.tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT
|
||||
? isl_drm_modifier_get_info(image->drm_format_mod)
|
||||
? isl_drm_modifier_get_info(image->vk.drm_format_mod)
|
||||
: NULL;
|
||||
|
||||
const bool src_queue_external =
|
||||
|
|
|
|||
|
|
@ -25,7 +25,12 @@
|
|||
|
||||
#include <vulkan/vulkan_android.h>
|
||||
|
||||
#ifndef _WIN32
|
||||
#include <drm-uapi/drm_fourcc.h>
|
||||
#endif
|
||||
|
||||
#include "vk_alloc.h"
|
||||
#include "vk_common_entrypoints.h"
|
||||
#include "vk_device.h"
|
||||
#include "vk_format.h"
|
||||
#include "vk_util.h"
|
||||
|
|
@ -95,6 +100,10 @@ vk_image_init(struct vk_device *device,
|
|||
else
|
||||
image->external_handle_types = 0;
|
||||
|
||||
#ifndef _WIN32
|
||||
image->drm_format_mod = ((1ULL << 56) - 1) /* DRM_FORMAT_MOD_INVALID */;
|
||||
#endif
|
||||
|
||||
#ifdef ANDROID
|
||||
const VkExternalFormatANDROID *ext_format =
|
||||
vk_find_struct_const(pCreateInfo->pNext, EXTERNAL_FORMAT_ANDROID);
|
||||
|
|
@ -140,6 +149,24 @@ vk_image_destroy(struct vk_device *device,
|
|||
vk_object_free(device, alloc, image);
|
||||
}
|
||||
|
||||
#ifndef _WIN32
|
||||
VKAPI_ATTR VkResult VKAPI_CALL
|
||||
vk_common_GetImageDrmFormatModifierPropertiesEXT(UNUSED VkDevice device,
|
||||
VkImage _image,
|
||||
VkImageDrmFormatModifierPropertiesEXT *pProperties)
|
||||
{
|
||||
VK_FROM_HANDLE(vk_image, image, _image);
|
||||
|
||||
assert(pProperties->sType ==
|
||||
VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT);
|
||||
|
||||
assert(image->tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT);
|
||||
pProperties->drmFormatModifier = image->drm_format_mod;
|
||||
|
||||
return VK_SUCCESS;
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
vk_image_set_format(struct vk_image *image, VkFormat format)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -53,6 +53,19 @@ struct vk_image {
|
|||
/* VK_KHR_external_memory */
|
||||
VkExternalMemoryHandleTypeFlags external_handle_types;
|
||||
|
||||
#ifndef _WIN32
|
||||
/* VK_EXT_drm_format_modifier
|
||||
*
|
||||
* Initialized by vk_image_create/init() to DRM_FORMAT_MOD_INVALID. It's
|
||||
* the job of the driver to parse the VK_EXT_drm_format_modifier extension
|
||||
* structs and choose the actual modifier.
|
||||
*
|
||||
* Must be DRM_FORMAT_MOD_INVALID unless tiling is
|
||||
* VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT.
|
||||
*/
|
||||
uint64_t drm_format_mod;
|
||||
#endif
|
||||
|
||||
#ifdef ANDROID
|
||||
/* VK_ANDROID_external_memory_android_hardware_buffer */
|
||||
uint64_t android_external_format;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue