// Copyright 2017 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 "lib/ui/scenic/cpp/host_image_cycler.h" #include <zircon/assert.h> namespace scenic { HostImageCycler::HostImageCycler(Session* session) : EntityNode(session), content_node_(session), content_material_(session), image_pool_(session, kNumBuffers) { content_node_.SetMaterial(content_material_); AddChild(content_node_); } HostImageCycler::~HostImageCycler() = default; const HostImage* HostImageCycler::AcquireImage( uint32_t width, uint32_t height, uint32_t stride, fuchsia::images::PixelFormat pixel_format, fuchsia::images::ColorSpace color_space) { ZX_DEBUG_ASSERT(!acquired_image_); // Update the image pool and content shape. fuchsia::images::ImageInfo image_info; image_info.width = width; image_info.height = height; image_info.stride = stride; image_info.pixel_format = pixel_format; image_info.color_space = color_space; image_info.tiling = fuchsia::images::Tiling::LINEAR; reconfigured_ = image_pool_.Configure(&image_info); const HostImage* image = image_pool_.GetImage(image_index_); ZX_DEBUG_ASSERT(image); acquired_image_ = true; return image; } void HostImageCycler::ReleaseAndSwapImage() { ZX_DEBUG_ASSERT(acquired_image_); acquired_image_ = false; const HostImage* image = image_pool_.GetImage(image_index_); ZX_DEBUG_ASSERT(image); content_material_.SetTexture(*image); if (reconfigured_) { Rectangle content_rect(content_node_.session(), image_pool_.image_info()->width, image_pool_.image_info()->height); content_node_.SetShape(content_rect); reconfigured_ = false; } // TODO(MZ-145): Define an |InvalidateCmd| on |Image| instead. image_pool_.DiscardImage(image_index_); image_index_ = (image_index_ + 1) % kNumBuffers; } } // namespace scenic