• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2021 Google LLC
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 GrDstProxyView_DEFINED
9 #define GrDstProxyView_DEFINED
10 
11 #include "include/gpu/GrTypes.h"
12 #include "include/private/gpu/ganesh/GrTypesPriv.h"
13 #include "src/gpu/ganesh/GrSurfaceProxyView.h"
14 
15 /**
16  * GrDstProxyView holds a texture containing the destination pixel values, and an integer-coordinate
17  * offset from device-space to the space of the texture. When framebuffer fetch is not available, a
18  * GrDstProxyView may be used to support blending in the fragment shader/xfer processor.
19  */
20 class GrDstProxyView {
21 public:
GrDstProxyView()22     GrDstProxyView() {}
23 
GrDstProxyView(const GrDstProxyView & other)24     GrDstProxyView(const GrDstProxyView& other) {
25         *this = other;
26     }
27 
28     GrDstProxyView& operator=(const GrDstProxyView& other) {
29         fProxyView = other.fProxyView;
30         fOffset = other.fOffset;
31         fDstSampleFlags = other.fDstSampleFlags;
32         return *this;
33     }
34 
35     bool operator==(const GrDstProxyView& that) const {
36         return fProxyView == that.fProxyView &&
37                fOffset == that.fOffset &&
38                fDstSampleFlags == that.fDstSampleFlags;
39     }
40     bool operator!=(const GrDstProxyView& that) const { return !(*this == that); }
41 
offset()42     const SkIPoint& offset() const { return fOffset; }
43 
setOffset(const SkIPoint & offset)44     void setOffset(const SkIPoint& offset) { fOffset = offset; }
setOffset(int ox,int oy)45     void setOffset(int ox, int oy) { fOffset.set(ox, oy); }
46 
proxy()47     GrSurfaceProxy* proxy() const { return fProxyView.proxy(); }
proxyView()48     const GrSurfaceProxyView& proxyView() const { return fProxyView; }
49 
setProxyView(GrSurfaceProxyView view)50     void setProxyView(GrSurfaceProxyView view) {
51         fProxyView = std::move(view);
52         if (!fProxyView.proxy()) {
53             fOffset = {0, 0};
54         }
55     }
56 
dstSampleFlags()57     GrDstSampleFlags dstSampleFlags() const { return fDstSampleFlags; }
58 
setDstSampleFlags(GrDstSampleFlags dstSampleFlags)59     void setDstSampleFlags(GrDstSampleFlags dstSampleFlags) { fDstSampleFlags = dstSampleFlags; }
60 
61     using sk_is_trivially_relocatable = std::true_type;
62 
63 private:
64     GrSurfaceProxyView       fProxyView;
65     SkIPoint                 fOffset = {0, 0};
66     GrDstSampleFlags         fDstSampleFlags = GrDstSampleFlags::kNone;
67 
68     static_assert(::sk_is_trivially_relocatable<decltype(fProxyView)>::value);
69     static_assert(::sk_is_trivially_relocatable<decltype(fOffset)>::value);
70     static_assert(::sk_is_trivially_relocatable<decltype(fDstSampleFlags)>::value);
71 };
72 
73 #endif
74