mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-06-06 06:33:30 +00:00
Overriding VK_DEFINE_NON_DISPATCHABLE_HANDLE changes the function signatures of Vulkan functions, changing their ABI and making us incompatible with real drivers. This removes that magic, and replaces it with an explicit wrapper, VkHandle, which has much of the same functionality as the original VkNonDispatchableHandle. It adds definitions for dawn_native::vulkan::VkBuffer et al, which shadow the native ::VkBuffer et al. This retains type safety throughout the Vulkan backend without changing every single usage. Notably, the following things had to change: - An explicit conversion from VkBuffer* to ::VkBuffer* is needed for arrays. This is implemented as a reinterpret_cast, which is still safe as the new VkHandle still has the same memory layout properties as VkNonDispatchableHandle did. - When pointing to a VkHandle as an output pointer, it's now necessary to explicitly get the native ::VkBuffer (via operator*) and point to it. Previously reviewed on: https://dawn-review.googlesource.com/c/dawn/+/15580 Bug: chromium:1046362 Change-Id: I7d34ec38a805025f92165ea9a7ee07ae5c182076 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/15641 Reviewed-by: Kai Ninomiya <kainino@chromium.org> Commit-Queue: Kai Ninomiya <kainino@chromium.org>
73 lines
2.8 KiB
C++
73 lines
2.8 KiB
C++
// Copyright 2018 The Dawn Authors
|
|
//
|
|
// 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.
|
|
|
|
#include "dawn_native/vulkan/PipelineLayoutVk.h"
|
|
|
|
#include "common/BitSetIterator.h"
|
|
#include "dawn_native/vulkan/BindGroupLayoutVk.h"
|
|
#include "dawn_native/vulkan/DeviceVk.h"
|
|
#include "dawn_native/vulkan/FencedDeleter.h"
|
|
#include "dawn_native/vulkan/VulkanError.h"
|
|
|
|
namespace dawn_native { namespace vulkan {
|
|
|
|
// static
|
|
ResultOrError<PipelineLayout*> PipelineLayout::Create(
|
|
Device* device,
|
|
const PipelineLayoutDescriptor* descriptor) {
|
|
std::unique_ptr<PipelineLayout> layout =
|
|
std::make_unique<PipelineLayout>(device, descriptor);
|
|
DAWN_TRY(layout->Initialize());
|
|
return layout.release();
|
|
}
|
|
|
|
MaybeError PipelineLayout::Initialize() {
|
|
// Compute the array of VkDescriptorSetLayouts that will be chained in the create info.
|
|
// TODO(cwallez@chromium.org) Vulkan doesn't allow holes in this array, should we expose
|
|
// this constraints at the Dawn level?
|
|
uint32_t numSetLayouts = 0;
|
|
std::array<VkDescriptorSetLayout, kMaxBindGroups> setLayouts;
|
|
for (uint32_t setIndex : IterateBitSet(GetBindGroupLayoutsMask())) {
|
|
setLayouts[numSetLayouts] = ToBackend(GetBindGroupLayout(setIndex))->GetHandle();
|
|
numSetLayouts++;
|
|
}
|
|
|
|
VkPipelineLayoutCreateInfo createInfo;
|
|
createInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
|
|
createInfo.pNext = nullptr;
|
|
createInfo.flags = 0;
|
|
createInfo.setLayoutCount = numSetLayouts;
|
|
createInfo.pSetLayouts = AsVkArray(setLayouts.data());
|
|
createInfo.pushConstantRangeCount = 0;
|
|
createInfo.pPushConstantRanges = nullptr;
|
|
|
|
Device* device = ToBackend(GetDevice());
|
|
return CheckVkSuccess(
|
|
device->fn.CreatePipelineLayout(device->GetVkDevice(), &createInfo, nullptr, &*mHandle),
|
|
"CreatePipelineLayout");
|
|
}
|
|
|
|
PipelineLayout::~PipelineLayout() {
|
|
if (mHandle != VK_NULL_HANDLE) {
|
|
ToBackend(GetDevice())->GetFencedDeleter()->DeleteWhenUnused(mHandle);
|
|
mHandle = VK_NULL_HANDLE;
|
|
}
|
|
}
|
|
|
|
VkPipelineLayout PipelineLayout::GetHandle() const {
|
|
return mHandle;
|
|
}
|
|
|
|
}} // namespace dawn_native::vulkan
|