Commit 5e3c9d53 by Alexis Hetu Committed by Alexis Hétu

32 bit compilation fixes for Visual Studio

This cl fixes all issues related to building Vulkan using the x86 compiler in Visual Studio: - Added dummy function to prevent compiler crash in VkGetProcAddress.cpp - Added missing WIN32 check in SwiftShader's Vulkan unit tests - Removed alignment code which broke Win32 DLL. Removing all of it should work on all other platforms as well. Minor nit fix: - Renamed VkWrapper to VkNonDispatchableHandle, which is a more accurate name. Bug b/129979580 Change-Id: Ib2bf305433e9aae71ff6f9d796fb86bc7ea733b0 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/31609Tested-by: 's avatarAlexis Hétu <sugoi@google.com> Presubmit-Ready: Alexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <nicolascapens@google.com>
parent c0d7ee45
......@@ -429,3 +429,36 @@ extern "C" hwvulkan_module_t HAL_MODULE_INFO_SYM =
};
#endif
#if defined(_MSC_VER) && !defined(_WIN64)
namespace
{
// The following function is a hack to allow compilation in Visual Studio using the 32 bit compiler"
// "fatal error C1001: An internal error has occurred in the compiler.
// (compiler file 'd:\agent\_work\1\s\src\vctools\compiler\utc\src\p2\main.c', line 187)"
void Dummy()
{
{ VkSemaphore handle; }
{ VkFence handle; }
{ VkDeviceMemory handle; }
{ VkBuffer handle; }
{ VkImage handle; }
{ VkEvent handle; }
{ VkQueryPool handle; }
{ VkBufferView handle; }
{ VkImageView handle; }
{ VkShaderModule handle; }
{ VkPipelineCache handle; }
{ VkPipelineLayout handle; }
{ VkRenderPass handle; }
{ VkPipeline handle; }
{ VkDescriptorSetLayout handle; }
{ VkSampler handle; }
{ VkDescriptorPool handle; }
{ VkFramebuffer handle; }
{ VkCommandPool handle; }
{ VkSamplerYcbcrConversion handle; }
{ VkDescriptorUpdateTemplate handle; }
}
}
#endif
\ No newline at end of file
......@@ -18,20 +18,10 @@
#include <cstddef>
#include <cstdint>
// We can't directly use alignas(uint64_t) because on some platforms a uint64_t
// has an alignment of 8 outside of a struct but inside it has an alignment of
// 4. We use this dummy struct to figure out the alignment of uint64_t inside a
// struct.
struct DummyUInt64Wrapper {
uint64_t dummy;
};
static constexpr size_t kNativeVkHandleAlignment = alignof(DummyUInt64Wrapper);
template<typename HandleType> class alignas(kNativeVkHandleAlignment) VkWrapperBase
template<typename HandleType> class VkNonDispatchableHandleBase
{
public:
VkWrapperBase(HandleType handle)
VkNonDispatchableHandleBase(HandleType handle)
{
u.dummy = 0;
u.handle = handle;
......@@ -57,23 +47,23 @@ private:
union PointerHandleUnion
{
HandleType handle;
uint64_t dummy; // VkWrapper's size must always be 64 bits even when void* is 32 bits
uint64_t dummy; // VkNonDispatchableHandle's size must always be 64 bits even when void* is 32 bits
};
PointerHandleUnion u;
};
template<typename T> class alignas(kNativeVkHandleAlignment) VkWrapper : public VkWrapperBase<T>
template<typename T> class VkNonDispatchableHandle : public VkNonDispatchableHandleBase<T>
{
public:
using HandleType = T;
VkWrapper() : VkWrapperBase<T>(nullptr)
VkNonDispatchableHandle() : VkNonDispatchableHandleBase<T>(nullptr)
{
}
VkWrapper(HandleType handle) : VkWrapperBase<T>(handle)
VkNonDispatchableHandle(HandleType handle) : VkNonDispatchableHandleBase<T>(handle)
{
static_assert(sizeof(VkWrapper) == sizeof(uint64_t), "Size is not 64 bits!");
static_assert(sizeof(VkNonDispatchableHandle) == sizeof(uint64_t), "Size is not 64 bits!");
}
void operator=(HandleType handle)
......@@ -85,14 +75,14 @@ public:
// VkDescriptorSet objects are really just memory in the VkDescriptorPool
// object, so define different/more convenient operators for this object.
struct VkDescriptorSet_T;
template<> class alignas(kNativeVkHandleAlignment) VkWrapper<VkDescriptorSet_T*> : public VkWrapperBase<uint8_t*>
template<> class VkNonDispatchableHandle<VkDescriptorSet_T*> : public VkNonDispatchableHandleBase<uint8_t*>
{
public:
using HandleType = uint8_t*;
VkWrapper(HandleType handle) : VkWrapperBase<uint8_t*>(handle)
VkNonDispatchableHandle(HandleType handle) : VkNonDispatchableHandleBase<uint8_t*>(handle)
{
static_assert(sizeof(VkWrapper) == sizeof(uint64_t), "Size is not 64 bits!");
static_assert(sizeof(VkNonDispatchableHandle) == sizeof(uint64_t), "Size is not 64 bits!");
}
HandleType operator+(ptrdiff_t rhs) const
......@@ -113,7 +103,7 @@ public:
#define VK_DEFINE_NON_DISPATCHABLE_HANDLE(object) \
typedef struct object##_T *object##Ptr; \
typedef VkWrapper<object##Ptr> object;
typedef VkNonDispatchableHandle<object##Ptr> object;
#include <vulkan/vulkan.h>
......
......@@ -14,7 +14,7 @@
#include "Driver.hpp"
#if defined(_WIN64)
#if defined(_WIN32)
# include "Windows.h"
# define OS_WINDOWS 1
#elif defined(__APPLE__)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment