aboutsummaryrefslogtreecommitdiff
path: root/src/video_core/renderer_vulkan/vk_image.h
diff options
context:
space:
mode:
authorFernando Sahmkow <fsahmkow27@gmail.com>2019-12-30 14:25:14 -0400
committerGitHub <noreply@github.com>2019-12-30 14:25:14 -0400
commit7bd447355fff63313bef02045a69a88592614bf2 (patch)
treec38d39c40be56d3227204d10f716da994c4275b7 /src/video_core/renderer_vulkan/vk_image.h
parent287d5921cf3f159642361b7dcdf1b02355e3cc80 (diff)
parent4cbb363d3f0291594d11275d3eb0b80bf99e2c3c (diff)
Merge pull request #3248 from ReinUsesLisp/vk-image
vk_image: Add an image object abstraction
Diffstat (limited to 'src/video_core/renderer_vulkan/vk_image.h')
-rw-r--r--src/video_core/renderer_vulkan/vk_image.h84
1 files changed, 84 insertions, 0 deletions
diff --git a/src/video_core/renderer_vulkan/vk_image.h b/src/video_core/renderer_vulkan/vk_image.h
new file mode 100644
index 000000000..b78242512
--- /dev/null
+++ b/src/video_core/renderer_vulkan/vk_image.h
@@ -0,0 +1,84 @@
+// Copyright 2018 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#pragma once
+
+#include <memory>
+#include <vector>
+
+#include "common/common_types.h"
+#include "video_core/renderer_vulkan/declarations.h"
+
+namespace Vulkan {
+
+class VKDevice;
+class VKScheduler;
+
+class VKImage {
+public:
+ explicit VKImage(const VKDevice& device, VKScheduler& scheduler,
+ const vk::ImageCreateInfo& image_ci, vk::ImageAspectFlags aspect_mask);
+ ~VKImage();
+
+ /// Records in the passed command buffer an image transition and updates the state of the image.
+ void Transition(u32 base_layer, u32 num_layers, u32 base_level, u32 num_levels,
+ vk::PipelineStageFlags new_stage_mask, vk::AccessFlags new_access,
+ vk::ImageLayout new_layout);
+
+ /// Returns a view compatible with presentation, the image has to be 2D.
+ vk::ImageView GetPresentView() {
+ if (!present_view) {
+ CreatePresentView();
+ }
+ return *present_view;
+ }
+
+ /// Returns the Vulkan image handler.
+ vk::Image GetHandle() const {
+ return *image;
+ }
+
+ /// Returns the Vulkan format for this image.
+ vk::Format GetFormat() const {
+ return format;
+ }
+
+ /// Returns the Vulkan aspect mask.
+ vk::ImageAspectFlags GetAspectMask() const {
+ return aspect_mask;
+ }
+
+private:
+ struct SubrangeState final {
+ vk::AccessFlags access{}; ///< Current access bits.
+ vk::ImageLayout layout = vk::ImageLayout::eUndefined; ///< Current image layout.
+ };
+
+ bool HasChanged(u32 base_layer, u32 num_layers, u32 base_level, u32 num_levels,
+ vk::AccessFlags new_access, vk::ImageLayout new_layout) noexcept;
+
+ /// Creates a presentation view.
+ void CreatePresentView();
+
+ /// Returns the subrange state for a layer and layer.
+ SubrangeState& GetSubrangeState(u32 layer, u32 level) noexcept;
+
+ const VKDevice& device; ///< Device handler.
+ VKScheduler& scheduler; ///< Device scheduler.
+
+ const vk::Format format; ///< Vulkan format.
+ const vk::ImageAspectFlags aspect_mask; ///< Vulkan aspect mask.
+ const u32 image_num_layers; ///< Number of layers.
+ const u32 image_num_levels; ///< Number of mipmap levels.
+
+ UniqueImage image; ///< Image handle.
+ UniqueImageView present_view; ///< Image view compatible with presentation.
+
+ std::vector<vk::ImageMemoryBarrier> barriers; ///< Pool of barriers.
+ std::vector<SubrangeState> subrange_states; ///< Current subrange state.
+
+ bool state_diverged = false; ///< True when subresources mismatch in layout.
+};
+
+} // namespace Vulkan