blob: ce1963460e19d6bf84abb946019dd3a38ea9693e [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.
#pragma once
#include <optional>
#include "impeller/geometry/size.h"
#include "impeller/image/decompressed_image.h"
#include "impeller/renderer/formats.h"
namespace impeller {
//------------------------------------------------------------------------------
/// @brief A lightweight object that describes the attributes of a texture
/// that can then used an allocator to create that texture.
///
struct TextureDescriptor {
StorageMode storage_mode = StorageMode::kDeviceTransient;
TextureType type = TextureType::kTexture2D;
PixelFormat format = PixelFormat::kUnknown;
ISize size;
size_t mip_count = 1u; // Size::MipCount is usually appropriate.
TextureUsageMask usage =
static_cast<TextureUsageMask>(TextureUsage::kShaderRead);
SampleCount sample_count = SampleCount::kCount1;
constexpr size_t GetByteSizeOfBaseMipLevel() const {
if (!IsValid()) {
return 0u;
}
return size.Area() * BytesPerPixelForPixelFormat(format);
}
constexpr size_t GetBytesPerRow() const {
if (!IsValid()) {
return 0u;
}
return size.width * BytesPerPixelForPixelFormat(format);
}
constexpr bool SamplingOptionsAreValid() const {
const auto count = static_cast<uint64_t>(sample_count);
return IsMultisampleCapable(type) ? count > 1 : count == 1;
}
constexpr bool IsValid() const {
return format != PixelFormat::kUnknown && //
size.IsPositive() && //
mip_count >= 1u && //
SamplingOptionsAreValid();
}
};
} // namespace impeller