aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCharles Giessen <charles@lunarg.com>2019-10-08 10:02:17 -0600
committerCharles Giessen <46324611+charles-lunarg@users.noreply.github.com>2019-10-15 11:37:21 -0600
commitb2c22307c5e14978c007b33869e51eaa127547cc (patch)
treea93b6817a8495e809e64affd80d9dff580052bcf
parentcdb7624451f5f641c4b6f8045869802e2ab12dca (diff)
downloadusermoji-b2c22307c5e14978c007b33869e51eaa127547cc.tar.xz
vulkaninfo: Present Surfaces now wont show duplicates
If a machine has multiple surface types that work with the same gpu and have the same properties, vulkainfo will now list them in a short array instead of duplicating the entire surfaces information. To do this required being able to compare vulkan objects, necesitating the autogeneration of comparators for vulkan structs. This patch also refactors some of the device creation code to better reflect the actual data dependencies of the various vulkan objects. files modified - vulkaninfo/vulkaninfo.cpp - vulkaninfo/vulkaninfo.h - scripts/vulkaninfo_generator.py - vulkaninfo/generated/vulkaninfo.hpp Change-Id: Ifda51eacc3883982a6e2f7f60439827eb355c204
-rw-r--r--scripts/vulkaninfo_generator.py67
-rw-r--r--vulkaninfo/generated/vulkaninfo.hpp45
-rw-r--r--vulkaninfo/vulkaninfo.cpp82
-rw-r--r--vulkaninfo/vulkaninfo.h272
4 files changed, 298 insertions, 168 deletions
diff --git a/scripts/vulkaninfo_generator.py b/scripts/vulkaninfo_generator.py
index 318ecd51..3846e345 100644
--- a/scripts/vulkaninfo_generator.py
+++ b/scripts/vulkaninfo_generator.py
@@ -92,6 +92,9 @@ flags_to_gen = ['VkSurfaceTransformFlagsKHR', 'VkCompositeAlphaFlagsKHR',
'VkDeviceGroupPresentModeFlagsKHR', 'VkFormatFeatureFlags', 'VkMemoryPropertyFlags', 'VkMemoryHeapFlags']
flags_strings_to_gen = ['VkQueueFlags']
+struct_comparisons_to_gen = ['VkSurfaceFormatKHR', 'VkSurfaceFormat2KHR', 'VkSurfaceCapabilitiesKHR',
+ 'VkSurfaceCapabilities2KHR', 'VkSurfaceCapabilities2EXT']
+
# iostream or custom outputter handles these types
predefined_types = ['char', 'VkBool32', 'uint32_t', 'uint8_t', 'int32_t',
'float', 'uint64_t', 'size_t', 'VkDeviceSize', 'VkConformanceVersionKHR']
@@ -177,6 +180,7 @@ class VulkanInfoGenerator(OutputGenerator):
self.flags = set()
self.bitmasks = set()
self.structures = set()
+ self.structs_to_comp = set()
self.all_structures = set()
self.types_to_gen = set()
@@ -216,6 +220,12 @@ class VulkanInfoGenerator(OutputGenerator):
types_to_gen = types_to_gen.union(
GatherTypesToGen(self.extension_sets[key]))
+ structs_to_comp = set()
+ for s in struct_comparisons_to_gen:
+ structs_to_comp.add(s)
+ structs_to_comp = structs_to_comp.union(
+ GatherTypesToGen(self.structs_to_comp))
+
self.enums = sorted(self.enums, key=operator.attrgetter('name'))
self.flags = sorted(self.flags, key=operator.attrgetter('name'))
self.bitmasks = sorted(self.bitmasks, key=operator.attrgetter('name'))
@@ -275,6 +285,14 @@ class VulkanInfoGenerator(OutputGenerator):
out += PrintChainIterator(key,
self.extension_sets[key], value.get('type'))
+ for s in self.all_structures:
+ if s.name in structs_to_comp:
+ out += PrintStructComparisonForwardDef(s)
+
+ for s in self.all_structures:
+ if s.name in structs_to_comp:
+ out += PrintStructComparison(s)
+
gen.write(out, file=self.outFile)
gen.OutputGenerator.endFile(self)
@@ -311,6 +329,10 @@ class VulkanInfoGenerator(OutputGenerator):
self.structures.add(VulkanStructure(
name, typeinfo.elem, self.constants, self.extTypes))
+ if typeinfo.elem.get('category') == 'struct' and name in struct_comparisons_to_gen:
+ self.structs_to_comp.add(VulkanStructure(
+ name, typeinfo.elem, self.constants, self.extTypes))
+
if typeinfo.elem.get('category') == 'struct':
self.all_structures.add(VulkanStructure(
name, typeinfo.elem, self.constants, self.extTypes))
@@ -328,13 +350,19 @@ class VulkanInfoGenerator(OutputGenerator):
def GatherTypesToGen(structures):
- types_to_gen = set()
- for s in structures:
- types_to_gen.add(s.name)
- for m in s.members:
- if m.typeID not in predefined_types and m.name not in ['sType', 'pNext']:
- types_to_gen.add(m.typeID)
- return types_to_gen
+ types = set()
+ added_stuff = True # repeat until no new types are added
+ while added_stuff == True:
+ added_stuff = False
+ for s in structures:
+ size = len(types)
+ types.add(s.name)
+ if len(types) != size:
+ added_stuff = True
+ for m in s.members:
+ if m.typeID not in predefined_types and m.name not in ['sType', 'pNext']:
+ types.add(m.typeID)
+ return types
def GetExtension(name, generator):
@@ -608,6 +636,31 @@ def PrintChainIterator(listName, structures, checkExtLoc):
return out
+def PrintStructComparisonForwardDef(structure):
+ out = ''
+ out += "bool operator==(const " + structure.name + \
+ " & a, const " + structure.name + " b);\n"
+ return out
+
+
+def PrintStructComparison(structure):
+ out = ''
+ out += "bool operator==(const " + structure.name + \
+ " & a, const " + structure.name + " b) {\n"
+ out += " return "
+ is_first = True
+ for m in structure.members:
+ if m.name not in ['sType', 'pNext']:
+ if not is_first:
+ out += "\n && "
+ else:
+ is_first = False
+ out += "a." + m.name + " == b." + m.name
+ out += ";\n"
+ out += "}\n"
+ return out
+
+
def isPow2(num):
return num != 0 and ((num & (num - 1)) == 0)
diff --git a/vulkaninfo/generated/vulkaninfo.hpp b/vulkaninfo/generated/vulkaninfo.hpp
index 261a05dd..12060fb3 100644
--- a/vulkaninfo/generated/vulkaninfo.hpp
+++ b/vulkaninfo/generated/vulkaninfo.hpp
@@ -2120,4 +2120,49 @@ void chain_iterator_format_properties2(Printer &p, AppGpu &gpu, void * place) {
place = structure->pNext;
}
}
+bool operator==(const VkExtent2D & a, const VkExtent2D b);
+bool operator==(const VkSurfaceCapabilities2EXT & a, const VkSurfaceCapabilities2EXT b);
+bool operator==(const VkSurfaceCapabilities2KHR & a, const VkSurfaceCapabilities2KHR b);
+bool operator==(const VkSurfaceCapabilitiesKHR & a, const VkSurfaceCapabilitiesKHR b);
+bool operator==(const VkSurfaceFormat2KHR & a, const VkSurfaceFormat2KHR b);
+bool operator==(const VkSurfaceFormatKHR & a, const VkSurfaceFormatKHR b);
+bool operator==(const VkExtent2D & a, const VkExtent2D b) {
+ return a.width == b.width
+ && a.height == b.height;
+}
+bool operator==(const VkSurfaceCapabilities2EXT & a, const VkSurfaceCapabilities2EXT b) {
+ return a.minImageCount == b.minImageCount
+ && a.maxImageCount == b.maxImageCount
+ && a.currentExtent == b.currentExtent
+ && a.minImageExtent == b.minImageExtent
+ && a.maxImageExtent == b.maxImageExtent
+ && a.maxImageArrayLayers == b.maxImageArrayLayers
+ && a.supportedTransforms == b.supportedTransforms
+ && a.currentTransform == b.currentTransform
+ && a.supportedCompositeAlpha == b.supportedCompositeAlpha
+ && a.supportedUsageFlags == b.supportedUsageFlags
+ && a.supportedSurfaceCounters == b.supportedSurfaceCounters;
+}
+bool operator==(const VkSurfaceCapabilities2KHR & a, const VkSurfaceCapabilities2KHR b) {
+ return a.surfaceCapabilities == b.surfaceCapabilities;
+}
+bool operator==(const VkSurfaceCapabilitiesKHR & a, const VkSurfaceCapabilitiesKHR b) {
+ return a.minImageCount == b.minImageCount
+ && a.maxImageCount == b.maxImageCount
+ && a.currentExtent == b.currentExtent
+ && a.minImageExtent == b.minImageExtent
+ && a.maxImageExtent == b.maxImageExtent
+ && a.maxImageArrayLayers == b.maxImageArrayLayers
+ && a.supportedTransforms == b.supportedTransforms
+ && a.currentTransform == b.currentTransform
+ && a.supportedCompositeAlpha == b.supportedCompositeAlpha
+ && a.supportedUsageFlags == b.supportedUsageFlags;
+}
+bool operator==(const VkSurfaceFormat2KHR & a, const VkSurfaceFormat2KHR b) {
+ return a.surfaceFormat == b.surfaceFormat;
+}
+bool operator==(const VkSurfaceFormatKHR & a, const VkSurfaceFormatKHR b) {
+ return a.format == b.format
+ && a.colorSpace == b.colorSpace;
+}
diff --git a/vulkaninfo/vulkaninfo.cpp b/vulkaninfo/vulkaninfo.cpp
index fbfda81a..75a653d8 100644
--- a/vulkaninfo/vulkaninfo.cpp
+++ b/vulkaninfo/vulkaninfo.cpp
@@ -53,7 +53,7 @@ void DumpExtensions(Printer &p, std::string layer_name, std::vector<VkExtensionP
p.ArrayEnd();
}
-void DumpLayers(Printer &p, std::vector<LayerExtensionList> layers, std::vector<AppGpu *> gpus) {
+void DumpLayers(Printer &p, std::vector<LayerExtensionList> layers, const std::vector<std::unique_ptr<AppGpu>> &gpus) {
std::sort(layers.begin(), layers.end(), [](LayerExtensionList &left, LayerExtensionList &right) -> int {
const char *a = left.layer_properties.layerName;
const char *b = right.layer_properties.layerName;
@@ -146,7 +146,7 @@ void DumpSurfaceCapabilities(Printer &p, AppInstance &inst, AppGpu &gpu, AppSurf
chain_iterator_surface_capabilities2(p, inst, gpu, surface.surface_capabilities2_khr.pNext);
}
-void DumpSurface(Printer &p, AppInstance &inst, AppGpu &gpu, AppSurface &surface) {
+void DumpSurface(Printer &p, AppInstance &inst, AppGpu &gpu, AppSurface &surface, std::vector<std::string> surface_types) {
std::string header;
if (p.Type() == OutputType::text)
header = std::string("GPU id : ") + std::to_string(gpu.id) + " (" + gpu.props.deviceName + ")";
@@ -154,7 +154,15 @@ void DumpSurface(Printer &p, AppInstance &inst, AppGpu &gpu, AppSurface &surface
header = std::string("GPU id : <span class='val'>") + std::to_string(gpu.id) + "</span> (" + gpu.props.deviceName + ")";
p.ObjectStart(header);
- p.SetAsType().PrintKeyValue("Surface type", surface.surface_extension.name);
+ if (surface_types.size() == 0) {
+ p.SetAsType().PrintKeyValue("Surface type", surface.surface_extension.name);
+ } else {
+ p.ArrayStart("Surface types", surface_types.size());
+ for (auto &name : surface_types) {
+ p.PrintElement(name);
+ }
+ p.ArrayEnd();
+ }
DumpSurfaceFormats(p, inst, surface);
@@ -166,14 +174,43 @@ void DumpSurface(Printer &p, AppInstance &inst, AppGpu &gpu, AppSurface &surface
p.AddNewline();
}
-void DumpPresentableSurfaces(Printer &p, AppInstance &inst, std::vector<AppGpu *> &gpus, std::vector<AppSurface *> &surfaces) {
+struct SurfaceTypeGroup {
+ AppSurface *surface;
+ std::vector<std::string> surface_types;
+ AppGpu *gpu;
+};
+
+bool operator==(AppSurface const &a, AppSurface const &b) {
+ return a.surf_present_modes == b.surf_present_modes && a.surf_formats == b.surf_formats && a.surf_formats2 == b.surf_formats2 &&
+ a.surface_capabilities == b.surface_capabilities && a.surface_capabilities2_khr == b.surface_capabilities2_khr &&
+ a.surface_capabilities2_ext == b.surface_capabilities2_ext;
+}
+
+void DumpPresentableSurfaces(Printer &p, AppInstance &inst, const std::vector<std::unique_ptr<AppGpu>> &gpus,
+ const std::vector<std::unique_ptr<AppSurface>> &surfaces) {
p.SetHeader().ObjectStart("Presentable Surfaces");
p.IndentDecrease();
+ std::vector<SurfaceTypeGroup> surface_list;
+
for (auto &surface : surfaces) {
for (auto &gpu : gpus) {
- DumpSurface(p, inst, *gpu, *surface);
+ auto exists = surface_list.end();
+ for (auto it = surface_list.begin(); it != surface_list.end(); it++) {
+ // use custom comparator to check if the surface has the same values
+ if (it->gpu == gpu.get() && *it->surface == *surface.get()) {
+ exists = it;
+ }
+ }
+ if (exists != surface_list.end()) {
+ exists->surface_types.push_back(surface.get()->surface_extension.name);
+ } else {
+ surface_list.push_back({surface.get(), {surface.get()->surface_extension.name}, gpu.get()});
+ }
}
}
+ for (auto &group : surface_list) {
+ DumpSurface(p, inst, *group.gpu, *group.surface, group.surface_types);
+ }
p.IndentIncrease();
p.ObjectEnd();
p.AddNewline();
@@ -671,34 +708,31 @@ int main(int argc, char **argv) {
auto pNext_chains = get_chain_infos();
- auto gpu_holder = FindGpus(instance, pNext_chains);
+ auto phys_devices = instance.FindPhysicalDevices();
- std::vector<AppGpu *> gpus;
- for (auto &gpu : gpu_holder) {
- gpus.push_back(gpu.get());
- }
-
- if (selected_gpu >= gpus.size()) {
- selected_gpu = 0;
- }
-
- std::vector<std::unique_ptr<AppSurface>> surfaces_holder;
+ std::vector<std::unique_ptr<AppSurface>> surfaces;
#if defined(VK_USE_PLATFORM_XCB_KHR) || defined(VK_USE_PLATFORM_XLIB_KHR) || defined(VK_USE_PLATFORM_WIN32_KHR) || \
defined(VK_USE_PLATFORM_MACOS_MVK) || defined(VK_USE_PLATFORM_WAYLAND_KHR)
for (auto &surface_extension : instance.surface_extensions) {
surface_extension.create_window(instance);
surface_extension.surface = surface_extension.create_surface(instance);
- for (auto &gpu : gpus) {
- surfaces_holder.push_back(
- std::unique_ptr<AppSurface>(new AppSurface(instance, gpu, surface_extension, pNext_chains.surface_capabilities2)));
+ for (auto &phys_device : phys_devices) {
+ surfaces.push_back(std::unique_ptr<AppSurface>(
+ new AppSurface(instance, phys_device, surface_extension, pNext_chains.surface_capabilities2)));
}
}
+#endif
- std::vector<AppSurface *> surfaces;
- for (auto &surface : surfaces_holder) {
- surfaces.push_back(surface.get());
+ std::vector<std::unique_ptr<AppGpu>> gpus;
+
+ uint32_t gpu_counter = 0;
+ for (auto &phys_device : phys_devices) {
+ gpus.push_back(std::unique_ptr<AppGpu>(new AppGpu(instance, gpu_counter++, phys_device, pNext_chains)));
+ }
+
+ if (selected_gpu >= gpus.size()) {
+ selected_gpu = 0;
}
-#endif
std::vector<std::unique_ptr<Printer>> printers;
@@ -738,7 +772,7 @@ int main(int argc, char **argv) {
for (auto &gpu : gpus) {
if ((p->Type() == OutputType::json && gpu->id == selected_gpu) || p->Type() == OutputType::text ||
p->Type() == OutputType::html) {
- DumpGpu(*p.get(), *gpu, show_formats, pNext_chains);
+ DumpGpu(*p.get(), *gpu.get(), show_formats, pNext_chains);
}
}
if (p->Type() != OutputType::json) {
diff --git a/vulkaninfo/vulkaninfo.h b/vulkaninfo/vulkaninfo.h
index ea8ddd54..3a10370a 100644
--- a/vulkaninfo/vulkaninfo.h
+++ b/vulkaninfo/vulkaninfo.h
@@ -146,6 +146,33 @@ struct pNextChainBuildingBlockInfo {
uint32_t mem_size;
};
+void buildpNextChain(VkStructureHeader *first, const std::vector<pNextChainBuildingBlockInfo> &chain_info) {
+ VkStructureHeader *place = first;
+
+ for (uint32_t i = 0; i < chain_info.size(); i++) {
+ place->pNext = static_cast<VkStructureHeader *>(malloc(chain_info[i].mem_size));
+ if (!place->pNext) {
+ ERR_EXIT(VK_ERROR_OUT_OF_HOST_MEMORY);
+ }
+ std::memset(place->pNext, 0, chain_info[i].mem_size);
+ place = place->pNext;
+ place->sType = chain_info[i].sType;
+ }
+
+ place->pNext = nullptr;
+}
+
+void freepNextChain(VkStructureHeader *first) {
+ VkStructureHeader *place = first;
+ VkStructureHeader *next = nullptr;
+
+ while (place) {
+ next = place->pNext;
+ free(place);
+ place = next;
+ }
+}
+
struct LayerExtensionList {
VkLayerProperties layer_properties;
std::vector<VkExtensionProperties> extension_properties;
@@ -353,6 +380,26 @@ struct AppInstance {
if (err) ERR_EXIT(err);
return ext_props;
}
+
+ std::vector<VkPhysicalDevice> FindPhysicalDevices() {
+ std::vector<VkPhysicalDevice> phys_devices;
+
+ VkResult err;
+ uint32_t gpu_count = 0;
+
+ /* repeat get until VK_INCOMPLETE goes away */
+ do {
+ err = vkEnumeratePhysicalDevices(instance, &gpu_count, nullptr);
+ if (err) ERR_EXIT(err);
+
+ phys_devices.resize(gpu_count);
+ err = vkEnumeratePhysicalDevices(instance, &gpu_count, phys_devices.data());
+ if (err) ERR_EXIT(err);
+ phys_devices.resize(gpu_count);
+ } while (err == VK_INCOMPLETE);
+
+ return phys_devices;
+ }
};
// --------- Platform Specific Presentation Calls --------- //
@@ -725,6 +772,94 @@ void SetupWindowExtensions(AppInstance &inst) {
#endif
}
+// ---------- Surfaces -------------- //
+
+class AppSurface {
+ public:
+ AppInstance &inst;
+ SurfaceExtension surface_extension;
+
+ std::vector<VkPresentModeKHR> surf_present_modes;
+
+ std::vector<VkSurfaceFormatKHR> surf_formats;
+ std::vector<VkSurfaceFormat2KHR> surf_formats2;
+
+ VkSurfaceCapabilitiesKHR surface_capabilities;
+ VkSurfaceCapabilities2KHR surface_capabilities2_khr;
+ VkSurfaceCapabilities2EXT surface_capabilities2_ext;
+
+ AppSurface(AppInstance &inst, VkPhysicalDevice phys_device, SurfaceExtension surface_extension,
+ std::vector<pNextChainBuildingBlockInfo> &sur_extension_pNextChain)
+ : inst(inst), surface_extension(surface_extension) {
+ uint32_t present_mode_count = 0;
+ VkResult err =
+ inst.vkGetPhysicalDeviceSurfacePresentModesKHR(phys_device, surface_extension.surface, &present_mode_count, nullptr);
+ if (err) ERR_EXIT(err);
+
+ surf_present_modes.resize(present_mode_count);
+ err = inst.vkGetPhysicalDeviceSurfacePresentModesKHR(phys_device, surface_extension.surface, &present_mode_count,
+ surf_present_modes.data());
+ if (err) ERR_EXIT(err);
+
+ const VkPhysicalDeviceSurfaceInfo2KHR surface_info2 = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SURFACE_INFO_2_KHR, nullptr,
+ surface_extension.surface};
+
+ uint32_t format_count = 0;
+ if (inst.CheckExtensionEnabled(VK_KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME)) {
+ VkResult err = inst.vkGetPhysicalDeviceSurfaceFormats2KHR(phys_device, &surface_info2, &format_count, nullptr);
+ if (err) ERR_EXIT(err);
+ surf_formats2.resize(format_count);
+ for (uint32_t i = 0; i < format_count; ++i) {
+ surf_formats2[i].sType = VK_STRUCTURE_TYPE_SURFACE_FORMAT_2_KHR;
+ surf_formats2[i].pNext = nullptr;
+ }
+ err = inst.vkGetPhysicalDeviceSurfaceFormats2KHR(phys_device, &surface_info2, &format_count, surf_formats2.data());
+ if (err) ERR_EXIT(err);
+ } else {
+ VkResult err =
+ inst.vkGetPhysicalDeviceSurfaceFormatsKHR(phys_device, surface_extension.surface, &format_count, nullptr);
+ if (err) ERR_EXIT(err);
+ surf_formats.resize(format_count);
+ err = inst.vkGetPhysicalDeviceSurfaceFormatsKHR(phys_device, surface_extension.surface, &format_count,
+ surf_formats.data());
+ if (err) ERR_EXIT(err);
+ }
+
+ if (inst.CheckExtensionEnabled(VK_KHR_SURFACE_EXTENSION_NAME)) {
+ VkResult err =
+ inst.vkGetPhysicalDeviceSurfaceCapabilitiesKHR(phys_device, surface_extension.surface, &surface_capabilities);
+ if (err) ERR_EXIT(err);
+ }
+
+ if (inst.CheckExtensionEnabled(VK_KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME)) {
+ surface_capabilities2_khr.sType = VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_KHR;
+ buildpNextChain((VkStructureHeader *)&surface_capabilities2_khr, sur_extension_pNextChain);
+
+ VkPhysicalDeviceSurfaceInfo2KHR surface_info;
+ surface_info.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SURFACE_INFO_2_KHR;
+ surface_info.pNext = nullptr;
+ surface_info.surface = surface_extension.surface;
+
+ VkResult err = inst.vkGetPhysicalDeviceSurfaceCapabilities2KHR(phys_device, &surface_info, &surface_capabilities2_khr);
+ if (err) ERR_EXIT(err);
+ }
+
+ if (inst.CheckExtensionEnabled(VK_EXT_DISPLAY_SURFACE_COUNTER_EXTENSION_NAME)) {
+ surface_capabilities2_ext.sType = VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_EXT;
+ surface_capabilities2_ext.pNext = nullptr;
+ VkResult err =
+ inst.vkGetPhysicalDeviceSurfaceCapabilities2EXT(phys_device, surface_extension.surface, &surface_capabilities2_ext);
+ if (err) ERR_EXIT(err);
+ }
+ }
+
+ ~AppSurface() {
+ if (inst.CheckExtensionEnabled(VK_KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME)) {
+ freepNextChain(static_cast<VkStructureHeader *>(surface_capabilities2_khr.pNext));
+ }
+ }
+};
+
// -------------------- Device Groups ------------------------//
std::vector<VkPhysicalDeviceGroupProperties> GetGroups(AppInstance &inst) {
@@ -798,33 +933,6 @@ std::pair<bool, VkDeviceGroupPresentCapabilitiesKHR> GetGroupCapabilities(AppIns
// -------------------- Device Setup ------------------- //
-void buildpNextChain(VkStructureHeader *first, const std::vector<pNextChainBuildingBlockInfo> &chain_info) {
- VkStructureHeader *place = first;
-
- for (uint32_t i = 0; i < chain_info.size(); i++) {
- place->pNext = static_cast<VkStructureHeader *>(malloc(chain_info[i].mem_size));
- if (!place->pNext) {
- ERR_EXIT(VK_ERROR_OUT_OF_HOST_MEMORY);
- }
- std::memset(place->pNext, 0, chain_info[i].mem_size);
- place = place->pNext;
- place->sType = chain_info[i].sType;
- }
-
- place->pNext = nullptr;
-}
-
-void freepNextChain(VkStructureHeader *first) {
- VkStructureHeader *place = first;
- VkStructureHeader *next = nullptr;
-
- while (place) {
- next = place->pNext;
- free(place);
- place = next;
- }
-}
-
struct MemImageSupport {
bool regular_supported, sparse_supported, transient_supported;
VkFormat format;
@@ -1164,26 +1272,6 @@ struct AppGpu {
}
}
};
-
-std::vector<std::unique_ptr<AppGpu>> FindGpus(AppInstance &instance, pNextChainInfos chainInfos) {
- uint32_t gpu_count;
- VkResult err = vkEnumeratePhysicalDevices(instance.instance, &gpu_count, nullptr);
- if (err) ERR_EXIT(err);
-
- std::vector<VkPhysicalDevice> phys_devices(gpu_count);
-
- err = vkEnumeratePhysicalDevices(instance.instance, &gpu_count, phys_devices.data());
- if (err) ERR_EXIT(err);
-
- std::vector<std::unique_ptr<AppGpu>> gpus;
-
- uint32_t i = 0;
- for (auto &phys_device : phys_devices) {
- gpus.push_back(std::unique_ptr<AppGpu>(new AppGpu(instance, i++, phys_device, chainInfos)));
- }
- return gpus;
-}
-
struct AppQueueFamilyProperties {
VkQueueFamilyProperties props;
uint32_t queue_index;
@@ -1212,96 +1300,6 @@ struct AppQueueFamilyProperties {
}
};
-// ---------- Surfaces -------------- //
-
-class AppSurface {
- public:
- AppInstance &inst;
- SurfaceExtension surface_extension;
-
- uint32_t present_mode_count = 0;
- std::vector<VkPresentModeKHR> surf_present_modes;
-
- uint32_t format_count = 0;
- std::vector<VkSurfaceFormatKHR> surf_formats;
- std::vector<VkSurfaceFormat2KHR> surf_formats2;
-
- VkSurfaceCapabilitiesKHR surface_capabilities;
- VkSurfaceCapabilities2KHR surface_capabilities2_khr;
- VkSurfaceCapabilities2EXT surface_capabilities2_ext;
-
- AppSurface(AppInstance &inst, AppGpu *gpu, SurfaceExtension surface_extension,
- std::vector<pNextChainBuildingBlockInfo> &sur_extension_pNextChain)
- : inst(inst), surface_extension(surface_extension) {
- uint32_t present_mode_count = 0;
- VkResult err = inst.vkGetPhysicalDeviceSurfacePresentModesKHR(gpu->phys_device, surface_extension.surface,
- &present_mode_count, nullptr);
- if (err) ERR_EXIT(err);
-
- surf_present_modes.resize(present_mode_count);
- err = inst.vkGetPhysicalDeviceSurfacePresentModesKHR(gpu->phys_device, surface_extension.surface, &present_mode_count,
- surf_present_modes.data());
- if (err) ERR_EXIT(err);
-
- const VkPhysicalDeviceSurfaceInfo2KHR surface_info2 = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SURFACE_INFO_2_KHR, nullptr,
- surface_extension.surface};
-
- if (inst.CheckExtensionEnabled(VK_KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME)) {
- VkResult err = inst.vkGetPhysicalDeviceSurfaceFormats2KHR(gpu->phys_device, &surface_info2, &format_count, nullptr);
- if (err) ERR_EXIT(err);
- surf_formats2.resize(format_count);
- for (uint32_t i = 0; i < format_count; ++i) {
- surf_formats2[i].sType = VK_STRUCTURE_TYPE_SURFACE_FORMAT_2_KHR;
- surf_formats2[i].pNext = nullptr;
- }
- err = inst.vkGetPhysicalDeviceSurfaceFormats2KHR(gpu->phys_device, &surface_info2, &format_count, surf_formats2.data());
- if (err) ERR_EXIT(err);
- } else {
- VkResult err =
- inst.vkGetPhysicalDeviceSurfaceFormatsKHR(gpu->phys_device, surface_extension.surface, &format_count, nullptr);
- if (err) ERR_EXIT(err);
- surf_formats.resize(format_count);
- err = inst.vkGetPhysicalDeviceSurfaceFormatsKHR(gpu->phys_device, surface_extension.surface, &format_count,
- surf_formats.data());
- if (err) ERR_EXIT(err);
- }
-
- if (inst.CheckExtensionEnabled(VK_KHR_SURFACE_EXTENSION_NAME)) {
- VkResult err =
- inst.vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu->phys_device, surface_extension.surface, &surface_capabilities);
- if (err) ERR_EXIT(err);
- }
-
- if (inst.CheckExtensionEnabled(VK_KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME)) {
- surface_capabilities2_khr.sType = VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_KHR;
- buildpNextChain((VkStructureHeader *)&surface_capabilities2_khr, sur_extension_pNextChain);
-
- VkPhysicalDeviceSurfaceInfo2KHR surface_info;
- surface_info.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SURFACE_INFO_2_KHR;
- surface_info.pNext = nullptr;
- surface_info.surface = surface_extension.surface;
-
- VkResult err =
- inst.vkGetPhysicalDeviceSurfaceCapabilities2KHR(gpu->phys_device, &surface_info, &surface_capabilities2_khr);
- if (err) ERR_EXIT(err);
- }
-
- if (inst.CheckExtensionEnabled(VK_EXT_DISPLAY_SURFACE_COUNTER_EXTENSION_NAME)) {
- surface_capabilities2_ext.sType = VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_EXT;
- surface_capabilities2_ext.pNext = nullptr;
- VkResult err = inst.vkGetPhysicalDeviceSurfaceCapabilities2EXT(gpu->phys_device, surface_extension.surface,
- &surface_capabilities2_ext);
- if (err) ERR_EXIT(err);
- }
- }
-
- ~AppSurface() {
- if (inst.CheckExtensionEnabled(VK_KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME)) {
- freepNextChain(static_cast<VkStructureHeader *>(surface_capabilities2_khr.pNext));
- }
- }
-};
-
// --------- Format Properties ----------//
struct PropFlags {