| // 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 |