| // 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"); |
| } |
| |
| 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.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<DeviceBase*> Adapter::CreateDeviceImpl(const DeviceDescriptor* descriptor) { |
| return Device::Create(this, descriptor); |
| } |
| |
| }} // namespace dawn_native::vulkan |