Compare commits
	
		
			30 Commits
		
	
	
		
			mesa-19.0.
			...
			chadv/revi
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					e44b35b37e | ||
| 
						 | 
					944e61008a | ||
| 
						 | 
					d545897f1a | ||
| 
						 | 
					bd1790f1d9 | ||
| 
						 | 
					2685679968 | ||
| 
						 | 
					373ecbf8ab | ||
| 
						 | 
					c8f0b002da | ||
| 
						 | 
					8e166eecee | ||
| 
						 | 
					4cd3a73ed1 | ||
| 
						 | 
					70161846d8 | ||
| 
						 | 
					17ef581adb | ||
| 
						 | 
					d71413dd6b | ||
| 
						 | 
					22478b2a77 | ||
| 
						 | 
					a104d1cd49 | ||
| 
						 | 
					a4486851a9 | ||
| 
						 | 
					d83cea80e2 | ||
| 
						 | 
					609011efdf | ||
| 
						 | 
					8c0913a9df | ||
| 
						 | 
					ef2210dc92 | ||
| 
						 | 
					05d4bee6e6 | ||
| 
						 | 
					a1129f62cd | ||
| 
						 | 
					819d1bf09e | ||
| 
						 | 
					2a6da977c1 | ||
| 
						 | 
					76386219f2 | ||
| 
						 | 
					3db0bb0364 | ||
| 
						 | 
					0d43429ede | ||
| 
						 | 
					6a309c52c7 | ||
| 
						 | 
					24f839f53a | ||
| 
						 | 
					39f8866a85 | ||
| 
						 | 
					05c3ec7e89 | 
@@ -66,3 +66,14 @@ if with_egl
 | 
				
			|||||||
    subdir : 'EGL',
 | 
					    subdir : 'EGL',
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# HACK
 | 
				
			||||||
 | 
					if _vulkan_drivers != []
 | 
				
			||||||
 | 
					  install_headers(
 | 
				
			||||||
 | 
					    'vulkan/vk_android_native_buffer.h',
 | 
				
			||||||
 | 
					    'vulkan/vk_icd.h',
 | 
				
			||||||
 | 
					    'vulkan/vk_platform.h',
 | 
				
			||||||
 | 
					    'vulkan/vulkan.h',
 | 
				
			||||||
 | 
					    subdir : 'vulkan',
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -43,7 +43,7 @@ extern "C" {
 | 
				
			|||||||
#define VK_VERSION_MINOR(version) (((uint32_t)(version) >> 12) & 0x3ff)
 | 
					#define VK_VERSION_MINOR(version) (((uint32_t)(version) >> 12) & 0x3ff)
 | 
				
			||||||
#define VK_VERSION_PATCH(version) ((uint32_t)(version) & 0xfff)
 | 
					#define VK_VERSION_PATCH(version) ((uint32_t)(version) & 0xfff)
 | 
				
			||||||
// Version of this file
 | 
					// Version of this file
 | 
				
			||||||
#define VK_HEADER_VERSION 64
 | 
					#define VK_HEADER_VERSION 65
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define VK_NULL_HANDLE 0
 | 
					#define VK_NULL_HANDLE 0
 | 
				
			||||||
@@ -147,6 +147,7 @@ typedef enum VkResult {
 | 
				
			|||||||
    VK_ERROR_INVALID_SHADER_NV = -1000012000,
 | 
					    VK_ERROR_INVALID_SHADER_NV = -1000012000,
 | 
				
			||||||
    VK_ERROR_OUT_OF_POOL_MEMORY_KHR = -1000069000,
 | 
					    VK_ERROR_OUT_OF_POOL_MEMORY_KHR = -1000069000,
 | 
				
			||||||
    VK_ERROR_INVALID_EXTERNAL_HANDLE_KHR = -1000072003,
 | 
					    VK_ERROR_INVALID_EXTERNAL_HANDLE_KHR = -1000072003,
 | 
				
			||||||
 | 
					    VK_ERROR_INVALID_DRM_FORMAT_MODIFIER_PLANE_LAYOUT_EXT = -1000158000,
 | 
				
			||||||
    VK_ERROR_NOT_PERMITTED_EXT = -1000174001,
 | 
					    VK_ERROR_NOT_PERMITTED_EXT = -1000174001,
 | 
				
			||||||
    VK_RESULT_BEGIN_RANGE = VK_ERROR_FRAGMENTED_POOL,
 | 
					    VK_RESULT_BEGIN_RANGE = VK_ERROR_FRAGMENTED_POOL,
 | 
				
			||||||
    VK_RESULT_END_RANGE = VK_INCOMPLETE,
 | 
					    VK_RESULT_END_RANGE = VK_INCOMPLETE,
 | 
				
			||||||
@@ -352,6 +353,11 @@ typedef enum VkStructureType {
 | 
				
			|||||||
    VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES_KHR = 1000156005,
 | 
					    VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES_KHR = 1000156005,
 | 
				
			||||||
    VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO_KHR = 1000157000,
 | 
					    VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO_KHR = 1000157000,
 | 
				
			||||||
    VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO_KHR = 1000157001,
 | 
					    VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO_KHR = 1000157001,
 | 
				
			||||||
 | 
					    VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT = 1000158000,
 | 
				
			||||||
 | 
					    VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT = 1000158001,
 | 
				
			||||||
 | 
					    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT = 1000158002,
 | 
				
			||||||
 | 
					    VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT = 1000158003,
 | 
				
			||||||
 | 
					    VK_STRUCTURE_TYPE_IMAGE_EXCPLICIT_DRM_FORMAT_MODIFIER_CREATE_INFO_EXT = 1000158004,
 | 
				
			||||||
    VK_STRUCTURE_TYPE_VALIDATION_CACHE_CREATE_INFO_EXT = 1000160000,
 | 
					    VK_STRUCTURE_TYPE_VALIDATION_CACHE_CREATE_INFO_EXT = 1000160000,
 | 
				
			||||||
    VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT = 1000160001,
 | 
					    VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT = 1000160001,
 | 
				
			||||||
    VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT = 1000174000,
 | 
					    VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT = 1000174000,
 | 
				
			||||||
@@ -628,6 +634,7 @@ typedef enum VkImageType {
 | 
				
			|||||||
typedef enum VkImageTiling {
 | 
					typedef enum VkImageTiling {
 | 
				
			||||||
    VK_IMAGE_TILING_OPTIMAL = 0,
 | 
					    VK_IMAGE_TILING_OPTIMAL = 0,
 | 
				
			||||||
    VK_IMAGE_TILING_LINEAR = 1,
 | 
					    VK_IMAGE_TILING_LINEAR = 1,
 | 
				
			||||||
 | 
					    VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT = 1000158000,
 | 
				
			||||||
    VK_IMAGE_TILING_BEGIN_RANGE = VK_IMAGE_TILING_OPTIMAL,
 | 
					    VK_IMAGE_TILING_BEGIN_RANGE = VK_IMAGE_TILING_OPTIMAL,
 | 
				
			||||||
    VK_IMAGE_TILING_END_RANGE = VK_IMAGE_TILING_LINEAR,
 | 
					    VK_IMAGE_TILING_END_RANGE = VK_IMAGE_TILING_LINEAR,
 | 
				
			||||||
    VK_IMAGE_TILING_RANGE_SIZE = (VK_IMAGE_TILING_LINEAR - VK_IMAGE_TILING_OPTIMAL + 1),
 | 
					    VK_IMAGE_TILING_RANGE_SIZE = (VK_IMAGE_TILING_LINEAR - VK_IMAGE_TILING_OPTIMAL + 1),
 | 
				
			||||||
@@ -1209,6 +1216,7 @@ typedef enum VkImageAspectFlagBits {
 | 
				
			|||||||
    VK_IMAGE_ASPECT_PLANE_0_BIT_KHR = 0x00000010,
 | 
					    VK_IMAGE_ASPECT_PLANE_0_BIT_KHR = 0x00000010,
 | 
				
			||||||
    VK_IMAGE_ASPECT_PLANE_1_BIT_KHR = 0x00000020,
 | 
					    VK_IMAGE_ASPECT_PLANE_1_BIT_KHR = 0x00000020,
 | 
				
			||||||
    VK_IMAGE_ASPECT_PLANE_2_BIT_KHR = 0x00000040,
 | 
					    VK_IMAGE_ASPECT_PLANE_2_BIT_KHR = 0x00000040,
 | 
				
			||||||
 | 
					    VK_IMAGE_ASPECT_PLANE_3_BIT_EXT = 0x00000080,
 | 
				
			||||||
    VK_IMAGE_ASPECT_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
 | 
					    VK_IMAGE_ASPECT_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
 | 
				
			||||||
} VkImageAspectFlagBits;
 | 
					} VkImageAspectFlagBits;
 | 
				
			||||||
typedef VkFlags VkImageAspectFlags;
 | 
					typedef VkFlags VkImageAspectFlags;
 | 
				
			||||||
@@ -4195,6 +4203,7 @@ typedef enum VkExternalMemoryHandleTypeFlagBitsKHR {
 | 
				
			|||||||
    VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_KMT_BIT_KHR = 0x00000010,
 | 
					    VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_KMT_BIT_KHR = 0x00000010,
 | 
				
			||||||
    VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT_KHR = 0x00000020,
 | 
					    VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT_KHR = 0x00000020,
 | 
				
			||||||
    VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT_KHR = 0x00000040,
 | 
					    VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT_KHR = 0x00000040,
 | 
				
			||||||
 | 
					    VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT = 0x00000080,
 | 
				
			||||||
    VK_EXTERNAL_MEMORY_HANDLE_TYPE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF
 | 
					    VK_EXTERNAL_MEMORY_HANDLE_TYPE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF
 | 
				
			||||||
} VkExternalMemoryHandleTypeFlagBitsKHR;
 | 
					} VkExternalMemoryHandleTypeFlagBitsKHR;
 | 
				
			||||||
typedef VkFlags VkExternalMemoryHandleTypeFlagsKHR;
 | 
					typedef VkFlags VkExternalMemoryHandleTypeFlagsKHR;
 | 
				
			||||||
@@ -6616,6 +6625,17 @@ VKAPI_ATTR VkResult VKAPI_CALL vkCreateMacOSSurfaceMVK(
 | 
				
			|||||||
#endif
 | 
					#endif
 | 
				
			||||||
#endif /* VK_USE_PLATFORM_MACOS_MVK */
 | 
					#endif /* VK_USE_PLATFORM_MACOS_MVK */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define VK_EXT_external_memory_dma_buf 1
 | 
				
			||||||
 | 
					#define VK_EXT_EXTERNAL_MEMORY_DMA_BUF_SPEC_VERSION 1
 | 
				
			||||||
 | 
					#define VK_EXT_EXTERNAL_MEMORY_DMA_BUF_EXTENSION_NAME "VK_EXT_external_memory_dma_buf"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define VK_EXT_queue_family_foreign 1
 | 
				
			||||||
 | 
					#define VK_EXT_QUEUE_FAMILY_FOREIGN_SPEC_VERSION 1
 | 
				
			||||||
 | 
					#define VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME "VK_EXT_queue_family_foreign"
 | 
				
			||||||
 | 
					#define VK_QUEUE_FAMILY_FOREIGN_EXT       (~0U-2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define VK_EXT_sampler_filter_minmax 1
 | 
					#define VK_EXT_sampler_filter_minmax 1
 | 
				
			||||||
#define VK_EXT_SAMPLER_FILTER_MINMAX_SPEC_VERSION 1
 | 
					#define VK_EXT_SAMPLER_FILTER_MINMAX_SPEC_VERSION 1
 | 
				
			||||||
#define VK_EXT_SAMPLER_FILTER_MINMAX_EXTENSION_NAME "VK_EXT_sampler_filter_minmax"
 | 
					#define VK_EXT_SAMPLER_FILTER_MINMAX_EXTENSION_NAME "VK_EXT_sampler_filter_minmax"
 | 
				
			||||||
@@ -6839,6 +6859,54 @@ typedef struct VkPipelineCoverageModulationStateCreateInfoNV {
 | 
				
			|||||||
#define VK_EXT_POST_DEPTH_COVERAGE_EXTENSION_NAME "VK_EXT_post_depth_coverage"
 | 
					#define VK_EXT_POST_DEPTH_COVERAGE_EXTENSION_NAME "VK_EXT_post_depth_coverage"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define VK_EXT_image_drm_format_modifier 1
 | 
				
			||||||
 | 
					#define VK_EXT_IMAGE_DRM_FORMAT_MODIFIER_SPEC_VERSION 1
 | 
				
			||||||
 | 
					#define VK_EXT_IMAGE_DRM_FORMAT_MODIFIER_EXTENSION_NAME "VK_EXT_image_drm_format_modifier"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct VkDrmFormatModifierPropertiesEXT {
 | 
				
			||||||
 | 
					    uint64_t                drmFormatModifier;
 | 
				
			||||||
 | 
					    uint32_t                drmFormatModifierPlaneCount;
 | 
				
			||||||
 | 
					    VkFormatFeatureFlags    drmFormatModifierTilingFeatures;
 | 
				
			||||||
 | 
					} VkDrmFormatModifierPropertiesEXT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct VkDrmFormatModifierPropertiesListEXT {
 | 
				
			||||||
 | 
					    VkStructureType                      sType;
 | 
				
			||||||
 | 
					    void*                                pNext;
 | 
				
			||||||
 | 
					    uint32_t                             drmFormatModifierCount;
 | 
				
			||||||
 | 
					    VkDrmFormatModifierPropertiesEXT*    pDrmFormatModifierProperties;
 | 
				
			||||||
 | 
					} VkDrmFormatModifierPropertiesListEXT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct VkPhysicalDeviceImageDrmFormatModifierInfoEXT {
 | 
				
			||||||
 | 
					    VkStructureType    sType;
 | 
				
			||||||
 | 
					    const void*        pNext;
 | 
				
			||||||
 | 
					    uint64_t           drmFormatModifier;
 | 
				
			||||||
 | 
					} VkPhysicalDeviceImageDrmFormatModifierInfoEXT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct VkImageDrmFormatModifierListCreateInfoEXT {
 | 
				
			||||||
 | 
					    VkStructureType    sType;
 | 
				
			||||||
 | 
					    const void*        pNext;
 | 
				
			||||||
 | 
					    uint32_t           drmFormatModifierCount;
 | 
				
			||||||
 | 
					    const uint64_t*    pDrmFormatModifiers;
 | 
				
			||||||
 | 
					} VkImageDrmFormatModifierListCreateInfoEXT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct VkImageExplicitDrmFormatModifierCreateInfoEXT {
 | 
				
			||||||
 | 
					    VkStructureType         sType;
 | 
				
			||||||
 | 
					    const void*             pNext;
 | 
				
			||||||
 | 
					    uint64_t                drmFormatModifier;
 | 
				
			||||||
 | 
					    uint32_t                planeCount;
 | 
				
			||||||
 | 
					    VkSubresourceLayout*    pPlaneLayouts;
 | 
				
			||||||
 | 
					} VkImageExplicitDrmFormatModifierCreateInfoEXT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef VkResult (VKAPI_PTR *PFN_vkGetImageDrmFormatModifierEXT)(VkDevice device, VkImage image, uint64_t* pDrmFormatModifier);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef VK_NO_PROTOTYPES
 | 
				
			||||||
 | 
					VKAPI_ATTR VkResult VKAPI_CALL vkGetImageDrmFormatModifierEXT(
 | 
				
			||||||
 | 
					    VkDevice                                    device,
 | 
				
			||||||
 | 
					    VkImage                                     image,
 | 
				
			||||||
 | 
					    uint64_t*                                   pDrmFormatModifier);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define VK_EXT_validation_cache 1
 | 
					#define VK_EXT_validation_cache 1
 | 
				
			||||||
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkValidationCacheEXT)
 | 
					VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkValidationCacheEXT)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,62 +0,0 @@
 | 
				
			|||||||
/*
 | 
					 | 
				
			||||||
 * Copyright © 2015 Intel Corporation
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * Permission is hereby granted, free of charge, to any person obtaining a
 | 
					 | 
				
			||||||
 * copy of this software and associated documentation files (the "Software"),
 | 
					 | 
				
			||||||
 * to deal in the Software without restriction, including without limitation
 | 
					 | 
				
			||||||
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
					 | 
				
			||||||
 * and/or sell copies of the Software, and to permit persons to whom the
 | 
					 | 
				
			||||||
 * Software is furnished to do so, subject to the following conditions:
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * The above copyright notice and this permission notice (including the next
 | 
					 | 
				
			||||||
 * paragraph) shall be included in all copies or substantial portions of the
 | 
					 | 
				
			||||||
 * Software.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
					 | 
				
			||||||
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
					 | 
				
			||||||
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 | 
					 | 
				
			||||||
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
					 | 
				
			||||||
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 | 
					 | 
				
			||||||
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 | 
					 | 
				
			||||||
 * IN THE SOFTWARE.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef __VULKAN_INTEL_H__
 | 
					 | 
				
			||||||
#define __VULKAN_INTEL_H__
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include "vulkan.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef __cplusplus
 | 
					 | 
				
			||||||
extern "C"
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
#endif // __cplusplus
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define VK_STRUCTURE_TYPE_DMA_BUF_IMAGE_CREATE_INFO_INTEL 1024
 | 
					 | 
				
			||||||
typedef struct VkDmaBufImageCreateInfo_
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    VkStructureType                             sType;                      // Must be VK_STRUCTURE_TYPE_DMA_BUF_IMAGE_CREATE_INFO_INTEL
 | 
					 | 
				
			||||||
    const void*                                 pNext;                      // Pointer to next structure.
 | 
					 | 
				
			||||||
    int                                         fd;
 | 
					 | 
				
			||||||
    VkFormat                                    format;
 | 
					 | 
				
			||||||
    VkExtent3D                                  extent;         // Depth must be 1
 | 
					 | 
				
			||||||
    uint32_t                                    strideInBytes;
 | 
					 | 
				
			||||||
} VkDmaBufImageCreateInfo;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef VkResult (VKAPI_PTR *PFN_vkCreateDmaBufImageINTEL)(VkDevice device, const VkDmaBufImageCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDeviceMemory* pMem, VkImage* pImage);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef VK_NO_PROTOTYPES
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
VKAPI_ATTR VkResult VKAPI_CALL vkCreateDmaBufImageINTEL(
 | 
					 | 
				
			||||||
    VkDevice                                    _device,
 | 
					 | 
				
			||||||
    const VkDmaBufImageCreateInfo*              pCreateInfo,
 | 
					 | 
				
			||||||
    const VkAllocationCallbacks*                pAllocator,
 | 
					 | 
				
			||||||
    VkDeviceMemory*                             pMem,
 | 
					 | 
				
			||||||
    VkImage*                                    pImage);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef __cplusplus
 | 
					 | 
				
			||||||
} // extern "C"
 | 
					 | 
				
			||||||
#endif // __cplusplus
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif // __VULKAN_INTEL_H__
 | 
					 | 
				
			||||||
@@ -67,7 +67,6 @@ typedef uint32_t xcb_visualid_t;
 | 
				
			|||||||
typedef uint32_t xcb_window_t;
 | 
					typedef uint32_t xcb_window_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <vulkan/vulkan.h>
 | 
					#include <vulkan/vulkan.h>
 | 
				
			||||||
#include <vulkan/vulkan_intel.h>
 | 
					 | 
				
			||||||
#include <vulkan/vk_icd.h>
 | 
					#include <vulkan/vk_icd.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "radv_entrypoints.h"
 | 
					#include "radv_entrypoints.h"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -215,7 +215,6 @@ VULKAN_FILES := \
 | 
				
			|||||||
	vulkan/anv_formats.c \
 | 
						vulkan/anv_formats.c \
 | 
				
			||||||
	vulkan/anv_genX.h \
 | 
						vulkan/anv_genX.h \
 | 
				
			||||||
	vulkan/anv_image.c \
 | 
						vulkan/anv_image.c \
 | 
				
			||||||
	vulkan/anv_intel.c \
 | 
					 | 
				
			||||||
	vulkan/anv_nir.h \
 | 
						vulkan/anv_nir.h \
 | 
				
			||||||
	vulkan/anv_nir_apply_pipeline_layout.c \
 | 
						vulkan/anv_nir_apply_pipeline_layout.c \
 | 
				
			||||||
	vulkan/anv_nir_lower_input_attachments.c \
 | 
						vulkan/anv_nir_lower_input_attachments.c \
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -74,9 +74,6 @@ noinst_HEADERS += \
 | 
				
			|||||||
	$(top_srcdir)/include/vulkan/vk_platform.h \
 | 
						$(top_srcdir)/include/vulkan/vk_platform.h \
 | 
				
			||||||
	$(top_srcdir)/include/vulkan/vulkan.h
 | 
						$(top_srcdir)/include/vulkan/vulkan.h
 | 
				
			||||||
 | 
					
 | 
				
			||||||
vulkan_include_HEADERS = \
 | 
					 | 
				
			||||||
	$(top_srcdir)/include/vulkan/vulkan_intel.h
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
lib_LTLIBRARIES += vulkan/libvulkan_intel.la
 | 
					lib_LTLIBRARIES += vulkan/libvulkan_intel.la
 | 
				
			||||||
 | 
					
 | 
				
			||||||
check_LTLIBRARIES += vulkan/libvulkan-test.la
 | 
					check_LTLIBRARIES += vulkan/libvulkan-test.la
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,3 +11,19 @@ Performance:
 | 
				
			|||||||
 - Pushing pieces of UBOs?
 | 
					 - Pushing pieces of UBOs?
 | 
				
			||||||
 - Enable guardband clipping
 | 
					 - Enable guardband clipping
 | 
				
			||||||
 - Use soft-pin to avoid relocations
 | 
					 - Use soft-pin to avoid relocations
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					VK_EXT_image_drm_format_modifiers:
 | 
				
			||||||
 | 
					    [-] Modifiers
 | 
				
			||||||
 | 
					        [x] DRM_FORMAT_MOD_LINEAR
 | 
				
			||||||
 | 
					        [x] I915_FORMAT_MOD_X_TILED
 | 
				
			||||||
 | 
					        [x] I915_FORMAT_MOD_Y_TILED
 | 
				
			||||||
 | 
					        [ ] I915_FORMAT_MOD_Y_TILED_CCS
 | 
				
			||||||
 | 
					    [x] vkGetPhysicalDeviceFormatProperties2KHR
 | 
				
			||||||
 | 
					    [x] vkGetPhysicalDeviceImageFormatProperties2KHR
 | 
				
			||||||
 | 
					    [x] vkCreateImage
 | 
				
			||||||
 | 
					        [x] VkImageDrmFormatModifierListCreateInfoEXT
 | 
				
			||||||
 | 
					        [x] VkImageExplicitDrmFormatModifierEXT
 | 
				
			||||||
 | 
					    [ ] Resolve CCS on foreign queue transition
 | 
				
			||||||
 | 
					    [x] vkGetImageDrmFormatModifierEXT
 | 
				
			||||||
 | 
					    [x] vkGetImageSubresouceLayout
 | 
				
			||||||
 | 
					    [x] Kill vkCreateImageDmaBufINTEL
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -777,7 +777,7 @@ void anv_CmdClearColorImage(
 | 
				
			|||||||
      if (pRanges[r].aspectMask == 0)
 | 
					      if (pRanges[r].aspectMask == 0)
 | 
				
			||||||
         continue;
 | 
					         continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      assert(pRanges[r].aspectMask & VK_IMAGE_ASPECT_ANY_COLOR_BIT);
 | 
					      assert(pRanges[r].aspectMask & VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      struct blorp_surf surf;
 | 
					      struct blorp_surf surf;
 | 
				
			||||||
      get_blorp_surf_for_anv_image(image, pRanges[r].aspectMask,
 | 
					      get_blorp_surf_for_anv_image(image, pRanges[r].aspectMask,
 | 
				
			||||||
@@ -1068,7 +1068,7 @@ void anv_CmdClearAttachments(
 | 
				
			|||||||
                    BLORP_BATCH_NO_EMIT_DEPTH_STENCIL);
 | 
					                    BLORP_BATCH_NO_EMIT_DEPTH_STENCIL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   for (uint32_t a = 0; a < attachmentCount; ++a) {
 | 
					   for (uint32_t a = 0; a < attachmentCount; ++a) {
 | 
				
			||||||
      if (pAttachments[a].aspectMask & VK_IMAGE_ASPECT_ANY_COLOR_BIT) {
 | 
					      if (pAttachments[a].aspectMask & VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV) {
 | 
				
			||||||
         assert(pAttachments[a].aspectMask == VK_IMAGE_ASPECT_COLOR_BIT);
 | 
					         assert(pAttachments[a].aspectMask == VK_IMAGE_ASPECT_COLOR_BIT);
 | 
				
			||||||
         clear_color_attachment(cmd_buffer, &batch,
 | 
					         clear_color_attachment(cmd_buffer, &batch,
 | 
				
			||||||
                                &pAttachments[a],
 | 
					                                &pAttachments[a],
 | 
				
			||||||
@@ -1668,7 +1668,7 @@ anv_ccs_resolve(struct anv_cmd_buffer * const cmd_buffer,
 | 
				
			|||||||
   /* The resolved subresource range must have a CCS buffer. */
 | 
					   /* The resolved subresource range must have a CCS buffer. */
 | 
				
			||||||
   assert(level < anv_image_aux_levels(image, aspect));
 | 
					   assert(level < anv_image_aux_levels(image, aspect));
 | 
				
			||||||
   assert(layer_count <= anv_image_aux_layers(image, aspect, level));
 | 
					   assert(layer_count <= anv_image_aux_layers(image, aspect, level));
 | 
				
			||||||
   assert(image->aspects & VK_IMAGE_ASPECT_ANY_COLOR_BIT && image->samples == 1);
 | 
					   assert(image->aspects & VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV && image->samples == 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   /* Create a binding table for this surface state. */
 | 
					   /* Create a binding table for this surface state. */
 | 
				
			||||||
   uint32_t binding_table;
 | 
					   uint32_t binding_table;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1538,11 +1538,11 @@ VkResult anv_AllocateMemory(
 | 
				
			|||||||
    * ignored.
 | 
					    * ignored.
 | 
				
			||||||
    */
 | 
					    */
 | 
				
			||||||
   if (fd_info && fd_info->handleType) {
 | 
					   if (fd_info && fd_info->handleType) {
 | 
				
			||||||
      /* At the moment, we only support the OPAQUE_FD memory type which is
 | 
					      /* At the moment, we support only the below handle types. */
 | 
				
			||||||
       * just a GEM buffer.
 | 
					 | 
				
			||||||
       */
 | 
					 | 
				
			||||||
      assert(fd_info->handleType ==
 | 
					      assert(fd_info->handleType ==
 | 
				
			||||||
             VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR);
 | 
					               VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR ||
 | 
				
			||||||
 | 
					             fd_info->handleType ==
 | 
				
			||||||
 | 
					               VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      result = anv_bo_cache_import(device, &device->bo_cache,
 | 
					      result = anv_bo_cache_import(device, &device->bo_cache,
 | 
				
			||||||
                                   fd_info->fd, &mem->bo);
 | 
					                                   fd_info->fd, &mem->bo);
 | 
				
			||||||
@@ -1616,9 +1616,8 @@ VkResult anv_GetMemoryFdKHR(
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
   assert(pGetFdInfo->sType == VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR);
 | 
					   assert(pGetFdInfo->sType == VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   /* We support only one handle type. */
 | 
					   assert(pGetFdInfo->handleType == VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR ||
 | 
				
			||||||
   assert(pGetFdInfo->handleType ==
 | 
					          pGetFdInfo->handleType == VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT);
 | 
				
			||||||
          VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
   return anv_bo_cache_export(dev, &dev->bo_cache, mem->bo, pFd);
 | 
					   return anv_bo_cache_export(dev, &dev->bo_cache, mem->bo, pFd);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -359,16 +359,6 @@ def main():
 | 
				
			|||||||
        entrypoints += get_entrypoints(doc, get_entrypoints_defines(doc),
 | 
					        entrypoints += get_entrypoints(doc, get_entrypoints_defines(doc),
 | 
				
			||||||
                                       start_index=len(entrypoints))
 | 
					                                       start_index=len(entrypoints))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Manually add CreateDmaBufImageINTEL for which we don't have an extension
 | 
					 | 
				
			||||||
    # defined.
 | 
					 | 
				
			||||||
    entrypoints.append(('VkResult', 'CreateDmaBufImageINTEL',
 | 
					 | 
				
			||||||
                        'VkDevice device, ' +
 | 
					 | 
				
			||||||
                        'const VkDmaBufImageCreateInfo* pCreateInfo, ' +
 | 
					 | 
				
			||||||
                        'const VkAllocationCallbacks* pAllocator,' +
 | 
					 | 
				
			||||||
                        'VkDeviceMemory* pMem,' +
 | 
					 | 
				
			||||||
                        'VkImage* pImage', len(entrypoints),
 | 
					 | 
				
			||||||
                        cal_hash('vkCreateDmaBufImageINTEL'), None))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # For outputting entrypoints.h we generate a anv_EntryPoint() prototype
 | 
					    # For outputting entrypoints.h we generate a anv_EntryPoint() prototype
 | 
				
			||||||
    # per entry point.
 | 
					    # per entry point.
 | 
				
			||||||
    try:
 | 
					    try:
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -86,6 +86,9 @@ EXTENSIONS = [
 | 
				
			|||||||
    Extension('VK_KHR_xlib_surface',                      6, 'VK_USE_PLATFORM_XLIB_KHR'),
 | 
					    Extension('VK_KHR_xlib_surface',                      6, 'VK_USE_PLATFORM_XLIB_KHR'),
 | 
				
			||||||
    Extension('VK_KHX_multiview',                         1, True),
 | 
					    Extension('VK_KHX_multiview',                         1, True),
 | 
				
			||||||
    Extension('VK_EXT_debug_report',                      8, True),
 | 
					    Extension('VK_EXT_debug_report',                      8, True),
 | 
				
			||||||
 | 
					    Extension('VK_EXT_external_memory_dma_buf',           1, True),
 | 
				
			||||||
 | 
					    Extension('VK_EXT_image_drm_format_modifier',         1, True),
 | 
				
			||||||
 | 
					    Extension('VK_EXT_queue_family_foreign',              1, True),
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class VkVersion:
 | 
					class VkVersion:
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,6 +21,8 @@
 | 
				
			|||||||
 * IN THE SOFTWARE.
 | 
					 * IN THE SOFTWARE.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <drm_fourcc.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "anv_private.h"
 | 
					#include "anv_private.h"
 | 
				
			||||||
#include "vk_enum_to_str.h"
 | 
					#include "vk_enum_to_str.h"
 | 
				
			||||||
#include "vk_format_info.h"
 | 
					#include "vk_format_info.h"
 | 
				
			||||||
@@ -409,32 +411,47 @@ anv_get_format(VkFormat vk_format)
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
struct anv_format_plane
 | 
					struct anv_format_plane
 | 
				
			||||||
anv_get_format_plane(const struct gen_device_info *devinfo, VkFormat vk_format,
 | 
					anv_get_format_plane(const struct gen_device_info *devinfo, VkFormat vk_format,
 | 
				
			||||||
                     VkImageAspectFlags aspect, VkImageTiling tiling)
 | 
					                     VkImageAspectFlagBits aspect, VkImageTiling tiling)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
   const struct anv_format *format = anv_get_format(vk_format);
 | 
					   const struct anv_format *format = anv_get_format(vk_format);
 | 
				
			||||||
   struct anv_format_plane plane_format = {
 | 
					   const struct anv_format_plane unsupported = {
 | 
				
			||||||
      .isl_format = ISL_FORMAT_UNSUPPORTED,
 | 
					      .isl_format = ISL_FORMAT_UNSUPPORTED,
 | 
				
			||||||
   };
 | 
					   };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   if (format == NULL)
 | 
					   if (format == NULL)
 | 
				
			||||||
      return plane_format;
 | 
					      return unsupported;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   uint32_t plane = anv_image_aspect_to_plane(vk_format_aspects(vk_format), aspect);
 | 
					   uint32_t plane = anv_image_aspect_to_plane(vk_format_aspects(vk_format), aspect);
 | 
				
			||||||
   plane_format = format->planes[plane];
 | 
					   struct anv_format_plane plane_format = format->planes[plane];
 | 
				
			||||||
   if (plane_format.isl_format == ISL_FORMAT_UNSUPPORTED)
 | 
					   if (plane_format.isl_format == ISL_FORMAT_UNSUPPORTED)
 | 
				
			||||||
      return plane_format;
 | 
					      return unsupported;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   if (aspect & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) {
 | 
					   if (aspect & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) {
 | 
				
			||||||
 | 
					      if (tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT)
 | 
				
			||||||
 | 
					         return unsupported;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      assert(vk_format_aspects(vk_format) &
 | 
					      assert(vk_format_aspects(vk_format) &
 | 
				
			||||||
             (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT));
 | 
					             (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT));
 | 
				
			||||||
      return plane_format;
 | 
					      return plane_format;
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   assert((aspect & ~VK_IMAGE_ASPECT_ANY_COLOR_BIT) == 0);
 | 
					   assert((aspect & ~VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV) == 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   const struct isl_format_layout *isl_layout =
 | 
					   const struct isl_format_layout *isl_layout =
 | 
				
			||||||
      isl_format_get_layout(plane_format.isl_format);
 | 
					      isl_format_get_layout(plane_format.isl_format);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   /* For VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT, the image's driver-internal
 | 
				
			||||||
 | 
					    * format must be the user-facing VkFormat. Modifying the VkFormat in any
 | 
				
			||||||
 | 
					    * way, including swizzling, is illegal.
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   /* For now, for no reason other than FUD, we decline to support texture
 | 
				
			||||||
 | 
					    * compression with modifiers.
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					   if (tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT &&
 | 
				
			||||||
 | 
					       isl_layout->txc != ISL_TXC_NONE)
 | 
				
			||||||
 | 
					      return unsupported;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   if (tiling == VK_IMAGE_TILING_OPTIMAL &&
 | 
					   if (tiling == VK_IMAGE_TILING_OPTIMAL &&
 | 
				
			||||||
       !util_is_power_of_two(isl_layout->bpb)) {
 | 
					       !util_is_power_of_two(isl_layout->bpb)) {
 | 
				
			||||||
      /* Tiled formats *must* be power-of-two because we need up upload
 | 
					      /* Tiled formats *must* be power-of-two because we need up upload
 | 
				
			||||||
@@ -456,7 +473,8 @@ anv_get_format_plane(const struct gen_device_info *devinfo, VkFormat vk_format,
 | 
				
			|||||||
   /* The B4G4R4A4 format isn't available prior to Broadwell so we have to fall
 | 
					   /* The B4G4R4A4 format isn't available prior to Broadwell so we have to fall
 | 
				
			||||||
    * back to a format with a more complex swizzle.
 | 
					    * back to a format with a more complex swizzle.
 | 
				
			||||||
    */
 | 
					    */
 | 
				
			||||||
   if (vk_format == VK_FORMAT_B4G4R4A4_UNORM_PACK16 && devinfo->gen < 8) {
 | 
					   if (tiling != VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT &&
 | 
				
			||||||
 | 
					       vk_format == VK_FORMAT_B4G4R4A4_UNORM_PACK16 && devinfo->gen < 8) {
 | 
				
			||||||
      plane_format.isl_format = ISL_FORMAT_B4G4R4A4_UNORM;
 | 
					      plane_format.isl_format = ISL_FORMAT_B4G4R4A4_UNORM;
 | 
				
			||||||
      plane_format.swizzle = ISL_SWIZZLE(GREEN, RED, ALPHA, BLUE);
 | 
					      plane_format.swizzle = ISL_SWIZZLE(GREEN, RED, ALPHA, BLUE);
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
@@ -466,19 +484,81 @@ anv_get_format_plane(const struct gen_device_info *devinfo, VkFormat vk_format,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// Format capabilities
 | 
					// Format capabilities
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Parameter drm_format_mod must be DRM_FORMAT_MOD_INVALID unless vk_tiling is
 | 
				
			||||||
 | 
					 * VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
static VkFormatFeatureFlags
 | 
					static VkFormatFeatureFlags
 | 
				
			||||||
get_image_format_properties(const struct gen_device_info *devinfo,
 | 
					get_image_format_features(const struct gen_device_info *devinfo,
 | 
				
			||||||
                            enum isl_format base, struct anv_format_plane format)
 | 
					                          VkFormat vk_format,
 | 
				
			||||||
 | 
					                          const struct anv_format *anv_format,
 | 
				
			||||||
 | 
					                          VkImageTiling vk_tiling,
 | 
				
			||||||
 | 
					                          uint64_t drm_format_mod)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
   if (format.isl_format == ISL_FORMAT_UNSUPPORTED)
 | 
					   VkFormatFeatureFlags flags = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   if (vk_tiling != VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT)
 | 
				
			||||||
 | 
					      assert(drm_format_mod == DRM_FORMAT_MOD_INVALID);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   if (anv_format == NULL)
 | 
				
			||||||
      return 0;
 | 
					      return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   VkFormatFeatureFlags flags = 0;
 | 
					   const VkImageAspectFlags aspects = vk_format_aspects(vk_format);
 | 
				
			||||||
   if (isl_format_supports_sampling(devinfo, format.isl_format)) {
 | 
					
 | 
				
			||||||
 | 
					   if (aspects & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) {
 | 
				
			||||||
 | 
					      if (vk_tiling != VK_IMAGE_TILING_OPTIMAL)
 | 
				
			||||||
 | 
					         return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      flags |= VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (aspects == VK_IMAGE_ASPECT_DEPTH_BIT || devinfo->gen >= 8)
 | 
				
			||||||
 | 
					         flags |= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      flags |= VK_FORMAT_FEATURE_BLIT_SRC_BIT |
 | 
				
			||||||
 | 
					               VK_FORMAT_FEATURE_BLIT_DST_BIT |
 | 
				
			||||||
 | 
					               VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR |
 | 
				
			||||||
 | 
					               VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      return flags;
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   const struct anv_format_plane plane_format =
 | 
				
			||||||
 | 
					      anv_get_format_plane(devinfo, vk_format, VK_IMAGE_ASPECT_COLOR_BIT,
 | 
				
			||||||
 | 
					                           vk_tiling);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   if (plane_format.isl_format == ISL_FORMAT_UNSUPPORTED)
 | 
				
			||||||
 | 
					      return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   const struct isl_format_layout *isl_layout =
 | 
				
			||||||
 | 
					      isl_format_get_layout(plane_format.isl_format);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   if (vk_tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT)
 | 
				
			||||||
 | 
					      assert(isl_layout->txc == ISL_TXC_NONE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   /* For VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT, the base format and
 | 
				
			||||||
 | 
					    * non-base format must be the same, because the image's driver-internal
 | 
				
			||||||
 | 
					    * format must be the user-facing VkFormat. Modifying the VkFormat in any
 | 
				
			||||||
 | 
					    * way, including swizzling, is illegal.
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					   struct anv_format_plane base_plane_format = plane_format;
 | 
				
			||||||
 | 
					   if (vk_tiling == VK_IMAGE_TILING_OPTIMAL) {
 | 
				
			||||||
 | 
					      base_plane_format = anv_get_format_plane(devinfo, vk_format,
 | 
				
			||||||
 | 
					                                               VK_IMAGE_ASPECT_COLOR_BIT,
 | 
				
			||||||
 | 
					                                               VK_IMAGE_TILING_LINEAR);
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   enum isl_format base_isl_format = base_plane_format.isl_format;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   /* ASTC textures must be in Y-tiled memory */
 | 
				
			||||||
 | 
					   if (vk_tiling != VK_IMAGE_TILING_OPTIMAL &&
 | 
				
			||||||
 | 
					       isl_layout->txc == ISL_TXC_ASTC)
 | 
				
			||||||
 | 
					      return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   if (isl_format_supports_sampling(devinfo, plane_format.isl_format)) {
 | 
				
			||||||
      flags |= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT |
 | 
					      flags |= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT |
 | 
				
			||||||
               VK_FORMAT_FEATURE_BLIT_SRC_BIT;
 | 
					               VK_FORMAT_FEATURE_BLIT_SRC_BIT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      if (isl_format_supports_filtering(devinfo, format.isl_format))
 | 
					      if (isl_format_supports_filtering(devinfo, plane_format.isl_format))
 | 
				
			||||||
         flags |= VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT;
 | 
					         flags |= VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT;
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -486,22 +566,23 @@ get_image_format_properties(const struct gen_device_info *devinfo,
 | 
				
			|||||||
    * moved, then blending won't work correctly.  The PRM tells us
 | 
					    * moved, then blending won't work correctly.  The PRM tells us
 | 
				
			||||||
    * straight-up not to render to such a surface.
 | 
					    * straight-up not to render to such a surface.
 | 
				
			||||||
    */
 | 
					    */
 | 
				
			||||||
   if (isl_format_supports_rendering(devinfo, format.isl_format) &&
 | 
					   if (isl_format_supports_rendering(devinfo, plane_format.isl_format) &&
 | 
				
			||||||
       format.swizzle.a == ISL_CHANNEL_SELECT_ALPHA) {
 | 
					       plane_format.swizzle.a == ISL_CHANNEL_SELECT_ALPHA) {
 | 
				
			||||||
      flags |= VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT |
 | 
					      flags |= VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT |
 | 
				
			||||||
               VK_FORMAT_FEATURE_BLIT_DST_BIT;
 | 
					               VK_FORMAT_FEATURE_BLIT_DST_BIT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      if (isl_format_supports_alpha_blending(devinfo, format.isl_format))
 | 
					      if (isl_format_supports_alpha_blending(devinfo, plane_format.isl_format))
 | 
				
			||||||
         flags |= VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT;
 | 
					         flags |= VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT;
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   /* Load/store is determined based on base format.  This prevents RGB
 | 
					   /* Load/store is determined based on base format.  This prevents RGB
 | 
				
			||||||
    * formats from showing up as load/store capable.
 | 
					    * formats from showing up as load/store capable.
 | 
				
			||||||
    */
 | 
					    */
 | 
				
			||||||
   if (isl_is_storage_image_format(base))
 | 
					   if (isl_is_storage_image_format(base_isl_format))
 | 
				
			||||||
      flags |= VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT;
 | 
					      flags |= VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   if (base == ISL_FORMAT_R32_SINT || base == ISL_FORMAT_R32_UINT)
 | 
					   if (base_isl_format == ISL_FORMAT_R32_SINT ||
 | 
				
			||||||
 | 
					       base_isl_format == ISL_FORMAT_R32_UINT)
 | 
				
			||||||
      flags |= VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT;
 | 
					      flags |= VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   if (flags) {
 | 
					   if (flags) {
 | 
				
			||||||
@@ -509,125 +590,55 @@ get_image_format_properties(const struct gen_device_info *devinfo,
 | 
				
			|||||||
               VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR;
 | 
					               VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR;
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   return flags;
 | 
					   /* XXX: We handle 3-channel formats by switching them out for RGBX or
 | 
				
			||||||
}
 | 
					    * RGBA formats behind-the-scenes.  This works fine for textures
 | 
				
			||||||
 | 
					    * because the upload process will fill in the extra channel.
 | 
				
			||||||
static VkFormatFeatureFlags
 | 
					    * We could also support it for render targets, but it will take
 | 
				
			||||||
get_buffer_format_properties(const struct gen_device_info *devinfo,
 | 
					    * substantially more work and we have enough RGBX formats to handle
 | 
				
			||||||
                             enum isl_format format)
 | 
					    * what most clients will want.
 | 
				
			||||||
{
 | 
					    */
 | 
				
			||||||
   if (format == ISL_FORMAT_UNSUPPORTED)
 | 
					   if (vk_tiling == VK_IMAGE_TILING_OPTIMAL &&
 | 
				
			||||||
      return 0;
 | 
					       base_isl_format != ISL_FORMAT_UNSUPPORTED &&
 | 
				
			||||||
 | 
					       !util_is_power_of_two(isl_format_layouts[base_isl_format].bpb) &&
 | 
				
			||||||
   VkFormatFeatureFlags flags = 0;
 | 
					       isl_format_rgb_to_rgbx(base_isl_format) == ISL_FORMAT_UNSUPPORTED) {
 | 
				
			||||||
   if (isl_format_supports_sampling(devinfo, format) &&
 | 
					      flags &= ~VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT;
 | 
				
			||||||
       !isl_format_is_compressed(format))
 | 
					      flags &= ~VK_FORMAT_FEATURE_BLIT_DST_BIT;
 | 
				
			||||||
      flags |= VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   if (isl_format_supports_vertex_fetch(devinfo, format))
 | 
					 | 
				
			||||||
      flags |= VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   if (isl_is_storage_image_format(format))
 | 
					 | 
				
			||||||
      flags |= VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   if (format == ISL_FORMAT_R32_SINT || format == ISL_FORMAT_R32_UINT)
 | 
					 | 
				
			||||||
      flags |= VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   return flags;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void
 | 
					 | 
				
			||||||
anv_physical_device_get_format_properties(struct anv_physical_device *physical_device,
 | 
					 | 
				
			||||||
                                          VkFormat vk_format,
 | 
					 | 
				
			||||||
                                          VkFormatProperties *out_properties)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
   int gen = physical_device->info.gen * 10;
 | 
					 | 
				
			||||||
   if (physical_device->info.is_haswell)
 | 
					 | 
				
			||||||
      gen += 5;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   const struct anv_format *format = anv_get_format(vk_format);
 | 
					 | 
				
			||||||
   VkFormatFeatureFlags linear = 0, tiled = 0, buffer = 0;
 | 
					 | 
				
			||||||
   if (format == NULL) {
 | 
					 | 
				
			||||||
      /* Nothing to do here */
 | 
					 | 
				
			||||||
   } else if (vk_format_is_depth_or_stencil(vk_format)) {
 | 
					 | 
				
			||||||
      tiled |= VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT;
 | 
					 | 
				
			||||||
      if (vk_format_aspects(vk_format) == VK_IMAGE_ASPECT_DEPTH_BIT ||
 | 
					 | 
				
			||||||
          physical_device->info.gen >= 8)
 | 
					 | 
				
			||||||
         tiled |= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      tiled |= VK_FORMAT_FEATURE_BLIT_SRC_BIT |
 | 
					 | 
				
			||||||
               VK_FORMAT_FEATURE_BLIT_DST_BIT |
 | 
					 | 
				
			||||||
               VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR |
 | 
					 | 
				
			||||||
               VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR;
 | 
					 | 
				
			||||||
   } else {
 | 
					 | 
				
			||||||
      struct anv_format_plane linear_fmt, tiled_fmt;
 | 
					 | 
				
			||||||
      linear_fmt = anv_get_format_plane(&physical_device->info, vk_format,
 | 
					 | 
				
			||||||
                                        VK_IMAGE_ASPECT_COLOR_BIT,
 | 
					 | 
				
			||||||
                                        VK_IMAGE_TILING_LINEAR);
 | 
					 | 
				
			||||||
      tiled_fmt = anv_get_format_plane(&physical_device->info, vk_format,
 | 
					 | 
				
			||||||
                                       VK_IMAGE_ASPECT_COLOR_BIT,
 | 
					 | 
				
			||||||
                                       VK_IMAGE_TILING_OPTIMAL);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      linear = get_image_format_properties(&physical_device->info,
 | 
					 | 
				
			||||||
                                           linear_fmt.isl_format, linear_fmt);
 | 
					 | 
				
			||||||
      tiled = get_image_format_properties(&physical_device->info,
 | 
					 | 
				
			||||||
                                          linear_fmt.isl_format, tiled_fmt);
 | 
					 | 
				
			||||||
      buffer = get_buffer_format_properties(&physical_device->info,
 | 
					 | 
				
			||||||
                                            linear_fmt.isl_format);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      /* XXX: We handle 3-channel formats by switching them out for RGBX or
 | 
					 | 
				
			||||||
       * RGBA formats behind-the-scenes.  This works fine for textures
 | 
					 | 
				
			||||||
       * because the upload process will fill in the extra channel.
 | 
					 | 
				
			||||||
       * We could also support it for render targets, but it will take
 | 
					 | 
				
			||||||
       * substantially more work and we have enough RGBX formats to handle
 | 
					 | 
				
			||||||
       * what most clients will want.
 | 
					 | 
				
			||||||
       */
 | 
					 | 
				
			||||||
      if (linear_fmt.isl_format != ISL_FORMAT_UNSUPPORTED &&
 | 
					 | 
				
			||||||
          !util_is_power_of_two(isl_format_layouts[linear_fmt.isl_format].bpb) &&
 | 
					 | 
				
			||||||
          isl_format_rgb_to_rgbx(linear_fmt.isl_format) == ISL_FORMAT_UNSUPPORTED) {
 | 
					 | 
				
			||||||
         tiled &= ~VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT &
 | 
					 | 
				
			||||||
                  ~VK_FORMAT_FEATURE_BLIT_DST_BIT;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      /* ASTC textures must be in Y-tiled memory */
 | 
					 | 
				
			||||||
      if (isl_format_get_layout(linear_fmt.isl_format)->txc == ISL_TXC_ASTC)
 | 
					 | 
				
			||||||
         linear = 0;
 | 
					 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   if (format && format->can_ycbcr) {
 | 
					   if (anv_format->can_ycbcr) {
 | 
				
			||||||
      VkFormatFeatureFlags ycbcr_features = 0;
 | 
					      if (vk_tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT) {
 | 
				
			||||||
 | 
					         /* FINISHME(chadv): Support YUV with DRM format modifiers. */
 | 
				
			||||||
 | 
					         return 0;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      /* The sampler doesn't have support for mid point when it handles YUV on
 | 
					      /* The sampler doesn't have support for mid point when it handles YUV on
 | 
				
			||||||
       * its own.
 | 
					       * its own.
 | 
				
			||||||
       */
 | 
					       */
 | 
				
			||||||
      if (isl_format_is_yuv(format->planes[0].isl_format)) {
 | 
					      if (isl_format_is_yuv(anv_format->planes[0].isl_format)) {
 | 
				
			||||||
         /* TODO: We've disabled linear implicit reconstruction with the
 | 
					         /* TODO: We've disabled linear implicit reconstruction with the
 | 
				
			||||||
          * sampler. The failures show a slightly out of range values on the
 | 
					          * sampler. The failures show a slightly out of range values on the
 | 
				
			||||||
          * bottom left of the sampled image.
 | 
					          * bottom left of the sampled image.
 | 
				
			||||||
          */
 | 
					          */
 | 
				
			||||||
         ycbcr_features |= VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT_KHR;
 | 
					         flags |= VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT_KHR;
 | 
				
			||||||
      } else {
 | 
					      } else {
 | 
				
			||||||
         ycbcr_features |= VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT_KHR |
 | 
					         flags |= VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT_KHR |
 | 
				
			||||||
            VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT_KHR |
 | 
					                  VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT_KHR |
 | 
				
			||||||
            VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT_KHR;
 | 
					                  VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT_KHR;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      /* We can support cosited chroma locations when handle planes with our
 | 
					      /* We can support cosited chroma locations when handle planes with our
 | 
				
			||||||
       * own shader snippets.
 | 
					       * own shader snippets.
 | 
				
			||||||
       */
 | 
					       */
 | 
				
			||||||
      for (unsigned p = 0; p < format->n_planes; p++) {
 | 
					      for (unsigned p = 0; p < anv_format->n_planes; p++) {
 | 
				
			||||||
         if (format->planes[p].denominator_scales[0] > 1 ||
 | 
					         if (anv_format->planes[p].denominator_scales[0] > 1 ||
 | 
				
			||||||
             format->planes[p].denominator_scales[1] > 1) {
 | 
					             anv_format->planes[p].denominator_scales[1] > 1) {
 | 
				
			||||||
            ycbcr_features |= VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT_KHR;
 | 
					            flags |= VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT_KHR;
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
         }
 | 
					         }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      if (format->n_planes > 1)
 | 
					      if (anv_format->n_planes > 1)
 | 
				
			||||||
         ycbcr_features |= VK_FORMAT_FEATURE_DISJOINT_BIT_KHR;
 | 
					         flags |= VK_FORMAT_FEATURE_DISJOINT_BIT_KHR;
 | 
				
			||||||
 | 
					 | 
				
			||||||
      linear |= ycbcr_features;
 | 
					 | 
				
			||||||
      tiled |= ycbcr_features;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
      const VkFormatFeatureFlags disallowed_ycbcr_image_features =
 | 
					      const VkFormatFeatureFlags disallowed_ycbcr_image_features =
 | 
				
			||||||
         VK_FORMAT_FEATURE_BLIT_SRC_BIT |
 | 
					         VK_FORMAT_FEATURE_BLIT_SRC_BIT |
 | 
				
			||||||
@@ -636,42 +647,161 @@ anv_physical_device_get_format_properties(struct anv_physical_device *physical_d
 | 
				
			|||||||
         VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT |
 | 
					         VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT |
 | 
				
			||||||
         VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT;
 | 
					         VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      linear &= ~disallowed_ycbcr_image_features;
 | 
					      flags &= ~disallowed_ycbcr_image_features;
 | 
				
			||||||
      tiled &= ~disallowed_ycbcr_image_features;
 | 
					 | 
				
			||||||
      buffer = 0;
 | 
					 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   out_properties->linearTilingFeatures = linear;
 | 
					   if (vk_tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT) {
 | 
				
			||||||
   out_properties->optimalTilingFeatures = tiled;
 | 
					      switch (drm_format_mod) {
 | 
				
			||||||
   out_properties->bufferFeatures = buffer;
 | 
					      default:
 | 
				
			||||||
 | 
					         unreachable("bad DRM format modifier");
 | 
				
			||||||
 | 
					      case DRM_FORMAT_MOD_LINEAR:
 | 
				
			||||||
 | 
					         break;
 | 
				
			||||||
 | 
					      case I915_FORMAT_MOD_X_TILED:
 | 
				
			||||||
 | 
					         /* TODO(chadv): Should we support X-tiled storage images? */
 | 
				
			||||||
 | 
					         flags &= ~VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT;
 | 
				
			||||||
 | 
					         flags &= ~VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT;
 | 
				
			||||||
 | 
					         break;
 | 
				
			||||||
 | 
					      case I915_FORMAT_MOD_Y_TILED:
 | 
				
			||||||
 | 
					         break;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   return;
 | 
					   return flags;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static VkFormatFeatureFlags
 | 
				
			||||||
 | 
					get_buffer_format_features(const struct gen_device_info *devinfo,
 | 
				
			||||||
 | 
					                           VkFormat vk_format,
 | 
				
			||||||
 | 
					                           const struct anv_format *anv_format)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					   VkFormatFeatureFlags flags = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   if (anv_format == NULL)
 | 
				
			||||||
 | 
					      return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   const enum isl_format isl_format = anv_format->planes[0].isl_format;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   if (isl_format == ISL_FORMAT_UNSUPPORTED)
 | 
				
			||||||
 | 
					      return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   if (anv_format->n_planes > 1)
 | 
				
			||||||
 | 
					      return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   if (anv_format->can_ycbcr)
 | 
				
			||||||
 | 
					      return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   if (vk_format_is_depth_or_stencil(vk_format))
 | 
				
			||||||
 | 
					      return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   if (isl_format_supports_sampling(devinfo, isl_format) &&
 | 
				
			||||||
 | 
					       !isl_format_is_compressed(isl_format))
 | 
				
			||||||
 | 
					      flags |= VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   if (isl_format_supports_vertex_fetch(devinfo, isl_format))
 | 
				
			||||||
 | 
					      flags |= VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   if (isl_is_storage_image_format(isl_format))
 | 
				
			||||||
 | 
					      flags |= VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   if (isl_format == ISL_FORMAT_R32_SINT || isl_format == ISL_FORMAT_R32_UINT)
 | 
				
			||||||
 | 
					      flags |= VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   return flags;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Fill the VkDrmFormatModifierPropertiesEXT struct if the VkFormat supports
 | 
				
			||||||
 | 
					 * the DRM format modifier, and return true.  On failure, the output struct
 | 
				
			||||||
 | 
					 * has undefined content.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static bool
 | 
				
			||||||
 | 
					get_drm_format_modifier_properties(const struct anv_physical_device *physical_device,
 | 
				
			||||||
 | 
					                                   VkFormat vk_format,
 | 
				
			||||||
 | 
					                                   const struct anv_format *anv_format,
 | 
				
			||||||
 | 
					                                   uint64_t drm_format_mod,
 | 
				
			||||||
 | 
					                                   VkDrmFormatModifierPropertiesEXT *props)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					   const struct gen_device_info *devinfo = &physical_device->info;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   *props = (VkDrmFormatModifierPropertiesEXT) {
 | 
				
			||||||
 | 
					      .drmFormatModifier = drm_format_mod,
 | 
				
			||||||
 | 
					      .drmFormatModifierPlaneCount = anv_format->n_planes,
 | 
				
			||||||
 | 
					      .drmFormatModifierTilingFeatures =
 | 
				
			||||||
 | 
					         get_image_format_features(devinfo, vk_format, anv_format,
 | 
				
			||||||
 | 
					                                   VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT,
 | 
				
			||||||
 | 
					                                   drm_format_mod),
 | 
				
			||||||
 | 
					   };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   if (props->drmFormatModifierTilingFeatures == 0)
 | 
				
			||||||
 | 
					      return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   return true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					get_drm_format_modifier_properties_list(const struct anv_physical_device *physical_device,
 | 
				
			||||||
 | 
					                                        VkFormat vk_format,
 | 
				
			||||||
 | 
					                                        VkDrmFormatModifierPropertiesListEXT *drm_list)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					   const struct anv_format *anv_format = anv_get_format(vk_format);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   VK_OUTARRAY_MAKE(out, drm_list->pDrmFormatModifierProperties,
 | 
				
			||||||
 | 
					                    &drm_list->drmFormatModifierCount);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   #define TRY_MOD(mod) ({ \
 | 
				
			||||||
 | 
					      VkDrmFormatModifierPropertiesEXT tmp_props; \
 | 
				
			||||||
 | 
					      if (get_drm_format_modifier_properties(physical_device, vk_format, \
 | 
				
			||||||
 | 
					                                             anv_format, (mod), &tmp_props)) { \
 | 
				
			||||||
 | 
					         vk_outarray_append(&out, drm_props) { *drm_props = tmp_props; }; \
 | 
				
			||||||
 | 
					      } \
 | 
				
			||||||
 | 
					   })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   TRY_MOD(I915_FORMAT_MOD_Y_TILED);
 | 
				
			||||||
 | 
					   TRY_MOD(I915_FORMAT_MOD_X_TILED);
 | 
				
			||||||
 | 
					   TRY_MOD(DRM_FORMAT_MOD_LINEAR);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   #undef TRY_MOD
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void anv_GetPhysicalDeviceFormatProperties(
 | 
					void anv_GetPhysicalDeviceFormatProperties(
 | 
				
			||||||
    VkPhysicalDevice                            physicalDevice,
 | 
					    VkPhysicalDevice                            physicalDevice,
 | 
				
			||||||
    VkFormat                                    format,
 | 
					    VkFormat                                    vk_format,
 | 
				
			||||||
    VkFormatProperties*                         pFormatProperties)
 | 
					    VkFormatProperties*                         pFormatProperties)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
   ANV_FROM_HANDLE(anv_physical_device, physical_device, physicalDevice);
 | 
					   ANV_FROM_HANDLE(anv_physical_device, physical_device, physicalDevice);
 | 
				
			||||||
 | 
					   const struct gen_device_info *devinfo = &physical_device->info;
 | 
				
			||||||
 | 
					   const struct anv_format *anv_format = anv_get_format(vk_format);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   anv_physical_device_get_format_properties(
 | 
					   *pFormatProperties = (VkFormatProperties) {
 | 
				
			||||||
               physical_device,
 | 
					      .linearTilingFeatures =
 | 
				
			||||||
               format,
 | 
					         get_image_format_features(devinfo, vk_format, anv_format,
 | 
				
			||||||
               pFormatProperties);
 | 
					                                   VK_IMAGE_TILING_LINEAR,
 | 
				
			||||||
 | 
					                                   DRM_FORMAT_MOD_INVALID),
 | 
				
			||||||
 | 
					      .optimalTilingFeatures =
 | 
				
			||||||
 | 
					         get_image_format_features(devinfo, vk_format, anv_format,
 | 
				
			||||||
 | 
					                                   VK_IMAGE_TILING_OPTIMAL,
 | 
				
			||||||
 | 
					                                   DRM_FORMAT_MOD_INVALID),
 | 
				
			||||||
 | 
					      .bufferFeatures =
 | 
				
			||||||
 | 
					         get_buffer_format_features(devinfo, vk_format, anv_format),
 | 
				
			||||||
 | 
					   };
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void anv_GetPhysicalDeviceFormatProperties2KHR(
 | 
					void anv_GetPhysicalDeviceFormatProperties2KHR(
 | 
				
			||||||
    VkPhysicalDevice                            physicalDevice,
 | 
					    VkPhysicalDevice                            physicalDevice,
 | 
				
			||||||
    VkFormat                                    format,
 | 
					    VkFormat                                    vk_format,
 | 
				
			||||||
    VkFormatProperties2KHR*                     pFormatProperties)
 | 
					    VkFormatProperties2KHR*                     pFormatProperties)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
   anv_GetPhysicalDeviceFormatProperties(physicalDevice, format,
 | 
					   ANV_FROM_HANDLE(anv_physical_device, physical_device, physicalDevice);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   anv_GetPhysicalDeviceFormatProperties(physicalDevice, vk_format,
 | 
				
			||||||
                                         &pFormatProperties->formatProperties);
 | 
					                                         &pFormatProperties->formatProperties);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   vk_foreach_struct(ext, pFormatProperties->pNext) {
 | 
					   vk_foreach_struct(ext, pFormatProperties->pNext) {
 | 
				
			||||||
      switch (ext->sType) {
 | 
					      switch (ext->sType) {
 | 
				
			||||||
 | 
					      case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT:
 | 
				
			||||||
 | 
					         get_drm_format_modifier_properties_list(physical_device, vk_format,
 | 
				
			||||||
 | 
					            (VkDrmFormatModifierPropertiesListEXT *)ext);
 | 
				
			||||||
 | 
					         break;
 | 
				
			||||||
      default:
 | 
					      default:
 | 
				
			||||||
         anv_debug_ignored_stype(ext->sType);
 | 
					         anv_debug_ignored_stype(ext->sType);
 | 
				
			||||||
         break;
 | 
					         break;
 | 
				
			||||||
@@ -683,38 +813,48 @@ static VkResult
 | 
				
			|||||||
anv_get_image_format_properties(
 | 
					anv_get_image_format_properties(
 | 
				
			||||||
   struct anv_physical_device *physical_device,
 | 
					   struct anv_physical_device *physical_device,
 | 
				
			||||||
   const VkPhysicalDeviceImageFormatInfo2KHR *info,
 | 
					   const VkPhysicalDeviceImageFormatInfo2KHR *info,
 | 
				
			||||||
 | 
					   const VkPhysicalDeviceImageDrmFormatModifierInfoEXT *drm_info,
 | 
				
			||||||
   VkImageFormatProperties *pImageFormatProperties,
 | 
					   VkImageFormatProperties *pImageFormatProperties,
 | 
				
			||||||
   VkSamplerYcbcrConversionImageFormatPropertiesKHR *pYcbcrImageFormatProperties)
 | 
					   VkSamplerYcbcrConversionImageFormatPropertiesKHR *pYcbcrImageFormatProperties)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
   VkFormatProperties format_props;
 | 
					 | 
				
			||||||
   VkFormatFeatureFlags format_feature_flags;
 | 
					 | 
				
			||||||
   VkExtent3D maxExtent;
 | 
					   VkExtent3D maxExtent;
 | 
				
			||||||
   uint32_t maxMipLevels;
 | 
					   uint32_t maxMipLevels;
 | 
				
			||||||
   uint32_t maxArraySize;
 | 
					   uint32_t maxArraySize;
 | 
				
			||||||
   VkSampleCountFlags sampleCounts = VK_SAMPLE_COUNT_1_BIT;
 | 
					   VkSampleCountFlags sampleCounts = VK_SAMPLE_COUNT_1_BIT;
 | 
				
			||||||
 | 
					   const struct gen_device_info *devinfo = &physical_device->info;
 | 
				
			||||||
   const struct anv_format *format = anv_get_format(info->format);
 | 
					   const struct anv_format *format = anv_get_format(info->format);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   if (format == NULL)
 | 
					   if (format == NULL)
 | 
				
			||||||
      goto unsupported;
 | 
					      goto unsupported;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   anv_physical_device_get_format_properties(physical_device, info->format,
 | 
					   uint64_t drm_format_mod = DRM_FORMAT_MOD_INVALID;
 | 
				
			||||||
                                             &format_props);
 | 
					   if (drm_info) {
 | 
				
			||||||
 | 
					      assert(info->tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT);
 | 
				
			||||||
   /* Extract the VkFormatFeatureFlags that are relevant for the queried
 | 
					      drm_format_mod = drm_info->drmFormatModifier;
 | 
				
			||||||
    * tiling.
 | 
					 | 
				
			||||||
    */
 | 
					 | 
				
			||||||
   if (info->tiling == VK_IMAGE_TILING_LINEAR) {
 | 
					 | 
				
			||||||
      format_feature_flags = format_props.linearTilingFeatures;
 | 
					 | 
				
			||||||
   } else if (info->tiling == VK_IMAGE_TILING_OPTIMAL) {
 | 
					 | 
				
			||||||
      format_feature_flags = format_props.optimalTilingFeatures;
 | 
					 | 
				
			||||||
   } else {
 | 
					 | 
				
			||||||
      unreachable("bad VkImageTiling");
 | 
					 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   VkFormatFeatureFlags format_feature_flags =
 | 
				
			||||||
 | 
					      get_image_format_features(devinfo, info->format, format, info->tiling,
 | 
				
			||||||
 | 
					                                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.
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   switch (info->type) {
 | 
					   switch (info->type) {
 | 
				
			||||||
   default:
 | 
					   default:
 | 
				
			||||||
      unreachable("bad VkImageType");
 | 
					      unreachable("bad VkImageType");
 | 
				
			||||||
   case VK_IMAGE_TYPE_1D:
 | 
					   case VK_IMAGE_TYPE_1D:
 | 
				
			||||||
 | 
					      /* We reject 1D images with modifiers due to FUD */
 | 
				
			||||||
 | 
					      if (drm_info)
 | 
				
			||||||
 | 
					         goto unsupported;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      maxExtent.width = 16384;
 | 
					      maxExtent.width = 16384;
 | 
				
			||||||
      maxExtent.height = 1;
 | 
					      maxExtent.height = 1;
 | 
				
			||||||
      maxExtent.depth = 1;
 | 
					      maxExtent.depth = 1;
 | 
				
			||||||
@@ -729,10 +869,20 @@ anv_get_image_format_properties(
 | 
				
			|||||||
      maxExtent.width = 16384;
 | 
					      maxExtent.width = 16384;
 | 
				
			||||||
      maxExtent.height = 16384;
 | 
					      maxExtent.height = 16384;
 | 
				
			||||||
      maxExtent.depth = 1;
 | 
					      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;
 | 
					      break;
 | 
				
			||||||
   case VK_IMAGE_TYPE_3D:
 | 
					   case VK_IMAGE_TYPE_3D:
 | 
				
			||||||
 | 
					      /* We reject 3D images with modifiers due to FUD */
 | 
				
			||||||
 | 
					      if (drm_info)
 | 
				
			||||||
 | 
					         goto unsupported;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      maxExtent.width = 2048;
 | 
					      maxExtent.width = 2048;
 | 
				
			||||||
      maxExtent.height = 2048;
 | 
					      maxExtent.height = 2048;
 | 
				
			||||||
      maxExtent.depth = 2048;
 | 
					      maxExtent.depth = 2048;
 | 
				
			||||||
@@ -857,11 +1007,11 @@ VkResult anv_GetPhysicalDeviceImageFormatProperties(
 | 
				
			|||||||
      .flags = createFlags,
 | 
					      .flags = createFlags,
 | 
				
			||||||
   };
 | 
					   };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   return anv_get_image_format_properties(physical_device, &info,
 | 
					   return anv_get_image_format_properties(physical_device, &info, NULL,
 | 
				
			||||||
                                          pImageFormatProperties, NULL);
 | 
					                                          pImageFormatProperties, NULL);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const VkExternalMemoryPropertiesKHR prime_fd_props = {
 | 
					static const VkExternalMemoryPropertiesKHR opaque_fd_props = {
 | 
				
			||||||
   /* If we can handle external, then we can both import and export it. */
 | 
					   /* If we can handle external, then we can both import and export it. */
 | 
				
			||||||
   .externalMemoryFeatures = VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT_KHR |
 | 
					   .externalMemoryFeatures = VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT_KHR |
 | 
				
			||||||
                             VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT_KHR,
 | 
					                             VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT_KHR,
 | 
				
			||||||
@@ -872,6 +1022,17 @@ static const VkExternalMemoryPropertiesKHR prime_fd_props = {
 | 
				
			|||||||
      VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR,
 | 
					      VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const VkExternalMemoryPropertiesKHR dma_buf_props = {
 | 
				
			||||||
 | 
					   /* If we can handle external, then we can both import and export it. */
 | 
				
			||||||
 | 
					   .externalMemoryFeatures = VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT_KHR |
 | 
				
			||||||
 | 
					                             VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT_KHR,
 | 
				
			||||||
 | 
					   /* For the moment, let's not support mixing and matching */
 | 
				
			||||||
 | 
					   .exportFromImportedHandleTypes =
 | 
				
			||||||
 | 
					      VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT,
 | 
				
			||||||
 | 
					   .compatibleHandleTypes =
 | 
				
			||||||
 | 
					      VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VkResult anv_GetPhysicalDeviceImageFormatProperties2KHR(
 | 
					VkResult anv_GetPhysicalDeviceImageFormatProperties2KHR(
 | 
				
			||||||
    VkPhysicalDevice                            physicalDevice,
 | 
					    VkPhysicalDevice                            physicalDevice,
 | 
				
			||||||
    const VkPhysicalDeviceImageFormatInfo2KHR*  base_info,
 | 
					    const VkPhysicalDeviceImageFormatInfo2KHR*  base_info,
 | 
				
			||||||
@@ -879,6 +1040,7 @@ VkResult anv_GetPhysicalDeviceImageFormatProperties2KHR(
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
   ANV_FROM_HANDLE(anv_physical_device, physical_device, physicalDevice);
 | 
					   ANV_FROM_HANDLE(anv_physical_device, physical_device, physicalDevice);
 | 
				
			||||||
   const VkPhysicalDeviceExternalImageFormatInfoKHR *external_info = NULL;
 | 
					   const VkPhysicalDeviceExternalImageFormatInfoKHR *external_info = NULL;
 | 
				
			||||||
 | 
					   const VkPhysicalDeviceImageDrmFormatModifierInfoEXT *drm_info = NULL;
 | 
				
			||||||
   VkExternalImageFormatPropertiesKHR *external_props = NULL;
 | 
					   VkExternalImageFormatPropertiesKHR *external_props = NULL;
 | 
				
			||||||
   VkSamplerYcbcrConversionImageFormatPropertiesKHR *ycbcr_props = NULL;
 | 
					   VkSamplerYcbcrConversionImageFormatPropertiesKHR *ycbcr_props = NULL;
 | 
				
			||||||
   VkResult result;
 | 
					   VkResult result;
 | 
				
			||||||
@@ -889,6 +1051,9 @@ VkResult anv_GetPhysicalDeviceImageFormatProperties2KHR(
 | 
				
			|||||||
      case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO_KHR:
 | 
					      case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO_KHR:
 | 
				
			||||||
         external_info = (const void *) s;
 | 
					         external_info = (const void *) s;
 | 
				
			||||||
         break;
 | 
					         break;
 | 
				
			||||||
 | 
					      case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT:
 | 
				
			||||||
 | 
					         drm_info = (const void *) s;
 | 
				
			||||||
 | 
					         break;
 | 
				
			||||||
      default:
 | 
					      default:
 | 
				
			||||||
         anv_debug_ignored_stype(s->sType);
 | 
					         anv_debug_ignored_stype(s->sType);
 | 
				
			||||||
         break;
 | 
					         break;
 | 
				
			||||||
@@ -911,7 +1076,7 @@ VkResult anv_GetPhysicalDeviceImageFormatProperties2KHR(
 | 
				
			|||||||
   }
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   result = anv_get_image_format_properties(physical_device, base_info,
 | 
					   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)
 | 
					   if (result != VK_SUCCESS)
 | 
				
			||||||
      goto fail;
 | 
					      goto fail;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -925,7 +1090,10 @@ VkResult anv_GetPhysicalDeviceImageFormatProperties2KHR(
 | 
				
			|||||||
      switch (external_info->handleType) {
 | 
					      switch (external_info->handleType) {
 | 
				
			||||||
      case VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR:
 | 
					      case VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR:
 | 
				
			||||||
         if (external_props)
 | 
					         if (external_props)
 | 
				
			||||||
            external_props->externalMemoryProperties = prime_fd_props;
 | 
					            external_props->externalMemoryProperties = opaque_fd_props;
 | 
				
			||||||
 | 
					      case VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT:
 | 
				
			||||||
 | 
					         if (external_props)
 | 
				
			||||||
 | 
					            external_props->externalMemoryProperties = dma_buf_props;
 | 
				
			||||||
         break;
 | 
					         break;
 | 
				
			||||||
      default:
 | 
					      default:
 | 
				
			||||||
         /* From the Vulkan 1.0.42 spec:
 | 
					         /* From the Vulkan 1.0.42 spec:
 | 
				
			||||||
@@ -1006,7 +1174,10 @@ void anv_GetPhysicalDeviceExternalBufferPropertiesKHR(
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
   switch (pExternalBufferInfo->handleType) {
 | 
					   switch (pExternalBufferInfo->handleType) {
 | 
				
			||||||
   case VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR:
 | 
					   case VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR:
 | 
				
			||||||
      pExternalBufferProperties->externalMemoryProperties = prime_fd_props;
 | 
					      pExternalBufferProperties->externalMemoryProperties = opaque_fd_props;
 | 
				
			||||||
 | 
					      return;
 | 
				
			||||||
 | 
					   case VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT:
 | 
				
			||||||
 | 
					      pExternalBufferProperties->externalMemoryProperties = dma_buf_props;
 | 
				
			||||||
      return;
 | 
					      return;
 | 
				
			||||||
   default:
 | 
					   default:
 | 
				
			||||||
      goto unsupported;
 | 
					      goto unsupported;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,6 +27,7 @@
 | 
				
			|||||||
#include <unistd.h>
 | 
					#include <unistd.h>
 | 
				
			||||||
#include <fcntl.h>
 | 
					#include <fcntl.h>
 | 
				
			||||||
#include <sys/mman.h>
 | 
					#include <sys/mman.h>
 | 
				
			||||||
 | 
					#include <drm_fourcc.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "anv_private.h"
 | 
					#include "anv_private.h"
 | 
				
			||||||
#include "util/debug.h"
 | 
					#include "util/debug.h"
 | 
				
			||||||
@@ -34,15 +35,13 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "vk_format_info.h"
 | 
					#include "vk_format_info.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * Exactly one bit must be set in \a aspect.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
static isl_surf_usage_flags_t
 | 
					static isl_surf_usage_flags_t
 | 
				
			||||||
choose_isl_surf_usage(VkImageCreateFlags vk_create_flags,
 | 
					choose_isl_surf_usage(const VkImageCreateInfo *vk_info,
 | 
				
			||||||
                      VkImageUsageFlags vk_usage,
 | 
					 | 
				
			||||||
                      isl_surf_usage_flags_t isl_extra_usage,
 | 
					                      isl_surf_usage_flags_t isl_extra_usage,
 | 
				
			||||||
                      VkImageAspectFlags aspect)
 | 
					                      VkImageAspectFlagBits aspect)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					   VkImageCreateFlags vk_create_flags = vk_info->flags;
 | 
				
			||||||
 | 
					   VkImageUsageFlags vk_usage = vk_info->usage;
 | 
				
			||||||
   isl_surf_usage_flags_t isl_usage = isl_extra_usage;
 | 
					   isl_surf_usage_flags_t isl_usage = isl_extra_usage;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   if (vk_usage & VK_IMAGE_USAGE_SAMPLED_BIT)
 | 
					   if (vk_usage & VK_IMAGE_USAGE_SAMPLED_BIT)
 | 
				
			||||||
@@ -90,14 +89,45 @@ choose_isl_surf_usage(VkImageCreateFlags vk_create_flags,
 | 
				
			|||||||
      isl_usage |= ISL_SURF_USAGE_RENDER_TARGET_BIT;
 | 
					      isl_usage |= ISL_SURF_USAGE_RENDER_TARGET_BIT;
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   if (vk_info->tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT)
 | 
				
			||||||
 | 
					      isl_usage |= ISL_SURF_USAGE_DISABLE_AUX_BIT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   return isl_usage;
 | 
					   return isl_usage;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					static isl_tiling_flags_t
 | 
				
			||||||
 * Exactly one bit must be set in \a aspect.
 | 
					choose_isl_tiling_flags(const struct anv_image_create_info *anv_info,
 | 
				
			||||||
 */
 | 
					                        const struct isl_drm_modifier_info *isl_mod_info)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					   const VkImageCreateInfo *base_info = anv_info->vk_info;
 | 
				
			||||||
 | 
					   isl_tiling_flags_t flags = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   switch (base_info->tiling) {
 | 
				
			||||||
 | 
					   default:
 | 
				
			||||||
 | 
					      unreachable("bad VkImageTiling");
 | 
				
			||||||
 | 
					   case VK_IMAGE_TILING_OPTIMAL:
 | 
				
			||||||
 | 
					      assert(isl_mod_info == NULL);
 | 
				
			||||||
 | 
					      flags = ISL_TILING_ANY_MASK;
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					   case VK_IMAGE_TILING_LINEAR:
 | 
				
			||||||
 | 
					      assert(isl_mod_info == NULL);
 | 
				
			||||||
 | 
					      flags = ISL_TILING_LINEAR_BIT;
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					   case VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT:
 | 
				
			||||||
 | 
					      flags = 1 << isl_mod_info->tiling;
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   if (anv_info->isl_tiling_flags)
 | 
				
			||||||
 | 
					      flags &= anv_info->isl_tiling_flags;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   assert(flags);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   return flags;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct anv_surface *
 | 
					static struct anv_surface *
 | 
				
			||||||
get_surface(struct anv_image *image, VkImageAspectFlags aspect)
 | 
					get_surface(struct anv_image *image, VkImageAspectFlagBits aspect)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
   uint32_t plane = anv_image_aspect_to_plane(image->aspects, aspect);
 | 
					   uint32_t plane = anv_image_aspect_to_plane(image->aspects, aspect);
 | 
				
			||||||
   return &image->planes[plane].surface;
 | 
					   return &image->planes[plane].surface;
 | 
				
			||||||
@@ -209,7 +239,7 @@ add_fast_clear_state_buffer(struct anv_image *image,
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
   assert(image && device);
 | 
					   assert(image && device);
 | 
				
			||||||
   assert(image->planes[plane].aux_surface.isl.size > 0 &&
 | 
					   assert(image->planes[plane].aux_surface.isl.size > 0 &&
 | 
				
			||||||
          image->aspects & VK_IMAGE_ASPECT_ANY_COLOR_BIT);
 | 
					          image->aspects & VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   /* The offset to the buffer of clear values must be dword-aligned for GPU
 | 
					   /* The offset to the buffer of clear values must be dword-aligned for GPU
 | 
				
			||||||
    * memcpy operations. It is located immediately after the auxiliary surface.
 | 
					    * memcpy operations. It is located immediately after the auxiliary surface.
 | 
				
			||||||
@@ -253,14 +283,14 @@ add_fast_clear_state_buffer(struct anv_image *image,
 | 
				
			|||||||
/**
 | 
					/**
 | 
				
			||||||
 * Initialize the anv_image::*_surface selected by \a aspect. Then update the
 | 
					 * Initialize the anv_image::*_surface selected by \a aspect. Then update the
 | 
				
			||||||
 * image's memory requirements (that is, the image's size and alignment).
 | 
					 * image's memory requirements (that is, the image's size and alignment).
 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * Exactly one bit must be set in \a aspect.
 | 
					 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
static VkResult
 | 
					static VkResult
 | 
				
			||||||
make_surface(const struct anv_device *dev,
 | 
					make_surface(const struct anv_device *dev,
 | 
				
			||||||
             struct anv_image *image,
 | 
					             struct anv_image *image,
 | 
				
			||||||
             const struct anv_image_create_info *anv_info,
 | 
					             const struct anv_image_create_info *anv_info,
 | 
				
			||||||
             VkImageAspectFlags aspect)
 | 
					             const VkImageExplicitDrmFormatModifierCreateInfoEXT *explicit_drm_info,
 | 
				
			||||||
 | 
					             isl_tiling_flags_t tiling_flags,
 | 
				
			||||||
 | 
					             VkImageAspectFlagBits aspect)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
   const VkImageCreateInfo *vk_info = anv_info->vk_info;
 | 
					   const VkImageCreateInfo *vk_info = anv_info->vk_info;
 | 
				
			||||||
   bool ok UNUSED;
 | 
					   bool ok UNUSED;
 | 
				
			||||||
@@ -271,18 +301,6 @@ make_surface(const struct anv_device *dev,
 | 
				
			|||||||
      [VK_IMAGE_TYPE_3D] = ISL_SURF_DIM_3D,
 | 
					      [VK_IMAGE_TYPE_3D] = ISL_SURF_DIM_3D,
 | 
				
			||||||
   };
 | 
					   };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   /* Translate the Vulkan tiling to an equivalent ISL tiling, then filter the
 | 
					 | 
				
			||||||
    * result with an optionally provided ISL tiling argument.
 | 
					 | 
				
			||||||
    */
 | 
					 | 
				
			||||||
   isl_tiling_flags_t tiling_flags =
 | 
					 | 
				
			||||||
      (vk_info->tiling == VK_IMAGE_TILING_LINEAR) ?
 | 
					 | 
				
			||||||
      ISL_TILING_LINEAR_BIT : ISL_TILING_ANY_MASK;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   if (anv_info->isl_tiling_flags)
 | 
					 | 
				
			||||||
      tiling_flags &= anv_info->isl_tiling_flags;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   assert(tiling_flags);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   image->extent = anv_sanitize_image_extent(vk_info->imageType,
 | 
					   image->extent = anv_sanitize_image_extent(vk_info->imageType,
 | 
				
			||||||
                                             vk_info->extent);
 | 
					                                             vk_info->extent);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -291,9 +309,15 @@ make_surface(const struct anv_device *dev,
 | 
				
			|||||||
      anv_get_format_plane(&dev->info, image->vk_format, aspect, image->tiling);
 | 
					      anv_get_format_plane(&dev->info, image->vk_format, aspect, image->tiling);
 | 
				
			||||||
   struct anv_surface *anv_surf = &image->planes[plane].surface;
 | 
					   struct anv_surface *anv_surf = &image->planes[plane].surface;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   const VkSubresourceLayout *drm_plane_layout = explicit_drm_info ?
 | 
				
			||||||
 | 
					      &explicit_drm_info->pPlaneLayouts[plane] : NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   const isl_surf_usage_flags_t usage =
 | 
					   const isl_surf_usage_flags_t usage =
 | 
				
			||||||
      choose_isl_surf_usage(vk_info->flags, image->usage,
 | 
					      choose_isl_surf_usage(vk_info, anv_info->isl_extra_usage_flags, aspect);
 | 
				
			||||||
                            anv_info->isl_extra_usage_flags, aspect);
 | 
					
 | 
				
			||||||
 | 
					   uint32_t row_pitch = anv_info->stride;
 | 
				
			||||||
 | 
					   if (explicit_drm_info)
 | 
				
			||||||
 | 
					      row_pitch = drm_plane_layout->rowPitch;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   /* If an image is created as BLOCK_TEXEL_VIEW_COMPATIBLE, then we need to
 | 
					   /* If an image is created as BLOCK_TEXEL_VIEW_COMPATIBLE, then we need to
 | 
				
			||||||
    * fall back to linear on Broadwell and earlier because we aren't
 | 
					    * fall back to linear on Broadwell and earlier because we aren't
 | 
				
			||||||
@@ -320,19 +344,72 @@ make_surface(const struct anv_device *dev,
 | 
				
			|||||||
      .array_len = vk_info->arrayLayers,
 | 
					      .array_len = vk_info->arrayLayers,
 | 
				
			||||||
      .samples = vk_info->samples,
 | 
					      .samples = vk_info->samples,
 | 
				
			||||||
      .min_alignment = 0,
 | 
					      .min_alignment = 0,
 | 
				
			||||||
      .row_pitch = anv_info->stride,
 | 
					      .row_pitch = row_pitch,
 | 
				
			||||||
      .usage = usage,
 | 
					      .usage = usage,
 | 
				
			||||||
      .tiling_flags = tiling_flags);
 | 
					      .tiling_flags = tiling_flags);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   /* isl_surf_init() will fail only if provided invalid input. Invalid input
 | 
					   if (!ok) {
 | 
				
			||||||
    * is illegal in Vulkan.
 | 
					      /* isl_surf_init() fails only when provided invalid input. Invalid input
 | 
				
			||||||
    */
 | 
					       * is illegal in Vulkan unless
 | 
				
			||||||
   assert(ok);
 | 
					       * VkImageExplicitDrmFormatModifierCreateInfoEXT is given.
 | 
				
			||||||
 | 
					       */
 | 
				
			||||||
 | 
					      assert(explicit_drm_info);
 | 
				
			||||||
 | 
					      return vk_errorf(dev->instance, dev,
 | 
				
			||||||
 | 
					                       VK_ERROR_INVALID_DRM_FORMAT_MODIFIER_PLANE_LAYOUT_EXT,
 | 
				
			||||||
 | 
					                       "isl_surf_init() failed for plane %u", plane);
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   if (explicit_drm_info) {
 | 
				
			||||||
 | 
					      /* The VK_EXT_image_drm_format_modifier spec permits support of any
 | 
				
			||||||
 | 
					       * image, but we restrict support to simple images.
 | 
				
			||||||
 | 
					       */
 | 
				
			||||||
 | 
					      assert(aspect == VK_IMAGE_ASPECT_COLOR_BIT);
 | 
				
			||||||
 | 
					      assert(image->type == VK_IMAGE_TYPE_2D);
 | 
				
			||||||
 | 
					      assert(image->array_size == 1);
 | 
				
			||||||
 | 
					      assert(image->samples == 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      /* FINISHME: YCbCr images with DRM format modifiers */
 | 
				
			||||||
 | 
					      assert(!anv_get_format(image->vk_format)->can_ycbcr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (drm_plane_layout->size < anv_surf->isl.size) {
 | 
				
			||||||
 | 
					         return vk_errorf(dev->instance, dev,
 | 
				
			||||||
 | 
					                          VK_ERROR_INVALID_DRM_FORMAT_MODIFIER_PLANE_LAYOUT_EXT,
 | 
				
			||||||
 | 
					                          "VkSubresourceLayout::size too small for plane %u", plane);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (drm_plane_layout->offset & (anv_surf->isl.alignment - 1)) {
 | 
				
			||||||
 | 
					         return vk_errorf(dev->instance, dev,
 | 
				
			||||||
 | 
					                          VK_ERROR_INVALID_DRM_FORMAT_MODIFIER_PLANE_LAYOUT_EXT,
 | 
				
			||||||
 | 
					                          "VkSubresourceLayout::offset misaligned for plane "
 | 
				
			||||||
 | 
					                          "%u", plane);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (drm_plane_layout->arrayPitch != 0) {
 | 
				
			||||||
 | 
					         return vk_errorf(dev->instance, dev,
 | 
				
			||||||
 | 
					                          VK_ERROR_INVALID_DRM_FORMAT_MODIFIER_PLANE_LAYOUT_EXT,
 | 
				
			||||||
 | 
					                          "VkSubresourceLayout::arrayPitch must be 0");
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (drm_plane_layout->depthPitch != 0) {
 | 
				
			||||||
 | 
					         return vk_errorf(dev->instance, dev,
 | 
				
			||||||
 | 
					                          VK_ERROR_INVALID_DRM_FORMAT_MODIFIER_PLANE_LAYOUT_EXT,
 | 
				
			||||||
 | 
					                          "VkSubresourceLayout::depthPitch must be 0");
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      anv_surf->offset = drm_plane_layout->offset;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      image->planes[plane].offset = drm_plane_layout->offset;
 | 
				
			||||||
 | 
					      image->planes[plane].alignment = anv_surf->isl.alignment;
 | 
				
			||||||
 | 
					      image->planes[plane].size = drm_plane_layout->size;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      image->size = image->planes[plane].offset + image->planes[plane].size;
 | 
				
			||||||
 | 
					      image->alignment = image->planes[plane].alignment;
 | 
				
			||||||
 | 
					   } else {
 | 
				
			||||||
 | 
					      add_surface(image, anv_surf, plane);
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   image->planes[plane].aux_usage = ISL_AUX_USAGE_NONE;
 | 
					   image->planes[plane].aux_usage = ISL_AUX_USAGE_NONE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   add_surface(image, anv_surf, plane);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   /* If an image is created as BLOCK_TEXEL_VIEW_COMPATIBLE, then we need to
 | 
					   /* If an image is created as BLOCK_TEXEL_VIEW_COMPATIBLE, then we need to
 | 
				
			||||||
    * create an identical tiled shadow surface for use while texturing so we
 | 
					    * create an identical tiled shadow surface for use while texturing so we
 | 
				
			||||||
    * don't get garbage performance.
 | 
					    * don't get garbage performance.
 | 
				
			||||||
@@ -394,7 +471,7 @@ make_surface(const struct anv_device *dev,
 | 
				
			|||||||
         add_surface(image, &image->planes[plane].aux_surface, plane);
 | 
					         add_surface(image, &image->planes[plane].aux_surface, plane);
 | 
				
			||||||
         image->planes[plane].aux_usage = ISL_AUX_USAGE_HIZ;
 | 
					         image->planes[plane].aux_usage = ISL_AUX_USAGE_HIZ;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
   } else if ((aspect & VK_IMAGE_ASPECT_ANY_COLOR_BIT) && vk_info->samples == 1) {
 | 
					   } else if ((aspect & VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV) && vk_info->samples == 1) {
 | 
				
			||||||
      /* TODO: Disallow compression with :
 | 
					      /* TODO: Disallow compression with :
 | 
				
			||||||
       *
 | 
					       *
 | 
				
			||||||
       *     1) non multiplanar images (We appear to hit a sampler bug with
 | 
					       *     1) non multiplanar images (We appear to hit a sampler bug with
 | 
				
			||||||
@@ -451,7 +528,7 @@ make_surface(const struct anv_device *dev,
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
         }
 | 
					         }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
   } else if ((aspect & VK_IMAGE_ASPECT_ANY_COLOR_BIT) && vk_info->samples > 1) {
 | 
					   } else if ((aspect & VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV) && vk_info->samples > 1) {
 | 
				
			||||||
      assert(!(vk_info->usage & VK_IMAGE_USAGE_STORAGE_BIT));
 | 
					      assert(!(vk_info->usage & VK_IMAGE_USAGE_STORAGE_BIT));
 | 
				
			||||||
      assert(image->planes[plane].aux_surface.isl.size == 0);
 | 
					      assert(image->planes[plane].aux_surface.isl.size == 0);
 | 
				
			||||||
      ok = isl_surf_get_mcs_surf(&dev->isl_dev,
 | 
					      ok = isl_surf_get_mcs_surf(&dev->isl_dev,
 | 
				
			||||||
@@ -486,6 +563,38 @@ make_surface(const struct anv_device *dev,
 | 
				
			|||||||
   return VK_SUCCESS;
 | 
					   return VK_SUCCESS;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static uint32_t
 | 
				
			||||||
 | 
					score_drm_format_mod(uint64_t mod)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					   switch (mod) {
 | 
				
			||||||
 | 
					   default: unreachable("bad DRM format modifier");
 | 
				
			||||||
 | 
					   case I915_FORMAT_MOD_Y_TILED: return 3;
 | 
				
			||||||
 | 
					   case I915_FORMAT_MOD_X_TILED: return 2;
 | 
				
			||||||
 | 
					   case DRM_FORMAT_MOD_LINEAR: return 1;
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const struct isl_drm_modifier_info *
 | 
				
			||||||
 | 
					choose_drm_format_mod(const VkImageDrmFormatModifierListCreateInfoEXT *mod_list)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					   uint64_t best_mod = UINT64_MAX;
 | 
				
			||||||
 | 
					   uint32_t best_score = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   for (uint32_t i = 0; i < mod_list->drmFormatModifierCount; ++i) {
 | 
				
			||||||
 | 
					      uint64_t mod = mod_list->pDrmFormatModifiers[i];
 | 
				
			||||||
 | 
					      uint32_t score = score_drm_format_mod(mod);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (score > best_score) {
 | 
				
			||||||
 | 
					         best_mod = mod;
 | 
				
			||||||
 | 
					         best_score = score;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   assert(best_score != 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   return isl_drm_modifier_get_info(best_mod);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VkResult
 | 
					VkResult
 | 
				
			||||||
anv_image_create(VkDevice _device,
 | 
					anv_image_create(VkDevice _device,
 | 
				
			||||||
                 const struct anv_image_create_info *create_info,
 | 
					                 const struct anv_image_create_info *create_info,
 | 
				
			||||||
@@ -494,11 +603,31 @@ anv_image_create(VkDevice _device,
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
   ANV_FROM_HANDLE(anv_device, device, _device);
 | 
					   ANV_FROM_HANDLE(anv_device, device, _device);
 | 
				
			||||||
   const VkImageCreateInfo *pCreateInfo = create_info->vk_info;
 | 
					   const VkImageCreateInfo *pCreateInfo = create_info->vk_info;
 | 
				
			||||||
 | 
					   const VkImageDrmFormatModifierListCreateInfoEXT *vk_mod_list = NULL;
 | 
				
			||||||
 | 
					   const VkImageExplicitDrmFormatModifierCreateInfoEXT *explicit_drm_info = NULL;
 | 
				
			||||||
 | 
					   const struct isl_drm_modifier_info *isl_mod_info = NULL;
 | 
				
			||||||
   struct anv_image *image = NULL;
 | 
					   struct anv_image *image = NULL;
 | 
				
			||||||
   VkResult r;
 | 
					   VkResult r;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO);
 | 
					   assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   /* Extract input structs */
 | 
				
			||||||
 | 
					   vk_foreach_struct_const(s, pCreateInfo->pNext) {
 | 
				
			||||||
 | 
					      switch (s->sType) {
 | 
				
			||||||
 | 
					      case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT:
 | 
				
			||||||
 | 
					         vk_mod_list = (const VkImageDrmFormatModifierListCreateInfoEXT *) s;
 | 
				
			||||||
 | 
					         isl_mod_info = choose_drm_format_mod(vk_mod_list);
 | 
				
			||||||
 | 
					         break;
 | 
				
			||||||
 | 
					      case VK_STRUCTURE_TYPE_IMAGE_EXCPLICIT_DRM_FORMAT_MODIFIER_CREATE_INFO_EXT:
 | 
				
			||||||
 | 
					         explicit_drm_info = (const VkImageExplicitDrmFormatModifierCreateInfoEXT *) s;
 | 
				
			||||||
 | 
					         isl_mod_info = isl_drm_modifier_get_info(explicit_drm_info->drmFormatModifier);
 | 
				
			||||||
 | 
					         break;
 | 
				
			||||||
 | 
					      default:
 | 
				
			||||||
 | 
					         anv_debug_ignored_stype(s->sType);
 | 
				
			||||||
 | 
					         break;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   anv_assert(pCreateInfo->mipLevels > 0);
 | 
					   anv_assert(pCreateInfo->mipLevels > 0);
 | 
				
			||||||
   anv_assert(pCreateInfo->arrayLayers > 0);
 | 
					   anv_assert(pCreateInfo->arrayLayers > 0);
 | 
				
			||||||
   anv_assert(pCreateInfo->samples > 0);
 | 
					   anv_assert(pCreateInfo->samples > 0);
 | 
				
			||||||
@@ -523,14 +652,21 @@ anv_image_create(VkDevice _device,
 | 
				
			|||||||
   image->tiling = pCreateInfo->tiling;
 | 
					   image->tiling = pCreateInfo->tiling;
 | 
				
			||||||
   image->disjoint = pCreateInfo->flags & VK_IMAGE_CREATE_DISJOINT_BIT_KHR;
 | 
					   image->disjoint = pCreateInfo->flags & VK_IMAGE_CREATE_DISJOINT_BIT_KHR;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   if (isl_mod_info)
 | 
				
			||||||
 | 
					      image->drm_format_mod = isl_mod_info->modifier;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   const struct anv_format *format = anv_get_format(image->vk_format);
 | 
					   const struct anv_format *format = anv_get_format(image->vk_format);
 | 
				
			||||||
   assert(format != NULL);
 | 
					   assert(format != NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   const isl_tiling_flags_t isl_tiling_flags =
 | 
				
			||||||
 | 
					      choose_isl_tiling_flags(create_info, isl_mod_info);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   image->n_planes = format->n_planes;
 | 
					   image->n_planes = format->n_planes;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   uint32_t b;
 | 
					   uint32_t b;
 | 
				
			||||||
   for_each_bit(b, image->aspects) {
 | 
					   for_each_bit(b, image->aspects) {
 | 
				
			||||||
      r = make_surface(device, image, create_info, (1 << b));
 | 
					      r = make_surface(device, image, create_info, explicit_drm_info,
 | 
				
			||||||
 | 
					                       isl_tiling_flags, (1 << b));
 | 
				
			||||||
      if (r != VK_SUCCESS)
 | 
					      if (r != VK_SUCCESS)
 | 
				
			||||||
         goto fail;
 | 
					         goto fail;
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
@@ -667,12 +803,18 @@ VkResult anv_BindImageMemory2KHR(
 | 
				
			|||||||
   return VK_SUCCESS;
 | 
					   return VK_SUCCESS;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					void anv_GetImageSubresourceLayout(
 | 
				
			||||||
anv_surface_get_subresource_layout(struct anv_image *image,
 | 
					    VkDevice                                    device,
 | 
				
			||||||
                                   struct anv_surface *surface,
 | 
					    VkImage                                     _image,
 | 
				
			||||||
                                   const VkImageSubresource *subresource,
 | 
					    const VkImageSubresource*                   subresource,
 | 
				
			||||||
                                   VkSubresourceLayout *layout)
 | 
					    VkSubresourceLayout*                        layout)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					   ANV_FROM_HANDLE(anv_image, image, _image);
 | 
				
			||||||
 | 
					   const struct anv_surface *surface =
 | 
				
			||||||
 | 
					      get_surface(image, subresource->aspectMask);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   assert(__builtin_popcount(subresource->aspectMask) == 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   /* If we are on a non-zero mip level or array slice, we need to
 | 
					   /* If we are on a non-zero mip level or array slice, we need to
 | 
				
			||||||
    * calculate a real offset.
 | 
					    * calculate a real offset.
 | 
				
			||||||
    */
 | 
					    */
 | 
				
			||||||
@@ -681,25 +823,22 @@ anv_surface_get_subresource_layout(struct anv_image *image,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
   layout->offset = surface->offset;
 | 
					   layout->offset = surface->offset;
 | 
				
			||||||
   layout->rowPitch = surface->isl.row_pitch;
 | 
					   layout->rowPitch = surface->isl.row_pitch;
 | 
				
			||||||
   layout->depthPitch = isl_surf_get_array_pitch(&surface->isl);
 | 
					 | 
				
			||||||
   layout->arrayPitch = isl_surf_get_array_pitch(&surface->isl);
 | 
					 | 
				
			||||||
   layout->size = surface->isl.size;
 | 
					   layout->size = surface->isl.size;
 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
void anv_GetImageSubresourceLayout(
 | 
					   if (image->tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT &&
 | 
				
			||||||
    VkDevice                                    device,
 | 
					       image->drm_format_mod != DRM_FORMAT_MOD_LINEAR) {
 | 
				
			||||||
    VkImage                                     _image,
 | 
					      /* We currently support DRM format modifiers on tiled images only when
 | 
				
			||||||
    const VkImageSubresource*                   pSubresource,
 | 
					       * the image is "simple".
 | 
				
			||||||
    VkSubresourceLayout*                        pLayout)
 | 
					       */
 | 
				
			||||||
{
 | 
					      assert(image->levels == 1);
 | 
				
			||||||
   ANV_FROM_HANDLE(anv_image, image, _image);
 | 
					      assert(image->array_size == 1);
 | 
				
			||||||
 | 
					      assert(image->samples == 1);
 | 
				
			||||||
   assert(__builtin_popcount(pSubresource->aspectMask) == 1);
 | 
					      layout->depthPitch = 0;
 | 
				
			||||||
 | 
					      layout->arrayPitch = 0;
 | 
				
			||||||
   anv_surface_get_subresource_layout(image,
 | 
					   } else {
 | 
				
			||||||
                                      get_surface(image,
 | 
					      layout->depthPitch = isl_surf_get_array_pitch(&surface->isl);
 | 
				
			||||||
                                                  pSubresource->aspectMask),
 | 
					      layout->arrayPitch = isl_surf_get_array_pitch(&surface->isl);
 | 
				
			||||||
                                      pSubresource, pLayout);
 | 
					   }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@@ -751,7 +890,7 @@ anv_layout_to_aux_usage(const struct gen_device_info * const devinfo,
 | 
				
			|||||||
   /* The following switch currently only handles depth stencil aspects.
 | 
					   /* The following switch currently only handles depth stencil aspects.
 | 
				
			||||||
    * TODO: Handle the color aspect.
 | 
					    * TODO: Handle the color aspect.
 | 
				
			||||||
    */
 | 
					    */
 | 
				
			||||||
   if (image->aspects & VK_IMAGE_ASPECT_ANY_COLOR_BIT)
 | 
					   if (image->aspects & VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV)
 | 
				
			||||||
      return image->planes[plane].aux_usage;
 | 
					      return image->planes[plane].aux_usage;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   switch (layout) {
 | 
					   switch (layout) {
 | 
				
			||||||
@@ -786,7 +925,7 @@ anv_layout_to_aux_usage(const struct gen_device_info * const devinfo,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
   /* Sampling Layouts */
 | 
					   /* Sampling Layouts */
 | 
				
			||||||
   case VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL:
 | 
					   case VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL:
 | 
				
			||||||
      assert((image->aspects & VK_IMAGE_ASPECT_ANY_COLOR_BIT) == 0);
 | 
					      assert((image->aspects & VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV) == 0);
 | 
				
			||||||
      /* Fall-through */
 | 
					      /* Fall-through */
 | 
				
			||||||
   case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:
 | 
					   case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:
 | 
				
			||||||
   case VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL_KHR:
 | 
					   case VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL_KHR:
 | 
				
			||||||
@@ -1034,7 +1173,7 @@ anv_image_fill_surface_state(struct anv_device *device,
 | 
				
			|||||||
static VkImageAspectFlags
 | 
					static VkImageAspectFlags
 | 
				
			||||||
remap_aspect_flags(VkImageAspectFlags view_aspects)
 | 
					remap_aspect_flags(VkImageAspectFlags view_aspects)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
   if (view_aspects & VK_IMAGE_ASPECT_ANY_COLOR_BIT) {
 | 
					   if (view_aspects & VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV) {
 | 
				
			||||||
      if (_mesa_bitcount(view_aspects) == 1)
 | 
					      if (_mesa_bitcount(view_aspects) == 1)
 | 
				
			||||||
         return VK_IMAGE_ASPECT_COLOR_BIT;
 | 
					         return VK_IMAGE_ASPECT_COLOR_BIT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1394,15 +1533,15 @@ anv_image_get_surface_for_aspect_mask(const struct anv_image *image,
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
   case VK_IMAGE_ASPECT_PLANE_0_BIT_KHR:
 | 
					   case VK_IMAGE_ASPECT_PLANE_0_BIT_KHR:
 | 
				
			||||||
      assert((image->aspects & ~VK_IMAGE_ASPECT_ANY_COLOR_BIT) == 0);
 | 
					      assert((image->aspects & ~VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV) == 0);
 | 
				
			||||||
      sanitized_mask = VK_IMAGE_ASPECT_PLANE_0_BIT_KHR;
 | 
					      sanitized_mask = VK_IMAGE_ASPECT_PLANE_0_BIT_KHR;
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
   case VK_IMAGE_ASPECT_PLANE_1_BIT_KHR:
 | 
					   case VK_IMAGE_ASPECT_PLANE_1_BIT_KHR:
 | 
				
			||||||
      assert((image->aspects & ~VK_IMAGE_ASPECT_ANY_COLOR_BIT) == 0);
 | 
					      assert((image->aspects & ~VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV) == 0);
 | 
				
			||||||
      sanitized_mask = VK_IMAGE_ASPECT_PLANE_1_BIT_KHR;
 | 
					      sanitized_mask = VK_IMAGE_ASPECT_PLANE_1_BIT_KHR;
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
   case VK_IMAGE_ASPECT_PLANE_2_BIT_KHR:
 | 
					   case VK_IMAGE_ASPECT_PLANE_2_BIT_KHR:
 | 
				
			||||||
      assert((image->aspects & ~VK_IMAGE_ASPECT_ANY_COLOR_BIT) == 0);
 | 
					      assert((image->aspects & ~VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV) == 0);
 | 
				
			||||||
      sanitized_mask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
 | 
					      sanitized_mask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
   default:
 | 
					   default:
 | 
				
			||||||
@@ -1413,3 +1552,13 @@ anv_image_get_surface_for_aspect_mask(const struct anv_image *image,
 | 
				
			|||||||
   uint32_t plane = anv_image_aspect_to_plane(image->aspects, sanitized_mask);
 | 
					   uint32_t plane = anv_image_aspect_to_plane(image->aspects, sanitized_mask);
 | 
				
			||||||
   return &image->planes[plane].surface;
 | 
					   return &image->planes[plane].surface;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					VkResult
 | 
				
			||||||
 | 
					anv_GetImageDrmFormatModifierEXT(VkDevice device_h,
 | 
				
			||||||
 | 
					                                 VkImage image_h,
 | 
				
			||||||
 | 
					                                 uint64_t *pDrmFormatModifier)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					   ANV_FROM_HANDLE(anv_image, image, image_h);
 | 
				
			||||||
 | 
					   *pDrmFormatModifier = image->drm_format_mod;
 | 
				
			||||||
 | 
					   return VK_SUCCESS;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,117 +0,0 @@
 | 
				
			|||||||
/*
 | 
					 | 
				
			||||||
 * Copyright © 2015 Intel Corporation
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * Permission is hereby granted, free of charge, to any person obtaining a
 | 
					 | 
				
			||||||
 * copy of this software and associated documentation files (the "Software"),
 | 
					 | 
				
			||||||
 * to deal in the Software without restriction, including without limitation
 | 
					 | 
				
			||||||
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
					 | 
				
			||||||
 * and/or sell copies of the Software, and to permit persons to whom the
 | 
					 | 
				
			||||||
 * Software is furnished to do so, subject to the following conditions:
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * The above copyright notice and this permission notice (including the next
 | 
					 | 
				
			||||||
 * paragraph) shall be included in all copies or substantial portions of the
 | 
					 | 
				
			||||||
 * Software.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
					 | 
				
			||||||
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
					 | 
				
			||||||
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 | 
					 | 
				
			||||||
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
					 | 
				
			||||||
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 | 
					 | 
				
			||||||
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 | 
					 | 
				
			||||||
 * IN THE SOFTWARE.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <assert.h>
 | 
					 | 
				
			||||||
#include <stdbool.h>
 | 
					 | 
				
			||||||
#include <string.h>
 | 
					 | 
				
			||||||
#include <unistd.h>
 | 
					 | 
				
			||||||
#include <fcntl.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include "anv_private.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
VkResult anv_CreateDmaBufImageINTEL(
 | 
					 | 
				
			||||||
    VkDevice                                    _device,
 | 
					 | 
				
			||||||
    const VkDmaBufImageCreateInfo*              pCreateInfo,
 | 
					 | 
				
			||||||
    const VkAllocationCallbacks*                pAllocator,
 | 
					 | 
				
			||||||
    VkDeviceMemory*                             pMem,
 | 
					 | 
				
			||||||
    VkImage*                                    pImage)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
   ANV_FROM_HANDLE(anv_device, device, _device);
 | 
					 | 
				
			||||||
   struct anv_device_memory *mem;
 | 
					 | 
				
			||||||
   struct anv_image *image;
 | 
					 | 
				
			||||||
   VkResult result;
 | 
					 | 
				
			||||||
   VkImage image_h;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_DMA_BUF_IMAGE_CREATE_INFO_INTEL);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   mem = vk_alloc2(&device->alloc, pAllocator, sizeof(*mem), 8,
 | 
					 | 
				
			||||||
                    VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
 | 
					 | 
				
			||||||
   if (mem == NULL)
 | 
					 | 
				
			||||||
      return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   result = anv_image_create(_device,
 | 
					 | 
				
			||||||
      &(struct anv_image_create_info) {
 | 
					 | 
				
			||||||
         .isl_tiling_flags = ISL_TILING_X_BIT,
 | 
					 | 
				
			||||||
         .stride = pCreateInfo->strideInBytes,
 | 
					 | 
				
			||||||
         .vk_info =
 | 
					 | 
				
			||||||
      &(VkImageCreateInfo) {
 | 
					 | 
				
			||||||
         .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
 | 
					 | 
				
			||||||
         .imageType = VK_IMAGE_TYPE_2D,
 | 
					 | 
				
			||||||
         .format = pCreateInfo->format,
 | 
					 | 
				
			||||||
         .extent = pCreateInfo->extent,
 | 
					 | 
				
			||||||
         .mipLevels = 1,
 | 
					 | 
				
			||||||
         .arrayLayers = 1,
 | 
					 | 
				
			||||||
         .samples = 1,
 | 
					 | 
				
			||||||
         /* FIXME: Need a way to use X tiling to allow scanout */
 | 
					 | 
				
			||||||
         .tiling = VK_IMAGE_TILING_OPTIMAL,
 | 
					 | 
				
			||||||
         .usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
 | 
					 | 
				
			||||||
         .flags = 0,
 | 
					 | 
				
			||||||
      }},
 | 
					 | 
				
			||||||
      pAllocator, &image_h);
 | 
					 | 
				
			||||||
   if (result != VK_SUCCESS)
 | 
					 | 
				
			||||||
      goto fail;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   close(pCreateInfo->fd);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   image = anv_image_from_handle(image_h);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   result = anv_bo_cache_import(device, &device->bo_cache,
 | 
					 | 
				
			||||||
                                pCreateInfo->fd, &mem->bo);
 | 
					 | 
				
			||||||
   if (result != VK_SUCCESS)
 | 
					 | 
				
			||||||
      goto fail_import;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   VkDeviceSize aligned_image_size = align_u64(image->size, 4096);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   if (mem->bo->size < aligned_image_size) {
 | 
					 | 
				
			||||||
      result = vk_errorf(device->instance, device,
 | 
					 | 
				
			||||||
                         VK_ERROR_INVALID_EXTERNAL_HANDLE_KHR,
 | 
					 | 
				
			||||||
                         "dma-buf too small for image in "
 | 
					 | 
				
			||||||
                         "vkCreateDmaBufImageINTEL: %"PRIu64"B < "PRIu64"B",
 | 
					 | 
				
			||||||
                         mem->bo->size, aligned_image_size);
 | 
					 | 
				
			||||||
      anv_bo_cache_release(device, &device->bo_cache, mem->bo);
 | 
					 | 
				
			||||||
      goto fail_import;
 | 
					 | 
				
			||||||
   }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   if (device->instance->physicalDevice.supports_48bit_addresses)
 | 
					 | 
				
			||||||
      mem->bo->flags |= EXEC_OBJECT_SUPPORTS_48B_ADDRESS;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   image->planes[0].bo = mem->bo;
 | 
					 | 
				
			||||||
   image->planes[0].bo_offset = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   assert(image->extent.width > 0);
 | 
					 | 
				
			||||||
   assert(image->extent.height > 0);
 | 
					 | 
				
			||||||
   assert(image->extent.depth == 1);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   *pMem = anv_device_memory_to_handle(mem);
 | 
					 | 
				
			||||||
   *pImage = anv_image_to_handle(image);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   return VK_SUCCESS;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 fail_import:
 | 
					 | 
				
			||||||
   vk_free2(&device->alloc, pAllocator, image);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 fail:
 | 
					 | 
				
			||||||
   vk_free2(&device->alloc, pAllocator, mem);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   return result;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -67,7 +67,6 @@ struct anv_debug_report_callback;
 | 
				
			|||||||
struct gen_l3_config;
 | 
					struct gen_l3_config;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <vulkan/vulkan.h>
 | 
					#include <vulkan/vulkan.h>
 | 
				
			||||||
#include <vulkan/vulkan_intel.h>
 | 
					 | 
				
			||||||
#include <vulkan/vk_icd.h>
 | 
					#include <vulkan/vk_icd.h>
 | 
				
			||||||
#include <vulkan/vk_android_native_buffer.h>
 | 
					#include <vulkan/vk_android_native_buffer.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1552,12 +1551,12 @@ anv_pipe_invalidate_bits_for_access_flags(VkAccessFlags flags)
 | 
				
			|||||||
   return pipe_bits;
 | 
					   return pipe_bits;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define VK_IMAGE_ASPECT_ANY_COLOR_BIT (         \
 | 
					#define VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV (         \
 | 
				
			||||||
   VK_IMAGE_ASPECT_COLOR_BIT | \
 | 
					   VK_IMAGE_ASPECT_COLOR_BIT | \
 | 
				
			||||||
   VK_IMAGE_ASPECT_PLANE_0_BIT_KHR | \
 | 
					   VK_IMAGE_ASPECT_PLANE_0_BIT_KHR | \
 | 
				
			||||||
   VK_IMAGE_ASPECT_PLANE_1_BIT_KHR | \
 | 
					   VK_IMAGE_ASPECT_PLANE_1_BIT_KHR | \
 | 
				
			||||||
   VK_IMAGE_ASPECT_PLANE_2_BIT_KHR)
 | 
					   VK_IMAGE_ASPECT_PLANE_2_BIT_KHR)
 | 
				
			||||||
#define VK_IMAGE_ASPECT_PLANES_BITS ( \
 | 
					#define VK_IMAGE_ASPECT_PLANES_BITS_ANV ( \
 | 
				
			||||||
   VK_IMAGE_ASPECT_PLANE_0_BIT_KHR | \
 | 
					   VK_IMAGE_ASPECT_PLANE_0_BIT_KHR | \
 | 
				
			||||||
   VK_IMAGE_ASPECT_PLANE_1_BIT_KHR | \
 | 
					   VK_IMAGE_ASPECT_PLANE_1_BIT_KHR | \
 | 
				
			||||||
   VK_IMAGE_ASPECT_PLANE_2_BIT_KHR)
 | 
					   VK_IMAGE_ASPECT_PLANE_2_BIT_KHR)
 | 
				
			||||||
@@ -2253,7 +2252,7 @@ static inline VkImageAspectFlags
 | 
				
			|||||||
anv_plane_to_aspect(VkImageAspectFlags image_aspects,
 | 
					anv_plane_to_aspect(VkImageAspectFlags image_aspects,
 | 
				
			||||||
                    uint32_t plane)
 | 
					                    uint32_t plane)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
   if (image_aspects & VK_IMAGE_ASPECT_ANY_COLOR_BIT) {
 | 
					   if (image_aspects & VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV) {
 | 
				
			||||||
      if (_mesa_bitcount(image_aspects) > 1)
 | 
					      if (_mesa_bitcount(image_aspects) > 1)
 | 
				
			||||||
         return VK_IMAGE_ASPECT_PLANE_0_BIT_KHR << plane;
 | 
					         return VK_IMAGE_ASPECT_PLANE_0_BIT_KHR << plane;
 | 
				
			||||||
      return VK_IMAGE_ASPECT_COLOR_BIT;
 | 
					      return VK_IMAGE_ASPECT_COLOR_BIT;
 | 
				
			||||||
@@ -2280,7 +2279,7 @@ anv_get_format_planes(VkFormat vk_format)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
struct anv_format_plane
 | 
					struct anv_format_plane
 | 
				
			||||||
anv_get_format_plane(const struct gen_device_info *devinfo, VkFormat vk_format,
 | 
					anv_get_format_plane(const struct gen_device_info *devinfo, VkFormat vk_format,
 | 
				
			||||||
                     VkImageAspectFlags aspect, VkImageTiling tiling);
 | 
					                     VkImageAspectFlagBits aspect, VkImageTiling tiling);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline enum isl_format
 | 
					static inline enum isl_format
 | 
				
			||||||
anv_get_isl_format(const struct gen_device_info *devinfo, VkFormat vk_format,
 | 
					anv_get_isl_format(const struct gen_device_info *devinfo, VkFormat vk_format,
 | 
				
			||||||
@@ -2337,6 +2336,12 @@ struct anv_image {
 | 
				
			|||||||
   VkImageUsageFlags usage; /**< Superset of VkImageCreateInfo::usage. */
 | 
					   VkImageUsageFlags usage; /**< Superset of VkImageCreateInfo::usage. */
 | 
				
			||||||
   VkImageTiling tiling; /** VkImageCreateInfo::tiling */
 | 
					   VkImageTiling tiling; /** VkImageCreateInfo::tiling */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   /**
 | 
				
			||||||
 | 
					    * Must be DRM_FORMAT_MOD_INVALID unless tiling is
 | 
				
			||||||
 | 
					    * VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT.
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					   uint64_t drm_format_mod;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   VkDeviceSize size;
 | 
					   VkDeviceSize size;
 | 
				
			||||||
   uint32_t alignment;
 | 
					   uint32_t alignment;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -2547,7 +2552,7 @@ anv_image_expand_aspects(const struct anv_image *image,
 | 
				
			|||||||
   /* If the underlying image has color plane aspects and
 | 
					   /* If the underlying image has color plane aspects and
 | 
				
			||||||
    * VK_IMAGE_ASPECT_COLOR_BIT has been requested, then return the aspects of
 | 
					    * VK_IMAGE_ASPECT_COLOR_BIT has been requested, then return the aspects of
 | 
				
			||||||
    * the underlying image. */
 | 
					    * the underlying image. */
 | 
				
			||||||
   if ((image->aspects & VK_IMAGE_ASPECT_PLANES_BITS) != 0 &&
 | 
					   if ((image->aspects & VK_IMAGE_ASPECT_PLANES_BITS_ANV) != 0 &&
 | 
				
			||||||
       aspects == VK_IMAGE_ASPECT_COLOR_BIT)
 | 
					       aspects == VK_IMAGE_ASPECT_COLOR_BIT)
 | 
				
			||||||
      return image->aspects;
 | 
					      return image->aspects;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -2562,8 +2567,8 @@ anv_image_aspects_compatible(VkImageAspectFlags aspects1,
 | 
				
			|||||||
      return true;
 | 
					      return true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   /* Only 1 color aspects are compatibles. */
 | 
					   /* Only 1 color aspects are compatibles. */
 | 
				
			||||||
   if ((aspects1 & VK_IMAGE_ASPECT_ANY_COLOR_BIT) != 0 &&
 | 
					   if ((aspects1 & VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV) != 0 &&
 | 
				
			||||||
       (aspects2 & VK_IMAGE_ASPECT_ANY_COLOR_BIT) != 0 &&
 | 
					       (aspects2 & VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV) != 0 &&
 | 
				
			||||||
       _mesa_bitcount(aspects1) == _mesa_bitcount(aspects2))
 | 
					       _mesa_bitcount(aspects1) == _mesa_bitcount(aspects2))
 | 
				
			||||||
      return true;
 | 
					      return true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -439,7 +439,7 @@ get_fast_clear_state_address(const struct anv_device *device,
 | 
				
			|||||||
                             enum fast_clear_state_field field)
 | 
					                             enum fast_clear_state_field field)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
   assert(device && image);
 | 
					   assert(device && image);
 | 
				
			||||||
   assert(image->aspects & VK_IMAGE_ASPECT_ANY_COLOR_BIT);
 | 
					   assert(image->aspects & VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV);
 | 
				
			||||||
   assert(level < anv_image_aux_levels(image, aspect));
 | 
					   assert(level < anv_image_aux_levels(image, aspect));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   uint32_t plane = anv_image_aspect_to_plane(image->aspects, aspect);
 | 
					   uint32_t plane = anv_image_aspect_to_plane(image->aspects, aspect);
 | 
				
			||||||
@@ -478,7 +478,7 @@ genX(set_image_needs_resolve)(struct anv_cmd_buffer *cmd_buffer,
 | 
				
			|||||||
                        unsigned level, bool needs_resolve)
 | 
					                        unsigned level, bool needs_resolve)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
   assert(cmd_buffer && image);
 | 
					   assert(cmd_buffer && image);
 | 
				
			||||||
   assert(image->aspects & VK_IMAGE_ASPECT_ANY_COLOR_BIT);
 | 
					   assert(image->aspects & VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV);
 | 
				
			||||||
   assert(level < anv_image_aux_levels(image, aspect));
 | 
					   assert(level < anv_image_aux_levels(image, aspect));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   const struct anv_address resolve_flag_addr =
 | 
					   const struct anv_address resolve_flag_addr =
 | 
				
			||||||
@@ -502,7 +502,7 @@ genX(load_needs_resolve_predicate)(struct anv_cmd_buffer *cmd_buffer,
 | 
				
			|||||||
                                   unsigned level)
 | 
					                                   unsigned level)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
   assert(cmd_buffer && image);
 | 
					   assert(cmd_buffer && image);
 | 
				
			||||||
   assert(image->aspects & VK_IMAGE_ASPECT_ANY_COLOR_BIT);
 | 
					   assert(image->aspects & VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV);
 | 
				
			||||||
   assert(level < anv_image_aux_levels(image, aspect));
 | 
					   assert(level < anv_image_aux_levels(image, aspect));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   const struct anv_address resolve_flag_addr =
 | 
					   const struct anv_address resolve_flag_addr =
 | 
				
			||||||
@@ -531,7 +531,7 @@ init_fast_clear_state_entry(struct anv_cmd_buffer *cmd_buffer,
 | 
				
			|||||||
                            unsigned level)
 | 
					                            unsigned level)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
   assert(cmd_buffer && image);
 | 
					   assert(cmd_buffer && image);
 | 
				
			||||||
   assert(image->aspects & VK_IMAGE_ASPECT_ANY_COLOR_BIT);
 | 
					   assert(image->aspects & VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV);
 | 
				
			||||||
   assert(level < anv_image_aux_levels(image, aspect));
 | 
					   assert(level < anv_image_aux_levels(image, aspect));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   uint32_t plane = anv_image_aspect_to_plane(image->aspects, aspect);
 | 
					   uint32_t plane = anv_image_aspect_to_plane(image->aspects, aspect);
 | 
				
			||||||
@@ -601,7 +601,7 @@ genX(copy_fast_clear_dwords)(struct anv_cmd_buffer *cmd_buffer,
 | 
				
			|||||||
                             bool copy_from_surface_state)
 | 
					                             bool copy_from_surface_state)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
   assert(cmd_buffer && image);
 | 
					   assert(cmd_buffer && image);
 | 
				
			||||||
   assert(image->aspects & VK_IMAGE_ASPECT_ANY_COLOR_BIT);
 | 
					   assert(image->aspects & VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV);
 | 
				
			||||||
   assert(level < anv_image_aux_levels(image, aspect));
 | 
					   assert(level < anv_image_aux_levels(image, aspect));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   struct anv_bo *ss_bo =
 | 
					   struct anv_bo *ss_bo =
 | 
				
			||||||
@@ -658,7 +658,7 @@ transition_color_buffer(struct anv_cmd_buffer *cmd_buffer,
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
   /* Validate the inputs. */
 | 
					   /* Validate the inputs. */
 | 
				
			||||||
   assert(cmd_buffer);
 | 
					   assert(cmd_buffer);
 | 
				
			||||||
   assert(image && image->aspects & VK_IMAGE_ASPECT_ANY_COLOR_BIT);
 | 
					   assert(image && image->aspects & VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV);
 | 
				
			||||||
   /* These values aren't supported for simplicity's sake. */
 | 
					   /* These values aren't supported for simplicity's sake. */
 | 
				
			||||||
   assert(level_count != VK_REMAINING_MIP_LEVELS &&
 | 
					   assert(level_count != VK_REMAINING_MIP_LEVELS &&
 | 
				
			||||||
          layer_count != VK_REMAINING_ARRAY_LAYERS);
 | 
					          layer_count != VK_REMAINING_ARRAY_LAYERS);
 | 
				
			||||||
@@ -941,7 +941,7 @@ genX(cmd_buffer_setup_attachments)(struct anv_cmd_buffer *cmd_buffer,
 | 
				
			|||||||
         VkImageAspectFlags att_aspects = vk_format_aspects(att->format);
 | 
					         VkImageAspectFlags att_aspects = vk_format_aspects(att->format);
 | 
				
			||||||
         VkImageAspectFlags clear_aspects = 0;
 | 
					         VkImageAspectFlags clear_aspects = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
         if (att_aspects & VK_IMAGE_ASPECT_ANY_COLOR_BIT) {
 | 
					         if (att_aspects & VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV) {
 | 
				
			||||||
            /* color attachment */
 | 
					            /* color attachment */
 | 
				
			||||||
            if (att->load_op == VK_ATTACHMENT_LOAD_OP_CLEAR) {
 | 
					            if (att->load_op == VK_ATTACHMENT_LOAD_OP_CLEAR) {
 | 
				
			||||||
               clear_aspects |= VK_IMAGE_ASPECT_COLOR_BIT;
 | 
					               clear_aspects |= VK_IMAGE_ASPECT_COLOR_BIT;
 | 
				
			||||||
@@ -968,7 +968,7 @@ genX(cmd_buffer_setup_attachments)(struct anv_cmd_buffer *cmd_buffer,
 | 
				
			|||||||
         anv_assert(iview->n_planes == 1);
 | 
					         anv_assert(iview->n_planes == 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
         union isl_color_value clear_color = { .u32 = { 0, } };
 | 
					         union isl_color_value clear_color = { .u32 = { 0, } };
 | 
				
			||||||
         if (att_aspects & VK_IMAGE_ASPECT_ANY_COLOR_BIT) {
 | 
					         if (att_aspects & VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV) {
 | 
				
			||||||
            assert(att_aspects == VK_IMAGE_ASPECT_COLOR_BIT);
 | 
					            assert(att_aspects == VK_IMAGE_ASPECT_COLOR_BIT);
 | 
				
			||||||
            color_attachment_compute_aux_usage(cmd_buffer->device,
 | 
					            color_attachment_compute_aux_usage(cmd_buffer->device,
 | 
				
			||||||
                                               state, i, begin->renderArea,
 | 
					                                               state, i, begin->renderArea,
 | 
				
			||||||
@@ -1434,7 +1434,7 @@ void genX(CmdPipelineBarrier)(
 | 
				
			|||||||
         transition_depth_buffer(cmd_buffer, image,
 | 
					         transition_depth_buffer(cmd_buffer, image,
 | 
				
			||||||
                                 pImageMemoryBarriers[i].oldLayout,
 | 
					                                 pImageMemoryBarriers[i].oldLayout,
 | 
				
			||||||
                                 pImageMemoryBarriers[i].newLayout);
 | 
					                                 pImageMemoryBarriers[i].newLayout);
 | 
				
			||||||
      } else if (range->aspectMask & VK_IMAGE_ASPECT_ANY_COLOR_BIT) {
 | 
					      } else if (range->aspectMask & VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV) {
 | 
				
			||||||
         VkImageAspectFlags color_aspects =
 | 
					         VkImageAspectFlags color_aspects =
 | 
				
			||||||
            anv_image_expand_aspects(image, range->aspectMask);
 | 
					            anv_image_expand_aspects(image, range->aspectMask);
 | 
				
			||||||
         uint32_t aspect_bit;
 | 
					         uint32_t aspect_bit;
 | 
				
			||||||
@@ -1648,7 +1648,7 @@ emit_binding_table(struct anv_cmd_buffer *cmd_buffer,
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
      case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
 | 
					      case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
 | 
				
			||||||
         assert(stage == MESA_SHADER_FRAGMENT);
 | 
					         assert(stage == MESA_SHADER_FRAGMENT);
 | 
				
			||||||
         if ((desc->image_view->aspect_mask & VK_IMAGE_ASPECT_ANY_COLOR_BIT) == 0) {
 | 
					         if ((desc->image_view->aspect_mask & VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV) == 0) {
 | 
				
			||||||
            /* For depth and stencil input attachments, we treat it like any
 | 
					            /* For depth and stencil input attachments, we treat it like any
 | 
				
			||||||
             * old texture that a user may have bound.
 | 
					             * old texture that a user may have bound.
 | 
				
			||||||
             */
 | 
					             */
 | 
				
			||||||
@@ -2947,7 +2947,7 @@ cmd_buffer_subpass_transition_layouts(struct anv_cmd_buffer * const cmd_buffer,
 | 
				
			|||||||
            att_state->input_aux_usage != att_state->aux_usage;
 | 
					            att_state->input_aux_usage != att_state->aux_usage;
 | 
				
			||||||
      if (subpass_end) {
 | 
					      if (subpass_end) {
 | 
				
			||||||
         target_layout = att_desc->final_layout;
 | 
					         target_layout = att_desc->final_layout;
 | 
				
			||||||
      } else if (iview->aspect_mask & VK_IMAGE_ASPECT_ANY_COLOR_BIT &&
 | 
					      } else if (iview->aspect_mask & VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV &&
 | 
				
			||||||
                 !input_needs_resolve) {
 | 
					                 !input_needs_resolve) {
 | 
				
			||||||
         /* Layout transitions before the final only help to enable sampling as
 | 
					         /* Layout transitions before the final only help to enable sampling as
 | 
				
			||||||
          * an input attachment. If the input attachment supports sampling
 | 
					          * an input attachment. If the input attachment supports sampling
 | 
				
			||||||
@@ -2966,7 +2966,7 @@ cmd_buffer_subpass_transition_layouts(struct anv_cmd_buffer * const cmd_buffer,
 | 
				
			|||||||
         att_state->aux_usage =
 | 
					         att_state->aux_usage =
 | 
				
			||||||
            anv_layout_to_aux_usage(&cmd_buffer->device->info, image,
 | 
					            anv_layout_to_aux_usage(&cmd_buffer->device->info, image,
 | 
				
			||||||
                                    VK_IMAGE_ASPECT_DEPTH_BIT, target_layout);
 | 
					                                    VK_IMAGE_ASPECT_DEPTH_BIT, target_layout);
 | 
				
			||||||
      } else if (image->aspects & VK_IMAGE_ASPECT_ANY_COLOR_BIT) {
 | 
					      } else if (image->aspects & VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV) {
 | 
				
			||||||
         assert(image->aspects == VK_IMAGE_ASPECT_COLOR_BIT);
 | 
					         assert(image->aspects == VK_IMAGE_ASPECT_COLOR_BIT);
 | 
				
			||||||
         transition_color_buffer(cmd_buffer, image, VK_IMAGE_ASPECT_COLOR_BIT,
 | 
					         transition_color_buffer(cmd_buffer, image, VK_IMAGE_ASPECT_COLOR_BIT,
 | 
				
			||||||
                                 iview->planes[0].isl.base_level, 1,
 | 
					                                 iview->planes[0].isl.base_level, 1,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -95,7 +95,6 @@ libanv_files = files(
 | 
				
			|||||||
  'anv_formats.c',
 | 
					  'anv_formats.c',
 | 
				
			||||||
  'anv_genX.h',
 | 
					  'anv_genX.h',
 | 
				
			||||||
  'anv_image.c',
 | 
					  'anv_image.c',
 | 
				
			||||||
  'anv_intel.c',
 | 
					 | 
				
			||||||
  'anv_nir.h',
 | 
					  'anv_nir.h',
 | 
				
			||||||
  'anv_nir_apply_pipeline_layout.c',
 | 
					  'anv_nir_apply_pipeline_layout.c',
 | 
				
			||||||
  'anv_nir_lower_input_attachments.c',
 | 
					  'anv_nir_lower_input_attachments.c',
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -107,7 +107,7 @@ private version is maintained in the 1.0 branch of the member gitlab server.
 | 
				
			|||||||
        <type category="define">// Vulkan 1.0 version number
 | 
					        <type category="define">// Vulkan 1.0 version number
 | 
				
			||||||
#define <name>VK_API_VERSION_1_0</name> <type>VK_MAKE_VERSION</type>(1, 0, 0)// Patch version should always be set to 0</type>
 | 
					#define <name>VK_API_VERSION_1_0</name> <type>VK_MAKE_VERSION</type>(1, 0, 0)// Patch version should always be set to 0</type>
 | 
				
			||||||
        <type category="define">// Version of this file
 | 
					        <type category="define">// Version of this file
 | 
				
			||||||
#define <name>VK_HEADER_VERSION</name> 64</type>
 | 
					#define <name>VK_HEADER_VERSION</name> 65</type>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        <type category="define">
 | 
					        <type category="define">
 | 
				
			||||||
#define <name>VK_DEFINE_HANDLE</name>(object) typedef struct object##_T* object;</type>
 | 
					#define <name>VK_DEFINE_HANDLE</name>(object) typedef struct object##_T* object;</type>
 | 
				
			||||||
@@ -2646,6 +2646,35 @@ private version is maintained in the 1.0 branch of the member gitlab server.
 | 
				
			|||||||
            <member>const <type>void</type>*                    <name>pNext</name></member>             <!-- Pointer to next structure -->
 | 
					            <member>const <type>void</type>*                    <name>pNext</name></member>             <!-- Pointer to next structure -->
 | 
				
			||||||
            <member><type>VkQueueGlobalPriorityEXT</type>       <name>globalPriority</name></member>
 | 
					            <member><type>VkQueueGlobalPriorityEXT</type>       <name>globalPriority</name></member>
 | 
				
			||||||
        </type>
 | 
					        </type>
 | 
				
			||||||
 | 
					        <type category="struct" name="VkDrmFormatModifierPropertiesListEXT" returnedonly="true">
 | 
				
			||||||
 | 
					            <member values="VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT"><type>VkStructureType</type> <name>sType</name></member>
 | 
				
			||||||
 | 
					            <member><type>void</type>* <name>pNext</name></member>
 | 
				
			||||||
 | 
					            <member optional="true"><type>uint32_t</type> <name>drmFormatModifierCount</name></member>
 | 
				
			||||||
 | 
					            <member optional="true,false" len="drmFormatModifierCount"><type>VkDrmFormatModifierPropertiesEXT</type>* <name>pDrmFormatModifierProperties</name></member>
 | 
				
			||||||
 | 
					        </type>
 | 
				
			||||||
 | 
					        <type category="struct" name="VkDrmFormatModifierPropertiesEXT" returnedonly="true">
 | 
				
			||||||
 | 
					            <member><type>uint64_t</type> <name>drmFormatModifier</name></member>
 | 
				
			||||||
 | 
					            <member><type>uint32_t</type> <name>drmFormatModifierPlaneCount</name></member>
 | 
				
			||||||
 | 
					            <member><type>VkFormatFeatureFlags</type> <name>drmFormatModifierTilingFeatures</name></member>
 | 
				
			||||||
 | 
					        </type>
 | 
				
			||||||
 | 
					        <type category="struct" name="VkPhysicalDeviceImageDrmFormatModifierInfoEXT">
 | 
				
			||||||
 | 
					            <member values="VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT"><type>VkStructureType</type> <name>sType</name></member>
 | 
				
			||||||
 | 
					            <member>const <type>void</type>* <name>pNext</name></member>
 | 
				
			||||||
 | 
					            <member><type>uint64_t</type> <name>drmFormatModifier</name></member>
 | 
				
			||||||
 | 
					        </type>
 | 
				
			||||||
 | 
					        <type category="struct" name="VkImageDrmFormatModifierListCreateInfoEXT">
 | 
				
			||||||
 | 
					            <member values="VK_STRUCTURE_TYPE_FLEXIBLE_DRM_FORMAT_MODIFIER_LIST_IMAGE_CREATE_INFO_EXT"><type>VkStructureType</type> <name>sType</name></member>
 | 
				
			||||||
 | 
					            <member>const <type>void</type>* <name>pNext</name></member>
 | 
				
			||||||
 | 
					            <member><type>uint32_t</type> <name>drmFormatModifierCount</name></member>
 | 
				
			||||||
 | 
					            <member>const <type>uint64_t</type>* <name>pDrmFormatModifiers</name></member>
 | 
				
			||||||
 | 
					        </type>
 | 
				
			||||||
 | 
					        <type category="struct" name="VkImageExplicitDrmFormatModifierCreateInfoEXT">
 | 
				
			||||||
 | 
					            <member values="VK_STRUCTURE_TYPE_IMAGE_EXCPLICIT_DRM_FORMAT_MODIFIER_CREATE_INFO_EXT"><type>VkStructureType</type> <name>sType</name></member>
 | 
				
			||||||
 | 
					            <member>const <type>void</type>* <name>pNext</name></member>
 | 
				
			||||||
 | 
					            <member><type>uint64_t</type> <name>drmFormatModifier</name></member>
 | 
				
			||||||
 | 
					            <member optional="false"><type>uint32_t</type> <name>planeCount</name></member>
 | 
				
			||||||
 | 
					            <member len="planeCount"><type>VkSubresourceLayout</type>* <name>pPlaneLayouts</name></member>
 | 
				
			||||||
 | 
					        </type>
 | 
				
			||||||
    </types>
 | 
					    </types>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <comment>Vulkan enumerant (token) definitions</comment>
 | 
					    <comment>Vulkan enumerant (token) definitions</comment>
 | 
				
			||||||
@@ -2666,6 +2695,7 @@ private version is maintained in the 1.0 branch of the member gitlab server.
 | 
				
			|||||||
        <enum value="1"     name="VK_TRUE"/>
 | 
					        <enum value="1"     name="VK_TRUE"/>
 | 
				
			||||||
        <enum value="0"     name="VK_FALSE"/>
 | 
					        <enum value="0"     name="VK_FALSE"/>
 | 
				
			||||||
        <enum value="(~0U)" name="VK_QUEUE_FAMILY_IGNORED"/>
 | 
					        <enum value="(~0U)" name="VK_QUEUE_FAMILY_IGNORED"/>
 | 
				
			||||||
 | 
					        <enum value="(~0U-2)" name="VK_QUEUE_FAMILY_FOREIGN_EXT"/>
 | 
				
			||||||
        <enum value="(~0U-1)" name="VK_QUEUE_FAMILY_EXTERNAL_KHR"/>
 | 
					        <enum value="(~0U-1)" name="VK_QUEUE_FAMILY_EXTERNAL_KHR"/>
 | 
				
			||||||
        <enum value="(~0U)" name="VK_SUBPASS_EXTERNAL"/>
 | 
					        <enum value="(~0U)" name="VK_SUBPASS_EXTERNAL"/>
 | 
				
			||||||
        <enum value="32"    name="VK_MAX_DEVICE_GROUP_SIZE_KHX"/>
 | 
					        <enum value="32"    name="VK_MAX_DEVICE_GROUP_SIZE_KHX"/>
 | 
				
			||||||
@@ -5434,6 +5464,12 @@ private version is maintained in the 1.0 branch of the member gitlab server.
 | 
				
			|||||||
            <param optional="false,true"><type>size_t</type>* <name>pInfoSize</name></param>
 | 
					            <param optional="false,true"><type>size_t</type>* <name>pInfoSize</name></param>
 | 
				
			||||||
            <param optional="true" len="pInfoSize"><type>void</type>* <name>pInfo</name></param>
 | 
					            <param optional="true" len="pInfoSize"><type>void</type>* <name>pInfo</name></param>
 | 
				
			||||||
        </command>
 | 
					        </command>
 | 
				
			||||||
 | 
					        <command>
 | 
				
			||||||
 | 
					            <proto><type>VkResult</type> <name>vkGetImageDrmFormatModifierEXT</name></proto>
 | 
				
			||||||
 | 
					            <param><type>VkDevice</type> <name>device</name></param>
 | 
				
			||||||
 | 
					            <param><type>VkImage</type> <name>image</name></param>
 | 
				
			||||||
 | 
					            <param optional="false"><type>uint64_t</type>* <name>pDrmFormatModifier</name></param>
 | 
				
			||||||
 | 
					        </command>
 | 
				
			||||||
    </commands>
 | 
					    </commands>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <feature api="vulkan" name="VK_VERSION_1_0" number="1.0" comment="Vulkan core API interface definitions">
 | 
					    <feature api="vulkan" name="VK_VERSION_1_0" number="1.0" comment="Vulkan core API interface definitions">
 | 
				
			||||||
@@ -6940,16 +6976,18 @@ private version is maintained in the 1.0 branch of the member gitlab server.
 | 
				
			|||||||
                <enum value=""VK_MVK_moltenvk""               name="VK_MVK_MOLTENVK_EXTENSION_NAME"/>
 | 
					                <enum value=""VK_MVK_moltenvk""               name="VK_MVK_MOLTENVK_EXTENSION_NAME"/>
 | 
				
			||||||
            </require>
 | 
					            </require>
 | 
				
			||||||
        </extension>
 | 
					        </extension>
 | 
				
			||||||
        <extension name="VK_MESA_extension_126" number="126" author="MESA" contact="Chad Versace @chadversary" supported="disabled">
 | 
					        <extension name="VK_EXT_external_memory_dma_buf" number="126" type="device" requires="VK_KHR_external_memory_fd" author="EXT" contact="Chad Versace @chadversary" supported="vulkan">
 | 
				
			||||||
            <require>
 | 
					            <require>
 | 
				
			||||||
                <enum value="0"                                         name="VK_MESA_EXTENSION_126_SPEC_VERSION"/>
 | 
					                <enum value="1"                                                  name="VK_EXT_EXTERNAL_MEMORY_DMA_BUF_SPEC_VERSION"/>
 | 
				
			||||||
                <enum value=""VK_MESA_extension_126""         name="VK_MESA_EXTENSION_126_EXTENSION_NAME"/>
 | 
					                <enum value=""VK_EXT_external_memory_dma_buf""         name="VK_EXT_EXTERNAL_MEMORY_DMA_BUF_EXTENSION_NAME"/>
 | 
				
			||||||
 | 
					                <enum bitpos="7" extends="VkExternalMemoryHandleTypeFlagBitsKHR" name="VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT"/>
 | 
				
			||||||
            </require>
 | 
					            </require>
 | 
				
			||||||
        </extension>
 | 
					        </extension>
 | 
				
			||||||
        <extension name="VK_MESA_extension_127" number="127" author="MESA" contact="Chad Versace @chadversary" supported="disabled">
 | 
					        <extension name="VK_EXT_queue_family_foreign" number="127" type="device" author="EXT" requires="VK_KHR_external_memory" contact="Chad Versace @chadversary" supported="vulkan">
 | 
				
			||||||
            <require>
 | 
					            <require>
 | 
				
			||||||
                <enum value="0"                                         name="VK_MESA_EXTENSION_127_SPEC_VERSION"/>
 | 
					                <enum value="1"                                         name="VK_EXT_QUEUE_FAMILY_FOREIGN_SPEC_VERSION"/>
 | 
				
			||||||
                <enum value=""VK_MESA_extension_127""         name="VK_MESA_EXTENSION_127_EXTENSION_NAME"/>
 | 
					                <enum value=""VK_EXT_queue_family_foreign""   name="VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME"/>
 | 
				
			||||||
 | 
					                <enum                                                   name="VK_QUEUE_FAMILY_FOREIGN_EXT"/>
 | 
				
			||||||
            </require>
 | 
					            </require>
 | 
				
			||||||
        </extension>
 | 
					        </extension>
 | 
				
			||||||
        <extension name="VK_KHR_dedicated_allocation" number="128" type="device" author="KHR" requires="VK_KHR_get_memory_requirements2" contact="James Jones @cubanismo" supported="vulkan">
 | 
					        <extension name="VK_KHR_dedicated_allocation" number="128" type="device" author="KHR" requires="VK_KHR_get_memory_requirements2" contact="James Jones @cubanismo" supported="vulkan">
 | 
				
			||||||
@@ -7310,10 +7348,29 @@ private version is maintained in the 1.0 branch of the member gitlab server.
 | 
				
			|||||||
                <type name="VkBindImageMemoryInfoKHR"/>
 | 
					                <type name="VkBindImageMemoryInfoKHR"/>
 | 
				
			||||||
            </require>
 | 
					            </require>
 | 
				
			||||||
        </extension>
 | 
					        </extension>
 | 
				
			||||||
        <extension name="VK_EXT_extension_159" number="159" author="EXT" contact="Chad Versace @chadversary" supported="disabled">
 | 
					        <extension name="VK_EXT_image_drm_format_modifier" number="159" type="device" requires="VK_KHR_bind_memory2,VK_KHR_sampler_ycbcr_conversion" author="EXT" contact="Chad Versace @chadversary" supported="vulkan">
 | 
				
			||||||
            <require>
 | 
					            <require>
 | 
				
			||||||
                <enum value="0"                                          name="VK_EXT_EXTENSION_159_SPEC_VERSION"/>
 | 
					                <enum value="1" name="VK_EXT_IMAGE_DRM_FORMAT_MODIFIER_SPEC_VERSION"/>
 | 
				
			||||||
                <enum value=""VK_EXT_extension_159""           name="VK_EXT_EXTENSION_159_EXTENSION_NAME"/>
 | 
					                <enum value=""VK_EXT_image_drm_format_modifier"" name="VK_EXT_IMAGE_DRM_FORMAT_MODIFIER_EXTENSION_NAME"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                <enum offset="0" dir="-" extends="VkResult" name="VK_ERROR_INVALID_DRM_FORMAT_MODIFIER_PLANE_LAYOUT_EXT"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                <enum offset="0" extends="VkStructureType" name="VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT"/>
 | 
				
			||||||
 | 
					                <enum offset="1" extends="VkStructureType" name="VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT"/>
 | 
				
			||||||
 | 
					                <enum offset="2" extends="VkStructureType" name="VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT"/>
 | 
				
			||||||
 | 
					                <enum offset="3" extends="VkStructureType" name="VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT"/>
 | 
				
			||||||
 | 
					                <enum offset="4" extends="VkStructureType" name="VK_STRUCTURE_TYPE_IMAGE_EXCPLICIT_DRM_FORMAT_MODIFIER_CREATE_INFO_EXT"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                <enum offset="0" extends="VkImageTiling" name="VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT"/>
 | 
				
			||||||
 | 
					                <enum bitpos="7" extends="VkImageAspectFlagBits" name="VK_IMAGE_ASPECT_PLANE_3_BIT_EXT"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                <type name="VkDrmFormatModifierPropertiesListEXT"/>
 | 
				
			||||||
 | 
					                <type name="VkDrmFormatModifierPropertiesEXT"/>
 | 
				
			||||||
 | 
					                <type name="VkPhysicalDeviceImageDrmFormatModifierInfoEXT"/>
 | 
				
			||||||
 | 
					                <type name="VkImageDrmFormatModifierListCreateInfoEXT"/>
 | 
				
			||||||
 | 
					                <type name="VkImageExplicitDrmFormatModifierCreateInfoEXT"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                <command name="vkGetImageDrmFormatModifierEXT"/>
 | 
				
			||||||
            </require>
 | 
					            </require>
 | 
				
			||||||
        </extension>
 | 
					        </extension>
 | 
				
			||||||
        <extension name="VK_EXT_extension_160" number="160" author="EXT" contact="Mark Young @MarkY_LunarG" supported="disabled">
 | 
					        <extension name="VK_EXT_extension_160" number="160" author="EXT" contact="Mark Young @MarkY_LunarG" supported="disabled">
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user