| bsalomon | 9574098 | 2014-09-04 13:12:37 -0700 | [diff] [blame] | 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 | |||||
| bsalomon | f96ba02 | 2014-09-17 08:05:40 -0700 | [diff] [blame] | 8 | #include "GrGpuResourceRef.h" |
| bsalomon | 9574098 | 2014-09-04 13:12:37 -0700 | [diff] [blame] | 9 | |
| bsalomon | f96ba02 | 2014-09-17 08:05:40 -0700 | [diff] [blame] | 10 | GrGpuResourceRef::GrGpuResourceRef() { |
| halcanary | 96fcdcc | 2015-08-27 07:41:13 -0700 | [diff] [blame] | 11 | fResource = nullptr; |
| bsalomon | 9574098 | 2014-09-04 13:12:37 -0700 | [diff] [blame] | 12 | fOwnRef = false; |
| 13 | fPendingIO = false; | ||||
| bsalomon | 9574098 | 2014-09-04 13:12:37 -0700 | [diff] [blame] | 14 | } |
| 15 | |||||
| bsalomon | bcf0a52 | 2014-10-08 08:40:09 -0700 | [diff] [blame] | 16 | GrGpuResourceRef::GrGpuResourceRef(GrGpuResource* resource, GrIOType ioType) { |
| halcanary | 96fcdcc | 2015-08-27 07:41:13 -0700 | [diff] [blame] | 17 | fResource = nullptr; |
| bsalomon | 9574098 | 2014-09-04 13:12:37 -0700 | [diff] [blame] | 18 | fOwnRef = false; |
| 19 | fPendingIO = false; | ||||
| 20 | this->setResource(resource, ioType); | ||||
| 21 | } | ||||
| 22 | |||||
| bsalomon | f96ba02 | 2014-09-17 08:05:40 -0700 | [diff] [blame] | 23 | GrGpuResourceRef::~GrGpuResourceRef() { |
| bsalomon | 9574098 | 2014-09-04 13:12:37 -0700 | [diff] [blame] | 24 | if (fOwnRef) { |
| bsalomon | 49f085d | 2014-09-05 13:34:00 -0700 | [diff] [blame] | 25 | SkASSERT(fResource); |
| bsalomon | 9574098 | 2014-09-04 13:12:37 -0700 | [diff] [blame] | 26 | fResource->unref(); |
| 27 | } | ||||
| 28 | if (fPendingIO) { | ||||
| 29 | switch (fIOType) { | ||||
| bsalomon | bcf0a52 | 2014-10-08 08:40:09 -0700 | [diff] [blame] | 30 | case kRead_GrIOType: |
| bsalomon | 9574098 | 2014-09-04 13:12:37 -0700 | [diff] [blame] | 31 | fResource->completedRead(); |
| 32 | break; | ||||
| bsalomon | bcf0a52 | 2014-10-08 08:40:09 -0700 | [diff] [blame] | 33 | case kWrite_GrIOType: |
| bsalomon | 9574098 | 2014-09-04 13:12:37 -0700 | [diff] [blame] | 34 | fResource->completedWrite(); |
| 35 | break; | ||||
| bsalomon | bcf0a52 | 2014-10-08 08:40:09 -0700 | [diff] [blame] | 36 | case kRW_GrIOType: |
| bsalomon | 9574098 | 2014-09-04 13:12:37 -0700 | [diff] [blame] | 37 | fResource->completedRead(); |
| 38 | fResource->completedWrite(); | ||||
| 39 | break; | ||||
| 40 | } | ||||
| 41 | } | ||||
| 42 | } | ||||
| 43 | |||||
| bsalomon | f96ba02 | 2014-09-17 08:05:40 -0700 | [diff] [blame] | 44 | void GrGpuResourceRef::reset() { |
| bsalomon | 9574098 | 2014-09-04 13:12:37 -0700 | [diff] [blame] | 45 | SkASSERT(!fPendingIO); |
| bsalomon | 49f085d | 2014-09-05 13:34:00 -0700 | [diff] [blame] | 46 | SkASSERT(SkToBool(fResource) == fOwnRef); |
| bsalomon | 9574098 | 2014-09-04 13:12:37 -0700 | [diff] [blame] | 47 | if (fOwnRef) { |
| 48 | fResource->unref(); | ||||
| 49 | fOwnRef = false; | ||||
| halcanary | 96fcdcc | 2015-08-27 07:41:13 -0700 | [diff] [blame] | 50 | fResource = nullptr; |
| bsalomon | 9574098 | 2014-09-04 13:12:37 -0700 | [diff] [blame] | 51 | } |
| 52 | } | ||||
| 53 | |||||
| bsalomon | bcf0a52 | 2014-10-08 08:40:09 -0700 | [diff] [blame] | 54 | void GrGpuResourceRef::setResource(GrGpuResource* resource, GrIOType ioType) { |
| bsalomon | 9574098 | 2014-09-04 13:12:37 -0700 | [diff] [blame] | 55 | SkASSERT(!fPendingIO); |
| bsalomon | 49f085d | 2014-09-05 13:34:00 -0700 | [diff] [blame] | 56 | SkASSERT(SkToBool(fResource) == fOwnRef); |
| bsalomon | 9574098 | 2014-09-04 13:12:37 -0700 | [diff] [blame] | 57 | SkSafeUnref(fResource); |
| halcanary | 96fcdcc | 2015-08-27 07:41:13 -0700 | [diff] [blame] | 58 | if (nullptr == resource) { |
| 59 | fResource = nullptr; | ||||
| bsalomon | 9574098 | 2014-09-04 13:12:37 -0700 | [diff] [blame] | 60 | fOwnRef = false; |
| bsalomon | 9574098 | 2014-09-04 13:12:37 -0700 | [diff] [blame] | 61 | } else { |
| bsalomon | 9574098 | 2014-09-04 13:12:37 -0700 | [diff] [blame] | 62 | fResource = resource; |
| 63 | fOwnRef = true; | ||||
| 64 | fIOType = ioType; | ||||
| 65 | } | ||||
| 66 | } | ||||
| 67 | |||||
| bsalomon | f96ba02 | 2014-09-17 08:05:40 -0700 | [diff] [blame] | 68 | void GrGpuResourceRef::markPendingIO() const { |
| Robert Phillips | a91e0b7 | 2017-05-01 13:12:20 -0400 | [diff] [blame] | 69 | if (!fResource) { |
| 70 | return; | ||||
| 71 | } | ||||
| 72 | |||||
| bsalomon | ac8d619 | 2014-09-04 14:13:44 -0700 | [diff] [blame] | 73 | // This should only be called when the owning GrProgramElement gets its first |
| bsalomon | 9574098 | 2014-09-04 13:12:37 -0700 | [diff] [blame] | 74 | // pendingExecution ref. |
| 75 | SkASSERT(!fPendingIO); | ||||
| bsalomon | 9574098 | 2014-09-04 13:12:37 -0700 | [diff] [blame] | 76 | fPendingIO = true; |
| 77 | switch (fIOType) { | ||||
| bsalomon | bcf0a52 | 2014-10-08 08:40:09 -0700 | [diff] [blame] | 78 | case kRead_GrIOType: |
| bsalomon | 9574098 | 2014-09-04 13:12:37 -0700 | [diff] [blame] | 79 | fResource->addPendingRead(); |
| 80 | break; | ||||
| bsalomon | bcf0a52 | 2014-10-08 08:40:09 -0700 | [diff] [blame] | 81 | case kWrite_GrIOType: |
| bsalomon | 9574098 | 2014-09-04 13:12:37 -0700 | [diff] [blame] | 82 | fResource->addPendingWrite(); |
| 83 | break; | ||||
| bsalomon | bcf0a52 | 2014-10-08 08:40:09 -0700 | [diff] [blame] | 84 | case kRW_GrIOType: |
| bsalomon | 9574098 | 2014-09-04 13:12:37 -0700 | [diff] [blame] | 85 | fResource->addPendingRead(); |
| 86 | fResource->addPendingWrite(); | ||||
| 87 | break; | ||||
| bsalomon | 9574098 | 2014-09-04 13:12:37 -0700 | [diff] [blame] | 88 | } |
| 89 | } | ||||
| 90 | |||||
| bsalomon | f96ba02 | 2014-09-17 08:05:40 -0700 | [diff] [blame] | 91 | void GrGpuResourceRef::pendingIOComplete() const { |
| Robert Phillips | a91e0b7 | 2017-05-01 13:12:20 -0400 | [diff] [blame] | 92 | if (!fResource) { |
| 93 | return; | ||||
| 94 | } | ||||
| 95 | |||||
| bsalomon | ac8d619 | 2014-09-04 14:13:44 -0700 | [diff] [blame] | 96 | // This should only be called when the owner's pending executions have ocurred but it is still |
| 97 | // reffed. | ||||
| 98 | SkASSERT(fOwnRef); | ||||
| 99 | SkASSERT(fPendingIO); | ||||
| 100 | switch (fIOType) { | ||||
| bsalomon | bcf0a52 | 2014-10-08 08:40:09 -0700 | [diff] [blame] | 101 | case kRead_GrIOType: |
| bsalomon | ac8d619 | 2014-09-04 14:13:44 -0700 | [diff] [blame] | 102 | fResource->completedRead(); |
| 103 | break; | ||||
| bsalomon | bcf0a52 | 2014-10-08 08:40:09 -0700 | [diff] [blame] | 104 | case kWrite_GrIOType: |
| bsalomon | ac8d619 | 2014-09-04 14:13:44 -0700 | [diff] [blame] | 105 | fResource->completedWrite(); |
| 106 | break; | ||||
| bsalomon | bcf0a52 | 2014-10-08 08:40:09 -0700 | [diff] [blame] | 107 | case kRW_GrIOType: |
| bsalomon | ac8d619 | 2014-09-04 14:13:44 -0700 | [diff] [blame] | 108 | fResource->completedRead(); |
| 109 | fResource->completedWrite(); | ||||
| 110 | break; | ||||
| 111 | |||||
| 112 | } | ||||
| 113 | fPendingIO = false; | ||||
| 114 | } | ||||
| 115 | |||||
| bsalomon | f96ba02 | 2014-09-17 08:05:40 -0700 | [diff] [blame] | 116 | void GrGpuResourceRef::removeRef() const { |
| Robert Phillips | a91e0b7 | 2017-05-01 13:12:20 -0400 | [diff] [blame] | 117 | if (!fResource) { |
| 118 | return; | ||||
| 119 | } | ||||
| 120 | |||||
| bsalomon | 9574098 | 2014-09-04 13:12:37 -0700 | [diff] [blame] | 121 | // This should only be called once, when the owners last ref goes away and |
| 122 | // there is a pending execution. | ||||
| 123 | SkASSERT(fOwnRef); | ||||
| 124 | SkASSERT(fPendingIO); | ||||
| bsalomon | 9574098 | 2014-09-04 13:12:37 -0700 | [diff] [blame] | 125 | fResource->unref(); |
| 126 | fOwnRef = false; | ||||
| 127 | } | ||||