From 040a0fcf421564ab6371aac735bcaff29f7be132 Mon Sep 17 00:00:00 2001 From: Konstantin Seurer Date: Fri, 11 Aug 2023 12:55:05 +0200 Subject: [PATCH] lavapipe: Use common physical device properties Acked-by: Mike Blumenkrantz Part-of: --- src/gallium/frontends/lavapipe/lvp_device.c | 887 +++++++++++---------------- src/gallium/frontends/lavapipe/lvp_private.h | 2 - 2 files changed, 356 insertions(+), 533 deletions(-) diff --git a/src/gallium/frontends/lavapipe/lvp_device.c b/src/gallium/frontends/lavapipe/lvp_device.c index 43a9877..92eda7f 100644 --- a/src/gallium/frontends/lavapipe/lvp_device.c +++ b/src/gallium/frontends/lavapipe/lvp_device.c @@ -587,42 +587,38 @@ lvp_get_features(const struct lvp_physical_device *pdevice, }; } -static VkResult VKAPI_CALL -lvp_physical_device_init(struct lvp_physical_device *device, - struct lvp_instance *instance, - struct pipe_loader_device *pld) -{ - VkResult result; - - struct vk_physical_device_dispatch_table dispatch_table; - vk_physical_device_dispatch_table_from_entrypoints( - &dispatch_table, &lvp_physical_device_entrypoints, true); - vk_physical_device_dispatch_table_from_entrypoints( - &dispatch_table, &wsi_physical_device_entrypoints, false); - result = vk_physical_device_init(&device->vk, &instance->vk, - NULL, NULL, NULL, &dispatch_table); - if (result != VK_SUCCESS) { - vk_error(instance, result); - goto fail; - } - device->pld = pld; - - device->pscreen = pipe_loader_create_screen_vk(device->pld, true); - if (!device->pscreen) - return vk_error(instance, VK_ERROR_OUT_OF_HOST_MEMORY); - for (unsigned i = 0; i < ARRAY_SIZE(device->drv_options); i++) - device->drv_options[i] = device->pscreen->get_compiler_options(device->pscreen, PIPE_SHADER_IR_NIR, i); - - device->sync_timeline_type = vk_sync_timeline_get_type(&lvp_pipe_sync_type); - device->sync_types[0] = &lvp_pipe_sync_type; - device->sync_types[1] = &device->sync_timeline_type.sync; - device->sync_types[2] = NULL; - device->vk.supported_sync_types = device->sync_types; +extern unsigned lp_native_vector_width; - device->max_images = device->pscreen->get_shader_param(device->pscreen, MESA_SHADER_FRAGMENT, PIPE_SHADER_CAP_MAX_SHADER_IMAGES); - device->vk.supported_extensions = lvp_device_extensions_supported; - lvp_get_features(device, &device->vk.supported_features); +static VkImageLayout lvp_host_copy_image_layouts[] = { + VK_IMAGE_LAYOUT_UNDEFINED, + VK_IMAGE_LAYOUT_GENERAL, + VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, + VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, + VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, + VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, + VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + VK_IMAGE_LAYOUT_PREINITIALIZED, + VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL, + VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL, + VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL, + VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, + VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL, + VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL, + VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL, + VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL, + VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, + VK_IMAGE_LAYOUT_VIDEO_DECODE_DST_KHR, + VK_IMAGE_LAYOUT_VIDEO_DECODE_SRC_KHR, + VK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR, + VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR, + VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT, + VK_IMAGE_LAYOUT_FRAGMENT_SHADING_RATE_ATTACHMENT_OPTIMAL_KHR, +}; +static void +lvp_get_properties(const struct lvp_physical_device *device, struct vk_properties *p) +{ VkSampleCountFlags sample_counts = VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT; uint64_t grid_size[3], block_size[3]; @@ -640,7 +636,16 @@ lvp_physical_device_init(struct lvp_physical_device *device, &max_local_size); const uint64_t max_render_targets = device->pscreen->get_param(device->pscreen, PIPE_CAP_MAX_RENDER_TARGETS); - device->device_limits = (VkPhysicalDeviceLimits) { + + int texel_buffer_alignment = device->pscreen->get_param(device->pscreen, PIPE_CAP_TEXTURE_BUFFER_OFFSET_ALIGNMENT); + + *p = (struct vk_properties) { + /* Vulkan 1.0 */ + .apiVersion = LVP_API_VERSION, + .driverVersion = 1, + .vendorID = VK_VENDOR_ID_MESA, + .deviceID = 0, + .deviceType = VK_PHYSICAL_DEVICE_TYPE_CPU, .maxImageDimension1D = device->pscreen->get_param(device->pscreen, PIPE_CAP_MAX_TEXTURE_2D_SIZE), .maxImageDimension2D = device->pscreen->get_param(device->pscreen, PIPE_CAP_MAX_TEXTURE_2D_SIZE), .maxImageDimension3D = (1 << device->pscreen->get_param(device->pscreen, PIPE_CAP_MAX_TEXTURE_3D_LEVELS)), @@ -751,7 +756,323 @@ lvp_physical_device_init(struct lvp_physical_device *device, .optimalBufferCopyOffsetAlignment = 128, .optimalBufferCopyRowPitchAlignment = 128, .nonCoherentAtomSize = 64, + + /* Vulkan 1.1 */ + /* The LUID is for Windows. */ + .deviceLUIDValid = false, + .deviceNodeMask = 0, + + .subgroupSize = lp_native_vector_width / 32, + .subgroupSupportedStages = VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_COMPUTE_BIT | VK_SHADER_STAGE_TASK_BIT_EXT | VK_SHADER_STAGE_MESH_BIT_EXT, + .subgroupSupportedOperations = VK_SUBGROUP_FEATURE_BASIC_BIT | VK_SUBGROUP_FEATURE_VOTE_BIT | VK_SUBGROUP_FEATURE_ARITHMETIC_BIT | VK_SUBGROUP_FEATURE_BALLOT_BIT, + .subgroupQuadOperationsInAllStages = false, + + .pointClippingBehavior = VK_POINT_CLIPPING_BEHAVIOR_ALL_CLIP_PLANES, + .maxMultiviewViewCount = 6, + .maxMultiviewInstanceIndex = INT_MAX, + .protectedNoFault = false, + .maxPerSetDescriptors = MAX_DESCRIPTORS, + .maxMemoryAllocationSize = (1u << 31), + + /* Vulkan 1.2 */ + .driverID = VK_DRIVER_ID_MESA_LLVMPIPE, + + .conformanceVersion = (VkConformanceVersion){ + .major = 1, + .minor = 3, + .subminor = 1, + .patch = 1, + }, + + .denormBehaviorIndependence = VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_ALL, + .roundingModeIndependence = VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_ALL, + .shaderDenormFlushToZeroFloat16 = false, + .shaderDenormPreserveFloat16 = false, + .shaderRoundingModeRTEFloat16 = true, + .shaderRoundingModeRTZFloat16 = false, + .shaderSignedZeroInfNanPreserveFloat16 = true, + + .shaderDenormFlushToZeroFloat32 = false, + .shaderDenormPreserveFloat32 = false, + .shaderRoundingModeRTEFloat32 = true, + .shaderRoundingModeRTZFloat32 = false, + .shaderSignedZeroInfNanPreserveFloat32 = true, + + .shaderDenormFlushToZeroFloat64 = false, + .shaderDenormPreserveFloat64 = false, + .shaderRoundingModeRTEFloat64 = true, + .shaderRoundingModeRTZFloat64 = false, + .shaderSignedZeroInfNanPreserveFloat64 = true, + + .maxUpdateAfterBindDescriptorsInAllPools = UINT32_MAX, + .shaderUniformBufferArrayNonUniformIndexingNative = true, + .shaderSampledImageArrayNonUniformIndexingNative = true, + .shaderStorageBufferArrayNonUniformIndexingNative = true, + .shaderStorageImageArrayNonUniformIndexingNative = true, + .shaderInputAttachmentArrayNonUniformIndexingNative = true, + .robustBufferAccessUpdateAfterBind = true, + .quadDivergentImplicitLod = true, + .maxPerStageDescriptorUpdateAfterBindSamplers = MAX_DESCRIPTORS, + .maxPerStageDescriptorUpdateAfterBindUniformBuffers = MAX_DESCRIPTORS, + .maxPerStageDescriptorUpdateAfterBindStorageBuffers = MAX_DESCRIPTORS, + .maxPerStageDescriptorUpdateAfterBindSampledImages = MAX_DESCRIPTORS, + .maxPerStageDescriptorUpdateAfterBindStorageImages = MAX_DESCRIPTORS, + .maxPerStageDescriptorUpdateAfterBindInputAttachments = MAX_DESCRIPTORS, + .maxPerStageUpdateAfterBindResources = MAX_DESCRIPTORS, + .maxDescriptorSetUpdateAfterBindSamplers = MAX_DESCRIPTORS, + .maxDescriptorSetUpdateAfterBindUniformBuffers = MAX_DESCRIPTORS, + .maxDescriptorSetUpdateAfterBindUniformBuffersDynamic = MAX_DESCRIPTORS, + .maxDescriptorSetUpdateAfterBindStorageBuffers = MAX_DESCRIPTORS, + .maxDescriptorSetUpdateAfterBindStorageBuffersDynamic = MAX_DESCRIPTORS, + .maxDescriptorSetUpdateAfterBindSampledImages = MAX_DESCRIPTORS, + .maxDescriptorSetUpdateAfterBindStorageImages = MAX_DESCRIPTORS, + .maxDescriptorSetUpdateAfterBindInputAttachments = MAX_DESCRIPTORS, + + .supportedDepthResolveModes = VK_RESOLVE_MODE_SAMPLE_ZERO_BIT | VK_RESOLVE_MODE_AVERAGE_BIT, + .supportedStencilResolveModes = VK_RESOLVE_MODE_SAMPLE_ZERO_BIT, + .independentResolveNone = false, + .independentResolve = false, + + .filterMinmaxImageComponentMapping = true, + .filterMinmaxSingleComponentFormats = true, + + .maxTimelineSemaphoreValueDifference = UINT64_MAX, + .framebufferIntegerColorSampleCounts = VK_SAMPLE_COUNT_1_BIT, + + /* Vulkan 1.3 */ + .minSubgroupSize = lp_native_vector_width / 32, + .maxSubgroupSize = lp_native_vector_width / 32, + .maxComputeWorkgroupSubgroups = 32, + .requiredSubgroupSizeStages = VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_COMPUTE_BIT, + .maxInlineUniformTotalSize = MAX_DESCRIPTOR_UNIFORM_BLOCK_SIZE * MAX_PER_STAGE_DESCRIPTOR_UNIFORM_BLOCKS * MAX_SETS, + .maxInlineUniformBlockSize = MAX_DESCRIPTOR_UNIFORM_BLOCK_SIZE, + .maxPerStageDescriptorInlineUniformBlocks = MAX_PER_STAGE_DESCRIPTOR_UNIFORM_BLOCKS, + .maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks = MAX_PER_STAGE_DESCRIPTOR_UNIFORM_BLOCKS, + .maxDescriptorSetInlineUniformBlocks = MAX_PER_STAGE_DESCRIPTOR_UNIFORM_BLOCKS, + .maxDescriptorSetUpdateAfterBindInlineUniformBlocks = MAX_PER_STAGE_DESCRIPTOR_UNIFORM_BLOCKS, + .storageTexelBufferOffsetAlignmentBytes = texel_buffer_alignment, + .storageTexelBufferOffsetSingleTexelAlignment = true, + .uniformTexelBufferOffsetAlignmentBytes = texel_buffer_alignment, + .uniformTexelBufferOffsetSingleTexelAlignment = true, + .maxBufferSize = UINT32_MAX, + + /* VK_KHR_push_descriptor */ + .maxPushDescriptors = MAX_PUSH_DESCRIPTORS, + + /* VK_EXT_host_image_copy */ + .pCopySrcLayouts = lvp_host_copy_image_layouts, + .copySrcLayoutCount = ARRAY_SIZE(lvp_host_copy_image_layouts), + .pCopyDstLayouts = lvp_host_copy_image_layouts, + .copyDstLayoutCount = ARRAY_SIZE(lvp_host_copy_image_layouts), + .identicalMemoryTypeRequirements = VK_FALSE, + + /* VK_EXT_transform_feedback */ + .maxTransformFeedbackStreams = device->pscreen->get_param(device->pscreen, PIPE_CAP_MAX_VERTEX_STREAMS), + .maxTransformFeedbackBuffers = device->pscreen->get_param(device->pscreen, PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS), + .maxTransformFeedbackBufferSize = UINT32_MAX, + .maxTransformFeedbackStreamDataSize = 512, + .maxTransformFeedbackBufferDataSize = 512, + .maxTransformFeedbackBufferDataStride = 512, + .transformFeedbackQueries = true, + .transformFeedbackStreamsLinesTriangles = false, + .transformFeedbackRasterizationStreamSelect = false, + .transformFeedbackDraw = true, + + /* VK_KHR_maintenance5 */ + /* FIXME No idea about most of these ones. */ + .earlyFragmentMultisampleCoverageAfterSampleCounting = true, + .earlyFragmentSampleMaskTestBeforeSampleCounting = false, + .depthStencilSwizzleOneSupport = false, + .polygonModePointSize = true, /* This one is correct. */ + .nonStrictSinglePixelWideLinesUseParallelogram = false, + .nonStrictWideLinesUseParallelogram = false, + + /* VK_EXT_extended_dynamic_state3 */ + .dynamicPrimitiveTopologyUnrestricted = VK_TRUE, + + /* VK_EXT_line_rasterization */ + .lineSubPixelPrecisionBits = device->pscreen->get_param(device->pscreen, PIPE_CAP_RASTERIZER_SUBPIXEL_BITS), + + /* VK_NV_device_generated_commands */ + .maxGraphicsShaderGroupCount = 1<<12, + .maxIndirectSequenceCount = 1<<20, + .maxIndirectCommandsTokenCount = MAX_DGC_TOKENS, + .maxIndirectCommandsStreamCount = MAX_DGC_STREAMS, + .maxIndirectCommandsTokenOffset = 2047, + .maxIndirectCommandsStreamStride = 2048, + .minSequencesCountBufferOffsetAlignment = 4, + .minSequencesIndexBufferOffsetAlignment = 4, + .minIndirectCommandsBufferOffsetAlignment = 4, + + /* VK_EXT_external_memory_host */ + .minImportedHostPointerAlignment = 4096, + + /* VK_EXT_custom_border_color */ + .maxCustomBorderColorSamplers = 32 * 1024, + + /* VK_EXT_provoking_vertex */ + .provokingVertexModePerPipeline = true, + .transformFeedbackPreservesTriangleFanProvokingVertex = true, + + /* VK_EXT_multi_draw */ + .maxMultiDrawCount = 2048, + + /* VK_EXT_descriptor_buffer */ + .combinedImageSamplerDescriptorSingleArray = VK_TRUE, + .bufferlessPushDescriptors = VK_TRUE, + .descriptorBufferOffsetAlignment = 4, + .maxDescriptorBufferBindings = MAX_SETS, + .maxResourceDescriptorBufferBindings = MAX_SETS, + .maxSamplerDescriptorBufferBindings = MAX_SETS, + .maxEmbeddedImmutableSamplerBindings = MAX_SETS, + .maxEmbeddedImmutableSamplers = 2032, + .bufferCaptureReplayDescriptorDataSize = 0, + .imageCaptureReplayDescriptorDataSize = 0, + .imageViewCaptureReplayDescriptorDataSize = 0, + .samplerCaptureReplayDescriptorDataSize = 0, + .accelerationStructureCaptureReplayDescriptorDataSize = 0, + .samplerDescriptorSize = sizeof(struct lp_descriptor), + .combinedImageSamplerDescriptorSize = sizeof(struct lp_descriptor), + .sampledImageDescriptorSize = sizeof(struct lp_descriptor), + .storageImageDescriptorSize = sizeof(struct lp_descriptor), + .uniformTexelBufferDescriptorSize = sizeof(struct lp_descriptor), + .robustUniformTexelBufferDescriptorSize = sizeof(struct lp_descriptor), + .storageTexelBufferDescriptorSize = sizeof(struct lp_descriptor), + .robustStorageTexelBufferDescriptorSize = sizeof(struct lp_descriptor), + .uniformBufferDescriptorSize = sizeof(struct lp_descriptor), + .robustUniformBufferDescriptorSize = sizeof(struct lp_descriptor), + .storageBufferDescriptorSize = sizeof(struct lp_descriptor), + .robustStorageBufferDescriptorSize = sizeof(struct lp_descriptor), + .inputAttachmentDescriptorSize = sizeof(struct lp_descriptor), + .accelerationStructureDescriptorSize = 0, + .maxSamplerDescriptorBufferRange = 1<<27, //spec minimum + .maxResourceDescriptorBufferRange = 1<<27, //spec minimum + .resourceDescriptorBufferAddressSpaceSize = 1<<27, //spec minimum + .samplerDescriptorBufferAddressSpaceSize = 1<<27, //spec minimum + .descriptorBufferAddressSpaceSize = 1<<27, //spec minimum + + /* VK_EXT_graphics_pipeline_library */ + .graphicsPipelineLibraryFastLinking = VK_TRUE, + .graphicsPipelineLibraryIndependentInterpolationDecoration = VK_TRUE, + + /* VK_EXT_robustness2 */ + .robustStorageBufferAccessSizeAlignment = 1, + .robustUniformBufferAccessSizeAlignment = 1, + + /* VK_EXT_mesh_shader */ + .maxTaskWorkGroupTotalCount = 4194304, + .maxTaskWorkGroupCount[0] = 65536, + .maxTaskWorkGroupCount[1] = 65536, + .maxTaskWorkGroupCount[2] = 65536, + .maxTaskWorkGroupInvocations = 1024, + .maxTaskWorkGroupSize[0] = 1024, + .maxTaskWorkGroupSize[1] = 1024, + .maxTaskWorkGroupSize[2] = 1024, + .maxTaskPayloadSize = 16384, + .maxTaskSharedMemorySize = 32768, + .maxTaskPayloadAndSharedMemorySize = 32768, + + .maxMeshWorkGroupTotalCount = 4194304, + .maxMeshWorkGroupCount[0] = 65536, + .maxMeshWorkGroupCount[1] = 65536, + .maxMeshWorkGroupCount[2] = 65536, + .maxMeshWorkGroupInvocations = 1024, + .maxMeshWorkGroupSize[0] = 1024, + .maxMeshWorkGroupSize[1] = 1024, + .maxMeshWorkGroupSize[2] = 1024, + .maxMeshOutputMemorySize = 32768, /* 32K min required */ + .maxMeshSharedMemorySize = 28672, /* 28K min required */ + .maxMeshOutputComponents = 128, /* 32x vec4 min required */ + .maxMeshOutputVertices = 256, + .maxMeshOutputPrimitives = 256, + .maxMeshOutputLayers = 8, + .meshOutputPerVertexGranularity = 1, + .meshOutputPerPrimitiveGranularity = 1, + .maxPreferredTaskWorkGroupInvocations = 64, + .maxPreferredMeshWorkGroupInvocations = 128, + .prefersLocalInvocationVertexOutput = true, + .prefersLocalInvocationPrimitiveOutput = true, + .prefersCompactVertexOutput = true, + .prefersCompactPrimitiveOutput = false, }; + + /* Vulkan 1.0 */ + strcpy(p->deviceName, device->pscreen->get_name(device->pscreen)); + lvp_device_get_cache_uuid(p->pipelineCacheUUID); + + /* Vulkan 1.1 */ + device->pscreen->get_device_uuid(device->pscreen, (char*)(p->deviceUUID)); + device->pscreen->get_driver_uuid(device->pscreen, (char*)(p->driverUUID)); + memset(p->deviceLUID, 0, VK_LUID_SIZE); + +#if LLVM_VERSION_MAJOR >= 10 + p->subgroupSupportedOperations |= VK_SUBGROUP_FEATURE_SHUFFLE_BIT | VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT | VK_SUBGROUP_FEATURE_QUAD_BIT; +#endif + + /* Vulkan 1.2 */ + snprintf(p->driverName, VK_MAX_DRIVER_NAME_SIZE, "llvmpipe"); + snprintf(p->driverInfo, VK_MAX_DRIVER_INFO_SIZE, "Mesa " PACKAGE_VERSION MESA_GIT_SHA1 +#ifdef MESA_LLVM_VERSION_STRING + " (LLVM " MESA_LLVM_VERSION_STRING ")" +#endif + ); + + /* VK_EXT_host_image_copy */ + lvp_device_get_cache_uuid(p->optimalTilingLayoutUUID); + + /* VK_EXT_vertex_attribute_divisor */ + if (device->pscreen->get_param(device->pscreen, PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR) != 0) + p->maxVertexAttribDivisor = UINT32_MAX; + else + p->maxVertexAttribDivisor = 1; + + /* VK_EXT_shader_object */ + /* this is basically unsupported */ + lvp_device_get_cache_uuid(p->shaderBinaryUUID); + p->shaderBinaryVersion = 1; + + /* VK_EXT_mesh_shader */ + p->maxMeshPayloadAndSharedMemorySize = p->maxTaskPayloadSize + p->maxMeshSharedMemorySize; /* 28K min required */ + p->maxMeshPayloadAndOutputMemorySize = p->maxTaskPayloadSize + p->maxMeshOutputMemorySize; /* 47K min required */ +} + +static VkResult VKAPI_CALL +lvp_physical_device_init(struct lvp_physical_device *device, + struct lvp_instance *instance, + struct pipe_loader_device *pld) +{ + VkResult result; + + struct vk_physical_device_dispatch_table dispatch_table; + vk_physical_device_dispatch_table_from_entrypoints( + &dispatch_table, &lvp_physical_device_entrypoints, true); + vk_physical_device_dispatch_table_from_entrypoints( + &dispatch_table, &wsi_physical_device_entrypoints, false); + result = vk_physical_device_init(&device->vk, &instance->vk, + NULL, NULL, NULL, &dispatch_table); + if (result != VK_SUCCESS) { + vk_error(instance, result); + goto fail; + } + device->pld = pld; + + device->pscreen = pipe_loader_create_screen_vk(device->pld, true); + if (!device->pscreen) + return vk_error(instance, VK_ERROR_OUT_OF_HOST_MEMORY); + for (unsigned i = 0; i < ARRAY_SIZE(device->drv_options); i++) + device->drv_options[i] = device->pscreen->get_compiler_options(device->pscreen, PIPE_SHADER_IR_NIR, i); + + device->sync_timeline_type = vk_sync_timeline_get_type(&lvp_pipe_sync_type); + device->sync_types[0] = &lvp_pipe_sync_type; + device->sync_types[1] = &device->sync_timeline_type.sync; + device->sync_types[2] = NULL; + device->vk.supported_sync_types = device->sync_types; + + device->max_images = device->pscreen->get_shader_param(device->pscreen, MESA_SHADER_FRAGMENT, PIPE_SHADER_CAP_MAX_SHADER_IMAGES); + device->vk.supported_extensions = lvp_device_extensions_supported; + lvp_get_features(device, &device->vk.supported_features); + lvp_get_properties(device, &device->vk.properties); + result = lvp_init_wsi(device); if (result != VK_SUCCESS) { vk_physical_device_finish(&device->vk); @@ -917,502 +1238,6 @@ lvp_device_get_cache_uuid(void *uuid) memcpy(uuid, PACKAGE_VERSION, strlen(PACKAGE_VERSION)); } -VKAPI_ATTR void VKAPI_CALL lvp_GetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, - VkPhysicalDeviceProperties *pProperties) -{ - LVP_FROM_HANDLE(lvp_physical_device, pdevice, physicalDevice); - - *pProperties = (VkPhysicalDeviceProperties) { - .apiVersion = LVP_API_VERSION, - .driverVersion = 1, - .vendorID = VK_VENDOR_ID_MESA, - .deviceID = 0, - .deviceType = VK_PHYSICAL_DEVICE_TYPE_CPU, - .limits = pdevice->device_limits, - .sparseProperties = {0}, - }; - - strcpy(pProperties->deviceName, pdevice->pscreen->get_name(pdevice->pscreen)); - lvp_device_get_cache_uuid(pProperties->pipelineCacheUUID); - -} - -extern unsigned lp_native_vector_width; -static void -lvp_get_physical_device_properties_1_1(struct lvp_physical_device *pdevice, - VkPhysicalDeviceVulkan11Properties *p) -{ - assert(p->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES); - - pdevice->pscreen->get_device_uuid(pdevice->pscreen, (char*)(p->deviceUUID)); - pdevice->pscreen->get_driver_uuid(pdevice->pscreen, (char*)(p->driverUUID)); - memset(p->deviceLUID, 0, VK_LUID_SIZE); - /* The LUID is for Windows. */ - p->deviceLUIDValid = false; - p->deviceNodeMask = 0; - - p->subgroupSize = lp_native_vector_width / 32; - p->subgroupSupportedStages = VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_COMPUTE_BIT | VK_SHADER_STAGE_TASK_BIT_EXT | VK_SHADER_STAGE_MESH_BIT_EXT; - p->subgroupSupportedOperations = VK_SUBGROUP_FEATURE_BASIC_BIT | VK_SUBGROUP_FEATURE_VOTE_BIT | VK_SUBGROUP_FEATURE_ARITHMETIC_BIT | VK_SUBGROUP_FEATURE_BALLOT_BIT; - p->subgroupQuadOperationsInAllStages = false; - -#if LLVM_VERSION_MAJOR >= 10 - p->subgroupSupportedOperations |= VK_SUBGROUP_FEATURE_SHUFFLE_BIT | VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT | VK_SUBGROUP_FEATURE_QUAD_BIT; -#endif - - p->pointClippingBehavior = VK_POINT_CLIPPING_BEHAVIOR_ALL_CLIP_PLANES; - p->maxMultiviewViewCount = 6; - p->maxMultiviewInstanceIndex = INT_MAX; - p->protectedNoFault = false; - p->maxPerSetDescriptors = MAX_DESCRIPTORS; - p->maxMemoryAllocationSize = (1u << 31); -} - -static void -lvp_get_physical_device_properties_1_2(struct lvp_physical_device *pdevice, - VkPhysicalDeviceVulkan12Properties *p) -{ - p->driverID = VK_DRIVER_ID_MESA_LLVMPIPE; - snprintf(p->driverName, VK_MAX_DRIVER_NAME_SIZE, "llvmpipe"); - snprintf(p->driverInfo, VK_MAX_DRIVER_INFO_SIZE, "Mesa " PACKAGE_VERSION MESA_GIT_SHA1 -#ifdef MESA_LLVM_VERSION_STRING - " (LLVM " MESA_LLVM_VERSION_STRING ")" -#endif - ); - - p->conformanceVersion = (VkConformanceVersion){ - .major = 1, - .minor = 3, - .subminor = 1, - .patch = 1, - }; - - p->denormBehaviorIndependence = VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_ALL; - p->roundingModeIndependence = VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_ALL; - p->shaderDenormFlushToZeroFloat16 = false; - p->shaderDenormPreserveFloat16 = false; - p->shaderRoundingModeRTEFloat16 = true; - p->shaderRoundingModeRTZFloat16 = false; - p->shaderSignedZeroInfNanPreserveFloat16 = true; - - p->shaderDenormFlushToZeroFloat32 = false; - p->shaderDenormPreserveFloat32 = false; - p->shaderRoundingModeRTEFloat32 = true; - p->shaderRoundingModeRTZFloat32 = false; - p->shaderSignedZeroInfNanPreserveFloat32 = true; - - p->shaderDenormFlushToZeroFloat64 = false; - p->shaderDenormPreserveFloat64 = false; - p->shaderRoundingModeRTEFloat64 = true; - p->shaderRoundingModeRTZFloat64 = false; - p->shaderSignedZeroInfNanPreserveFloat64 = true; - - p->maxUpdateAfterBindDescriptorsInAllPools = UINT32_MAX; - p->shaderUniformBufferArrayNonUniformIndexingNative = true; - p->shaderSampledImageArrayNonUniformIndexingNative = true; - p->shaderStorageBufferArrayNonUniformIndexingNative = true; - p->shaderStorageImageArrayNonUniformIndexingNative = true; - p->shaderInputAttachmentArrayNonUniformIndexingNative = true; - p->robustBufferAccessUpdateAfterBind = true; - p->quadDivergentImplicitLod = true; - p->maxPerStageDescriptorUpdateAfterBindSamplers = MAX_DESCRIPTORS; - p->maxPerStageDescriptorUpdateAfterBindUniformBuffers = MAX_DESCRIPTORS; - p->maxPerStageDescriptorUpdateAfterBindStorageBuffers = MAX_DESCRIPTORS; - p->maxPerStageDescriptorUpdateAfterBindSampledImages = MAX_DESCRIPTORS; - p->maxPerStageDescriptorUpdateAfterBindStorageImages = MAX_DESCRIPTORS; - p->maxPerStageDescriptorUpdateAfterBindInputAttachments = MAX_DESCRIPTORS; - p->maxPerStageUpdateAfterBindResources = MAX_DESCRIPTORS; - p->maxDescriptorSetUpdateAfterBindSamplers = MAX_DESCRIPTORS; - p->maxDescriptorSetUpdateAfterBindUniformBuffers = MAX_DESCRIPTORS; - p->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic = MAX_DESCRIPTORS; - p->maxDescriptorSetUpdateAfterBindStorageBuffers = MAX_DESCRIPTORS; - p->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic = MAX_DESCRIPTORS; - p->maxDescriptorSetUpdateAfterBindSampledImages = MAX_DESCRIPTORS; - p->maxDescriptorSetUpdateAfterBindStorageImages = MAX_DESCRIPTORS; - p->maxDescriptorSetUpdateAfterBindInputAttachments = MAX_DESCRIPTORS; - - p->supportedDepthResolveModes = VK_RESOLVE_MODE_SAMPLE_ZERO_BIT | VK_RESOLVE_MODE_AVERAGE_BIT; - p->supportedStencilResolveModes = VK_RESOLVE_MODE_SAMPLE_ZERO_BIT; - p->independentResolveNone = false; - p->independentResolve = false; - - p->filterMinmaxImageComponentMapping = true; - p->filterMinmaxSingleComponentFormats = true; - - p->maxTimelineSemaphoreValueDifference = UINT64_MAX; - p->framebufferIntegerColorSampleCounts = VK_SAMPLE_COUNT_1_BIT; -} - -static void -lvp_get_physical_device_properties_1_3(struct lvp_physical_device *pdevice, - VkPhysicalDeviceVulkan13Properties *p) -{ - p->minSubgroupSize = lp_native_vector_width / 32; - p->maxSubgroupSize = lp_native_vector_width / 32; - p->maxComputeWorkgroupSubgroups = 32; - p->requiredSubgroupSizeStages = VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_COMPUTE_BIT; - p->maxInlineUniformTotalSize = MAX_DESCRIPTOR_UNIFORM_BLOCK_SIZE * MAX_PER_STAGE_DESCRIPTOR_UNIFORM_BLOCKS * MAX_SETS; - p->maxInlineUniformBlockSize = MAX_DESCRIPTOR_UNIFORM_BLOCK_SIZE; - p->maxPerStageDescriptorInlineUniformBlocks = MAX_PER_STAGE_DESCRIPTOR_UNIFORM_BLOCKS; - p->maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks = MAX_PER_STAGE_DESCRIPTOR_UNIFORM_BLOCKS; - p->maxDescriptorSetInlineUniformBlocks = MAX_PER_STAGE_DESCRIPTOR_UNIFORM_BLOCKS; - p->maxDescriptorSetUpdateAfterBindInlineUniformBlocks = MAX_PER_STAGE_DESCRIPTOR_UNIFORM_BLOCKS; - int alignment = pdevice->pscreen->get_param(pdevice->pscreen, PIPE_CAP_TEXTURE_BUFFER_OFFSET_ALIGNMENT); - p->storageTexelBufferOffsetAlignmentBytes = alignment; - p->storageTexelBufferOffsetSingleTexelAlignment = true; - p->uniformTexelBufferOffsetAlignmentBytes = alignment; - p->uniformTexelBufferOffsetSingleTexelAlignment = true; - p->maxBufferSize = UINT32_MAX; -} - -VKAPI_ATTR void VKAPI_CALL lvp_GetPhysicalDeviceProperties2( - VkPhysicalDevice physicalDevice, - VkPhysicalDeviceProperties2 *pProperties) -{ - LVP_FROM_HANDLE(lvp_physical_device, pdevice, physicalDevice); - lvp_GetPhysicalDeviceProperties(physicalDevice, &pProperties->properties); - - VkPhysicalDeviceVulkan11Properties core_1_1 = { - .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, - }; - lvp_get_physical_device_properties_1_1(pdevice, &core_1_1); - - VkPhysicalDeviceVulkan12Properties core_1_2 = { - .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, - }; - lvp_get_physical_device_properties_1_2(pdevice, &core_1_2); - - VkPhysicalDeviceVulkan13Properties core_1_3 = { - .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES, - }; - lvp_get_physical_device_properties_1_3(pdevice, &core_1_3); - - vk_foreach_struct(ext, pProperties->pNext) { - - if (vk_get_physical_device_core_1_1_property_ext(ext, &core_1_1)) - continue; - if (vk_get_physical_device_core_1_2_property_ext(ext, &core_1_2)) - continue; - if (vk_get_physical_device_core_1_3_property_ext(ext, &core_1_3)) - continue; - switch (ext->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR: { - VkPhysicalDevicePushDescriptorPropertiesKHR *properties = - (VkPhysicalDevicePushDescriptorPropertiesKHR *) ext; - properties->maxPushDescriptors = MAX_PUSH_DESCRIPTORS; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_PROPERTIES: { - VkPhysicalDeviceShaderIntegerDotProductProperties *properties = - (VkPhysicalDeviceShaderIntegerDotProductProperties *) ext; - void *pnext = properties->pNext; - memset(properties, 0, sizeof(VkPhysicalDeviceShaderIntegerDotProductProperties)); - properties->sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_PROPERTIES; - properties->pNext = pnext; - break; - } - 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_HOST_IMAGE_COPY_PROPERTIES_EXT: { - VkPhysicalDeviceHostImageCopyPropertiesEXT *props = - (VkPhysicalDeviceHostImageCopyPropertiesEXT *)ext; - VkImageLayout layouts[] = { - VK_IMAGE_LAYOUT_UNDEFINED, - VK_IMAGE_LAYOUT_GENERAL, - VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, - VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, - VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, - VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, - VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - VK_IMAGE_LAYOUT_PREINITIALIZED, - VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL, - VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL, - VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL, - VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, - VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL, - VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL, - VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL, - VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL, - VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, - VK_IMAGE_LAYOUT_VIDEO_DECODE_DST_KHR, - VK_IMAGE_LAYOUT_VIDEO_DECODE_SRC_KHR, - VK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR, - VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR, - VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT, - VK_IMAGE_LAYOUT_FRAGMENT_SHADING_RATE_ATTACHMENT_OPTIMAL_KHR, - }; - if (props->copySrcLayoutCount) - typed_memcpy(props->pCopySrcLayouts, layouts, props->copySrcLayoutCount); - props->copySrcLayoutCount = ARRAY_SIZE(layouts); - if (props->copyDstLayoutCount) - typed_memcpy(props->pCopyDstLayouts, layouts, props->copyDstLayoutCount); - props->copyDstLayoutCount = ARRAY_SIZE(layouts); - lvp_device_get_cache_uuid(props->optimalTilingLayoutUUID); - props->identicalMemoryTypeRequirements = VK_FALSE; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT: { - VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT *props = - (VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT *)ext; - if (pdevice->pscreen->get_param(pdevice->pscreen, PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR) != 0) - props->maxVertexAttribDivisor = UINT32_MAX; - else - props->maxVertexAttribDivisor = 1; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES: { - VkPhysicalDeviceDescriptorIndexingProperties *props = - (VkPhysicalDeviceDescriptorIndexingProperties *)ext; - props->maxUpdateAfterBindDescriptorsInAllPools = 1000000; - props->shaderUniformBufferArrayNonUniformIndexingNative = true; - props->shaderSampledImageArrayNonUniformIndexingNative = true; - props->shaderStorageBufferArrayNonUniformIndexingNative = true; - props->shaderStorageImageArrayNonUniformIndexingNative = true; - props->shaderInputAttachmentArrayNonUniformIndexingNative = true; - props->robustBufferAccessUpdateAfterBind = true; - props->quadDivergentImplicitLod = true; - props->maxPerStageDescriptorUpdateAfterBindSamplers = 1000000; - props->maxPerStageDescriptorUpdateAfterBindUniformBuffers = 1000000; - props->maxPerStageDescriptorUpdateAfterBindStorageBuffers = 1000000; - props->maxPerStageDescriptorUpdateAfterBindSampledImages = 1000000; - props->maxPerStageDescriptorUpdateAfterBindStorageImages = 1000000; - props->maxPerStageDescriptorUpdateAfterBindInputAttachments = 1000000; - props->maxPerStageUpdateAfterBindResources = 1000000; - props->maxDescriptorSetUpdateAfterBindSamplers = 1000000; - props->maxDescriptorSetUpdateAfterBindUniformBuffers = 1000000; - props->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic = 1000000; - props->maxDescriptorSetUpdateAfterBindStorageBuffers = 1000000; - props->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic = 1000000; - props->maxDescriptorSetUpdateAfterBindSampledImages = 1000000; - props->maxDescriptorSetUpdateAfterBindStorageImages = 1000000; - props->maxDescriptorSetUpdateAfterBindInputAttachments = 1000000; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT: { - VkPhysicalDeviceTransformFeedbackPropertiesEXT *properties = - (VkPhysicalDeviceTransformFeedbackPropertiesEXT*)ext; - properties->maxTransformFeedbackStreams = pdevice->pscreen->get_param(pdevice->pscreen, PIPE_CAP_MAX_VERTEX_STREAMS); - properties->maxTransformFeedbackBuffers = pdevice->pscreen->get_param(pdevice->pscreen, PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS); - properties->maxTransformFeedbackBufferSize = UINT32_MAX; - properties->maxTransformFeedbackStreamDataSize = 512; - properties->maxTransformFeedbackBufferDataSize = 512; - properties->maxTransformFeedbackBufferDataStride = 512; - properties->transformFeedbackQueries = true; - properties->transformFeedbackStreamsLinesTriangles = false; - properties->transformFeedbackRasterizationStreamSelect = false; - properties->transformFeedbackDraw = true; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_PROPERTIES: { - VkPhysicalDeviceMaintenance4Properties *properties = - (VkPhysicalDeviceMaintenance4Properties *)ext; - properties->maxBufferSize = UINT32_MAX; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_5_PROPERTIES_KHR: { - VkPhysicalDeviceMaintenance5PropertiesKHR *properties = - (VkPhysicalDeviceMaintenance5PropertiesKHR *)ext; - /* FIXME No idea about most of these ones. */ - properties->earlyFragmentMultisampleCoverageAfterSampleCounting = true; - properties->earlyFragmentSampleMaskTestBeforeSampleCounting = false; - properties->depthStencilSwizzleOneSupport = false; - properties->polygonModePointSize = true; /* This one is correct. */ - properties->nonStrictSinglePixelWideLinesUseParallelogram = false; - properties->nonStrictWideLinesUseParallelogram = false; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_PROPERTIES_EXT: { - VkPhysicalDeviceExtendedDynamicState3PropertiesEXT *properties = - (VkPhysicalDeviceExtendedDynamicState3PropertiesEXT *)ext; - properties->dynamicPrimitiveTopologyUnrestricted = VK_TRUE; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT: { - VkPhysicalDeviceLineRasterizationPropertiesEXT *properties = - (VkPhysicalDeviceLineRasterizationPropertiesEXT *)ext; - properties->lineSubPixelPrecisionBits = - pdevice->pscreen->get_param(pdevice->pscreen, - PIPE_CAP_RASTERIZER_SUBPIXEL_BITS); - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV: { - VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV *properties = - (VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV *)ext; - properties->maxGraphicsShaderGroupCount = 1<<12; - properties->maxIndirectSequenceCount = 1<<20; - properties->maxIndirectCommandsTokenCount = MAX_DGC_TOKENS; - properties->maxIndirectCommandsStreamCount = MAX_DGC_STREAMS; - properties->maxIndirectCommandsTokenOffset = 2047; - properties->maxIndirectCommandsStreamStride = 2048; - properties->minSequencesCountBufferOffsetAlignment = 4; - properties->minSequencesIndexBufferOffsetAlignment = 4; - properties->minIndirectCommandsBufferOffsetAlignment = 4; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES: { - VkPhysicalDeviceInlineUniformBlockProperties *properties = - (VkPhysicalDeviceInlineUniformBlockProperties *)ext; - properties->maxInlineUniformBlockSize = MAX_DESCRIPTOR_UNIFORM_BLOCK_SIZE; - properties->maxPerStageDescriptorInlineUniformBlocks = MAX_PER_STAGE_DESCRIPTOR_UNIFORM_BLOCKS; - properties->maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks = MAX_PER_STAGE_DESCRIPTOR_UNIFORM_BLOCKS; - properties->maxDescriptorSetInlineUniformBlocks = MAX_PER_STAGE_DESCRIPTOR_UNIFORM_BLOCKS; - properties->maxDescriptorSetUpdateAfterBindInlineUniformBlocks = MAX_PER_STAGE_DESCRIPTOR_UNIFORM_BLOCKS; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT: { - VkPhysicalDeviceExternalMemoryHostPropertiesEXT *properties = - (VkPhysicalDeviceExternalMemoryHostPropertiesEXT *)ext; - properties->minImportedHostPointerAlignment = 4096; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT: { - VkPhysicalDeviceCustomBorderColorPropertiesEXT *properties = - (VkPhysicalDeviceCustomBorderColorPropertiesEXT *)ext; - properties->maxCustomBorderColorSamplers = 32 * 1024; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES: { - VkPhysicalDeviceSubgroupSizeControlProperties *props = (VkPhysicalDeviceSubgroupSizeControlProperties *)ext; - props->minSubgroupSize = lp_native_vector_width / 32; - props->maxSubgroupSize = lp_native_vector_width / 32; - props->maxComputeWorkgroupSubgroups = 32; - props->requiredSubgroupSizeStages = VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_COMPUTE_BIT; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_PROPERTIES_EXT: { - VkPhysicalDeviceProvokingVertexPropertiesEXT *properties = - (VkPhysicalDeviceProvokingVertexPropertiesEXT*)ext; - properties->provokingVertexModePerPipeline = true; - properties->transformFeedbackPreservesTriangleFanProvokingVertex = true; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_PROPERTIES_EXT: { - VkPhysicalDeviceMultiDrawPropertiesEXT *props = (VkPhysicalDeviceMultiDrawPropertiesEXT *)ext; - props->maxMultiDrawCount = 2048; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_PROPERTIES_EXT: { - VkPhysicalDeviceDescriptorBufferPropertiesEXT *props = (VkPhysicalDeviceDescriptorBufferPropertiesEXT *)ext; - props->combinedImageSamplerDescriptorSingleArray = VK_TRUE; - props->bufferlessPushDescriptors = VK_TRUE; - props->descriptorBufferOffsetAlignment = 4; - props->maxDescriptorBufferBindings = MAX_SETS; - props->maxResourceDescriptorBufferBindings = MAX_SETS; - props->maxSamplerDescriptorBufferBindings = MAX_SETS; - props->maxEmbeddedImmutableSamplerBindings = MAX_SETS; - props->maxEmbeddedImmutableSamplers = 2032; - props->bufferCaptureReplayDescriptorDataSize = 0; - props->imageCaptureReplayDescriptorDataSize = 0; - props->imageViewCaptureReplayDescriptorDataSize = 0; - props->samplerCaptureReplayDescriptorDataSize = 0; - props->accelerationStructureCaptureReplayDescriptorDataSize = 0; - props->samplerDescriptorSize = sizeof(struct lp_descriptor); - props->combinedImageSamplerDescriptorSize = sizeof(struct lp_descriptor); - props->sampledImageDescriptorSize = sizeof(struct lp_descriptor); - props->storageImageDescriptorSize = sizeof(struct lp_descriptor); - props->uniformTexelBufferDescriptorSize = sizeof(struct lp_descriptor); - props->robustUniformTexelBufferDescriptorSize = sizeof(struct lp_descriptor); - props->storageTexelBufferDescriptorSize = sizeof(struct lp_descriptor); - props->robustStorageTexelBufferDescriptorSize = sizeof(struct lp_descriptor); - props->uniformBufferDescriptorSize = sizeof(struct lp_descriptor); - props->robustUniformBufferDescriptorSize = sizeof(struct lp_descriptor); - props->storageBufferDescriptorSize = sizeof(struct lp_descriptor); - props->robustStorageBufferDescriptorSize = sizeof(struct lp_descriptor); - props->inputAttachmentDescriptorSize = sizeof(struct lp_descriptor); - props->accelerationStructureDescriptorSize = 0; - props->maxSamplerDescriptorBufferRange = 1<<27; //spec minimum - props->maxResourceDescriptorBufferRange = 1<<27; //spec minimum - props->resourceDescriptorBufferAddressSpaceSize = 1<<27; //spec minimum - props->samplerDescriptorBufferAddressSpaceSize = 1<<27; //spec minimum - props->descriptorBufferAddressSpaceSize = 1<<27; //spec minimum - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES: { - VkPhysicalDeviceTexelBufferAlignmentProperties *properties = - (VkPhysicalDeviceTexelBufferAlignmentProperties *)ext; - int alignment = pdevice->pscreen->get_param(pdevice->pscreen, PIPE_CAP_TEXTURE_BUFFER_OFFSET_ALIGNMENT); - properties->storageTexelBufferOffsetAlignmentBytes = alignment; - properties->storageTexelBufferOffsetSingleTexelAlignment = true; - properties->uniformTexelBufferOffsetAlignmentBytes = alignment; - properties->uniformTexelBufferOffsetSingleTexelAlignment = true; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GRAPHICS_PIPELINE_LIBRARY_PROPERTIES_EXT: { - VkPhysicalDeviceGraphicsPipelineLibraryPropertiesEXT *props = (VkPhysicalDeviceGraphicsPipelineLibraryPropertiesEXT *)ext; - props->graphicsPipelineLibraryFastLinking = VK_TRUE; - props->graphicsPipelineLibraryIndependentInterpolationDecoration = VK_TRUE; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_OBJECT_PROPERTIES_EXT: { - VkPhysicalDeviceShaderObjectPropertiesEXT *props = (VkPhysicalDeviceShaderObjectPropertiesEXT *)ext; - /* this is basically unsupported */ - lvp_device_get_cache_uuid(props->shaderBinaryUUID); - props->shaderBinaryVersion = 1; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT: { - VkPhysicalDeviceRobustness2PropertiesEXT *props = - (VkPhysicalDeviceRobustness2PropertiesEXT *)ext; - props->robustStorageBufferAccessSizeAlignment = 1; - props->robustUniformBufferAccessSizeAlignment = 1; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_EXT: { - VkPhysicalDeviceMeshShaderPropertiesEXT *props = - (VkPhysicalDeviceMeshShaderPropertiesEXT *)ext; - props->maxTaskWorkGroupTotalCount = 4194304; - props->maxTaskWorkGroupCount[0] = 65536; - props->maxTaskWorkGroupCount[1] = 65536; - props->maxTaskWorkGroupCount[2] = 65536; - props->maxTaskWorkGroupInvocations = 1024; - props->maxTaskWorkGroupSize[0] = 1024; - props->maxTaskWorkGroupSize[1] = 1024; - props->maxTaskWorkGroupSize[2] = 1024; - props->maxTaskPayloadSize = 16384; - props->maxTaskSharedMemorySize = 32768; - props->maxTaskPayloadAndSharedMemorySize = 32768; - - props->maxMeshWorkGroupTotalCount = 4194304; - props->maxMeshWorkGroupCount[0] = 65536; - props->maxMeshWorkGroupCount[1] = 65536; - props->maxMeshWorkGroupCount[2] = 65536; - props->maxMeshWorkGroupInvocations = 1024; - props->maxMeshWorkGroupSize[0] = 1024; - props->maxMeshWorkGroupSize[1] = 1024; - props->maxMeshWorkGroupSize[2] = 1024; - props->maxMeshOutputMemorySize = 32768; /* 32K min required */ - props->maxMeshSharedMemorySize = 28672; /* 28K min required */ - props->maxMeshPayloadAndSharedMemorySize = - props->maxTaskPayloadSize + - props->maxMeshSharedMemorySize; /* 28K min required */ - props->maxMeshPayloadAndOutputMemorySize = - props->maxTaskPayloadSize + - props->maxMeshOutputMemorySize; /* 47K min required */ - props->maxMeshOutputComponents = 128; /* 32x vec4 min required */ - props->maxMeshOutputVertices = 256; - props->maxMeshOutputPrimitives = 256; - props->maxMeshOutputLayers = 8; - props->meshOutputPerVertexGranularity = 1; - props->meshOutputPerPrimitiveGranularity = 1; - props->maxPreferredTaskWorkGroupInvocations = 64; - props->maxPreferredMeshWorkGroupInvocations = 128; - props->prefersLocalInvocationVertexOutput = true; - props->prefersLocalInvocationPrimitiveOutput = true; - props->prefersCompactVertexOutput = true; - props->prefersCompactPrimitiveOutput = false; - break; - } - default: - break; - } - } -} - VKAPI_ATTR void VKAPI_CALL lvp_GetPhysicalDeviceQueueFamilyProperties2( VkPhysicalDevice physicalDevice, uint32_t* pCount, diff --git a/src/gallium/frontends/lavapipe/lvp_private.h b/src/gallium/frontends/lavapipe/lvp_private.h index a730ed8..13e3e34 100644 --- a/src/gallium/frontends/lavapipe/lvp_private.h +++ b/src/gallium/frontends/lavapipe/lvp_private.h @@ -148,8 +148,6 @@ struct lvp_physical_device { struct vk_sync_timeline_type sync_timeline_type; const struct vk_sync_type *sync_types[3]; - VkPhysicalDeviceLimits device_limits; - struct wsi_device wsi_device; }; -- 2.7.4