Support compilation of Dawn on iOS.

BUG=dawn:225

Change-Id: I618552c55c8472adc25625733b59d972d7297f57
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/11040
Reviewed-by: Kai Ninomiya <kainino@chromium.org>
Reviewed-by: Austin Eng <enga@chromium.org>
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
This commit is contained in:
Corentin Wallez 2019-09-18 04:32:52 +00:00 committed by Commit Bot service account
parent 45f9185de5
commit b495e48405
6 changed files with 64 additions and 14 deletions

View File

@ -17,15 +17,27 @@
#if defined(_WIN32) || defined(_WIN64)
# define DAWN_PLATFORM_WINDOWS 1
#elif defined(__linux__)
# define DAWN_PLATFORM_LINUX 1
# define DAWN_PLATFORM_POSIX 1
#elif defined(__APPLE__)
# define DAWN_PLATFORM_APPLE 1
# define DAWN_PLATFORM_POSIX 1
# include <TargetConditionals.h>
# if TARGET_OS_IPHONE
# define DAWN_PLATFORM_IOS
# elif TARGET_OS_MAC
# define DAWN_PLATFORM_MACOS
# else
# error "Unsupported Apple platform."
# endif
#elif defined(__Fuchsia__)
# define DAWN_PLATFORM_FUCHSIA 1
# define DAWN_PLATFORM_POSIX 1
#else
# error "Unsupported platform."
#endif

View File

@ -15,15 +15,20 @@
#include "dawn_native/metal/BackendMTL.h"
#include "common/Constants.h"
#include "common/Platform.h"
#include "dawn_native/Instance.h"
#include "dawn_native/MetalBackend.h"
#include "dawn_native/metal/DeviceMTL.h"
#import <IOKit/IOKitLib.h>
#if defined(DAWN_PLATFORM_MACOS)
# import <IOKit/IOKitLib.h>
#endif
namespace dawn_native { namespace metal {
namespace {
#if defined(DAWN_PLATFORM_MACOS)
struct PCIIDs {
uint32_t vendorId;
uint32_t deviceId;
@ -150,6 +155,18 @@ namespace dawn_native { namespace metal {
NSOperatingSystemVersion macOS10_11 = {10, 11, 0};
return [NSProcessInfo.processInfo isOperatingSystemAtLeastVersion:macOS10_11];
}
#elif defined(DAWN_PLATFORM_IOS)
MaybeError GetDevicePCIInfo(id<MTLDevice> device, PCIIDs* ids) {
DAWN_UNUSED(device);
*ids = PCIIDs(0, 0);
}
bool IsMetalSupported() {
return true;
}
#else
# error "Unsupported Apple platform."
#endif
} // anonymous namespace
// The Metal backend's Adapter.
@ -201,14 +218,23 @@ namespace dawn_native { namespace metal {
}
std::vector<std::unique_ptr<AdapterBase>> Backend::DiscoverDefaultAdapters() {
NSArray<id<MTLDevice>>* devices = MTLCopyAllDevices();
std::vector<std::unique_ptr<AdapterBase>> adapters;
for (id<MTLDevice> device in devices) {
adapters.push_back(std::make_unique<Adapter>(GetInstance(), device));
}
[devices release];
if (@available(macOS 10.12, *)) {
NSArray<id<MTLDevice>>* devices = MTLCopyAllDevices();
for (id<MTLDevice> device in devices) {
adapters.push_back(std::make_unique<Adapter>(GetInstance(), device));
}
[devices release];
} else if (@available(iOS 8.0, *)) {
// iOS only has a single device so MTLCopyAllDevices doesn't exist there.
adapters.push_back(
std::make_unique<Adapter>(GetInstance(), MTLCreateSystemDefaultDevice()));
} else {
UNREACHABLE();
}
return adapters;
}

View File

@ -21,8 +21,9 @@
#include "dawn_native/Device.h"
#include "dawn_native/metal/Forward.h"
#import <IOSurface/IOSurfaceRef.h>
#import <Metal/Metal.h>
#import <QuartzCore/CAMetalLayer.h>
#import <QuartzCore/QuartzCore.h>
#include <atomic>
#include <memory>

View File

@ -76,10 +76,13 @@ namespace dawn_native { namespace metal {
}
void Device::InitTogglesFromDriver() {
if (@available(macOS 10.12, *)) {
bool emulateStoreAndMSAAResolve =
![mMtlDevice supportsFeatureSet:MTLFeatureSet_macOS_GPUFamily1_v2];
SetToggle(Toggle::EmulateStoreAndMSAAResolve, emulateStoreAndMSAAResolve);
}
// TODO(jiawei.shao@intel.com): check iOS feature sets
bool emulateStoreAndMSAAResolve =
![mMtlDevice supportsFeatureSet:MTLFeatureSet_macOS_GPUFamily1_v2];
SetToggle(Toggle::EmulateStoreAndMSAAResolve, emulateStoreAndMSAAResolve);
// TODO(jiawei.shao@intel.com): tighten this workaround when the driver bug is fixed.
SetToggle(Toggle::AlwaysResolveIntoZeroLevelAndLayer, true);

View File

@ -17,6 +17,7 @@
#include "dawn_native/Texture.h"
#include <IOSurface/IOSurfaceRef.h>
#import <Metal/Metal.h>
namespace dawn_native { namespace metal {

View File

@ -14,10 +14,9 @@
#include "dawn_native/metal/TextureMTL.h"
#include "common/Platform.h"
#include "dawn_native/metal/DeviceMTL.h"
#include <IOSurface/IOSurface.h>
namespace dawn_native { namespace metal {
namespace {
@ -121,6 +120,14 @@ namespace dawn_native { namespace metal {
return DAWN_VALIDATION_ERROR("Unsupported IOSurface format");
}
}
#if defined(DAWN_PLATFORM_MACOS)
MTLStorageMode kIOSurfaceStorageMode = MTLStorageModeManaged;
#elif defined(DAWN_PLATFORM_IOS)
MTLStorageMode kIOSurfaceStorageMode = MTLStorageModePrivate;
#else
# error "Unsupported Apple platform."
#endif
}
MTLPixelFormat MetalPixelFormat(dawn::TextureFormat format) {
@ -322,7 +329,7 @@ namespace dawn_native { namespace metal {
uint32_t plane)
: TextureBase(device, descriptor, TextureState::OwnedInternal) {
MTLTextureDescriptor* mtlDesc = CreateMetalTextureDescriptor(descriptor);
mtlDesc.storageMode = MTLStorageModeManaged;
mtlDesc.storageMode = kIOSurfaceStorageMode;
mMtlTexture = [device->GetMTLDevice() newTextureWithDescriptor:mtlDesc
iosurface:ioSurface
plane:plane];