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 "Direct3DBaseTexture9.hpp"
16 
17 #include "Direct3DDevice9.hpp"
18 #include "Resource.hpp"
19 #include "Debug.hpp"
20 
21 #include <assert.h>
22 
23 namespace D3D9
24 {
Direct3DBaseTexture9(Direct3DDevice9 * device,D3DRESOURCETYPE type,D3DFORMAT format,D3DPOOL pool,unsigned long levels,unsigned long usage)25 	Direct3DBaseTexture9::Direct3DBaseTexture9(Direct3DDevice9 *device, D3DRESOURCETYPE type, D3DFORMAT format, D3DPOOL pool, unsigned long levels, unsigned long usage) : Direct3DResource9(device, type, pool, 0), format(format), levels(levels), usage(usage)
26 	{
27 		filterType = D3DTEXF_LINEAR;
28 		LOD = 0;
29 
30 		resource = new sw::Resource(0);
31 	}
32 
~Direct3DBaseTexture9()33 	Direct3DBaseTexture9::~Direct3DBaseTexture9()
34 	{
35 		resource->destruct();
36 	}
37 
QueryInterface(const IID & iid,void ** object)38 	long Direct3DBaseTexture9::QueryInterface(const IID &iid, void **object)
39 	{
40 		CriticalSection cs(device);
41 
42 		TRACE("");
43 
44 		if(iid == IID_IDirect3DBaseTexture9 ||
45 		   iid == IID_IDirect3DResource9 ||
46 		   iid == IID_IUnknown)
47 		{
48 			AddRef();
49 			*object = this;
50 
51 			return S_OK;
52 		}
53 
54 		*object = 0;
55 
56 		return NOINTERFACE(iid);
57 	}
58 
AddRef()59 	unsigned long Direct3DBaseTexture9::AddRef()
60 	{
61 		TRACE("");
62 
63 		return Direct3DResource9::AddRef();
64 	}
65 
Release()66 	unsigned long Direct3DBaseTexture9::Release()
67 	{
68 		TRACE("");
69 
70 		return Direct3DResource9::Release();
71 	}
72 
FreePrivateData(const GUID & guid)73 	long Direct3DBaseTexture9::FreePrivateData(const GUID &guid)
74 	{
75 		CriticalSection cs(device);
76 
77 		TRACE("");
78 
79 		return Direct3DResource9::FreePrivateData(guid);
80 	}
81 
GetPrivateData(const GUID & guid,void * data,unsigned long * size)82 	long Direct3DBaseTexture9::GetPrivateData(const GUID &guid, void *data, unsigned long *size)
83 	{
84 		CriticalSection cs(device);
85 
86 		TRACE("");
87 
88 		return Direct3DResource9::GetPrivateData(guid, data, size);
89 	}
90 
PreLoad()91 	void Direct3DBaseTexture9::PreLoad()
92 	{
93 		CriticalSection cs(device);
94 
95 		TRACE("");
96 
97 		Direct3DResource9::PreLoad();
98 	}
99 
SetPrivateData(const GUID & guid,const void * data,unsigned long size,unsigned long flags)100 	long Direct3DBaseTexture9::SetPrivateData(const GUID &guid, const void *data, unsigned long size, unsigned long flags)
101 	{
102 		CriticalSection cs(device);
103 
104 		TRACE("");
105 
106 		return Direct3DResource9::SetPrivateData(guid, data, size, flags);
107 	}
108 
GetDevice(IDirect3DDevice9 ** device)109 	long Direct3DBaseTexture9::GetDevice(IDirect3DDevice9 **device)
110 	{
111 		CriticalSection cs(this->device);
112 
113 		TRACE("");
114 
115 		return Direct3DResource9::GetDevice(device);
116 	}
117 
SetPriority(unsigned long newPriority)118 	unsigned long Direct3DBaseTexture9::SetPriority(unsigned long newPriority)
119 	{
120 		CriticalSection cs(device);
121 
122 		TRACE("");
123 
124 		return Direct3DResource9::SetPriority(newPriority);
125 	}
126 
GetPriority()127 	unsigned long Direct3DBaseTexture9::GetPriority()
128 	{
129 		CriticalSection cs(device);
130 
131 		TRACE("");
132 
133 		return Direct3DResource9::GetPriority();
134 	}
135 
GetType()136 	D3DRESOURCETYPE Direct3DBaseTexture9::GetType()
137 	{
138 		CriticalSection cs(device);
139 
140 		TRACE("");
141 
142 		return Direct3DResource9::GetType();
143 	}
144 
GetAutoGenFilterType()145 	D3DTEXTUREFILTERTYPE Direct3DBaseTexture9::GetAutoGenFilterType()
146 	{
147 		CriticalSection cs(device);
148 
149 		TRACE("");
150 
151 		if(usage & D3DUSAGE_AUTOGENMIPMAP)
152 		{
153 			return filterType;
154 		}
155 		else
156 		{
157 			return D3DTEXF_NONE;
158 		}
159 	}
160 
GetLevelCount()161 	unsigned long Direct3DBaseTexture9::GetLevelCount()
162 	{
163 		CriticalSection cs(device);
164 
165 		TRACE("");
166 
167 		if(usage & D3DUSAGE_AUTOGENMIPMAP)
168 		{
169 			return 1;
170 		}
171 
172 		return levels;
173 	}
174 
GetLOD()175 	unsigned long Direct3DBaseTexture9::GetLOD()
176 	{
177 		CriticalSection cs(device);
178 
179 		TRACE("");
180 
181 		if(pool & D3DPOOL_MANAGED)
182 		{
183 			return LOD;
184 		}
185 		else
186 		{
187 			return 0;
188 		}
189 	}
190 
SetAutoGenFilterType(D3DTEXTUREFILTERTYPE filterType)191 	long Direct3DBaseTexture9::SetAutoGenFilterType(D3DTEXTUREFILTERTYPE filterType)
192 	{
193 		CriticalSection cs(device);
194 
195 		TRACE("");
196 
197 		if(usage & D3DUSAGE_AUTOGENMIPMAP)
198 		{
199 			this->filterType = filterType;   // FIXME: Check if valid
200 			// FIXME: Dirty the mipmap chain
201 
202 			return D3D_OK;
203 		}
204 		else
205 		{
206 			return D3DTEXF_NONE;
207 		}
208 	}
209 
SetLOD(unsigned long newLOD)210 	unsigned long Direct3DBaseTexture9::SetLOD(unsigned long newLOD)
211 	{
212 		CriticalSection cs(device);
213 
214 		TRACE("");
215 
216 		unsigned long oldLOD = LOD;
217 		LOD = newLOD < levels ? newLOD : levels - 1;
218 
219 		if(pool & D3DPOOL_MANAGED)
220 		{
221 			return oldLOD;
222 		}
223 		else
224 		{
225 			return 0;
226 		}
227 	}
228 
GenerateMipSubLevels()229 	void Direct3DBaseTexture9::GenerateMipSubLevels()
230 	{
231 		CriticalSection cs(device);
232 
233 		TRACE("");
234 	}
235 
getResource() const236 	sw::Resource *Direct3DBaseTexture9::getResource() const
237 	{
238 		return resource;
239 	}
240 
getInternalLevelCount() const241 	unsigned long Direct3DBaseTexture9::getInternalLevelCount() const
242 	{
243 		return levels;
244 	}
245 
getUsage() const246 	unsigned long Direct3DBaseTexture9::getUsage() const
247 	{
248 		return usage;
249 	}
250 
getFormat() const251 	D3DFORMAT Direct3DBaseTexture9::getFormat() const
252 	{
253 		return format;
254 	}
255 }
256