aboutsummaryrefslogtreecommitdiff
path: root/scripts/mock_icd_generator.py
diff options
context:
space:
mode:
authorCharles Giessen <charles@lunarg.com>2023-06-15 12:22:52 -0600
committerCharles Giessen <46324611+charles-lunarg@users.noreply.github.com>2023-06-16 18:05:38 -0600
commitca8bb4ee3cc9afdeca4b49c5ef758bad7cce2c72 (patch)
treea289dd7d1fb7a38a783c5e54a044c822aef8582d /scripts/mock_icd_generator.py
parent7040985c553c1a5ecf998bc61e53e5ae76fd41c1 (diff)
downloadusermoji-ca8bb4ee3cc9afdeca4b49c5ef758bad7cce2c72.tar.xz
icd: Move handwritten code into .cpp file
Takes the hand written portions of the mock_icd_generator.py and puts them in a .cpp file, then moves the code gen into function_declarations.h and function_definitions.h. This move makes it easier to maintain the C++ code that exists because it no longer lives in a python file. This commit does not make adding custom code easier, as it still is in the python file. The intent of this commit is to create a baseline that would allow such code to be put inside of C++ instead of python. Additionally, this commit removes egregious over engineering in the mock icd CMakeLists.txt. Things removed are macros that are only called once, foreach loops over single items, and replacing variables that had no solid reason to be a variable.
Diffstat (limited to 'scripts/mock_icd_generator.py')
-rw-r--r--scripts/mock_icd_generator.py496
1 files changed, 22 insertions, 474 deletions
diff --git a/scripts/mock_icd_generator.py b/scripts/mock_icd_generator.py
index c6c53ba5..95166616 100644
--- a/scripts/mock_icd_generator.py
+++ b/scripts/mock_icd_generator.py
@@ -29,447 +29,6 @@ import os,re,sys
from generator import *
from common_codegen import *
-
-# Mock header code
-HEADER_C_CODE = '''
-using mutex_t = std::mutex;
-using lock_guard_t = std::lock_guard<mutex_t>;
-using unique_lock_t = std::unique_lock<mutex_t>;
-
-static mutex_t global_lock;
-static uint64_t global_unique_handle = 1;
-static const uint32_t SUPPORTED_LOADER_ICD_INTERFACE_VERSION = 5;
-static uint32_t loader_interface_version = 0;
-static bool negotiate_loader_icd_interface_called = false;
-static void* CreateDispObjHandle() {
- auto handle = new VK_LOADER_DATA;
- set_loader_magic_value(handle);
- return handle;
-}
-static void DestroyDispObjHandle(void* handle) {
- delete reinterpret_cast<VK_LOADER_DATA*>(handle);
-}
-'''
-
-# Manual code at the top of the cpp source file
-SOURCE_CPP_PREFIX = '''
-using std::unordered_map;
-
-static constexpr uint32_t icd_physical_device_count = 1;
-static unordered_map<VkInstance, std::array<VkPhysicalDevice, icd_physical_device_count>> physical_device_map;
-
-// Map device memory handle to any mapped allocations that we'll need to free on unmap
-static unordered_map<VkDeviceMemory, std::vector<void*>> mapped_memory_map;
-
-// Map device memory allocation handle to the size
-static unordered_map<VkDeviceMemory, VkDeviceSize> allocated_memory_size_map;
-
-static unordered_map<VkDevice, unordered_map<uint32_t, unordered_map<uint32_t, VkQueue>>> queue_map;
-static VkDeviceAddress current_available_address = 0x10000000;
-struct BufferState {
- VkDeviceSize size;
- VkDeviceAddress address;
-};
-static unordered_map<VkDevice, unordered_map<VkBuffer, BufferState>> buffer_map;
-static unordered_map<VkDevice, unordered_map<VkImage, VkDeviceSize>> image_memory_size_map;
-static unordered_map<VkCommandPool, std::vector<VkCommandBuffer>> command_pool_buffer_map;
-
-static constexpr uint32_t icd_swapchain_image_count = 1;
-static unordered_map<VkSwapchainKHR, VkImage[icd_swapchain_image_count]> swapchain_image_map;
-
-// TODO: Would like to codegen this but limits aren't in XML
-static VkPhysicalDeviceLimits SetLimits(VkPhysicalDeviceLimits *limits) {
- limits->maxImageDimension1D = 4096;
- limits->maxImageDimension2D = 4096;
- limits->maxImageDimension3D = 256;
- limits->maxImageDimensionCube = 4096;
- limits->maxImageArrayLayers = 256;
- limits->maxTexelBufferElements = 65536;
- limits->maxUniformBufferRange = 16384;
- limits->maxStorageBufferRange = 134217728;
- limits->maxPushConstantsSize = 128;
- limits->maxMemoryAllocationCount = 4096;
- limits->maxSamplerAllocationCount = 4000;
- limits->bufferImageGranularity = 1;
- limits->sparseAddressSpaceSize = 2147483648;
- limits->maxBoundDescriptorSets = 4;
- limits->maxPerStageDescriptorSamplers = 16;
- limits->maxPerStageDescriptorUniformBuffers = 12;
- limits->maxPerStageDescriptorStorageBuffers = 4;
- limits->maxPerStageDescriptorSampledImages = 16;
- limits->maxPerStageDescriptorStorageImages = 4;
- limits->maxPerStageDescriptorInputAttachments = 4;
- limits->maxPerStageResources = 128;
- limits->maxDescriptorSetSamplers = 96;
- limits->maxDescriptorSetUniformBuffers = 72;
- limits->maxDescriptorSetUniformBuffersDynamic = 8;
- limits->maxDescriptorSetStorageBuffers = 24;
- limits->maxDescriptorSetStorageBuffersDynamic = 4;
- limits->maxDescriptorSetSampledImages = 96;
- limits->maxDescriptorSetStorageImages = 24;
- limits->maxDescriptorSetInputAttachments = 4;
- limits->maxVertexInputAttributes = 16;
- limits->maxVertexInputBindings = 16;
- limits->maxVertexInputAttributeOffset = 2047;
- limits->maxVertexInputBindingStride = 2048;
- limits->maxVertexOutputComponents = 64;
- limits->maxTessellationGenerationLevel = 64;
- limits->maxTessellationPatchSize = 32;
- limits->maxTessellationControlPerVertexInputComponents = 64;
- limits->maxTessellationControlPerVertexOutputComponents = 64;
- limits->maxTessellationControlPerPatchOutputComponents = 120;
- limits->maxTessellationControlTotalOutputComponents = 2048;
- limits->maxTessellationEvaluationInputComponents = 64;
- limits->maxTessellationEvaluationOutputComponents = 64;
- limits->maxGeometryShaderInvocations = 32;
- limits->maxGeometryInputComponents = 64;
- limits->maxGeometryOutputComponents = 64;
- limits->maxGeometryOutputVertices = 256;
- limits->maxGeometryTotalOutputComponents = 1024;
- limits->maxFragmentInputComponents = 64;
- limits->maxFragmentOutputAttachments = 4;
- limits->maxFragmentDualSrcAttachments = 1;
- limits->maxFragmentCombinedOutputResources = 4;
- limits->maxComputeSharedMemorySize = 16384;
- limits->maxComputeWorkGroupCount[0] = 65535;
- limits->maxComputeWorkGroupCount[1] = 65535;
- limits->maxComputeWorkGroupCount[2] = 65535;
- limits->maxComputeWorkGroupInvocations = 128;
- limits->maxComputeWorkGroupSize[0] = 128;
- limits->maxComputeWorkGroupSize[1] = 128;
- limits->maxComputeWorkGroupSize[2] = 64;
- limits->subPixelPrecisionBits = 4;
- limits->subTexelPrecisionBits = 4;
- limits->mipmapPrecisionBits = 4;
- limits->maxDrawIndexedIndexValue = UINT32_MAX;
- limits->maxDrawIndirectCount = UINT16_MAX;
- limits->maxSamplerLodBias = 2.0f;
- limits->maxSamplerAnisotropy = 16;
- limits->maxViewports = 16;
- limits->maxViewportDimensions[0] = 4096;
- limits->maxViewportDimensions[1] = 4096;
- limits->viewportBoundsRange[0] = -8192;
- limits->viewportBoundsRange[1] = 8191;
- limits->viewportSubPixelBits = 0;
- limits->minMemoryMapAlignment = 64;
- limits->minTexelBufferOffsetAlignment = 16;
- limits->minUniformBufferOffsetAlignment = 16;
- limits->minStorageBufferOffsetAlignment = 16;
- limits->minTexelOffset = -8;
- limits->maxTexelOffset = 7;
- limits->minTexelGatherOffset = -8;
- limits->maxTexelGatherOffset = 7;
- limits->minInterpolationOffset = 0.0f;
- limits->maxInterpolationOffset = 0.5f;
- limits->subPixelInterpolationOffsetBits = 4;
- limits->maxFramebufferWidth = 4096;
- limits->maxFramebufferHeight = 4096;
- limits->maxFramebufferLayers = 256;
- limits->framebufferColorSampleCounts = 0x7F;
- limits->framebufferDepthSampleCounts = 0x7F;
- limits->framebufferStencilSampleCounts = 0x7F;
- limits->framebufferNoAttachmentsSampleCounts = 0x7F;
- limits->maxColorAttachments = 4;
- limits->sampledImageColorSampleCounts = 0x7F;
- limits->sampledImageIntegerSampleCounts = 0x7F;
- limits->sampledImageDepthSampleCounts = 0x7F;
- limits->sampledImageStencilSampleCounts = 0x7F;
- limits->storageImageSampleCounts = 0x7F;
- limits->maxSampleMaskWords = 1;
- limits->timestampComputeAndGraphics = VK_TRUE;
- limits->timestampPeriod = 1;
- limits->maxClipDistances = 8;
- limits->maxCullDistances = 8;
- limits->maxCombinedClipAndCullDistances = 8;
- limits->discreteQueuePriorities = 2;
- limits->pointSizeRange[0] = 1.0f;
- limits->pointSizeRange[1] = 64.0f;
- limits->lineWidthRange[0] = 1.0f;
- limits->lineWidthRange[1] = 8.0f;
- limits->pointSizeGranularity = 1.0f;
- limits->lineWidthGranularity = 1.0f;
- limits->strictLines = VK_TRUE;
- limits->standardSampleLocations = VK_TRUE;
- limits->optimalBufferCopyOffsetAlignment = 1;
- limits->optimalBufferCopyRowPitchAlignment = 1;
- limits->nonCoherentAtomSize = 256;
-
- return *limits;
-}
-
-void SetBoolArrayTrue(VkBool32* bool_array, uint32_t num_bools)
-{
- for (uint32_t i = 0; i < num_bools; ++i) {
- bool_array[i] = VK_TRUE;
- }
-}
-
-VkDeviceSize GetImageSizeFromCreateInfo(const VkImageCreateInfo* pCreateInfo)
-{
- VkDeviceSize size = pCreateInfo->extent.width;
- size *= pCreateInfo->extent.height;
- size *= pCreateInfo->extent.depth;
- // TODO: A pixel size is 32 bytes. This accounts for the largest possible pixel size of any format. It could be changed to more accurate size if need be.
- size *= 32;
- size *= pCreateInfo->arrayLayers;
- size *= (pCreateInfo->mipLevels > 1 ? 2 : 1);
-
- switch (pCreateInfo->format) {
- case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM:
- case VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM:
- case VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM:
- case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16:
- case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16:
- case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16:
- case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16:
- case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16:
- case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16:
- case VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM:
- case VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM:
- case VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM:
- size *= 3;
- break;
- case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:
- case VK_FORMAT_G8_B8R8_2PLANE_422_UNORM:
- case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16:
- case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16:
- case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16:
- case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16:
- case VK_FORMAT_G16_B16R16_2PLANE_420_UNORM:
- case VK_FORMAT_G16_B16R16_2PLANE_422_UNORM:
- size *= 2;
- break;
- default:
- break;
- }
-
- return size;
-}
-'''
-
-# Manual code at the end of the cpp source file
-SOURCE_CPP_POSTFIX = '''
-
-static VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetPhysicalDeviceProcAddr(VkInstance instance, const char *funcName) {
- // TODO: This function should only care about physical device functions and return nullptr for other functions
- const auto &item = name_to_funcptr_map.find(funcName);
- if (item != name_to_funcptr_map.end()) {
- return reinterpret_cast<PFN_vkVoidFunction>(item->second);
- }
- // Mock should intercept all functions so if we get here just return null
- return nullptr;
-}
-
-} // namespace vkmock
-
-#if defined(__GNUC__) && __GNUC__ >= 4
-#define EXPORT __attribute__((visibility("default")))
-#elif defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590)
-#define EXPORT __attribute__((visibility("default")))
-#else
-#define EXPORT
-#endif
-
-extern "C" {
-
-EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vk_icdGetInstanceProcAddr(VkInstance instance, const char* pName) {
- if (!vkmock::negotiate_loader_icd_interface_called) {
- vkmock::loader_interface_version = 1;
- }
- return vkmock::GetInstanceProcAddr(instance, pName);
-}
-
-EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vk_icdGetPhysicalDeviceProcAddr(VkInstance instance, const char* pName) {
- return vkmock::GetPhysicalDeviceProcAddr(instance, pName);
-}
-
-EXPORT VKAPI_ATTR VkResult VKAPI_CALL vk_icdNegotiateLoaderICDInterfaceVersion(uint32_t* pSupportedVersion) {
- vkmock::negotiate_loader_icd_interface_called = true;
- vkmock::loader_interface_version = *pSupportedVersion;
- if (*pSupportedVersion > vkmock::SUPPORTED_LOADER_ICD_INTERFACE_VERSION) {
- *pSupportedVersion = vkmock::SUPPORTED_LOADER_ICD_INTERFACE_VERSION;
- }
- return VK_SUCCESS;
-}
-
-
-EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroySurfaceKHR(
- VkInstance instance,
- VkSurfaceKHR surface,
- const VkAllocationCallbacks* pAllocator)
-{
- vkmock::DestroySurfaceKHR(instance, surface, pAllocator);
-}
-
-EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceSupportKHR(
- VkPhysicalDevice physicalDevice,
- uint32_t queueFamilyIndex,
- VkSurfaceKHR surface,
- VkBool32* pSupported)
-{
- return vkmock::GetPhysicalDeviceSurfaceSupportKHR(physicalDevice, queueFamilyIndex, surface, pSupported);
-}
-
-EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceCapabilitiesKHR(
- VkPhysicalDevice physicalDevice,
- VkSurfaceKHR surface,
- VkSurfaceCapabilitiesKHR* pSurfaceCapabilities)
-{
- return vkmock::GetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice, surface, pSurfaceCapabilities);
-}
-
-EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceFormatsKHR(
- VkPhysicalDevice physicalDevice,
- VkSurfaceKHR surface,
- uint32_t* pSurfaceFormatCount,
- VkSurfaceFormatKHR* pSurfaceFormats)
-{
- return vkmock::GetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, pSurfaceFormatCount, pSurfaceFormats);
-}
-
-EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfacePresentModesKHR(
- VkPhysicalDevice physicalDevice,
- VkSurfaceKHR surface,
- uint32_t* pPresentModeCount,
- VkPresentModeKHR* pPresentModes)
-{
- return vkmock::GetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, pPresentModeCount, pPresentModes);
-}
-
-EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateDisplayPlaneSurfaceKHR(
- VkInstance instance,
- const VkDisplaySurfaceCreateInfoKHR* pCreateInfo,
- const VkAllocationCallbacks* pAllocator,
- VkSurfaceKHR* pSurface)
-{
- return vkmock::CreateDisplayPlaneSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
-}
-
-#ifdef VK_USE_PLATFORM_XLIB_KHR
-
-EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateXlibSurfaceKHR(
- VkInstance instance,
- const VkXlibSurfaceCreateInfoKHR* pCreateInfo,
- const VkAllocationCallbacks* pAllocator,
- VkSurfaceKHR* pSurface)
-{
- return vkmock::CreateXlibSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
-}
-#endif /* VK_USE_PLATFORM_XLIB_KHR */
-
-#ifdef VK_USE_PLATFORM_XCB_KHR
-
-EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateXcbSurfaceKHR(
- VkInstance instance,
- const VkXcbSurfaceCreateInfoKHR* pCreateInfo,
- const VkAllocationCallbacks* pAllocator,
- VkSurfaceKHR* pSurface)
-{
- return vkmock::CreateXcbSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
-}
-#endif /* VK_USE_PLATFORM_XCB_KHR */
-
-#ifdef VK_USE_PLATFORM_WAYLAND_KHR
-
-EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateWaylandSurfaceKHR(
- VkInstance instance,
- const VkWaylandSurfaceCreateInfoKHR* pCreateInfo,
- const VkAllocationCallbacks* pAllocator,
- VkSurfaceKHR* pSurface)
-{
- return vkmock::CreateWaylandSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
-}
-#endif /* VK_USE_PLATFORM_WAYLAND_KHR */
-
-#ifdef VK_USE_PLATFORM_ANDROID_KHR
-
-EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateAndroidSurfaceKHR(
- VkInstance instance,
- const VkAndroidSurfaceCreateInfoKHR* pCreateInfo,
- const VkAllocationCallbacks* pAllocator,
- VkSurfaceKHR* pSurface)
-{
- return vkmock::CreateAndroidSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
-}
-#endif /* VK_USE_PLATFORM_ANDROID_KHR */
-
-#ifdef VK_USE_PLATFORM_WIN32_KHR
-
-EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateWin32SurfaceKHR(
- VkInstance instance,
- const VkWin32SurfaceCreateInfoKHR* pCreateInfo,
- const VkAllocationCallbacks* pAllocator,
- VkSurfaceKHR* pSurface)
-{
- return vkmock::CreateWin32SurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
-}
-#endif /* VK_USE_PLATFORM_WIN32_KHR */
-
-EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetDeviceGroupSurfacePresentModesKHR(
- VkDevice device,
- VkSurfaceKHR surface,
- VkDeviceGroupPresentModeFlagsKHR* pModes)
-{
- return vkmock::GetDeviceGroupSurfacePresentModesKHR(device, surface, pModes);
-}
-
-EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDevicePresentRectanglesKHR(
- VkPhysicalDevice physicalDevice,
- VkSurfaceKHR surface,
- uint32_t* pRectCount,
- VkRect2D* pRects)
-{
- return vkmock::GetPhysicalDevicePresentRectanglesKHR(physicalDevice, surface, pRectCount, pRects);
-}
-
-#ifdef VK_USE_PLATFORM_VI_NN
-
-EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateViSurfaceNN(
- VkInstance instance,
- const VkViSurfaceCreateInfoNN* pCreateInfo,
- const VkAllocationCallbacks* pAllocator,
- VkSurfaceKHR* pSurface)
-{
- return vkmock::CreateViSurfaceNN(instance, pCreateInfo, pAllocator, pSurface);
-}
-#endif /* VK_USE_PLATFORM_VI_NN */
-
-EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceCapabilities2EXT(
- VkPhysicalDevice physicalDevice,
- VkSurfaceKHR surface,
- VkSurfaceCapabilities2EXT* pSurfaceCapabilities)
-{
- return vkmock::GetPhysicalDeviceSurfaceCapabilities2EXT(physicalDevice, surface, pSurfaceCapabilities);
-}
-
-#ifdef VK_USE_PLATFORM_IOS_MVK
-
-EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateIOSSurfaceMVK(
- VkInstance instance,
- const VkIOSSurfaceCreateInfoMVK* pCreateInfo,
- const VkAllocationCallbacks* pAllocator,
- VkSurfaceKHR* pSurface)
-{
- return vkmock::CreateIOSSurfaceMVK(instance, pCreateInfo, pAllocator, pSurface);
-}
-#endif /* VK_USE_PLATFORM_IOS_MVK */
-
-#ifdef VK_USE_PLATFORM_MACOS_MVK
-
-EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateMacOSSurfaceMVK(
- VkInstance instance,
- const VkMacOSSurfaceCreateInfoMVK* pCreateInfo,
- const VkAllocationCallbacks* pAllocator,
- VkSurfaceKHR* pSurface)
-{
- return vkmock::CreateMacOSSurfaceMVK(instance, pCreateInfo, pAllocator, pSurface);
-}
-#endif /* VK_USE_PLATFORM_MACOS_MVK */
-
-} // end extern "C"
-
-'''
-
CUSTOM_C_INTERCEPTS = {
'vkCreateInstance': '''
// TODO: If loader ver <=4 ICD must fail with VK_ERROR_INCOMPATIBLE_DRIVER for all vkCreateInstance calls with
@@ -1517,6 +1076,7 @@ class MockICDOutputGenerator(OutputGenerator):
# Internal state - accumulators for different inner block text
self.sections = dict([(section, []) for section in self.ALL_SECTIONS])
self.intercepts = []
+ self.function_declarations = False
# Check if the parameter passed in is a pointer to an array
def paramIsArray(self, param):
@@ -1555,34 +1115,16 @@ class MockICDOutputGenerator(OutputGenerator):
# C-specific
#
# Multiple inclusion protection & C++ namespace.
- self.header = False
- if (genOpts.protectFile and self.genOpts.filename and 'h' == self.genOpts.filename[-1]):
- self.header = True
- write('#pragma once', file=self.outFile)
- self.newline()
- #
+ if (genOpts.protectFile and self.genOpts.filename == "function_declarations.h"):
+ self.function_declarations = True
+
# User-supplied prefix text, if any (list of strings)
if (genOpts.prefixText):
for s in genOpts.prefixText:
write(s, file=self.outFile)
- if self.header:
- write('#include <unordered_map>', file=self.outFile)
- write('#include <mutex>', file=self.outFile)
- write('#include <string>', file=self.outFile)
- write('#include <cstring>', file=self.outFile)
- write('#include "vulkan/vk_icd.h"', file=self.outFile)
- else:
- write('#include "mock_icd.h"', file=self.outFile)
- write('#include <stdlib.h>', file=self.outFile)
- write('#include <algorithm>', file=self.outFile)
- write('#include <array>', file=self.outFile)
- write('#include <vector>', file=self.outFile)
- write('#include "vk_typemap_helper.h"', file=self.outFile)
- write('namespace vkmock {', file=self.outFile)
- if self.header:
+ if self.function_declarations:
self.newline()
- write(HEADER_C_CODE, file=self.outFile)
# Include all of the extensions in ICD except specific ignored ones
device_exts = []
instance_exts = []
@@ -1600,7 +1142,13 @@ class MockICDOutputGenerator(OutputGenerator):
else:
device_exts.append(' {"%s", %s},' % (ext.attrib['name'], ext_version))
break
-
+ write('#pragma once\n',file=self.outFile)
+ write('#include <stdint.h>',file=self.outFile)
+ write('#include <string>',file=self.outFile)
+ write('#include <unordered_map>',file=self.outFile)
+ write('#include <vulkan/vulkan.h>',file=self.outFile)
+ self.newline()
+ write('namespace vkmock {\n', file=self.outFile)
write('// Map of instance extension name to version', file=self.outFile)
write('static const std::unordered_map<std::string, uint32_t> instance_extension_map = {', file=self.outFile)
write('\n'.join(instance_exts), file=self.outFile)
@@ -1609,26 +1157,26 @@ class MockICDOutputGenerator(OutputGenerator):
write('static const std::unordered_map<std::string, uint32_t> device_extension_map = {', file=self.outFile)
write('\n'.join(device_exts), file=self.outFile)
write('};', file=self.outFile)
-
else:
- self.newline()
- write(SOURCE_CPP_PREFIX, file=self.outFile)
+ write('#pragma once\n',file=self.outFile)
+ write('#include "mock_icd.h"',file=self.outFile)
+ write('#include "function_declarations.h"\n',file=self.outFile)
+ write('namespace vkmock {', file=self.outFile)
+
def endFile(self):
# C-specific
# Finish C++ namespace
self.newline()
- if self.header:
+ if self.function_declarations:
# record intercepted procedures
write('// Map of all APIs to be intercepted by this layer', file=self.outFile)
write('static const std::unordered_map<std::string, void*> name_to_funcptr_map = {', file=self.outFile)
write('\n'.join(self.intercepts), file=self.outFile)
write('};\n', file=self.outFile)
- self.newline()
- write('} // namespace vkmock', file=self.outFile)
- self.newline()
- else: # Loader-layer-interface, need to implement global interface functions
- write(SOURCE_CPP_POSTFIX, file=self.outFile)
+ write('} // namespace vkmock', file=self.outFile)
+ self.newline()
+
# Finish processing in superclass
OutputGenerator.endFile(self)
def beginFeature(self, interface, emit):
@@ -1714,7 +1262,7 @@ class MockICDOutputGenerator(OutputGenerator):
# Command generation
def genCmd(self, cmdinfo, name, alias):
decls = self.makeCDecls(cmdinfo.elem)
- if self.header: # In the header declare all intercepts
+ if self.function_declarations: # In the header declare all intercepts
self.appendSection('command', '')
self.appendSection('command', 'static %s' % (decls[0]))
if (self.featureExtraProtect != None):