2018-03-01 16:37:04 +01:00
|
|
|
/* Automatically generated from Vulkan vk.xml; DO NOT EDIT! */
|
|
|
|
|
|
|
|
#include "config.h"
|
|
|
|
#include "wine/port.h"
|
|
|
|
|
|
|
|
#include "wine/debug.h"
|
2018-03-09 17:48:46 +01:00
|
|
|
#include "wine/heap.h"
|
2018-03-01 16:37:04 +01:00
|
|
|
#include "wine/vulkan.h"
|
|
|
|
#include "wine/vulkan_driver.h"
|
|
|
|
#include "vulkan_private.h"
|
|
|
|
|
|
|
|
WINE_DEFAULT_DEBUG_CHANNEL(vulkan);
|
|
|
|
|
2018-03-09 17:48:46 +01:00
|
|
|
#if defined(USE_STRUCT_CONVERSION)
|
|
|
|
static inline void convert_VkImageFormatProperties_host_to_win(const VkImageFormatProperties_host *in, VkImageFormatProperties *out)
|
|
|
|
{
|
|
|
|
if (!in) return;
|
|
|
|
|
|
|
|
out->maxExtent = in->maxExtent;
|
|
|
|
out->maxMipLevels = in->maxMipLevels;
|
|
|
|
out->maxArrayLayers = in->maxArrayLayers;
|
|
|
|
out->sampleCounts = in->sampleCounts;
|
|
|
|
out->maxResourceSize = in->maxResourceSize;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline void convert_VkMemoryHeap_static_array_host_to_win(const VkMemoryHeap_host *in, VkMemoryHeap *out, uint32_t count)
|
|
|
|
{
|
|
|
|
unsigned int i;
|
|
|
|
|
|
|
|
if (!in) return;
|
|
|
|
|
|
|
|
for (i = 0; i < count; i++)
|
|
|
|
{
|
|
|
|
out[i].size = in[i].size;
|
|
|
|
out[i].flags = in[i].flags;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline void convert_VkPhysicalDeviceMemoryProperties_host_to_win(const VkPhysicalDeviceMemoryProperties_host *in, VkPhysicalDeviceMemoryProperties *out)
|
|
|
|
{
|
|
|
|
if (!in) return;
|
|
|
|
|
|
|
|
out->memoryTypeCount = in->memoryTypeCount;
|
|
|
|
memcpy(out->memoryTypes, in->memoryTypes, VK_MAX_MEMORY_TYPES * sizeof(VkMemoryType));
|
|
|
|
out->memoryHeapCount = in->memoryHeapCount;
|
|
|
|
convert_VkMemoryHeap_static_array_host_to_win(in->memoryHeaps, out->memoryHeaps, VK_MAX_MEMORY_HEAPS);
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline void convert_VkPhysicalDeviceLimits_host_to_win(const VkPhysicalDeviceLimits_host *in, VkPhysicalDeviceLimits *out)
|
|
|
|
{
|
|
|
|
if (!in) return;
|
|
|
|
|
|
|
|
out->maxImageDimension1D = in->maxImageDimension1D;
|
|
|
|
out->maxImageDimension2D = in->maxImageDimension2D;
|
|
|
|
out->maxImageDimension3D = in->maxImageDimension3D;
|
|
|
|
out->maxImageDimensionCube = in->maxImageDimensionCube;
|
|
|
|
out->maxImageArrayLayers = in->maxImageArrayLayers;
|
|
|
|
out->maxTexelBufferElements = in->maxTexelBufferElements;
|
|
|
|
out->maxUniformBufferRange = in->maxUniformBufferRange;
|
|
|
|
out->maxStorageBufferRange = in->maxStorageBufferRange;
|
|
|
|
out->maxPushConstantsSize = in->maxPushConstantsSize;
|
|
|
|
out->maxMemoryAllocationCount = in->maxMemoryAllocationCount;
|
|
|
|
out->maxSamplerAllocationCount = in->maxSamplerAllocationCount;
|
|
|
|
out->bufferImageGranularity = in->bufferImageGranularity;
|
|
|
|
out->sparseAddressSpaceSize = in->sparseAddressSpaceSize;
|
|
|
|
out->maxBoundDescriptorSets = in->maxBoundDescriptorSets;
|
|
|
|
out->maxPerStageDescriptorSamplers = in->maxPerStageDescriptorSamplers;
|
|
|
|
out->maxPerStageDescriptorUniformBuffers = in->maxPerStageDescriptorUniformBuffers;
|
|
|
|
out->maxPerStageDescriptorStorageBuffers = in->maxPerStageDescriptorStorageBuffers;
|
|
|
|
out->maxPerStageDescriptorSampledImages = in->maxPerStageDescriptorSampledImages;
|
|
|
|
out->maxPerStageDescriptorStorageImages = in->maxPerStageDescriptorStorageImages;
|
|
|
|
out->maxPerStageDescriptorInputAttachments = in->maxPerStageDescriptorInputAttachments;
|
|
|
|
out->maxPerStageResources = in->maxPerStageResources;
|
|
|
|
out->maxDescriptorSetSamplers = in->maxDescriptorSetSamplers;
|
|
|
|
out->maxDescriptorSetUniformBuffers = in->maxDescriptorSetUniformBuffers;
|
|
|
|
out->maxDescriptorSetUniformBuffersDynamic = in->maxDescriptorSetUniformBuffersDynamic;
|
|
|
|
out->maxDescriptorSetStorageBuffers = in->maxDescriptorSetStorageBuffers;
|
|
|
|
out->maxDescriptorSetStorageBuffersDynamic = in->maxDescriptorSetStorageBuffersDynamic;
|
|
|
|
out->maxDescriptorSetSampledImages = in->maxDescriptorSetSampledImages;
|
|
|
|
out->maxDescriptorSetStorageImages = in->maxDescriptorSetStorageImages;
|
|
|
|
out->maxDescriptorSetInputAttachments = in->maxDescriptorSetInputAttachments;
|
|
|
|
out->maxVertexInputAttributes = in->maxVertexInputAttributes;
|
|
|
|
out->maxVertexInputBindings = in->maxVertexInputBindings;
|
|
|
|
out->maxVertexInputAttributeOffset = in->maxVertexInputAttributeOffset;
|
|
|
|
out->maxVertexInputBindingStride = in->maxVertexInputBindingStride;
|
|
|
|
out->maxVertexOutputComponents = in->maxVertexOutputComponents;
|
|
|
|
out->maxTessellationGenerationLevel = in->maxTessellationGenerationLevel;
|
|
|
|
out->maxTessellationPatchSize = in->maxTessellationPatchSize;
|
|
|
|
out->maxTessellationControlPerVertexInputComponents = in->maxTessellationControlPerVertexInputComponents;
|
|
|
|
out->maxTessellationControlPerVertexOutputComponents = in->maxTessellationControlPerVertexOutputComponents;
|
|
|
|
out->maxTessellationControlPerPatchOutputComponents = in->maxTessellationControlPerPatchOutputComponents;
|
|
|
|
out->maxTessellationControlTotalOutputComponents = in->maxTessellationControlTotalOutputComponents;
|
|
|
|
out->maxTessellationEvaluationInputComponents = in->maxTessellationEvaluationInputComponents;
|
|
|
|
out->maxTessellationEvaluationOutputComponents = in->maxTessellationEvaluationOutputComponents;
|
|
|
|
out->maxGeometryShaderInvocations = in->maxGeometryShaderInvocations;
|
|
|
|
out->maxGeometryInputComponents = in->maxGeometryInputComponents;
|
|
|
|
out->maxGeometryOutputComponents = in->maxGeometryOutputComponents;
|
|
|
|
out->maxGeometryOutputVertices = in->maxGeometryOutputVertices;
|
|
|
|
out->maxGeometryTotalOutputComponents = in->maxGeometryTotalOutputComponents;
|
|
|
|
out->maxFragmentInputComponents = in->maxFragmentInputComponents;
|
|
|
|
out->maxFragmentOutputAttachments = in->maxFragmentOutputAttachments;
|
|
|
|
out->maxFragmentDualSrcAttachments = in->maxFragmentDualSrcAttachments;
|
|
|
|
out->maxFragmentCombinedOutputResources = in->maxFragmentCombinedOutputResources;
|
|
|
|
out->maxComputeSharedMemorySize = in->maxComputeSharedMemorySize;
|
|
|
|
memcpy(out->maxComputeWorkGroupCount, in->maxComputeWorkGroupCount, 3 * sizeof(uint32_t));
|
|
|
|
out->maxComputeWorkGroupInvocations = in->maxComputeWorkGroupInvocations;
|
|
|
|
memcpy(out->maxComputeWorkGroupSize, in->maxComputeWorkGroupSize, 3 * sizeof(uint32_t));
|
|
|
|
out->subPixelPrecisionBits = in->subPixelPrecisionBits;
|
|
|
|
out->subTexelPrecisionBits = in->subTexelPrecisionBits;
|
|
|
|
out->mipmapPrecisionBits = in->mipmapPrecisionBits;
|
|
|
|
out->maxDrawIndexedIndexValue = in->maxDrawIndexedIndexValue;
|
|
|
|
out->maxDrawIndirectCount = in->maxDrawIndirectCount;
|
|
|
|
out->maxSamplerLodBias = in->maxSamplerLodBias;
|
|
|
|
out->maxSamplerAnisotropy = in->maxSamplerAnisotropy;
|
|
|
|
out->maxViewports = in->maxViewports;
|
|
|
|
memcpy(out->maxViewportDimensions, in->maxViewportDimensions, 2 * sizeof(uint32_t));
|
|
|
|
memcpy(out->viewportBoundsRange, in->viewportBoundsRange, 2 * sizeof(float));
|
|
|
|
out->viewportSubPixelBits = in->viewportSubPixelBits;
|
|
|
|
out->minMemoryMapAlignment = in->minMemoryMapAlignment;
|
|
|
|
out->minTexelBufferOffsetAlignment = in->minTexelBufferOffsetAlignment;
|
|
|
|
out->minUniformBufferOffsetAlignment = in->minUniformBufferOffsetAlignment;
|
|
|
|
out->minStorageBufferOffsetAlignment = in->minStorageBufferOffsetAlignment;
|
|
|
|
out->minTexelOffset = in->minTexelOffset;
|
|
|
|
out->maxTexelOffset = in->maxTexelOffset;
|
|
|
|
out->minTexelGatherOffset = in->minTexelGatherOffset;
|
|
|
|
out->maxTexelGatherOffset = in->maxTexelGatherOffset;
|
|
|
|
out->minInterpolationOffset = in->minInterpolationOffset;
|
|
|
|
out->maxInterpolationOffset = in->maxInterpolationOffset;
|
|
|
|
out->subPixelInterpolationOffsetBits = in->subPixelInterpolationOffsetBits;
|
|
|
|
out->maxFramebufferWidth = in->maxFramebufferWidth;
|
|
|
|
out->maxFramebufferHeight = in->maxFramebufferHeight;
|
|
|
|
out->maxFramebufferLayers = in->maxFramebufferLayers;
|
|
|
|
out->framebufferColorSampleCounts = in->framebufferColorSampleCounts;
|
|
|
|
out->framebufferDepthSampleCounts = in->framebufferDepthSampleCounts;
|
|
|
|
out->framebufferStencilSampleCounts = in->framebufferStencilSampleCounts;
|
|
|
|
out->framebufferNoAttachmentsSampleCounts = in->framebufferNoAttachmentsSampleCounts;
|
|
|
|
out->maxColorAttachments = in->maxColorAttachments;
|
|
|
|
out->sampledImageColorSampleCounts = in->sampledImageColorSampleCounts;
|
|
|
|
out->sampledImageIntegerSampleCounts = in->sampledImageIntegerSampleCounts;
|
|
|
|
out->sampledImageDepthSampleCounts = in->sampledImageDepthSampleCounts;
|
|
|
|
out->sampledImageStencilSampleCounts = in->sampledImageStencilSampleCounts;
|
|
|
|
out->storageImageSampleCounts = in->storageImageSampleCounts;
|
|
|
|
out->maxSampleMaskWords = in->maxSampleMaskWords;
|
|
|
|
out->timestampComputeAndGraphics = in->timestampComputeAndGraphics;
|
|
|
|
out->timestampPeriod = in->timestampPeriod;
|
|
|
|
out->maxClipDistances = in->maxClipDistances;
|
|
|
|
out->maxCullDistances = in->maxCullDistances;
|
|
|
|
out->maxCombinedClipAndCullDistances = in->maxCombinedClipAndCullDistances;
|
|
|
|
out->discreteQueuePriorities = in->discreteQueuePriorities;
|
|
|
|
memcpy(out->pointSizeRange, in->pointSizeRange, 2 * sizeof(float));
|
|
|
|
memcpy(out->lineWidthRange, in->lineWidthRange, 2 * sizeof(float));
|
|
|
|
out->pointSizeGranularity = in->pointSizeGranularity;
|
|
|
|
out->lineWidthGranularity = in->lineWidthGranularity;
|
|
|
|
out->strictLines = in->strictLines;
|
|
|
|
out->standardSampleLocations = in->standardSampleLocations;
|
|
|
|
out->optimalBufferCopyOffsetAlignment = in->optimalBufferCopyOffsetAlignment;
|
|
|
|
out->optimalBufferCopyRowPitchAlignment = in->optimalBufferCopyRowPitchAlignment;
|
|
|
|
out->nonCoherentAtomSize = in->nonCoherentAtomSize;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline void convert_VkPhysicalDeviceProperties_host_to_win(const VkPhysicalDeviceProperties_host *in, VkPhysicalDeviceProperties *out)
|
|
|
|
{
|
|
|
|
if (!in) return;
|
|
|
|
|
|
|
|
out->apiVersion = in->apiVersion;
|
|
|
|
out->driverVersion = in->driverVersion;
|
|
|
|
out->vendorID = in->vendorID;
|
|
|
|
out->deviceID = in->deviceID;
|
|
|
|
out->deviceType = in->deviceType;
|
|
|
|
memcpy(out->deviceName, in->deviceName, VK_MAX_PHYSICAL_DEVICE_NAME_SIZE * sizeof(char));
|
|
|
|
memcpy(out->pipelineCacheUUID, in->pipelineCacheUUID, VK_UUID_SIZE * sizeof(uint8_t));
|
|
|
|
convert_VkPhysicalDeviceLimits_host_to_win(&in->limits, &out->limits);
|
|
|
|
out->sparseProperties = in->sparseProperties;
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif /* USE_STRUCT_CONVERSION */
|
|
|
|
|
2018-03-01 16:37:04 +01:00
|
|
|
static VkResult WINAPI wine_vkCreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkDevice *pDevice)
|
|
|
|
{
|
|
|
|
FIXME("stub: %p, %p, %p, %p\n", physicalDevice, pCreateInfo, pAllocator, pDevice);
|
|
|
|
return VK_ERROR_OUT_OF_HOST_MEMORY;
|
|
|
|
}
|
|
|
|
|
|
|
|
static VkResult WINAPI wine_vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount, VkLayerProperties *pProperties)
|
|
|
|
{
|
2018-03-09 17:48:46 +01:00
|
|
|
TRACE("%p, %p, %p\n", physicalDevice, pPropertyCount, pProperties);
|
|
|
|
return physicalDevice->instance->funcs.p_vkEnumerateDeviceLayerProperties(physicalDevice->phys_dev, pPropertyCount, pProperties);
|
2018-03-01 16:37:04 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
static void WINAPI wine_vkGetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures *pFeatures)
|
|
|
|
{
|
2018-03-09 17:48:46 +01:00
|
|
|
TRACE("%p, %p\n", physicalDevice, pFeatures);
|
|
|
|
physicalDevice->instance->funcs.p_vkGetPhysicalDeviceFeatures(physicalDevice->phys_dev, pFeatures);
|
2018-03-01 16:37:04 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
static void WINAPI wine_vkGetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkFormatProperties *pFormatProperties)
|
|
|
|
{
|
2018-03-09 17:48:46 +01:00
|
|
|
TRACE("%p, %d, %p\n", physicalDevice, format, pFormatProperties);
|
|
|
|
physicalDevice->instance->funcs.p_vkGetPhysicalDeviceFormatProperties(physicalDevice->phys_dev, format, pFormatProperties);
|
2018-03-01 16:37:04 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
static VkResult WINAPI wine_vkGetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags, VkImageFormatProperties *pImageFormatProperties)
|
|
|
|
{
|
2018-03-09 17:48:46 +01:00
|
|
|
#if defined(USE_STRUCT_CONVERSION)
|
|
|
|
VkResult result;
|
|
|
|
VkImageFormatProperties_host pImageFormatProperties_host;
|
|
|
|
TRACE("%p, %d, %d, %d, %#x, %#x, %p\n", physicalDevice, format, type, tiling, usage, flags, pImageFormatProperties);
|
|
|
|
|
|
|
|
result = physicalDevice->instance->funcs.p_vkGetPhysicalDeviceImageFormatProperties(physicalDevice->phys_dev, format, type, tiling, usage, flags, &pImageFormatProperties_host);
|
|
|
|
|
|
|
|
convert_VkImageFormatProperties_host_to_win(&pImageFormatProperties_host, pImageFormatProperties);
|
|
|
|
return result;
|
|
|
|
#else
|
|
|
|
TRACE("%p, %d, %d, %d, %#x, %#x, %p\n", physicalDevice, format, type, tiling, usage, flags, pImageFormatProperties);
|
|
|
|
return physicalDevice->instance->funcs.p_vkGetPhysicalDeviceImageFormatProperties(physicalDevice->phys_dev, format, type, tiling, usage, flags, pImageFormatProperties);
|
|
|
|
#endif
|
2018-03-01 16:37:04 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
static void WINAPI wine_vkGetPhysicalDeviceMemoryProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceMemoryProperties *pMemoryProperties)
|
|
|
|
{
|
2018-03-09 17:48:46 +01:00
|
|
|
#if defined(USE_STRUCT_CONVERSION)
|
|
|
|
VkPhysicalDeviceMemoryProperties_host pMemoryProperties_host;
|
|
|
|
TRACE("%p, %p\n", physicalDevice, pMemoryProperties);
|
|
|
|
|
|
|
|
physicalDevice->instance->funcs.p_vkGetPhysicalDeviceMemoryProperties(physicalDevice->phys_dev, &pMemoryProperties_host);
|
|
|
|
|
|
|
|
convert_VkPhysicalDeviceMemoryProperties_host_to_win(&pMemoryProperties_host, pMemoryProperties);
|
|
|
|
#else
|
|
|
|
TRACE("%p, %p\n", physicalDevice, pMemoryProperties);
|
|
|
|
physicalDevice->instance->funcs.p_vkGetPhysicalDeviceMemoryProperties(physicalDevice->phys_dev, pMemoryProperties);
|
|
|
|
#endif
|
2018-03-01 16:37:04 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
static void WINAPI wine_vkGetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties *pProperties)
|
|
|
|
{
|
2018-03-09 17:48:46 +01:00
|
|
|
#if defined(USE_STRUCT_CONVERSION)
|
|
|
|
VkPhysicalDeviceProperties_host pProperties_host;
|
|
|
|
TRACE("%p, %p\n", physicalDevice, pProperties);
|
|
|
|
|
|
|
|
physicalDevice->instance->funcs.p_vkGetPhysicalDeviceProperties(physicalDevice->phys_dev, &pProperties_host);
|
|
|
|
|
|
|
|
convert_VkPhysicalDeviceProperties_host_to_win(&pProperties_host, pProperties);
|
|
|
|
#else
|
|
|
|
TRACE("%p, %p\n", physicalDevice, pProperties);
|
|
|
|
physicalDevice->instance->funcs.p_vkGetPhysicalDeviceProperties(physicalDevice->phys_dev, pProperties);
|
|
|
|
#endif
|
2018-03-01 16:37:04 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
static void WINAPI wine_vkGetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice, uint32_t *pQueueFamilyPropertyCount, VkQueueFamilyProperties *pQueueFamilyProperties)
|
|
|
|
{
|
2018-03-09 17:48:46 +01:00
|
|
|
TRACE("%p, %p, %p\n", physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
|
|
|
|
physicalDevice->instance->funcs.p_vkGetPhysicalDeviceQueueFamilyProperties(physicalDevice->phys_dev, pQueueFamilyPropertyCount, pQueueFamilyProperties);
|
2018-03-01 16:37:04 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
static void WINAPI wine_vkGetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling, uint32_t *pPropertyCount, VkSparseImageFormatProperties *pProperties)
|
|
|
|
{
|
2018-03-09 17:48:46 +01:00
|
|
|
TRACE("%p, %d, %d, %d, %#x, %d, %p, %p\n", physicalDevice, format, type, samples, usage, tiling, pPropertyCount, pProperties);
|
|
|
|
physicalDevice->instance->funcs.p_vkGetPhysicalDeviceSparseImageFormatProperties(physicalDevice->phys_dev, format, type, samples, usage, tiling, pPropertyCount, pProperties);
|
2018-03-01 16:37:04 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
static const struct vulkan_func vk_instance_dispatch_table[] =
|
|
|
|
{
|
|
|
|
{"vkCreateDevice", &wine_vkCreateDevice},
|
|
|
|
{"vkDestroyInstance", &wine_vkDestroyInstance},
|
|
|
|
{"vkEnumerateDeviceExtensionProperties", &wine_vkEnumerateDeviceExtensionProperties},
|
|
|
|
{"vkEnumerateDeviceLayerProperties", &wine_vkEnumerateDeviceLayerProperties},
|
|
|
|
{"vkEnumeratePhysicalDevices", &wine_vkEnumeratePhysicalDevices},
|
|
|
|
{"vkGetPhysicalDeviceFeatures", &wine_vkGetPhysicalDeviceFeatures},
|
|
|
|
{"vkGetPhysicalDeviceFormatProperties", &wine_vkGetPhysicalDeviceFormatProperties},
|
|
|
|
{"vkGetPhysicalDeviceImageFormatProperties", &wine_vkGetPhysicalDeviceImageFormatProperties},
|
|
|
|
{"vkGetPhysicalDeviceMemoryProperties", &wine_vkGetPhysicalDeviceMemoryProperties},
|
|
|
|
{"vkGetPhysicalDeviceProperties", &wine_vkGetPhysicalDeviceProperties},
|
|
|
|
{"vkGetPhysicalDeviceQueueFamilyProperties", &wine_vkGetPhysicalDeviceQueueFamilyProperties},
|
|
|
|
{"vkGetPhysicalDeviceSparseImageFormatProperties", &wine_vkGetPhysicalDeviceSparseImageFormatProperties},
|
|
|
|
};
|
|
|
|
|
|
|
|
void *wine_vk_get_instance_proc_addr(const char *name)
|
|
|
|
{
|
|
|
|
unsigned int i;
|
|
|
|
for (i = 0; i < ARRAY_SIZE(vk_instance_dispatch_table); i++)
|
|
|
|
{
|
|
|
|
if (strcmp(vk_instance_dispatch_table[i].name, name) == 0)
|
|
|
|
{
|
|
|
|
TRACE("Found pName=%s in instance table\n", name);
|
|
|
|
return vk_instance_dispatch_table[i].func;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|