• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 {
Unknown()21 	Unknown::Unknown()
22 	{
23 		referenceCount = 0;
24 		bindCount = 0;
25 	}
26 
~Unknown()27 	Unknown::~Unknown()
28 	{
29 		ASSERT(referenceCount == 0);
30 		ASSERT(bindCount == 0);
31 	}
32 
QueryInterface(const IID & iid,void ** object)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 
AddRef()48 	unsigned long Unknown::AddRef()
49 	{
50 		return InterlockedIncrement(&referenceCount);
51 	}
52 
Release()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 
bind()70 	void Unknown::bind()
71 	{
72 		InterlockedIncrement(&bindCount);
73 	}
74 
unbind()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 }