Skip to content

Commit

Permalink
icd: Add VkPhysicalDeviceDriverProperties
Browse files Browse the repository at this point in the history
This commit adds support for the VkPhysicalDeviceDriverProperties struct
in the output of vkGetPhysicalDeviceProperties2. This is useful for users
of Mock ICD wishing to know the version of MockICD used. The driverInfo
field is used for this purpose and contains the git branch & tag info data.
The use of Git in CMake is how the information is seamlessly gotten and
provided to the source code in the form of compile definitions.
  • Loading branch information
charles-lunarg committed Sep 22, 2023
1 parent c92c1e0 commit 20df039
Show file tree
Hide file tree
Showing 7 changed files with 48 additions and 3 deletions.
23 changes: 23 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,29 @@ endif()
# Default to using the static CRT
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")

# Find the Git branch & tag info for use in Mock ICD
set(GIT_BRANCH_NAME "--unknown--")
set(GIT_TAG_INFO "--unknown--")
find_package (Git)
if (GIT_FOUND AND EXISTS "${CMAKE_CURRENT_LIST_DIR}/.git/HEAD")
execute_process(
COMMAND ${GIT_EXECUTABLE} describe --tags --always
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
OUTPUT_VARIABLE GIT_TAG_INFO)
string(REGEX REPLACE "\n$" "" GIT_TAG_INFO "${GIT_TAG_INFO}")

file(READ "${CMAKE_CURRENT_LIST_DIR}/.git/HEAD" GIT_HEAD_REF_INFO)
if (GIT_HEAD_REF_INFO)
string(REGEX MATCH "ref: refs/heads/(.*)" _ ${GIT_HEAD_REF_INFO})
if (CMAKE_MATCH_1)
set(GIT_BRANCH_NAME ${CMAKE_MATCH_1})
else()
set(GIT_BRANCH_NAME ${GIT_HEAD_REF_INFO})
endif()
string(REGEX REPLACE "\n$" "" GIT_BRANCH_NAME "${GIT_BRANCH_NAME}")
endif()
endif()

if(APPLE)
include(mac_common.cmake)
endif()
Expand Down
1 change: 1 addition & 0 deletions icd/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ else()
endif()

set_target_properties(VkICD_mock_icd PROPERTIES OUTPUT_NAME ${MOCK_ICD_NAME})
target_compile_definitions(VkICD_mock_icd PRIVATE GIT_BRANCH_NAME="${GIT_BRANCH_NAME}" GIT_TAG_INFO="${GIT_TAG_INFO}")

# Installing the Mock ICD to system directories is probably not desired since this ICD is not a very complete implementation.
# Require the user to ask that it be installed if they really want it.
Expand Down
1 change: 1 addition & 0 deletions icd/generated/function_declarations.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
#pragma once

#include <stdint.h>
#include <cstring>
#include <string>
#include <unordered_map>
#include <vulkan/vulkan.h>
Expand Down
8 changes: 7 additions & 1 deletion icd/generated/function_definitions.h
Original file line number Diff line number Diff line change
Expand Up @@ -3008,7 +3008,7 @@ static VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceProperties2KHR(
VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL,
};

auto *host_image_copy_props = lvl_find_mod_in_chain< VkPhysicalDeviceHostImageCopyPropertiesEXT>(pProperties->pNext);
auto *host_image_copy_props = lvl_find_mod_in_chain<VkPhysicalDeviceHostImageCopyPropertiesEXT>(pProperties->pNext);
if (host_image_copy_props){
if (host_image_copy_props->pCopyDstLayouts == nullptr) host_image_copy_props->copyDstLayoutCount = num_copy_layouts;
else {
Expand All @@ -3025,6 +3025,12 @@ static VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceProperties2KHR(
}
}
}

auto *driver_properties = lvl_find_mod_in_chain<VkPhysicalDeviceDriverProperties>(pProperties->pNext);
if (driver_properties) {
std::strncpy(driver_properties->driverName, "Vulkan Mock Device", VK_MAX_DRIVER_NAME_SIZE);
std::strncpy(driver_properties->driverInfo, "Branch: " GIT_BRANCH_NAME " Tag Info: " GIT_TAG_INFO, VK_MAX_DRIVER_INFO_SIZE);
}
}

static VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFormatProperties2KHR(
Expand Down
9 changes: 8 additions & 1 deletion scripts/mock_icd_generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -603,7 +603,7 @@
VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL,
};
auto *host_image_copy_props = lvl_find_mod_in_chain< VkPhysicalDeviceHostImageCopyPropertiesEXT>(pProperties->pNext);
auto *host_image_copy_props = lvl_find_mod_in_chain<VkPhysicalDeviceHostImageCopyPropertiesEXT>(pProperties->pNext);
if (host_image_copy_props){
if (host_image_copy_props->pCopyDstLayouts == nullptr) host_image_copy_props->copyDstLayoutCount = num_copy_layouts;
else {
Expand All @@ -620,6 +620,12 @@
}
}
}
auto *driver_properties = lvl_find_mod_in_chain<VkPhysicalDeviceDriverProperties>(pProperties->pNext);
if (driver_properties) {
std::strncpy(driver_properties->driverName, "Vulkan Mock Device", VK_MAX_DRIVER_NAME_SIZE);
std::strncpy(driver_properties->driverInfo, "Branch: " GIT_BRANCH_NAME " Tag Info: " GIT_TAG_INFO, VK_MAX_DRIVER_INFO_SIZE);
}
''',
'vkGetPhysicalDeviceExternalSemaphoreProperties':'''
// Hard code support for all handle types and features
Expand Down Expand Up @@ -1224,6 +1230,7 @@ def beginFile(self, genOpts):
break
write('#pragma once\n',file=self.outFile)
write('#include <stdint.h>',file=self.outFile)
write('#include <cstring>',file=self.outFile)
write('#include <string>',file=self.outFile)
write('#include <unordered_map>',file=self.outFile)
write('#include <vulkan/vulkan.h>',file=self.outFile)
Expand Down
1 change: 1 addition & 0 deletions tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ if (WIN32)
target_compile_definitions(vulkan_tools_tests PUBLIC -DVK_USE_PLATFORM_WIN32_KHR -DWIN32_LEAN_AND_MEAN -DNOMINMAX)
endif()
set_target_properties(vulkan_tools_tests PROPERTIES MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL")
target_compile_definitions(vulkan_tools_tests PRIVATE GIT_BRANCH_NAME="${GIT_BRANCH_NAME}" GIT_TAG_INFO="${GIT_TAG_INFO}")

if (ENABLE_ADDRESS_SANITIZER)
target_compile_options(vulkan_tools_tests PUBLIC -fsanitize=address)
Expand Down
8 changes: 7 additions & 1 deletion tests/icd/mock_icd_tests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -569,8 +569,12 @@ TEST_F(MockICD, vkGetPhysicalDeviceProperties2) {
fragment_density_map2_properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT;
fragment_density_map2_properties.pNext = static_cast<void*>(&mesh_shader_properties);

VkPhysicalDeviceDriverProperties driver_properties{};
driver_properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES;
driver_properties.pNext = static_cast<void*>(&fragment_density_map2_properties);

VkPhysicalDeviceProperties2 properties2{};
properties2.pNext = static_cast<void*>(&fragment_density_map2_properties);
properties2.pNext = static_cast<void*>(&driver_properties);
vkGetPhysicalDeviceProperties2(physical_device, &properties2);
ASSERT_EQ(properties2.properties.apiVersion, VK_HEADER_VERSION_COMPLETE);
ASSERT_EQ(properties2.properties.driverVersion, 1);
Expand Down Expand Up @@ -624,6 +628,8 @@ TEST_F(MockICD, vkGetPhysicalDeviceProperties2) {
ASSERT_EQ(fragment_density_map2_properties.subsampledCoarseReconstructionEarlyAccess, VK_FALSE);
ASSERT_EQ(fragment_density_map2_properties.maxSubsampledArrayLayers, 2);
ASSERT_EQ(fragment_density_map2_properties.maxDescriptorSetSubsampledSamplers, 1);
ASSERT_EQ(std::string(driver_properties.driverName), "Vulkan Mock Device");
ASSERT_EQ(std::string(driver_properties.driverInfo), "Branch: " GIT_BRANCH_NAME " Tag Info: " GIT_TAG_INFO);
}

TEST_F(MockICD, vkGetPhysicalDeviceExternalSemaphoreProperties) {
Expand Down

0 comments on commit 20df039

Please sign in to comment.