lavapipe: Use common physical device properties

Acked-by: Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24629>
This commit is contained in:
Konstantin Seurer 2023-08-11 12:55:05 +02:00 committed by Marge Bot
parent e2a02f3910
commit 040a0fcf42
2 changed files with 357 additions and 534 deletions

View file

@ -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)
extern unsigned lp_native_vector_width;
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)
{
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);
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,

View file

@ -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;
};