Commit 08af1c80 by Tobin Ehlis Committed by Commit Bot

Vulkan:Store full 64bit handle in GarbageObject

On 32bit builds we were only storing 32bit handles for non- dispatchable objects. This resulted in the handles getting shrunk from 64-bits which then led to false validation errors. Fixed this by using VK_DEFINE_NON_DISPATCHABLE_HANDLE() macro in GarbageObject instead of VK_DEFINE_HANDLE(). Also MSVC on Win32 didn't like reinterpret_cast<> with the updated 64bit handles so migrated a number of GarbageHandle casts to be c-style which is contrary to style guide, but is preferable to conditional code. Bug: angleproject:3924 Bug: angleproject:3946 Change-Id: Icb4139e34989179e46ac1f0c76269ff49ab1e897 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1873244 Commit-Queue: Tobin Ehlis <tobine@google.com> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org>
parent a1ed9d1a
...@@ -121,8 +121,6 @@ constexpr const char *kSkippedMessages[] = { ...@@ -121,8 +121,6 @@ constexpr const char *kSkippedMessages[] = {
"VUID-VkPipelineInputAssemblyStateCreateInfo-topology-00428", "VUID-VkPipelineInputAssemblyStateCreateInfo-topology-00428",
// http://anglebug.com/3450 // http://anglebug.com/3450
"VUID-vkDestroySemaphore-semaphore-parameter", "VUID-vkDestroySemaphore-semaphore-parameter",
// http://anglebug.com/3924
"UNASSIGNED-Threading-Info",
}; };
// Suppress validation errors that are known // Suppress validation errors that are known
...@@ -618,14 +616,8 @@ angle::Result RendererVk::initialize(DisplayVk *displayVk, ...@@ -618,14 +616,8 @@ angle::Result RendererVk::initialize(DisplayVk *displayVk,
const egl::AttributeMap &attribs = mDisplay->getAttributeMap(); const egl::AttributeMap &attribs = mDisplay->getAttributeMap();
ScopedVkLoaderEnvironment scopedEnvironment(ShouldUseValidationLayers(attribs), ScopedVkLoaderEnvironment scopedEnvironment(ShouldUseValidationLayers(attribs),
ChooseICDFromAttribs(attribs)); ChooseICDFromAttribs(attribs));
#if defined(ANGLE_PLATFORM_WINDOWS) && !defined(_WIN64)
// TODO: Re-enable validation layers on 32bit Windows
// http://anglebug.com/3946, http://anglebug.com/3924
mEnableValidationLayers = false;
#else
mEnableValidationLayers = scopedEnvironment.canEnableValidationLayers(); mEnableValidationLayers = scopedEnvironment.canEnableValidationLayers();
#endif mEnabledICD = scopedEnvironment.getEnabledICD();
mEnabledICD = scopedEnvironment.getEnabledICD();
// Gather global layer properties. // Gather global layer properties.
uint32_t instanceLayerCount = 0; uint32_t instanceLayerCount = 0;
...@@ -766,16 +758,6 @@ angle::Result RendererVk::initialize(DisplayVk *displayVk, ...@@ -766,16 +758,6 @@ angle::Result RendererVk::initialize(DisplayVk *displayVk,
enabledInstanceExtensions.empty() ? nullptr : enabledInstanceExtensions.data(); enabledInstanceExtensions.empty() ? nullptr : enabledInstanceExtensions.data();
instanceInfo.enabledLayerCount = static_cast<uint32_t>(enabledInstanceLayerNames.size()); instanceInfo.enabledLayerCount = static_cast<uint32_t>(enabledInstanceLayerNames.size());
instanceInfo.ppEnabledLayerNames = enabledInstanceLayerNames.data(); instanceInfo.ppEnabledLayerNames = enabledInstanceLayerNames.data();
#if defined(ANGLE_PLATFORM_ANDROID) && !defined(ANGLE_IS_64_BIT_CPU)
// TODO: Re-enable validation layers on 32-bit Android
// http://anglebug.com/3924
VkValidationFeatureDisableEXT vkValFeaturesDisable = VK_VALIDATION_FEATURE_DISABLE_ALL_EXT;
VkValidationFeaturesEXT validationFeatures = {};
validationFeatures.sType = VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT;
validationFeatures.disabledValidationFeatureCount = 1;
validationFeatures.pDisabledValidationFeatures = &vkValFeaturesDisable;
instanceInfo.pNext = &validationFeatures;
#endif
ANGLE_VK_TRY(displayVk, vkCreateInstance(&instanceInfo, nullptr, &mInstance)); ANGLE_VK_TRY(displayVk, vkCreateInstance(&instanceInfo, nullptr, &mInstance));
if (enableDebugUtils) if (enableDebugUtils)
......
...@@ -483,68 +483,69 @@ GarbageObject &GarbageObject::operator=(GarbageObject &&rhs) ...@@ -483,68 +483,69 @@ GarbageObject &GarbageObject::operator=(GarbageObject &&rhs)
} }
// GarbageObject implementation // GarbageObject implementation
// Using c-style casts here to avoid conditional compile for MSVC 32-bit
// which fails to compile with reinterpret_cast, requiring static_cast.
void GarbageObject::destroy(VkDevice device) void GarbageObject::destroy(VkDevice device)
{ {
switch (mHandleType) switch (mHandleType)
{ {
case HandleType::Semaphore: case HandleType::Semaphore:
vkDestroySemaphore(device, reinterpret_cast<VkSemaphore>(mHandle), nullptr); vkDestroySemaphore(device, (VkSemaphore)mHandle, nullptr);
break; break;
case HandleType::CommandBuffer: case HandleType::CommandBuffer:
// Command buffers are pool allocated. // Command buffers are pool allocated.
UNREACHABLE(); UNREACHABLE();
break; break;
case HandleType::Event: case HandleType::Event:
vkDestroyEvent(device, reinterpret_cast<VkEvent>(mHandle), nullptr); vkDestroyEvent(device, (VkEvent)mHandle, nullptr);
break; break;
case HandleType::Fence: case HandleType::Fence:
vkDestroyFence(device, reinterpret_cast<VkFence>(mHandle), nullptr); vkDestroyFence(device, (VkFence)mHandle, nullptr);
break; break;
case HandleType::DeviceMemory: case HandleType::DeviceMemory:
vkFreeMemory(device, reinterpret_cast<VkDeviceMemory>(mHandle), nullptr); vkFreeMemory(device, (VkDeviceMemory)mHandle, nullptr);
break; break;
case HandleType::Buffer: case HandleType::Buffer:
vkDestroyBuffer(device, reinterpret_cast<VkBuffer>(mHandle), nullptr); vkDestroyBuffer(device, (VkBuffer)mHandle, nullptr);
break; break;
case HandleType::BufferView: case HandleType::BufferView:
vkDestroyBufferView(device, reinterpret_cast<VkBufferView>(mHandle), nullptr); vkDestroyBufferView(device, (VkBufferView)mHandle, nullptr);
break; break;
case HandleType::Image: case HandleType::Image:
vkDestroyImage(device, reinterpret_cast<VkImage>(mHandle), nullptr); vkDestroyImage(device, (VkImage)mHandle, nullptr);
break; break;
case HandleType::ImageView: case HandleType::ImageView:
vkDestroyImageView(device, reinterpret_cast<VkImageView>(mHandle), nullptr); vkDestroyImageView(device, (VkImageView)mHandle, nullptr);
break; break;
case HandleType::ShaderModule: case HandleType::ShaderModule:
vkDestroyShaderModule(device, reinterpret_cast<VkShaderModule>(mHandle), nullptr); vkDestroyShaderModule(device, (VkShaderModule)mHandle, nullptr);
break; break;
case HandleType::PipelineLayout: case HandleType::PipelineLayout:
vkDestroyPipelineLayout(device, reinterpret_cast<VkPipelineLayout>(mHandle), nullptr); vkDestroyPipelineLayout(device, (VkPipelineLayout)mHandle, nullptr);
break; break;
case HandleType::RenderPass: case HandleType::RenderPass:
vkDestroyRenderPass(device, reinterpret_cast<VkRenderPass>(mHandle), nullptr); vkDestroyRenderPass(device, (VkRenderPass)mHandle, nullptr);
break; break;
case HandleType::Pipeline: case HandleType::Pipeline:
vkDestroyPipeline(device, reinterpret_cast<VkPipeline>(mHandle), nullptr); vkDestroyPipeline(device, (VkPipeline)mHandle, nullptr);
break; break;
case HandleType::DescriptorSetLayout: case HandleType::DescriptorSetLayout:
vkDestroyDescriptorSetLayout(device, reinterpret_cast<VkDescriptorSetLayout>(mHandle), vkDestroyDescriptorSetLayout(device, (VkDescriptorSetLayout)mHandle, nullptr);
nullptr);
break; break;
case HandleType::Sampler: case HandleType::Sampler:
vkDestroySampler(device, reinterpret_cast<VkSampler>(mHandle), nullptr); vkDestroySampler(device, (VkSampler)mHandle, nullptr);
break; break;
case HandleType::DescriptorPool: case HandleType::DescriptorPool:
vkDestroyDescriptorPool(device, reinterpret_cast<VkDescriptorPool>(mHandle), nullptr); vkDestroyDescriptorPool(device, (VkDescriptorPool)mHandle, nullptr);
break; break;
case HandleType::Framebuffer: case HandleType::Framebuffer:
vkDestroyFramebuffer(device, reinterpret_cast<VkFramebuffer>(mHandle), nullptr); vkDestroyFramebuffer(device, (VkFramebuffer)mHandle, nullptr);
break; break;
case HandleType::CommandPool: case HandleType::CommandPool:
vkDestroyCommandPool(device, reinterpret_cast<VkCommandPool>(mHandle), nullptr); vkDestroyCommandPool(device, (VkCommandPool)mHandle, nullptr);
break; break;
case HandleType::QueryPool: case HandleType::QueryPool:
vkDestroyQueryPool(device, reinterpret_cast<VkQueryPool>(mHandle), nullptr); vkDestroyQueryPool(device, (VkQueryPool)mHandle, nullptr);
break; break;
default: default:
UNREACHABLE(); UNREACHABLE();
......
...@@ -248,12 +248,14 @@ class GarbageObject ...@@ -248,12 +248,14 @@ class GarbageObject
template <typename DerivedT, typename HandleT> template <typename DerivedT, typename HandleT>
static GarbageObject Get(WrappedObject<DerivedT, HandleT> *object) static GarbageObject Get(WrappedObject<DerivedT, HandleT> *object)
{ {
// Using c-style cast here to avoid conditional compile for MSVC 32-bit
// which fails to compile with reinterpret_cast, requiring static_cast.
return GarbageObject(HandleTypeHelper<DerivedT>::kHandleType, return GarbageObject(HandleTypeHelper<DerivedT>::kHandleType,
reinterpret_cast<GarbageHandle>(object->release())); (GarbageHandle)(object->release()));
} }
private: private:
VK_DEFINE_HANDLE(GarbageHandle) VK_DEFINE_NON_DISPATCHABLE_HANDLE(GarbageHandle)
GarbageObject(HandleType handleType, GarbageHandle handle); GarbageObject(HandleType handleType, GarbageHandle handle);
HandleType mHandleType; HandleType mHandleType;
......
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