Lines Matching refs:screen
113 struct zink_screen *screen = zink_screen(pscreen);
115 snprintf(buf, sizeof(buf), "Unknown (vendor-id: 0x%04x)", screen->info.props.vendorID);
122 struct zink_screen *screen = zink_screen(pscreen);
124 snprintf(buf, sizeof(buf), "zink (%s)", screen->info.props.deviceName);
131 struct zink_screen *screen = zink_screen(pscreen);
132 if (screen->vk_version >= VK_MAKE_VERSION(1,2,0)) {
133 memcpy(uuid, screen->info.props11.driverUUID, VK_UUID_SIZE);
135 memcpy(uuid, screen->info.deviceid_props.driverUUID, VK_UUID_SIZE);
142 struct zink_screen *screen = zink_screen(pscreen);
143 if (screen->vk_version >= VK_MAKE_VERSION(1,2,0)) {
144 memcpy(uuid, screen->info.props11.deviceUUID, VK_UUID_SIZE);
146 memcpy(uuid, screen->info.deviceid_props.deviceUUID, VK_UUID_SIZE);
153 struct zink_screen *screen = zink_screen(pscreen);
154 if (screen->info.have_vulkan12) {
155 memcpy(luid, screen->info.props11.deviceLUID, VK_LUID_SIZE);
157 memcpy(luid, screen->info.deviceid_props.deviceLUID, VK_LUID_SIZE);
164 struct zink_screen *screen = zink_screen(pscreen);
165 if (screen->info.have_vulkan12) {
166 return screen->info.props11.deviceNodeMask;
168 return screen->info.deviceid_props.deviceNodeMask;
173 get_video_mem(struct zink_screen *screen)
176 for (uint32_t i = 0; i < screen->info.mem_props.memoryHeapCount; ++i) {
177 if (screen->info.mem_props.memoryHeaps[i].flags &
179 size += screen->info.mem_props.memoryHeaps[i].size;
185 disk_cache_init(struct zink_screen *screen)
189 snprintf(buf, sizeof(buf), "zink_%x04x", screen->info.props.vendorID);
191 screen->disk_cache = disk_cache_create(buf, screen->info.props.deviceName, 0);
192 if (!screen->disk_cache)
195 if (!util_queue_init(&screen->cache_put_thread, "zcq", 8, 1, UTIL_QUEUE_INIT_RESIZE_IF_FULL, screen) ||
196 !util_queue_init(&screen->cache_get_thread, "zcfq", 8, 4,
197 UTIL_QUEUE_INIT_RESIZE_IF_FULL | UTIL_QUEUE_INIT_SCALE_THREADS, screen)) {
200 disk_cache_destroy(screen->disk_cache);
201 screen->disk_cache = NULL;
203 util_queue_destroy(&screen->cache_put_thread);
204 util_queue_destroy(&screen->cache_get_thread);
218 struct zink_screen *screen = gdata;
220 VkResult result = VKSCR(GetPipelineCacheData)(screen->dev, pg->pipeline_cache, &size, NULL);
230 result = VKSCR(GetPipelineCacheData)(screen->dev, pg->pipeline_cache, &size, pipeline_data);
235 disk_cache_compute_key(screen->disk_cache, pg->sha1, sizeof(pg->sha1), key);
236 disk_cache_put_nocopy(screen->disk_cache, key, pipeline_data, size, NULL);
243 zink_screen_update_pipeline_cache(struct zink_screen *screen, struct zink_program *pg)
245 if (!screen->disk_cache)
248 util_queue_add_job(&screen->cache_put_thread, pg, &pg->cache_fence, cache_put_job, NULL, 0);
255 struct zink_screen *screen = gdata;
260 pcci.flags = screen->info.have_EXT_pipeline_creation_cache_control ? VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT : 0;
265 disk_cache_compute_key(screen->disk_cache, pg->sha1, sizeof(pg->sha1), key);
266 pcci.pInitialData = disk_cache_get(screen->disk_cache, key, &pg->pipeline_cache_size);
269 VkResult res = VKSCR(CreatePipelineCache)(screen->dev, &pcci, NULL, &pg->pipeline_cache);
277 zink_screen_get_pipeline_cache(struct zink_screen *screen, struct zink_program *pg)
279 if (!screen->disk_cache)
282 util_queue_add_job(&screen->cache_get_thread, pg, &pg->cache_fence, cache_get_job, NULL, 0);
289 struct zink_screen *screen = zink_screen(pscreen);
309 RET(((uint64_t []) { screen->info.props.limits.maxComputeWorkGroupCount[0],
310 screen->info.props.limits.maxComputeWorkGroupCount[1],
311 screen->info.props.limits.maxComputeWorkGroupCount[2] }));
315 RET(((uint64_t []) {screen->info.props.limits.maxComputeWorkGroupSize[0],
316 screen->info.props.limits.maxComputeWorkGroupSize[1],
317 screen->info.props.limits.maxComputeWorkGroupSize[2]}));
321 RET((uint64_t []) { screen->info.props.limits.maxComputeWorkGroupInvocations });
324 RET((uint64_t []) { screen->info.props.limits.maxComputeSharedMemorySize });
330 RET((uint32_t []) { screen->info.props11.subgroupSize });
347 get_smallest_buffer_heap(struct zink_screen *screen)
357 unsigned heap_idx = screen->info.mem_props.memoryTypes[screen->heap_map[i]].heapIndex;
358 size = MIN2(screen->info.mem_props.memoryHeaps[heap_idx].size, size);
366 struct zink_screen *screen = zink_screen(pscreen);
373 return screen->info.feats.features.samplerAnisotropy;
381 if (screen->have_triangle_fans)
383 if (screen->info.have_EXT_primitive_topology_list_restart) {
389 if (screen->info.list_restart_feats.primitiveTopologyPatchListRestart)
400 if (!screen->have_triangle_fans)
409 return screen->instance_info.have_KHR_external_memory_capabilities && (screen->info.have_KHR_external_memory_fd || screen->info.have_KHR_external_memory_win32);
411 return screen->info.have_KHR_external_semaphore_fd || screen->info.have_KHR_external_semaphore_win32;
444 return screen->info.have_EXT_vertex_input_dynamic_state;
447 return screen->vk_version >= VK_MAKE_VERSION(1,2,0);
450 return screen->info.feats11.shaderDrawParameters || screen->info.have_KHR_shader_draw_parameters;
453 if (screen->info.have_vulkan11 &&
454 (screen->info.subgroup.supportedOperations & VK_SUBGROUP_FEATURE_VOTE_BIT) &&
455 (screen->info.subgroup.supportedStages & VK_SHADER_STAGE_COMPUTE_BIT))
457 if (screen->info.have_EXT_shader_subgroup_vote)
461 return screen->info.have_EXT_provoking_vertex;
464 return screen->info.have_KHR_sampler_mirror_clamp_to_edge;
470 return screen->info.feats.features.depthBiasClamp;
473 return screen->info.feats.features.pipelineStatisticsQuery;
476 return screen->info.feats.features.robustBufferAccess;
479 return screen->info.feats.features.multiDrawIndirect;
482 return screen->info.have_KHR_draw_indirect_count;
485 return (screen->info.have_vulkan12 && screen->info.feats11.shaderDrawParameters) ||
486 screen->info.have_KHR_shader_draw_parameters;
489 return screen->info.have_EXT_vertex_attribute_divisor;
492 return screen->info.tf_props.maxTransformFeedbackStreams;
500 if (!screen->info.feats.features.dualSrcBlend)
502 return screen->info.props.limits.maxFragmentDualSrcAttachments;
505 return screen->info.props.limits.maxColorAttachments;
508 return screen->info.feats.features.occlusionQueryPrecise;
511 return screen->info.have_EXT_sample_locations && screen->info.have_EXT_extended_dynamic_state;
514 return screen->timestamp_valid_bits > 0;
520 return screen->info.have_EXT_fragment_shader_interlock;
523 return screen->info.have_KHR_shader_clock;
529 if (screen->info.props11.subgroupSize > 64)
531 if (screen->info.have_vulkan11 &&
532 screen->info.subgroup.supportedOperations & VK_SUBGROUP_FEATURE_BALLOT_BIT)
534 if (screen->info.have_EXT_shader_subgroup_ballot)
538 return screen->info.feats.features.sampleRateShading;
550 if (!screen->info.border_color_feats.customBorderColorWithoutFormat)
557 if (screen->info.have_EXT_border_color_swizzle &&
558 !screen->info.border_swizzle_feats.borderColorSwizzleFromImage)
563 return screen->info.props.limits.maxImageDimension2D;
565 return 1 + util_logbase2(screen->info.props.limits.maxImageDimension3D);
567 return 1 + util_logbase2(screen->info.props.limits.maxImageDimensionCube);
576 return screen->info.feats.features.independentBlend;
582 return screen->info.have_EXT_transform_feedback ? screen->info.tf_props.maxTransformFeedbackBuffers : 0;
585 return screen->info.have_EXT_transform_feedback;
588 return screen->info.props.limits.maxImageArrayLayers;
591 return !screen->driver_workarounds.depth_clip_control_missing;
594 return screen->info.have_EXT_shader_stencil_export;
602 return screen->info.props.limits.minTexelOffset;
604 return screen->info.props.limits.maxTexelOffset;
620 return screen->info.props.limits.minUniformBufferOffsetAlignment;
623 return screen->timestamp_valid_bits > 0;
629 return screen->info.feats.features.imageCubeArray;
636 return screen->info.have_EXT_descriptor_indexing;
639 return screen->info.props.limits.minTexelBufferOffsetAlignment;
643 if (!screen->is_cpu &&
645 screen->info.driver_props.driverID != VK_DRIVER_ID_MESA_TURNIP &&
646 screen->info.have_KHR_8bit_storage &&
647 screen->info.have_KHR_16bit_storage &&
648 screen->info.have_KHR_shader_float16_int8)
654 return MIN2(get_smallest_buffer_heap(screen),
655 screen->info.props.limits.maxTexelBufferElements);
661 return MIN2(screen->info.props.limits.maxViewports, PIPE_MAX_VIEWPORTS);
664 return screen->info.feats.features.shaderStorageImageReadWithoutFormat;
667 return screen->info.feats.features.shaderStorageImageWriteWithoutFormat;
673 return screen->info.props.limits.maxGeometryOutputVertices;
675 return screen->info.props.limits.maxGeometryTotalOutputComponents;
681 return screen->info.props.limits.minTexelGatherOffset;
683 return screen->info.props.limits.maxTexelGatherOffset;
686 return screen->info.feats12.samplerFilterMinmax || screen->info.have_EXT_sampler_filter_minmax;
692 return screen->info.props.vendorID;
694 return screen->info.props.deviceID;
697 return !screen->is_cpu;
699 return get_video_mem(screen) >> 20;
701 return screen->info.props.deviceType == VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU;
704 return screen->info.props.limits.maxVertexInputBindingStride;
711 return screen->info.have_EXT_shader_viewport_index_layer ||
712 (screen->spirv_version >= SPIRV_VERSION(1, 5) &&
713 screen->info.feats12.shaderOutputLayer &&
714 screen->info.feats12.shaderOutputViewportIndex);
721 return screen->info.props.limits.minStorageBufferOffsetAlignment;
730 return screen->info.feats.features.shaderCullDistance;
733 return screen->info.feats.features.sparseBinding ? ZINK_SPARSE_BUFFER_PAGE_SIZE : 0;
737 return screen->info.feats.features.sparseResidencyImage2D ?
740 return screen->info.feats.features.sparseResidencyImage3D ?
743 return screen->info.feats.features.sparseResidencyImage2D ?
746 return screen->info.feats.features.sparseResidencyImage2D ? 1 : 0;
749 return screen->info.feats.features.sparseResidency2Samples ? 1 : 0;
752 return screen->info.props.limits.viewportSubPixelBits;
755 return screen->info.props.limits.maxGeometryShaderInvocations;
763 assert(screen->info.props.limits.maxStorageBufferRange >= 1 << 27);
765 return MIN2(get_smallest_buffer_heap(screen), screen->info.props.limits.maxStorageBufferRange);
792 return screen->info.props.limits.maxTessellationControlPerVertexOutputComponents / 4;
795 return MIN2(screen->info.props.limits.maxVertexOutputComponents / 4 / 2, 16);
798 return screen->info.have_KHR_external_memory_fd &&
799 screen->info.have_EXT_external_memory_dma_buf &&
800 screen->info.have_EXT_queue_family_foreign;
803 return screen->info.feats.features.depthBounds;
806 return screen->info.have_EXT_post_depth_coverage;
809 return screen->instance_info.have_EXT_debug_utils;
819 struct zink_screen *screen = zink_screen(pscreen);
824 if (!screen->info.feats.features.wideLines)
826 return MAX2(screen->info.props.limits.lineWidthRange[0], 0.01);
830 if (!screen->info.feats.features.largePoints)
832 return MAX2(screen->info.props.limits.pointSizeRange[0], 0.01);
836 if (!screen->info.feats.features.wideLines)
838 return screen->info.props.limits.lineWidthGranularity;
841 if (!screen->info.feats.features.largePoints)
843 return screen->info.props.limits.pointSizeGranularity;
848 if (!screen->info.feats.features.wideLines)
850 return screen->info.props.limits.lineWidthRange[1];
854 if (!screen->info.feats.features.largePoints)
856 return screen->info.props.limits.pointSizeRange[1];
859 if (!screen->info.feats.features.samplerAnisotropy)
861 return screen->info.props.limits.maxSamplerAnisotropy;
864 return screen->info.props.limits.maxSamplerLodBias;
881 struct zink_screen *screen = zink_screen(pscreen);
891 if (screen->info.feats.features.tessellationShader &&
892 screen->info.have_KHR_maintenance2)
897 if (screen->info.feats.features.geometryShader)
917 max = MIN2(screen->info.props.limits.maxVertexInputAttributes, PIPE_MAX_ATTRIBS);
920 max = screen->info.props.limits.maxTessellationControlPerVertexInputComponents / 4;
923 max = screen->info.props.limits.maxTessellationEvaluationInputComponents / 4;
926 max = screen->info.props.limits.maxGeometryInputComponents / 4;
932 if (screen->info.driver_props.driverID == VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA ||
933 screen->info.driver_props.driverID == VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS)
935 max = screen->info.props.limits.maxFragmentInputComponents / 4;
955 max = screen->info.props.limits.maxVertexOutputComponents / 4;
958 max = screen->info.props.limits.maxTessellationControlPerVertexOutputComponents / 4;
961 max = screen->info.props.limits.maxTessellationEvaluationOutputComponents / 4;
964 max = screen->info.props.limits.maxGeometryOutputComponents / 4;
967 max = screen->info.props.limits.maxColorAttachments;
977 assert(screen->info.props.limits.maxUniformBufferRange >= 16384);
979 return MIN3(get_smallest_buffer_heap(screen),
980 screen->info.props.limits.maxUniformBufferRange, BITFIELD_BIT(31));
983 return MIN2(screen->info.props.limits.maxPerStageDescriptorUniformBuffers,
1005 //return screen->info.feats11.uniformAndStorageBuffer16BitAccess ||
1006 //(screen->info.have_KHR_16bit_storage && screen->info.storage_16bit_feats.uniformAndStorageBuffer16BitAccess);
1011 return screen->info.feats12.shaderFloat16 ||
1012 (screen->info.have_KHR_shader_float16_int8 &&
1013 screen->info.shader_float16_int8_feats.shaderFloat16);
1016 return screen->info.feats.features.shaderInt16;
1026 return MIN2(MIN2(screen->info.props.limits.maxPerStageDescriptorSamplers,
1027 screen->info.props.limits.maxPerStageDescriptorSampledImages),
1043 if (!screen->info.feats.features.vertexPipelineStoresAndAtomics)
1048 if (!screen->info.feats.features.fragmentStoresAndAtomics)
1057 return MIN2(screen->info.props.limits.maxPerStageDescriptorStorageBuffers, PIPE_MAX_SHADER_BUFFERS);
1063 if (screen->info.feats.features.shaderStorageImageExtendedFormats &&
1064 screen->info.feats.features.shaderStorageImageWriteWithoutFormat)
1065 return MIN2(screen->info.props.limits.maxPerStageDescriptorStorageImages,
1122 struct zink_screen *screen = zink_screen(pscreen);
1124 if (storage_sample_count && !screen->info.feats.features.shaderStorageImageMultisample && bind & PIPE_BIND_SHADER_IMAGE)
1128 return screen->info.props.limits.framebufferNoAttachmentsSampleCounts &
1133 !screen->info.have_EXT_index_type_uint8)
1141 VkFormat vkformat = zink_get_format(screen, format);
1153 (screen->info.props.limits.framebufferDepthSampleCounts & sample_mask) != sample_mask)
1156 (screen->info.props.limits.sampledImageDepthSampleCounts & sample_mask) != sample_mask)
1161 (screen->info.props.limits.framebufferStencilSampleCounts & sample_mask) != sample_mask)
1164 (screen->info.props.limits.sampledImageStencilSampleCounts & sample_mask) != sample_mask)
1169 !(screen->info.props.limits.framebufferColorSampleCounts & sample_mask))
1172 !(screen->info.props.limits.sampledImageIntegerSampleCounts & sample_mask))
1176 !(screen->info.props.limits.framebufferColorSampleCounts & sample_mask))
1179 !(screen->info.props.limits.sampledImageColorSampleCounts & sample_mask))
1183 if (!(screen->info.props.limits.storageImageSampleCounts & sample_mask))
1188 VkFormatProperties props = screen->format_props[format];
1196 if (!(screen->format_props[new_format].bufferFeatures & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))
1246 !screen->info.feats.features.textureCompressionBC)
1256 struct zink_screen *screen = zink_screen(pscreen);
1258 hash_table_foreach(&screen->dts, entry)
1259 zink_kopper_deinit_displaytarget(screen, entry->data);
1260 simple_mtx_destroy(&screen->dt_lock);
1262 if (screen->copy_context)
1263 screen->copy_context->base.destroy(&screen->copy_context->base);
1265 if (VK_NULL_HANDLE != screen->debugUtilsCallbackHandle) {
1266 VKSCR(DestroyDebugUtilsMessengerEXT)(screen->instance, screen->debugUtilsCallbackHandle, NULL);
1269 util_vertex_state_cache_deinit(&screen->vertex_state_cache);
1273 if (screen->disk_cache) {
1274 util_queue_finish(&screen->cache_put_thread);
1275 util_queue_finish(&screen->cache_get_thread);
1276 disk_cache_wait_for_idle(screen->disk_cache);
1277 util_queue_destroy(&screen->cache_put_thread);
1278 util_queue_destroy(&screen->cache_get_thread);
1281 disk_cache_destroy(screen->disk_cache);
1282 zink_bo_deinit(screen);
1283 util_live_shader_cache_deinit(&screen->shaders);
1285 if (screen->sem)
1286 VKSCR(DestroySemaphore)(screen->dev, screen->sem, NULL);
1288 if (screen->fence)
1289 VKSCR(DestroyFence)(screen->dev, screen->fence, NULL);
1291 if (screen->threaded)
1292 util_queue_destroy(&screen->flush_queue);
1294 simple_mtx_destroy(&screen->queue_lock);
1295 VKSCR(DestroyDevice)(screen->dev, NULL);
1296 VKSCR(DestroyInstance)(screen->instance, NULL);
1297 util_idalloc_mt_fini(&screen->buffer_ids);
1299 util_dl_close(screen->loader_lib);
1300 if (screen->drm_fd != -1)
1301 close(screen->drm_fd);
1303 slab_destroy_parent(&screen->transfer_pool);
1304 ralloc_free(screen);
1309 choose_pdev(struct zink_screen *screen)
1314 VkResult result = VKSCR(EnumeratePhysicalDevices)(screen->instance, &pdev_count, NULL);
1323 result = VKSCR(EnumeratePhysicalDevices)(screen->instance, &pdev_count, pdevs);
1370 screen->pdev = pdevs[idx];
1371 VKSCR(GetPhysicalDeviceProperties)(screen->pdev, &screen->info.props);
1372 screen->info.device_version = screen->info.props.apiVersion;
1375 screen->vk_version = MIN2(screen->info.device_version, screen->instance_info.loader_version);
1378 if (screen->vk_version >= VK_MAKE_VERSION(1, 2, 0))
1379 screen->spirv_version = SPIRV_VERSION(1, 5);
1380 else if (screen->vk_version >= VK_MAKE_VERSION(1, 1, 0))
1381 screen->spirv_version = SPIRV_VERSION(1, 3);
1383 screen->spirv_version = SPIRV_VERSION(1, 0);
1390 update_queue_props(struct zink_screen *screen)
1393 VKSCR(GetPhysicalDeviceQueueFamilyProperties)(screen->pdev, &num_queues, NULL);
1397 VKSCR(GetPhysicalDeviceQueueFamilyProperties)(screen->pdev, &num_queues, props);
1401 screen->sparse_queue = UINT32_MAX;
1404 screen->gfx_queue = i;
1405 screen->max_queues = props[i].queueCount;
1406 screen->timestamp_valid_bits = props[i].timestampValidBits;
1409 screen->sparse_queue = i;
1413 if (screen->sparse_queue == UINT32_MAX)
1414 screen->sparse_queue = sparse_only;
1419 init_queue(struct zink_screen *screen)
1421 simple_mtx_init(&screen->queue_lock, mtx_plain);
1422 VKSCR(GetDeviceQueue)(screen->dev, screen->gfx_queue, 0, &screen->queue);
1423 if (screen->sparse_queue != UINT32_MAX) {
1424 if (screen->sparse_queue != screen->gfx_queue)
1425 VKSCR(GetDeviceQueue)(screen->dev, screen->sparse_queue, 0, &screen->queue_sparse);
1427 screen->queue_sparse = screen->queue;
1439 struct zink_screen *screen = zink_screen(pscreen);
1452 if (ctx->last_fence && screen->threaded) {
1459 zink_kopper_present_queue(screen, res);
1470 zink_is_depth_format_supported(struct zink_screen *screen, VkFormat format)
1473 VKSCR(GetPhysicalDeviceFormatProperties)(screen->pdev, format, &props);
1513 zink_get_format(struct zink_screen *screen, enum pipe_format format)
1518 screen->have_D32_SFLOAT_S8_UINT)
1527 !screen->have_X8_D24_UNORM_PACK32) {
1528 assert(zink_is_depth_format_supported(screen, VK_FORMAT_D32_SFLOAT));
1533 !screen->have_D24_UNORM_S8_UINT) {
1534 assert(screen->have_D32_SFLOAT_S8_UINT);
1539 !screen->info.format_4444_feats.formatA4B4G4R4) ||
1541 !screen->info.format_4444_feats.formatA4R4G4B4))
1548 zink_screen_init_descriptor_funcs(struct zink_screen *screen, bool fallback)
1552 #define LAZY(FUNC) screen->FUNC = zink_##FUNC##_lazy
1564 #define DEFAULT(FUNC) screen->FUNC = zink_##FUNC
1579 check_have_device_time(struct zink_screen *screen)
1583 VkResult result = VKSCR(GetPhysicalDeviceCalibrateableTimeDomainsEXT)(screen->pdev, &num_domains, NULL);
1590 result = VKSCR(GetPhysicalDeviceCalibrateableTimeDomainsEXT)(screen->pdev, &num_domains, domains);
1647 create_debug(struct zink_screen *screen)
1667 screen->instance,
1675 screen->debugUtilsCallbackHandle = vkDebugUtilsCallbackEXT;
1681 zink_internal_setup_moltenvk(struct zink_screen *screen)
1684 if (!screen->instance_info.have_MVK_moltenvk)
1687 GET_PROC_ADDR_INSTANCE_LOCAL(screen, screen->instance, GetMoltenVKConfigurationMVK);
1688 GET_PROC_ADDR_INSTANCE_LOCAL(screen, screen->instance, SetMoltenVKConfigurationMVK);
1689 GET_PROC_ADDR_INSTANCE_LOCAL(screen, screen->instance, GetVersionStringsMVK);
1704 VkResult res = vk_GetMoltenVKConfigurationMVK(screen->instance, &molten_config, &molten_config_size);
1709 vk_SetMoltenVKConfigurationMVK(screen->instance, &molten_config, &molten_config_size);
1718 populate_format_props(struct zink_screen *screen)
1721 VkFormat format = zink_get_format(screen, i);
1730 if (screen->info.have_EXT_image_drm_format_modifier) {
1741 VKSCR(GetPhysicalDeviceFormatProperties2)(screen->pdev, format, &props);
1742 screen->format_props[i] = props.formatProperties;
1744 screen->format_props[i].linearTilingFeatures |= VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT;
1745 if (screen->info.have_EXT_image_drm_format_modifier && mod_props.drmFormatModifierCount) {
1746 screen->modifier_props[i].drmFormatModifierCount = mod_props.drmFormatModifierCount;
1747 screen->modifier_props[i].pDrmFormatModifierProperties = ralloc_array(screen, VkDrmFormatModifierPropertiesEXT, mod_props.drmFormatModifierCount);
1750 screen->modifier_props[i].pDrmFormatModifierProperties[j] = mod_props.pDrmFormatModifierProperties[j];
1754 VKSCR(GetPhysicalDeviceFormatProperties)(screen->pdev, format, &screen->format_props[i]);
1757 VkResult ret = VKSCR(GetPhysicalDeviceImageFormatProperties)(screen->pdev, VK_FORMAT_D32_SFLOAT,
1765 screen->need_2D_zs = ret != VK_SUCCESS;
1767 if (screen->info.feats.features.sparseResidencyImage2D)
1768 screen->need_2D_sparse = !screen->base.get_sparse_texture_virtual_page_size(&screen->base, PIPE_TEXTURE_1D, false, PIPE_FORMAT_R32_FLOAT, 0, 16, NULL, NULL, NULL);
1772 zink_screen_init_semaphore(struct zink_screen *screen)
1781 return VKSCR(CreateSemaphore)(screen->dev, &sci, NULL, &screen->sem) == VK_SUCCESS;
1785 zink_screen_timeline_wait(struct zink_screen *screen, uint64_t batch_id, uint64_t timeout)
1789 if (zink_screen_check_last_finished(screen, batch_id))
1794 wi.pSemaphores = &screen->sem;
1797 if (screen->device_lost)
1799 VkResult ret = VKSCR(WaitSemaphores)(screen->dev, &wi, timeout);
1800 success = zink_screen_handle_vkresult(screen, ret);
1803 zink_screen_update_last_finished(screen, batch_id);
1809 zink_get_loader_version(struct zink_screen *screen)
1815 GET_PROC_ADDR_INSTANCE_LOCAL(screen, NULL, EnumerateInstanceVersion);
1832 struct zink_screen *screen = zink_screen(pscreen);
1834 if (screen->info.have_EXT_memory_budget && VKSCR(GetPhysicalDeviceMemoryProperties2)) {
1841 VKSCR(GetPhysicalDeviceMemoryProperties2)(screen->pdev, &mem);
1856 for (unsigned i = 0; i < screen->info.mem_props.memoryHeapCount; i++) {
1857 if (screen->info.mem_props.memoryHeaps[i].flags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) {
1859 info->total_device_memory += screen->info.mem_props.memoryHeaps[i].size / 1024;
1864 info->total_staging_memory += screen->info.mem_props.memoryHeaps[i].size / 1024;
1875 struct zink_screen *screen = zink_screen(pscreen);
1876 *count = screen->modifier_props[format].drmFormatModifierCount;
1878 modifiers[i] = screen->modifier_props[format].pDrmFormatModifierProperties[i].drmFormatModifier;
1884 struct zink_screen *screen = zink_screen(pscreen);
1885 for (unsigned i = 0; i < screen->modifier_props[format].drmFormatModifierCount; i++)
1886 if (screen->modifier_props[format].pDrmFormatModifierProperties[i].drmFormatModifier == modifier)
1894 struct zink_screen *screen = zink_screen(pscreen);
1895 for (unsigned i = 0; i < screen->modifier_props[format].drmFormatModifierCount; i++)
1896 if (screen->modifier_props[format].pDrmFormatModifierProperties[i].drmFormatModifier == modifier)
1897 return screen->modifier_props[format].pDrmFormatModifierProperties[i].drmFormatModifierPlaneCount;
1909 struct zink_screen *screen = zink_screen(pscreen);
1929 if (multi_sample && !screen->info.feats.features.sparseResidency2Samples)
1932 VkFormat format = zink_get_format(screen, pformat);
1938 type = (screen->need_2D_sparse || (screen->need_2D_zs && is_zs)) ? VK_IMAGE_TYPE_2D : VK_IMAGE_TYPE_1D;
1964 VKSCR(GetPhysicalDeviceSparseImageFormatProperties)(screen->pdev, format, type,
1971 screen->faked_e5sparse = true;
2003 zink_create_logical_device(struct zink_screen *screen)
2010 qci.queueFamilyIndex = screen->gfx_queue;
2011 qci.queueCount = screen->threaded && screen->max_queues > 1 ? 2 : 1;
2021 if (screen->info.feats.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2) {
2022 dci.pNext = &screen->info.feats;
2024 dci.pEnabledFeatures = &screen->info.feats.features;
2027 dci.ppEnabledExtensionNames = screen->info.extensions;
2028 dci.enabledExtensionCount = screen->info.num_extensions;
2030 VkResult result = VKSCR(CreateDevice)(screen->pdev, &dci, NULL, &dev);
2038 pre_hash_descriptor_states(struct zink_screen *screen)
2042 screen->null_descriptor_hashes.image_view = _mesa_hash_data(&null_info, sizeof(VkImageViewCreateInfo));
2043 screen->null_descriptor_hashes.buffer_view = _mesa_hash_data(&null_binfo, sizeof(VkBufferViewCreateInfo));
2047 check_base_requirements(struct zink_screen *screen)
2049 if (!screen->info.feats.features.logicOp ||
2050 !screen->info.feats.features.fillModeNonSolid ||
2051 !screen->info.feats.features.shaderClipDistance ||
2052 !(screen->info.feats12.scalarBlockLayout ||
2053 screen->info.have_EXT_scalar_block_layout) ||
2054 !screen->info.have_KHR_maintenance1 ||
2055 !screen->info.have_EXT_custom_border_color ||
2056 !screen->info.have_EXT_line_rasterization) {
2059 "base Zink requirements: ", screen->info.props.deviceName);
2061 if (!screen->info.X) \
2066 if (!screen->info.feats12.scalarBlockLayout && !screen->info.have_EXT_scalar_block_layout)
2079 struct zink_screen *screen = zink_screen(pscreen);
2081 assert(idx < ARRAY_SIZE(screen->maxSampleLocationGridSize));
2082 *width = screen->maxSampleLocationGridSize[idx].width;
2083 *height = screen->maxSampleLocationGridSize[idx].height;
2087 init_driver_workarounds(struct zink_screen *screen)
2090 screen->driver_workarounds.implicit_sync = true;
2091 switch (screen->info.driver_props.driverID) {
2099 screen->driver_workarounds.implicit_sync = false;
2105 screen->driver_workarounds.color_write_missing =
2106 !screen->info.have_EXT_color_write_enable ||
2107 !screen->info.cwrite_feats.colorWriteEnable;
2109 screen->driver_workarounds.depth_clip_control_missing = !screen->info.have_EXT_depth_clip_control;
2110 if (screen->info.driver_props.driverID == VK_DRIVER_ID_AMD_PROPRIETARY)
2112 screen->info.have_EXT_extended_dynamic_state2 = false;
2113 if (screen->info.driver_props.driverID == VK_DRIVER_ID_MESA_TURNIP) {
2115 screen->info.border_color_feats.customBorderColorWithoutFormat = VK_FALSE;
2117 if (screen->info.driver_props.driverID == VK_DRIVER_ID_AMD_OPEN_SOURCE ||
2118 screen->info.driver_props.driverID == VK_DRIVER_ID_AMD_PROPRIETARY ||
2119 screen->info.driver_props.driverID == VK_DRIVER_ID_NVIDIA_PROPRIETARY ||
2120 screen->info.driver_props.driverID == VK_DRIVER_ID_MESA_RADV)
2121 screen->driver_workarounds.z24_unscaled_bias = 1<<23;
2123 screen->driver_workarounds.z24_unscaled_bias = 1<<24;
2124 if (screen->info.driver_props.driverID == VK_DRIVER_ID_NVIDIA_PROPRIETARY)
2125 screen->driver_workarounds.z16_unscaled_bias = 1<<15;
2127 screen->driver_workarounds.z16_unscaled_bias = 1<<16;
2138 struct zink_screen *screen = rzalloc(NULL, struct zink_screen);
2139 if (!screen)
2142 screen->threaded = util_get_cpu_caps()->nr_cpus > 1 && debug_get_bool_option("GALLIUM_THREAD", util_get_cpu_caps()->nr_cpus > 1);
2143 screen->abort_on_hang = debug_get_bool_option("ZINK_HANG_ABORT", false);
2152 screen->loader_lib = util_dl_open(VK_LIBNAME);
2153 if (!screen->loader_lib)
2156 screen->vk_GetInstanceProcAddr = (PFN_vkGetInstanceProcAddr)util_dl_get_proc_address(screen->loader_lib, "vkGetInstanceProcAddr");
2157 screen->vk_GetDeviceProcAddr = (PFN_vkGetDeviceProcAddr)util_dl_get_proc_address(screen->loader_lib, "vkGetDeviceProcAddr");
2158 if (!screen->vk_GetInstanceProcAddr ||
2159 !screen->vk_GetDeviceProcAddr)
2162 screen->instance_info.loader_version = zink_get_loader_version(screen);
2167 screen->driconf.dual_color_blend_by_location = driQueryOptionb(config->options, "dual_color_blend_by_location");
2168 //screen->driconf.inline_uniforms = driQueryOptionb(config->options, "radeonsi_inline_uniforms");
2169 screen->instance_info.disable_xcb_surface = driQueryOptionb(config->options, "disable_xcb_surface");
2173 if (!zink_create_instance(screen))
2176 vk_instance_dispatch_table_load(&screen->vk.instance,
2177 screen->vk_GetInstanceProcAddr,
2178 screen->instance);
2179 vk_physical_device_dispatch_table_load(&screen->vk.physical_device,
2180 screen->vk_GetInstanceProcAddr,
2181 screen->instance);
2183 zink_verify_instance_extensions(screen);
2185 if (screen->instance_info.have_EXT_debug_utils &&
2186 (zink_debug & ZINK_DEBUG_VALIDATION) && !create_debug(screen))
2189 screen->is_cpu = choose_pdev(screen);
2190 if (screen->pdev == VK_NULL_HANDLE)
2193 update_queue_props(screen);
2195 screen->have_X8_D24_UNORM_PACK32 = zink_is_depth_format_supported(screen,
2197 screen->have_D24_UNORM_S8_UINT = zink_is_depth_format_supported(screen,
2199 screen->have_D32_SFLOAT_S8_UINT = zink_is_depth_format_supported(screen,
2202 if (!zink_get_physical_device_info(screen)) {
2207 if (screen->threaded && !util_queue_init(&screen->flush_queue, "zfq", 8, 1, UTIL_QUEUE_INIT_RESIZE_IF_FULL, screen)) {
2212 zink_internal_setup_moltenvk(screen);
2213 if (!screen->info.have_KHR_timeline_semaphore) {
2218 init_driver_workarounds(screen);
2220 screen->dev = zink_create_logical_device(screen);
2221 if (!screen->dev)
2224 vk_device_dispatch_table_load(&screen->vk.device,
2225 screen->vk_GetDeviceProcAddr,
2226 screen->dev);
2228 init_queue(screen);
2229 if (screen->info.driver_props.driverID == VK_DRIVER_ID_MESA_RADV ||
2230 screen->info.driver_props.driverID == VK_DRIVER_ID_AMD_OPEN_SOURCE ||
2231 screen->info.driver_props.driverID == VK_DRIVER_ID_AMD_PROPRIETARY)
2233 screen->info.have_KHR_push_descriptor = false;
2235 zink_verify_device_extensions(screen);
2238 screen->info.props.limits.maxBoundDescriptorSets < ZINK_MAX_DESCRIPTOR_SETS) {
2239 screen->desc_set_id[ZINK_DESCRIPTOR_TYPES] = 0;
2240 screen->desc_set_id[ZINK_DESCRIPTOR_TYPE_UBO] = 1;
2241 screen->desc_set_id[ZINK_DESCRIPTOR_TYPE_SSBO] = 1;
2242 screen->desc_set_id[ZINK_DESCRIPTOR_TYPE_SAMPLER_VIEW] = 2;
2243 screen->desc_set_id[ZINK_DESCRIPTOR_TYPE_IMAGE] = 2;
2244 screen->desc_set_id[ZINK_DESCRIPTOR_BINDLESS] = 3;
2245 screen->compact_descriptors = true;
2247 screen->desc_set_id[ZINK_DESCRIPTOR_TYPES] = 0;
2248 screen->desc_set_id[ZINK_DESCRIPTOR_TYPE_UBO] = 1;
2249 screen->desc_set_id[ZINK_DESCRIPTOR_TYPE_SAMPLER_VIEW] = 2;
2250 screen->desc_set_id[ZINK_DESCRIPTOR_TYPE_SSBO] = 3;
2251 screen->desc_set_id[ZINK_DESCRIPTOR_TYPE_IMAGE] = 4;
2252 screen->desc_set_id[ZINK_DESCRIPTOR_BINDLESS] = 5;
2255 if (screen->info.have_KHR_descriptor_update_template)
2261 if (screen->info.have_EXT_calibrated_timestamps && !check_have_device_time(screen))
2264 screen->have_triangle_fans = true;
2266 if (screen->info.have_KHR_portability_subset) {
2267 screen->have_triangle_fans = (VK_TRUE == screen->info.portability_subset_feats.triangleFans);
2271 check_base_requirements(screen);
2272 util_live_shader_cache_init(&screen->shaders, zink_create_gfx_shader_state, zink_delete_shader_state);
2274 screen->base.get_name = zink_get_name;
2275 if (screen->instance_info.have_KHR_external_memory_capabilities) {
2276 screen->base.get_device_uuid = zink_get_device_uuid;
2277 screen->base.get_driver_uuid = zink_get_driver_uuid;
2279 if (screen->info.have_KHR_external_memory_win32) {
2280 screen->base.get_device_luid = zink_get_device_luid;
2281 screen->base.get_device_node_mask = zink_get_device_node_mask;
2283 screen->base.get_vendor = zink_get_vendor;
2284 screen->base.get_device_vendor = zink_get_device_vendor;
2285 screen->base.get_compute_param = zink_get_compute_param;
2286 screen->base.get_timestamp = zink_get_timestamp;
2287 screen->base.query_memory_info = zink_query_memory_info;
2288 screen->base.get_param = zink_get_param;
2289 screen->base.get_paramf = zink_get_paramf;
2290 screen->base.get_shader_param = zink_get_shader_param;
2291 screen->base.get_compiler_options = zink_get_compiler_options;
2292 screen->base.get_sample_pixel_grid = zink_get_sample_pixel_grid;
2293 screen->base.is_compute_copy_faster = zink_is_compute_copy_faster;
2294 screen->base.is_format_supported = zink_is_format_supported;
2295 if (screen->info.have_EXT_image_drm_format_modifier && screen->info.have_EXT_external_memory_dma_buf) {
2296 screen->base.query_dmabuf_modifiers = zink_query_dmabuf_modifiers;
2297 screen->base.is_dmabuf_modifier_supported = zink_is_dmabuf_modifier_supported;
2298 screen->base.get_dmabuf_modifier_planes = zink_get_dmabuf_modifier_planes;
2301 if (screen->info.have_KHR_external_memory_win32)
2302 screen->base.create_fence_win32 = zink_create_fence_win32;
2304 screen->base.context_create = zink_context_create;
2305 screen->base.flush_frontbuffer = zink_flush_frontbuffer;
2306 screen->base.destroy = zink_destroy_screen;
2307 screen->base.finalize_nir = zink_shader_finalize;
2308 screen->base.get_sparse_texture_virtual_page_size = zink_get_sparse_texture_virtual_page_size;
2310 if (screen->info.have_EXT_sample_locations) {
2314 for (unsigned i = 0; i < ARRAY_SIZE(screen->maxSampleLocationGridSize); i++) {
2315 if (screen->info.sample_locations_props.sampleLocationSampleCounts & (1 << i)) {
2316 VKSCR(GetPhysicalDeviceMultisamplePropertiesEXT)(screen->pdev, 1 << i, &prop);
2317 screen->maxSampleLocationGridSize[i] = prop.maxSampleLocationGridSize;
2322 if (!zink_screen_resource_init(&screen->base))
2324 zink_bo_init(screen);
2325 zink_screen_fence_init(&screen->base);
2327 zink_screen_init_compiler(screen);
2328 if (!disk_cache_init(screen))
2330 populate_format_props(screen);
2331 pre_hash_descriptor_states(screen);
2333 slab_create_parent(&screen->transfer_pool, sizeof(struct zink_transfer), 16);
2335 screen->driconf.inline_uniforms = debug_get_bool_option("ZINK_INLINE_UNIFORMS", screen->is_cpu);
2337 screen->total_video_mem = get_video_mem(screen);
2338 screen->clamp_video_mem = screen->total_video_mem * 0.8;
2339 if (!os_get_total_physical_memory(&screen->total_mem))
2342 if (!zink_screen_init_semaphore(screen)) {
2347 memset(&screen->heap_map, UINT8_MAX, sizeof(screen->heap_map));
2349 for (unsigned j = 0; j < screen->info.mem_props.memoryTypeCount; j++) {
2351 if ((screen->info.mem_props.memoryTypes[j].propertyFlags & domains) == domains) {
2352 assert(screen->heap_map[i] == UINT8_MAX);
2353 screen->heap_map[i] = j;
2359 if (screen->heap_map[i] == UINT8_MAX) {
2364 screen->heap_map[i] = screen->heap_map[ZINK_HEAP_HOST_VISIBLE_COHERENT];
2366 screen->heap_map[i] = screen->heap_map[ZINK_HEAP_DEVICE_LOCAL];
2368 screen->heap_flags[i] = screen->info.mem_props.memoryTypes[screen->heap_map[i]].propertyFlags;
2371 unsigned vis_vram = screen->heap_map[ZINK_HEAP_DEVICE_LOCAL_VISIBLE];
2372 unsigned vram = screen->heap_map[ZINK_HEAP_DEVICE_LOCAL];
2374 if (screen->info.mem_props.memoryHeaps[screen->info.mem_props.memoryTypes[vis_vram].heapIndex].size >
2375 screen->info.mem_props.memoryHeaps[screen->info.mem_props.memoryTypes[vram].heapIndex].size * 0.9)
2376 screen->resizable_bar = true;
2379 simple_mtx_init(&screen->dt_lock, mtx_plain);
2381 zink_screen_init_descriptor_funcs(screen, false);
2382 util_idalloc_mt_init_tc(&screen->buffer_ids);
2384 util_vertex_state_cache_init(&screen->vertex_state_cache,
2386 screen->base.create_vertex_state = zink_cache_create_vertex_state;
2387 screen->base.vertex_state_destroy = zink_cache_vertex_state_destroy;
2390 screen->copy_context = zink_context(screen->base.context_create(&screen->base, NULL, ZINK_CONTEXT_COPY_ONLY));
2391 if (!screen->copy_context) {
2396 return screen;
2399 if (screen->loader_lib)
2400 util_dl_close(screen->loader_lib);
2401 if (screen->threaded)
2402 util_queue_destroy(&screen->flush_queue);
2404 ralloc_free(screen);