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