blob: 9c303040904a1f610db33bb8bf61c068c7c6bbb3 [file] [log] [blame]
// Copyright 2016 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/escher/vk/image.h"
#include "lib/escher/impl/vulkan_utils.h"
#include "lib/escher/resources/resource_manager.h"
#include "lib/escher/util/image_utils.h"
#include "lib/escher/util/trace_macros.h"
#include "lib/escher/vk/gpu_allocator.h"
#include "lib/escher/vk/gpu_mem.h"
namespace escher {
const ResourceTypeInfo Image::kTypeInfo("Image", ResourceType::kResource,
ResourceType::kWaitableResource,
ResourceType::kImage);
ImagePtr Image::New(ResourceManager* image_owner, ImageInfo info,
vk::Image vk_image, GpuMemPtr mem,
vk::DeviceSize mem_offset, bool bind_image_memory) {
TRACE_DURATION("gfx", "escher::Image::New (from VkImage)");
if (mem && bind_image_memory) {
auto bind_result = image_owner->vk_device().bindImageMemory(
vk_image, mem->base(), mem->offset() + mem_offset);
if (bind_result != vk::Result::eSuccess) {
FXL_DLOG(ERROR) << "vkBindImageMemory failed: "
<< vk::to_string(bind_result);
return nullptr;
}
}
return fxl::AdoptRef(new Image(image_owner, info, vk_image, mem, mem_offset));
}
ImagePtr Image::New(ResourceManager* image_owner, const ImageInfo& info,
GpuAllocator* allocator) {
TRACE_DURATION("gfx", "escher::Image::New (from ImageInfo)");
auto vk_device = image_owner->vk_device();
vk::Image image = image_utils::CreateVkImage(vk_device, info);
vk::MemoryRequirements reqs = vk_device.getImageMemoryRequirements(image);
return Image::New(image_owner, info, image,
allocator->Allocate(reqs, info.memory_flags));
}
Image::Image(ResourceManager* image_owner, ImageInfo info, vk::Image vk_image,
GpuMemPtr mem, vk::DeviceSize mem_offset)
: WaitableResource(image_owner),
info_(info),
image_(vk_image),
mem_(std::move(mem)),
mem_offset_(mem_offset) {
auto is_depth_stencil = image_utils::IsDepthStencilFormat(info.format);
has_depth_ = is_depth_stencil.first;
has_stencil_ = is_depth_stencil.second;
}
Image::~Image() {
if (!mem_) {
// Probably a swapchain image. We don't own the image or the memory.
FXL_LOG(INFO) << "Destroying Image with unowned VkImage (perhaps a "
"swapchain image?)";
} else {
vulkan_context().device.destroyImage(image_);
}
}
} // namespace escher