1 // Copyright 2016 The SwiftShader Authors. All Rights Reserved. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 #include "Unknown.hpp" 16 17 #include "Debug.hpp" 18 19 namespace D3D9 20 { 21 Unknown::Unknown() 22 { 23 referenceCount = 0; 24 bindCount = 0; 25 } 26 27 Unknown::~Unknown() 28 { 29 ASSERT(referenceCount == 0); 30 ASSERT(bindCount == 0); 31 } 32 33 long Unknown::QueryInterface(const IID &iid, void **object) 34 { 35 if(iid == IID_IUnknown) 36 { 37 AddRef(); 38 *object = this; 39 40 return S_OK; 41 } 42 43 *object = 0; 44 45 return NOINTERFACE(iid); 46 } 47 48 unsigned long Unknown::AddRef() 49 { 50 return InterlockedIncrement(&referenceCount); 51 } 52 53 unsigned long Unknown::Release() 54 { 55 int current = referenceCount; 56 57 if(referenceCount > 0) 58 { 59 current = InterlockedDecrement(&referenceCount); 60 } 61 62 if(referenceCount == 0 && bindCount == 0) 63 { 64 delete this; 65 } 66 67 return current; 68 } 69 70 void Unknown::bind() 71 { 72 InterlockedIncrement(&bindCount); 73 } 74 75 void Unknown::unbind() 76 { 77 ASSERT(bindCount > 0); 78 79 InterlockedDecrement(&bindCount); 80 81 if(referenceCount == 0 && bindCount == 0) 82 { 83 delete this; 84 } 85 } 86 }