message: Vulkan: attempt sub-allocation before direct allocation.
  Falling-back to direct allocation ensures allocation failure returns OOM.
  If no OOM, the resource could be left then used while in an invalid state.
diff: @@ -112,21 +112,28 @@ namespace dawn_native { namespace vulkan {
  VkDeviceSize size = requirements.size;
  - // If the resource is too big, allocate memory just for it.
  - // Also allocate mappable resources separately because at the moment the mapped pointer
  + // Sub-allocate non-mappable resources because at the moment the mapped pointer
  // is part of the resource and not the heap, which doesn't match the Vulkan model.
  // TODO(cwallez@chromium.org): allow sub-allocating mappable resources, maybe.
  - if (requirements.size >= kMaxSizeForSubAllocation || mappable) {
  + if (requirements.size < kMaxSizeForSubAllocation && !mappable) {
  + ResourceMemoryAllocation subAllocation;
  + DAWN_TRY_ASSIGN(subAllocation,
  + mAllocatorsPerType[memoryType]->AllocateMemory(requirements));
  + if (subAllocation.GetInfo().mMethod != AllocationMethod::kInvalid) {
  + return subAllocation;
  + }
  + }
  +
  + // If sub-allocation failed, allocate memory just for it.
  std::unique_ptr<ResourceHeapBase> resourceHeap;
  - DAWN_TRY_ASSIGN(resourceHeap,
  - mAllocatorsPerType[memoryType]->AllocateResourceHeap(size));
  + DAWN_TRY_ASSIGN(resourceHeap, mAllocatorsPerType[memoryType]->AllocateResourceHeap(size));
  void* mappedPointer = nullptr;
  if (mappable) {
  DAWN_TRY(
  CheckVkSuccess(mDevice->fn.MapMemory(mDevice->GetVkDevice(),
  - ToBackend(resourceHeap.get())->GetMemory(),
  - 0, size, 0, &mappedPointer),
  + ToBackend(resourceHeap.get())->GetMemory(), 0,
  + size, 0, &mappedPointer),
  "vkMapMemory"));
  }
  @@ -134,9 +141,6 @@ namespace dawn_native { namespace vulkan {
  info.mMethod = AllocationMethod::kDirect;
  return ResourceMemoryAllocation(info, /*offset*/ 0, resourceHeap.release(),
  static_cast<uint8_t*>(mappedPointer));
  - } else {
  - return mAllocatorsPerType[memoryType]->AllocateMemory(requirements);
  - }
  }
  void ResourceMemoryAllocator::Deallocate(ResourceMemoryAllocation* allocation) {
  