blob: dcc10a99c0ebf459f88316573753b3ec096a3f00 [file] [log] [blame] [edit]
// Copyright 2018 The Fuchsia 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 "src/graphics/display/drivers/coordinator/image.h"
#include <lib/driver/logging/cpp/logger.h>
#include <lib/trace/event.h>
#include <threads.h>
#include <zircon/assert.h>
#include <zircon/errors.h>
#include <zircon/types.h>
#include <fbl/ref_ptr.h>
#include <fbl/string_printf.h>
#include "src/graphics/display/drivers/coordinator/client-id.h"
#include "src/graphics/display/lib/api-types/cpp/driver-image-id.h"
#include "src/graphics/display/lib/api-types/cpp/image-id.h"
#include "src/graphics/display/lib/api-types/cpp/image-metadata.h"
#include "src/graphics/display/lib/api-types/cpp/image-tiling-type.h"
namespace display_coordinator {
Image::Image(ImageLifecycleListener* lifecycle_listener, const display::ImageMetadata& metadata,
display::ImageId id, display::DriverImageId driver_id, inspect::Node* parent_node,
ClientId client_id)
: IdMappable(id),
driver_id_(driver_id),
metadata_(metadata),
lifecycle_listener_(*lifecycle_listener),
client_id_(client_id) {
ZX_DEBUG_ASSERT(lifecycle_listener != nullptr);
ZX_DEBUG_ASSERT(id != display::kInvalidImageId);
ZX_DEBUG_ASSERT(driver_id != display::kInvalidDriverImageId);
ZX_DEBUG_ASSERT(client_id != kInvalidClientId);
ZX_DEBUG_ASSERT(metadata.tiling_type() != display::ImageTilingType::kCapture);
InitializeInspect(parent_node);
}
Image::~Image() {
ZX_ASSERT(!InDoublyLinkedList());
if (!disposed_) {
lifecycle_listener_.ImageWillBeDestroyed(driver_id_);
}
}
void Image::InitializeInspect(inspect::Node* parent_node) {
if (!parent_node)
return;
node_ = parent_node->CreateChild(fbl::StringPrintf("image-%p", this).c_str());
node_.CreateInt("width", metadata_.width(), &properties_);
node_.CreateInt("height", metadata_.height(), &properties_);
node_.CreateUint("tiling_type", metadata_.tiling_type().ValueForLogging(), &properties_);
presenting_property_ = node_.CreateBool("presenting", false);
retiring_property_ = node_.CreateBool("retiring", false);
}
bool Image::InDoublyLinkedList() const { return doubly_linked_list_node_state_.InContainer(); }
fbl::RefPtr<Image> Image::RemoveFromDoublyLinkedList() {
return doubly_linked_list_node_state_.RemoveFromContainer<DefaultDoublyLinkedListTraits>();
}
} // namespace display_coordinator