Compare commits
30 Commits
18.1
...
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',
|
||||
)
|
||||
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_PATCH(version) ((uint32_t)(version) & 0xfff)
|
||||
// Version of this file
|
||||
#define VK_HEADER_VERSION 64
|
||||
#define VK_HEADER_VERSION 65
|
||||
|
||||
|
||||
#define VK_NULL_HANDLE 0
|
||||
@@ -147,6 +147,7 @@ typedef enum VkResult {
|
||||
VK_ERROR_INVALID_SHADER_NV = -1000012000,
|
||||
VK_ERROR_OUT_OF_POOL_MEMORY_KHR = -1000069000,
|
||||
VK_ERROR_INVALID_EXTERNAL_HANDLE_KHR = -1000072003,
|
||||
VK_ERROR_INVALID_DRM_FORMAT_MODIFIER_PLANE_LAYOUT_EXT = -1000158000,
|
||||
VK_ERROR_NOT_PERMITTED_EXT = -1000174001,
|
||||
VK_RESULT_BEGIN_RANGE = VK_ERROR_FRAGMENTED_POOL,
|
||||
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_BIND_BUFFER_MEMORY_INFO_KHR = 1000157000,
|
||||
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_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT = 1000160001,
|
||||
VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT = 1000174000,
|
||||
@@ -628,6 +634,7 @@ typedef enum VkImageType {
|
||||
typedef enum VkImageTiling {
|
||||
VK_IMAGE_TILING_OPTIMAL = 0,
|
||||
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_END_RANGE = VK_IMAGE_TILING_LINEAR,
|
||||
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_1_BIT_KHR = 0x00000020,
|
||||
VK_IMAGE_ASPECT_PLANE_2_BIT_KHR = 0x00000040,
|
||||
VK_IMAGE_ASPECT_PLANE_3_BIT_EXT = 0x00000080,
|
||||
VK_IMAGE_ASPECT_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
|
||||
} VkImageAspectFlagBits;
|
||||
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_D3D12_HEAP_BIT_KHR = 0x00000020,
|
||||
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
|
||||
} VkExternalMemoryHandleTypeFlagBitsKHR;
|
||||
typedef VkFlags VkExternalMemoryHandleTypeFlagsKHR;
|
||||
@@ -6616,6 +6625,17 @@ VKAPI_ATTR VkResult VKAPI_CALL vkCreateMacOSSurfaceMVK(
|
||||
#endif
|
||||
#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_SPEC_VERSION 1
|
||||
#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_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
|
||||
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;
|
||||
|
||||
#include <vulkan/vulkan.h>
|
||||
#include <vulkan/vulkan_intel.h>
|
||||
#include <vulkan/vk_icd.h>
|
||||
|
||||
#include "radv_entrypoints.h"
|
||||
|
@@ -215,7 +215,6 @@ VULKAN_FILES := \
|
||||
vulkan/anv_formats.c \
|
||||
vulkan/anv_genX.h \
|
||||
vulkan/anv_image.c \
|
||||
vulkan/anv_intel.c \
|
||||
vulkan/anv_nir.h \
|
||||
vulkan/anv_nir_apply_pipeline_layout.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/vulkan.h
|
||||
|
||||
vulkan_include_HEADERS = \
|
||||
$(top_srcdir)/include/vulkan/vulkan_intel.h
|
||||
|
||||
lib_LTLIBRARIES += vulkan/libvulkan_intel.la
|
||||
|
||||
check_LTLIBRARIES += vulkan/libvulkan-test.la
|
||||
|
@@ -11,3 +11,19 @@ Performance:
|
||||
- Pushing pieces of UBOs?
|
||||
- Enable guardband clipping
|
||||
- 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)
|
||||
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;
|
||||
get_blorp_surf_for_anv_image(image, pRanges[r].aspectMask,
|
||||
@@ -1068,7 +1068,7 @@ void anv_CmdClearAttachments(
|
||||
BLORP_BATCH_NO_EMIT_DEPTH_STENCIL);
|
||||
|
||||
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);
|
||||
clear_color_attachment(cmd_buffer, &batch,
|
||||
&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. */
|
||||
assert(level < anv_image_aux_levels(image, aspect));
|
||||
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. */
|
||||
uint32_t binding_table;
|
||||
|
@@ -1538,11 +1538,11 @@ VkResult anv_AllocateMemory(
|
||||
* ignored.
|
||||
*/
|
||||
if (fd_info && fd_info->handleType) {
|
||||
/* At the moment, we only support the OPAQUE_FD memory type which is
|
||||
* just a GEM buffer.
|
||||
*/
|
||||
/* At the moment, we support only the below handle types. */
|
||||
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,
|
||||
fd_info->fd, &mem->bo);
|
||||
@@ -1616,9 +1616,8 @@ VkResult anv_GetMemoryFdKHR(
|
||||
|
||||
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 == VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR ||
|
||||
pGetFdInfo->handleType == VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT);
|
||||
|
||||
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),
|
||||
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
|
||||
# per entry point.
|
||||
try:
|
||||
|
@@ -86,6 +86,9 @@ EXTENSIONS = [
|
||||
Extension('VK_KHR_xlib_surface', 6, 'VK_USE_PLATFORM_XLIB_KHR'),
|
||||
Extension('VK_KHX_multiview', 1, 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:
|
||||
|
@@ -21,6 +21,8 @@
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <drm_fourcc.h>
|
||||
|
||||
#include "anv_private.h"
|
||||
#include "vk_enum_to_str.h"
|
||||
#include "vk_format_info.h"
|
||||
@@ -409,32 +411,47 @@ anv_get_format(VkFormat vk_format)
|
||||
*/
|
||||
struct anv_format_plane
|
||||
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);
|
||||
struct anv_format_plane plane_format = {
|
||||
const struct anv_format_plane unsupported = {
|
||||
.isl_format = ISL_FORMAT_UNSUPPORTED,
|
||||
};
|
||||
|
||||
if (format == NULL)
|
||||
return plane_format;
|
||||
return unsupported;
|
||||
|
||||
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)
|
||||
return plane_format;
|
||||
return unsupported;
|
||||
|
||||
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) &
|
||||
(VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT));
|
||||
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 =
|
||||
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 &&
|
||||
!util_is_power_of_two(isl_layout->bpb)) {
|
||||
/* 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
|
||||
* 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.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
|
||||
|
||||
/**
|
||||
* Parameter drm_format_mod must be DRM_FORMAT_MOD_INVALID unless vk_tiling is
|
||||
* VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT.
|
||||
*/
|
||||
static VkFormatFeatureFlags
|
||||
get_image_format_properties(const struct gen_device_info *devinfo,
|
||||
enum isl_format base, struct anv_format_plane format)
|
||||
get_image_format_features(const struct gen_device_info *devinfo,
|
||||
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;
|
||||
|
||||
VkFormatFeatureFlags flags = 0;
|
||||
if (isl_format_supports_sampling(devinfo, format.isl_format)) {
|
||||
const VkImageAspectFlags aspects = vk_format_aspects(vk_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 |
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
* straight-up not to render to such a surface.
|
||||
*/
|
||||
if (isl_format_supports_rendering(devinfo, format.isl_format) &&
|
||||
format.swizzle.a == ISL_CHANNEL_SELECT_ALPHA) {
|
||||
if (isl_format_supports_rendering(devinfo, plane_format.isl_format) &&
|
||||
plane_format.swizzle.a == ISL_CHANNEL_SELECT_ALPHA) {
|
||||
flags |= VK_FORMAT_FEATURE_COLOR_ATTACHMENT_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;
|
||||
}
|
||||
|
||||
/* Load/store is determined based on base format. This prevents RGB
|
||||
* 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;
|
||||
|
||||
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;
|
||||
|
||||
if (flags) {
|
||||
@@ -509,125 +590,55 @@ get_image_format_properties(const struct gen_device_info *devinfo,
|
||||
VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR;
|
||||
}
|
||||
|
||||
return flags;
|
||||
}
|
||||
|
||||
static VkFormatFeatureFlags
|
||||
get_buffer_format_properties(const struct gen_device_info *devinfo,
|
||||
enum isl_format format)
|
||||
{
|
||||
if (format == ISL_FORMAT_UNSUPPORTED)
|
||||
return 0;
|
||||
|
||||
VkFormatFeatureFlags flags = 0;
|
||||
if (isl_format_supports_sampling(devinfo, format) &&
|
||||
!isl_format_is_compressed(format))
|
||||
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;
|
||||
/* 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 (vk_tiling == VK_IMAGE_TILING_OPTIMAL &&
|
||||
base_isl_format != ISL_FORMAT_UNSUPPORTED &&
|
||||
!util_is_power_of_two(isl_format_layouts[base_isl_format].bpb) &&
|
||||
isl_format_rgb_to_rgbx(base_isl_format) == ISL_FORMAT_UNSUPPORTED) {
|
||||
flags &= ~VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT;
|
||||
flags &= ~VK_FORMAT_FEATURE_BLIT_DST_BIT;
|
||||
}
|
||||
|
||||
if (format && format->can_ycbcr) {
|
||||
VkFormatFeatureFlags ycbcr_features = 0;
|
||||
if (anv_format->can_ycbcr) {
|
||||
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
|
||||
* 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
|
||||
* sampler. The failures show a slightly out of range values on the
|
||||
* 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 {
|
||||
ycbcr_features |= VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT_KHR |
|
||||
VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT_KHR |
|
||||
VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_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_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT_KHR;
|
||||
}
|
||||
|
||||
/* We can support cosited chroma locations when handle planes with our
|
||||
* own shader snippets.
|
||||
*/
|
||||
for (unsigned p = 0; p < format->n_planes; p++) {
|
||||
if (format->planes[p].denominator_scales[0] > 1 ||
|
||||
format->planes[p].denominator_scales[1] > 1) {
|
||||
ycbcr_features |= VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT_KHR;
|
||||
for (unsigned p = 0; p < anv_format->n_planes; p++) {
|
||||
if (anv_format->planes[p].denominator_scales[0] > 1 ||
|
||||
anv_format->planes[p].denominator_scales[1] > 1) {
|
||||
flags |= VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT_KHR;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (format->n_planes > 1)
|
||||
ycbcr_features |= VK_FORMAT_FEATURE_DISJOINT_BIT_KHR;
|
||||
|
||||
linear |= ycbcr_features;
|
||||
tiled |= ycbcr_features;
|
||||
if (anv_format->n_planes > 1)
|
||||
flags |= VK_FORMAT_FEATURE_DISJOINT_BIT_KHR;
|
||||
|
||||
const VkFormatFeatureFlags disallowed_ycbcr_image_features =
|
||||
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_STORAGE_IMAGE_BIT;
|
||||
|
||||
linear &= ~disallowed_ycbcr_image_features;
|
||||
tiled &= ~disallowed_ycbcr_image_features;
|
||||
buffer = 0;
|
||||
flags &= ~disallowed_ycbcr_image_features;
|
||||
}
|
||||
|
||||
out_properties->linearTilingFeatures = linear;
|
||||
out_properties->optimalTilingFeatures = tiled;
|
||||
out_properties->bufferFeatures = buffer;
|
||||
if (vk_tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT) {
|
||||
switch (drm_format_mod) {
|
||||
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(
|
||||
VkPhysicalDevice physicalDevice,
|
||||
VkFormat format,
|
||||
VkFormat vk_format,
|
||||
VkFormatProperties* pFormatProperties)
|
||||
{
|
||||
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(
|
||||
physical_device,
|
||||
format,
|
||||
pFormatProperties);
|
||||
*pFormatProperties = (VkFormatProperties) {
|
||||
.linearTilingFeatures =
|
||||
get_image_format_features(devinfo, vk_format, anv_format,
|
||||
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(
|
||||
VkPhysicalDevice physicalDevice,
|
||||
VkFormat format,
|
||||
VkFormat vk_format,
|
||||
VkFormatProperties2KHR* pFormatProperties)
|
||||
{
|
||||
anv_GetPhysicalDeviceFormatProperties(physicalDevice, format,
|
||||
ANV_FROM_HANDLE(anv_physical_device, physical_device, physicalDevice);
|
||||
|
||||
anv_GetPhysicalDeviceFormatProperties(physicalDevice, vk_format,
|
||||
&pFormatProperties->formatProperties);
|
||||
|
||||
vk_foreach_struct(ext, pFormatProperties->pNext) {
|
||||
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:
|
||||
anv_debug_ignored_stype(ext->sType);
|
||||
break;
|
||||
@@ -683,38 +813,48 @@ static VkResult
|
||||
anv_get_image_format_properties(
|
||||
struct anv_physical_device *physical_device,
|
||||
const VkPhysicalDeviceImageFormatInfo2KHR *info,
|
||||
const VkPhysicalDeviceImageDrmFormatModifierInfoEXT *drm_info,
|
||||
VkImageFormatProperties *pImageFormatProperties,
|
||||
VkSamplerYcbcrConversionImageFormatPropertiesKHR *pYcbcrImageFormatProperties)
|
||||
{
|
||||
VkFormatProperties format_props;
|
||||
VkFormatFeatureFlags format_feature_flags;
|
||||
VkExtent3D maxExtent;
|
||||
uint32_t maxMipLevels;
|
||||
uint32_t maxArraySize;
|
||||
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);
|
||||
|
||||
if (format == NULL)
|
||||
goto unsupported;
|
||||
|
||||
anv_physical_device_get_format_properties(physical_device, info->format,
|
||||
&format_props);
|
||||
|
||||
/* Extract the VkFormatFeatureFlags that are relevant for the queried
|
||||
* 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");
|
||||
uint64_t drm_format_mod = DRM_FORMAT_MOD_INVALID;
|
||||
if (drm_info) {
|
||||
assert(info->tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT);
|
||||
drm_format_mod = drm_info->drmFormatModifier;
|
||||
}
|
||||
|
||||
VkFormatFeatureFlags format_feature_flags =
|
||||
get_image_format_features(devinfo, info->format, format, info->tiling,
|
||||
drm_format_mod);
|
||||
|
||||
/* 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) {
|
||||
default:
|
||||
unreachable("bad VkImageType");
|
||||
case VK_IMAGE_TYPE_1D:
|
||||
/* We reject 1D images with modifiers due to FUD */
|
||||
if (drm_info)
|
||||
goto unsupported;
|
||||
|
||||
maxExtent.width = 16384;
|
||||
maxExtent.height = 1;
|
||||
maxExtent.depth = 1;
|
||||
@@ -729,10 +869,20 @@ anv_get_image_format_properties(
|
||||
maxExtent.width = 16384;
|
||||
maxExtent.height = 16384;
|
||||
maxExtent.depth = 1;
|
||||
maxMipLevels = 15; /* log2(maxWidth) + 1 */
|
||||
maxArraySize = 2048;
|
||||
|
||||
if (drm_info) {
|
||||
maxMipLevels = 1;
|
||||
maxArraySize = 1;
|
||||
} else {
|
||||
maxMipLevels = 15; /* log2(maxWidth) + 1 */
|
||||
maxArraySize = 2048;
|
||||
}
|
||||
break;
|
||||
case VK_IMAGE_TYPE_3D:
|
||||
/* We reject 3D images with modifiers due to FUD */
|
||||
if (drm_info)
|
||||
goto unsupported;
|
||||
|
||||
maxExtent.width = 2048;
|
||||
maxExtent.height = 2048;
|
||||
maxExtent.depth = 2048;
|
||||
@@ -857,11 +1007,11 @@ VkResult anv_GetPhysicalDeviceImageFormatProperties(
|
||||
.flags = createFlags,
|
||||
};
|
||||
|
||||
return anv_get_image_format_properties(physical_device, &info,
|
||||
return anv_get_image_format_properties(physical_device, &info, NULL,
|
||||
pImageFormatProperties, NULL);
|
||||
}
|
||||
|
||||
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. */
|
||||
.externalMemoryFeatures = VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_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,
|
||||
};
|
||||
|
||||
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(
|
||||
VkPhysicalDevice physicalDevice,
|
||||
const VkPhysicalDeviceImageFormatInfo2KHR* base_info,
|
||||
@@ -879,6 +1040,7 @@ VkResult anv_GetPhysicalDeviceImageFormatProperties2KHR(
|
||||
{
|
||||
ANV_FROM_HANDLE(anv_physical_device, physical_device, physicalDevice);
|
||||
const VkPhysicalDeviceExternalImageFormatInfoKHR *external_info = NULL;
|
||||
const VkPhysicalDeviceImageDrmFormatModifierInfoEXT *drm_info = NULL;
|
||||
VkExternalImageFormatPropertiesKHR *external_props = NULL;
|
||||
VkSamplerYcbcrConversionImageFormatPropertiesKHR *ycbcr_props = NULL;
|
||||
VkResult result;
|
||||
@@ -889,6 +1051,9 @@ VkResult anv_GetPhysicalDeviceImageFormatProperties2KHR(
|
||||
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO_KHR:
|
||||
external_info = (const void *) s;
|
||||
break;
|
||||
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT:
|
||||
drm_info = (const void *) s;
|
||||
break;
|
||||
default:
|
||||
anv_debug_ignored_stype(s->sType);
|
||||
break;
|
||||
@@ -911,7 +1076,7 @@ VkResult anv_GetPhysicalDeviceImageFormatProperties2KHR(
|
||||
}
|
||||
|
||||
result = anv_get_image_format_properties(physical_device, base_info,
|
||||
&base_props->imageFormatProperties, ycbcr_props);
|
||||
drm_info, &base_props->imageFormatProperties, ycbcr_props);
|
||||
if (result != VK_SUCCESS)
|
||||
goto fail;
|
||||
|
||||
@@ -925,7 +1090,10 @@ VkResult anv_GetPhysicalDeviceImageFormatProperties2KHR(
|
||||
switch (external_info->handleType) {
|
||||
case VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR:
|
||||
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;
|
||||
default:
|
||||
/* From the Vulkan 1.0.42 spec:
|
||||
@@ -1006,7 +1174,10 @@ void anv_GetPhysicalDeviceExternalBufferPropertiesKHR(
|
||||
|
||||
switch (pExternalBufferInfo->handleType) {
|
||||
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;
|
||||
default:
|
||||
goto unsupported;
|
||||
|
@@ -27,6 +27,7 @@
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/mman.h>
|
||||
#include <drm_fourcc.h>
|
||||
|
||||
#include "anv_private.h"
|
||||
#include "util/debug.h"
|
||||
@@ -34,15 +35,13 @@
|
||||
|
||||
#include "vk_format_info.h"
|
||||
|
||||
/**
|
||||
* Exactly one bit must be set in \a aspect.
|
||||
*/
|
||||
static isl_surf_usage_flags_t
|
||||
choose_isl_surf_usage(VkImageCreateFlags vk_create_flags,
|
||||
VkImageUsageFlags vk_usage,
|
||||
choose_isl_surf_usage(const VkImageCreateInfo *vk_info,
|
||||
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;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
if (vk_info->tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT)
|
||||
isl_usage |= ISL_SURF_USAGE_DISABLE_AUX_BIT;
|
||||
|
||||
return isl_usage;
|
||||
}
|
||||
|
||||
/**
|
||||
* Exactly one bit must be set in \a aspect.
|
||||
*/
|
||||
static isl_tiling_flags_t
|
||||
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 *
|
||||
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);
|
||||
return &image->planes[plane].surface;
|
||||
@@ -209,7 +239,7 @@ add_fast_clear_state_buffer(struct anv_image *image,
|
||||
{
|
||||
assert(image && device);
|
||||
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
|
||||
* 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
|
||||
* image's memory requirements (that is, the image's size and alignment).
|
||||
*
|
||||
* Exactly one bit must be set in \a aspect.
|
||||
*/
|
||||
static VkResult
|
||||
make_surface(const struct anv_device *dev,
|
||||
struct anv_image *image,
|
||||
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;
|
||||
bool ok UNUSED;
|
||||
@@ -271,18 +301,6 @@ make_surface(const struct anv_device *dev,
|
||||
[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,
|
||||
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);
|
||||
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 =
|
||||
choose_isl_surf_usage(vk_info->flags, image->usage,
|
||||
anv_info->isl_extra_usage_flags, aspect);
|
||||
choose_isl_surf_usage(vk_info, 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
|
||||
* 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,
|
||||
.samples = vk_info->samples,
|
||||
.min_alignment = 0,
|
||||
.row_pitch = anv_info->stride,
|
||||
.row_pitch = row_pitch,
|
||||
.usage = usage,
|
||||
.tiling_flags = tiling_flags);
|
||||
|
||||
/* isl_surf_init() will fail only if provided invalid input. Invalid input
|
||||
* is illegal in Vulkan.
|
||||
*/
|
||||
assert(ok);
|
||||
if (!ok) {
|
||||
/* isl_surf_init() fails only when provided invalid input. Invalid input
|
||||
* is illegal in Vulkan unless
|
||||
* 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;
|
||||
|
||||
add_surface(image, anv_surf, plane);
|
||||
|
||||
/* 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
|
||||
* 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);
|
||||
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 :
|
||||
*
|
||||
* 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(image->planes[plane].aux_surface.isl.size == 0);
|
||||
ok = isl_surf_get_mcs_surf(&dev->isl_dev,
|
||||
@@ -486,6 +563,38 @@ make_surface(const struct anv_device *dev,
|
||||
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
|
||||
anv_image_create(VkDevice _device,
|
||||
const struct anv_image_create_info *create_info,
|
||||
@@ -494,11 +603,31 @@ anv_image_create(VkDevice _device,
|
||||
{
|
||||
ANV_FROM_HANDLE(anv_device, device, _device);
|
||||
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;
|
||||
VkResult r;
|
||||
|
||||
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->arrayLayers > 0);
|
||||
anv_assert(pCreateInfo->samples > 0);
|
||||
@@ -523,14 +652,21 @@ anv_image_create(VkDevice _device,
|
||||
image->tiling = pCreateInfo->tiling;
|
||||
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);
|
||||
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;
|
||||
|
||||
uint32_t b;
|
||||
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)
|
||||
goto fail;
|
||||
}
|
||||
@@ -667,12 +803,18 @@ VkResult anv_BindImageMemory2KHR(
|
||||
return VK_SUCCESS;
|
||||
}
|
||||
|
||||
static void
|
||||
anv_surface_get_subresource_layout(struct anv_image *image,
|
||||
struct anv_surface *surface,
|
||||
const VkImageSubresource *subresource,
|
||||
VkSubresourceLayout *layout)
|
||||
void anv_GetImageSubresourceLayout(
|
||||
VkDevice device,
|
||||
VkImage _image,
|
||||
const VkImageSubresource* subresource,
|
||||
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
|
||||
* calculate a real offset.
|
||||
*/
|
||||
@@ -681,25 +823,22 @@ anv_surface_get_subresource_layout(struct anv_image *image,
|
||||
|
||||
layout->offset = surface->offset;
|
||||
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;
|
||||
}
|
||||
|
||||
void anv_GetImageSubresourceLayout(
|
||||
VkDevice device,
|
||||
VkImage _image,
|
||||
const VkImageSubresource* pSubresource,
|
||||
VkSubresourceLayout* pLayout)
|
||||
{
|
||||
ANV_FROM_HANDLE(anv_image, image, _image);
|
||||
|
||||
assert(__builtin_popcount(pSubresource->aspectMask) == 1);
|
||||
|
||||
anv_surface_get_subresource_layout(image,
|
||||
get_surface(image,
|
||||
pSubresource->aspectMask),
|
||||
pSubresource, pLayout);
|
||||
if (image->tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT &&
|
||||
image->drm_format_mod != DRM_FORMAT_MOD_LINEAR) {
|
||||
/* We currently support DRM format modifiers on tiled images only when
|
||||
* the image is "simple".
|
||||
*/
|
||||
assert(image->levels == 1);
|
||||
assert(image->array_size == 1);
|
||||
assert(image->samples == 1);
|
||||
layout->depthPitch = 0;
|
||||
layout->arrayPitch = 0;
|
||||
} else {
|
||||
layout->depthPitch = isl_surf_get_array_pitch(&surface->isl);
|
||||
layout->arrayPitch = isl_surf_get_array_pitch(&surface->isl);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -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.
|
||||
* 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;
|
||||
|
||||
switch (layout) {
|
||||
@@ -786,7 +925,7 @@ anv_layout_to_aux_usage(const struct gen_device_info * const devinfo,
|
||||
|
||||
/* Sampling Layouts */
|
||||
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 */
|
||||
case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:
|
||||
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
|
||||
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)
|
||||
return VK_IMAGE_ASPECT_COLOR_BIT;
|
||||
|
||||
@@ -1394,15 +1533,15 @@ anv_image_get_surface_for_aspect_mask(const struct anv_image *image,
|
||||
}
|
||||
break;
|
||||
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;
|
||||
break;
|
||||
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;
|
||||
break;
|
||||
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;
|
||||
break;
|
||||
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);
|
||||
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;
|
||||
|
||||
#include <vulkan/vulkan.h>
|
||||
#include <vulkan/vulkan_intel.h>
|
||||
#include <vulkan/vk_icd.h>
|
||||
#include <vulkan/vk_android_native_buffer.h>
|
||||
|
||||
@@ -1552,12 +1551,12 @@ anv_pipe_invalidate_bits_for_access_flags(VkAccessFlags flags)
|
||||
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_PLANE_0_BIT_KHR | \
|
||||
VK_IMAGE_ASPECT_PLANE_1_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_1_BIT_KHR | \
|
||||
VK_IMAGE_ASPECT_PLANE_2_BIT_KHR)
|
||||
@@ -2253,7 +2252,7 @@ static inline VkImageAspectFlags
|
||||
anv_plane_to_aspect(VkImageAspectFlags image_aspects,
|
||||
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)
|
||||
return VK_IMAGE_ASPECT_PLANE_0_BIT_KHR << plane;
|
||||
return VK_IMAGE_ASPECT_COLOR_BIT;
|
||||
@@ -2280,7 +2279,7 @@ anv_get_format_planes(VkFormat vk_format)
|
||||
|
||||
struct anv_format_plane
|
||||
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
|
||||
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. */
|
||||
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;
|
||||
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
|
||||
* VK_IMAGE_ASPECT_COLOR_BIT has been requested, then return the aspects of
|
||||
* 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)
|
||||
return image->aspects;
|
||||
|
||||
@@ -2562,8 +2567,8 @@ anv_image_aspects_compatible(VkImageAspectFlags aspects1,
|
||||
return true;
|
||||
|
||||
/* Only 1 color aspects are compatibles. */
|
||||
if ((aspects1 & VK_IMAGE_ASPECT_ANY_COLOR_BIT) != 0 &&
|
||||
(aspects2 & VK_IMAGE_ASPECT_ANY_COLOR_BIT) != 0 &&
|
||||
if ((aspects1 & VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV) != 0 &&
|
||||
(aspects2 & VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV) != 0 &&
|
||||
_mesa_bitcount(aspects1) == _mesa_bitcount(aspects2))
|
||||
return true;
|
||||
|
||||
|
@@ -439,7 +439,7 @@ get_fast_clear_state_address(const struct anv_device *device,
|
||||
enum fast_clear_state_field field)
|
||||
{
|
||||
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));
|
||||
|
||||
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)
|
||||
{
|
||||
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));
|
||||
|
||||
const struct anv_address resolve_flag_addr =
|
||||
@@ -502,7 +502,7 @@ genX(load_needs_resolve_predicate)(struct anv_cmd_buffer *cmd_buffer,
|
||||
unsigned level)
|
||||
{
|
||||
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));
|
||||
|
||||
const struct anv_address resolve_flag_addr =
|
||||
@@ -531,7 +531,7 @@ init_fast_clear_state_entry(struct anv_cmd_buffer *cmd_buffer,
|
||||
unsigned level)
|
||||
{
|
||||
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));
|
||||
|
||||
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)
|
||||
{
|
||||
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));
|
||||
|
||||
struct anv_bo *ss_bo =
|
||||
@@ -658,7 +658,7 @@ transition_color_buffer(struct anv_cmd_buffer *cmd_buffer,
|
||||
{
|
||||
/* Validate the inputs. */
|
||||
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. */
|
||||
assert(level_count != VK_REMAINING_MIP_LEVELS &&
|
||||
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 clear_aspects = 0;
|
||||
|
||||
if (att_aspects & VK_IMAGE_ASPECT_ANY_COLOR_BIT) {
|
||||
if (att_aspects & VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV) {
|
||||
/* color attachment */
|
||||
if (att->load_op == VK_ATTACHMENT_LOAD_OP_CLEAR) {
|
||||
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);
|
||||
|
||||
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);
|
||||
color_attachment_compute_aux_usage(cmd_buffer->device,
|
||||
state, i, begin->renderArea,
|
||||
@@ -1434,7 +1434,7 @@ void genX(CmdPipelineBarrier)(
|
||||
transition_depth_buffer(cmd_buffer, image,
|
||||
pImageMemoryBarriers[i].oldLayout,
|
||||
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 =
|
||||
anv_image_expand_aspects(image, range->aspectMask);
|
||||
uint32_t aspect_bit;
|
||||
@@ -1648,7 +1648,7 @@ emit_binding_table(struct anv_cmd_buffer *cmd_buffer,
|
||||
}
|
||||
case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
|
||||
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
|
||||
* 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;
|
||||
if (subpass_end) {
|
||||
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) {
|
||||
/* Layout transitions before the final only help to enable sampling as
|
||||
* 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 =
|
||||
anv_layout_to_aux_usage(&cmd_buffer->device->info, image,
|
||||
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);
|
||||
transition_color_buffer(cmd_buffer, image, VK_IMAGE_ASPECT_COLOR_BIT,
|
||||
iview->planes[0].isl.base_level, 1,
|
||||
|
@@ -95,7 +95,6 @@ libanv_files = files(
|
||||
'anv_formats.c',
|
||||
'anv_genX.h',
|
||||
'anv_image.c',
|
||||
'anv_intel.c',
|
||||
'anv_nir.h',
|
||||
'anv_nir_apply_pipeline_layout.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
|
||||
#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
|
||||
#define <name>VK_HEADER_VERSION</name> 64</type>
|
||||
#define <name>VK_HEADER_VERSION</name> 65</type>
|
||||
|
||||
<type category="define">
|
||||
#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><type>VkQueueGlobalPriorityEXT</type> <name>globalPriority</name></member>
|
||||
</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>
|
||||
|
||||
<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="0" name="VK_FALSE"/>
|
||||
<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)" name="VK_SUBPASS_EXTERNAL"/>
|
||||
<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="true" len="pInfoSize"><type>void</type>* <name>pInfo</name></param>
|
||||
</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>
|
||||
|
||||
<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"/>
|
||||
</require>
|
||||
</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>
|
||||
<enum value="0" name="VK_MESA_EXTENSION_126_SPEC_VERSION"/>
|
||||
<enum value=""VK_MESA_extension_126"" name="VK_MESA_EXTENSION_126_EXTENSION_NAME"/>
|
||||
<enum value="1" name="VK_EXT_EXTERNAL_MEMORY_DMA_BUF_SPEC_VERSION"/>
|
||||
<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>
|
||||
</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>
|
||||
<enum value="0" name="VK_MESA_EXTENSION_127_SPEC_VERSION"/>
|
||||
<enum value=""VK_MESA_extension_127"" name="VK_MESA_EXTENSION_127_EXTENSION_NAME"/>
|
||||
<enum value="1" name="VK_EXT_QUEUE_FAMILY_FOREIGN_SPEC_VERSION"/>
|
||||
<enum value=""VK_EXT_queue_family_foreign"" name="VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME"/>
|
||||
<enum name="VK_QUEUE_FAMILY_FOREIGN_EXT"/>
|
||||
</require>
|
||||
</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">
|
||||
@@ -7310,10 +7348,29 @@ private version is maintained in the 1.0 branch of the member gitlab server.
|
||||
<type name="VkBindImageMemoryInfoKHR"/>
|
||||
</require>
|
||||
</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>
|
||||
<enum value="0" name="VK_EXT_EXTENSION_159_SPEC_VERSION"/>
|
||||
<enum value=""VK_EXT_extension_159"" name="VK_EXT_EXTENSION_159_EXTENSION_NAME"/>
|
||||
<enum value="1" name="VK_EXT_IMAGE_DRM_FORMAT_MODIFIER_SPEC_VERSION"/>
|
||||
<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>
|
||||
</extension>
|
||||
<extension name="VK_EXT_extension_160" number="160" author="EXT" contact="Mark Young @MarkY_LunarG" supported="disabled">
|
||||
|
Reference in New Issue
Block a user