Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / third_party / skia / src / gpu / GrGpuResourceRef.cpp
1 /*
2  * Copyright 2014 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 #include "GrGpuResourceRef.h"
9
10 GrGpuResourceRef::GrGpuResourceRef() {
11     fResource = NULL;
12     fOwnRef = false;
13     fPendingIO = false;
14 }
15
16 GrGpuResourceRef::GrGpuResourceRef(GrGpuResource* resource, GrIORef::IOType ioType) {
17     fResource = NULL;
18     fOwnRef = false;
19     fPendingIO = false;
20     this->setResource(resource, ioType);
21 }
22
23 GrGpuResourceRef::~GrGpuResourceRef() {
24     if (fOwnRef) {
25         SkASSERT(fResource);
26         fResource->unref();
27     }
28     if (fPendingIO) {
29         switch (fIOType) {
30             case GrIORef::kRead_IOType:
31                 fResource->completedRead();
32                 break;
33             case GrIORef::kWrite_IOType:
34                 fResource->completedWrite();
35                 break;
36             case GrIORef::kRW_IOType:
37                 fResource->completedRead();
38                 fResource->completedWrite();
39                 break;
40         }
41     }
42 }
43
44 void GrGpuResourceRef::reset() {
45     SkASSERT(!fPendingIO);
46     SkASSERT(SkToBool(fResource) == fOwnRef);
47     if (fOwnRef) {
48         fResource->unref();
49         fOwnRef = false;
50         fResource = NULL;
51     }
52 }
53
54 void GrGpuResourceRef::setResource(GrGpuResource* resource, GrIORef::IOType ioType) {
55     SkASSERT(!fPendingIO);
56     SkASSERT(SkToBool(fResource) == fOwnRef);
57     SkSafeUnref(fResource);
58     if (NULL == resource) {
59         fResource = NULL;
60         fOwnRef = false;
61     } else {
62         fResource = resource;
63         fOwnRef = true;
64         fIOType = ioType;
65     }
66 }
67
68 void GrGpuResourceRef::markPendingIO() const {
69     // This should only be called when the owning GrProgramElement gets its first
70     // pendingExecution ref.
71     SkASSERT(!fPendingIO);
72     SkASSERT(fResource);
73     fPendingIO = true;
74     switch (fIOType) {
75         case GrIORef::kRead_IOType:
76             fResource->addPendingRead();
77             break;
78         case GrIORef::kWrite_IOType:
79             fResource->addPendingWrite();
80             break;
81         case GrIORef::kRW_IOType:
82             fResource->addPendingRead();
83             fResource->addPendingWrite();
84             break;
85     }
86 }
87
88 void GrGpuResourceRef::pendingIOComplete() const {
89     // This should only be called when the owner's pending executions have ocurred but it is still
90     // reffed.
91     SkASSERT(fOwnRef);
92     SkASSERT(fPendingIO);
93     switch (fIOType) {
94         case GrIORef::kRead_IOType:
95             fResource->completedRead();
96             break;
97         case GrIORef::kWrite_IOType:
98             fResource->completedWrite();
99             break;
100         case GrIORef::kRW_IOType:
101             fResource->completedRead();
102             fResource->completedWrite();
103             break;
104
105     }
106     fPendingIO = false;
107 }
108
109 void GrGpuResourceRef::removeRef() const {
110     // This should only be called once, when the owners last ref goes away and
111     // there is a pending execution.
112     SkASSERT(fOwnRef);
113     SkASSERT(fPendingIO);
114     SkASSERT(fResource);
115     fResource->unref();
116     fOwnRef = false;
117 }