// Copyright 2019 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/AdapterVk.h" #include "dawn_native/vulkan/BackendVk.h" #include "dawn_native/vulkan/DeviceVk.h" namespace dawn_native { namespace vulkan { Adapter::Adapter(Backend* backend, VkPhysicalDevice physicalDevice) : AdapterBase(backend->GetInstance(), wgpu::BackendType::Vulkan), mPhysicalDevice(physicalDevice), mBackend(backend) { } const VulkanDeviceInfo& Adapter::GetDeviceInfo() const { return mDeviceInfo; } VkPhysicalDevice Adapter::GetPhysicalDevice() const { return mPhysicalDevice; } Backend* Adapter::GetBackend() const { return mBackend; } MaybeError Adapter::Initialize() { DAWN_TRY_ASSIGN(mDeviceInfo, GatherDeviceInfo(*this)); if (!mDeviceInfo.HasExt(DeviceExt::Maintenance1)) { return DAWN_INTERNAL_ERROR( "Dawn requires Vulkan 1.1 or Vulkan 1.0 with KHR_Maintenance1 in order to support " "viewport flipY"); } if (mDeviceInfo.HasExt(DeviceExt::DriverProperties)) { mDriverDescription = mDeviceInfo.driverProperties.driverName; if (mDeviceInfo.driverProperties.driverInfo[0] != '\0') { mDriverDescription += std::string(": ") + mDeviceInfo.driverProperties.driverInfo; } } else { mDriverDescription = "Vulkan driver version: " + std::to_string(mDeviceInfo.properties.driverVersion); } InitializeSupportedExtensions(); mPCIInfo.deviceId = mDeviceInfo.properties.deviceID; mPCIInfo.vendorId = mDeviceInfo.properties.vendorID; mPCIInfo.name = mDeviceInfo.properties.deviceName; switch (mDeviceInfo.properties.deviceType) { case VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU: mAdapterType = wgpu::AdapterType::IntegratedGPU; break; case VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU: mAdapterType = wgpu::AdapterType::DiscreteGPU; break; case VK_PHYSICAL_DEVICE_TYPE_CPU: mAdapterType = wgpu::AdapterType::CPU; break; default: mAdapterType = wgpu::AdapterType::Unknown; break; } return {}; } void Adapter::InitializeSupportedExtensions() { if (mDeviceInfo.features.textureCompressionBC == VK_TRUE) { mSupportedExtensions.EnableExtension(Extension::TextureCompressionBC); } if (mDeviceInfo.HasExt(DeviceExt::ShaderFloat16Int8) && mDeviceInfo.shaderFloat16Int8Features.shaderFloat16 == VK_TRUE && mDeviceInfo.HasExt(DeviceExt::_16BitStorage) && mDeviceInfo._16BitStorageFeatures.storageBuffer16BitAccess == VK_TRUE && mDeviceInfo._16BitStorageFeatures.uniformAndStorageBuffer16BitAccess == VK_TRUE) { mSupportedExtensions.EnableExtension(Extension::ShaderFloat16); } if (mDeviceInfo.features.pipelineStatisticsQuery == VK_TRUE) { mSupportedExtensions.EnableExtension(Extension::PipelineStatisticsQuery); } if (mDeviceInfo.properties.limits.timestampComputeAndGraphics == VK_TRUE) { mSupportedExtensions.EnableExtension(Extension::TimestampQuery); } } ResultOrError Adapter::CreateDeviceImpl(const DeviceDescriptor* descriptor) { return Device::Create(this, descriptor); } }} // namespace dawn_native::vulkan