Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

profiles: Support VK_EXT_host_image_copy #705

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 7 additions & 4 deletions profiles/test/data/VP_LUNARG_test_host_image_copy/local_gpu.json
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
"VK_EXT_global_priority": 2,
"VK_EXT_global_priority_query": 1,
"VK_EXT_graphics_pipeline_library": 1,
"VK_EXT_host_image_copy": 1,
"VK_EXT_host_query_reset": 1,
"VK_EXT_image_2d_view_of_3d": 1,
"VK_EXT_image_drm_format_modifier": 2,
Expand Down Expand Up @@ -1407,13 +1408,15 @@
"maxBufferSize": 4294967292
},
"VkPhysicalDeviceHostImageCopyPropertiesEXT": {
"copySrcLayoutCount": 0,
"pCopySrcLayouts": [

"VK_IMAGE_LAYOUT_GENERAL",
"VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL",
"VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL"
],
"copyDstLayoutCount": 0,
"pCopyDstLayouts": [

"VK_IMAGE_LAYOUT_GENERAL",
"VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL",
"VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL"
],
"optimalTilingLayoutUUID": [
0,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
"VK_EXT_global_priority_query": 1,
"VK_EXT_graphics_pipeline_library": 1,
"VK_EXT_hdr_metadata": 2,
"VK_EXT_host_image_copy": 1,
"VK_EXT_host_query_reset": 1,
"VK_EXT_image_2d_view_of_3d": 1,
"VK_EXT_image_drm_format_modifier": 2,
Expand Down Expand Up @@ -964,13 +965,15 @@
"maxBufferSize": 4294967296
},
"VkPhysicalDeviceHostImageCopyPropertiesEXT": {
"copySrcLayoutCount": 0,
"pCopySrcLayouts": [

"VK_IMAGE_LAYOUT_GENERAL",
"VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL",
"VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL"
],
"copyDstLayoutCount": 0,
"pCopyDstLayouts": [

"VK_IMAGE_LAYOUT_GENERAL",
"VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL",
"VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL"
],
"optimalTilingLayoutUUID": [
0,
Expand Down
20 changes: 13 additions & 7 deletions scripts/gen_profiles_file.py
Original file line number Diff line number Diff line change
Expand Up @@ -575,7 +575,7 @@ def add_members(self, merged, entry, property = None):
continue

xmlmember = self.registry.structs[property].members[member]
if xmlmember.limittype == 'exact' or xmlmember.limittype == 'noauto':
if (xmlmember.limittype == 'exact' or xmlmember.limittype == 'noauto') and not xmlmember.isDynamicallySizedArrayWithCap():
del merged[member]
#elif 'mul' in xmlmember.limittype and xmlmember.type == 'float':
# del merged[member]
Expand All @@ -585,18 +585,14 @@ def add_members(self, merged, entry, property = None):
merged[member] = entry[member]
elif not member in merged:
xmlmember = self.registry.structs[property].members[member]
if xmlmember.limittype == 'exact' or xmlmember.limittype == 'noauto':
if (xmlmember.limittype == 'exact' or xmlmember.limittype == 'noauto') and not xmlmember.isDynamicallySizedArrayWithCap():
continue
elif self.mode == 'union' or self.first is True:
if xmlmember.type == 'uint64_t' or xmlmember.type == 'VkDeviceSize':
merged[member] = int(entry[member])
else:
merged[member] = entry[member]
else:
# VK_EXT_host_image_copy is unsupported
if property == 'VkPhysicalDeviceHostImageCopyPropertiesEXT':
continue

# Merge properties
xmlmember = self.registry.structs[property].members[member]
if xmlmember.limittype == 'struct':
Expand All @@ -615,7 +611,7 @@ def add_members(self, merged, entry, property = None):
self.merge_members(merged, member, entry, xmlmember)

def merge_members(self, merged, member, entry, xmlmember):
if xmlmember.limittype == 'exact' or xmlmember.limittype == 'noauto':
if (xmlmember.limittype == 'exact' or xmlmember.limittype == 'noauto') and not xmlmember.isDynamicallySizedArrayWithCap():
del merged[member]
elif self.mode == 'union':
#if xmlmember.limittype == 'exact':
Expand Down Expand Up @@ -685,6 +681,11 @@ def merge_members(self, merged, member, entry, xmlmember):
merged[member][0] = entry[member][0]
if entry[member][1] > merged[member][1]:
merged[member][1] = entry[member][1]
elif xmlmember.isDynamicallySizedArrayWithCap():
entry_set = set(merged[member])
merged_set = set(entry[member])
union_set = merged_set.union(entry_set)
merged[member] = list(union_set)
else:
print("ERROR: Unknown limitype: " + xmlmember.limittype + " for " + member)
elif self.mode == 'intersection':
Expand Down Expand Up @@ -792,6 +793,11 @@ def merge_members(self, merged, member, entry, xmlmember):
merged[member][1] = entry[member][1]
#if member[1] < member[0]:
# merged.pop(member, None)
elif xmlmember.isDynamicallySizedArrayWithCap():
entry_set = set(merged[member])
merged_set = set(entry[member])
intersection_set = merged_set.intersection(entry_set)
merged[member] = list(intersection_set)
else:
print("ERROR: Unknown limitype: " + xmlmember.limittype + " for " + member)
else:
Expand Down
25 changes: 19 additions & 6 deletions scripts/gen_profiles_layer.py
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,12 @@ class PhysicalDeviceData {
MapOfVkExtensionProperties map_of_extension_properties_;
ArrayOfVkQueueFamilyProperties arrayof_queue_family_properties_;

// Space for array queries:
//
// - From VkPhysicalDeviceHostImageCopyPropertiesEXT
std::vector<VkImageLayout> pCopySrcLayouts_;
std::vector<VkImageLayout> pCopyDstLayouts_;

bool vulkan_1_1_properties_written_;
bool vulkan_1_2_properties_written_;
bool vulkan_1_3_properties_written_;
Expand Down Expand Up @@ -1004,7 +1010,7 @@ class JsonLoader {
return count;
}

int GetArray(const char* device_name, const Json::Value &parent, const std::string &member, const char *name, VkImageLayout *dest, bool not_modifiable) {
int GetArray(const char* device_name, const Json::Value &parent, const std::string &member, const char *name, VkImageLayout *dest, uint32_t *destCount, bool not_modifiable) {
(void)device_name;

if (member != name) {
Expand All @@ -1017,6 +1023,7 @@ class JsonLoader {
}
const int count = static_cast<int>(value.size());
if (!not_modifiable) {
*destCount = count;
for (int i = 0; i < count; ++i) {
dest[i] = StringToImageLayout(value[i].asCString());
}
Expand Down Expand Up @@ -2951,9 +2958,7 @@ class VulkanProfilesLayerGenerator():
emulated_extensions = ['VK_KHR_portability_subset']
additional_features = ['VkPhysicalDeviceFeatures', 'VkPhysicalDevicePortabilitySubsetFeaturesKHR']
additional_properties = ['VkPhysicalDeviceProperties', 'VkPhysicalDeviceLimits', 'VkPhysicalDeviceSparseProperties', 'VkPhysicalDeviceToolProperties', 'VkPhysicalDevicePortabilitySubsetPropertiesKHR']
# VkPhysicalDeviceHostImageCopyFeaturesEXT is not ignored to allow the people using the MockICD to still have the feature enabled,
# but use the properties in the MockICD until HostImageCopyPropertiesEXT is fixed.
ignored_structs = ['VkPhysicalDeviceHostImageCopyPropertiesEXT', 'VkPhysicalDeviceLayeredApiPropertiesListKHR']
ignored_structs = ['VkPhysicalDeviceLayeredApiPropertiesListKHR']

def generate(self, path, registry):
self.registry = registry
Expand Down Expand Up @@ -3233,6 +3238,13 @@ def generate_get_struct(self, struct, extends, additional):
gen += ' return GetStruct(device_name, requested_profile, ' + struct + ', &pdd_->physical_device_properties_.limits);\n'
elif current == 'VkPhysicalDeviceSparseProperties':
gen += ' return GetStruct(device_name, requested_profile, ' + struct + ', &pdd_->physical_device_properties_.sparseProperties);\n'
elif current.startswith('VkPhysicalDeviceHostImageCopyProperties'):
# Initialize memory for src/dst layout arrays with a size that's way too big to be exceeded.
gen += ' pdd_->pCopySrcLayouts_.resize(64);\n'
gen += ' pdd_->pCopyDstLayouts_.resize(64);\n'
gen += ' pdd_->' + self.create_var_name(current) + '.pCopySrcLayouts = pdd_->pCopySrcLayouts_.data();\n'
gen += ' pdd_->' + self.create_var_name(current) + '.pCopyDstLayouts = pdd_->pCopyDstLayouts_.data();\n'
gen += ' return GetStruct(device_name, requested_profile, ' + struct + ', &pdd_->' + self.create_var_name(current) + ');\n'
else:
gen += ' return GetStruct(device_name, requested_profile, ' + struct + ', &pdd_->' + self.create_var_name(current) + ');\n'

Expand Down Expand Up @@ -3630,9 +3642,10 @@ def generate_get_value_function(self, structure):
gen += ' for (const auto &member : parent.getMemberNames()) {\n'
for member_name in registry.structs[structure].members:
member = registry.structs[structure].members[member_name]
not_modifiable = str(member.limittype == 'exact' or member.limittype == 'noauto').lower()
not_modifiable = str((member.limittype == 'exact' or member.limittype == 'noauto') and not member.isDynamicallySizedArrayWithCap()).lower()
if member.isArray:
gen += ' GetArray(device_name, parent, member, "' + member_name + '", dest->' + member_name + ', ' + not_modifiable + ');\n'
gen += (' GetArray(device_name, parent, member, "' + member_name + '", dest->' + member_name + ', ' +
('&dest->' + member.arraySizeMember + ', ' if member.isDynamicallySizedArrayWithCap() else '') + not_modifiable + ');\n')
elif member.type in registry.enums:
gen += ' GET_VALUE_ENUM_WARN(member, ' + member_name + ', ' + not_modifiable + ', requested_profile, WarnIfNotEqualEnum);\n'
elif member.type == 'VkConformanceVersion' or member.type == 'VkToolPurposeFlags':
Expand Down
Loading