X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fintel%2Fvulkan%2Fanv_device.c;h=50d910780cbac3dda369b9fad1fc07fbd9699068;hb=0616b7ac90cf4f86bb409d34101e3a3cceac8cbe;hp=f37435f5a6f8988f8d9e23828c8cc5db939d0eca;hpb=9d2aa67c473f9830cbb581926bb995c0b2581833;p=mesa.git diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c index f37435f5a6f..50d910780cb 100644 --- a/src/intel/vulkan/anv_device.c +++ b/src/intel/vulkan/anv_device.c @@ -40,6 +40,7 @@ #include "util/os_file.h" #include "util/u_atomic.h" #include "util/u_string.h" +#include "util/xmlpool.h" #include "git_sha1.h" #include "vk_util.h" #include "common/gen_defines.h" @@ -47,6 +48,14 @@ #include "genxml/gen7_pack.h" +static const char anv_dri_options_xml[] = +DRI_CONF_BEGIN + DRI_CONF_SECTION_PERFORMANCE + DRI_CONF_VK_X11_OVERRIDE_MIN_IMAGE_COUNT(0) + DRI_CONF_VK_X11_STRICT_IMAGE_COUNT("false") + DRI_CONF_SECTION_END +DRI_CONF_END; + /* This is probably far to big but it reflects the max size used for messages * in OpenGLs KHR_debug. */ @@ -318,7 +327,7 @@ anv_physical_device_init_disk_cache(struct anv_physical_device *device) { #ifdef ENABLE_SHADER_CACHE char renderer[10]; - MAYBE_UNUSED int len = snprintf(renderer, sizeof(renderer), "anv_%04x", + ASSERTED int len = snprintf(renderer, sizeof(renderer), "anv_%04x", device->chipset_id); assert(len == sizeof(renderer) - 2); @@ -390,19 +399,15 @@ anv_physical_device_init(struct anv_physical_device *device, assert(strlen(path) < ARRAY_SIZE(device->path)); snprintf(device->path, ARRAY_SIZE(device->path), "%s", path); - device->no_hw = getenv("INTEL_NO_HW") != NULL; + if (!gen_get_device_info_from_fd(fd, &device->info)) { + result = vk_error(VK_ERROR_INCOMPATIBLE_DRIVER); + goto fail; + } + device->chipset_id = device->info.chipset_id; + device->no_hw = device->info.no_hw; - const int pci_id_override = gen_get_pci_device_id_override(); - if (pci_id_override < 0) { - device->chipset_id = anv_gem_get_param(fd, I915_PARAM_CHIPSET_ID); - if (!device->chipset_id) { - result = vk_error(VK_ERROR_INCOMPATIBLE_DRIVER); - goto fail; - } - } else { - device->chipset_id = pci_id_override; + if (getenv("INTEL_NO_HW") != NULL) device->no_hw = true; - } device->pci_info.domain = drm_device->businfo.pci->domain; device->pci_info.bus = drm_device->businfo.pci->bus; @@ -410,10 +415,6 @@ anv_physical_device_init(struct anv_physical_device *device, device->pci_info.function = drm_device->businfo.pci->func; device->name = gen_get_device_name(device->chipset_id); - if (!gen_get_device_info(device->chipset_id, &device->info)) { - result = vk_error(VK_ERROR_INCOMPATIBLE_DRIVER); - goto fail; - } if (device->info.is_haswell) { intel_logw("Haswell Vulkan support is incomplete"); @@ -423,6 +424,8 @@ anv_physical_device_init(struct anv_physical_device *device, intel_logw("Bay Trail Vulkan support is incomplete"); } else if (device->info.gen >= 8 && device->info.gen <= 11) { /* Gen8-11 fully supported */ + } else if (device->info.gen == 12) { + intel_logw("Vulkan is not yet fully supported on gen12"); } else { result = vk_errorf(device->instance, device, VK_ERROR_INCOMPATIBLE_DRIVER, @@ -776,6 +779,12 @@ VkResult anv_CreateInstance( VG(VALGRIND_CREATE_MEMPOOL(instance, 0, false)); + driParseOptionInfo(&instance->available_dri_options, anv_dri_options_xml); + driParseConfigFiles(&instance->dri_options, &instance->available_dri_options, + 0, "anv", NULL, + instance->app_info.engine_name, + instance->app_info.engine_version); + *pInstance = anv_instance_to_handle(instance); return VK_SUCCESS; @@ -806,6 +815,9 @@ void anv_DestroyInstance( glsl_type_singleton_decref(); _mesa_locale_fini(); + driDestroyOptionCache(&instance->dri_options); + driDestroyOptionInfo(&instance->available_dri_options); + vk_free(&instance->alloc, instance); } @@ -1091,6 +1103,13 @@ void anv_GetPhysicalDeviceFeatures2( break; } + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT: { + VkPhysicalDeviceIndexTypeUint8FeaturesEXT *features = + (VkPhysicalDeviceIndexTypeUint8FeaturesEXT *)ext; + features->indexTypeUint8 = true; + break; + } + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT: { VkPhysicalDeviceInlineUniformBlockFeaturesEXT *features = (VkPhysicalDeviceInlineUniformBlockFeaturesEXT *)ext; @@ -1099,6 +1118,18 @@ void anv_GetPhysicalDeviceFeatures2( break; } + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT: { + VkPhysicalDeviceLineRasterizationFeaturesEXT *features = + (VkPhysicalDeviceLineRasterizationFeaturesEXT *)ext; + features->rectangularLines = true; + features->bresenhamLines = true; + features->smoothLines = true; + features->stippledRectangularLines = false; + features->stippledBresenhamLines = true; + features->stippledSmoothLines = false; + break; + } + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES: { VkPhysicalDeviceMultiviewFeatures *features = (VkPhysicalDeviceMultiviewFeatures *)ext; @@ -1115,6 +1146,13 @@ void anv_GetPhysicalDeviceFeatures2( break; } + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR: { + VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR *features = + (VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR *)ext; + features->pipelineExecutableInfo = true; + break; + } + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES: { VkPhysicalDeviceProtectedMemoryFeatures *features = (void *)ext; features->protectedMemory = false; @@ -1155,6 +1193,14 @@ void anv_GetPhysicalDeviceFeatures2( break; } + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT: { + VkPhysicalDeviceSubgroupSizeControlFeaturesEXT *features = + (VkPhysicalDeviceSubgroupSizeControlFeaturesEXT *)ext; + features->subgroupSizeControl = true; + features->computeFullSubgroups = true; + break; + } + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT: { VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT *features = (VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT *)ext; @@ -1236,6 +1282,8 @@ void anv_GetPhysicalDeviceProperties( pdevice->has_a64_buffer_access ? UINT32_MAX : MAX_BINDING_TABLE_SIZE - MAX_RTS; + const uint32_t max_workgroup_size = 32 * devinfo->max_cs_threads; + VkSampleCountFlags sample_counts = isl_device_get_sample_counts(&pdevice->isl_dev); @@ -1294,11 +1342,11 @@ void anv_GetPhysicalDeviceProperties( .maxFragmentCombinedOutputResources = 8, .maxComputeSharedMemorySize = 64 * 1024, .maxComputeWorkGroupCount = { 65535, 65535, 65535 }, - .maxComputeWorkGroupInvocations = 32 * devinfo->max_cs_threads, + .maxComputeWorkGroupInvocations = max_workgroup_size, .maxComputeWorkGroupSize = { - 16 * devinfo->max_cs_threads, - 16 * devinfo->max_cs_threads, - 16 * devinfo->max_cs_threads, + max_workgroup_size, + max_workgroup_size, + max_workgroup_size, }, .subPixelPrecisionBits = 8, .subTexelPrecisionBits = 8, @@ -1347,10 +1395,14 @@ void anv_GetPhysicalDeviceProperties( .maxCombinedClipAndCullDistances = 8, .discreteQueuePriorities = 2, .pointSizeRange = { 0.125, 255.875 }, - .lineWidthRange = { 0.0, 7.9921875 }, + .lineWidthRange = { + 0.0, + (devinfo->gen >= 9 || devinfo->is_cherryview) ? + 2047.9921875 : 7.9921875, + }, .pointSizeGranularity = (1.0 / 8.0), .lineWidthGranularity = (1.0 / 128.0), - .strictLines = false, /* FINISHME */ + .strictLines = false, .standardSampleLocations = true, .optimalBufferCopyOffsetAlignment = 128, .optimalBufferCopyRowPitchAlignment = 128, @@ -1507,6 +1559,25 @@ void anv_GetPhysicalDeviceProperties2( break; } + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT: { + VkPhysicalDeviceLineRasterizationPropertiesEXT *props = + (VkPhysicalDeviceLineRasterizationPropertiesEXT *)ext; + /* In the Skylake PRM Vol. 7, subsection titled "GIQ (Diamond) + * Sampling Rules - Legacy Mode", it says the following: + * + * "Note that the device divides a pixel into a 16x16 array of + * subpixels, referenced by their upper left corners." + * + * This is the only known reference in the PRMs to the subpixel + * precision of line rasterization and a "16x16 array of subpixels" + * implies 4 subpixel precision bits. Empirical testing has shown + * that 4 subpixel precision bits applies to all line rasterization + * types. + */ + props->lineSubPixelPrecisionBits = 4; + break; + } + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES: { VkPhysicalDeviceMaintenance3Properties *props = (VkPhysicalDeviceMaintenance3Properties *)ext; @@ -1543,6 +1614,16 @@ void anv_GetPhysicalDeviceProperties2( break; } +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wswitch" + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENTATION_PROPERTIES_ANDROID: { + VkPhysicalDevicePresentationPropertiesANDROID *props = + (VkPhysicalDevicePresentationPropertiesANDROID *)ext; + props->sharedImage = VK_FALSE; + break; + } +#pragma GCC diagnostic pop + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES: { VkPhysicalDeviceProtectedMemoryProperties *props = (VkPhysicalDeviceProtectedMemoryProperties *)ext; @@ -2066,6 +2147,9 @@ anv_device_init_dispatch(struct anv_device *device) { const struct anv_device_dispatch_table *genX_table; switch (device->info.gen) { + case 12: + genX_table = &gen12_device_dispatch_table; + break; case 11: genX_table = &gen11_device_dispatch_table; break; @@ -2465,6 +2549,9 @@ VkResult anv_CreateDevice( case 11: result = gen11_init_device_state(device); break; + case 12: + result = gen12_init_device_state(device); + break; default: /* Shouldn't get here as we don't create physical devices for any other * gens. */ @@ -2537,6 +2624,7 @@ void anv_DestroyDevice( * BO will go away in a couple of lines so we don't actually leak. */ anv_state_pool_free(&device->dynamic_state_pool, device->border_colors); + anv_state_pool_free(&device->dynamic_state_pool, device->slice_hash); #endif anv_scratch_pool_finish(device, &device->scratch_pool); @@ -2788,7 +2876,7 @@ anv_vma_free(struct anv_device *device, struct anv_bo *bo) util_vma_heap_free(&device->vma_lo, addr_48b, bo->size); device->vma_lo_available += bo->size; } else { - MAYBE_UNUSED const struct anv_physical_device *physical_device = + ASSERTED const struct anv_physical_device *physical_device = &device->instance->physicalDevice; assert(addr_48b >= physical_device->memory.heaps[0].vma_start && addr_48b < (physical_device->memory.heaps[0].vma_start +