radv: get rid of bunch of KHR suffixes
[mesa.git] / src / amd / vulkan / radv_device.c
index 73c48cef1f07065bda80bc2c83f2cef49b08f629..2619feab86fbb03e6fb02d7cfd2b2f2071b20685 100644 (file)
 #include "ac_llvm_util.h"
 #include "vk_format.h"
 #include "sid.h"
+#include "git_sha1.h"
 #include "gfx9d.h"
-#include "addrlib/gfx9/chip/gfx9_enum.h"
+#include "util/build_id.h"
 #include "util/debug.h"
+#include "util/mesa-sha1.h"
 
 static int
 radv_device_get_cache_uuid(enum radeon_family family, void *uuid)
 {
-       uint32_t mesa_timestamp, llvm_timestamp;
-       uint16_t f = family;
+       struct mesa_sha1 ctx;
+       unsigned char sha1[20];
+       unsigned ptr_size = sizeof(void*);
+
        memset(uuid, 0, VK_UUID_SIZE);
-       if (!disk_cache_get_function_timestamp(radv_device_get_cache_uuid, &mesa_timestamp) ||
-           !disk_cache_get_function_timestamp(LLVMInitializeAMDGPUTargetInfo, &llvm_timestamp))
+       _mesa_sha1_init(&ctx);
+
+       if (!disk_cache_get_function_identifier(radv_device_get_cache_uuid, &ctx) ||
+           !disk_cache_get_function_identifier(LLVMInitializeAMDGPUTargetInfo, &ctx))
                return -1;
 
-       memcpy(uuid, &mesa_timestamp, 4);
-       memcpy((char*)uuid + 4, &llvm_timestamp, 4);
-       memcpy((char*)uuid + 8, &f, 2);
-       snprintf((char*)uuid + 10, VK_UUID_SIZE - 10, "radv");
+       _mesa_sha1_update(&ctx, &family, sizeof(family));
+       _mesa_sha1_update(&ctx, &ptr_size, sizeof(ptr_size));
+       _mesa_sha1_final(&ctx, sha1);
+
+       memcpy(uuid, sha1, VK_UUID_SIZE);
        return 0;
 }
 
@@ -105,6 +112,7 @@ radv_get_device_name(enum radeon_family family, char *name, size_t name_len)
        case CHIP_VEGA10: chip_string = "AMD RADV VEGA10"; break;
        case CHIP_VEGA12: chip_string = "AMD RADV VEGA12"; break;
        case CHIP_RAVEN: chip_string = "AMD RADV RAVEN"; break;
+       case CHIP_RAVEN2: chip_string = "AMD RADV RAVEN2"; break;
        default: chip_string = "AMD RADV unknown"; break;
        }
 
@@ -248,8 +256,6 @@ radv_physical_device_init(struct radv_physical_device *device,
 
        if (strcmp(version->name, "amdgpu")) {
                drmFreeVersion(version);
-               if (master_fd != -1)
-                       close(master_fd);
                close(fd);
 
                if (instance->debug_flags & RADV_DEBUG_STARTUP)
@@ -264,8 +270,6 @@ radv_physical_device_init(struct radv_physical_device *device,
 
        device->_loader_data.loaderMagic = ICD_LOADER_MAGIC;
        device->instance = instance;
-       assert(strlen(path) < ARRAY_SIZE(device->path));
-       strncpy(device->path, path, ARRAY_SIZE(device->path));
 
        device->ws = radv_amdgpu_winsys_create(fd, instance->debug_flags,
                                               instance->perftest_flags);
@@ -330,7 +334,8 @@ radv_physical_device_init(struct radv_physical_device *device,
                device->has_rbplus = true;
                device->rbplus_allowed = device->rad_info.family == CHIP_STONEY ||
                                         device->rad_info.family == CHIP_VEGA12 ||
-                                        device->rad_info.family == CHIP_RAVEN;
+                                        device->rad_info.family == CHIP_RAVEN ||
+                                        device->rad_info.family == CHIP_RAVEN2;
        }
 
        /* The mere presence of CLEAR_STATE in the IB causes random GPU hangs
@@ -356,6 +361,15 @@ radv_physical_device_init(struct radv_physical_device *device,
        radv_physical_device_init_mem_types(device);
        radv_fill_device_extension_table(device, &device->supported_extensions);
 
+       device->bus_info = *drm_device->businfo.pci;
+
+       if ((device->instance->debug_flags & RADV_DEBUG_INFO))
+               ac_print_gpu_info(&device->rad_info);
+
+       /* The WSI is structured as a layer on top of the driver, so this has
+        * to be the last part of initialization (at least until we get other
+        * semi-layers).
+        */
        result = radv_init_wsi(device);
        if (result != VK_SUCCESS) {
                device->ws->destroy(device->ws);
@@ -363,9 +377,6 @@ radv_physical_device_init(struct radv_physical_device *device,
                goto fail;
        }
 
-       if ((device->instance->debug_flags & RADV_DEBUG_INFO))
-               ac_print_gpu_info(&device->rad_info);
-
        return VK_SUCCESS;
 
 fail:
@@ -437,6 +448,7 @@ static const struct debug_control radv_debug_options[] = {
        {"startup", RADV_DEBUG_STARTUP},
        {"checkir", RADV_DEBUG_CHECKIR},
        {"nothreadllvm", RADV_DEBUG_NOTHREADLLVM},
+       {"nobinning", RADV_DEBUG_NOBINNING},
        {NULL, 0}
 };
 
@@ -451,7 +463,6 @@ static const struct debug_control radv_perftest_options[] = {
        {"nobatchchain", RADV_PERFTEST_NO_BATCHCHAIN},
        {"sisched", RADV_PERFTEST_SISCHED},
        {"localbos", RADV_PERFTEST_LOCAL_BOS},
-       {"binning", RADV_PERFTEST_BINNING},
        {"dccmsaa", RADV_PERFTEST_DCC_MSAA},
        {NULL, 0}
 };
@@ -459,7 +470,7 @@ static const struct debug_control radv_perftest_options[] = {
 const char *
 radv_get_perftest_option_name(int id)
 {
-       assert(id < ARRAY_SIZE(radv_debug_options) - 1);
+       assert(id < ARRAY_SIZE(radv_perftest_options) - 1);
        return radv_perftest_options[id].string;
 }
 
@@ -480,6 +491,9 @@ radv_handle_per_app_options(struct radv_instance *instance,
                         */
                        instance->perftest_flags |= RADV_PERFTEST_SISCHED;
                }
+       } else if (!strcmp(name, "DOOM_VFR")) {
+               /* Work around a Doom VFR game bug */
+               instance->debug_flags |= RADV_DEBUG_NO_DYNAMIC_BOUNDS;
        }
 }
 
@@ -685,6 +699,7 @@ void radv_GetPhysicalDeviceFeatures(
        VkPhysicalDevice                            physicalDevice,
        VkPhysicalDeviceFeatures*                   pFeatures)
 {
+       RADV_FROM_HANDLE(radv_physical_device, pdevice, physicalDevice);
        memset(pFeatures, 0, sizeof(*pFeatures));
 
        *pFeatures = (VkPhysicalDeviceFeatures) {
@@ -708,7 +723,8 @@ void radv_GetPhysicalDeviceFeatures(
                .alphaToOne                               = true,
                .multiViewport                            = true,
                .samplerAnisotropy                        = true,
-               .textureCompressionETC2                   = false,
+               .textureCompressionETC2                   = pdevice->rad_info.chip_class >= GFX9 ||
+                                                           pdevice->rad_info.family == CHIP_STONEY,
                .textureCompressionASTC_LDR               = false,
                .textureCompressionBC                     = true,
                .occlusionQueryPrecise                    = true,
@@ -718,7 +734,7 @@ void radv_GetPhysicalDeviceFeatures(
                .shaderTessellationAndGeometryPointSize   = true,
                .shaderImageGatherExtended                = true,
                .shaderStorageImageExtendedFormats        = true,
-               .shaderStorageImageMultisample            = false,
+               .shaderStorageImageMultisample            = pdevice->rad_info.chip_class >= VI,
                .shaderUniformBufferArrayDynamicIndexing  = true,
                .shaderSampledImageArrayDynamicIndexing   = true,
                .shaderStorageBufferArrayDynamicIndexing  = true,
@@ -729,7 +745,7 @@ void radv_GetPhysicalDeviceFeatures(
                .shaderCullDistance                       = true,
                .shaderFloat64                            = true,
                .shaderInt64                              = true,
-               .shaderInt16                              = false,
+               .shaderInt16                              = pdevice->rad_info.chip_class >= GFX9,
                .sparseBinding                            = true,
                .variableMultisampleRate                  = true,
                .inheritedQueries                         = true,
@@ -738,18 +754,19 @@ void radv_GetPhysicalDeviceFeatures(
 
 void radv_GetPhysicalDeviceFeatures2(
        VkPhysicalDevice                            physicalDevice,
-       VkPhysicalDeviceFeatures2KHR               *pFeatures)
+       VkPhysicalDeviceFeatures2                  *pFeatures)
 {
+       RADV_FROM_HANDLE(radv_physical_device, pdevice, physicalDevice);
        vk_foreach_struct(ext, pFeatures->pNext) {
                switch (ext->sType) {
-               case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES_KHR: {
-                       VkPhysicalDeviceVariablePointerFeaturesKHR *features = (void *)ext;
+               case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES: {
+                       VkPhysicalDeviceVariablePointerFeatures *features = (void *)ext;
                        features->variablePointersStorageBuffer = true;
                        features->variablePointers = false;
                        break;
                }
-               case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES_KHR: {
-                       VkPhysicalDeviceMultiviewFeaturesKHR *features = (VkPhysicalDeviceMultiviewFeaturesKHR*)ext;
+               case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES: {
+                       VkPhysicalDeviceMultiviewFeatures *features = (VkPhysicalDeviceMultiviewFeatures*)ext;
                        features->multiview = true;
                        features->multiviewGeometryShader = true;
                        features->multiviewTessellationShader = true;
@@ -770,10 +787,11 @@ void radv_GetPhysicalDeviceFeatures2(
                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES: {
                        VkPhysicalDevice16BitStorageFeatures *features =
                            (VkPhysicalDevice16BitStorageFeatures*)ext;
-                       features->storageBuffer16BitAccess = false;
-                       features->uniformAndStorageBuffer16BitAccess = false;
-                       features->storagePushConstant16 = false;
-                       features->storageInputOutput16 = false;
+                       bool enabled = pdevice->rad_info.chip_class >= VI;
+                       features->storageBuffer16BitAccess = enabled;
+                       features->uniformAndStorageBuffer16BitAccess = enabled;
+                       features->storagePushConstant16 = enabled;
+                       features->storageInputOutput16 = enabled;
                        break;
                }
                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES: {
@@ -807,6 +825,33 @@ void radv_GetPhysicalDeviceFeatures2(
                        features->runtimeDescriptorArray = true;
                        break;
                }
+               case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT: {
+                       VkPhysicalDeviceConditionalRenderingFeaturesEXT *features =
+                               (VkPhysicalDeviceConditionalRenderingFeaturesEXT*)ext;
+                       features->conditionalRendering = true;
+                       features->inheritedConditionalRendering = false;
+                       break;
+               }
+               case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT: {
+                       VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT *features =
+                               (VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT *)ext;
+                       features->vertexAttributeInstanceRateDivisor = VK_TRUE;
+                       features->vertexAttributeInstanceRateZeroDivisor = VK_TRUE;
+                       break;
+               }
+               case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT: {
+                       VkPhysicalDeviceTransformFeedbackFeaturesEXT *features =
+                               (VkPhysicalDeviceTransformFeedbackFeaturesEXT*)ext;
+                       features->transformFeedback = true;
+                       features->geometryStreams = true;
+                       break;
+               }
+               case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES_EXT: {
+                       VkPhysicalDeviceScalarBlockLayoutFeaturesEXT *features =
+                               (VkPhysicalDeviceScalarBlockLayoutFeaturesEXT *)ext;
+                       features->scalarBlockLayout = pdevice->rad_info.chip_class >= CIK;
+                       break;
+               }
                default:
                        break;
                }
@@ -894,9 +939,9 @@ void radv_GetPhysicalDeviceProperties(
                        2048,
                        2048
                },
-               .subPixelPrecisionBits                    = 4 /* FIXME */,
-               .subTexelPrecisionBits                    = 4 /* FIXME */,
-               .mipmapPrecisionBits                      = 4 /* FIXME */,
+               .subPixelPrecisionBits                    = 8,
+               .subTexelPrecisionBits                    = 8,
+               .mipmapPrecisionBits                      = 8,
                .maxDrawIndexedIndexValue                 = UINT32_MAX,
                .maxDrawIndirectCount                     = UINT32_MAX,
                .maxSamplerLodBias                        = 16,
@@ -928,14 +973,14 @@ void radv_GetPhysicalDeviceProperties(
                .sampledImageIntegerSampleCounts          = VK_SAMPLE_COUNT_1_BIT,
                .sampledImageDepthSampleCounts            = sample_counts,
                .sampledImageStencilSampleCounts          = sample_counts,
-               .storageImageSampleCounts                 = VK_SAMPLE_COUNT_1_BIT,
+               .storageImageSampleCounts                 = pdevice->rad_info.chip_class >= VI ? sample_counts : VK_SAMPLE_COUNT_1_BIT,
                .maxSampleMaskWords                       = 1,
                .timestampComputeAndGraphics              = true,
                .timestampPeriod                          = 1000000.0 / pdevice->rad_info.clock_crystal_freq,
                .maxClipDistances                         = 8,
                .maxCullDistances                         = 8,
                .maxCombinedClipAndCullDistances          = 8,
-               .discreteQueuePriorities                  = 1,
+               .discreteQueuePriorities                  = 2,
                .pointSizeRange                           = { 0.125, 255.875 },
                .lineWidthRange                           = { 0.0, 7.9921875 },
                .pointSizeGranularity                     = (1.0 / 8.0),
@@ -963,7 +1008,7 @@ void radv_GetPhysicalDeviceProperties(
 
 void radv_GetPhysicalDeviceProperties2(
        VkPhysicalDevice                            physicalDevice,
-       VkPhysicalDeviceProperties2KHR             *pProperties)
+       VkPhysicalDeviceProperties2                *pProperties)
 {
        RADV_FROM_HANDLE(radv_physical_device, pdevice, physicalDevice);
        radv_GetPhysicalDeviceProperties(physicalDevice, &pProperties->properties);
@@ -976,23 +1021,23 @@ void radv_GetPhysicalDeviceProperties2(
                        properties->maxPushDescriptors = MAX_PUSH_DESCRIPTORS;
                        break;
                }
-               case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES_KHR: {
-                       VkPhysicalDeviceIDPropertiesKHR *properties = (VkPhysicalDeviceIDPropertiesKHR*)ext;
+               case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES: {
+                       VkPhysicalDeviceIDProperties *properties = (VkPhysicalDeviceIDProperties*)ext;
                        memcpy(properties->driverUUID, pdevice->driver_uuid, VK_UUID_SIZE);
                        memcpy(properties->deviceUUID, pdevice->device_uuid, VK_UUID_SIZE);
                        properties->deviceLUIDValid = false;
                        break;
                }
-               case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES_KHR: {
-                       VkPhysicalDeviceMultiviewPropertiesKHR *properties = (VkPhysicalDeviceMultiviewPropertiesKHR*)ext;
+               case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES: {
+                       VkPhysicalDeviceMultiviewProperties *properties = (VkPhysicalDeviceMultiviewProperties*)ext;
                        properties->maxMultiviewViewCount = MAX_VIEWS;
                        properties->maxMultiviewInstanceIndex = INT_MAX;
                        break;
                }
-               case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES_KHR: {
-                       VkPhysicalDevicePointClippingPropertiesKHR *properties =
-                           (VkPhysicalDevicePointClippingPropertiesKHR*)ext;
-                       properties->pointClippingBehavior = VK_POINT_CLIPPING_BEHAVIOR_ALL_CLIP_PLANES_KHR;
+               case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES: {
+                       VkPhysicalDevicePointClippingProperties *properties =
+                           (VkPhysicalDevicePointClippingProperties*)ext;
+                       properties->pointClippingBehavior = VK_POINT_CLIPPING_BEHAVIOR_ALL_CLIP_PLANES;
                        break;
                }
                case  VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT: {
@@ -1019,6 +1064,7 @@ void radv_GetPhysicalDeviceProperties2(
                                                        VK_SUBGROUP_FEATURE_VOTE_BIT;
                        if (pdevice->rad_info.chip_class >= VI) {
                                properties->supportedOperations |=
+                                                       VK_SUBGROUP_FEATURE_ARITHMETIC_BIT |
                                                        VK_SUBGROUP_FEATURE_SHUFFLE_BIT |
                                                        VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT;
                        }
@@ -1053,9 +1099,7 @@ void radv_GetPhysicalDeviceProperties2(
                        properties->shaderArraysPerEngineCount =
                                pdevice->rad_info.max_sh_per_se;
                        properties->computeUnitsPerShaderArray =
-                               pdevice->rad_info.num_good_compute_units /
-                                       (pdevice->rad_info.max_se *
-                                        pdevice->rad_info.max_sh_per_se);
+                               pdevice->rad_info.num_good_cu_per_sh;
                        properties->simdPerComputeUnit = 4;
                        properties->wavefrontsPerSimd =
                                pdevice->rad_info.family == CHIP_TONGA ||
@@ -1125,6 +1169,73 @@ void radv_GetPhysicalDeviceProperties2(
                        properties->maxDescriptorSetUpdateAfterBindInputAttachments = max_descriptor_set_size;
                        break;
                }
+               case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES: {
+                       VkPhysicalDeviceProtectedMemoryProperties *properties =
+                               (VkPhysicalDeviceProtectedMemoryProperties *)ext;
+                       properties->protectedNoFault = false;
+                       break;
+               }
+               case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT: {
+                       VkPhysicalDeviceConservativeRasterizationPropertiesEXT *properties =
+                               (VkPhysicalDeviceConservativeRasterizationPropertiesEXT *)ext;
+                       properties->primitiveOverestimationSize = 0;
+                       properties->maxExtraPrimitiveOverestimationSize = 0;
+                       properties->extraPrimitiveOverestimationSizeGranularity = 0;
+                       properties->primitiveUnderestimation = VK_FALSE;
+                       properties->conservativePointAndLineRasterization = VK_FALSE;
+                       properties->degenerateTrianglesRasterized = VK_FALSE;
+                       properties->degenerateLinesRasterized = VK_FALSE;
+                       properties->fullyCoveredFragmentShaderInputVariable = VK_FALSE;
+                       properties->conservativeRasterizationPostDepthCoverage = VK_FALSE;
+                       break;
+               }
+               case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT: {
+                       VkPhysicalDevicePCIBusInfoPropertiesEXT *properties =
+                               (VkPhysicalDevicePCIBusInfoPropertiesEXT *)ext;
+                       properties->pciDomain = pdevice->bus_info.domain;
+                       properties->pciBus = pdevice->bus_info.bus;
+                       properties->pciDevice = pdevice->bus_info.dev;
+                       properties->pciFunction = pdevice->bus_info.func;
+                       break;
+               }
+               case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES_KHR: {
+                       VkPhysicalDeviceDriverPropertiesKHR *driver_props =
+                               (VkPhysicalDeviceDriverPropertiesKHR *) ext;
+
+                       driver_props->driverID = VK_DRIVER_ID_MESA_RADV_KHR;
+                       memset(driver_props->driverName, 0, VK_MAX_DRIVER_NAME_SIZE_KHR);
+                       strcpy(driver_props->driverName, "radv");
+
+                       memset(driver_props->driverInfo, 0, VK_MAX_DRIVER_INFO_SIZE_KHR);
+                       snprintf(driver_props->driverInfo, VK_MAX_DRIVER_INFO_SIZE_KHR,
+                               "Mesa " PACKAGE_VERSION MESA_GIT_SHA1
+                               " (LLVM %d.%d.%d)",
+                                (HAVE_LLVM >> 8) & 0xff, HAVE_LLVM & 0xff,
+                                MESA_LLVM_VERSION_PATCH);
+
+                       driver_props->conformanceVersion = (VkConformanceVersionKHR) {
+                               .major = 1,
+                               .minor = 1,
+                               .subminor = 2,
+                               .patch = 0,
+                       };
+                       break;
+               }
+               case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT: {
+                       VkPhysicalDeviceTransformFeedbackPropertiesEXT *properties =
+                               (VkPhysicalDeviceTransformFeedbackPropertiesEXT *)ext;
+                       properties->maxTransformFeedbackStreams = MAX_SO_STREAMS;
+                       properties->maxTransformFeedbackBuffers = MAX_SO_BUFFERS;
+                       properties->maxTransformFeedbackBufferSize = UINT32_MAX;
+                       properties->maxTransformFeedbackStreamDataSize = 512;
+                       properties->maxTransformFeedbackBufferDataSize = UINT32_MAX;
+                       properties->maxTransformFeedbackBufferDataStride = 512;
+                       properties->transformFeedbackQueries = true;
+                       properties->transformFeedbackStreamsLinesTriangles = false;
+                       properties->transformFeedbackRasterizationStreamSelect = false;
+                       properties->transformFeedbackDraw = true;
+                       break;
+               }
                default:
                        break;
                }
@@ -1203,7 +1314,7 @@ void radv_GetPhysicalDeviceQueueFamilyProperties(
 void radv_GetPhysicalDeviceQueueFamilyProperties2(
        VkPhysicalDevice                            physicalDevice,
        uint32_t*                                   pCount,
-       VkQueueFamilyProperties2KHR                *pQueueFamilyProperties)
+       VkQueueFamilyProperties2                   *pQueueFamilyProperties)
 {
        RADV_FROM_HANDLE(radv_physical_device, pdevice, physicalDevice);
        if (!pQueueFamilyProperties) {
@@ -1230,7 +1341,7 @@ void radv_GetPhysicalDeviceMemoryProperties(
 
 void radv_GetPhysicalDeviceMemoryProperties2(
        VkPhysicalDevice                            physicalDevice,
-       VkPhysicalDeviceMemoryProperties2KHR       *pMemoryProperties)
+       VkPhysicalDeviceMemoryProperties2          *pMemoryProperties)
 {
        return radv_GetPhysicalDeviceMemoryProperties(physicalDevice,
                                                      &pMemoryProperties->memoryProperties);
@@ -1238,7 +1349,7 @@ void radv_GetPhysicalDeviceMemoryProperties2(
 
 VkResult radv_GetMemoryHostPointerPropertiesEXT(
        VkDevice                                    _device,
-       VkExternalMemoryHandleTypeFlagBitsKHR       handleType,
+       VkExternalMemoryHandleTypeFlagBits          handleType,
        const void                                 *pHostPointer,
        VkMemoryHostPointerPropertiesEXT           *pMemoryHostPointerProperties)
 {
@@ -1259,7 +1370,7 @@ VkResult radv_GetMemoryHostPointerPropertiesEXT(
                return VK_SUCCESS;
        }
        default:
-               return VK_ERROR_INVALID_EXTERNAL_HANDLE_KHR;
+               return VK_ERROR_INVALID_EXTERNAL_HANDLE;
        }
 }
 
@@ -1408,6 +1519,28 @@ static int radv_get_device_extension_index(const char *name)
        return -1;
 }
 
+static int
+radv_get_int_debug_option(const char *name, int default_value)
+{
+       const char *str;
+       int result;
+
+       str = getenv(name);
+       if (!str) {
+               result = default_value;
+       } else {
+               char *endptr;
+
+               result = strtol(str, &endptr, 0);
+               if (str == endptr) {
+                       /* No digits founs. */
+                       result = default_value;
+               }
+       }
+
+       return result;
+}
+
 VkResult radv_CreateDevice(
        VkPhysicalDevice                            physicalDevice,
        const VkDeviceCreateInfo*                   pCreateInfo,
@@ -1502,10 +1635,12 @@ VkResult radv_CreateDevice(
        }
 
        device->pbb_allowed = device->physical_device->rad_info.chip_class >= GFX9 &&
-                             (device->instance->perftest_flags & RADV_PERFTEST_BINNING);
+                             !(device->instance->debug_flags & RADV_DEBUG_NOBINNING);
 
        /* Disabled and not implemented for now. */
-       device->dfsm_allowed = device->pbb_allowed && false;
+       device->dfsm_allowed = device->pbb_allowed &&
+                              (device->physical_device->rad_info.family == CHIP_RAVEN ||
+                               device->physical_device->rad_info.family == CHIP_RAVEN2);
 
 #ifdef ANDROID
        device->always_use_syncobj = device->physical_device->rad_info.has_syncobj_wait_for_submit;
@@ -1552,6 +1687,10 @@ VkResult radv_CreateDevice(
                if (!radv_init_trace(device))
                        goto fail;
 
+               fprintf(stderr, "*****************************************************************************\n");
+               fprintf(stderr, "* WARNING: RADV_TRACE_FILE is costly and should only be used for debugging! *\n");
+               fprintf(stderr, "*****************************************************************************\n");
+
                fprintf(stderr, "Trace file will be dumped to %s\n", filename);
                radv_dump_enabled_options(device, stderr);
        }
@@ -1597,6 +1736,13 @@ VkResult radv_CreateDevice(
 
        device->mem_cache = radv_pipeline_cache_from_handle(pc);
 
+       device->force_aniso =
+               MIN2(16, radv_get_int_debug_option("RADV_TEX_ANISO", -1));
+       if (device->force_aniso >= 0) {
+               fprintf(stderr, "radv: Forcing anisotropy filter to %ix\n",
+                       1 << util_logbase2(device->force_aniso));
+       }
+
        *pDevice = radv_device_to_handle(device);
        return VK_SUCCESS;
 
@@ -1875,20 +2021,39 @@ radv_get_hs_offchip_param(struct radv_device *device, uint32_t *max_offchip_buff
                device->physical_device->rad_info.family != CHIP_CARRIZO &&
                device->physical_device->rad_info.family != CHIP_STONEY;
        unsigned max_offchip_buffers_per_se = double_offchip_buffers ? 128 : 64;
-       unsigned max_offchip_buffers = max_offchip_buffers_per_se *
-               device->physical_device->rad_info.max_se;
+       unsigned max_offchip_buffers;
        unsigned offchip_granularity;
        unsigned hs_offchip_param;
-       switch (device->tess_offchip_block_dw_size) {
-       default:
-               assert(0);
-               /* fall through */
-       case 8192:
-               offchip_granularity = V_03093C_X_8K_DWORDS;
-               break;
-       case 4096:
+
+       /*
+        * Per RadeonSI:
+        * This must be one less than the maximum number due to a hw limitation.
+         * Various hardware bugs in SI, CIK, and GFX9 need this.
+        *
+        * Per AMDVLK:
+        * Vega10 should limit max_offchip_buffers to 508 (4 * 127).
+        * Gfx7 should limit max_offchip_buffers to 508
+        * Gfx6 should limit max_offchip_buffers to 126 (2 * 63)
+        *
+        * Follow AMDVLK here.
+        */
+       if (device->physical_device->rad_info.family == CHIP_VEGA10 ||
+           device->physical_device->rad_info.chip_class == CIK ||
+           device->physical_device->rad_info.chip_class == SI)
+               --max_offchip_buffers_per_se;
+
+       max_offchip_buffers = max_offchip_buffers_per_se *
+               device->physical_device->rad_info.max_se;
+
+       /* Hawaii has a bug with offchip buffers > 256 that can be worked
+        * around by setting 4K granularity.
+        */
+       if (device->tess_offchip_block_dw_size == 4096) {
+               assert(device->physical_device->rad_info.family == CHIP_HAWAII);
                offchip_granularity = V_03093C_X_4K_DWORDS;
-               break;
+       } else {
+               assert(device->tess_offchip_block_dw_size == 8192);
+               offchip_granularity = V_03093C_X_8K_DWORDS;
        }
 
        switch (device->physical_device->rad_info.chip_class) {
@@ -1928,10 +2093,10 @@ radv_emit_gs_ring_sizes(struct radv_queue *queue, struct radeon_cmdbuf *cs,
                return;
 
        if (esgs_ring_bo)
-               radv_cs_add_buffer(queue->device->ws, cs, esgs_ring_bo, 8);
+               radv_cs_add_buffer(queue->device->ws, cs, esgs_ring_bo);
 
        if (gsvs_ring_bo)
-               radv_cs_add_buffer(queue->device->ws, cs, gsvs_ring_bo, 8);
+               radv_cs_add_buffer(queue->device->ws, cs, gsvs_ring_bo);
 
        if (queue->device->physical_device->rad_info.chip_class >= CIK) {
                radeon_set_uconfig_reg_seq(cs, R_030900_VGT_ESGS_RING_SIZE, 2);
@@ -1956,7 +2121,7 @@ radv_emit_tess_factor_ring(struct radv_queue *queue, struct radeon_cmdbuf *cs,
 
        tf_va = radv_buffer_get_va(tess_rings_bo);
 
-       radv_cs_add_buffer(queue->device->ws, cs, tess_rings_bo, 8);
+       radv_cs_add_buffer(queue->device->ws, cs, tess_rings_bo);
 
        if (queue->device->physical_device->rad_info.chip_class >= CIK) {
                radeon_set_uconfig_reg(cs, R_030938_VGT_TF_RING_SIZE,
@@ -1990,7 +2155,7 @@ radv_emit_compute_scratch(struct radv_queue *queue, struct radeon_cmdbuf *cs,
 
        scratch_va = radv_buffer_get_va(compute_scratch_bo);
 
-       radv_cs_add_buffer(queue->device->ws, cs, compute_scratch_bo, 8);
+       radv_cs_add_buffer(queue->device->ws, cs, compute_scratch_bo);
 
        radeon_set_sh_reg_seq(cs, R_00B900_COMPUTE_USER_DATA_0, 2);
        radeon_emit(cs, scratch_va);
@@ -2010,7 +2175,7 @@ radv_emit_global_shader_pointers(struct radv_queue *queue,
 
        va = radv_buffer_get_va(descriptor_bo);
 
-       radv_cs_add_buffer(queue->device->ws, cs, descriptor_bo, 8);
+       radv_cs_add_buffer(queue->device->ws, cs, descriptor_bo);
 
        if (queue->device->physical_device->rad_info.chip_class >= GFX9) {
                uint32_t regs[] = {R_00B030_SPI_SHADER_USER_DATA_PS_0,
@@ -2037,6 +2202,33 @@ radv_emit_global_shader_pointers(struct radv_queue *queue,
        }
 }
 
+static void
+radv_init_graphics_state(struct radeon_cmdbuf *cs, struct radv_queue *queue)
+{
+       struct radv_device *device = queue->device;
+
+       if (device->gfx_init) {
+               uint64_t va = radv_buffer_get_va(device->gfx_init);
+
+               radeon_emit(cs, PKT3(PKT3_INDIRECT_BUFFER_CIK, 2, 0));
+               radeon_emit(cs, va);
+               radeon_emit(cs, va >> 32);
+               radeon_emit(cs, device->gfx_init_size_dw & 0xffff);
+
+               radv_cs_add_buffer(device->ws, cs, device->gfx_init);
+       } else {
+               struct radv_physical_device *physical_device = device->physical_device;
+               si_emit_graphics(physical_device, cs);
+       }
+}
+
+static void
+radv_init_compute_state(struct radeon_cmdbuf *cs, struct radv_queue *queue)
+{
+       struct radv_physical_device *physical_device = queue->device->physical_device;
+       si_emit_compute(physical_device, cs);
+}
+
 static VkResult
 radv_get_preamble_cs(struct radv_queue *queue,
                      uint32_t scratch_size,
@@ -2189,7 +2381,19 @@ radv_get_preamble_cs(struct radv_queue *queue,
                dest_cs[i] = cs;
 
                if (scratch_bo)
-                       radv_cs_add_buffer(queue->device->ws, cs, scratch_bo, 8);
+                       radv_cs_add_buffer(queue->device->ws, cs, scratch_bo);
+
+               /* Emit initial configuration. */
+               switch (queue->queue_family_index) {
+               case RADV_QUEUE_GENERAL:
+                       radv_init_graphics_state(cs, queue);
+                       break;
+               case RADV_QUEUE_COMPUTE:
+                       radv_init_compute_state(cs, queue);
+                       break;
+               case RADV_QUEUE_TRANSFER:
+                       break;
+               }
 
                if (descriptor_bo != queue->descriptor_bo) {
                        uint32_t *map = (uint32_t*)queue->device->ws->buffer_map(descriptor_bo);
@@ -2240,7 +2444,7 @@ radv_get_preamble_cs(struct radv_queue *queue,
                                               RADV_CMD_FLAG_INV_SMEM_L1 |
                                               RADV_CMD_FLAG_INV_VMEM_L1 |
                                               RADV_CMD_FLAG_INV_GLOBAL_L2 |
-                                              RADV_CMD_FLAG_START_PIPELINE_STATS);
+                                              RADV_CMD_FLAG_START_PIPELINE_STATS, 0);
                } else if (i == 1) {
                        si_cs_emit_cache_flush(cs,
                                               queue->device->physical_device->rad_info.chip_class,
@@ -2251,7 +2455,7 @@ radv_get_preamble_cs(struct radv_queue *queue,
                                               RADV_CMD_FLAG_INV_SMEM_L1 |
                                               RADV_CMD_FLAG_INV_VMEM_L1 |
                                               RADV_CMD_FLAG_INV_GLOBAL_L2 |
-                                              RADV_CMD_FLAG_START_PIPELINE_STATS);
+                                              RADV_CMD_FLAG_START_PIPELINE_STATS, 0);
                }
 
                if (!queue->device->ws->cs_finalize(cs))
@@ -2766,10 +2970,10 @@ static VkResult radv_alloc_memory(struct radv_device *device,
 
        const VkImportMemoryFdInfoKHR *import_info =
                vk_find_struct_const(pAllocateInfo->pNext, IMPORT_MEMORY_FD_INFO_KHR);
-       const VkMemoryDedicatedAllocateInfoKHR *dedicate_info =
-               vk_find_struct_const(pAllocateInfo->pNext, MEMORY_DEDICATED_ALLOCATE_INFO_KHR);
-       const VkExportMemoryAllocateInfoKHR *export_info =
-               vk_find_struct_const(pAllocateInfo->pNext, EXPORT_MEMORY_ALLOCATE_INFO_KHR);
+       const VkMemoryDedicatedAllocateInfo *dedicate_info =
+               vk_find_struct_const(pAllocateInfo->pNext, MEMORY_DEDICATED_ALLOCATE_INFO);
+       const VkExportMemoryAllocateInfo *export_info =
+               vk_find_struct_const(pAllocateInfo->pNext, EXPORT_MEMORY_ALLOCATE_INFO);
        const VkImportMemoryHostPointerInfoEXT *host_ptr_info =
                vk_find_struct_const(pAllocateInfo->pNext, IMPORT_MEMORY_HOST_POINTER_INFO_EXT);
 
@@ -2796,13 +3000,13 @@ static VkResult radv_alloc_memory(struct radv_device *device,
 
        if (import_info) {
                assert(import_info->handleType ==
-                      VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR ||
+                      VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT ||
                       import_info->handleType ==
                       VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT);
                mem->bo = device->ws->buffer_from_fd(device->ws, import_info->fd,
                                                     NULL, NULL);
                if (!mem->bo) {
-                       result = VK_ERROR_INVALID_EXTERNAL_HANDLE_KHR;
+                       result = VK_ERROR_INVALID_EXTERNAL_HANDLE;
                        goto fail;
                } else {
                        close(import_info->fd);
@@ -2813,7 +3017,7 @@ static VkResult radv_alloc_memory(struct radv_device *device,
                mem->bo = device->ws->buffer_from_ptr(device->ws, host_ptr_info->pHostPointer,
                                                      pAllocateInfo->allocationSize);
                if (!mem->bo) {
-                       result = VK_ERROR_INVALID_EXTERNAL_HANDLE_KHR;
+                       result = VK_ERROR_INVALID_EXTERNAL_HANDLE;
                        goto fail;
                } else {
                        mem->user_ptr = host_ptr_info->pHostPointer;
@@ -2970,17 +3174,17 @@ void radv_GetBufferMemoryRequirements(
 
 void radv_GetBufferMemoryRequirements2(
        VkDevice                                     device,
-       const VkBufferMemoryRequirementsInfo2KHR*    pInfo,
-       VkMemoryRequirements2KHR*                    pMemoryRequirements)
+       const VkBufferMemoryRequirementsInfo2       *pInfo,
+       VkMemoryRequirements2                       *pMemoryRequirements)
 {
        radv_GetBufferMemoryRequirements(device, pInfo->buffer,
                                         &pMemoryRequirements->memoryRequirements);
        RADV_FROM_HANDLE(radv_buffer, buffer, pInfo->buffer);
        vk_foreach_struct(ext, pMemoryRequirements->pNext) {
                switch (ext->sType) {
-               case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS_KHR: {
-                       VkMemoryDedicatedRequirementsKHR *req =
-                                      (VkMemoryDedicatedRequirementsKHR *) ext;
+               case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS: {
+                       VkMemoryDedicatedRequirements *req =
+                                      (VkMemoryDedicatedRequirements *) ext;
                        req->requiresDedicatedAllocation = buffer->shareable;
                        req->prefersDedicatedAllocation = req->requiresDedicatedAllocation;
                        break;
@@ -3007,8 +3211,8 @@ void radv_GetImageMemoryRequirements(
 
 void radv_GetImageMemoryRequirements2(
        VkDevice                                    device,
-       const VkImageMemoryRequirementsInfo2KHR*    pInfo,
-       VkMemoryRequirements2KHR*                   pMemoryRequirements)
+       const VkImageMemoryRequirementsInfo2       *pInfo,
+       VkMemoryRequirements2                      *pMemoryRequirements)
 {
        radv_GetImageMemoryRequirements(device, pInfo->image,
                                         &pMemoryRequirements->memoryRequirements);
@@ -3017,9 +3221,9 @@ void radv_GetImageMemoryRequirements2(
 
        vk_foreach_struct(ext, pMemoryRequirements->pNext) {
                switch (ext->sType) {
-               case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS_KHR: {
-                       VkMemoryDedicatedRequirementsKHR *req =
-                                      (VkMemoryDedicatedRequirementsKHR *) ext;
+               case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS: {
+                       VkMemoryDedicatedRequirements *req =
+                                      (VkMemoryDedicatedRequirements *) ext;
                        req->requiresDedicatedAllocation = image->shareable;
                        req->prefersDedicatedAllocation = req->requiresDedicatedAllocation;
                        break;
@@ -3041,9 +3245,9 @@ void radv_GetImageSparseMemoryRequirements(
 
 void radv_GetImageSparseMemoryRequirements2(
        VkDevice                                    device,
-       const VkImageSparseMemoryRequirementsInfo2KHR* pInfo,
+       const VkImageSparseMemoryRequirementsInfo2 *pInfo,
        uint32_t*                                   pSparseMemoryRequirementCount,
-       VkSparseImageMemoryRequirements2KHR*            pSparseMemoryRequirements)
+       VkSparseImageMemoryRequirements2           *pSparseMemoryRequirements)
 {
        stub();
 }
@@ -3058,7 +3262,7 @@ void radv_GetDeviceMemoryCommitment(
 
 VkResult radv_BindBufferMemory2(VkDevice device,
                                 uint32_t bindInfoCount,
-                                const VkBindBufferMemoryInfoKHR *pBindInfos)
+                                const VkBindBufferMemoryInfo *pBindInfos)
 {
        for (uint32_t i = 0; i < bindInfoCount; ++i) {
                RADV_FROM_HANDLE(radv_device_memory, mem, pBindInfos[i].memory);
@@ -3080,8 +3284,8 @@ VkResult radv_BindBufferMemory(
        VkDeviceMemory                              memory,
        VkDeviceSize                                memoryOffset)
 {
-       const VkBindBufferMemoryInfoKHR info = {
-               .sType = VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO_KHR,
+       const VkBindBufferMemoryInfo info = {
+               .sType = VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO,
                .buffer = buffer,
                .memory = memory,
                .memoryOffset = memoryOffset
@@ -3092,7 +3296,7 @@ VkResult radv_BindBufferMemory(
 
 VkResult radv_BindImageMemory2(VkDevice device,
                                uint32_t bindInfoCount,
-                               const VkBindImageMemoryInfoKHR *pBindInfos)
+                               const VkBindImageMemoryInfo *pBindInfos)
 {
        for (uint32_t i = 0; i < bindInfoCount; ++i) {
                RADV_FROM_HANDLE(radv_device_memory, mem, pBindInfos[i].memory);
@@ -3116,8 +3320,8 @@ VkResult radv_BindImageMemory(
        VkDeviceMemory                              memory,
        VkDeviceSize                                memoryOffset)
 {
-       const VkBindImageMemoryInfoKHR info = {
-               .sType = VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO_KHR,
+       const VkBindImageMemoryInfo info = {
+               .sType = VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO,
                .image = image,
                .memory = memory,
                .memoryOffset = memoryOffset
@@ -3242,9 +3446,9 @@ VkResult radv_CreateFence(
        VkFence*                                    pFence)
 {
        RADV_FROM_HANDLE(radv_device, device, _device);
-       const VkExportFenceCreateInfoKHR *export =
-               vk_find_struct_const(pCreateInfo->pNext, EXPORT_FENCE_CREATE_INFO_KHR);
-       VkExternalFenceHandleTypeFlagsKHR handleTypes =
+       const VkExportFenceCreateInfo *export =
+               vk_find_struct_const(pCreateInfo->pNext, EXPORT_FENCE_CREATE_INFO);
+       VkExternalFenceHandleTypeFlags handleTypes =
                export ? export->handleTypes : 0;
 
        struct radv_fence *fence = vk_alloc2(&device->alloc, pAllocator,
@@ -3531,9 +3735,9 @@ VkResult radv_CreateSemaphore(
        VkSemaphore*                                pSemaphore)
 {
        RADV_FROM_HANDLE(radv_device, device, _device);
-       const VkExportSemaphoreCreateInfoKHR *export =
-               vk_find_struct_const(pCreateInfo->pNext, EXPORT_SEMAPHORE_CREATE_INFO_KHR);
-       VkExternalSemaphoreHandleTypeFlagsKHR handleTypes =
+       const VkExportSemaphoreCreateInfo *export =
+               vk_find_struct_const(pCreateInfo->pNext, EXPORT_SEMAPHORE_CREATE_INFO);
+       VkExternalSemaphoreHandleTypeFlags handleTypes =
                export ? export->handleTypes : 0;
 
        struct radv_semaphore *sem = vk_alloc2(&device->alloc, pAllocator,
@@ -3736,7 +3940,7 @@ radv_init_dcc_control_reg(struct radv_device *device,
        unsigned max_compressed_block_size;
        unsigned independent_64b_blocks;
 
-       if (device->physical_device->rad_info.chip_class < VI)
+       if (!radv_image_has_dcc(iview->image))
                return 0;
 
        if (iview->image->info.samples > 1) {
@@ -4325,27 +4529,40 @@ radv_tex_filter_mode(VkSamplerReductionModeEXT mode)
 {
        switch (mode) {
        case VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_EXT:
-               return SQ_IMG_FILTER_MODE_BLEND;
+               return V_008F30_SQ_IMG_FILTER_MODE_BLEND;
        case VK_SAMPLER_REDUCTION_MODE_MIN_EXT:
-               return SQ_IMG_FILTER_MODE_MIN;
+               return V_008F30_SQ_IMG_FILTER_MODE_MIN;
        case VK_SAMPLER_REDUCTION_MODE_MAX_EXT:
-               return SQ_IMG_FILTER_MODE_MAX;
+               return V_008F30_SQ_IMG_FILTER_MODE_MAX;
        default:
                break;
        }
        return 0;
 }
 
+static uint32_t
+radv_get_max_anisotropy(struct radv_device *device,
+                       const VkSamplerCreateInfo *pCreateInfo)
+{
+       if (device->force_aniso >= 0)
+               return device->force_aniso;
+
+       if (pCreateInfo->anisotropyEnable &&
+           pCreateInfo->maxAnisotropy > 1.0f)
+               return (uint32_t)pCreateInfo->maxAnisotropy;
+
+       return 0;
+}
+
 static void
 radv_init_sampler(struct radv_device *device,
                  struct radv_sampler *sampler,
                  const VkSamplerCreateInfo *pCreateInfo)
 {
-       uint32_t max_aniso = pCreateInfo->anisotropyEnable && pCreateInfo->maxAnisotropy > 1.0 ?
-                                       (uint32_t) pCreateInfo->maxAnisotropy : 0;
+       uint32_t max_aniso = radv_get_max_anisotropy(device, pCreateInfo);
        uint32_t max_aniso_ratio = radv_tex_aniso_filter(max_aniso);
        bool is_vi = (device->physical_device->rad_info.chip_class >= VI);
-       unsigned filter_mode = SQ_IMG_FILTER_MODE_BLEND;
+       unsigned filter_mode = V_008F30_SQ_IMG_FILTER_MODE_BLEND;
 
        const struct VkSamplerReductionModeCreateInfoEXT *sampler_reduction =
                vk_find_struct_const(pCreateInfo->pNext,
@@ -4469,7 +4686,7 @@ VkResult radv_GetMemoryFdKHR(VkDevice _device,
 
        /* At the moment, we support only the below handle types. */
        assert(pGetFdInfo->handleType ==
-              VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR ||
+              VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT ||
               pGetFdInfo->handleType ==
               VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT);
 
@@ -4480,7 +4697,7 @@ VkResult radv_GetMemoryFdKHR(VkDevice _device,
 }
 
 VkResult radv_GetMemoryFdPropertiesKHR(VkDevice _device,
-                                      VkExternalMemoryHandleTypeFlagBitsKHR handleType,
+                                      VkExternalMemoryHandleTypeFlagBits handleType,
                                       int fd,
                                       VkMemoryFdPropertiesKHR *pMemoryFdProperties)
 {
@@ -4499,7 +4716,7 @@ VkResult radv_GetMemoryFdPropertiesKHR(VkDevice _device,
        *
        * So opaque handle types fall into the default "unsupported" case.
        */
-      return vk_error(device->instance, VK_ERROR_INVALID_EXTERNAL_HANDLE_KHR);
+      return vk_error(device->instance, VK_ERROR_INVALID_EXTERNAL_HANDLE);
    }
 }
 
@@ -4510,7 +4727,7 @@ static VkResult radv_import_opaque_fd(struct radv_device *device,
        uint32_t syncobj_handle = 0;
        int ret = device->ws->import_syncobj(device->ws, fd, &syncobj_handle);
        if (ret != 0)
-               return vk_error(device->instance, VK_ERROR_INVALID_EXTERNAL_HANDLE_KHR);
+               return vk_error(device->instance, VK_ERROR_INVALID_EXTERNAL_HANDLE);
 
        if (*syncobj)
                device->ws->destroy_syncobj(device->ws, *syncobj);
@@ -4531,7 +4748,7 @@ static VkResult radv_import_sync_fd(struct radv_device *device,
        if (!syncobj_handle) {
                int ret = device->ws->create_syncobj(device->ws, &syncobj_handle);
                if (ret) {
-                       return vk_error(device->instance, VK_ERROR_INVALID_EXTERNAL_HANDLE_KHR);
+                       return vk_error(device->instance, VK_ERROR_INVALID_EXTERNAL_HANDLE);
                }
        }
 
@@ -4540,7 +4757,7 @@ static VkResult radv_import_sync_fd(struct radv_device *device,
        } else {
                int ret = device->ws->import_syncobj_from_sync_file(device->ws, syncobj_handle, fd);
        if (ret != 0)
-               return vk_error(device->instance, VK_ERROR_INVALID_EXTERNAL_HANDLE_KHR);
+               return vk_error(device->instance, VK_ERROR_INVALID_EXTERNAL_HANDLE);
        }
 
        *syncobj = syncobj_handle;
@@ -4557,16 +4774,16 @@ VkResult radv_ImportSemaphoreFdKHR(VkDevice _device,
        RADV_FROM_HANDLE(radv_semaphore, sem, pImportSemaphoreFdInfo->semaphore);
        uint32_t *syncobj_dst = NULL;
 
-       if (pImportSemaphoreFdInfo->flags & VK_SEMAPHORE_IMPORT_TEMPORARY_BIT_KHR) {
+       if (pImportSemaphoreFdInfo->flags & VK_SEMAPHORE_IMPORT_TEMPORARY_BIT) {
                syncobj_dst = &sem->temp_syncobj;
        } else {
                syncobj_dst = &sem->syncobj;
        }
 
        switch(pImportSemaphoreFdInfo->handleType) {
-               case VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR:
+               case VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT:
                        return radv_import_opaque_fd(device, pImportSemaphoreFdInfo->fd, syncobj_dst);
-               case VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT_KHR:
+               case VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT:
                        return radv_import_sync_fd(device, pImportSemaphoreFdInfo->fd, syncobj_dst);
                default:
                        unreachable("Unhandled semaphore handle type");
@@ -4588,10 +4805,10 @@ VkResult radv_GetSemaphoreFdKHR(VkDevice _device,
                syncobj_handle = sem->syncobj;
 
        switch(pGetFdInfo->handleType) {
-       case VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR:
+       case VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT:
                ret = device->ws->export_syncobj(device->ws, syncobj_handle, pFd);
                break;
-       case VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT_KHR:
+       case VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT:
                ret = device->ws->export_syncobj_to_sync_file(device->ws, syncobj_handle, pFd);
                if (!ret) {
                        if (sem->temp_syncobj) {
@@ -4607,30 +4824,30 @@ VkResult radv_GetSemaphoreFdKHR(VkDevice _device,
        }
 
        if (ret)
-               return vk_error(device->instance, VK_ERROR_INVALID_EXTERNAL_HANDLE_KHR);
+               return vk_error(device->instance, VK_ERROR_INVALID_EXTERNAL_HANDLE);
        return VK_SUCCESS;
 }
 
 void radv_GetPhysicalDeviceExternalSemaphoreProperties(
        VkPhysicalDevice                            physicalDevice,
-       const VkPhysicalDeviceExternalSemaphoreInfoKHR* pExternalSemaphoreInfo,
-       VkExternalSemaphorePropertiesKHR*           pExternalSemaphoreProperties)
+       const VkPhysicalDeviceExternalSemaphoreInfo *pExternalSemaphoreInfo,
+       VkExternalSemaphoreProperties               *pExternalSemaphoreProperties)
 {
        RADV_FROM_HANDLE(radv_physical_device, pdevice, physicalDevice);
 
        /* Require has_syncobj_wait_for_submit for the syncobj signal ioctl introduced at virtually the same time */
        if (pdevice->rad_info.has_syncobj_wait_for_submit &&
-           (pExternalSemaphoreInfo->handleType == VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR || 
-            pExternalSemaphoreInfo->handleType == VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT_KHR)) {
-               pExternalSemaphoreProperties->exportFromImportedHandleTypes = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR | VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT_KHR;
-               pExternalSemaphoreProperties->compatibleHandleTypes = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR | VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT_KHR;
-               pExternalSemaphoreProperties->externalSemaphoreFeatures = VK_EXTERNAL_SEMAPHORE_FEATURE_EXPORTABLE_BIT_KHR |
-                       VK_EXTERNAL_SEMAPHORE_FEATURE_IMPORTABLE_BIT_KHR;
-       } else if (pExternalSemaphoreInfo->handleType == VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR) {
-               pExternalSemaphoreProperties->exportFromImportedHandleTypes = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR;
-               pExternalSemaphoreProperties->compatibleHandleTypes = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR;
-               pExternalSemaphoreProperties->externalSemaphoreFeatures = VK_EXTERNAL_SEMAPHORE_FEATURE_EXPORTABLE_BIT_KHR |
-                       VK_EXTERNAL_SEMAPHORE_FEATURE_IMPORTABLE_BIT_KHR;
+           (pExternalSemaphoreInfo->handleType == VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT || 
+            pExternalSemaphoreInfo->handleType == VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT)) {
+               pExternalSemaphoreProperties->exportFromImportedHandleTypes = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT | VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT;
+               pExternalSemaphoreProperties->compatibleHandleTypes = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT | VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT;
+               pExternalSemaphoreProperties->externalSemaphoreFeatures = VK_EXTERNAL_SEMAPHORE_FEATURE_EXPORTABLE_BIT |
+                       VK_EXTERNAL_SEMAPHORE_FEATURE_IMPORTABLE_BIT;
+       } else if (pExternalSemaphoreInfo->handleType == VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT) {
+               pExternalSemaphoreProperties->exportFromImportedHandleTypes = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT;
+               pExternalSemaphoreProperties->compatibleHandleTypes = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT;
+               pExternalSemaphoreProperties->externalSemaphoreFeatures = VK_EXTERNAL_SEMAPHORE_FEATURE_EXPORTABLE_BIT |
+                       VK_EXTERNAL_SEMAPHORE_FEATURE_IMPORTABLE_BIT;
        } else {
                pExternalSemaphoreProperties->exportFromImportedHandleTypes = 0;
                pExternalSemaphoreProperties->compatibleHandleTypes = 0;
@@ -4646,16 +4863,16 @@ VkResult radv_ImportFenceFdKHR(VkDevice _device,
        uint32_t *syncobj_dst = NULL;
 
 
-       if (pImportFenceFdInfo->flags & VK_FENCE_IMPORT_TEMPORARY_BIT_KHR) {
+       if (pImportFenceFdInfo->flags & VK_FENCE_IMPORT_TEMPORARY_BIT) {
                syncobj_dst = &fence->temp_syncobj;
        } else {
                syncobj_dst = &fence->syncobj;
        }
 
        switch(pImportFenceFdInfo->handleType) {
-               case VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR:
+               case VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT:
                        return radv_import_opaque_fd(device, pImportFenceFdInfo->fd, syncobj_dst);
-               case VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT_KHR:
+               case VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT:
                        return radv_import_sync_fd(device, pImportFenceFdInfo->fd, syncobj_dst);
                default:
                        unreachable("Unhandled fence handle type");
@@ -4677,10 +4894,10 @@ VkResult radv_GetFenceFdKHR(VkDevice _device,
                syncobj_handle = fence->syncobj;
 
        switch(pGetFdInfo->handleType) {
-       case VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR:
+       case VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT:
                ret = device->ws->export_syncobj(device->ws, syncobj_handle, pFd);
                break;
-       case VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT_KHR:
+       case VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT:
                ret = device->ws->export_syncobj_to_sync_file(device->ws, syncobj_handle, pFd);
                if (!ret) {
                        if (fence->temp_syncobj) {
@@ -4696,24 +4913,24 @@ VkResult radv_GetFenceFdKHR(VkDevice _device,
        }
 
        if (ret)
-               return vk_error(device->instance, VK_ERROR_INVALID_EXTERNAL_HANDLE_KHR);
+               return vk_error(device->instance, VK_ERROR_INVALID_EXTERNAL_HANDLE);
        return VK_SUCCESS;
 }
 
 void radv_GetPhysicalDeviceExternalFenceProperties(
        VkPhysicalDevice                            physicalDevice,
-       const VkPhysicalDeviceExternalFenceInfoKHR* pExternalFenceInfo,
-       VkExternalFencePropertiesKHR*           pExternalFenceProperties)
+       const VkPhysicalDeviceExternalFenceInfo *pExternalFenceInfo,
+       VkExternalFenceProperties               *pExternalFenceProperties)
 {
        RADV_FROM_HANDLE(radv_physical_device, pdevice, physicalDevice);
 
        if (pdevice->rad_info.has_syncobj_wait_for_submit &&
-           (pExternalFenceInfo->handleType == VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR || 
-            pExternalFenceInfo->handleType == VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT_KHR)) {
-               pExternalFenceProperties->exportFromImportedHandleTypes = VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR | VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT_KHR;
-               pExternalFenceProperties->compatibleHandleTypes = VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR | VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT_KHR;
-               pExternalFenceProperties->externalFenceFeatures = VK_EXTERNAL_FENCE_FEATURE_EXPORTABLE_BIT_KHR |
-                       VK_EXTERNAL_SEMAPHORE_FEATURE_IMPORTABLE_BIT_KHR;
+           (pExternalFenceInfo->handleType == VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT || 
+            pExternalFenceInfo->handleType == VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT)) {
+               pExternalFenceProperties->exportFromImportedHandleTypes = VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT | VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT;
+               pExternalFenceProperties->compatibleHandleTypes = VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT | VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT;
+               pExternalFenceProperties->externalFenceFeatures = VK_EXTERNAL_FENCE_FEATURE_EXPORTABLE_BIT |
+                       VK_EXTERNAL_SEMAPHORE_FEATURE_IMPORTABLE_BIT;
        } else {
                pExternalFenceProperties->exportFromImportedHandleTypes = 0;
                pExternalFenceProperties->compatibleHandleTypes = 0;
@@ -4773,3 +4990,122 @@ radv_GetDeviceGroupPeerMemoryFeatures(
                               VK_PEER_MEMORY_FEATURE_GENERIC_SRC_BIT |
                               VK_PEER_MEMORY_FEATURE_GENERIC_DST_BIT;
 }
+
+static const VkTimeDomainEXT radv_time_domains[] = {
+       VK_TIME_DOMAIN_DEVICE_EXT,
+       VK_TIME_DOMAIN_CLOCK_MONOTONIC_EXT,
+       VK_TIME_DOMAIN_CLOCK_MONOTONIC_RAW_EXT,
+};
+
+VkResult radv_GetPhysicalDeviceCalibrateableTimeDomainsEXT(
+       VkPhysicalDevice                             physicalDevice,
+       uint32_t                                     *pTimeDomainCount,
+       VkTimeDomainEXT                              *pTimeDomains)
+{
+       int d;
+       VK_OUTARRAY_MAKE(out, pTimeDomains, pTimeDomainCount);
+
+       for (d = 0; d < ARRAY_SIZE(radv_time_domains); d++) {
+               vk_outarray_append(&out, i) {
+                       *i = radv_time_domains[d];
+               }
+       }
+
+       return vk_outarray_status(&out);
+}
+
+static uint64_t
+radv_clock_gettime(clockid_t clock_id)
+{
+       struct timespec current;
+       int ret;
+
+       ret = clock_gettime(clock_id, &current);
+       if (ret < 0 && clock_id == CLOCK_MONOTONIC_RAW)
+               ret = clock_gettime(CLOCK_MONOTONIC, &current);
+       if (ret < 0)
+               return 0;
+
+       return (uint64_t) current.tv_sec * 1000000000ULL + current.tv_nsec;
+}
+
+VkResult radv_GetCalibratedTimestampsEXT(
+       VkDevice                                     _device,
+       uint32_t                                     timestampCount,
+       const VkCalibratedTimestampInfoEXT           *pTimestampInfos,
+       uint64_t                                     *pTimestamps,
+       uint64_t                                     *pMaxDeviation)
+{
+       RADV_FROM_HANDLE(radv_device, device, _device);
+       uint32_t clock_crystal_freq = device->physical_device->rad_info.clock_crystal_freq;
+       int d;
+       uint64_t begin, end;
+        uint64_t max_clock_period = 0;
+
+       begin = radv_clock_gettime(CLOCK_MONOTONIC_RAW);
+
+       for (d = 0; d < timestampCount; d++) {
+               switch (pTimestampInfos[d].timeDomain) {
+               case VK_TIME_DOMAIN_DEVICE_EXT:
+                       pTimestamps[d] = device->ws->query_value(device->ws,
+                                                                RADEON_TIMESTAMP);
+                        uint64_t device_period = DIV_ROUND_UP(1000000, clock_crystal_freq);
+                        max_clock_period = MAX2(max_clock_period, device_period);
+                       break;
+               case VK_TIME_DOMAIN_CLOCK_MONOTONIC_EXT:
+                       pTimestamps[d] = radv_clock_gettime(CLOCK_MONOTONIC);
+                        max_clock_period = MAX2(max_clock_period, 1);
+                       break;
+
+               case VK_TIME_DOMAIN_CLOCK_MONOTONIC_RAW_EXT:
+                       pTimestamps[d] = begin;
+                       break;
+               default:
+                       pTimestamps[d] = 0;
+                       break;
+               }
+       }
+
+       end = radv_clock_gettime(CLOCK_MONOTONIC_RAW);
+
+        /*
+         * The maximum deviation is the sum of the interval over which we
+         * perform the sampling and the maximum period of any sampled
+         * clock. That's because the maximum skew between any two sampled
+         * clock edges is when the sampled clock with the largest period is
+         * sampled at the end of that period but right at the beginning of the
+         * sampling interval and some other clock is sampled right at the
+         * begining of its sampling period and right at the end of the
+         * sampling interval. Let's assume the GPU has the longest clock
+         * period and that the application is sampling GPU and monotonic:
+         *
+         *                               s                 e
+         *                      w x y z 0 1 2 3 4 5 6 7 8 9 a b c d e f
+         *     Raw              -_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-
+         *
+         *                               g
+         *               0         1         2         3
+         *     GPU       -----_____-----_____-----_____-----_____
+         *
+         *                                                m
+         *                                         x y z 0 1 2 3 4 5 6 7 8 9 a b c
+         *     Monotonic                           -_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-
+         *
+         *     Interval                     <----------------->
+         *     Deviation           <-------------------------->
+         *
+         *             s  = read(raw)       2
+         *             g  = read(GPU)       1
+         *             m  = read(monotonic) 2
+         *             e  = read(raw)       b
+         *
+         * We round the sample interval up by one tick to cover sampling error
+         * in the interval clock
+         */
+
+        uint64_t sample_interval = end - begin + 1;
+
+        *pMaxDeviation = sample_interval + max_clock_period;
+
+       return VK_SUCCESS;
+}