1/*
2 * Copyright 2018 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#ifndef GrVkTypesPriv_DEFINED
9#define GrVkTypesPriv_DEFINED
10
11#include "include/core/SkRefCnt.h"
12#include "include/gpu/vk/GrVkTypes.h"
13
14class GrBackendSurfaceMutableStateImpl;
15
16// This struct is to used to store the the actual information about the vulkan backend image on the
17// GrBackendTexture and GrBackendRenderTarget. When a client calls getVkImageInfo on a
18// GrBackendTexture/RenderTarget, we use the GrVkBackendSurfaceInfo to create a snapshot
19// GrVkImgeInfo object. Internally, this uses a ref count GrVkImageLayout object to track the
20// current VkImageLayout which can be shared with an internal GrVkImage so that layout updates can
21// be seen by all users of the image.
22struct GrVkBackendSurfaceInfo {
23 GrVkBackendSurfaceInfo(GrVkImageInfo info) : fImageInfo(info) {}
24
25 void cleanup();
26
27 GrVkBackendSurfaceInfo& operator=(const GrVkBackendSurfaceInfo&) = delete;
28
29 // Assigns the passed in GrVkBackendSurfaceInfo to this object. if isValid is true we will also
30 // attempt to unref the old fLayout on this object.
31 void assign(const GrVkBackendSurfaceInfo&, bool isValid);
32
33 GrVkImageInfo snapImageInfo(const GrBackendSurfaceMutableStateImpl*) const;
34
35 bool isProtected() const { return fImageInfo.fProtected == GrProtected::kYes; }
36#if GR_TEST_UTILS
37 bool operator==(const GrVkBackendSurfaceInfo& that) const;
38#endif
39
40private:
41 GrVkImageInfo fImageInfo;
42};
43
44class GrVkSharedImageInfo {
45public:
46 GrVkSharedImageInfo(VkImageLayout layout, uint32_t queueFamilyIndex)
47 : fLayout(layout)
48 , fQueueFamilyIndex(queueFamilyIndex) {}
49
50 GrVkSharedImageInfo& operator=(const GrVkSharedImageInfo& that) {
51 fLayout = that.getImageLayout();
52 fQueueFamilyIndex = that.getQueueFamilyIndex();
53 return *this;
54 }
55
56 void setImageLayout(VkImageLayout layout) {
57 // Defaulting to use std::memory_order_seq_cst
58 fLayout.store(layout);
59 }
60
61 VkImageLayout getImageLayout() const {
62 // Defaulting to use std::memory_order_seq_cst
63 return fLayout.load();
64 }
65
66 void setQueueFamilyIndex(uint32_t queueFamilyIndex) {
67 // Defaulting to use std::memory_order_seq_cst
68 fQueueFamilyIndex.store(queueFamilyIndex);
69 }
70
71 uint32_t getQueueFamilyIndex() const {
72 // Defaulting to use std::memory_order_seq_cst
73 return fQueueFamilyIndex.load();
74 }
75
76private:
77 std::atomic<VkImageLayout> fLayout;
78 std::atomic<uint32_t> fQueueFamilyIndex;
79};
80
81#endif
82