[PATCH 2/5] vulkan-1: Add stub implementation.
Roderick Colenbrander
thunderbird2k at gmail.com
Tue Mar 27 02:00:03 CDT 2018
Signed-off-by: Roderick Colenbrander <thunderbird2k at gmail.com>
---
configure.ac | 1 +
dlls/vulkan-1/Makefile.in | 6 ++
dlls/vulkan-1/version.rc | 27 ++++++++
dlls/vulkan-1/vulkan-1.spec | 158 ++++++++++++++++++++++++++++++++++++++++++++
dlls/vulkan-1/vulkan.c | 70 ++++++++++++++++++++
dlls/winevulkan/make_vulkan | 81 ++++++++++++++++++++---
6 files changed, 335 insertions(+), 8 deletions(-)
create mode 100644 dlls/vulkan-1/Makefile.in
create mode 100644 dlls/vulkan-1/version.rc
create mode 100644 dlls/vulkan-1/vulkan-1.spec
create mode 100644 dlls/vulkan-1/vulkan.c
diff --git a/configure.ac b/configure.ac
index 6a30601ca0..60c410c1f1 100644
--- a/configure.ac
+++ b/configure.ac
@@ -3692,6 +3692,7 @@ WINE_CONFIG_MAKEFILE(dlls/vnbt.vxd,enable_win16)
WINE_CONFIG_MAKEFILE(dlls/vnetbios.vxd,enable_win16)
WINE_CONFIG_MAKEFILE(dlls/vssapi)
WINE_CONFIG_MAKEFILE(dlls/vtdapi.vxd,enable_win16)
+WINE_CONFIG_MAKEFILE(dlls/vulkan-1)
WINE_CONFIG_MAKEFILE(dlls/vwin32.vxd,enable_win16)
WINE_CONFIG_MAKEFILE(dlls/w32skrnl,enable_win16)
WINE_CONFIG_MAKEFILE(dlls/w32sys.dll16,enable_win16)
diff --git a/dlls/vulkan-1/Makefile.in b/dlls/vulkan-1/Makefile.in
new file mode 100644
index 0000000000..e137fd277f
--- /dev/null
+++ b/dlls/vulkan-1/Makefile.in
@@ -0,0 +1,6 @@
+MODULE = vulkan-1.dll
+
+C_SRCS = \
+ vulkan.c
+
+RC_SRCS = version.rc
diff --git a/dlls/vulkan-1/version.rc b/dlls/vulkan-1/version.rc
new file mode 100644
index 0000000000..ec75462ddf
--- /dev/null
+++ b/dlls/vulkan-1/version.rc
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2018 Roderick Colenbrander
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "config.h" /* Needed to get PACKAGE_VERSION */
+
+#define WINE_FILEDESCRIPTION_STR "Wine Vulkan Loader"
+#define WINE_FILENAME_STR "vulkan-1.dll"
+#define WINE_FILEVERSION_STR PACKAGE_VERSION
+#define WINE_PRODUCTVERSION_STR PACKAGE_VERSION
+#define WINE_PRODUCTNAME_STR "Wine Vulkan"
+
+#include "wine/wine_common_ver.rc"
diff --git a/dlls/vulkan-1/vulkan-1.spec b/dlls/vulkan-1/vulkan-1.spec
new file mode 100644
index 0000000000..088a3f23ac
--- /dev/null
+++ b/dlls/vulkan-1/vulkan-1.spec
@@ -0,0 +1,158 @@
+# Automatically generated from Vulkan vk.xml; DO NOT EDIT!
+
+@ stub vkAcquireNextImageKHR
+@ stub vkAllocateCommandBuffers
+@ stub vkAllocateDescriptorSets
+@ stub vkAllocateMemory
+@ stub vkBeginCommandBuffer
+@ stub vkBindBufferMemory
+@ stub vkBindImageMemory
+@ stub vkCmdBeginQuery
+@ stub vkCmdBeginRenderPass
+@ stub vkCmdBindDescriptorSets
+@ stub vkCmdBindIndexBuffer
+@ stub vkCmdBindPipeline
+@ stub vkCmdBindVertexBuffers
+@ stub vkCmdBlitImage
+@ stub vkCmdClearAttachments
+@ stub vkCmdClearColorImage
+@ stub vkCmdClearDepthStencilImage
+@ stub vkCmdCopyBuffer
+@ stub vkCmdCopyBufferToImage
+@ stub vkCmdCopyImage
+@ stub vkCmdCopyImageToBuffer
+@ stub vkCmdCopyQueryPoolResults
+@ stub vkCmdDispatch
+@ stub vkCmdDispatchIndirect
+@ stub vkCmdDraw
+@ stub vkCmdDrawIndexed
+@ stub vkCmdDrawIndexedIndirect
+@ stub vkCmdDrawIndirect
+@ stub vkCmdEndQuery
+@ stub vkCmdEndRenderPass
+@ stub vkCmdExecuteCommands
+@ stub vkCmdFillBuffer
+@ stub vkCmdNextSubpass
+@ stub vkCmdPipelineBarrier
+@ stub vkCmdPushConstants
+@ stub vkCmdResetEvent
+@ stub vkCmdResetQueryPool
+@ stub vkCmdResolveImage
+@ stub vkCmdSetBlendConstants
+@ stub vkCmdSetDepthBias
+@ stub vkCmdSetDepthBounds
+@ stub vkCmdSetEvent
+@ stub vkCmdSetLineWidth
+@ stub vkCmdSetScissor
+@ stub vkCmdSetStencilCompareMask
+@ stub vkCmdSetStencilReference
+@ stub vkCmdSetStencilWriteMask
+@ stub vkCmdSetViewport
+@ stub vkCmdUpdateBuffer
+@ stub vkCmdWaitEvents
+@ stub vkCmdWriteTimestamp
+@ stub vkCreateBuffer
+@ stub vkCreateBufferView
+@ stub vkCreateCommandPool
+@ stub vkCreateComputePipelines
+@ stub vkCreateDescriptorPool
+@ stub vkCreateDescriptorSetLayout
+@ stub vkCreateDevice
+@ stub vkCreateDisplayModeKHR
+@ stub vkCreateDisplayPlaneSurfaceKHR
+@ stub vkCreateEvent
+@ stub vkCreateFence
+@ stub vkCreateFramebuffer
+@ stub vkCreateGraphicsPipelines
+@ stub vkCreateImage
+@ stub vkCreateImageView
+@ stdcall vkCreateInstance(ptr ptr ptr)
+@ stub vkCreatePipelineCache
+@ stub vkCreatePipelineLayout
+@ stub vkCreateQueryPool
+@ stub vkCreateRenderPass
+@ stub vkCreateSampler
+@ stub vkCreateSemaphore
+@ stub vkCreateShaderModule
+@ stub vkCreateSwapchainKHR
+@ stub vkCreateWin32SurfaceKHR
+@ stub vkDestroyBuffer
+@ stub vkDestroyBufferView
+@ stub vkDestroyCommandPool
+@ stub vkDestroyDescriptorPool
+@ stub vkDestroyDescriptorSetLayout
+@ stub vkDestroyDevice
+@ stub vkDestroyEvent
+@ stub vkDestroyFence
+@ stub vkDestroyFramebuffer
+@ stub vkDestroyImage
+@ stub vkDestroyImageView
+@ stub vkDestroyInstance
+@ stub vkDestroyPipeline
+@ stub vkDestroyPipelineCache
+@ stub vkDestroyPipelineLayout
+@ stub vkDestroyQueryPool
+@ stub vkDestroyRenderPass
+@ stub vkDestroySampler
+@ stub vkDestroySemaphore
+@ stub vkDestroyShaderModule
+@ stub vkDestroySurfaceKHR
+@ stub vkDestroySwapchainKHR
+@ stub vkDeviceWaitIdle
+@ stub vkEndCommandBuffer
+@ stub vkEnumerateDeviceExtensionProperties
+@ stub vkEnumerateDeviceLayerProperties
+@ stdcall vkEnumerateInstanceExtensionProperties(str ptr ptr)
+@ stdcall vkEnumerateInstanceLayerProperties(ptr ptr)
+@ stub vkEnumeratePhysicalDevices
+@ stub vkFlushMappedMemoryRanges
+@ stub vkFreeCommandBuffers
+@ stub vkFreeDescriptorSets
+@ stub vkFreeMemory
+@ stub vkGetBufferMemoryRequirements
+@ stub vkGetDeviceMemoryCommitment
+@ stub vkGetDeviceProcAddr
+@ stub vkGetDeviceQueue
+@ stub vkGetDisplayModePropertiesKHR
+@ stub vkGetDisplayPlaneCapabilitiesKHR
+@ stub vkGetDisplayPlaneSupportedDisplaysKHR
+@ stub vkGetEventStatus
+@ stub vkGetFenceStatus
+@ stub vkGetImageMemoryRequirements
+@ stub vkGetImageSparseMemoryRequirements
+@ stub vkGetImageSubresourceLayout
+@ stdcall vkGetInstanceProcAddr(ptr str)
+@ stub vkGetPhysicalDeviceDisplayPlanePropertiesKHR
+@ stub vkGetPhysicalDeviceDisplayPropertiesKHR
+@ stub vkGetPhysicalDeviceFeatures
+@ stub vkGetPhysicalDeviceFormatProperties
+@ stub vkGetPhysicalDeviceImageFormatProperties
+@ stub vkGetPhysicalDeviceMemoryProperties
+@ stub vkGetPhysicalDeviceProperties
+@ stub vkGetPhysicalDeviceQueueFamilyProperties
+@ stub vkGetPhysicalDeviceSparseImageFormatProperties
+@ stub vkGetPhysicalDeviceSurfaceCapabilitiesKHR
+@ stub vkGetPhysicalDeviceSurfaceFormatsKHR
+@ stub vkGetPhysicalDeviceSurfacePresentModesKHR
+@ stub vkGetPhysicalDeviceSurfaceSupportKHR
+@ stub vkGetPhysicalDeviceWin32PresentationSupportKHR
+@ stub vkGetPipelineCacheData
+@ stub vkGetQueryPoolResults
+@ stub vkGetRenderAreaGranularity
+@ stub vkGetSwapchainImagesKHR
+@ stub vkInvalidateMappedMemoryRanges
+@ stub vkMapMemory
+@ stub vkMergePipelineCaches
+@ stub vkQueueBindSparse
+@ stub vkQueuePresentKHR
+@ stub vkQueueSubmit
+@ stub vkQueueWaitIdle
+@ stub vkResetCommandBuffer
+@ stub vkResetCommandPool
+@ stub vkResetDescriptorPool
+@ stub vkResetEvent
+@ stub vkResetFences
+@ stub vkSetEvent
+@ stub vkUnmapMemory
+@ stub vkUpdateDescriptorSets
+@ stub vkWaitForFences
diff --git a/dlls/vulkan-1/vulkan.c b/dlls/vulkan-1/vulkan.c
new file mode 100644
index 0000000000..b8db08a312
--- /dev/null
+++ b/dlls/vulkan-1/vulkan.c
@@ -0,0 +1,70 @@
+/* Wine Vulkan loader implementation
+ *
+ * Copyright 2018 Roderick Colenbrander
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <stdarg.h>
+
+#include "windef.h"
+#include "winbase.h"
+
+#include "wine/debug.h"
+#include "wine/vulkan.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(vulkan);
+
+VkResult WINAPI vkCreateInstance(const VkInstanceCreateInfo *create_info,
+ const VkAllocationCallbacks *allocator, VkInstance *instance)
+{
+ FIXME("stub: create_info %p, allocator %p, instance %p\n", create_info, allocator, instance);
+ return VK_ERROR_OUT_OF_HOST_MEMORY;
+}
+
+VkResult WINAPI vkEnumerateInstanceExtensionProperties(const char *layer_name,
+ uint32_t *count, VkExtensionProperties *properties)
+{
+ FIXME("stub: %p %p %p\n", layer_name, count, properties);
+ return VK_ERROR_OUT_OF_HOST_MEMORY;
+}
+
+VkResult WINAPI vkEnumerateInstanceLayerProperties(uint32_t *count, VkLayerProperties *properties)
+{
+ TRACE("%p, %p\n", count, properties);
+
+ /* We don't support any layers. */
+ *count = 0;
+ return VK_SUCCESS;
+}
+
+PFN_vkVoidFunction WINAPI vkGetInstanceProcAddr(VkInstance instance, const char *name)
+{
+ FIXME("stub: %p %s\n", instance, debugstr_a(name));
+ return NULL;
+}
+
+BOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, void *reserved)
+{
+ TRACE("(%p, %u, %p)\n", hinst, reason, reserved);
+
+ switch (reason)
+ {
+ case DLL_PROCESS_ATTACH:
+ DisableThreadLibraryCalls(hinst);
+ return TRUE;
+ }
+ return TRUE;
+}
diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan
index bb02b2aa92..b7b37f42cc 100755
--- a/dlls/winevulkan/make_vulkan
+++ b/dlls/winevulkan/make_vulkan
@@ -65,6 +65,7 @@ LOGGER.addHandler(logging.StreamHandler())
# Filenames to create.
WINE_VULKAN_H = "../../include/wine/vulkan.h"
WINE_VULKAN_DRIVER_H = "../../include/wine/vulkan_driver.h"
+WINE_VULKAN_LOADER_SPEC = "../vulkan-1/vulkan-1.spec"
WINE_VULKAN_THUNKS_C = "vulkan_thunks.c"
WINE_VULKAN_THUNKS_H = "vulkan_thunks.h"
@@ -107,6 +108,15 @@ BLACKLISTED_EXTENSIONS = [
"VK_NV_external_memory_win32"
]
+# The Vulkan provides entry-points for core functionality and some important
+# extension. Based on vulkan-1.def this amounts to WSI extensions on 1.0.51.
+CORE_EXTENSIONS = [
+ "VK_KHR_display",
+ "VK_KHR_surface",
+ "VK_KHR_swapchain",
+ "VK_KHR_win32_surface"
+]
+
# Functions part of our winevulkan graphics driver interface.
# DRIVER_VERSION should be bumped on any change to driver interface
# in FUNCTION_OVERRIDES
@@ -382,6 +392,21 @@ class VkFunction(object):
return conversions
+ def is_core_func(self):
+ """ Returns if the function is a Vulkan core function.
+ We consider core functions to be functions any global, instance or
+ device functions not belonging to an extension in addition to a few
+ KHR WSI extensions exported by the loader.
+ """
+
+ if self.extension is None:
+ return True
+
+ if self.extension in CORE_EXTENSIONS:
+ return True
+
+ return False
+
def is_device_func(self):
# If none of the other, it must be a device function
return not self.is_global_func() and not self.is_instance_func()
@@ -555,6 +580,11 @@ class VkFunction(object):
return body
+ def spec(self):
+ """ Generate spec file entry for this function. """
+ params = " ".join([p.spec() for p in self.params])
+ return "@ stdcall {0}({1})\n".format(self.name, params)
+
def stub(self, call_conv=None, prefix=None):
stub = self.prototype(call_conv=call_conv, prefix=prefix)
stub += "\n{\n"
@@ -1300,6 +1330,28 @@ class VkParam(object):
def needs_output_conversion(self):
return self.output_conv is not None
+ def spec(self):
+ """ Generate spec file entry for this parameter. """
+
+ if self.type_info["category"] == "bitmask":
+ return "long"
+ if self.type_info["category"] == "enum":
+ return "long"
+ if self.is_pointer() and self.type == "char":
+ return "str"
+ if self.is_dispatchable() or self.is_pointer() or self.is_static_array():
+ return "ptr"
+ if self.is_handle() and not self.is_dispatchable():
+ return "int64"
+ if self.type == "float":
+ return "float"
+ if self.type in ["int", "int32_t", "size_t", "uint32_t", "VkBool32"]:
+ return "long"
+ if self.type in ["uint64_t", "VkDeviceSize"]:
+ return "int64"
+
+ LOGGER.error("Unhandled spec conversion for type: {0}".format(self.type))
+
def variable(self, conv=False):
""" Returns 'glue' code during generation of a function call on how to access the variable.
This function handles various scenarios such as 'unwrapping' if dispatchable objects and
@@ -2061,6 +2113,17 @@ class VkGenerator(object):
f.write("extern const struct vulkan_funcs * CDECL __wine_get_vulkan_driver(HDC hdc, UINT version);\n\n")
f.write("#endif /* __WINE_VULKAN_DRIVER_H */\n")
+ def generate_vulkan_loader_spec(self, f):
+ f.write("# Automatically generated from Vulkan vk.xml; DO NOT EDIT!\n\n")
+
+ for func in self.registry.funcs.values():
+ if not func.is_core_func():
+ continue
+
+ if func.is_global_func():
+ f.write(func.spec())
+ else:
+ f.write("@ stub {0}\n".format(func.name))
class VkRegistry(object):
def __init__(self, reg_filename):
@@ -2201,6 +2264,13 @@ class VkRegistry(object):
for ext in exts:
ext_name = ext.attrib["name"]
+ # Set extension name on any functions calls part of this extension as we
+ # were not aware of the name during initial parsing.
+ commands = ext.findall("require/command")
+ for command in commands:
+ cmd_name = command.attrib["name"]
+ self.funcs[cmd_name].extension = ext_name
+
# Some extensions are not ready or have numbers reserved as a place holder.
if ext.attrib["supported"] == "disabled":
LOGGER.debug("Skipping disabled extension: {0}".format(ext_name))
@@ -2267,20 +2337,12 @@ class VkRegistry(object):
ext_info = {"name" : ext_name, "type" : ext_type}
extensions.append(ext_info)
- commands = ext.findall("require/command")
- if not commands:
- continue
-
# Pull in any commands we need. We infer types to pull in from the command
# as well.
for command in commands:
cmd_name = command.attrib["name"]
self._mark_command_required(cmd_name)
- # Set extension name on the function call as we were not aware of the
- # name during initial parsing.
- self.funcs[cmd_name].extension = ext_name
-
# Sort in alphabetical order.
self.extensions = sorted(extensions, key=lambda ext: ext["name"])
@@ -2444,5 +2506,8 @@ def main():
with open(WINE_VULKAN_THUNKS_C, "w") as f:
generator.generate_thunks_c(f, "wine_")
+ with open(WINE_VULKAN_LOADER_SPEC, "w") as f:
+ generator.generate_vulkan_loader_spec(f)
+
if __name__ == "__main__":
main()
--
2.14.3
More information about the wine-devel
mailing list