blob: 068d3ebe263b22e4e6fe644ad12bc4affa1c4ff7 [file] [log] [blame]
// Copyright 2019 The SwiftShader Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef VULKAN_PLATFORM
#define VULKAN_PLATFORM
#include <cstddef>
#include <cstdint>
template<typename HandleType> class VkNonDispatchableHandleBase
{
public:
VkNonDispatchableHandleBase(HandleType handle)
{
u.dummy = 0;
u.handle = handle;
}
HandleType get() const
{
return u.handle;
}
operator HandleType() const
{
return u.handle;
}
protected:
HandleType set(HandleType handle)
{
return (u.handle = handle);
}
private:
union PointerHandleUnion
{
HandleType handle;
uint64_t dummy; // VkNonDispatchableHandle's size must always be 64 bits even when void* is 32 bits
};
PointerHandleUnion u;
};
template<typename T> class VkNonDispatchableHandle : public VkNonDispatchableHandleBase<T>
{
public:
using HandleType = T;
VkNonDispatchableHandle() : VkNonDispatchableHandleBase<T>(nullptr)
{
}
VkNonDispatchableHandle(HandleType handle) : VkNonDispatchableHandleBase<T>(handle)
{
static_assert(sizeof(VkNonDispatchableHandle) == sizeof(uint64_t), "Size is not 64 bits!");
}
void operator=(HandleType handle)
{
this->set(handle);
}
};
// VkDescriptorSet objects are really just memory in the VkDescriptorPool
// object, so define different/more convenient operators for this object.
struct VkDescriptorSet_T;
template<> class VkNonDispatchableHandle<VkDescriptorSet_T*> : public VkNonDispatchableHandleBase<uint8_t*>
{
public:
using HandleType = uint8_t*;
VkNonDispatchableHandle(HandleType handle) : VkNonDispatchableHandleBase<uint8_t*>(handle)
{
static_assert(sizeof(VkNonDispatchableHandle) == sizeof(uint64_t), "Size is not 64 bits!");
}
HandleType operator+(ptrdiff_t rhs) const
{
return get() + rhs;
}
HandleType operator+=(ptrdiff_t rhs)
{
return this->set(get() + rhs);
}
ptrdiff_t operator-(const HandleType rhs) const
{
return get() - rhs;
}
};
#define VK_DEFINE_NON_DISPATCHABLE_HANDLE(object) \
typedef struct object##_T *object##Ptr; \
typedef VkNonDispatchableHandle<object##Ptr> object;
#include <vulkan/vulkan.h>
#ifdef Bool
#undef Bool // b/127920555
#undef None
#endif
#endif // VULKAN_PLATFORM