| // 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/renderer/formats.h" |
| |
| #include "impeller/base/strings.h" |
| #include "impeller/base/validation.h" |
| #include "impeller/renderer/texture.h" |
| |
| namespace impeller { |
| |
| constexpr bool StoreActionNeedsResolveTexture(StoreAction action) { |
| switch (action) { |
| case StoreAction::kDontCare: |
| case StoreAction::kStore: |
| return false; |
| case StoreAction::kMultisampleResolve: |
| case StoreAction::kStoreAndMultisampleResolve: |
| return true; |
| } |
| } |
| |
| bool Attachment::IsValid() const { |
| if (!texture || !texture->IsValid()) { |
| VALIDATION_LOG << "Attachment has no texture."; |
| return false; |
| } |
| |
| if (StoreActionNeedsResolveTexture(store_action)) { |
| if (!resolve_texture || !resolve_texture->IsValid()) { |
| VALIDATION_LOG << "Store action needs resolve but no valid resolve " |
| "texture specified."; |
| return false; |
| } |
| } |
| |
| if (resolve_texture) { |
| if (store_action != StoreAction::kMultisampleResolve && |
| store_action != StoreAction::kStoreAndMultisampleResolve) { |
| VALIDATION_LOG << "A resolve texture was specified, but the store action " |
| "doesn't include multisample resolve."; |
| return false; |
| } |
| |
| if (texture->GetTextureDescriptor().storage_mode == |
| StorageMode::kDeviceTransient && |
| store_action == StoreAction::kStoreAndMultisampleResolve) { |
| VALIDATION_LOG |
| << "The multisample texture cannot be transient when " |
| "specifying the StoreAndMultisampleResolve StoreAction."; |
| } |
| } |
| |
| auto storage_mode = resolve_texture |
| ? resolve_texture->GetTextureDescriptor().storage_mode |
| : texture->GetTextureDescriptor().storage_mode; |
| |
| if (storage_mode == StorageMode::kDeviceTransient) { |
| if (load_action == LoadAction::kLoad) { |
| VALIDATION_LOG << "The LoadAction cannot be Load when attaching a device " |
| "transient " + |
| std::string(resolve_texture ? "resolve texture." |
| : "texture."); |
| return false; |
| } |
| if (store_action != StoreAction::kDontCare) { |
| VALIDATION_LOG << "The StoreAction must be DontCare when attaching a " |
| "device transient " + |
| std::string(resolve_texture ? "resolve texture." |
| : "texture."); |
| return false; |
| } |
| } |
| |
| return true; |
| } |
| |
| } // namespace impeller |