• 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 "Direct3DResource8.hpp"
16 
17 #include "Direct3DDevice8.hpp"
18 #include "Debug.hpp"
19 
20 namespace D3D8
21 {
22 	unsigned int Direct3DResource8::memoryUsage = 0;
23 
PrivateData()24 	Direct3DResource8::PrivateData::PrivateData()
25 	{
26 		data = 0;
27 	}
28 
PrivateData(const void * data,int size,bool managed)29 	Direct3DResource8::PrivateData::PrivateData(const void *data, int size, bool managed)
30 	{
31 		this->size = size;
32 		this->managed = managed;
33 
34 		this->data = (void*)new unsigned char[size];
35 		memcpy(this->data, data, size);
36 
37 		if(managed)
38 		{
39 			((IUnknown*)data)->AddRef();
40 		}
41 	}
42 
operator =(const PrivateData & privateData)43 	Direct3DResource8::PrivateData &Direct3DResource8::PrivateData::operator=(const PrivateData &privateData)
44 	{
45 		size = privateData.size;
46 		managed = privateData.managed;
47 
48 		if(data)
49 		{
50 			if(managed)
51 			{
52 				((IUnknown*)data)->Release();
53 			}
54 
55 			delete[] data;
56 		}
57 
58 		data = (void*)new unsigned char[size];
59 		memcpy(data, privateData.data, size);
60 
61 		return *this;
62 	}
63 
~PrivateData()64 	Direct3DResource8::PrivateData::~PrivateData()
65 	{
66 		if(data && managed)
67 		{
68 			((IUnknown*)data)->Release();
69 		}
70 
71 		delete[] data;
72 		data = 0;
73 	}
74 
Direct3DResource8(Direct3DDevice8 * device,D3DRESOURCETYPE type,unsigned int size)75 	Direct3DResource8::Direct3DResource8(Direct3DDevice8 *device, D3DRESOURCETYPE type, unsigned int size) : device(device), type(type), size(size)
76 	{
77 		priority = 0;
78 
79 		memoryUsage += size;
80 	}
81 
~Direct3DResource8()82 	Direct3DResource8::~Direct3DResource8()
83 	{
84 		memoryUsage -= size;
85 	}
86 
QueryInterface(const IID & iid,void ** object)87 	long Direct3DResource8::QueryInterface(const IID &iid, void **object)
88 	{
89 		TRACE("");
90 
91 		if(iid == IID_IDirect3DResource8 ||
92 		   iid == IID_IUnknown)
93 		{
94 			AddRef();
95 			*object = this;
96 
97 			return S_OK;
98 		}
99 
100 		*object = 0;
101 
102 		return NOINTERFACE(iid);
103 	}
104 
AddRef()105 	unsigned long Direct3DResource8::AddRef()
106 	{
107 		TRACE("");
108 
109 		return Unknown::AddRef();
110 	}
111 
Release()112 	unsigned long Direct3DResource8::Release()
113 	{
114 		TRACE("");
115 
116 		return Unknown::Release();
117 	}
118 
GetDevice(IDirect3DDevice8 ** device)119 	long Direct3DResource8::GetDevice(IDirect3DDevice8 **device)
120 	{
121 		TRACE("");
122 
123 		if(!device)
124 		{
125 			return INVALIDCALL();
126 		}
127 
128 		this->device->AddRef();
129 		*device = this->device;
130 
131 		return D3D_OK;
132 	}
133 
SetPrivateData(const GUID & guid,const void * data,unsigned long size,unsigned long flags)134 	long Direct3DResource8::SetPrivateData(const GUID &guid, const void *data, unsigned long size, unsigned long flags)
135 	{
136 		TRACE("");
137 
138 		privateData[guid] = PrivateData(data, size, flags == D3DSPD_IUNKNOWN);
139 
140 		return D3D_OK;
141 	}
142 
GetPrivateData(const GUID & guid,void * data,unsigned long * size)143 	long Direct3DResource8::GetPrivateData(const GUID &guid, void *data, unsigned long *size)
144 	{
145 		TRACE("");
146 
147 		Iterator result = privateData.find(guid);
148 
149 		if(result == privateData.end())
150 		{
151 			return NOTFOUND();
152 		}
153 
154 		if(result->second.size > *size)
155 		{
156 			return MOREDATA();
157 		}
158 
159 		memcpy(data, result->second.data, result->second.size);
160 
161 		return D3D_OK;
162 	}
163 
FreePrivateData(const GUID & guid)164 	long Direct3DResource8::FreePrivateData(const GUID &guid)
165 	{
166 		TRACE("");
167 
168 		Iterator result = privateData.find(guid);
169 
170 		if(result == privateData.end())
171 		{
172 			return D3DERR_NOTFOUND;
173 		}
174 
175 		privateData.erase(guid);
176 
177 		return D3D_OK;
178 	}
179 
SetPriority(unsigned long newPriority)180 	unsigned long Direct3DResource8::SetPriority(unsigned long newPriority)
181 	{
182 		TRACE("");
183 
184 		unsigned long oldPriority = priority;
185 		priority = newPriority;
186 
187 		return oldPriority;
188 	}
189 
GetPriority()190 	unsigned long Direct3DResource8::GetPriority()
191 	{
192 		TRACE("");
193 
194 		return priority;
195 	}
196 
PreLoad()197 	void Direct3DResource8::PreLoad()
198 	{
199 		TRACE("");
200 
201 		return;   // FIXME: Anything to do?
202 	}
203 
GetType()204 	D3DRESOURCETYPE Direct3DResource8::GetType()
205 	{
206 		TRACE("");
207 
208 		return type;
209 	}
210 
getMemoryUsage()211 	unsigned int Direct3DResource8::getMemoryUsage()
212 	{
213 		return memoryUsage;
214 	}
215 }