• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
14 class 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.
22 struct GrVkBackendSurfaceInfo {
GrVkBackendSurfaceInfoGrVkBackendSurfaceInfo23     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 
isProtectedGrVkBackendSurfaceInfo35     bool isProtected() const { return fImageInfo.fProtected == GrProtected::kYes; }
36 #if GR_TEST_UTILS
37     bool operator==(const GrVkBackendSurfaceInfo& that) const;
38 #endif
39 
40 private:
41     GrVkImageInfo    fImageInfo;
42 };
43 
44 class GrVkSharedImageInfo {
45 public:
GrVkSharedImageInfo(VkImageLayout layout,uint32_t queueFamilyIndex)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 
setImageLayout(VkImageLayout layout)56      void setImageLayout(VkImageLayout layout) {
57         // Defaulting to use std::memory_order_seq_cst
58         fLayout.store(layout);
59     }
60 
getImageLayout()61     VkImageLayout getImageLayout() const {
62         // Defaulting to use std::memory_order_seq_cst
63         return fLayout.load();
64     }
65 
setQueueFamilyIndex(uint32_t queueFamilyIndex)66     void setQueueFamilyIndex(uint32_t queueFamilyIndex) {
67         // Defaulting to use std::memory_order_seq_cst
68         fQueueFamilyIndex.store(queueFamilyIndex);
69     }
70 
getQueueFamilyIndex()71     uint32_t getQueueFamilyIndex() const {
72         // Defaulting to use std::memory_order_seq_cst
73         return fQueueFamilyIndex.load();
74     }
75 
76 private:
77     std::atomic<VkImageLayout> fLayout;
78     std::atomic<uint32_t> fQueueFamilyIndex;
79 };
80 
81 #endif
82