// 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 "garnet/lib/ui/gfx/resources/image_pipe.h"

namespace scenic_impl {
namespace gfx {

ImagePipeHandler::ImagePipeHandler(
    ::fidl::InterfaceRequest<fuchsia::images::ImagePipe> request,
    ::scenic_impl::gfx::ImagePipe* image_pipe)
    : binding_(this, std::move(request)), image_pipe_(image_pipe) {
  binding_.set_error_handler(
      [image_pipe](zx_status_t status) { image_pipe->OnConnectionError(); });
}

void ImagePipeHandler::AddImage(uint32_t image_id,
                                fuchsia::images::ImageInfo image_info,
                                zx::vmo memory, uint64_t offset_bytes,
                                uint64_t size_bytes,
                                fuchsia::images::MemoryType memory_type) {
  image_pipe_->AddImage(image_id, std::move(image_info), std::move(memory),
                        offset_bytes, size_bytes, memory_type);
}

void ImagePipeHandler::RemoveImage(uint32_t image_id) {
  image_pipe_->RemoveImage(image_id);
}

void ImagePipeHandler::PresentImage(uint32_t image_id,
                                    uint64_t presentation_time,
                                    ::std::vector<zx::event> acquire_fences,
                                    ::std::vector<zx::event> release_fences,
                                    PresentImageCallback callback) {
  image_pipe_->PresentImage(image_id, presentation_time,
                            std::move(acquire_fences),
                            std::move(release_fences), std::move(callback));
}

}  // namespace gfx
}  // namespace scenic_impl
