blob: 19314c5bfcd59a4c4b09b09aad22c22f624ff21e [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "impeller/core/allocator.h"
#include "impeller/base/validation.h"
#include "impeller/core/device_buffer.h"
#include "impeller/core/formats.h"
#include "impeller/core/range.h"
namespace impeller {
Allocator::Allocator() = default;
Allocator::~Allocator() = default;
std::shared_ptr<DeviceBuffer> Allocator::CreateBufferWithCopy(
const uint8_t* buffer,
size_t length) {
DeviceBufferDescriptor desc;
desc.size = length;
desc.storage_mode = StorageMode::kHostVisible;
auto new_buffer = CreateBuffer(desc);
if (!new_buffer) {
return nullptr;
}
auto entire_range = Range{0, length};
if (!new_buffer->CopyHostBuffer(buffer, entire_range)) {
return nullptr;
}
return new_buffer;
}
std::shared_ptr<DeviceBuffer> Allocator::CreateBufferWithCopy(
const fml::Mapping& mapping) {
return CreateBufferWithCopy(mapping.GetMapping(), mapping.GetSize());
}
std::shared_ptr<DeviceBuffer> Allocator::CreateBuffer(
const DeviceBufferDescriptor& desc) {
return OnCreateBuffer(desc);
}
std::shared_ptr<Texture> Allocator::CreateTexture(
const TextureDescriptor& desc) {
const auto max_size = GetMaxTextureSizeSupported();
if (desc.size.width > max_size.width || desc.size.height > max_size.height) {
VALIDATION_LOG << "Requested texture size " << desc.size
<< " exceeds maximum supported size of " << max_size;
return nullptr;
}
if (desc.mip_count > desc.size.MipCount()) {
VALIDATION_LOG << "Requested mip_count " << desc.mip_count
<< " exceeds maximum supported for size " << desc.size;
TextureDescriptor corrected_desc = desc;
corrected_desc.mip_count = desc.size.MipCount();
return OnCreateTexture(corrected_desc);
}
return OnCreateTexture(desc);
}
uint16_t Allocator::MinimumBytesPerRow(PixelFormat format) const {
return BytesPerPixelForPixelFormat(format);
}
} // namespace impeller